From b7baf1d1e7b15aaa617547110fa8eadef1f50b1e Mon Sep 17 00:00:00 2001 From: Justin Castillo Date: Tue, 27 Oct 2015 17:58:26 -0400 Subject: [PATCH] New Website with Q's --- .DS_Store | Bin 8196 -> 0 bytes Excersizes/.DS_Store | Bin 10244 -> 0 bytes .../.DS_Store | Bin 8196 -> 0 bytes .../app.js | 48 - .../express-handlebars/.npmignore | 1 - .../express-handlebars/HISTORY.md | 363 - .../node_modules/express-handlebars/LICENSE | 31 - .../node_modules/express-handlebars/README.md | 568 - .../node_modules/express-handlebars/index.js | 23 - .../lib/express-handlebars.js | 340 - .../express-handlebars/lib/utils.js | 29 - .../node_modules/.bin/handlebars | 1 - .../node_modules/glob/LICENSE | 15 - .../node_modules/glob/README.md | 377 - .../node_modules/glob/common.js | 245 - .../node_modules/glob/glob.js | 752 -- .../glob/node_modules/inflight/.eslintrc | 17 - .../glob/node_modules/inflight/LICENSE | 15 - .../glob/node_modules/inflight/README.md | 37 - .../glob/node_modules/inflight/inflight.js | 44 - .../inflight/node_modules/wrappy/LICENSE | 15 - .../inflight/node_modules/wrappy/README.md | 36 - .../inflight/node_modules/wrappy/package.json | 52 - .../node_modules/wrappy/test/basic.js | 51 - .../inflight/node_modules/wrappy/wrappy.js | 33 - .../glob/node_modules/inflight/package.json | 61 - .../glob/node_modules/inflight/test.js | 97 - .../glob/node_modules/inherits/LICENSE | 16 - .../glob/node_modules/inherits/README.md | 42 - .../glob/node_modules/inherits/inherits.js | 1 - .../node_modules/inherits/inherits_browser.js | 23 - .../glob/node_modules/inherits/package.json | 50 - .../glob/node_modules/inherits/test.js | 25 - .../glob/node_modules/minimatch/LICENSE | 15 - .../glob/node_modules/minimatch/README.md | 216 - .../glob/node_modules/minimatch/browser.js | 1159 -- .../glob/node_modules/minimatch/minimatch.js | 912 -- .../node_modules/brace-expansion/.npmignore | 2 - .../node_modules/brace-expansion/.travis.yml | 3 - .../node_modules/brace-expansion/README.md | 121 - .../node_modules/brace-expansion/example.js | 8 - .../node_modules/brace-expansion/index.js | 191 - .../node_modules/balanced-match/.npmignore | 2 - .../node_modules/balanced-match/.travis.yml | 4 - .../node_modules/balanced-match/Makefile | 6 - .../node_modules/balanced-match/README.md | 80 - .../node_modules/balanced-match/example.js | 5 - .../node_modules/balanced-match/index.js | 38 - .../node_modules/balanced-match/package.json | 73 - .../balanced-match/test/balanced.js | 56 - .../node_modules/concat-map/.travis.yml | 4 - .../node_modules/concat-map/LICENSE | 18 - .../node_modules/concat-map/README.markdown | 62 - .../node_modules/concat-map/example/map.js | 6 - .../node_modules/concat-map/index.js | 13 - .../node_modules/concat-map/package.json | 83 - .../node_modules/concat-map/test/map.js | 39 - .../node_modules/brace-expansion/package.json | 75 - .../brace-expansion/test/bash-comparison.js | 32 - .../brace-expansion/test/bash-results.txt | 1075 -- .../brace-expansion/test/cases.txt | 182 - .../brace-expansion/test/dollar.js | 9 - .../brace-expansion/test/empty-option.js | 10 - .../brace-expansion/test/generate.sh | 24 - .../test/negative-increment.js | 15 - .../brace-expansion/test/nested.js | 16 - .../brace-expansion/test/order.js | 10 - .../node_modules/brace-expansion/test/pad.js | 13 - .../brace-expansion/test/same-type.js | 7 - .../brace-expansion/test/sequence.js | 50 - .../glob/node_modules/minimatch/package.json | 62 - .../glob/node_modules/once/LICENSE | 15 - .../glob/node_modules/once/README.md | 51 - .../once/node_modules/wrappy/LICENSE | 15 - .../once/node_modules/wrappy/README.md | 36 - .../once/node_modules/wrappy/package.json | 52 - .../once/node_modules/wrappy/test/basic.js | 51 - .../once/node_modules/wrappy/wrappy.js | 33 - .../glob/node_modules/once/once.js | 21 - .../glob/node_modules/once/package.json | 60 - .../glob/node_modules/once/test/once.js | 23 - .../node_modules/path-is-absolute/index.js | 20 - .../node_modules/path-is-absolute/license | 21 - .../path-is-absolute/package.json | 70 - .../node_modules/path-is-absolute/readme.md | 51 - .../node_modules/glob/package.json | 72 - .../node_modules/glob/sync.js | 460 - .../node_modules/graceful-fs/.npmignore | 1 - .../node_modules/graceful-fs/LICENSE | 15 - .../node_modules/graceful-fs/README.md | 36 - .../node_modules/graceful-fs/fs.js | 11 - .../node_modules/graceful-fs/graceful-fs.js | 158 - .../node_modules/graceful-fs/package.json | 72 - .../node_modules/graceful-fs/polyfills.js | 255 - .../node_modules/graceful-fs/test/max-open.js | 69 - .../node_modules/graceful-fs/test/open.js | 39 - .../graceful-fs/test/readdir-sort.js | 20 - .../graceful-fs/test/write-then-read.js | 47 - .../node_modules/handlebars/.gitmodules | 3 - .../node_modules/handlebars/.istanbul.yml | 2 - .../node_modules/handlebars/.npmignore | 25 - .../node_modules/handlebars/CONTRIBUTING.md | 80 - .../node_modules/handlebars/FAQ.md | 60 - .../node_modules/handlebars/LICENSE | 19 - .../node_modules/handlebars/README.markdown | 438 - .../node_modules/handlebars/bin/handlebars | 111 - .../handlebars/dist/amd/handlebars.js | 48 - .../handlebars/dist/amd/handlebars.runtime.js | 41 - .../handlebars/dist/amd/handlebars/base.js | 268 - .../dist/amd/handlebars/compiler/ast.js | 152 - .../dist/amd/handlebars/compiler/base.js | 36 - .../dist/amd/handlebars/compiler/code-gen.js | 161 - .../dist/amd/handlebars/compiler/compiler.js | 523 - .../dist/amd/handlebars/compiler/helpers.js | 131 - .../compiler/javascript-compiler.js | 1053 -- .../dist/amd/handlebars/compiler/parser.js | 678 - .../dist/amd/handlebars/compiler/printer.js | 165 - .../dist/amd/handlebars/compiler/visitor.js | 127 - .../handlebars/compiler/whitespace-control.js | 209 - .../dist/amd/handlebars/exception.js | 37 - .../dist/amd/handlebars/no-conflict.js | 16 - .../handlebars/dist/amd/handlebars/runtime.js | 226 - .../dist/amd/handlebars/safe-string.js | 14 - .../handlebars/dist/amd/handlebars/utils.js | 116 - .../handlebars/dist/amd/precompiler.js | 184 - .../handlebars/dist/cjs/handlebars.js | 63 - .../handlebars/dist/cjs/handlebars.runtime.js | 60 - .../handlebars/dist/cjs/handlebars/base.js | 273 - .../dist/cjs/handlebars/compiler/ast.js | 152 - .../dist/cjs/handlebars/compiler/base.js | 46 - .../dist/cjs/handlebars/compiler/code-gen.js | 164 - .../dist/cjs/handlebars/compiler/compiler.js | 527 - .../dist/cjs/handlebars/compiler/helpers.js | 131 - .../compiler/javascript-compiler.js | 1062 -- .../dist/cjs/handlebars/compiler/parser.js | 678 - .../dist/cjs/handlebars/compiler/printer.js | 165 - .../dist/cjs/handlebars/compiler/visitor.js | 132 - .../handlebars/compiler/whitespace-control.js | 212 - .../dist/cjs/handlebars/exception.js | 38 - .../dist/cjs/handlebars/no-conflict.js | 18 - .../handlebars/dist/cjs/handlebars/runtime.js | 232 - .../dist/cjs/handlebars/safe-string.js | 14 - .../handlebars/dist/cjs/handlebars/utils.js | 114 - .../handlebars/dist/cjs/precompiler.js | 194 - .../handlebars/dist/handlebars.amd.js | 3862 ------ .../handlebars/dist/handlebars.amd.min.js | 29 - .../handlebars/dist/handlebars.js | 4098 ------ .../handlebars/dist/handlebars.min.js | 29 - .../handlebars/dist/handlebars.runtime.amd.js | 744 -- .../dist/handlebars.runtime.amd.min.js | 27 - .../handlebars/dist/handlebars.runtime.js | 881 -- .../handlebars/dist/handlebars.runtime.min.js | 27 - .../handlebars/docs/compiler-api.md | 276 - .../node_modules/handlebars/lib/handlebars.js | 41 - .../handlebars/lib/handlebars.runtime.js | 37 - .../handlebars/lib/handlebars/base.js | 244 - .../handlebars/lib/handlebars/compiler/ast.js | 152 - .../lib/handlebars/compiler/base.js | 25 - .../lib/handlebars/compiler/code-gen.js | 164 - .../lib/handlebars/compiler/compiler.js | 513 - .../lib/handlebars/compiler/helpers.js | 123 - .../compiler/javascript-compiler.js | 1070 -- .../lib/handlebars/compiler/parser.js | 563 - .../lib/handlebars/compiler/printer.js | 151 - .../lib/handlebars/compiler/visitor.js | 119 - .../handlebars/compiler/whitespace-control.js | 208 - .../handlebars/lib/handlebars/exception.js | 34 - .../handlebars/lib/handlebars/no-conflict.js | 12 - .../handlebars/lib/handlebars/runtime.js | 214 - .../handlebars/lib/handlebars/safe-string.js | 10 - .../handlebars/lib/handlebars/utils.js | 101 - .../node_modules/handlebars/lib/index.js | 25 - .../handlebars/lib/precompiler.js | 178 - .../handlebars/node_modules/.bin/uglifyjs | 1 - .../node_modules/optimist/.travis.yml | 4 - .../handlebars/node_modules/optimist/LICENSE | 21 - .../node_modules/optimist/example/bool.js | 10 - .../optimist/example/boolean_double.js | 7 - .../optimist/example/boolean_single.js | 7 - .../optimist/example/default_hash.js | 8 - .../optimist/example/default_singles.js | 7 - .../node_modules/optimist/example/divide.js | 8 - .../optimist/example/line_count.js | 20 - .../optimist/example/line_count_options.js | 29 - .../optimist/example/line_count_wrap.js | 29 - .../node_modules/optimist/example/nonopt.js | 4 - .../node_modules/optimist/example/reflect.js | 2 - .../node_modules/optimist/example/short.js | 3 - .../node_modules/optimist/example/string.js | 11 - .../optimist/example/usage-options.js | 19 - .../node_modules/optimist/example/xup.js | 10 - .../handlebars/node_modules/optimist/index.js | 343 - .../node_modules/minimist/.travis.yml | 4 - .../optimist/node_modules/minimist/LICENSE | 18 - .../node_modules/minimist/example/parse.js | 2 - .../optimist/node_modules/minimist/index.js | 187 - .../node_modules/minimist/package.json | 67 - .../node_modules/minimist/readme.markdown | 73 - .../node_modules/minimist/test/bool.js | 119 - .../node_modules/minimist/test/dash.js | 24 - .../minimist/test/default_bool.js | 20 - .../node_modules/minimist/test/dotted.js | 22 - .../node_modules/minimist/test/long.js | 31 - .../node_modules/minimist/test/num.js | 36 - .../node_modules/minimist/test/parse.js | 197 - .../minimist/test/parse_modified.js | 9 - .../node_modules/minimist/test/short.js | 67 - .../node_modules/minimist/test/whitespace.js | 8 - .../optimist/node_modules/wordwrap/LICENSE | 18 - .../node_modules/wordwrap/README.markdown | 70 - .../node_modules/wordwrap/example/center.js | 10 - .../node_modules/wordwrap/example/meat.js | 3 - .../optimist/node_modules/wordwrap/index.js | 76 - .../node_modules/wordwrap/package.json | 63 - .../node_modules/wordwrap/test/break.js | 30 - .../node_modules/wordwrap/test/idleness.txt | 63 - .../node_modules/wordwrap/test/wrap.js | 31 - .../node_modules/optimist/package.json | 64 - .../node_modules/optimist/readme.markdown | 513 - .../node_modules/optimist/test/_.js | 71 - .../node_modules/optimist/test/_/argv.js | 2 - .../node_modules/optimist/test/_/bin.js | 3 - .../node_modules/optimist/test/dash.js | 31 - .../node_modules/optimist/test/parse.js | 446 - .../optimist/test/parse_modified.js | 14 - .../node_modules/optimist/test/short.js | 16 - .../node_modules/optimist/test/usage.js | 292 - .../node_modules/optimist/test/whitespace.js | 8 - .../node_modules/source-map/.npmignore | 2 - .../node_modules/source-map/.travis.yml | 4 - .../node_modules/source-map/CHANGELOG.md | 194 - .../node_modules/source-map/LICENSE | 28 - .../source-map/Makefile.dryice.js | 166 - .../node_modules/source-map/README.md | 475 - .../source-map/build/assert-shim.js | 56 - .../source-map/build/mini-require.js | 152 - .../source-map/build/prefix-source-map.jsm | 20 - .../source-map/build/prefix-utils.jsm | 18 - .../source-map/build/suffix-browser.js | 8 - .../source-map/build/suffix-source-map.jsm | 6 - .../source-map/build/suffix-utils.jsm | 21 - .../source-map/build/test-prefix.js | 8 - .../source-map/build/test-suffix.js | 3 - .../node_modules/source-map/lib/source-map.js | 8 - .../source-map/lib/source-map/array-set.js | 97 - .../source-map/lib/source-map/base64-vlq.js | 142 - .../source-map/lib/source-map/base64.js | 42 - .../lib/source-map/binary-search.js | 80 - .../source-map/lib/source-map/mapping-list.js | 86 - .../lib/source-map/source-map-consumer.js | 575 - .../lib/source-map/source-map-generator.js | 400 - .../source-map/lib/source-map/source-node.js | 414 - .../source-map/lib/source-map/util.js | 319 - .../source-map/node_modules/amdefine/LICENSE | 58 - .../node_modules/amdefine/README.md | 171 - .../node_modules/amdefine/amdefine.js | 301 - .../node_modules/amdefine/intercept.js | 36 - .../node_modules/amdefine/package.json | 47 - .../node_modules/source-map/package.json | 186 - .../node_modules/source-map/test/run-tests.js | 62 - .../source-map/test/source-map/test-api.js | 26 - .../test/source-map/test-array-set.js | 104 - .../test/source-map/test-base64-vlq.js | 23 - .../source-map/test/source-map/test-base64.js | 35 - .../test/source-map/test-binary-search.js | 54 - .../test/source-map/test-dog-fooding.js | 84 - .../source-map/test-source-map-consumer.js | 702 -- .../source-map/test-source-map-generator.js | 679 - .../test/source-map/test-source-node.js | 612 - .../source-map/test/source-map/test-util.js | 216 - .../source-map/test/source-map/util.js | 192 - .../node_modules/uglify-js/.npmignore | 2 - .../node_modules/uglify-js/.travis.yml | 7 - .../handlebars/node_modules/uglify-js/LICENSE | 29 - .../node_modules/uglify-js/README.md | 588 - .../node_modules/uglify-js/bin/uglifyjs | 402 - .../node_modules/uglify-js/lib/ast.js | 985 -- .../node_modules/uglify-js/lib/compress.js | 2028 --- .../node_modules/uglify-js/lib/mozilla-ast.js | 267 - .../node_modules/uglify-js/lib/output.js | 1229 -- .../node_modules/uglify-js/lib/parse.js | 1410 --- .../node_modules/uglify-js/lib/scope.js | 581 - .../node_modules/uglify-js/lib/sourcemap.js | 81 - .../node_modules/uglify-js/lib/transform.js | 217 - .../node_modules/uglify-js/lib/utils.js | 295 - .../uglify-js/node_modules/async/LICENSE | 19 - .../uglify-js/node_modules/async/README.md | 1425 --- .../node_modules/async/component.json | 11 - .../uglify-js/node_modules/async/lib/async.js | 958 -- .../uglify-js/node_modules/async/package.json | 60 - .../node_modules/optimist/.travis.yml | 4 - .../uglify-js/node_modules/optimist/LICENSE | 21 - .../node_modules/optimist/example/bool.js | 10 - .../optimist/example/boolean_double.js | 7 - .../optimist/example/boolean_single.js | 7 - .../optimist/example/default_hash.js | 8 - .../optimist/example/default_singles.js | 7 - .../node_modules/optimist/example/divide.js | 8 - .../optimist/example/line_count.js | 20 - .../optimist/example/line_count_options.js | 29 - .../optimist/example/line_count_wrap.js | 29 - .../node_modules/optimist/example/nonopt.js | 4 - .../node_modules/optimist/example/reflect.js | 2 - .../node_modules/optimist/example/short.js | 3 - .../node_modules/optimist/example/string.js | 11 - .../optimist/example/usage-options.js | 19 - .../node_modules/optimist/example/xup.js | 10 - .../uglify-js/node_modules/optimist/index.js | 478 - .../optimist/node_modules/wordwrap/LICENSE | 18 - .../node_modules/wordwrap/README.markdown | 70 - .../node_modules/wordwrap/example/center.js | 10 - .../node_modules/wordwrap/example/meat.js | 3 - .../optimist/node_modules/wordwrap/index.js | 76 - .../node_modules/wordwrap/package.json | 63 - .../node_modules/wordwrap/test/break.js | 30 - .../node_modules/wordwrap/test/idleness.txt | 63 - .../node_modules/wordwrap/test/wrap.js | 31 - .../node_modules/optimist/package.json | 63 - .../node_modules/optimist/readme.markdown | 487 - .../uglify-js/node_modules/optimist/test/_.js | 71 - .../node_modules/optimist/test/_/argv.js | 2 - .../node_modules/optimist/test/_/bin.js | 3 - .../node_modules/optimist/test/parse.js | 446 - .../node_modules/optimist/test/usage.js | 292 - .../node_modules/uglify-js/package.json | 57 - .../uglify-js/test/compress/arrays.js | 12 - .../uglify-js/test/compress/blocks.js | 49 - .../uglify-js/test/compress/conditionals.js | 143 - .../uglify-js/test/compress/dead-code.js | 89 - .../uglify-js/test/compress/debugger.js | 24 - .../uglify-js/test/compress/drop-unused.js | 97 - .../uglify-js/test/compress/issue-105.js | 25 - .../uglify-js/test/compress/issue-12.js | 11 - .../uglify-js/test/compress/issue-143.js | 48 - .../uglify-js/test/compress/issue-22.js | 17 - .../uglify-js/test/compress/issue-44.js | 31 - .../uglify-js/test/compress/issue-59.js | 30 - .../uglify-js/test/compress/labels.js | 163 - .../uglify-js/test/compress/loops.js | 123 - .../uglify-js/test/compress/properties.js | 54 - .../uglify-js/test/compress/sequences.js | 161 - .../uglify-js/test/compress/switch.js | 260 - .../uglify-js/test/compress/typeof.js | 25 - .../node_modules/uglify-js/test/run-tests.js | 170 - .../node_modules/uglify-js/tools/node.js | 165 - .../node_modules/handlebars/package.json | 101 - .../node_modules/handlebars/print-script | 92 - .../node_modules/handlebars/release-notes.md | 378 - .../node_modules/handlebars/runtime.js | 3 - .../node_modules/object.assign/CHANGELOG.md | 74 - .../node_modules/object.assign/LICENSE | 21 - .../node_modules/object.assign/README.md | 136 - .../object.assign/dist/browser.js | 135 - .../node_modules/object.assign/index.js | 31 - .../node_modules/object-keys/.editorconfig | 13 - .../node_modules/object-keys/.eslintrc | 201 - .../node_modules/object-keys/.jscs.json | 104 - .../node_modules/object-keys/.npmignore | 2 - .../node_modules/object-keys/.travis.yml | 46 - .../node_modules/object-keys/CHANGELOG.md | 190 - .../node_modules/object-keys/LICENSE | 21 - .../node_modules/object-keys/README.md | 76 - .../node_modules/object-keys/index.js | 122 - .../node_modules/object-keys/isArguments.js | 17 - .../node_modules/object-keys/package.json | 89 - .../node_modules/object-keys/test/index.js | 5 - .../node_modules/object.assign/package.json | 88 - .../node_modules/object.assign/test/index.js | 109 - .../node_modules/promise/.jshintrc | 5 - .../node_modules/promise/.npmignore | 6 - .../node_modules/promise/LICENSE | 19 - .../node_modules/promise/Readme.md | 221 - .../node_modules/promise/core.js | 5 - .../node_modules/promise/index.js | 6 - .../node_modules/promise/lib/core.js | 105 - .../node_modules/promise/lib/done.js | 14 - .../promise/lib/es6-extensions.js | 108 - .../promise/lib/node-extensions.js | 63 - .../promise/node_modules/asap/LICENSE.md | 20 - .../promise/node_modules/asap/README.md | 81 - .../promise/node_modules/asap/asap.js | 113 - .../promise/node_modules/asap/package.json | 37 - .../node_modules/promise/package.json | 56 - .../node_modules/promise/polyfill-done.js | 12 - .../node_modules/promise/polyfill.js | 10 - .../express-handlebars/package.json | 67 - .../node_modules/express/History.md | 3025 ----- .../node_modules/express/LICENSE | 24 - .../node_modules/express/Readme.md | 138 - .../node_modules/express/index.js | 11 - .../node_modules/express/lib/application.js | 643 - .../node_modules/express/lib/express.js | 103 - .../express/lib/middleware/init.js | 36 - .../express/lib/middleware/query.js | 51 - .../node_modules/express/lib/request.js | 489 - .../node_modules/express/lib/response.js | 1053 -- .../node_modules/express/lib/router/index.js | 645 - .../node_modules/express/lib/router/layer.js | 176 - .../node_modules/express/lib/router/route.js | 210 - .../node_modules/express/lib/utils.js | 300 - .../node_modules/express/lib/view.js | 173 - .../express/node_modules/accepts/HISTORY.md | 164 - .../express/node_modules/accepts/LICENSE | 23 - .../express/node_modules/accepts/README.md | 135 - .../express/node_modules/accepts/index.js | 231 - .../node_modules/mime-types/HISTORY.md | 165 - .../accepts/node_modules/mime-types/LICENSE | 23 - .../accepts/node_modules/mime-types/README.md | 103 - .../accepts/node_modules/mime-types/index.js | 188 - .../node_modules/mime-db/HISTORY.md | 266 - .../mime-types/node_modules/mime-db/LICENSE | 22 - .../mime-types/node_modules/mime-db/README.md | 82 - .../mime-types/node_modules/mime-db/db.json | 6460 ---------- .../mime-types/node_modules/mime-db/index.js | 11 - .../node_modules/mime-db/package.json | 94 - .../node_modules/mime-types/package.json | 84 - .../node_modules/negotiator/HISTORY.md | 76 - .../accepts/node_modules/negotiator/LICENSE | 24 - .../accepts/node_modules/negotiator/README.md | 203 - .../accepts/node_modules/negotiator/index.js | 62 - .../node_modules/negotiator/lib/charset.js | 102 - .../node_modules/negotiator/lib/encoding.js | 118 - .../node_modules/negotiator/lib/language.js | 112 - .../node_modules/negotiator/lib/mediaType.js | 179 - .../node_modules/negotiator/package.json | 86 - .../express/node_modules/accepts/package.json | 98 - .../node_modules/array-flatten/LICENSE | 21 - .../node_modules/array-flatten/README.md | 43 - .../array-flatten/array-flatten.js | 64 - .../node_modules/array-flatten/package.json | 62 - .../content-disposition/HISTORY.md | 40 - .../node_modules/content-disposition/LICENSE | 22 - .../content-disposition/README.md | 141 - .../node_modules/content-disposition/index.js | 443 - .../content-disposition/package.json | 66 - .../node_modules/content-type/HISTORY.md | 9 - .../express/node_modules/content-type/LICENSE | 22 - .../node_modules/content-type/README.md | 92 - .../node_modules/content-type/index.js | 214 - .../node_modules/content-type/package.json | 65 - .../node_modules/cookie-signature/.npmignore | 4 - .../node_modules/cookie-signature/History.md | 38 - .../node_modules/cookie-signature/Readme.md | 42 - .../node_modules/cookie-signature/index.js | 51 - .../cookie-signature/package.json | 59 - .../express/node_modules/cookie/LICENSE | 23 - .../express/node_modules/cookie/README.md | 64 - .../express/node_modules/cookie/index.js | 116 - .../express/node_modules/cookie/package.json | 69 - .../express/node_modules/debug/.jshintrc | 3 - .../express/node_modules/debug/.npmignore | 6 - .../express/node_modules/debug/History.md | 195 - .../express/node_modules/debug/Makefile | 36 - .../express/node_modules/debug/Readme.md | 188 - .../express/node_modules/debug/bower.json | 28 - .../express/node_modules/debug/browser.js | 168 - .../express/node_modules/debug/component.json | 19 - .../express/node_modules/debug/debug.js | 197 - .../express/node_modules/debug/node.js | 209 - .../debug/node_modules/ms/.npmignore | 5 - .../debug/node_modules/ms/History.md | 66 - .../debug/node_modules/ms/LICENSE | 20 - .../debug/node_modules/ms/README.md | 35 - .../debug/node_modules/ms/index.js | 125 - .../debug/node_modules/ms/package.json | 48 - .../express/node_modules/debug/package.json | 73 - .../express/node_modules/depd/History.md | 75 - .../express/node_modules/depd/LICENSE | 22 - .../express/node_modules/depd/Readme.md | 274 - .../express/node_modules/depd/index.js | 529 - .../depd/lib/compat/buffer-concat.js | 33 - .../depd/lib/compat/callsite-tostring.js | 101 - .../node_modules/depd/lib/compat/index.js | 69 - .../express/node_modules/depd/package.json | 66 - .../express/node_modules/escape-html/LICENSE | 22 - .../node_modules/escape-html/Readme.md | 15 - .../express/node_modules/escape-html/index.js | 29 - .../node_modules/escape-html/package.json | 51 - .../express/node_modules/etag/HISTORY.md | 71 - .../express/node_modules/etag/LICENSE | 22 - .../express/node_modules/etag/README.md | 165 - .../express/node_modules/etag/index.js | 132 - .../express/node_modules/etag/package.json | 73 - .../node_modules/finalhandler/HISTORY.md | 90 - .../express/node_modules/finalhandler/LICENSE | 22 - .../node_modules/finalhandler/README.md | 133 - .../node_modules/finalhandler/index.js | 151 - .../node_modules/unpipe/HISTORY.md | 4 - .../finalhandler/node_modules/unpipe/LICENSE | 22 - .../node_modules/unpipe/README.md | 43 - .../finalhandler/node_modules/unpipe/index.js | 69 - .../node_modules/unpipe/package.json | 59 - .../node_modules/finalhandler/package.json | 81 - .../express/node_modules/fresh/HISTORY.md | 38 - .../express/node_modules/fresh/LICENSE | 22 - .../express/node_modules/fresh/README.md | 58 - .../express/node_modules/fresh/index.js | 57 - .../express/node_modules/fresh/package.json | 87 - .../node_modules/merge-descriptors/LICENSE | 22 - .../node_modules/merge-descriptors/README.md | 34 - .../node_modules/merge-descriptors/index.js | 57 - .../merge-descriptors/package.json | 125 - .../express/node_modules/methods/HISTORY.md | 24 - .../express/node_modules/methods/LICENSE | 23 - .../express/node_modules/methods/README.md | 41 - .../express/node_modules/methods/index.js | 42 - .../express/node_modules/methods/package.json | 88 - .../node_modules/on-finished/HISTORY.md | 88 - .../express/node_modules/on-finished/LICENSE | 23 - .../node_modules/on-finished/README.md | 154 - .../express/node_modules/on-finished/index.js | 196 - .../on-finished/node_modules/ee-first/LICENSE | 22 - .../node_modules/ee-first/README.md | 80 - .../node_modules/ee-first/index.js | 95 - .../node_modules/ee-first/package.json | 64 - .../node_modules/on-finished/package.json | 71 - .../express/node_modules/parseurl/.npmignore | 4 - .../express/node_modules/parseurl/HISTORY.md | 42 - .../express/node_modules/parseurl/LICENSE | 24 - .../express/node_modules/parseurl/README.md | 107 - .../express/node_modules/parseurl/index.js | 136 - .../node_modules/parseurl/package.json | 80 - .../node_modules/path-to-regexp/History.md | 36 - .../node_modules/path-to-regexp/LICENSE | 21 - .../node_modules/path-to-regexp/Readme.md | 35 - .../node_modules/path-to-regexp/index.js | 129 - .../node_modules/path-to-regexp/package.json | 185 - .../node_modules/proxy-addr/HISTORY.md | 66 - .../express/node_modules/proxy-addr/LICENSE | 22 - .../express/node_modules/proxy-addr/README.md | 137 - .../express/node_modules/proxy-addr/index.js | 345 - .../node_modules/forwarded/HISTORY.md | 4 - .../proxy-addr/node_modules/forwarded/LICENSE | 22 - .../node_modules/forwarded/README.md | 53 - .../node_modules/forwarded/index.js | 35 - .../node_modules/forwarded/package.json | 65 - .../node_modules/ipaddr.js/.npmignore | 2 - .../node_modules/ipaddr.js/Cakefile | 18 - .../proxy-addr/node_modules/ipaddr.js/LICENSE | 19 - .../node_modules/ipaddr.js/README.md | 161 - .../node_modules/ipaddr.js/ipaddr.min.js | 1 - .../node_modules/ipaddr.js/lib/ipaddr.js | 439 - .../node_modules/ipaddr.js/package.json | 60 - .../node_modules/ipaddr.js/src/ipaddr.coffee | 374 - .../ipaddr.js/test/ipaddr.test.coffee | 262 - .../node_modules/proxy-addr/package.json | 90 - .../express/node_modules/qs/.eslintignore | 1 - .../express/node_modules/qs/.npmignore | 19 - .../express/node_modules/qs/.travis.yml | 6 - .../express/node_modules/qs/CHANGELOG.md | 88 - .../express/node_modules/qs/CONTRIBUTING.md | 1 - .../express/node_modules/qs/LICENSE | 28 - .../express/node_modules/qs/README.md | 317 - .../express/node_modules/qs/bower.json | 22 - .../express/node_modules/qs/lib/index.js | 15 - .../express/node_modules/qs/lib/parse.js | 186 - .../express/node_modules/qs/lib/stringify.js | 121 - .../express/node_modules/qs/lib/utils.js | 190 - .../express/node_modules/qs/package.json | 57 - .../express/node_modules/qs/test/parse.js | 478 - .../express/node_modules/qs/test/stringify.js | 259 - .../express/node_modules/qs/test/utils.js | 28 - .../node_modules/range-parser/HISTORY.md | 35 - .../express/node_modules/range-parser/LICENSE | 22 - .../node_modules/range-parser/README.md | 48 - .../node_modules/range-parser/index.js | 49 - .../node_modules/range-parser/package.json | 76 - .../express/node_modules/send/HISTORY.md | 295 - .../express/node_modules/send/LICENSE | 23 - .../express/node_modules/send/README.md | 195 - .../express/node_modules/send/index.js | 820 -- .../node_modules/send/node_modules/.bin/mime | 1 - .../send/node_modules/destroy/README.md | 38 - .../send/node_modules/destroy/index.js | 36 - .../send/node_modules/destroy/package.json | 67 - .../send/node_modules/http-errors/HISTORY.md | 76 - .../send/node_modules/http-errors/LICENSE | 22 - .../send/node_modules/http-errors/README.md | 63 - .../send/node_modules/http-errors/index.js | 120 - .../http-errors/node_modules/inherits/LICENSE | 16 - .../node_modules/inherits/README.md | 42 - .../node_modules/inherits/inherits.js | 1 - .../node_modules/inherits/inherits_browser.js | 23 - .../node_modules/inherits/package.json | 50 - .../http-errors/node_modules/inherits/test.js | 25 - .../node_modules/http-errors/package.json | 85 - .../send/node_modules/mime/.npmignore | 0 .../send/node_modules/mime/LICENSE | 19 - .../send/node_modules/mime/README.md | 90 - .../send/node_modules/mime/build/build.js | 11 - .../send/node_modules/mime/build/test.js | 57 - .../send/node_modules/mime/cli.js | 8 - .../send/node_modules/mime/mime.js | 108 - .../send/node_modules/mime/package.json | 73 - .../send/node_modules/mime/types.json | 1 - .../send/node_modules/ms/.npmignore | 5 - .../send/node_modules/ms/History.md | 66 - .../node_modules/send/node_modules/ms/LICENSE | 20 - .../send/node_modules/ms/README.md | 35 - .../send/node_modules/ms/index.js | 125 - .../send/node_modules/ms/package.json | 48 - .../send/node_modules/statuses/LICENSE | 22 - .../send/node_modules/statuses/README.md | 114 - .../send/node_modules/statuses/codes.json | 64 - .../send/node_modules/statuses/index.js | 60 - .../send/node_modules/statuses/package.json | 84 - .../express/node_modules/send/package.json | 89 - .../node_modules/serve-static/HISTORY.md | 284 - .../express/node_modules/serve-static/LICENSE | 25 - .../node_modules/serve-static/README.md | 235 - .../node_modules/serve-static/index.js | 187 - .../node_modules/serve-static/package.json | 83 - .../express/node_modules/type-is/HISTORY.md | 174 - .../express/node_modules/type-is/LICENSE | 23 - .../express/node_modules/type-is/README.md | 132 - .../express/node_modules/type-is/index.js | 262 - .../node_modules/media-typer/HISTORY.md | 22 - .../type-is/node_modules/media-typer/LICENSE | 22 - .../node_modules/media-typer/README.md | 81 - .../type-is/node_modules/media-typer/index.js | 270 - .../node_modules/media-typer/package.json | 58 - .../node_modules/mime-types/HISTORY.md | 165 - .../type-is/node_modules/mime-types/LICENSE | 23 - .../type-is/node_modules/mime-types/README.md | 103 - .../type-is/node_modules/mime-types/index.js | 188 - .../node_modules/mime-db/HISTORY.md | 266 - .../mime-types/node_modules/mime-db/LICENSE | 22 - .../mime-types/node_modules/mime-db/README.md | 82 - .../mime-types/node_modules/mime-db/db.json | 6460 ---------- .../mime-types/node_modules/mime-db/index.js | 11 - .../node_modules/mime-db/package.json | 94 - .../node_modules/mime-types/package.json | 84 - .../express/node_modules/type-is/package.json | 93 - .../node_modules/utils-merge/.travis.yml | 6 - .../express/node_modules/utils-merge/LICENSE | 20 - .../node_modules/utils-merge/README.md | 34 - .../express/node_modules/utils-merge/index.js | 23 - .../node_modules/utils-merge/package.json | 60 - .../express/node_modules/vary/HISTORY.md | 23 - .../express/node_modules/vary/LICENSE | 22 - .../express/node_modules/vary/README.md | 91 - .../express/node_modules/vary/index.js | 117 - .../express/node_modules/vary/package.json | 72 - .../node_modules/express/package.json | 167 - .../express3-handlebars/.npmignore | 2 - .../express3-handlebars/HISTORY.md | 189 - .../node_modules/express3-handlebars/LICENSE | 27 - .../express3-handlebars/README.md | 642 - .../examples/advanced/app.js | 99 - .../examples/advanced/lib/helpers.js | 3 - .../advanced/node_modules/express/.npmignore | 11 - .../advanced/node_modules/express/History.md | 1924 --- .../advanced/node_modules/express/LICENSE | 22 - .../advanced/node_modules/express/Readme.md | 128 - .../advanced/node_modules/express/index.js | 2 - .../node_modules/express/lib/application.js | 554 - .../node_modules/express/lib/express.js | 93 - .../express/lib/middleware/init.js | 26 - .../express/lib/middleware/query.js | 30 - .../node_modules/express/lib/request.js | 454 - .../node_modules/express/lib/response.js | 831 -- .../node_modules/express/lib/router/index.js | 548 - .../node_modules/express/lib/router/layer.js | 151 - .../node_modules/express/lib/router/match.js | 61 - .../node_modules/express/lib/router/route.js | 175 - .../node_modules/express/lib/utils.js | 302 - .../advanced/node_modules/express/lib/view.js | 77 - .../express/node_modules/accepts/.npmignore | 3 - .../express/node_modules/accepts/History.md | 42 - .../express/node_modules/accepts/README.md | 101 - .../express/node_modules/accepts/index.js | 160 - .../node_modules/mime-types/.npmignore | 14 - .../node_modules/mime-types/.travis.yml | 12 - .../accepts/node_modules/mime-types/LICENSE | 22 - .../accepts/node_modules/mime-types/Makefile | 9 - .../accepts/node_modules/mime-types/README.md | 101 - .../node_modules/mime-types/SOURCES.md | 17 - .../node_modules/mime-types/component.json | 16 - .../node_modules/mime-types/lib/custom.json | 27 - .../node_modules/mime-types/lib/index.js | 74 - .../node_modules/mime-types/lib/mime.json | 3317 ----- .../node_modules/mime-types/lib/node.json | 55 - .../node_modules/mime-types/package.json | 68 - .../node_modules/negotiator/.npmignore | 3 - .../accepts/node_modules/negotiator/LICENSE | 27 - .../node_modules/negotiator/lib/charset.js | 90 - .../node_modules/negotiator/lib/encoding.js | 120 - .../node_modules/negotiator/lib/language.js | 103 - .../node_modules/negotiator/lib/mediaType.js | 125 - .../node_modules/negotiator/lib/negotiator.js | 37 - .../node_modules/negotiator/package.json | 67 - .../accepts/node_modules/negotiator/readme.md | 132 - .../express/node_modules/accepts/package.json | 81 - .../node_modules/buffer-crc32/.npmignore | 1 - .../node_modules/buffer-crc32/.travis.yml | 8 - .../express/node_modules/buffer-crc32/LICENSE | 17 - .../node_modules/buffer-crc32/README.md | 47 - .../node_modules/buffer-crc32/index.js | 91 - .../node_modules/buffer-crc32/package.json | 57 - .../buffer-crc32/tests/crc.test.js | 89 - .../node_modules/cookie-signature/.npmignore | 4 - .../node_modules/cookie-signature/History.md | 27 - .../node_modules/cookie-signature/Makefile | 7 - .../node_modules/cookie-signature/Readme.md | 42 - .../node_modules/cookie-signature/index.js | 51 - .../cookie-signature/package.json | 53 - .../express/node_modules/cookie/.npmignore | 2 - .../express/node_modules/cookie/LICENSE | 9 - .../express/node_modules/cookie/README.md | 44 - .../express/node_modules/cookie/index.js | 75 - .../express/node_modules/cookie/package.json | 54 - .../express/node_modules/debug/.jshintrc | 3 - .../express/node_modules/debug/.npmignore | 6 - .../express/node_modules/debug/History.md | 144 - .../express/node_modules/debug/Makefile | 33 - .../express/node_modules/debug/Readme.md | 156 - .../express/node_modules/debug/browser.js | 147 - .../express/node_modules/debug/component.json | 19 - .../express/node_modules/debug/debug.js | 197 - .../express/node_modules/debug/node.js | 129 - .../debug/node_modules/ms/.npmignore | 5 - .../debug/node_modules/ms/README.md | 33 - .../debug/node_modules/ms/index.js | 111 - .../debug/node_modules/ms/package.json | 46 - .../express/node_modules/debug/package.json | 71 - .../express/node_modules/depd/.npmignore | 4 - .../express/node_modules/depd/History.md | 56 - .../express/node_modules/depd/LICENSE | 22 - .../express/node_modules/depd/Readme.md | 272 - .../express/node_modules/depd/index.js | 520 - .../express/node_modules/depd/package.json | 56 - .../node_modules/escape-html/.npmignore | 2 - .../express/node_modules/escape-html/Makefile | 11 - .../node_modules/escape-html/Readme.md | 15 - .../node_modules/escape-html/component.json | 10 - .../express/node_modules/escape-html/index.js | 16 - .../node_modules/escape-html/package.json | 47 - .../node_modules/finalhandler/.npmignore | 3 - .../node_modules/finalhandler/HISTORY.md | 27 - .../node_modules/finalhandler/README.md | 140 - .../node_modules/finalhandler/index.js | 158 - .../node_modules/finalhandler/package.json | 74 - .../express/node_modules/fresh/.npmignore | 1 - .../express/node_modules/fresh/History.md | 10 - .../express/node_modules/fresh/Makefile | 7 - .../express/node_modules/fresh/Readme.md | 57 - .../express/node_modules/fresh/index.js | 53 - .../express/node_modules/fresh/package.json | 51 - .../node_modules/media-typer/.npmignore | 3 - .../node_modules/media-typer/HISTORY.md | 16 - .../node_modules/media-typer/README.md | 88 - .../express/node_modules/media-typer/index.js | 261 - .../node_modules/media-typer/package.json | 52 - .../node_modules/merge-descriptors/.npmignore | 59 - .../node_modules/merge-descriptors/README.md | 49 - .../merge-descriptors/component.json | 10 - .../node_modules/merge-descriptors/index.js | 8 - .../merge-descriptors/package.json | 43 - .../express/node_modules/methods/.npmignore | 1 - .../express/node_modules/methods/History.md | 20 - .../express/node_modules/methods/LICENSE | 23 - .../express/node_modules/methods/Readme.md | 4 - .../express/node_modules/methods/index.js | 41 - .../express/node_modules/methods/package.json | 58 - .../node_modules/methods/test/methods.js | 33 - .../express/node_modules/parseurl/.npmignore | 4 - .../express/node_modules/parseurl/HISTORY.md | 36 - .../express/node_modules/parseurl/LICENSE | 23 - .../express/node_modules/parseurl/README.md | 99 - .../express/node_modules/parseurl/index.js | 87 - .../node_modules/parseurl/package.json | 79 - .../node_modules/path-to-regexp/.npmignore | 2 - .../node_modules/path-to-regexp/History.md | 16 - .../node_modules/path-to-regexp/Readme.md | 33 - .../path-to-regexp/component.json | 15 - .../node_modules/path-to-regexp/index.js | 70 - .../node_modules/path-to-regexp/package.json | 162 - .../node_modules/path-to-regexp/test.js | 616 - .../node_modules/proxy-addr/.npmignore | 4 - .../node_modules/proxy-addr/History.md | 27 - .../express/node_modules/proxy-addr/LICENSE | 22 - .../express/node_modules/proxy-addr/README.md | 124 - .../express/node_modules/proxy-addr/index.js | 353 - .../node_modules/ipaddr.js/.npmignore | 2 - .../node_modules/ipaddr.js/Cakefile | 18 - .../proxy-addr/node_modules/ipaddr.js/LICENSE | 19 - .../node_modules/ipaddr.js/README.md | 149 - .../node_modules/ipaddr.js/ipaddr.min.js | 1 - .../node_modules/ipaddr.js/lib/ipaddr.js | 401 - .../node_modules/ipaddr.js/package.json | 58 - .../node_modules/ipaddr.js/src/ipaddr.coffee | 344 - .../ipaddr.js/test/ipaddr.test.coffee | 209 - .../node_modules/proxy-addr/package.json | 83 - .../express/node_modules/qs/.gitmodules | 6 - .../express/node_modules/qs/.npmignore | 7 - .../express/node_modules/qs/Readme.md | 58 - .../express/node_modules/qs/index.js | 366 - .../express/node_modules/qs/package.json | 55 - .../node_modules/range-parser/.npmignore | 1 - .../node_modules/range-parser/History.md | 21 - .../node_modules/range-parser/Makefile | 7 - .../node_modules/range-parser/Readme.md | 53 - .../node_modules/range-parser/index.js | 49 - .../node_modules/range-parser/package.json | 51 - .../express/node_modules/send/.npmignore | 5 - .../express/node_modules/send/History.md | 137 - .../express/node_modules/send/Readme.md | 159 - .../express/node_modules/send/index.js | 2 - .../express/node_modules/send/lib/send.js | 711 -- .../express/node_modules/send/lib/utils.js | 42 - .../send/node_modules/finished/.npmignore | 3 - .../send/node_modules/finished/HISTORY.md | 50 - .../send/node_modules/finished/README.md | 88 - .../send/node_modules/finished/index.js | 62 - .../finished/node_modules/ee-first/.npmignore | 2 - .../finished/node_modules/ee-first/LICENSE | 22 - .../finished/node_modules/ee-first/README.md | 5 - .../finished/node_modules/ee-first/index.js | 60 - .../node_modules/ee-first/package.json | 50 - .../finished/node_modules/ee-first/test.js | 60 - .../send/node_modules/finished/package.json | 76 - .../send/node_modules/mime/LICENSE | 19 - .../send/node_modules/mime/README.md | 66 - .../send/node_modules/mime/mime.js | 114 - .../send/node_modules/mime/package.json | 58 - .../send/node_modules/mime/test.js | 84 - .../send/node_modules/mime/types/mime.types | 1588 --- .../send/node_modules/mime/types/node.types | 77 - .../send/node_modules/ms/.npmignore | 5 - .../send/node_modules/ms/README.md | 33 - .../send/node_modules/ms/index.js | 111 - .../send/node_modules/ms/package.json | 46 - .../express/node_modules/send/package.json | 78 - .../node_modules/serve-static/.npmignore | 3 - .../node_modules/serve-static/History.md | 117 - .../express/node_modules/serve-static/LICENSE | 25 - .../node_modules/serve-static/Readme.md | 144 - .../node_modules/serve-static/index.js | 122 - .../serve-static/node_modules/send/.npmignore | 5 - .../serve-static/node_modules/send/History.md | 142 - .../serve-static/node_modules/send/Readme.md | 159 - .../serve-static/node_modules/send/index.js | 2 - .../node_modules/send/lib/send.js | 712 -- .../node_modules/send/lib/utils.js | 42 - .../send/node_modules/finished/.npmignore | 3 - .../send/node_modules/finished/HISTORY.md | 50 - .../send/node_modules/finished/README.md | 88 - .../send/node_modules/finished/index.js | 62 - .../finished/node_modules/ee-first/.npmignore | 2 - .../finished/node_modules/ee-first/LICENSE | 22 - .../finished/node_modules/ee-first/README.md | 5 - .../finished/node_modules/ee-first/index.js | 60 - .../node_modules/ee-first/package.json | 50 - .../finished/node_modules/ee-first/test.js | 60 - .../send/node_modules/finished/package.json | 76 - .../send/node_modules/mime/LICENSE | 19 - .../send/node_modules/mime/README.md | 66 - .../send/node_modules/mime/mime.js | 114 - .../send/node_modules/mime/package.json | 58 - .../send/node_modules/mime/test.js | 84 - .../send/node_modules/mime/types/mime.types | 1588 --- .../send/node_modules/mime/types/node.types | 77 - .../send/node_modules/ms/.npmignore | 5 - .../send/node_modules/ms/README.md | 33 - .../send/node_modules/ms/index.js | 111 - .../send/node_modules/ms/package.json | 46 - .../node_modules/send/package.json | 78 - .../node_modules/serve-static/package.json | 78 - .../express/node_modules/type-is/.npmignore | 3 - .../express/node_modules/type-is/HISTORY.md | 54 - .../express/node_modules/type-is/README.md | 101 - .../express/node_modules/type-is/index.js | 230 - .../node_modules/mime-types/.npmignore | 14 - .../node_modules/mime-types/.travis.yml | 12 - .../type-is/node_modules/mime-types/LICENSE | 22 - .../type-is/node_modules/mime-types/Makefile | 9 - .../type-is/node_modules/mime-types/README.md | 101 - .../node_modules/mime-types/SOURCES.md | 17 - .../node_modules/mime-types/component.json | 16 - .../node_modules/mime-types/lib/custom.json | 27 - .../node_modules/mime-types/lib/index.js | 74 - .../node_modules/mime-types/lib/mime.json | 3317 ----- .../node_modules/mime-types/lib/node.json | 55 - .../node_modules/mime-types/package.json | 68 - .../express/node_modules/type-is/package.json | 84 - .../node_modules/utils-merge/.travis.yml | 6 - .../express/node_modules/utils-merge/LICENSE | 20 - .../node_modules/utils-merge/README.md | 34 - .../express/node_modules/utils-merge/index.js | 23 - .../node_modules/utils-merge/package.json | 61 - .../express/node_modules/vary/.npmignore | 3 - .../express/node_modules/vary/History.md | 9 - .../express/node_modules/vary/LICENSE | 22 - .../express/node_modules/vary/README.md | 43 - .../express/node_modules/vary/index.js | 79 - .../express/node_modules/vary/package.json | 73 - .../node_modules/express/package.json | 148 - .../advanced/node_modules/express/test.js | 8 - .../examples/advanced/public/echo.js | 14 - .../advanced/shared/templates/echo.handlebars | 1 - .../examples/advanced/views/echo.handlebars | 8 - .../examples/advanced/views/home.handlebars | 3 - .../advanced/views/layouts/main.handlebars | 12 - .../views/layouts/shared-templates.handlebars | 25 - .../views/partials/page/nav.handlebars | 6 - .../views/partials/page/title.handlebars | 1 - .../examples/advanced/views/yell.handlebars | 5 - .../express3-handlebars/examples/basic/app.js | 15 - .../basic/node_modules/express/.npmignore | 11 - .../basic/node_modules/express/History.md | 1924 --- .../basic/node_modules/express/LICENSE | 22 - .../basic/node_modules/express/Readme.md | 128 - .../basic/node_modules/express/index.js | 2 - .../node_modules/express/lib/application.js | 554 - .../basic/node_modules/express/lib/express.js | 93 - .../express/lib/middleware/init.js | 26 - .../express/lib/middleware/query.js | 30 - .../basic/node_modules/express/lib/request.js | 454 - .../node_modules/express/lib/response.js | 831 -- .../node_modules/express/lib/router/index.js | 548 - .../node_modules/express/lib/router/layer.js | 151 - .../node_modules/express/lib/router/match.js | 61 - .../node_modules/express/lib/router/route.js | 175 - .../basic/node_modules/express/lib/utils.js | 302 - .../basic/node_modules/express/lib/view.js | 77 - .../express/node_modules/accepts/.npmignore | 3 - .../express/node_modules/accepts/History.md | 42 - .../express/node_modules/accepts/README.md | 101 - .../express/node_modules/accepts/index.js | 160 - .../node_modules/mime-types/.npmignore | 14 - .../node_modules/mime-types/.travis.yml | 12 - .../accepts/node_modules/mime-types/LICENSE | 22 - .../accepts/node_modules/mime-types/Makefile | 9 - .../accepts/node_modules/mime-types/README.md | 101 - .../node_modules/mime-types/SOURCES.md | 17 - .../node_modules/mime-types/component.json | 16 - .../node_modules/mime-types/lib/custom.json | 27 - .../node_modules/mime-types/lib/index.js | 74 - .../node_modules/mime-types/lib/mime.json | 3317 ----- .../node_modules/mime-types/lib/node.json | 55 - .../node_modules/mime-types/package.json | 68 - .../node_modules/negotiator/.npmignore | 3 - .../accepts/node_modules/negotiator/LICENSE | 27 - .../node_modules/negotiator/lib/charset.js | 90 - .../node_modules/negotiator/lib/encoding.js | 120 - .../node_modules/negotiator/lib/language.js | 103 - .../node_modules/negotiator/lib/mediaType.js | 125 - .../node_modules/negotiator/lib/negotiator.js | 37 - .../node_modules/negotiator/package.json | 67 - .../accepts/node_modules/negotiator/readme.md | 132 - .../express/node_modules/accepts/package.json | 81 - .../node_modules/buffer-crc32/.npmignore | 1 - .../node_modules/buffer-crc32/.travis.yml | 8 - .../express/node_modules/buffer-crc32/LICENSE | 17 - .../node_modules/buffer-crc32/README.md | 47 - .../node_modules/buffer-crc32/index.js | 91 - .../node_modules/buffer-crc32/package.json | 57 - .../buffer-crc32/tests/crc.test.js | 89 - .../node_modules/cookie-signature/.npmignore | 4 - .../node_modules/cookie-signature/History.md | 27 - .../node_modules/cookie-signature/Makefile | 7 - .../node_modules/cookie-signature/Readme.md | 42 - .../node_modules/cookie-signature/index.js | 51 - .../cookie-signature/package.json | 53 - .../express/node_modules/cookie/.npmignore | 2 - .../express/node_modules/cookie/LICENSE | 9 - .../express/node_modules/cookie/README.md | 44 - .../express/node_modules/cookie/index.js | 75 - .../express/node_modules/cookie/package.json | 54 - .../express/node_modules/debug/.jshintrc | 3 - .../express/node_modules/debug/.npmignore | 6 - .../express/node_modules/debug/History.md | 144 - .../express/node_modules/debug/Makefile | 33 - .../express/node_modules/debug/Readme.md | 156 - .../express/node_modules/debug/browser.js | 147 - .../express/node_modules/debug/component.json | 19 - .../express/node_modules/debug/debug.js | 197 - .../express/node_modules/debug/node.js | 129 - .../debug/node_modules/ms/.npmignore | 5 - .../debug/node_modules/ms/README.md | 33 - .../debug/node_modules/ms/index.js | 111 - .../debug/node_modules/ms/package.json | 46 - .../express/node_modules/debug/package.json | 71 - .../express/node_modules/depd/.npmignore | 4 - .../express/node_modules/depd/History.md | 56 - .../express/node_modules/depd/LICENSE | 22 - .../express/node_modules/depd/Readme.md | 272 - .../express/node_modules/depd/index.js | 520 - .../express/node_modules/depd/package.json | 56 - .../node_modules/escape-html/.npmignore | 2 - .../express/node_modules/escape-html/Makefile | 11 - .../node_modules/escape-html/Readme.md | 15 - .../node_modules/escape-html/component.json | 10 - .../express/node_modules/escape-html/index.js | 16 - .../node_modules/escape-html/package.json | 47 - .../node_modules/finalhandler/.npmignore | 3 - .../node_modules/finalhandler/HISTORY.md | 27 - .../node_modules/finalhandler/README.md | 140 - .../node_modules/finalhandler/index.js | 158 - .../node_modules/finalhandler/package.json | 74 - .../express/node_modules/fresh/.npmignore | 1 - .../express/node_modules/fresh/History.md | 10 - .../express/node_modules/fresh/Makefile | 7 - .../express/node_modules/fresh/Readme.md | 57 - .../express/node_modules/fresh/index.js | 53 - .../express/node_modules/fresh/package.json | 51 - .../node_modules/media-typer/.npmignore | 3 - .../node_modules/media-typer/HISTORY.md | 16 - .../node_modules/media-typer/README.md | 88 - .../express/node_modules/media-typer/index.js | 261 - .../node_modules/media-typer/package.json | 52 - .../node_modules/merge-descriptors/.npmignore | 59 - .../node_modules/merge-descriptors/README.md | 49 - .../merge-descriptors/component.json | 10 - .../node_modules/merge-descriptors/index.js | 8 - .../merge-descriptors/package.json | 43 - .../express/node_modules/methods/.npmignore | 1 - .../express/node_modules/methods/History.md | 20 - .../express/node_modules/methods/LICENSE | 23 - .../express/node_modules/methods/Readme.md | 4 - .../express/node_modules/methods/index.js | 41 - .../express/node_modules/methods/package.json | 58 - .../node_modules/methods/test/methods.js | 33 - .../express/node_modules/parseurl/.npmignore | 4 - .../express/node_modules/parseurl/HISTORY.md | 36 - .../express/node_modules/parseurl/LICENSE | 23 - .../express/node_modules/parseurl/README.md | 99 - .../express/node_modules/parseurl/index.js | 87 - .../node_modules/parseurl/package.json | 79 - .../node_modules/path-to-regexp/.npmignore | 2 - .../node_modules/path-to-regexp/History.md | 16 - .../node_modules/path-to-regexp/Readme.md | 33 - .../path-to-regexp/component.json | 15 - .../node_modules/path-to-regexp/index.js | 70 - .../node_modules/path-to-regexp/package.json | 162 - .../node_modules/path-to-regexp/test.js | 616 - .../node_modules/proxy-addr/.npmignore | 4 - .../node_modules/proxy-addr/History.md | 27 - .../express/node_modules/proxy-addr/LICENSE | 22 - .../express/node_modules/proxy-addr/README.md | 124 - .../express/node_modules/proxy-addr/index.js | 353 - .../node_modules/ipaddr.js/.npmignore | 2 - .../node_modules/ipaddr.js/Cakefile | 18 - .../proxy-addr/node_modules/ipaddr.js/LICENSE | 19 - .../node_modules/ipaddr.js/README.md | 149 - .../node_modules/ipaddr.js/ipaddr.min.js | 1 - .../node_modules/ipaddr.js/lib/ipaddr.js | 401 - .../node_modules/ipaddr.js/package.json | 58 - .../node_modules/ipaddr.js/src/ipaddr.coffee | 344 - .../ipaddr.js/test/ipaddr.test.coffee | 209 - .../node_modules/proxy-addr/package.json | 83 - .../express/node_modules/qs/.gitmodules | 6 - .../express/node_modules/qs/.npmignore | 7 - .../express/node_modules/qs/Readme.md | 58 - .../express/node_modules/qs/index.js | 366 - .../express/node_modules/qs/package.json | 55 - .../node_modules/range-parser/.npmignore | 1 - .../node_modules/range-parser/History.md | 21 - .../node_modules/range-parser/Makefile | 7 - .../node_modules/range-parser/Readme.md | 53 - .../node_modules/range-parser/index.js | 49 - .../node_modules/range-parser/package.json | 51 - .../express/node_modules/send/.npmignore | 5 - .../express/node_modules/send/History.md | 137 - .../express/node_modules/send/Readme.md | 159 - .../express/node_modules/send/index.js | 2 - .../express/node_modules/send/lib/send.js | 711 -- .../express/node_modules/send/lib/utils.js | 42 - .../send/node_modules/finished/.npmignore | 3 - .../send/node_modules/finished/HISTORY.md | 50 - .../send/node_modules/finished/README.md | 88 - .../send/node_modules/finished/index.js | 62 - .../finished/node_modules/ee-first/.npmignore | 2 - .../finished/node_modules/ee-first/LICENSE | 22 - .../finished/node_modules/ee-first/README.md | 5 - .../finished/node_modules/ee-first/index.js | 60 - .../node_modules/ee-first/package.json | 50 - .../finished/node_modules/ee-first/test.js | 60 - .../send/node_modules/finished/package.json | 76 - .../send/node_modules/mime/LICENSE | 19 - .../send/node_modules/mime/README.md | 66 - .../send/node_modules/mime/mime.js | 114 - .../send/node_modules/mime/package.json | 58 - .../send/node_modules/mime/test.js | 84 - .../send/node_modules/mime/types/mime.types | 1588 --- .../send/node_modules/mime/types/node.types | 77 - .../send/node_modules/ms/.npmignore | 5 - .../send/node_modules/ms/README.md | 33 - .../send/node_modules/ms/index.js | 111 - .../send/node_modules/ms/package.json | 47 - .../express/node_modules/send/package.json | 78 - .../node_modules/serve-static/.npmignore | 3 - .../node_modules/serve-static/History.md | 117 - .../express/node_modules/serve-static/LICENSE | 25 - .../node_modules/serve-static/Readme.md | 144 - .../node_modules/serve-static/index.js | 122 - .../serve-static/node_modules/send/.npmignore | 5 - .../serve-static/node_modules/send/History.md | 142 - .../serve-static/node_modules/send/Readme.md | 159 - .../serve-static/node_modules/send/index.js | 2 - .../node_modules/send/lib/send.js | 712 -- .../node_modules/send/lib/utils.js | 42 - .../send/node_modules/finished/.npmignore | 3 - .../send/node_modules/finished/HISTORY.md | 50 - .../send/node_modules/finished/README.md | 88 - .../send/node_modules/finished/index.js | 62 - .../finished/node_modules/ee-first/.npmignore | 2 - .../finished/node_modules/ee-first/LICENSE | 22 - .../finished/node_modules/ee-first/README.md | 5 - .../finished/node_modules/ee-first/index.js | 60 - .../node_modules/ee-first/package.json | 50 - .../finished/node_modules/ee-first/test.js | 60 - .../send/node_modules/finished/package.json | 76 - .../send/node_modules/mime/LICENSE | 19 - .../send/node_modules/mime/README.md | 66 - .../send/node_modules/mime/mime.js | 114 - .../send/node_modules/mime/package.json | 58 - .../send/node_modules/mime/test.js | 84 - .../send/node_modules/mime/types/mime.types | 1588 --- .../send/node_modules/mime/types/node.types | 77 - .../send/node_modules/ms/.npmignore | 5 - .../send/node_modules/ms/README.md | 33 - .../send/node_modules/ms/index.js | 111 - .../send/node_modules/ms/package.json | 47 - .../node_modules/send/package.json | 78 - .../node_modules/serve-static/package.json | 78 - .../express/node_modules/type-is/.npmignore | 3 - .../express/node_modules/type-is/HISTORY.md | 54 - .../express/node_modules/type-is/README.md | 101 - .../express/node_modules/type-is/index.js | 230 - .../node_modules/mime-types/.npmignore | 14 - .../node_modules/mime-types/.travis.yml | 12 - .../type-is/node_modules/mime-types/LICENSE | 22 - .../type-is/node_modules/mime-types/Makefile | 9 - .../type-is/node_modules/mime-types/README.md | 101 - .../node_modules/mime-types/SOURCES.md | 17 - .../node_modules/mime-types/component.json | 16 - .../node_modules/mime-types/lib/custom.json | 27 - .../node_modules/mime-types/lib/index.js | 74 - .../node_modules/mime-types/lib/mime.json | 3317 ----- .../node_modules/mime-types/lib/node.json | 55 - .../node_modules/mime-types/package.json | 68 - .../express/node_modules/type-is/package.json | 84 - .../node_modules/utils-merge/.travis.yml | 6 - .../express/node_modules/utils-merge/LICENSE | 20 - .../node_modules/utils-merge/README.md | 34 - .../express/node_modules/utils-merge/index.js | 23 - .../node_modules/utils-merge/package.json | 61 - .../express/node_modules/vary/.npmignore | 3 - .../express/node_modules/vary/History.md | 9 - .../express/node_modules/vary/LICENSE | 22 - .../express/node_modules/vary/README.md | 43 - .../express/node_modules/vary/index.js | 79 - .../express/node_modules/vary/package.json | 73 - .../basic/node_modules/express/package.json | 148 - .../basic/node_modules/express/test.js | 8 - .../examples/basic/views/home.handlebars | 1 - .../basic/views/layouts/main.handlebars | 12 - .../node_modules/express3-handlebars/index.js | 13 - .../lib/express-handlebars.js | 369 - .../node_modules/.bin/handlebars | 1 - .../node_modules/.bin/semver | 1 - .../node_modules/async/LICENSE | 19 - .../node_modules/async/README.md | 1425 --- .../node_modules/async/component.json | 11 - .../node_modules/async/lib/async.js | 958 -- .../node_modules/async/package.json | 60 - .../node_modules/glob/.npmignore | 2 - .../node_modules/glob/.travis.yml | 3 - .../node_modules/glob/LICENSE | 27 - .../node_modules/glob/README.md | 250 - .../node_modules/glob/examples/g.js | 9 - .../node_modules/glob/examples/usr-local.js | 9 - .../node_modules/glob/glob.js | 728 -- .../glob/node_modules/inherits/LICENSE | 16 - .../glob/node_modules/inherits/README.md | 42 - .../glob/node_modules/inherits/inherits.js | 1 - .../node_modules/inherits/inherits_browser.js | 23 - .../glob/node_modules/inherits/package.json | 50 - .../glob/node_modules/inherits/test.js | 25 - .../glob/node_modules/minimatch/.npmignore | 1 - .../glob/node_modules/minimatch/LICENSE | 23 - .../glob/node_modules/minimatch/README.md | 218 - .../glob/node_modules/minimatch/minimatch.js | 1061 -- .../node_modules/lru-cache/.npmignore | 1 - .../node_modules/lru-cache/.travis.yml | 8 - .../node_modules/lru-cache/CONTRIBUTORS | 14 - .../minimatch/node_modules/lru-cache/LICENSE | 15 - .../node_modules/lru-cache/README.md | 109 - .../node_modules/lru-cache/lib/lru-cache.js | 274 - .../node_modules/lru-cache/package.json | 58 - .../node_modules/lru-cache/test/basic.js | 395 - .../node_modules/lru-cache/test/foreach.js | 120 - .../lru-cache/test/memory-leak.js | 51 - .../minimatch/node_modules/sigmund/LICENSE | 15 - .../minimatch/node_modules/sigmund/README.md | 53 - .../minimatch/node_modules/sigmund/bench.js | 283 - .../node_modules/sigmund/package.json | 60 - .../minimatch/node_modules/sigmund/sigmund.js | 39 - .../node_modules/sigmund/test/basic.js | 24 - .../glob/node_modules/minimatch/package.json | 57 - .../glob/node_modules/minimatch/test/basic.js | 399 - .../minimatch/test/brace-expand.js | 33 - .../node_modules/minimatch/test/caching.js | 14 - .../node_modules/minimatch/test/defaults.js | 274 - .../test/extglob-ending-with-state-char.js | 8 - .../node_modules/glob/package.json | 58 - .../node_modules/glob/test/00-setup.js | 176 - .../node_modules/glob/test/bash-comparison.js | 63 - .../node_modules/glob/test/bash-results.json | 351 - .../node_modules/glob/test/cwd-test.js | 55 - .../node_modules/glob/test/globstar-match.js | 19 - .../node_modules/glob/test/mark.js | 118 - .../glob/test/new-glob-optional-options.js | 10 - .../node_modules/glob/test/nocase-nomagic.js | 113 - .../node_modules/glob/test/pause-resume.js | 73 - .../node_modules/glob/test/readme-issue.js | 36 - .../node_modules/glob/test/root-nomount.js | 39 - .../node_modules/glob/test/root.js | 46 - .../node_modules/glob/test/stat.js | 32 - .../node_modules/glob/test/zz-cleanup.js | 11 - .../node_modules/handlebars/.npmignore | 23 - .../node_modules/handlebars/LICENSE | 19 - .../node_modules/handlebars/README.markdown | 458 - .../node_modules/handlebars/bin/handlebars | 222 - .../handlebars/dist/amd/handlebars.js | 41 - .../handlebars/dist/amd/handlebars.runtime.js | 36 - .../handlebars/dist/amd/handlebars/base.js | 184 - .../dist/amd/handlebars/compiler/ast.js | 231 - .../dist/amd/handlebars/compiler/base.js | 19 - .../dist/amd/handlebars/compiler/compiler.js | 473 - .../compiler/javascript-compiler.js | 946 -- .../dist/amd/handlebars/compiler/parser.js | 494 - .../dist/amd/handlebars/compiler/printer.js | 142 - .../dist/amd/handlebars/compiler/visitor.js | 16 - .../dist/amd/handlebars/exception.js | 32 - .../handlebars/dist/amd/handlebars/runtime.js | 141 - .../dist/amd/handlebars/safe-string.js | 15 - .../handlebars/dist/amd/handlebars/utils.js | 80 - .../handlebars/dist/cjs/handlebars.js | 37 - .../handlebars/dist/cjs/handlebars.runtime.js | 32 - .../handlebars/dist/cjs/handlebars/base.js | 180 - .../dist/cjs/handlebars/compiler/ast.js | 227 - .../dist/cjs/handlebars/compiler/base.js | 15 - .../dist/cjs/handlebars/compiler/compiler.js | 469 - .../compiler/javascript-compiler.js | 942 -- .../dist/cjs/handlebars/compiler/parser.js | 490 - .../dist/cjs/handlebars/compiler/printer.js | 138 - .../dist/cjs/handlebars/compiler/visitor.js | 12 - .../dist/cjs/handlebars/exception.js | 28 - .../handlebars/dist/cjs/handlebars/runtime.js | 137 - .../dist/cjs/handlebars/safe-string.js | 11 - .../handlebars/dist/cjs/handlebars/utils.js | 76 - .../handlebars/dist/handlebars.amd.js | 2719 ---- .../handlebars/dist/handlebars.amd.min.js | 28 - .../handlebars/dist/handlebars.js | 2746 ---- .../handlebars/dist/handlebars.min.js | 28 - .../handlebars/dist/handlebars.runtime.amd.js | 515 - .../dist/handlebars.runtime.amd.min.js | 27 - .../handlebars/dist/handlebars.runtime.js | 530 - .../handlebars/dist/handlebars.runtime.min.js | 27 - .../node_modules/handlebars/lib/handlebars.js | 33 - .../handlebars/lib/handlebars.runtime.js | 31 - .../handlebars/lib/handlebars/base.js | 178 - .../handlebars/lib/handlebars/compiler/ast.js | 226 - .../lib/handlebars/compiler/base.js | 12 - .../lib/handlebars/compiler/compiler.js | 466 - .../compiler/javascript-compiler.js | 939 -- .../lib/handlebars/compiler/parser.js | 489 - .../lib/handlebars/compiler/printer.js | 138 - .../lib/handlebars/compiler/visitor.js | 11 - .../handlebars/lib/handlebars/exception.js | 27 - .../handlebars/lib/handlebars/runtime.js | 133 - .../handlebars/lib/handlebars/safe-string.js | 10 - .../handlebars/lib/handlebars/utils.js | 73 - .../node_modules/handlebars/lib/index.js | 25 - .../handlebars/node_modules/.bin/uglifyjs | 1 - .../node_modules/optimist/.travis.yml | 4 - .../handlebars/node_modules/optimist/LICENSE | 21 - .../node_modules/optimist/example/bool.js | 10 - .../optimist/example/boolean_double.js | 7 - .../optimist/example/boolean_single.js | 7 - .../optimist/example/default_hash.js | 8 - .../optimist/example/default_singles.js | 7 - .../node_modules/optimist/example/divide.js | 8 - .../optimist/example/line_count.js | 20 - .../optimist/example/line_count_options.js | 29 - .../optimist/example/line_count_wrap.js | 29 - .../node_modules/optimist/example/nonopt.js | 4 - .../node_modules/optimist/example/reflect.js | 2 - .../node_modules/optimist/example/short.js | 3 - .../node_modules/optimist/example/string.js | 11 - .../optimist/example/usage-options.js | 19 - .../node_modules/optimist/example/xup.js | 10 - .../handlebars/node_modules/optimist/index.js | 478 - .../optimist/node_modules/wordwrap/LICENSE | 18 - .../node_modules/wordwrap/README.markdown | 70 - .../node_modules/wordwrap/example/center.js | 10 - .../node_modules/wordwrap/example/meat.js | 3 - .../optimist/node_modules/wordwrap/index.js | 76 - .../node_modules/wordwrap/package.json | 63 - .../node_modules/wordwrap/test/break.js | 30 - .../node_modules/wordwrap/test/idleness.txt | 63 - .../node_modules/wordwrap/test/wrap.js | 31 - .../node_modules/optimist/package.json | 63 - .../node_modules/optimist/readme.markdown | 487 - .../node_modules/optimist/test/_.js | 71 - .../node_modules/optimist/test/_/argv.js | 2 - .../node_modules/optimist/test/_/bin.js | 3 - .../node_modules/optimist/test/parse.js | 446 - .../node_modules/optimist/test/usage.js | 292 - .../node_modules/uglify-js/.npmignore | 2 - .../node_modules/uglify-js/.travis.yml | 7 - .../handlebars/node_modules/uglify-js/LICENSE | 29 - .../node_modules/uglify-js/README.md | 588 - .../node_modules/uglify-js/bin/uglifyjs | 402 - .../node_modules/uglify-js/lib/ast.js | 985 -- .../node_modules/uglify-js/lib/compress.js | 2028 --- .../node_modules/uglify-js/lib/mozilla-ast.js | 267 - .../node_modules/uglify-js/lib/output.js | 1229 -- .../node_modules/uglify-js/lib/parse.js | 1410 --- .../node_modules/uglify-js/lib/scope.js | 581 - .../node_modules/uglify-js/lib/sourcemap.js | 81 - .../node_modules/uglify-js/lib/transform.js | 217 - .../node_modules/uglify-js/lib/utils.js | 295 - .../node_modules/source-map/.npmignore | 2 - .../node_modules/source-map/.travis.yml | 4 - .../node_modules/source-map/CHANGELOG.md | 194 - .../uglify-js/node_modules/source-map/LICENSE | 28 - .../source-map/Makefile.dryice.js | 166 - .../node_modules/source-map/README.md | 475 - .../source-map/build/assert-shim.js | 56 - .../source-map/build/mini-require.js | 152 - .../source-map/build/prefix-source-map.jsm | 20 - .../source-map/build/prefix-utils.jsm | 18 - .../source-map/build/suffix-browser.js | 8 - .../source-map/build/suffix-source-map.jsm | 6 - .../source-map/build/suffix-utils.jsm | 21 - .../source-map/build/test-prefix.js | 8 - .../source-map/build/test-suffix.js | 3 - .../node_modules/source-map/lib/source-map.js | 8 - .../source-map/lib/source-map/array-set.js | 97 - .../source-map/lib/source-map/base64-vlq.js | 142 - .../source-map/lib/source-map/base64.js | 42 - .../lib/source-map/binary-search.js | 80 - .../source-map/lib/source-map/mapping-list.js | 86 - .../lib/source-map/source-map-consumer.js | 575 - .../lib/source-map/source-map-generator.js | 400 - .../source-map/lib/source-map/source-node.js | 414 - .../source-map/lib/source-map/util.js | 319 - .../source-map/node_modules/amdefine/LICENSE | 58 - .../node_modules/amdefine/README.md | 171 - .../node_modules/amdefine/amdefine.js | 301 - .../node_modules/amdefine/intercept.js | 36 - .../node_modules/amdefine/package.json | 46 - .../node_modules/source-map/package.json | 186 - .../node_modules/source-map/test/run-tests.js | 62 - .../source-map/test/source-map/test-api.js | 26 - .../test/source-map/test-array-set.js | 104 - .../test/source-map/test-base64-vlq.js | 23 - .../source-map/test/source-map/test-base64.js | 35 - .../test/source-map/test-binary-search.js | 54 - .../test/source-map/test-dog-fooding.js | 84 - .../source-map/test-source-map-consumer.js | 702 -- .../source-map/test-source-map-generator.js | 679 - .../test/source-map/test-source-node.js | 612 - .../source-map/test/source-map/test-util.js | 216 - .../source-map/test/source-map/util.js | 192 - .../node_modules/uglify-js/package.json | 57 - .../uglify-js/test/compress/arrays.js | 12 - .../uglify-js/test/compress/blocks.js | 49 - .../uglify-js/test/compress/conditionals.js | 143 - .../uglify-js/test/compress/dead-code.js | 89 - .../uglify-js/test/compress/debugger.js | 24 - .../uglify-js/test/compress/drop-unused.js | 97 - .../uglify-js/test/compress/issue-105.js | 25 - .../uglify-js/test/compress/issue-12.js | 11 - .../uglify-js/test/compress/issue-143.js | 48 - .../uglify-js/test/compress/issue-22.js | 17 - .../uglify-js/test/compress/issue-44.js | 31 - .../uglify-js/test/compress/issue-59.js | 30 - .../uglify-js/test/compress/labels.js | 163 - .../uglify-js/test/compress/loops.js | 123 - .../uglify-js/test/compress/properties.js | 54 - .../uglify-js/test/compress/sequences.js | 161 - .../uglify-js/test/compress/switch.js | 260 - .../uglify-js/test/compress/typeof.js | 25 - .../node_modules/uglify-js/test/run-tests.js | 170 - .../node_modules/uglify-js/tools/node.js | 165 - .../node_modules/handlebars/package.json | 86 - .../node_modules/handlebars/release-notes.md | 193 - .../node_modules/handlebars/runtime.js | 3 - .../node_modules/semver/.npmignore | 1 - .../node_modules/semver/LICENSE | 27 - .../node_modules/semver/Makefile | 24 - .../node_modules/semver/README.md | 158 - .../node_modules/semver/bin/semver | 125 - .../node_modules/semver/foot.js | 6 - .../node_modules/semver/head.js | 2 - .../node_modules/semver/package.json | 50 - .../node_modules/semver/semver.browser.js | 1046 -- .../node_modules/semver/semver.browser.js.gz | Bin 7253 -> 0 bytes .../node_modules/semver/semver.js | 1050 -- .../node_modules/semver/semver.min.js | 1 - .../node_modules/semver/semver.min.js.gz | Bin 3311 -> 0 bytes .../node_modules/semver/test/amd.js | 15 - .../node_modules/semver/test/gtr.js | 173 - .../node_modules/semver/test/index.js | 588 - .../node_modules/semver/test/ltr.js | 175 - .../node_modules/semver/test/no-module.js | 19 - .../express3-handlebars/package.json | 64 - .../package.json | 15 - .../public/.DS_Store | Bin 8196 -> 0 bytes .../public/css/bootstrap.css | 6800 ---------- .../public/img/js.jpg | Bin 661462 -> 0 bytes .../public/js/bootstrap.js | 2363 ---- .../views/.DS_Store | Bin 6148 -> 0 bytes .../views/404.handlebars | 3 - .../views/500.handlebars | 1 - .../views/about.handlebars | 1 - .../views/index.handlebars | 1 - .../views/layouts/.DS_Store | Bin 6148 -> 0 bytes .../views/layouts/main.handlebars | 23 - .../.DS_Store | Bin 8196 -> 0 bytes .../Loading Dynamic Content (Class 8)/app.js | 75 - .../express-handlebars/.npmignore | 1 - .../express-handlebars/HISTORY.md | 363 - .../node_modules/express-handlebars/LICENSE | 31 - .../node_modules/express-handlebars/README.md | 568 - .../node_modules/express-handlebars/index.js | 23 - .../lib/express-handlebars.js | 340 - .../express-handlebars/lib/utils.js | 29 - .../node_modules/.bin/handlebars | 1 - .../node_modules/glob/LICENSE | 15 - .../node_modules/glob/README.md | 377 - .../node_modules/glob/common.js | 245 - .../node_modules/glob/glob.js | 752 -- .../glob/node_modules/inflight/.eslintrc | 17 - .../glob/node_modules/inflight/LICENSE | 15 - .../glob/node_modules/inflight/README.md | 37 - .../glob/node_modules/inflight/inflight.js | 44 - .../inflight/node_modules/wrappy/LICENSE | 15 - .../inflight/node_modules/wrappy/README.md | 36 - .../inflight/node_modules/wrappy/package.json | 52 - .../node_modules/wrappy/test/basic.js | 51 - .../inflight/node_modules/wrappy/wrappy.js | 33 - .../glob/node_modules/inflight/package.json | 61 - .../glob/node_modules/inflight/test.js | 97 - .../glob/node_modules/inherits/LICENSE | 16 - .../glob/node_modules/inherits/README.md | 42 - .../glob/node_modules/inherits/inherits.js | 1 - .../node_modules/inherits/inherits_browser.js | 23 - .../glob/node_modules/inherits/package.json | 50 - .../glob/node_modules/inherits/test.js | 25 - .../glob/node_modules/minimatch/LICENSE | 15 - .../glob/node_modules/minimatch/README.md | 216 - .../glob/node_modules/minimatch/browser.js | 1159 -- .../glob/node_modules/minimatch/minimatch.js | 912 -- .../node_modules/brace-expansion/.npmignore | 2 - .../node_modules/brace-expansion/.travis.yml | 3 - .../node_modules/brace-expansion/README.md | 121 - .../node_modules/brace-expansion/example.js | 8 - .../node_modules/brace-expansion/index.js | 191 - .../node_modules/balanced-match/.npmignore | 2 - .../node_modules/balanced-match/.travis.yml | 4 - .../node_modules/balanced-match/Makefile | 6 - .../node_modules/balanced-match/README.md | 80 - .../node_modules/balanced-match/example.js | 5 - .../node_modules/balanced-match/index.js | 38 - .../node_modules/balanced-match/package.json | 73 - .../balanced-match/test/balanced.js | 56 - .../node_modules/concat-map/.travis.yml | 4 - .../node_modules/concat-map/LICENSE | 18 - .../node_modules/concat-map/README.markdown | 62 - .../node_modules/concat-map/example/map.js | 6 - .../node_modules/concat-map/index.js | 13 - .../node_modules/concat-map/package.json | 83 - .../node_modules/concat-map/test/map.js | 39 - .../node_modules/brace-expansion/package.json | 75 - .../brace-expansion/test/bash-comparison.js | 32 - .../brace-expansion/test/bash-results.txt | 1075 -- .../brace-expansion/test/cases.txt | 182 - .../brace-expansion/test/dollar.js | 9 - .../brace-expansion/test/empty-option.js | 10 - .../brace-expansion/test/generate.sh | 24 - .../test/negative-increment.js | 15 - .../brace-expansion/test/nested.js | 16 - .../brace-expansion/test/order.js | 10 - .../node_modules/brace-expansion/test/pad.js | 13 - .../brace-expansion/test/same-type.js | 7 - .../brace-expansion/test/sequence.js | 50 - .../glob/node_modules/minimatch/package.json | 62 - .../glob/node_modules/once/LICENSE | 15 - .../glob/node_modules/once/README.md | 51 - .../once/node_modules/wrappy/LICENSE | 15 - .../once/node_modules/wrappy/README.md | 36 - .../once/node_modules/wrappy/package.json | 52 - .../once/node_modules/wrappy/test/basic.js | 51 - .../once/node_modules/wrappy/wrappy.js | 33 - .../glob/node_modules/once/once.js | 21 - .../glob/node_modules/once/package.json | 60 - .../glob/node_modules/once/test/once.js | 23 - .../node_modules/path-is-absolute/index.js | 20 - .../node_modules/path-is-absolute/license | 21 - .../path-is-absolute/package.json | 70 - .../node_modules/path-is-absolute/readme.md | 51 - .../node_modules/glob/package.json | 72 - .../node_modules/glob/sync.js | 460 - .../node_modules/graceful-fs/.npmignore | 1 - .../node_modules/graceful-fs/LICENSE | 15 - .../node_modules/graceful-fs/README.md | 36 - .../node_modules/graceful-fs/fs.js | 11 - .../node_modules/graceful-fs/graceful-fs.js | 158 - .../node_modules/graceful-fs/package.json | 72 - .../node_modules/graceful-fs/polyfills.js | 255 - .../node_modules/graceful-fs/test/max-open.js | 69 - .../node_modules/graceful-fs/test/open.js | 39 - .../graceful-fs/test/readdir-sort.js | 20 - .../graceful-fs/test/write-then-read.js | 47 - .../node_modules/handlebars/.gitmodules | 3 - .../node_modules/handlebars/.istanbul.yml | 2 - .../node_modules/handlebars/.npmignore | 25 - .../node_modules/handlebars/CONTRIBUTING.md | 80 - .../node_modules/handlebars/FAQ.md | 60 - .../node_modules/handlebars/LICENSE | 19 - .../node_modules/handlebars/README.markdown | 438 - .../node_modules/handlebars/bin/handlebars | 111 - .../handlebars/dist/amd/handlebars.js | 48 - .../handlebars/dist/amd/handlebars.runtime.js | 41 - .../handlebars/dist/amd/handlebars/base.js | 268 - .../dist/amd/handlebars/compiler/ast.js | 152 - .../dist/amd/handlebars/compiler/base.js | 36 - .../dist/amd/handlebars/compiler/code-gen.js | 161 - .../dist/amd/handlebars/compiler/compiler.js | 523 - .../dist/amd/handlebars/compiler/helpers.js | 131 - .../compiler/javascript-compiler.js | 1053 -- .../dist/amd/handlebars/compiler/parser.js | 678 - .../dist/amd/handlebars/compiler/printer.js | 165 - .../dist/amd/handlebars/compiler/visitor.js | 127 - .../handlebars/compiler/whitespace-control.js | 209 - .../dist/amd/handlebars/exception.js | 37 - .../dist/amd/handlebars/no-conflict.js | 16 - .../handlebars/dist/amd/handlebars/runtime.js | 226 - .../dist/amd/handlebars/safe-string.js | 14 - .../handlebars/dist/amd/handlebars/utils.js | 116 - .../handlebars/dist/amd/precompiler.js | 184 - .../handlebars/dist/cjs/handlebars.js | 63 - .../handlebars/dist/cjs/handlebars.runtime.js | 60 - .../handlebars/dist/cjs/handlebars/base.js | 273 - .../dist/cjs/handlebars/compiler/ast.js | 152 - .../dist/cjs/handlebars/compiler/base.js | 46 - .../dist/cjs/handlebars/compiler/code-gen.js | 164 - .../dist/cjs/handlebars/compiler/compiler.js | 527 - .../dist/cjs/handlebars/compiler/helpers.js | 131 - .../compiler/javascript-compiler.js | 1062 -- .../dist/cjs/handlebars/compiler/parser.js | 678 - .../dist/cjs/handlebars/compiler/printer.js | 165 - .../dist/cjs/handlebars/compiler/visitor.js | 132 - .../handlebars/compiler/whitespace-control.js | 212 - .../dist/cjs/handlebars/exception.js | 38 - .../dist/cjs/handlebars/no-conflict.js | 18 - .../handlebars/dist/cjs/handlebars/runtime.js | 232 - .../dist/cjs/handlebars/safe-string.js | 14 - .../handlebars/dist/cjs/handlebars/utils.js | 114 - .../handlebars/dist/cjs/precompiler.js | 194 - .../handlebars/dist/handlebars.amd.js | 3862 ------ .../handlebars/dist/handlebars.amd.min.js | 29 - .../handlebars/dist/handlebars.js | 4098 ------ .../handlebars/dist/handlebars.min.js | 29 - .../handlebars/dist/handlebars.runtime.amd.js | 744 -- .../dist/handlebars.runtime.amd.min.js | 27 - .../handlebars/dist/handlebars.runtime.js | 881 -- .../handlebars/dist/handlebars.runtime.min.js | 27 - .../handlebars/docs/compiler-api.md | 276 - .../node_modules/handlebars/lib/handlebars.js | 41 - .../handlebars/lib/handlebars.runtime.js | 37 - .../handlebars/lib/handlebars/base.js | 244 - .../handlebars/lib/handlebars/compiler/ast.js | 152 - .../lib/handlebars/compiler/base.js | 25 - .../lib/handlebars/compiler/code-gen.js | 164 - .../lib/handlebars/compiler/compiler.js | 513 - .../lib/handlebars/compiler/helpers.js | 123 - .../compiler/javascript-compiler.js | 1070 -- .../lib/handlebars/compiler/parser.js | 563 - .../lib/handlebars/compiler/printer.js | 151 - .../lib/handlebars/compiler/visitor.js | 119 - .../handlebars/compiler/whitespace-control.js | 208 - .../handlebars/lib/handlebars/exception.js | 34 - .../handlebars/lib/handlebars/no-conflict.js | 12 - .../handlebars/lib/handlebars/runtime.js | 214 - .../handlebars/lib/handlebars/safe-string.js | 10 - .../handlebars/lib/handlebars/utils.js | 101 - .../node_modules/handlebars/lib/index.js | 25 - .../handlebars/lib/precompiler.js | 178 - .../handlebars/node_modules/.bin/uglifyjs | 1 - .../node_modules/optimist/.travis.yml | 4 - .../handlebars/node_modules/optimist/LICENSE | 21 - .../node_modules/optimist/example/bool.js | 10 - .../optimist/example/boolean_double.js | 7 - .../optimist/example/boolean_single.js | 7 - .../optimist/example/default_hash.js | 8 - .../optimist/example/default_singles.js | 7 - .../node_modules/optimist/example/divide.js | 8 - .../optimist/example/line_count.js | 20 - .../optimist/example/line_count_options.js | 29 - .../optimist/example/line_count_wrap.js | 29 - .../node_modules/optimist/example/nonopt.js | 4 - .../node_modules/optimist/example/reflect.js | 2 - .../node_modules/optimist/example/short.js | 3 - .../node_modules/optimist/example/string.js | 11 - .../optimist/example/usage-options.js | 19 - .../node_modules/optimist/example/xup.js | 10 - .../handlebars/node_modules/optimist/index.js | 343 - .../node_modules/minimist/.travis.yml | 4 - .../optimist/node_modules/minimist/LICENSE | 18 - .../node_modules/minimist/example/parse.js | 2 - .../optimist/node_modules/minimist/index.js | 187 - .../node_modules/minimist/package.json | 67 - .../node_modules/minimist/readme.markdown | 73 - .../node_modules/minimist/test/bool.js | 119 - .../node_modules/minimist/test/dash.js | 24 - .../minimist/test/default_bool.js | 20 - .../node_modules/minimist/test/dotted.js | 22 - .../node_modules/minimist/test/long.js | 31 - .../node_modules/minimist/test/num.js | 36 - .../node_modules/minimist/test/parse.js | 197 - .../minimist/test/parse_modified.js | 9 - .../node_modules/minimist/test/short.js | 67 - .../node_modules/minimist/test/whitespace.js | 8 - .../optimist/node_modules/wordwrap/LICENSE | 18 - .../node_modules/wordwrap/README.markdown | 70 - .../node_modules/wordwrap/example/center.js | 10 - .../node_modules/wordwrap/example/meat.js | 3 - .../optimist/node_modules/wordwrap/index.js | 76 - .../node_modules/wordwrap/package.json | 63 - .../node_modules/wordwrap/test/break.js | 30 - .../node_modules/wordwrap/test/idleness.txt | 63 - .../node_modules/wordwrap/test/wrap.js | 31 - .../node_modules/optimist/package.json | 64 - .../node_modules/optimist/readme.markdown | 513 - .../node_modules/optimist/test/_.js | 71 - .../node_modules/optimist/test/_/argv.js | 2 - .../node_modules/optimist/test/_/bin.js | 3 - .../node_modules/optimist/test/dash.js | 31 - .../node_modules/optimist/test/parse.js | 446 - .../optimist/test/parse_modified.js | 14 - .../node_modules/optimist/test/short.js | 16 - .../node_modules/optimist/test/usage.js | 292 - .../node_modules/optimist/test/whitespace.js | 8 - .../node_modules/source-map/.npmignore | 2 - .../node_modules/source-map/.travis.yml | 4 - .../node_modules/source-map/CHANGELOG.md | 194 - .../node_modules/source-map/LICENSE | 28 - .../source-map/Makefile.dryice.js | 166 - .../node_modules/source-map/README.md | 475 - .../source-map/build/assert-shim.js | 56 - .../source-map/build/mini-require.js | 152 - .../source-map/build/prefix-source-map.jsm | 20 - .../source-map/build/prefix-utils.jsm | 18 - .../source-map/build/suffix-browser.js | 8 - .../source-map/build/suffix-source-map.jsm | 6 - .../source-map/build/suffix-utils.jsm | 21 - .../source-map/build/test-prefix.js | 8 - .../source-map/build/test-suffix.js | 3 - .../node_modules/source-map/lib/source-map.js | 8 - .../source-map/lib/source-map/array-set.js | 97 - .../source-map/lib/source-map/base64-vlq.js | 142 - .../source-map/lib/source-map/base64.js | 42 - .../lib/source-map/binary-search.js | 80 - .../source-map/lib/source-map/mapping-list.js | 86 - .../lib/source-map/source-map-consumer.js | 575 - .../lib/source-map/source-map-generator.js | 400 - .../source-map/lib/source-map/source-node.js | 414 - .../source-map/lib/source-map/util.js | 319 - .../source-map/node_modules/amdefine/LICENSE | 58 - .../node_modules/amdefine/README.md | 171 - .../node_modules/amdefine/amdefine.js | 301 - .../node_modules/amdefine/intercept.js | 36 - .../node_modules/amdefine/package.json | 47 - .../node_modules/source-map/package.json | 186 - .../node_modules/source-map/test/run-tests.js | 62 - .../source-map/test/source-map/test-api.js | 26 - .../test/source-map/test-array-set.js | 104 - .../test/source-map/test-base64-vlq.js | 23 - .../source-map/test/source-map/test-base64.js | 35 - .../test/source-map/test-binary-search.js | 54 - .../test/source-map/test-dog-fooding.js | 84 - .../source-map/test-source-map-consumer.js | 702 -- .../source-map/test-source-map-generator.js | 679 - .../test/source-map/test-source-node.js | 612 - .../source-map/test/source-map/test-util.js | 216 - .../source-map/test/source-map/util.js | 192 - .../node_modules/uglify-js/.npmignore | 2 - .../node_modules/uglify-js/.travis.yml | 7 - .../handlebars/node_modules/uglify-js/LICENSE | 29 - .../node_modules/uglify-js/README.md | 588 - .../node_modules/uglify-js/bin/uglifyjs | 402 - .../node_modules/uglify-js/lib/ast.js | 985 -- .../node_modules/uglify-js/lib/compress.js | 2028 --- .../node_modules/uglify-js/lib/mozilla-ast.js | 267 - .../node_modules/uglify-js/lib/output.js | 1229 -- .../node_modules/uglify-js/lib/parse.js | 1410 --- .../node_modules/uglify-js/lib/scope.js | 581 - .../node_modules/uglify-js/lib/sourcemap.js | 81 - .../node_modules/uglify-js/lib/transform.js | 217 - .../node_modules/uglify-js/lib/utils.js | 295 - .../uglify-js/node_modules/async/LICENSE | 19 - .../uglify-js/node_modules/async/README.md | 1425 --- .../node_modules/async/component.json | 11 - .../uglify-js/node_modules/async/lib/async.js | 958 -- .../uglify-js/node_modules/async/package.json | 60 - .../node_modules/optimist/.travis.yml | 4 - .../uglify-js/node_modules/optimist/LICENSE | 21 - .../node_modules/optimist/example/bool.js | 10 - .../optimist/example/boolean_double.js | 7 - .../optimist/example/boolean_single.js | 7 - .../optimist/example/default_hash.js | 8 - .../optimist/example/default_singles.js | 7 - .../node_modules/optimist/example/divide.js | 8 - .../optimist/example/line_count.js | 20 - .../optimist/example/line_count_options.js | 29 - .../optimist/example/line_count_wrap.js | 29 - .../node_modules/optimist/example/nonopt.js | 4 - .../node_modules/optimist/example/reflect.js | 2 - .../node_modules/optimist/example/short.js | 3 - .../node_modules/optimist/example/string.js | 11 - .../optimist/example/usage-options.js | 19 - .../node_modules/optimist/example/xup.js | 10 - .../uglify-js/node_modules/optimist/index.js | 478 - .../optimist/node_modules/wordwrap/LICENSE | 18 - .../node_modules/wordwrap/README.markdown | 70 - .../node_modules/wordwrap/example/center.js | 10 - .../node_modules/wordwrap/example/meat.js | 3 - .../optimist/node_modules/wordwrap/index.js | 76 - .../node_modules/wordwrap/package.json | 63 - .../node_modules/wordwrap/test/break.js | 30 - .../node_modules/wordwrap/test/idleness.txt | 63 - .../node_modules/wordwrap/test/wrap.js | 31 - .../node_modules/optimist/package.json | 63 - .../node_modules/optimist/readme.markdown | 487 - .../uglify-js/node_modules/optimist/test/_.js | 71 - .../node_modules/optimist/test/_/argv.js | 2 - .../node_modules/optimist/test/_/bin.js | 3 - .../node_modules/optimist/test/parse.js | 446 - .../node_modules/optimist/test/usage.js | 292 - .../node_modules/uglify-js/package.json | 57 - .../uglify-js/test/compress/arrays.js | 12 - .../uglify-js/test/compress/blocks.js | 49 - .../uglify-js/test/compress/conditionals.js | 143 - .../uglify-js/test/compress/dead-code.js | 89 - .../uglify-js/test/compress/debugger.js | 24 - .../uglify-js/test/compress/drop-unused.js | 97 - .../uglify-js/test/compress/issue-105.js | 25 - .../uglify-js/test/compress/issue-12.js | 11 - .../uglify-js/test/compress/issue-143.js | 48 - .../uglify-js/test/compress/issue-22.js | 17 - .../uglify-js/test/compress/issue-44.js | 31 - .../uglify-js/test/compress/issue-59.js | 30 - .../uglify-js/test/compress/labels.js | 163 - .../uglify-js/test/compress/loops.js | 123 - .../uglify-js/test/compress/properties.js | 54 - .../uglify-js/test/compress/sequences.js | 161 - .../uglify-js/test/compress/switch.js | 260 - .../uglify-js/test/compress/typeof.js | 25 - .../node_modules/uglify-js/test/run-tests.js | 170 - .../node_modules/uglify-js/tools/node.js | 165 - .../node_modules/handlebars/package.json | 101 - .../node_modules/handlebars/print-script | 92 - .../node_modules/handlebars/release-notes.md | 378 - .../node_modules/handlebars/runtime.js | 3 - .../node_modules/object.assign/CHANGELOG.md | 74 - .../node_modules/object.assign/LICENSE | 21 - .../node_modules/object.assign/README.md | 136 - .../object.assign/dist/browser.js | 135 - .../node_modules/object.assign/index.js | 31 - .../node_modules/object-keys/.editorconfig | 13 - .../node_modules/object-keys/.eslintrc | 201 - .../node_modules/object-keys/.jscs.json | 104 - .../node_modules/object-keys/.npmignore | 2 - .../node_modules/object-keys/.travis.yml | 46 - .../node_modules/object-keys/CHANGELOG.md | 190 - .../node_modules/object-keys/LICENSE | 21 - .../node_modules/object-keys/README.md | 76 - .../node_modules/object-keys/index.js | 122 - .../node_modules/object-keys/isArguments.js | 17 - .../node_modules/object-keys/package.json | 89 - .../node_modules/object-keys/test/index.js | 5 - .../node_modules/object.assign/package.json | 88 - .../node_modules/object.assign/test/index.js | 109 - .../node_modules/promise/.jshintrc | 5 - .../node_modules/promise/.npmignore | 6 - .../node_modules/promise/LICENSE | 19 - .../node_modules/promise/Readme.md | 221 - .../node_modules/promise/core.js | 5 - .../node_modules/promise/index.js | 6 - .../node_modules/promise/lib/core.js | 105 - .../node_modules/promise/lib/done.js | 14 - .../promise/lib/es6-extensions.js | 108 - .../promise/lib/node-extensions.js | 63 - .../promise/node_modules/asap/LICENSE.md | 20 - .../promise/node_modules/asap/README.md | 81 - .../promise/node_modules/asap/asap.js | 113 - .../promise/node_modules/asap/package.json | 37 - .../node_modules/promise/package.json | 56 - .../node_modules/promise/polyfill-done.js | 12 - .../node_modules/promise/polyfill.js | 10 - .../express-handlebars/package.json | 67 - .../node_modules/express/History.md | 3025 ----- .../node_modules/express/LICENSE | 24 - .../node_modules/express/Readme.md | 138 - .../node_modules/express/index.js | 11 - .../node_modules/express/lib/application.js | 643 - .../node_modules/express/lib/express.js | 103 - .../express/lib/middleware/init.js | 36 - .../express/lib/middleware/query.js | 51 - .../node_modules/express/lib/request.js | 489 - .../node_modules/express/lib/response.js | 1053 -- .../node_modules/express/lib/router/index.js | 645 - .../node_modules/express/lib/router/layer.js | 176 - .../node_modules/express/lib/router/route.js | 210 - .../node_modules/express/lib/utils.js | 300 - .../node_modules/express/lib/view.js | 173 - .../express/node_modules/accepts/HISTORY.md | 164 - .../express/node_modules/accepts/LICENSE | 23 - .../express/node_modules/accepts/README.md | 135 - .../express/node_modules/accepts/index.js | 231 - .../node_modules/mime-types/HISTORY.md | 165 - .../accepts/node_modules/mime-types/LICENSE | 23 - .../accepts/node_modules/mime-types/README.md | 103 - .../accepts/node_modules/mime-types/index.js | 188 - .../node_modules/mime-db/HISTORY.md | 266 - .../mime-types/node_modules/mime-db/LICENSE | 22 - .../mime-types/node_modules/mime-db/README.md | 82 - .../mime-types/node_modules/mime-db/db.json | 6460 ---------- .../mime-types/node_modules/mime-db/index.js | 11 - .../node_modules/mime-db/package.json | 94 - .../node_modules/mime-types/package.json | 84 - .../node_modules/negotiator/HISTORY.md | 76 - .../accepts/node_modules/negotiator/LICENSE | 24 - .../accepts/node_modules/negotiator/README.md | 203 - .../accepts/node_modules/negotiator/index.js | 62 - .../node_modules/negotiator/lib/charset.js | 102 - .../node_modules/negotiator/lib/encoding.js | 118 - .../node_modules/negotiator/lib/language.js | 112 - .../node_modules/negotiator/lib/mediaType.js | 179 - .../node_modules/negotiator/package.json | 86 - .../express/node_modules/accepts/package.json | 98 - .../node_modules/array-flatten/LICENSE | 21 - .../node_modules/array-flatten/README.md | 43 - .../array-flatten/array-flatten.js | 64 - .../node_modules/array-flatten/package.json | 62 - .../content-disposition/HISTORY.md | 40 - .../node_modules/content-disposition/LICENSE | 22 - .../content-disposition/README.md | 141 - .../node_modules/content-disposition/index.js | 443 - .../content-disposition/package.json | 66 - .../node_modules/content-type/HISTORY.md | 9 - .../express/node_modules/content-type/LICENSE | 22 - .../node_modules/content-type/README.md | 92 - .../node_modules/content-type/index.js | 214 - .../node_modules/content-type/package.json | 65 - .../node_modules/cookie-signature/.npmignore | 4 - .../node_modules/cookie-signature/History.md | 38 - .../node_modules/cookie-signature/Readme.md | 42 - .../node_modules/cookie-signature/index.js | 51 - .../cookie-signature/package.json | 59 - .../express/node_modules/cookie/LICENSE | 23 - .../express/node_modules/cookie/README.md | 64 - .../express/node_modules/cookie/index.js | 116 - .../express/node_modules/cookie/package.json | 69 - .../express/node_modules/debug/.jshintrc | 3 - .../express/node_modules/debug/.npmignore | 6 - .../express/node_modules/debug/History.md | 195 - .../express/node_modules/debug/Makefile | 36 - .../express/node_modules/debug/Readme.md | 188 - .../express/node_modules/debug/bower.json | 28 - .../express/node_modules/debug/browser.js | 168 - .../express/node_modules/debug/component.json | 19 - .../express/node_modules/debug/debug.js | 197 - .../express/node_modules/debug/node.js | 209 - .../debug/node_modules/ms/.npmignore | 5 - .../debug/node_modules/ms/History.md | 66 - .../debug/node_modules/ms/LICENSE | 20 - .../debug/node_modules/ms/README.md | 35 - .../debug/node_modules/ms/index.js | 125 - .../debug/node_modules/ms/package.json | 48 - .../express/node_modules/debug/package.json | 73 - .../express/node_modules/depd/History.md | 75 - .../express/node_modules/depd/LICENSE | 22 - .../express/node_modules/depd/Readme.md | 274 - .../express/node_modules/depd/index.js | 529 - .../depd/lib/compat/buffer-concat.js | 33 - .../depd/lib/compat/callsite-tostring.js | 101 - .../node_modules/depd/lib/compat/index.js | 69 - .../express/node_modules/depd/package.json | 66 - .../express/node_modules/escape-html/LICENSE | 22 - .../node_modules/escape-html/Readme.md | 15 - .../express/node_modules/escape-html/index.js | 29 - .../node_modules/escape-html/package.json | 51 - .../express/node_modules/etag/HISTORY.md | 71 - .../express/node_modules/etag/LICENSE | 22 - .../express/node_modules/etag/README.md | 165 - .../express/node_modules/etag/index.js | 132 - .../express/node_modules/etag/package.json | 73 - .../node_modules/finalhandler/HISTORY.md | 90 - .../express/node_modules/finalhandler/LICENSE | 22 - .../node_modules/finalhandler/README.md | 133 - .../node_modules/finalhandler/index.js | 151 - .../node_modules/unpipe/HISTORY.md | 4 - .../finalhandler/node_modules/unpipe/LICENSE | 22 - .../node_modules/unpipe/README.md | 43 - .../finalhandler/node_modules/unpipe/index.js | 69 - .../node_modules/unpipe/package.json | 59 - .../node_modules/finalhandler/package.json | 81 - .../express/node_modules/fresh/HISTORY.md | 38 - .../express/node_modules/fresh/LICENSE | 22 - .../express/node_modules/fresh/README.md | 58 - .../express/node_modules/fresh/index.js | 57 - .../express/node_modules/fresh/package.json | 87 - .../node_modules/merge-descriptors/LICENSE | 22 - .../node_modules/merge-descriptors/README.md | 34 - .../node_modules/merge-descriptors/index.js | 57 - .../merge-descriptors/package.json | 125 - .../express/node_modules/methods/HISTORY.md | 24 - .../express/node_modules/methods/LICENSE | 23 - .../express/node_modules/methods/README.md | 41 - .../express/node_modules/methods/index.js | 42 - .../express/node_modules/methods/package.json | 88 - .../node_modules/on-finished/HISTORY.md | 88 - .../express/node_modules/on-finished/LICENSE | 23 - .../node_modules/on-finished/README.md | 154 - .../express/node_modules/on-finished/index.js | 196 - .../on-finished/node_modules/ee-first/LICENSE | 22 - .../node_modules/ee-first/README.md | 80 - .../node_modules/ee-first/index.js | 95 - .../node_modules/ee-first/package.json | 64 - .../node_modules/on-finished/package.json | 71 - .../express/node_modules/parseurl/.npmignore | 4 - .../express/node_modules/parseurl/HISTORY.md | 42 - .../express/node_modules/parseurl/LICENSE | 24 - .../express/node_modules/parseurl/README.md | 107 - .../express/node_modules/parseurl/index.js | 136 - .../node_modules/parseurl/package.json | 80 - .../node_modules/path-to-regexp/History.md | 36 - .../node_modules/path-to-regexp/LICENSE | 21 - .../node_modules/path-to-regexp/Readme.md | 35 - .../node_modules/path-to-regexp/index.js | 129 - .../node_modules/path-to-regexp/package.json | 185 - .../node_modules/proxy-addr/HISTORY.md | 66 - .../express/node_modules/proxy-addr/LICENSE | 22 - .../express/node_modules/proxy-addr/README.md | 137 - .../express/node_modules/proxy-addr/index.js | 345 - .../node_modules/forwarded/HISTORY.md | 4 - .../proxy-addr/node_modules/forwarded/LICENSE | 22 - .../node_modules/forwarded/README.md | 53 - .../node_modules/forwarded/index.js | 35 - .../node_modules/forwarded/package.json | 65 - .../node_modules/ipaddr.js/.npmignore | 2 - .../node_modules/ipaddr.js/Cakefile | 18 - .../proxy-addr/node_modules/ipaddr.js/LICENSE | 19 - .../node_modules/ipaddr.js/README.md | 161 - .../node_modules/ipaddr.js/ipaddr.min.js | 1 - .../node_modules/ipaddr.js/lib/ipaddr.js | 439 - .../node_modules/ipaddr.js/package.json | 60 - .../node_modules/ipaddr.js/src/ipaddr.coffee | 374 - .../ipaddr.js/test/ipaddr.test.coffee | 262 - .../node_modules/proxy-addr/package.json | 90 - .../express/node_modules/qs/.eslintignore | 1 - .../express/node_modules/qs/.npmignore | 19 - .../express/node_modules/qs/.travis.yml | 6 - .../express/node_modules/qs/CHANGELOG.md | 88 - .../express/node_modules/qs/CONTRIBUTING.md | 1 - .../express/node_modules/qs/LICENSE | 28 - .../express/node_modules/qs/README.md | 317 - .../express/node_modules/qs/bower.json | 22 - .../express/node_modules/qs/lib/index.js | 15 - .../express/node_modules/qs/lib/parse.js | 186 - .../express/node_modules/qs/lib/stringify.js | 121 - .../express/node_modules/qs/lib/utils.js | 190 - .../express/node_modules/qs/package.json | 57 - .../express/node_modules/qs/test/parse.js | 478 - .../express/node_modules/qs/test/stringify.js | 259 - .../express/node_modules/qs/test/utils.js | 28 - .../node_modules/range-parser/HISTORY.md | 35 - .../express/node_modules/range-parser/LICENSE | 22 - .../node_modules/range-parser/README.md | 48 - .../node_modules/range-parser/index.js | 49 - .../node_modules/range-parser/package.json | 76 - .../express/node_modules/send/HISTORY.md | 295 - .../express/node_modules/send/LICENSE | 23 - .../express/node_modules/send/README.md | 195 - .../express/node_modules/send/index.js | 820 -- .../node_modules/send/node_modules/.bin/mime | 1 - .../send/node_modules/destroy/README.md | 38 - .../send/node_modules/destroy/index.js | 36 - .../send/node_modules/destroy/package.json | 67 - .../send/node_modules/http-errors/HISTORY.md | 76 - .../send/node_modules/http-errors/LICENSE | 22 - .../send/node_modules/http-errors/README.md | 63 - .../send/node_modules/http-errors/index.js | 120 - .../http-errors/node_modules/inherits/LICENSE | 16 - .../node_modules/inherits/README.md | 42 - .../node_modules/inherits/inherits.js | 1 - .../node_modules/inherits/inherits_browser.js | 23 - .../node_modules/inherits/package.json | 50 - .../http-errors/node_modules/inherits/test.js | 25 - .../node_modules/http-errors/package.json | 85 - .../send/node_modules/mime/.npmignore | 0 .../send/node_modules/mime/LICENSE | 19 - .../send/node_modules/mime/README.md | 90 - .../send/node_modules/mime/build/build.js | 11 - .../send/node_modules/mime/build/test.js | 57 - .../send/node_modules/mime/cli.js | 8 - .../send/node_modules/mime/mime.js | 108 - .../send/node_modules/mime/package.json | 73 - .../send/node_modules/mime/types.json | 1 - .../send/node_modules/ms/.npmignore | 5 - .../send/node_modules/ms/History.md | 66 - .../node_modules/send/node_modules/ms/LICENSE | 20 - .../send/node_modules/ms/README.md | 35 - .../send/node_modules/ms/index.js | 125 - .../send/node_modules/ms/package.json | 48 - .../send/node_modules/statuses/LICENSE | 22 - .../send/node_modules/statuses/README.md | 114 - .../send/node_modules/statuses/codes.json | 64 - .../send/node_modules/statuses/index.js | 60 - .../send/node_modules/statuses/package.json | 84 - .../express/node_modules/send/package.json | 89 - .../node_modules/serve-static/HISTORY.md | 284 - .../express/node_modules/serve-static/LICENSE | 25 - .../node_modules/serve-static/README.md | 235 - .../node_modules/serve-static/index.js | 187 - .../node_modules/serve-static/package.json | 83 - .../express/node_modules/type-is/HISTORY.md | 174 - .../express/node_modules/type-is/LICENSE | 23 - .../express/node_modules/type-is/README.md | 132 - .../express/node_modules/type-is/index.js | 262 - .../node_modules/media-typer/HISTORY.md | 22 - .../type-is/node_modules/media-typer/LICENSE | 22 - .../node_modules/media-typer/README.md | 81 - .../type-is/node_modules/media-typer/index.js | 270 - .../node_modules/media-typer/package.json | 58 - .../node_modules/mime-types/HISTORY.md | 165 - .../type-is/node_modules/mime-types/LICENSE | 23 - .../type-is/node_modules/mime-types/README.md | 103 - .../type-is/node_modules/mime-types/index.js | 188 - .../node_modules/mime-db/HISTORY.md | 266 - .../mime-types/node_modules/mime-db/LICENSE | 22 - .../mime-types/node_modules/mime-db/README.md | 82 - .../mime-types/node_modules/mime-db/db.json | 6460 ---------- .../mime-types/node_modules/mime-db/index.js | 11 - .../node_modules/mime-db/package.json | 94 - .../node_modules/mime-types/package.json | 84 - .../express/node_modules/type-is/package.json | 93 - .../node_modules/utils-merge/.travis.yml | 6 - .../express/node_modules/utils-merge/LICENSE | 20 - .../node_modules/utils-merge/README.md | 34 - .../express/node_modules/utils-merge/index.js | 23 - .../node_modules/utils-merge/package.json | 60 - .../express/node_modules/vary/HISTORY.md | 23 - .../express/node_modules/vary/LICENSE | 22 - .../express/node_modules/vary/README.md | 91 - .../express/node_modules/vary/index.js | 117 - .../express/node_modules/vary/package.json | 72 - .../node_modules/express/package.json | 167 - .../express3-handlebars/.npmignore | 2 - .../express3-handlebars/HISTORY.md | 189 - .../node_modules/express3-handlebars/LICENSE | 27 - .../express3-handlebars/README.md | 642 - .../examples/advanced/app.js | 99 - .../examples/advanced/lib/helpers.js | 3 - .../advanced/node_modules/express/.npmignore | 11 - .../advanced/node_modules/express/History.md | 1924 --- .../advanced/node_modules/express/LICENSE | 22 - .../advanced/node_modules/express/Readme.md | 128 - .../advanced/node_modules/express/index.js | 2 - .../node_modules/express/lib/application.js | 554 - .../node_modules/express/lib/express.js | 93 - .../express/lib/middleware/init.js | 26 - .../express/lib/middleware/query.js | 30 - .../node_modules/express/lib/request.js | 454 - .../node_modules/express/lib/response.js | 831 -- .../node_modules/express/lib/router/index.js | 548 - .../node_modules/express/lib/router/layer.js | 151 - .../node_modules/express/lib/router/match.js | 61 - .../node_modules/express/lib/router/route.js | 175 - .../node_modules/express/lib/utils.js | 302 - .../advanced/node_modules/express/lib/view.js | 77 - .../express/node_modules/accepts/.npmignore | 3 - .../express/node_modules/accepts/History.md | 42 - .../express/node_modules/accepts/README.md | 101 - .../express/node_modules/accepts/index.js | 160 - .../node_modules/mime-types/.npmignore | 14 - .../node_modules/mime-types/.travis.yml | 12 - .../accepts/node_modules/mime-types/LICENSE | 22 - .../accepts/node_modules/mime-types/Makefile | 9 - .../accepts/node_modules/mime-types/README.md | 101 - .../node_modules/mime-types/SOURCES.md | 17 - .../node_modules/mime-types/component.json | 16 - .../node_modules/mime-types/lib/custom.json | 27 - .../node_modules/mime-types/lib/index.js | 74 - .../node_modules/mime-types/lib/mime.json | 3317 ----- .../node_modules/mime-types/lib/node.json | 55 - .../node_modules/mime-types/package.json | 68 - .../node_modules/negotiator/.npmignore | 3 - .../accepts/node_modules/negotiator/LICENSE | 27 - .../node_modules/negotiator/lib/charset.js | 90 - .../node_modules/negotiator/lib/encoding.js | 120 - .../node_modules/negotiator/lib/language.js | 103 - .../node_modules/negotiator/lib/mediaType.js | 125 - .../node_modules/negotiator/lib/negotiator.js | 37 - .../node_modules/negotiator/package.json | 67 - .../accepts/node_modules/negotiator/readme.md | 132 - .../express/node_modules/accepts/package.json | 81 - .../node_modules/buffer-crc32/.npmignore | 1 - .../node_modules/buffer-crc32/.travis.yml | 8 - .../express/node_modules/buffer-crc32/LICENSE | 17 - .../node_modules/buffer-crc32/README.md | 47 - .../node_modules/buffer-crc32/index.js | 91 - .../node_modules/buffer-crc32/package.json | 57 - .../buffer-crc32/tests/crc.test.js | 89 - .../node_modules/cookie-signature/.npmignore | 4 - .../node_modules/cookie-signature/History.md | 27 - .../node_modules/cookie-signature/Makefile | 7 - .../node_modules/cookie-signature/Readme.md | 42 - .../node_modules/cookie-signature/index.js | 51 - .../cookie-signature/package.json | 53 - .../express/node_modules/cookie/.npmignore | 2 - .../express/node_modules/cookie/LICENSE | 9 - .../express/node_modules/cookie/README.md | 44 - .../express/node_modules/cookie/index.js | 75 - .../express/node_modules/cookie/package.json | 54 - .../express/node_modules/debug/.jshintrc | 3 - .../express/node_modules/debug/.npmignore | 6 - .../express/node_modules/debug/History.md | 144 - .../express/node_modules/debug/Makefile | 33 - .../express/node_modules/debug/Readme.md | 156 - .../express/node_modules/debug/browser.js | 147 - .../express/node_modules/debug/component.json | 19 - .../express/node_modules/debug/debug.js | 197 - .../express/node_modules/debug/node.js | 129 - .../debug/node_modules/ms/.npmignore | 5 - .../debug/node_modules/ms/README.md | 33 - .../debug/node_modules/ms/index.js | 111 - .../debug/node_modules/ms/package.json | 46 - .../express/node_modules/debug/package.json | 71 - .../express/node_modules/depd/.npmignore | 4 - .../express/node_modules/depd/History.md | 56 - .../express/node_modules/depd/LICENSE | 22 - .../express/node_modules/depd/Readme.md | 272 - .../express/node_modules/depd/index.js | 520 - .../express/node_modules/depd/package.json | 56 - .../node_modules/escape-html/.npmignore | 2 - .../express/node_modules/escape-html/Makefile | 11 - .../node_modules/escape-html/Readme.md | 15 - .../node_modules/escape-html/component.json | 10 - .../express/node_modules/escape-html/index.js | 16 - .../node_modules/escape-html/package.json | 47 - .../node_modules/finalhandler/.npmignore | 3 - .../node_modules/finalhandler/HISTORY.md | 27 - .../node_modules/finalhandler/README.md | 140 - .../node_modules/finalhandler/index.js | 158 - .../node_modules/finalhandler/package.json | 74 - .../express/node_modules/fresh/.npmignore | 1 - .../express/node_modules/fresh/History.md | 10 - .../express/node_modules/fresh/Makefile | 7 - .../express/node_modules/fresh/Readme.md | 57 - .../express/node_modules/fresh/index.js | 53 - .../express/node_modules/fresh/package.json | 51 - .../node_modules/media-typer/.npmignore | 3 - .../node_modules/media-typer/HISTORY.md | 16 - .../node_modules/media-typer/README.md | 88 - .../express/node_modules/media-typer/index.js | 261 - .../node_modules/media-typer/package.json | 52 - .../node_modules/merge-descriptors/.npmignore | 59 - .../node_modules/merge-descriptors/README.md | 49 - .../merge-descriptors/component.json | 10 - .../node_modules/merge-descriptors/index.js | 8 - .../merge-descriptors/package.json | 43 - .../express/node_modules/methods/.npmignore | 1 - .../express/node_modules/methods/History.md | 20 - .../express/node_modules/methods/LICENSE | 23 - .../express/node_modules/methods/Readme.md | 4 - .../express/node_modules/methods/index.js | 41 - .../express/node_modules/methods/package.json | 58 - .../node_modules/methods/test/methods.js | 33 - .../express/node_modules/parseurl/.npmignore | 4 - .../express/node_modules/parseurl/HISTORY.md | 36 - .../express/node_modules/parseurl/LICENSE | 23 - .../express/node_modules/parseurl/README.md | 99 - .../express/node_modules/parseurl/index.js | 87 - .../node_modules/parseurl/package.json | 79 - .../node_modules/path-to-regexp/.npmignore | 2 - .../node_modules/path-to-regexp/History.md | 16 - .../node_modules/path-to-regexp/Readme.md | 33 - .../path-to-regexp/component.json | 15 - .../node_modules/path-to-regexp/index.js | 70 - .../node_modules/path-to-regexp/package.json | 162 - .../node_modules/path-to-regexp/test.js | 616 - .../node_modules/proxy-addr/.npmignore | 4 - .../node_modules/proxy-addr/History.md | 27 - .../express/node_modules/proxy-addr/LICENSE | 22 - .../express/node_modules/proxy-addr/README.md | 124 - .../express/node_modules/proxy-addr/index.js | 353 - .../node_modules/ipaddr.js/.npmignore | 2 - .../node_modules/ipaddr.js/Cakefile | 18 - .../proxy-addr/node_modules/ipaddr.js/LICENSE | 19 - .../node_modules/ipaddr.js/README.md | 149 - .../node_modules/ipaddr.js/ipaddr.min.js | 1 - .../node_modules/ipaddr.js/lib/ipaddr.js | 401 - .../node_modules/ipaddr.js/package.json | 58 - .../node_modules/ipaddr.js/src/ipaddr.coffee | 344 - .../ipaddr.js/test/ipaddr.test.coffee | 209 - .../node_modules/proxy-addr/package.json | 83 - .../express/node_modules/qs/.gitmodules | 6 - .../express/node_modules/qs/.npmignore | 7 - .../express/node_modules/qs/Readme.md | 58 - .../express/node_modules/qs/index.js | 366 - .../express/node_modules/qs/package.json | 55 - .../node_modules/range-parser/.npmignore | 1 - .../node_modules/range-parser/History.md | 21 - .../node_modules/range-parser/Makefile | 7 - .../node_modules/range-parser/Readme.md | 53 - .../node_modules/range-parser/index.js | 49 - .../node_modules/range-parser/package.json | 51 - .../express/node_modules/send/.npmignore | 5 - .../express/node_modules/send/History.md | 137 - .../express/node_modules/send/Readme.md | 159 - .../express/node_modules/send/index.js | 2 - .../express/node_modules/send/lib/send.js | 711 -- .../express/node_modules/send/lib/utils.js | 42 - .../send/node_modules/finished/.npmignore | 3 - .../send/node_modules/finished/HISTORY.md | 50 - .../send/node_modules/finished/README.md | 88 - .../send/node_modules/finished/index.js | 62 - .../finished/node_modules/ee-first/.npmignore | 2 - .../finished/node_modules/ee-first/LICENSE | 22 - .../finished/node_modules/ee-first/README.md | 5 - .../finished/node_modules/ee-first/index.js | 60 - .../node_modules/ee-first/package.json | 50 - .../finished/node_modules/ee-first/test.js | 60 - .../send/node_modules/finished/package.json | 76 - .../send/node_modules/mime/LICENSE | 19 - .../send/node_modules/mime/README.md | 66 - .../send/node_modules/mime/mime.js | 114 - .../send/node_modules/mime/package.json | 58 - .../send/node_modules/mime/test.js | 84 - .../send/node_modules/mime/types/mime.types | 1588 --- .../send/node_modules/mime/types/node.types | 77 - .../send/node_modules/ms/.npmignore | 5 - .../send/node_modules/ms/README.md | 33 - .../send/node_modules/ms/index.js | 111 - .../send/node_modules/ms/package.json | 46 - .../express/node_modules/send/package.json | 78 - .../node_modules/serve-static/.npmignore | 3 - .../node_modules/serve-static/History.md | 117 - .../express/node_modules/serve-static/LICENSE | 25 - .../node_modules/serve-static/Readme.md | 144 - .../node_modules/serve-static/index.js | 122 - .../serve-static/node_modules/send/.npmignore | 5 - .../serve-static/node_modules/send/History.md | 142 - .../serve-static/node_modules/send/Readme.md | 159 - .../serve-static/node_modules/send/index.js | 2 - .../node_modules/send/lib/send.js | 712 -- .../node_modules/send/lib/utils.js | 42 - .../send/node_modules/finished/.npmignore | 3 - .../send/node_modules/finished/HISTORY.md | 50 - .../send/node_modules/finished/README.md | 88 - .../send/node_modules/finished/index.js | 62 - .../finished/node_modules/ee-first/.npmignore | 2 - .../finished/node_modules/ee-first/LICENSE | 22 - .../finished/node_modules/ee-first/README.md | 5 - .../finished/node_modules/ee-first/index.js | 60 - .../node_modules/ee-first/package.json | 50 - .../finished/node_modules/ee-first/test.js | 60 - .../send/node_modules/finished/package.json | 76 - .../send/node_modules/mime/LICENSE | 19 - .../send/node_modules/mime/README.md | 66 - .../send/node_modules/mime/mime.js | 114 - .../send/node_modules/mime/package.json | 58 - .../send/node_modules/mime/test.js | 84 - .../send/node_modules/mime/types/mime.types | 1588 --- .../send/node_modules/mime/types/node.types | 77 - .../send/node_modules/ms/.npmignore | 5 - .../send/node_modules/ms/README.md | 33 - .../send/node_modules/ms/index.js | 111 - .../send/node_modules/ms/package.json | 46 - .../node_modules/send/package.json | 78 - .../node_modules/serve-static/package.json | 78 - .../express/node_modules/type-is/.npmignore | 3 - .../express/node_modules/type-is/HISTORY.md | 54 - .../express/node_modules/type-is/README.md | 101 - .../express/node_modules/type-is/index.js | 230 - .../node_modules/mime-types/.npmignore | 14 - .../node_modules/mime-types/.travis.yml | 12 - .../type-is/node_modules/mime-types/LICENSE | 22 - .../type-is/node_modules/mime-types/Makefile | 9 - .../type-is/node_modules/mime-types/README.md | 101 - .../node_modules/mime-types/SOURCES.md | 17 - .../node_modules/mime-types/component.json | 16 - .../node_modules/mime-types/lib/custom.json | 27 - .../node_modules/mime-types/lib/index.js | 74 - .../node_modules/mime-types/lib/mime.json | 3317 ----- .../node_modules/mime-types/lib/node.json | 55 - .../node_modules/mime-types/package.json | 68 - .../express/node_modules/type-is/package.json | 84 - .../node_modules/utils-merge/.travis.yml | 6 - .../express/node_modules/utils-merge/LICENSE | 20 - .../node_modules/utils-merge/README.md | 34 - .../express/node_modules/utils-merge/index.js | 23 - .../node_modules/utils-merge/package.json | 61 - .../express/node_modules/vary/.npmignore | 3 - .../express/node_modules/vary/History.md | 9 - .../express/node_modules/vary/LICENSE | 22 - .../express/node_modules/vary/README.md | 43 - .../express/node_modules/vary/index.js | 79 - .../express/node_modules/vary/package.json | 73 - .../node_modules/express/package.json | 148 - .../advanced/node_modules/express/test.js | 8 - .../examples/advanced/public/echo.js | 14 - .../advanced/shared/templates/echo.handlebars | 1 - .../examples/advanced/views/echo.handlebars | 8 - .../examples/advanced/views/home.handlebars | 3 - .../advanced/views/layouts/main.handlebars | 12 - .../views/layouts/shared-templates.handlebars | 25 - .../views/partials/page/nav.handlebars | 6 - .../views/partials/page/title.handlebars | 1 - .../examples/advanced/views/yell.handlebars | 5 - .../express3-handlebars/examples/basic/app.js | 15 - .../basic/node_modules/express/.npmignore | 11 - .../basic/node_modules/express/History.md | 1924 --- .../basic/node_modules/express/LICENSE | 22 - .../basic/node_modules/express/Readme.md | 128 - .../basic/node_modules/express/index.js | 2 - .../node_modules/express/lib/application.js | 554 - .../basic/node_modules/express/lib/express.js | 93 - .../express/lib/middleware/init.js | 26 - .../express/lib/middleware/query.js | 30 - .../basic/node_modules/express/lib/request.js | 454 - .../node_modules/express/lib/response.js | 831 -- .../node_modules/express/lib/router/index.js | 548 - .../node_modules/express/lib/router/layer.js | 151 - .../node_modules/express/lib/router/match.js | 61 - .../node_modules/express/lib/router/route.js | 175 - .../basic/node_modules/express/lib/utils.js | 302 - .../basic/node_modules/express/lib/view.js | 77 - .../express/node_modules/accepts/.npmignore | 3 - .../express/node_modules/accepts/History.md | 42 - .../express/node_modules/accepts/README.md | 101 - .../express/node_modules/accepts/index.js | 160 - .../node_modules/mime-types/.npmignore | 14 - .../node_modules/mime-types/.travis.yml | 12 - .../accepts/node_modules/mime-types/LICENSE | 22 - .../accepts/node_modules/mime-types/Makefile | 9 - .../accepts/node_modules/mime-types/README.md | 101 - .../node_modules/mime-types/SOURCES.md | 17 - .../node_modules/mime-types/component.json | 16 - .../node_modules/mime-types/lib/custom.json | 27 - .../node_modules/mime-types/lib/index.js | 74 - .../node_modules/mime-types/lib/mime.json | 3317 ----- .../node_modules/mime-types/lib/node.json | 55 - .../node_modules/mime-types/package.json | 68 - .../node_modules/negotiator/.npmignore | 3 - .../accepts/node_modules/negotiator/LICENSE | 27 - .../node_modules/negotiator/lib/charset.js | 90 - .../node_modules/negotiator/lib/encoding.js | 120 - .../node_modules/negotiator/lib/language.js | 103 - .../node_modules/negotiator/lib/mediaType.js | 125 - .../node_modules/negotiator/lib/negotiator.js | 37 - .../node_modules/negotiator/package.json | 67 - .../accepts/node_modules/negotiator/readme.md | 132 - .../express/node_modules/accepts/package.json | 81 - .../node_modules/buffer-crc32/.npmignore | 1 - .../node_modules/buffer-crc32/.travis.yml | 8 - .../express/node_modules/buffer-crc32/LICENSE | 17 - .../node_modules/buffer-crc32/README.md | 47 - .../node_modules/buffer-crc32/index.js | 91 - .../node_modules/buffer-crc32/package.json | 57 - .../buffer-crc32/tests/crc.test.js | 89 - .../node_modules/cookie-signature/.npmignore | 4 - .../node_modules/cookie-signature/History.md | 27 - .../node_modules/cookie-signature/Makefile | 7 - .../node_modules/cookie-signature/Readme.md | 42 - .../node_modules/cookie-signature/index.js | 51 - .../cookie-signature/package.json | 53 - .../express/node_modules/cookie/.npmignore | 2 - .../express/node_modules/cookie/LICENSE | 9 - .../express/node_modules/cookie/README.md | 44 - .../express/node_modules/cookie/index.js | 75 - .../express/node_modules/cookie/package.json | 54 - .../express/node_modules/debug/.jshintrc | 3 - .../express/node_modules/debug/.npmignore | 6 - .../express/node_modules/debug/History.md | 144 - .../express/node_modules/debug/Makefile | 33 - .../express/node_modules/debug/Readme.md | 156 - .../express/node_modules/debug/browser.js | 147 - .../express/node_modules/debug/component.json | 19 - .../express/node_modules/debug/debug.js | 197 - .../express/node_modules/debug/node.js | 129 - .../debug/node_modules/ms/.npmignore | 5 - .../debug/node_modules/ms/README.md | 33 - .../debug/node_modules/ms/index.js | 111 - .../debug/node_modules/ms/package.json | 46 - .../express/node_modules/debug/package.json | 71 - .../express/node_modules/depd/.npmignore | 4 - .../express/node_modules/depd/History.md | 56 - .../express/node_modules/depd/LICENSE | 22 - .../express/node_modules/depd/Readme.md | 272 - .../express/node_modules/depd/index.js | 520 - .../express/node_modules/depd/package.json | 56 - .../node_modules/escape-html/.npmignore | 2 - .../express/node_modules/escape-html/Makefile | 11 - .../node_modules/escape-html/Readme.md | 15 - .../node_modules/escape-html/component.json | 10 - .../express/node_modules/escape-html/index.js | 16 - .../node_modules/escape-html/package.json | 47 - .../node_modules/finalhandler/.npmignore | 3 - .../node_modules/finalhandler/HISTORY.md | 27 - .../node_modules/finalhandler/README.md | 140 - .../node_modules/finalhandler/index.js | 158 - .../node_modules/finalhandler/package.json | 74 - .../express/node_modules/fresh/.npmignore | 1 - .../express/node_modules/fresh/History.md | 10 - .../express/node_modules/fresh/Makefile | 7 - .../express/node_modules/fresh/Readme.md | 57 - .../express/node_modules/fresh/index.js | 53 - .../express/node_modules/fresh/package.json | 51 - .../node_modules/media-typer/.npmignore | 3 - .../node_modules/media-typer/HISTORY.md | 16 - .../node_modules/media-typer/README.md | 88 - .../express/node_modules/media-typer/index.js | 261 - .../node_modules/media-typer/package.json | 52 - .../node_modules/merge-descriptors/.npmignore | 59 - .../node_modules/merge-descriptors/README.md | 49 - .../merge-descriptors/component.json | 10 - .../node_modules/merge-descriptors/index.js | 8 - .../merge-descriptors/package.json | 43 - .../express/node_modules/methods/.npmignore | 1 - .../express/node_modules/methods/History.md | 20 - .../express/node_modules/methods/LICENSE | 23 - .../express/node_modules/methods/Readme.md | 4 - .../express/node_modules/methods/index.js | 41 - .../express/node_modules/methods/package.json | 58 - .../node_modules/methods/test/methods.js | 33 - .../express/node_modules/parseurl/.npmignore | 4 - .../express/node_modules/parseurl/HISTORY.md | 36 - .../express/node_modules/parseurl/LICENSE | 23 - .../express/node_modules/parseurl/README.md | 99 - .../express/node_modules/parseurl/index.js | 87 - .../node_modules/parseurl/package.json | 79 - .../node_modules/path-to-regexp/.npmignore | 2 - .../node_modules/path-to-regexp/History.md | 16 - .../node_modules/path-to-regexp/Readme.md | 33 - .../path-to-regexp/component.json | 15 - .../node_modules/path-to-regexp/index.js | 70 - .../node_modules/path-to-regexp/package.json | 162 - .../node_modules/path-to-regexp/test.js | 616 - .../node_modules/proxy-addr/.npmignore | 4 - .../node_modules/proxy-addr/History.md | 27 - .../express/node_modules/proxy-addr/LICENSE | 22 - .../express/node_modules/proxy-addr/README.md | 124 - .../express/node_modules/proxy-addr/index.js | 353 - .../node_modules/ipaddr.js/.npmignore | 2 - .../node_modules/ipaddr.js/Cakefile | 18 - .../proxy-addr/node_modules/ipaddr.js/LICENSE | 19 - .../node_modules/ipaddr.js/README.md | 149 - .../node_modules/ipaddr.js/ipaddr.min.js | 1 - .../node_modules/ipaddr.js/lib/ipaddr.js | 401 - .../node_modules/ipaddr.js/package.json | 58 - .../node_modules/ipaddr.js/src/ipaddr.coffee | 344 - .../ipaddr.js/test/ipaddr.test.coffee | 209 - .../node_modules/proxy-addr/package.json | 83 - .../express/node_modules/qs/.gitmodules | 6 - .../express/node_modules/qs/.npmignore | 7 - .../express/node_modules/qs/Readme.md | 58 - .../express/node_modules/qs/index.js | 366 - .../express/node_modules/qs/package.json | 55 - .../node_modules/range-parser/.npmignore | 1 - .../node_modules/range-parser/History.md | 21 - .../node_modules/range-parser/Makefile | 7 - .../node_modules/range-parser/Readme.md | 53 - .../node_modules/range-parser/index.js | 49 - .../node_modules/range-parser/package.json | 51 - .../express/node_modules/send/.npmignore | 5 - .../express/node_modules/send/History.md | 137 - .../express/node_modules/send/Readme.md | 159 - .../express/node_modules/send/index.js | 2 - .../express/node_modules/send/lib/send.js | 711 -- .../express/node_modules/send/lib/utils.js | 42 - .../send/node_modules/finished/.npmignore | 3 - .../send/node_modules/finished/HISTORY.md | 50 - .../send/node_modules/finished/README.md | 88 - .../send/node_modules/finished/index.js | 62 - .../finished/node_modules/ee-first/.npmignore | 2 - .../finished/node_modules/ee-first/LICENSE | 22 - .../finished/node_modules/ee-first/README.md | 5 - .../finished/node_modules/ee-first/index.js | 60 - .../node_modules/ee-first/package.json | 50 - .../finished/node_modules/ee-first/test.js | 60 - .../send/node_modules/finished/package.json | 76 - .../send/node_modules/mime/LICENSE | 19 - .../send/node_modules/mime/README.md | 66 - .../send/node_modules/mime/mime.js | 114 - .../send/node_modules/mime/package.json | 58 - .../send/node_modules/mime/test.js | 84 - .../send/node_modules/mime/types/mime.types | 1588 --- .../send/node_modules/mime/types/node.types | 77 - .../send/node_modules/ms/.npmignore | 5 - .../send/node_modules/ms/README.md | 33 - .../send/node_modules/ms/index.js | 111 - .../send/node_modules/ms/package.json | 47 - .../express/node_modules/send/package.json | 78 - .../node_modules/serve-static/.npmignore | 3 - .../node_modules/serve-static/History.md | 117 - .../express/node_modules/serve-static/LICENSE | 25 - .../node_modules/serve-static/Readme.md | 144 - .../node_modules/serve-static/index.js | 122 - .../serve-static/node_modules/send/.npmignore | 5 - .../serve-static/node_modules/send/History.md | 142 - .../serve-static/node_modules/send/Readme.md | 159 - .../serve-static/node_modules/send/index.js | 2 - .../node_modules/send/lib/send.js | 712 -- .../node_modules/send/lib/utils.js | 42 - .../send/node_modules/finished/.npmignore | 3 - .../send/node_modules/finished/HISTORY.md | 50 - .../send/node_modules/finished/README.md | 88 - .../send/node_modules/finished/index.js | 62 - .../finished/node_modules/ee-first/.npmignore | 2 - .../finished/node_modules/ee-first/LICENSE | 22 - .../finished/node_modules/ee-first/README.md | 5 - .../finished/node_modules/ee-first/index.js | 60 - .../node_modules/ee-first/package.json | 50 - .../finished/node_modules/ee-first/test.js | 60 - .../send/node_modules/finished/package.json | 76 - .../send/node_modules/mime/LICENSE | 19 - .../send/node_modules/mime/README.md | 66 - .../send/node_modules/mime/mime.js | 114 - .../send/node_modules/mime/package.json | 58 - .../send/node_modules/mime/test.js | 84 - .../send/node_modules/mime/types/mime.types | 1588 --- .../send/node_modules/mime/types/node.types | 77 - .../send/node_modules/ms/.npmignore | 5 - .../send/node_modules/ms/README.md | 33 - .../send/node_modules/ms/index.js | 111 - .../send/node_modules/ms/package.json | 47 - .../node_modules/send/package.json | 78 - .../node_modules/serve-static/package.json | 78 - .../express/node_modules/type-is/.npmignore | 3 - .../express/node_modules/type-is/HISTORY.md | 54 - .../express/node_modules/type-is/README.md | 101 - .../express/node_modules/type-is/index.js | 230 - .../node_modules/mime-types/.npmignore | 14 - .../node_modules/mime-types/.travis.yml | 12 - .../type-is/node_modules/mime-types/LICENSE | 22 - .../type-is/node_modules/mime-types/Makefile | 9 - .../type-is/node_modules/mime-types/README.md | 101 - .../node_modules/mime-types/SOURCES.md | 17 - .../node_modules/mime-types/component.json | 16 - .../node_modules/mime-types/lib/custom.json | 27 - .../node_modules/mime-types/lib/index.js | 74 - .../node_modules/mime-types/lib/mime.json | 3317 ----- .../node_modules/mime-types/lib/node.json | 55 - .../node_modules/mime-types/package.json | 68 - .../express/node_modules/type-is/package.json | 84 - .../node_modules/utils-merge/.travis.yml | 6 - .../express/node_modules/utils-merge/LICENSE | 20 - .../node_modules/utils-merge/README.md | 34 - .../express/node_modules/utils-merge/index.js | 23 - .../node_modules/utils-merge/package.json | 61 - .../express/node_modules/vary/.npmignore | 3 - .../express/node_modules/vary/History.md | 9 - .../express/node_modules/vary/LICENSE | 22 - .../express/node_modules/vary/README.md | 43 - .../express/node_modules/vary/index.js | 79 - .../express/node_modules/vary/package.json | 73 - .../basic/node_modules/express/package.json | 148 - .../basic/node_modules/express/test.js | 8 - .../examples/basic/views/home.handlebars | 1 - .../basic/views/layouts/main.handlebars | 12 - .../node_modules/express3-handlebars/index.js | 13 - .../lib/express-handlebars.js | 369 - .../node_modules/.bin/handlebars | 1 - .../node_modules/.bin/semver | 1 - .../node_modules/async/LICENSE | 19 - .../node_modules/async/README.md | 1425 --- .../node_modules/async/component.json | 11 - .../node_modules/async/lib/async.js | 958 -- .../node_modules/async/package.json | 60 - .../node_modules/glob/.npmignore | 2 - .../node_modules/glob/.travis.yml | 3 - .../node_modules/glob/LICENSE | 27 - .../node_modules/glob/README.md | 250 - .../node_modules/glob/examples/g.js | 9 - .../node_modules/glob/examples/usr-local.js | 9 - .../node_modules/glob/glob.js | 728 -- .../glob/node_modules/inherits/LICENSE | 16 - .../glob/node_modules/inherits/README.md | 42 - .../glob/node_modules/inherits/inherits.js | 1 - .../node_modules/inherits/inherits_browser.js | 23 - .../glob/node_modules/inherits/package.json | 50 - .../glob/node_modules/inherits/test.js | 25 - .../glob/node_modules/minimatch/.npmignore | 1 - .../glob/node_modules/minimatch/LICENSE | 23 - .../glob/node_modules/minimatch/README.md | 218 - .../glob/node_modules/minimatch/minimatch.js | 1061 -- .../node_modules/lru-cache/.npmignore | 1 - .../node_modules/lru-cache/.travis.yml | 8 - .../node_modules/lru-cache/CONTRIBUTORS | 14 - .../minimatch/node_modules/lru-cache/LICENSE | 15 - .../node_modules/lru-cache/README.md | 109 - .../node_modules/lru-cache/lib/lru-cache.js | 274 - .../node_modules/lru-cache/package.json | 58 - .../node_modules/lru-cache/test/basic.js | 395 - .../node_modules/lru-cache/test/foreach.js | 120 - .../lru-cache/test/memory-leak.js | 51 - .../minimatch/node_modules/sigmund/LICENSE | 15 - .../minimatch/node_modules/sigmund/README.md | 53 - .../minimatch/node_modules/sigmund/bench.js | 283 - .../node_modules/sigmund/package.json | 60 - .../minimatch/node_modules/sigmund/sigmund.js | 39 - .../node_modules/sigmund/test/basic.js | 24 - .../glob/node_modules/minimatch/package.json | 57 - .../glob/node_modules/minimatch/test/basic.js | 399 - .../minimatch/test/brace-expand.js | 33 - .../node_modules/minimatch/test/caching.js | 14 - .../node_modules/minimatch/test/defaults.js | 274 - .../test/extglob-ending-with-state-char.js | 8 - .../node_modules/glob/package.json | 58 - .../node_modules/glob/test/00-setup.js | 176 - .../node_modules/glob/test/bash-comparison.js | 63 - .../node_modules/glob/test/bash-results.json | 351 - .../node_modules/glob/test/cwd-test.js | 55 - .../node_modules/glob/test/globstar-match.js | 19 - .../node_modules/glob/test/mark.js | 118 - .../glob/test/new-glob-optional-options.js | 10 - .../node_modules/glob/test/nocase-nomagic.js | 113 - .../node_modules/glob/test/pause-resume.js | 73 - .../node_modules/glob/test/readme-issue.js | 36 - .../node_modules/glob/test/root-nomount.js | 39 - .../node_modules/glob/test/root.js | 46 - .../node_modules/glob/test/stat.js | 32 - .../node_modules/glob/test/zz-cleanup.js | 11 - .../node_modules/handlebars/.npmignore | 23 - .../node_modules/handlebars/LICENSE | 19 - .../node_modules/handlebars/README.markdown | 458 - .../node_modules/handlebars/bin/handlebars | 222 - .../handlebars/dist/amd/handlebars.js | 41 - .../handlebars/dist/amd/handlebars.runtime.js | 36 - .../handlebars/dist/amd/handlebars/base.js | 184 - .../dist/amd/handlebars/compiler/ast.js | 231 - .../dist/amd/handlebars/compiler/base.js | 19 - .../dist/amd/handlebars/compiler/compiler.js | 473 - .../compiler/javascript-compiler.js | 946 -- .../dist/amd/handlebars/compiler/parser.js | 494 - .../dist/amd/handlebars/compiler/printer.js | 142 - .../dist/amd/handlebars/compiler/visitor.js | 16 - .../dist/amd/handlebars/exception.js | 32 - .../handlebars/dist/amd/handlebars/runtime.js | 141 - .../dist/amd/handlebars/safe-string.js | 15 - .../handlebars/dist/amd/handlebars/utils.js | 80 - .../handlebars/dist/cjs/handlebars.js | 37 - .../handlebars/dist/cjs/handlebars.runtime.js | 32 - .../handlebars/dist/cjs/handlebars/base.js | 180 - .../dist/cjs/handlebars/compiler/ast.js | 227 - .../dist/cjs/handlebars/compiler/base.js | 15 - .../dist/cjs/handlebars/compiler/compiler.js | 469 - .../compiler/javascript-compiler.js | 942 -- .../dist/cjs/handlebars/compiler/parser.js | 490 - .../dist/cjs/handlebars/compiler/printer.js | 138 - .../dist/cjs/handlebars/compiler/visitor.js | 12 - .../dist/cjs/handlebars/exception.js | 28 - .../handlebars/dist/cjs/handlebars/runtime.js | 137 - .../dist/cjs/handlebars/safe-string.js | 11 - .../handlebars/dist/cjs/handlebars/utils.js | 76 - .../handlebars/dist/handlebars.amd.js | 2719 ---- .../handlebars/dist/handlebars.amd.min.js | 28 - .../handlebars/dist/handlebars.js | 2746 ---- .../handlebars/dist/handlebars.min.js | 28 - .../handlebars/dist/handlebars.runtime.amd.js | 515 - .../dist/handlebars.runtime.amd.min.js | 27 - .../handlebars/dist/handlebars.runtime.js | 530 - .../handlebars/dist/handlebars.runtime.min.js | 27 - .../node_modules/handlebars/lib/handlebars.js | 33 - .../handlebars/lib/handlebars.runtime.js | 31 - .../handlebars/lib/handlebars/base.js | 178 - .../handlebars/lib/handlebars/compiler/ast.js | 226 - .../lib/handlebars/compiler/base.js | 12 - .../lib/handlebars/compiler/compiler.js | 466 - .../compiler/javascript-compiler.js | 939 -- .../lib/handlebars/compiler/parser.js | 489 - .../lib/handlebars/compiler/printer.js | 138 - .../lib/handlebars/compiler/visitor.js | 11 - .../handlebars/lib/handlebars/exception.js | 27 - .../handlebars/lib/handlebars/runtime.js | 133 - .../handlebars/lib/handlebars/safe-string.js | 10 - .../handlebars/lib/handlebars/utils.js | 73 - .../node_modules/handlebars/lib/index.js | 25 - .../handlebars/node_modules/.bin/uglifyjs | 1 - .../node_modules/optimist/.travis.yml | 4 - .../handlebars/node_modules/optimist/LICENSE | 21 - .../node_modules/optimist/example/bool.js | 10 - .../optimist/example/boolean_double.js | 7 - .../optimist/example/boolean_single.js | 7 - .../optimist/example/default_hash.js | 8 - .../optimist/example/default_singles.js | 7 - .../node_modules/optimist/example/divide.js | 8 - .../optimist/example/line_count.js | 20 - .../optimist/example/line_count_options.js | 29 - .../optimist/example/line_count_wrap.js | 29 - .../node_modules/optimist/example/nonopt.js | 4 - .../node_modules/optimist/example/reflect.js | 2 - .../node_modules/optimist/example/short.js | 3 - .../node_modules/optimist/example/string.js | 11 - .../optimist/example/usage-options.js | 19 - .../node_modules/optimist/example/xup.js | 10 - .../handlebars/node_modules/optimist/index.js | 478 - .../optimist/node_modules/wordwrap/LICENSE | 18 - .../node_modules/wordwrap/README.markdown | 70 - .../node_modules/wordwrap/example/center.js | 10 - .../node_modules/wordwrap/example/meat.js | 3 - .../optimist/node_modules/wordwrap/index.js | 76 - .../node_modules/wordwrap/package.json | 63 - .../node_modules/wordwrap/test/break.js | 30 - .../node_modules/wordwrap/test/idleness.txt | 63 - .../node_modules/wordwrap/test/wrap.js | 31 - .../node_modules/optimist/package.json | 63 - .../node_modules/optimist/readme.markdown | 487 - .../node_modules/optimist/test/_.js | 71 - .../node_modules/optimist/test/_/argv.js | 2 - .../node_modules/optimist/test/_/bin.js | 3 - .../node_modules/optimist/test/parse.js | 446 - .../node_modules/optimist/test/usage.js | 292 - .../node_modules/uglify-js/.npmignore | 2 - .../node_modules/uglify-js/.travis.yml | 7 - .../handlebars/node_modules/uglify-js/LICENSE | 29 - .../node_modules/uglify-js/README.md | 588 - .../node_modules/uglify-js/bin/uglifyjs | 402 - .../node_modules/uglify-js/lib/ast.js | 985 -- .../node_modules/uglify-js/lib/compress.js | 2028 --- .../node_modules/uglify-js/lib/mozilla-ast.js | 267 - .../node_modules/uglify-js/lib/output.js | 1229 -- .../node_modules/uglify-js/lib/parse.js | 1410 --- .../node_modules/uglify-js/lib/scope.js | 581 - .../node_modules/uglify-js/lib/sourcemap.js | 81 - .../node_modules/uglify-js/lib/transform.js | 217 - .../node_modules/uglify-js/lib/utils.js | 295 - .../node_modules/source-map/.npmignore | 2 - .../node_modules/source-map/.travis.yml | 4 - .../node_modules/source-map/CHANGELOG.md | 194 - .../uglify-js/node_modules/source-map/LICENSE | 28 - .../source-map/Makefile.dryice.js | 166 - .../node_modules/source-map/README.md | 475 - .../source-map/build/assert-shim.js | 56 - .../source-map/build/mini-require.js | 152 - .../source-map/build/prefix-source-map.jsm | 20 - .../source-map/build/prefix-utils.jsm | 18 - .../source-map/build/suffix-browser.js | 8 - .../source-map/build/suffix-source-map.jsm | 6 - .../source-map/build/suffix-utils.jsm | 21 - .../source-map/build/test-prefix.js | 8 - .../source-map/build/test-suffix.js | 3 - .../node_modules/source-map/lib/source-map.js | 8 - .../source-map/lib/source-map/array-set.js | 97 - .../source-map/lib/source-map/base64-vlq.js | 142 - .../source-map/lib/source-map/base64.js | 42 - .../lib/source-map/binary-search.js | 80 - .../source-map/lib/source-map/mapping-list.js | 86 - .../lib/source-map/source-map-consumer.js | 575 - .../lib/source-map/source-map-generator.js | 400 - .../source-map/lib/source-map/source-node.js | 414 - .../source-map/lib/source-map/util.js | 319 - .../source-map/node_modules/amdefine/LICENSE | 58 - .../node_modules/amdefine/README.md | 171 - .../node_modules/amdefine/amdefine.js | 301 - .../node_modules/amdefine/intercept.js | 36 - .../node_modules/amdefine/package.json | 46 - .../node_modules/source-map/package.json | 186 - .../node_modules/source-map/test/run-tests.js | 62 - .../source-map/test/source-map/test-api.js | 26 - .../test/source-map/test-array-set.js | 104 - .../test/source-map/test-base64-vlq.js | 23 - .../source-map/test/source-map/test-base64.js | 35 - .../test/source-map/test-binary-search.js | 54 - .../test/source-map/test-dog-fooding.js | 84 - .../source-map/test-source-map-consumer.js | 702 -- .../source-map/test-source-map-generator.js | 679 - .../test/source-map/test-source-node.js | 612 - .../source-map/test/source-map/test-util.js | 216 - .../source-map/test/source-map/util.js | 192 - .../node_modules/uglify-js/package.json | 57 - .../uglify-js/test/compress/arrays.js | 12 - .../uglify-js/test/compress/blocks.js | 49 - .../uglify-js/test/compress/conditionals.js | 143 - .../uglify-js/test/compress/dead-code.js | 89 - .../uglify-js/test/compress/debugger.js | 24 - .../uglify-js/test/compress/drop-unused.js | 97 - .../uglify-js/test/compress/issue-105.js | 25 - .../uglify-js/test/compress/issue-12.js | 11 - .../uglify-js/test/compress/issue-143.js | 48 - .../uglify-js/test/compress/issue-22.js | 17 - .../uglify-js/test/compress/issue-44.js | 31 - .../uglify-js/test/compress/issue-59.js | 30 - .../uglify-js/test/compress/labels.js | 163 - .../uglify-js/test/compress/loops.js | 123 - .../uglify-js/test/compress/properties.js | 54 - .../uglify-js/test/compress/sequences.js | 161 - .../uglify-js/test/compress/switch.js | 260 - .../uglify-js/test/compress/typeof.js | 25 - .../node_modules/uglify-js/test/run-tests.js | 170 - .../node_modules/uglify-js/tools/node.js | 165 - .../node_modules/handlebars/package.json | 86 - .../node_modules/handlebars/release-notes.md | 193 - .../node_modules/handlebars/runtime.js | 3 - .../node_modules/semver/.npmignore | 1 - .../node_modules/semver/LICENSE | 27 - .../node_modules/semver/Makefile | 24 - .../node_modules/semver/README.md | 158 - .../node_modules/semver/bin/semver | 125 - .../node_modules/semver/foot.js | 6 - .../node_modules/semver/head.js | 2 - .../node_modules/semver/package.json | 50 - .../node_modules/semver/semver.browser.js | 1046 -- .../node_modules/semver/semver.browser.js.gz | Bin 7253 -> 0 bytes .../node_modules/semver/semver.js | 1050 -- .../node_modules/semver/semver.min.js | 1 - .../node_modules/semver/semver.min.js.gz | Bin 3311 -> 0 bytes .../node_modules/semver/test/amd.js | 15 - .../node_modules/semver/test/gtr.js | 173 - .../node_modules/semver/test/index.js | 588 - .../node_modules/semver/test/ltr.js | 175 - .../node_modules/semver/test/no-module.js | 19 - .../express3-handlebars/package.json | 64 - .../node_modules/http/package.json | 31 - .../node_modules/request/.eslintrc | 45 - .../node_modules/request/.npmignore | 3 - .../node_modules/request/.travis.yml | 14 - .../node_modules/request/CHANGELOG.md | 522 - .../node_modules/request/CONTRIBUTING.md | 44 - .../node_modules/request/LICENSE | 55 - .../node_modules/request/README.md | 1095 -- .../request/disabled.appveyor.yml | 36 - .../node_modules/request/examples/README.md | 115 - .../node_modules/request/index.js | 154 - .../node_modules/request/lib/auth.js | 153 - .../node_modules/request/lib/cookies.js | 39 - .../request/lib/getProxyFromURI.js | 79 - .../node_modules/request/lib/har.js | 205 - .../node_modules/request/lib/helpers.js | 74 - .../node_modules/request/lib/multipart.js | 109 - .../node_modules/request/lib/oauth.js | 147 - .../node_modules/request/lib/querystring.js | 51 - .../node_modules/request/lib/redirect.js | 154 - .../node_modules/request/lib/tunnel.js | 183 - .../request/node_modules/.bin/har-validator | 1 - .../request/node_modules/.bin/uuid | 1 - .../request/node_modules/aws-sign2/LICENSE | 55 - .../request/node_modules/aws-sign2/README.md | 4 - .../request/node_modules/aws-sign2/index.js | 202 - .../node_modules/aws-sign2/package.json | 47 - .../request/node_modules/bl/.jshintrc | 59 - .../request/node_modules/bl/.npmignore | 1 - .../request/node_modules/bl/.travis.yml | 14 - .../request/node_modules/bl/LICENSE.md | 13 - .../request/node_modules/bl/README.md | 200 - .../request/node_modules/bl/bl.js | 216 - .../node_modules/readable-stream/.npmignore | 5 - .../node_modules/readable-stream/.travis.yml | 39 - .../bl/node_modules/readable-stream/.zuul.yml | 1 - .../bl/node_modules/readable-stream/LICENSE | 18 - .../bl/node_modules/readable-stream/README.md | 36 - .../readable-stream/doc/stream.markdown | 1651 --- .../doc/wg-meetings/2015-01-30.md | 60 - .../bl/node_modules/readable-stream/duplex.js | 1 - .../readable-stream/lib/_stream_duplex.js | 82 - .../lib/_stream_passthrough.js | 27 - .../readable-stream/lib/_stream_readable.js | 959 -- .../readable-stream/lib/_stream_transform.js | 197 - .../readable-stream/lib/_stream_writable.js | 520 - .../node_modules/core-util-is/README.md | 3 - .../node_modules/core-util-is/float.patch | 604 - .../node_modules/core-util-is/lib/util.js | 107 - .../node_modules/core-util-is/package.json | 54 - .../node_modules/core-util-is/util.js | 106 - .../node_modules/inherits/LICENSE | 16 - .../node_modules/inherits/README.md | 42 - .../node_modules/inherits/inherits.js | 1 - .../node_modules/inherits/inherits_browser.js | 23 - .../node_modules/inherits/package.json | 50 - .../node_modules/inherits/test.js | 25 - .../node_modules/isarray/README.md | 54 - .../node_modules/isarray/build/build.js | 209 - .../node_modules/isarray/component.json | 19 - .../node_modules/isarray/index.js | 3 - .../node_modules/isarray/package.json | 53 - .../process-nextick-args/.travis.yml | 7 - .../process-nextick-args/index.js | 13 - .../process-nextick-args/package.json | 44 - .../process-nextick-args/readme.md | 18 - .../node_modules/process-nextick-args/test.js | 17 - .../node_modules/string_decoder/.npmignore | 2 - .../node_modules/string_decoder/LICENSE | 20 - .../node_modules/string_decoder/README.md | 7 - .../node_modules/string_decoder/index.js | 221 - .../node_modules/string_decoder/package.json | 54 - .../node_modules/util-deprecate/History.md | 11 - .../node_modules/util-deprecate/LICENSE | 24 - .../node_modules/util-deprecate/README.md | 53 - .../node_modules/util-deprecate/browser.js | 62 - .../node_modules/util-deprecate/node.js | 6 - .../node_modules/util-deprecate/package.json | 52 - .../node_modules/readable-stream/package.json | 74 - .../readable-stream/passthrough.js | 1 - .../node_modules/readable-stream/readable.js | 12 - .../node_modules/readable-stream/transform.js | 1 - .../node_modules/readable-stream/writable.js | 1 - .../request/node_modules/bl/package.json | 61 - .../node_modules/bl/test/basic-test.js | 541 - .../request/node_modules/bl/test/sauce.js | 38 - .../request/node_modules/bl/test/test.js | 9 - .../request/node_modules/caseless/LICENSE | 28 - .../request/node_modules/caseless/README.md | 45 - .../request/node_modules/caseless/index.js | 66 - .../node_modules/caseless/package.json | 61 - .../request/node_modules/caseless/test.js | 40 - .../node_modules/combined-stream/License | 19 - .../node_modules/combined-stream/Readme.md | 138 - .../combined-stream/lib/combined_stream.js | 188 - .../node_modules/delayed-stream/.npmignore | 1 - .../node_modules/delayed-stream/License | 19 - .../node_modules/delayed-stream/Makefile | 7 - .../node_modules/delayed-stream/Readme.md | 141 - .../delayed-stream/lib/delayed_stream.js | 107 - .../node_modules/delayed-stream/package.json | 63 - .../node_modules/combined-stream/package.json | 66 - .../request/node_modules/extend/.eslintrc | 192 - .../request/node_modules/extend/.jscs.json | 104 - .../request/node_modules/extend/.npmignore | 1 - .../request/node_modules/extend/.travis.yml | 44 - .../request/node_modules/extend/CHANGELOG.md | 69 - .../request/node_modules/extend/LICENSE | 23 - .../request/node_modules/extend/README.md | 62 - .../node_modules/extend/component.json | 32 - .../request/node_modules/extend/index.js | 86 - .../request/node_modules/extend/package.json | 72 - .../node_modules/forever-agent/LICENSE | 55 - .../node_modules/forever-agent/README.md | 4 - .../node_modules/forever-agent/index.js | 138 - .../node_modules/forever-agent/package.json | 55 - .../request/node_modules/form-data/License | 19 - .../request/node_modules/form-data/Readme.md | 210 - .../node_modules/form-data/lib/browser.js | 1 - .../node_modules/form-data/lib/form_data.js | 374 - .../form-data/node_modules/async/CHANGELOG.md | 104 - .../form-data/node_modules/async/LICENSE | 19 - .../form-data/node_modules/async/lib/async.js | 1222 -- .../form-data/node_modules/async/package.json | 119 - .../node_modules/form-data/package.json | 84 - .../node_modules/har-validator/LICENSE | 13 - .../node_modules/har-validator/README.md | 362 - .../har-validator/bin/har-validator | 45 - .../node_modules/har-validator/lib/error.js | 10 - .../node_modules/har-validator/lib/index.js | 39 - .../har-validator/lib/schemas/cache.json | 13 - .../har-validator/lib/schemas/cacheEntry.json | 31 - .../har-validator/lib/schemas/content.json | 27 - .../har-validator/lib/schemas/cookie.json | 34 - .../har-validator/lib/schemas/creator.json | 18 - .../har-validator/lib/schemas/entry.json | 51 - .../har-validator/lib/schemas/har.json | 11 - .../har-validator/lib/schemas/index.js | 49 - .../har-validator/lib/schemas/log.json | 34 - .../har-validator/lib/schemas/page.json | 30 - .../lib/schemas/pageTimings.json | 16 - .../har-validator/lib/schemas/postData.json | 41 - .../har-validator/lib/schemas/record.json | 18 - .../har-validator/lib/schemas/request.json | 55 - .../har-validator/lib/schemas/response.json | 52 - .../har-validator/lib/schemas/timings.json | 40 - .../node_modules/bluebird/LICENSE | 21 - .../node_modules/bluebird/README.md | 676 - .../node_modules/bluebird/changelog.md | 1700 --- .../bluebird/js/browser/bluebird.js | 4857 -------- .../bluebird/js/browser/bluebird.min.js | 31 - .../node_modules/bluebird/js/main/any.js | 21 - .../node_modules/bluebird/js/main/assert.js | 55 - .../node_modules/bluebird/js/main/async.js | 150 - .../node_modules/bluebird/js/main/bind.js | 72 - .../node_modules/bluebird/js/main/bluebird.js | 11 - .../node_modules/bluebird/js/main/call_get.js | 123 - .../node_modules/bluebird/js/main/cancel.js | 48 - .../bluebird/js/main/captured_trace.js | 493 - .../bluebird/js/main/catch_filter.js | 66 - .../node_modules/bluebird/js/main/context.js | 38 - .../bluebird/js/main/debuggability.js | 160 - .../bluebird/js/main/direct_resolve.js | 61 - .../node_modules/bluebird/js/main/each.js | 12 - .../node_modules/bluebird/js/main/errors.js | 111 - .../node_modules/bluebird/js/main/es5.js | 80 - .../node_modules/bluebird/js/main/filter.js | 12 - .../node_modules/bluebird/js/main/finally.js | 98 - .../bluebird/js/main/generators.js | 136 - .../node_modules/bluebird/js/main/join.js | 107 - .../node_modules/bluebird/js/main/map.js | 133 - .../node_modules/bluebird/js/main/method.js | 44 - .../node_modules/bluebird/js/main/nodeify.js | 59 - .../node_modules/bluebird/js/main/progress.js | 76 - .../node_modules/bluebird/js/main/promise.js | 750 -- .../bluebird/js/main/promise_array.js | 142 - .../bluebird/js/main/promise_resolver.js | 123 - .../bluebird/js/main/promisify.js | 302 - .../node_modules/bluebird/js/main/props.js | 79 - .../node_modules/bluebird/js/main/queue.js | 90 - .../node_modules/bluebird/js/main/race.js | 47 - .../node_modules/bluebird/js/main/reduce.js | 148 - .../node_modules/bluebird/js/main/schedule.js | 35 - .../node_modules/bluebird/js/main/settle.js | 40 - .../node_modules/bluebird/js/main/some.js | 125 - .../js/main/synchronous_inspection.js | 94 - .../bluebird/js/main/thenables.js | 84 - .../node_modules/bluebird/js/main/timers.js | 58 - .../node_modules/bluebird/js/main/using.js | 202 - .../node_modules/bluebird/js/main/util.js | 321 - .../node_modules/bluebird/package.json | 99 - .../har-validator/node_modules/chalk/index.js | 116 - .../har-validator/node_modules/chalk/license | 21 - .../chalk/node_modules/ansi-styles/index.js | 65 - .../chalk/node_modules/ansi-styles/license | 21 - .../node_modules/ansi-styles/package.json | 79 - .../chalk/node_modules/ansi-styles/readme.md | 86 - .../escape-string-regexp/index.js | 11 - .../node_modules/escape-string-regexp/license | 21 - .../escape-string-regexp/package.json | 70 - .../escape-string-regexp/readme.md | 27 - .../chalk/node_modules/has-ansi/index.js | 4 - .../chalk/node_modules/has-ansi/license | 21 - .../has-ansi/node_modules/ansi-regex/index.js | 4 - .../has-ansi/node_modules/ansi-regex/license | 21 - .../node_modules/ansi-regex/package.json | 85 - .../node_modules/ansi-regex/readme.md | 31 - .../chalk/node_modules/has-ansi/package.json | 84 - .../chalk/node_modules/has-ansi/readme.md | 36 - .../chalk/node_modules/strip-ansi/index.js | 6 - .../chalk/node_modules/strip-ansi/license | 21 - .../node_modules/ansi-regex/index.js | 4 - .../node_modules/ansi-regex/license | 21 - .../node_modules/ansi-regex/package.json | 85 - .../node_modules/ansi-regex/readme.md | 31 - .../node_modules/strip-ansi/package.json | 84 - .../chalk/node_modules/strip-ansi/readme.md | 33 - .../node_modules/supports-color/index.js | 50 - .../chalk/node_modules/supports-color/license | 21 - .../node_modules/supports-color/package.json | 78 - .../node_modules/supports-color/readme.md | 36 - .../node_modules/chalk/package.json | 102 - .../node_modules/chalk/readme.md | 213 - .../node_modules/commander/History.md | 256 - .../node_modules/commander/LICENSE | 22 - .../node_modules/commander/Readme.md | 342 - .../node_modules/commander/index.js | 1103 -- .../node_modules/graceful-readlink/.npmignore | 3 - .../graceful-readlink/.travis.yml | 5 - .../node_modules/graceful-readlink/LICENSE | 22 - .../node_modules/graceful-readlink/README.md | 17 - .../node_modules/graceful-readlink/index.js | 12 - .../graceful-readlink/package.json | 47 - .../node_modules/commander/package.json | 74 - .../node_modules/is-my-json-valid/.npmignore | 2 - .../node_modules/is-my-json-valid/.travis.yml | 3 - .../node_modules/is-my-json-valid/LICENSE | 21 - .../node_modules/is-my-json-valid/README.md | 173 - .../node_modules/is-my-json-valid/example.js | 18 - .../node_modules/is-my-json-valid/formats.js | 14 - .../node_modules/is-my-json-valid/index.js | 573 - .../node_modules/generate-function/.npmignore | 1 - .../generate-function/.travis.yml | 3 - .../node_modules/generate-function/README.md | 72 - .../node_modules/generate-function/example.js | 27 - .../node_modules/generate-function/index.js | 61 - .../generate-function/package.json | 52 - .../node_modules/generate-function/test.js | 33 - .../generate-object-property/.npmignore | 1 - .../generate-object-property/.travis.yml | 3 - .../generate-object-property/LICENSE | 21 - .../generate-object-property/README.md | 19 - .../generate-object-property/index.js | 12 - .../node_modules/is-property/.npmignore | 17 - .../node_modules/is-property/LICENSE | 22 - .../node_modules/is-property/README.md | 28 - .../node_modules/is-property/is-property.js | 5 - .../node_modules/is-property/package.json | 58 - .../generate-object-property/package.json | 50 - .../generate-object-property/test.js | 12 - .../node_modules/jsonpointer/.travis.yml | 10 - .../node_modules/jsonpointer/README.md | 32 - .../node_modules/jsonpointer/jsonpointer.js | 76 - .../node_modules/jsonpointer/package.json | 63 - .../node_modules/jsonpointer/test.js | 98 - .../node_modules/xtend/.jshintrc | 30 - .../node_modules/xtend/.npmignore | 1 - .../node_modules/xtend/LICENCE | 19 - .../node_modules/xtend/Makefile | 4 - .../node_modules/xtend/README.md | 32 - .../node_modules/xtend/immutable.js | 17 - .../node_modules/xtend/mutable.js | 15 - .../node_modules/xtend/package.json | 88 - .../node_modules/xtend/test.js | 63 - .../is-my-json-valid/package.json | 66 - .../node_modules/is-my-json-valid/require.js | 12 - .../is-my-json-valid/test/fixtures/cosmic.js | 84 - .../json-schema-draft4/additionalItems.json | 82 - .../additionalProperties.json | 88 - .../test/json-schema-draft4/allOf.json | 112 - .../test/json-schema-draft4/anyOf.json | 68 - .../test/json-schema-draft4/bignum.json | 107 - .../test/json-schema-draft4/default.json | 49 - .../test/json-schema-draft4/definitions.json | 32 - .../test/json-schema-draft4/dependencies.json | 113 - .../test/json-schema-draft4/enum.json | 72 - .../test/json-schema-draft4/format.json | 143 - .../test/json-schema-draft4/items.json | 46 - .../test/json-schema-draft4/maxItems.json | 28 - .../test/json-schema-draft4/maxLength.json | 28 - .../json-schema-draft4/maxProperties.json | 28 - .../test/json-schema-draft4/maximum.json | 42 - .../test/json-schema-draft4/minItems.json | 28 - .../test/json-schema-draft4/minLength.json | 28 - .../json-schema-draft4/minProperties.json | 28 - .../test/json-schema-draft4/minimum.json | 42 - .../test/json-schema-draft4/multipleOf.json | 60 - .../test/json-schema-draft4/not.json | 96 - .../json-schema-draft4/nullAndFormat.json | 18 - .../json-schema-draft4/nullAndObject.json | 18 - .../test/json-schema-draft4/oneOf.json | 68 - .../test/json-schema-draft4/pattern.json | 23 - .../json-schema-draft4/patternProperties.json | 110 - .../test/json-schema-draft4/properties.json | 92 - .../test/json-schema-draft4/ref.json | 128 - .../test/json-schema-draft4/refRemote.json | 74 - .../test/json-schema-draft4/required.json | 39 - .../test/json-schema-draft4/type.json | 330 - .../test/json-schema-draft4/uniqueItems.json | 79 - .../is-my-json-valid/test/json-schema.js | 23 - .../is-my-json-valid/test/misc.js | 429 - .../node_modules/har-validator/package.json | 86 - .../request/node_modules/hawk/.npmignore | 20 - .../request/node_modules/hawk/.travis.yml | 5 - .../request/node_modules/hawk/LICENSE | 28 - .../request/node_modules/hawk/README.md | 634 - .../request/node_modules/hawk/bower.json | 24 - .../request/node_modules/hawk/component.json | 19 - .../node_modules/hawk/example/usage.js | 78 - .../request/node_modules/hawk/images/hawk.png | Bin 6945 -> 0 bytes .../request/node_modules/hawk/images/logo.png | Bin 71732 -> 0 bytes .../request/node_modules/hawk/lib/browser.js | 643 - .../request/node_modules/hawk/lib/client.js | 369 - .../request/node_modules/hawk/lib/crypto.js | 126 - .../request/node_modules/hawk/lib/index.js | 15 - .../request/node_modules/hawk/lib/server.js | 540 - .../request/node_modules/hawk/lib/utils.js | 164 - .../hawk/node_modules/boom/.npmignore | 18 - .../hawk/node_modules/boom/.travis.yml | 7 - .../hawk/node_modules/boom/CONTRIBUTING.md | 1 - .../hawk/node_modules/boom/LICENSE | 28 - .../hawk/node_modules/boom/README.md | 597 - .../hawk/node_modules/boom/images/boom.png | Bin 29479 -> 0 bytes .../hawk/node_modules/boom/lib/index.js | 301 - .../hawk/node_modules/boom/package.json | 63 - .../hawk/node_modules/boom/test/index.js | 616 - .../hawk/node_modules/cryptiles/.npmignore | 18 - .../hawk/node_modules/cryptiles/.travis.yml | 5 - .../hawk/node_modules/cryptiles/LICENSE | 28 - .../hawk/node_modules/cryptiles/Makefile | 9 - .../hawk/node_modules/cryptiles/README.md | 14 - .../hawk/node_modules/cryptiles/index.js | 1 - .../hawk/node_modules/cryptiles/lib/index.js | 68 - .../hawk/node_modules/cryptiles/package.json | 64 - .../hawk/node_modules/cryptiles/test/index.js | 108 - .../hawk/node_modules/hoek/.npmignore | 18 - .../hawk/node_modules/hoek/.travis.yml | 7 - .../hawk/node_modules/hoek/CONTRIBUTING.md | 1 - .../hawk/node_modules/hoek/LICENSE | 31 - .../hawk/node_modules/hoek/Makefile | 8 - .../hawk/node_modules/hoek/README.md | 574 - .../hawk/node_modules/hoek/images/hoek.png | Bin 37939 -> 0 bytes .../hawk/node_modules/hoek/index.js | 1 - .../hawk/node_modules/hoek/lib/escape.js | 132 - .../hawk/node_modules/hoek/lib/index.js | 977 -- .../hawk/node_modules/hoek/package.json | 59 - .../hawk/node_modules/hoek/test/escaper.js | 88 - .../hawk/node_modules/hoek/test/index.js | 2425 ---- .../node_modules/hoek/test/modules/ignore.txt | 0 .../node_modules/hoek/test/modules/test1.js | 1 - .../node_modules/hoek/test/modules/test2.js | 1 - .../node_modules/hoek/test/modules/test3.js | 1 - .../hawk/node_modules/sntp/.npmignore | 18 - .../hawk/node_modules/sntp/.travis.yml | 5 - .../hawk/node_modules/sntp/LICENSE | 28 - .../hawk/node_modules/sntp/Makefile | 9 - .../hawk/node_modules/sntp/README.md | 68 - .../hawk/node_modules/sntp/examples/offset.js | 16 - .../hawk/node_modules/sntp/examples/time.js | 25 - .../hawk/node_modules/sntp/index.js | 1 - .../hawk/node_modules/sntp/lib/index.js | 412 - .../hawk/node_modules/sntp/package.json | 64 - .../hawk/node_modules/sntp/test/index.js | 435 - .../request/node_modules/hawk/package.json | 67 - .../request/node_modules/hawk/test/browser.js | 1459 --- .../request/node_modules/hawk/test/client.js | 440 - .../request/node_modules/hawk/test/crypto.js | 70 - .../request/node_modules/hawk/test/index.js | 378 - .../request/node_modules/hawk/test/readme.js | 95 - .../request/node_modules/hawk/test/server.js | 1314 -- .../request/node_modules/hawk/test/uri.js | 849 -- .../request/node_modules/hawk/test/utils.js | 121 - .../http-signature/.dir-locals.el | 6 - .../node_modules/http-signature/.npmignore | 7 - .../node_modules/http-signature/LICENSE | 18 - .../node_modules/http-signature/README.md | 79 - .../http-signature/http_signing.md | 296 - .../node_modules/http-signature/lib/index.js | 27 - .../node_modules/http-signature/lib/parser.js | 304 - .../node_modules/http-signature/lib/signer.js | 178 - .../node_modules/http-signature/lib/util.js | 306 - .../node_modules/http-signature/lib/verify.js | 56 - .../node_modules/asn1/.npmignore | 2 - .../http-signature/node_modules/asn1/LICENSE | 19 - .../node_modules/asn1/README.md | 50 - .../node_modules/asn1/lib/ber/errors.js | 13 - .../node_modules/asn1/lib/ber/index.js | 27 - .../node_modules/asn1/lib/ber/reader.js | 267 - .../node_modules/asn1/lib/ber/types.js | 36 - .../node_modules/asn1/lib/ber/writer.js | 317 - .../node_modules/asn1/lib/index.js | 20 - .../node_modules/asn1/package.json | 63 - .../node_modules/asn1/tst/ber/reader.test.js | 172 - .../node_modules/asn1/tst/ber/writer.test.js | 296 - .../node_modules/assert-plus/README.md | 126 - .../node_modules/assert-plus/assert.js | 245 - .../node_modules/assert-plus/package.json | 46 - .../node_modules/ctype/.npmignore | 1 - .../node_modules/ctype/CHANGELOG | 78 - .../http-signature/node_modules/ctype/LICENSE | 24 - .../http-signature/node_modules/ctype/README | 82 - .../node_modules/ctype/README.old | 298 - .../http-signature/node_modules/ctype/ctf.js | 245 - .../http-signature/node_modules/ctype/ctio.js | 1485 --- .../node_modules/ctype/ctype.js | 944 -- .../ctype/man/man3ctype/ctio.3ctype | 241 - .../node_modules/ctype/package.json | 42 - .../node_modules/ctype/tools/jsl.conf | 129 - .../node_modules/ctype/tools/jsstyle | 839 -- .../node_modules/http-signature/package.json | 76 - .../request/node_modules/isstream/.jshintrc | 59 - .../request/node_modules/isstream/.npmignore | 1 - .../request/node_modules/isstream/.travis.yml | 12 - .../request/node_modules/isstream/LICENSE.md | 11 - .../request/node_modules/isstream/README.md | 66 - .../request/node_modules/isstream/isstream.js | 27 - .../node_modules/isstream/package.json | 59 - .../request/node_modules/isstream/test.js | 168 - .../json-stringify-safe/.npmignore | 1 - .../json-stringify-safe/CHANGELOG.md | 14 - .../node_modules/json-stringify-safe/LICENSE | 15 - .../node_modules/json-stringify-safe/Makefile | 35 - .../json-stringify-safe/README.md | 52 - .../json-stringify-safe/package.json | 68 - .../json-stringify-safe/stringify.js | 27 - .../json-stringify-safe/test/mocha.opts | 2 - .../test/stringify_test.js | 246 - .../node_modules/mime-types/HISTORY.md | 165 - .../request/node_modules/mime-types/LICENSE | 23 - .../request/node_modules/mime-types/README.md | 103 - .../request/node_modules/mime-types/index.js | 188 - .../node_modules/mime-db/HISTORY.md | 266 - .../mime-types/node_modules/mime-db/LICENSE | 22 - .../mime-types/node_modules/mime-db/README.md | 82 - .../mime-types/node_modules/mime-db/db.json | 6460 ---------- .../mime-types/node_modules/mime-db/index.js | 11 - .../node_modules/mime-db/package.json | 94 - .../node_modules/mime-types/package.json | 84 - .../request/node_modules/node-uuid/.npmignore | 2 - .../request/node_modules/node-uuid/LICENSE.md | 21 - .../request/node_modules/node-uuid/README.md | 243 - .../node-uuid/benchmark/README.md | 53 - .../node-uuid/benchmark/bench.gnu | 174 - .../node_modules/node-uuid/benchmark/bench.sh | 34 - .../node-uuid/benchmark/benchmark-native.c | 34 - .../node-uuid/benchmark/benchmark.js | 84 - .../request/node_modules/node-uuid/bin/uuid | 26 - .../request/node_modules/node-uuid/bower.json | 23 - .../node_modules/node-uuid/component.json | 18 - .../node_modules/node-uuid/package.json | 65 - .../node_modules/node-uuid/test/compare_v1.js | 63 - .../node_modules/node-uuid/test/test.html | 17 - .../node_modules/node-uuid/test/test.js | 228 - .../request/node_modules/node-uuid/uuid.js | 247 - .../request/node_modules/oauth-sign/LICENSE | 55 - .../request/node_modules/oauth-sign/README.md | 4 - .../request/node_modules/oauth-sign/index.js | 134 - .../node_modules/oauth-sign/package.json | 58 - .../request/node_modules/oauth-sign/test.js | 89 - .../request/node_modules/qs/.eslintignore | 1 - .../request/node_modules/qs/.npmignore | 19 - .../request/node_modules/qs/.travis.yml | 6 - .../request/node_modules/qs/CHANGELOG.md | 88 - .../request/node_modules/qs/CONTRIBUTING.md | 1 - .../request/node_modules/qs/LICENSE | 28 - .../request/node_modules/qs/README.md | 317 - .../request/node_modules/qs/bower.json | 22 - .../request/node_modules/qs/lib/index.js | 15 - .../request/node_modules/qs/lib/parse.js | 186 - .../request/node_modules/qs/lib/stringify.js | 121 - .../request/node_modules/qs/lib/utils.js | 190 - .../request/node_modules/qs/package.json | 57 - .../request/node_modules/qs/test/parse.js | 478 - .../request/node_modules/qs/test/stringify.js | 259 - .../request/node_modules/qs/test/utils.js | 28 - .../node_modules/stringstream/.npmignore | 15 - .../node_modules/stringstream/.travis.yml | 4 - .../node_modules/stringstream/LICENSE.txt | 4 - .../node_modules/stringstream/README.md | 38 - .../node_modules/stringstream/example.js | 27 - .../node_modules/stringstream/package.json | 49 - .../node_modules/stringstream/stringstream.js | 102 - .../node_modules/tough-cookie/.editorconfig | 12 - .../node_modules/tough-cookie/.jshintrc | 70 - .../node_modules/tough-cookie/.npmignore | 4 - .../node_modules/tough-cookie/.travis.yml | 9 - .../request/node_modules/tough-cookie/LICENSE | 74 - .../node_modules/tough-cookie/README.md | 486 - .../tough-cookie/generate-pubsuffix.js | 293 - .../node_modules/tough-cookie/lib/cookie.js | 1309 -- .../node_modules/tough-cookie/lib/memstore.js | 170 - .../tough-cookie/lib/pathMatch.js | 61 - .../tough-cookie/lib/permuteDomain.js | 56 - .../tough-cookie/lib/pubsuffix.js | 98 - .../node_modules/tough-cookie/lib/store.js | 71 - .../node_modules/tough-cookie/package.json | 65 - .../tough-cookie/public-suffix.txt | 10309 ---------------- .../tough-cookie/test/api_test.js | 372 - .../tough-cookie/test/cookie_jar_test.js | 468 - .../tough-cookie/test/cookie_sorting_test.js | 156 - .../tough-cookie/test/cookie_to_json_test.js | 164 - .../test/cookie_to_string_test.js | 162 - .../tough-cookie/test/date_test.js | 79 - .../tough-cookie/test/domain_and_path_test.js | 201 - .../test/ietf_data/dates/bsd-examples.json | 168 - .../test/ietf_data/dates/examples.json | 48 - .../tough-cookie/test/ietf_data/parser.json | 1959 --- .../tough-cookie/test/ietf_test.js | 105 - .../test/jar_serialization_test.js | 348 - .../tough-cookie/test/lifetime_test.js | 97 - .../tough-cookie/test/parsing_test.js | 294 - .../tough-cookie/test/regression_test.js | 143 - .../node_modules/tunnel-agent/.jshintrc | 5 - .../request/node_modules/tunnel-agent/LICENSE | 55 - .../node_modules/tunnel-agent/README.md | 4 - .../node_modules/tunnel-agent/index.js | 241 - .../node_modules/tunnel-agent/package.json | 59 - .../node_modules/request/package.json | 111 - .../node_modules/request/release.sh | 45 - .../node_modules/request/request.js | 1424 --- .../package.json | 17 - .../public/.DS_Store | Bin 8196 -> 0 bytes .../public/css/bootstrap.css | 6800 ---------- .../public/img/js.jpg | Bin 661462 -> 0 bytes .../public/js/bootstrap.js | 2363 ---- .../public/js/main.js | 9 - .../views/.DS_Store | Bin 6148 -> 0 bytes .../views/404.handlebars | 3 - .../views/500.handlebars | 1 - .../views/about.handlebars | 1 - .../views/index.handlebars | 1 - .../views/layouts/.DS_Store | Bin 6148 -> 0 bytes .../views/layouts/main.handlebars | 24 - .../views/search.handlebars | 6 - Slide Content /.DS_Store | Bin 6148 -> 0 bytes Slide Content /Class 1- Overview.pdf | Bin 1707937 -> 0 bytes ...ss 2 Re-intro to JavaScript and jQuery.pdf | Bin 637949 -> 0 bytes ...s 3- Server-side scripting- conceptual.pdf | Bin 733707 -> 0 bytes Slide Content /Class 4- Install Fest.pdf | Bin 408175 -> 0 bytes Slide Content /Class 5- GitHub.pdf | Bin 255774 -> 0 bytes Website_JS.html | 16 + 3383 files changed, 16 insertions(+), 534774 deletions(-) delete mode 100644 .DS_Store delete mode 100644 Excersizes/.DS_Store delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /.DS_Store delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /app.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/lib/express-handlebars.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/lib/utils.js delete mode 120000 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/.bin/handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/common.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/glob.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/.eslintrc delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/inflight.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits_browser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/browser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/once.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/test/once.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/license delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/sync.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/fs.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/graceful-fs.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/polyfills.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/max-open.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/open.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/readdir-sort.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/write-then-read.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/.gitmodules delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/.istanbul.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/CONTRIBUTING.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/FAQ.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/README.markdown delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/bin/handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/base.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/ast.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/base.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/code-gen.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/compiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/helpers.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/javascript-compiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/parser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/printer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/visitor.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/whitespace-control.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/exception.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/no-conflict.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/safe-string.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/precompiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/base.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/helpers.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/printer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/exception.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/no-conflict.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/safe-string.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/precompiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.min.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.min.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.min.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.min.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/docs/compiler-api.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/base.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/ast.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/base.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/code-gen.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/compiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/helpers.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/javascript-compiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/parser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/printer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/visitor.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/whitespace-control.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/exception.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/no-conflict.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/safe-string.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/precompiler.js delete mode 120000 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/.bin/uglifyjs delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/bool.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_double.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_single.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_hash.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_singles.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/divide.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_options.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_wrap.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/nonopt.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/reflect.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/short.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/string.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/usage-options.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/xup.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/example/parse.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/readme.markdown delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/bool.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dash.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/default_bool.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dotted.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/long.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/num.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse_modified.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/short.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/whitespace.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/README.markdown delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/center.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/meat.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/break.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/idleness.txt delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/wrap.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/readme.markdown delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/argv.js delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/bin.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/dash.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse_modified.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/short.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/usage.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/whitespace.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/CHANGELOG.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/Makefile.dryice.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/assert-shim.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/mini-require.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-source-map.jsm delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-utils.jsm delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-browser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-source-map.jsm delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-utils.jsm delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-prefix.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-suffix.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/array-set.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64-vlq.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/binary-search.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/mapping-list.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-consumer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-generator.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-node.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/util.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/amdefine.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/intercept.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/package.json delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/run-tests.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-api.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-array-set.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64-vlq.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-binary-search.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-dog-fooding.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-consumer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-generator.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-node.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-util.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/util.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/README.md delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/bin/uglifyjs delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/ast.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/compress.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/mozilla-ast.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/output.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/parse.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/scope.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/sourcemap.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/transform.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/component.json delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/lib/async.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/bool.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/boolean_double.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/boolean_single.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/default_hash.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/default_singles.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/divide.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/line_count.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/line_count_options.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/line_count_wrap.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/nonopt.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/reflect.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/short.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/string.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/usage-options.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/xup.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/README.markdown delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/example/center.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/example/meat.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/break.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/idleness.txt delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/wrap.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/readme.markdown delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/test/_.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/test/_/argv.js delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/test/_/bin.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/test/parse.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/test/usage.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/arrays.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/blocks.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/conditionals.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/dead-code.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/debugger.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/drop-unused.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-105.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-12.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-143.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-22.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-44.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-59.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/labels.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/loops.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/properties.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/sequences.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/switch.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/typeof.js delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/run-tests.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/tools/node.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/package.json delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/print-script delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/release-notes.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/CHANGELOG.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/dist/browser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/.editorconfig delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/.eslintrc delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/.jscs.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/CHANGELOG.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/isArguments.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/test/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/object.assign/test/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/.jshintrc delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/core.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/core.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/done.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/es6-extensions.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/node-extensions.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/LICENSE.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/asap.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/polyfill-done.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/polyfill.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/application.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/express.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/middleware/init.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/middleware/query.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/request.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/response.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/router/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/router/layer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/router/route.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/view.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/db.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/array-flatten.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/.jshintrc delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/bower.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/browser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/debug.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/lib/compat/buffer-concat.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/lib/compat/callsite-tostring.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/lib/compat/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/.eslintignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/CHANGELOG.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/CONTRIBUTING.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/bower.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/parse.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/stringify.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/test/parse.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/test/stringify.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/test/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/index.js delete mode 120000 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/.bin/mime delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/destroy/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/destroy/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/destroy/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits_browser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/build/build.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/build/test.js delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/cli.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/mime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/types.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/codes.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/db.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/app.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/lib/helpers.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/application.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/express.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/init.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/query.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/request.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/response.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/layer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/match.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/route.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/view.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.jshintrc delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/browser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/debug.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/test/methods.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.gitmodules delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/send.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/mime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/mime.types delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/node.types delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/public/echo.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/shared/templates/echo.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/echo.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/home.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/layouts/main.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/layouts/shared-templates.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/partials/page/nav.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/partials/page/title.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/yell.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/app.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/application.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/express.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/init.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/query.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/request.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/response.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/layer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/match.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/route.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/view.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.jshintrc delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/browser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/debug.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/test/methods.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.gitmodules delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/send.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/mime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/mime.types delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/node.types delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/HISTORY.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/History.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/views/home.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/views/layouts/main.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/lib/express-handlebars.js delete mode 120000 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/.bin/handlebars delete mode 120000 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/.bin/semver delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/component.json delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/lib/async.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/examples/g.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/examples/usr-local.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/glob.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/inherits/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/inherits/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/inherits/inherits.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/inherits/inherits_browser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/inherits/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/inherits/test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/test/basic.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/test/brace-expand.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/test/caching.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/test/defaults.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/00-setup.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/bash-comparison.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/bash-results.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/cwd-test.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/globstar-match.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/mark.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/new-glob-optional-options.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/nocase-nomagic.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/pause-resume.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/readme-issue.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/root-nomount.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/root.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/stat.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/glob/test/zz-cleanup.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/README.markdown delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/bin/handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars.runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/base.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/ast.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/base.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/compiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/javascript-compiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/parser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/printer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/visitor.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/exception.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/safe-string.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars.runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/base.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/printer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/exception.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/safe-string.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.amd.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.amd.min.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.min.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.min.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.runtime.min.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars.runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/base.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/ast.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/base.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/compiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/javascript-compiler.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/parser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/printer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/visitor.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/exception.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/safe-string.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/lib/index.js delete mode 120000 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/.bin/uglifyjs delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/bool.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_double.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_single.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/default_hash.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/default_singles.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/divide.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_options.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_wrap.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/nonopt.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/reflect.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/short.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/string.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/usage-options.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/xup.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/README.markdown delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/center.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/meat.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/break.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/idleness.txt delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/wrap.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/readme.markdown delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/test/_.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/test/_/argv.js delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/test/_/bin.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/test/parse.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/test/usage.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/README.md delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/bin/uglifyjs delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/ast.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/compress.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/mozilla-ast.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/output.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/parse.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/scope.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/sourcemap.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/transform.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/utils.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/.travis.yml delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/CHANGELOG.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/Makefile.dryice.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/assert-shim.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/mini-require.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/prefix-source-map.jsm delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/prefix-utils.jsm delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/suffix-browser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/suffix-source-map.jsm delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/suffix-utils.jsm delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/test-prefix.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/test-suffix.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/array-set.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/base64-vlq.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/base64.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/binary-search.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/mapping-list.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-consumer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-generator.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-node.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/util.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/README.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/amdefine.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/intercept.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/package.json delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/run-tests.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-api.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-array-set.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-base64-vlq.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-base64.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-binary-search.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-dog-fooding.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-consumer.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-generator.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-node.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-util.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/util.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/arrays.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/blocks.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/conditionals.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/dead-code.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/debugger.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/drop-unused.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-105.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-12.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-143.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-22.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-44.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-59.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/labels.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/loops.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/properties.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/sequences.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/switch.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/typeof.js delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/run-tests.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/tools/node.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/release-notes.md delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/handlebars/runtime.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/.npmignore delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/LICENSE delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/Makefile delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/README.md delete mode 100755 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/bin/semver delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/foot.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/head.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/semver.browser.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/semver.browser.js.gz delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/semver.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/semver.min.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/semver.min.js.gz delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/test/amd.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/test/gtr.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/test/index.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/test/ltr.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/semver/test/no-module.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /package.json delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /public/.DS_Store delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /public/css/bootstrap.css delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /public/img/js.jpg delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /public/js/bootstrap.js delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /views/.DS_Store delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /views/404.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /views/500.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /views/about.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /views/index.handlebars delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /views/layouts/.DS_Store delete mode 100644 Excersizes/Build A Static Site With Express (Class 7) /views/layouts/main.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/.DS_Store delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/app.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/lib/express-handlebars.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/lib/utils.js delete mode 120000 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/.bin/handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/common.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/glob.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/.eslintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/inflight.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits_browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/once.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/test/once.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/license delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/sync.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/fs.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/graceful-fs.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/polyfills.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/max-open.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/open.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/readdir-sort.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/write-then-read.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/.gitmodules delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/.istanbul.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/CONTRIBUTING.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/FAQ.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/README.markdown delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/bin/handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/base.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/ast.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/base.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/code-gen.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/compiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/helpers.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/javascript-compiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/parser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/printer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/visitor.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/whitespace-control.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/exception.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/no-conflict.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/safe-string.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/precompiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/base.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/helpers.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/printer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/exception.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/no-conflict.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/safe-string.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/precompiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/docs/compiler-api.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/base.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/ast.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/base.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/code-gen.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/compiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/helpers.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/javascript-compiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/parser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/printer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/visitor.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/whitespace-control.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/exception.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/no-conflict.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/safe-string.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/precompiler.js delete mode 120000 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/.bin/uglifyjs delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/bool.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_double.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_single.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_hash.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_singles.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/divide.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_options.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_wrap.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/nonopt.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/reflect.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/short.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/string.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/usage-options.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/xup.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/example/parse.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/readme.markdown delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/bool.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dash.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/default_bool.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dotted.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/long.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/num.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse_modified.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/short.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/whitespace.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/README.markdown delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/center.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/meat.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/break.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/idleness.txt delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/wrap.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/readme.markdown delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/argv.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/bin.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/dash.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse_modified.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/short.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/usage.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/whitespace.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/CHANGELOG.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/Makefile.dryice.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/assert-shim.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/mini-require.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-source-map.jsm delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-utils.jsm delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-source-map.jsm delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-utils.jsm delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-prefix.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-suffix.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/array-set.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64-vlq.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/binary-search.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/mapping-list.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-consumer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-generator.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-node.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/util.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/amdefine.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/intercept.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/package.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/run-tests.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-api.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-array-set.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64-vlq.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-binary-search.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-dog-fooding.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-consumer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-generator.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-node.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-util.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/util.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/README.md delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/bin/uglifyjs delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/ast.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/compress.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/mozilla-ast.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/output.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/parse.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/scope.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/sourcemap.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/transform.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/component.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/lib/async.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/bool.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/boolean_double.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/boolean_single.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/default_hash.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/default_singles.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/divide.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/line_count.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/line_count_options.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/line_count_wrap.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/nonopt.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/reflect.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/short.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/string.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/usage-options.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/example/xup.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/README.markdown delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/example/center.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/example/meat.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/break.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/idleness.txt delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/node_modules/wordwrap/test/wrap.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/readme.markdown delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/test/_.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/test/_/argv.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/test/_/bin.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/test/parse.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/optimist/test/usage.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/arrays.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/blocks.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/conditionals.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/dead-code.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/debugger.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/drop-unused.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-105.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-12.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-143.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-22.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-44.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-59.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/labels.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/loops.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/properties.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/sequences.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/switch.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/typeof.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/test/run-tests.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/tools/node.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/package.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/print-script delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/release-notes.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/CHANGELOG.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/dist/browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/.editorconfig delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/.eslintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/.jscs.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/CHANGELOG.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/isArguments.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/node_modules/object-keys/test/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/object.assign/test/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/.jshintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/core.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/core.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/done.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/es6-extensions.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/node-extensions.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/LICENSE.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/asap.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/polyfill-done.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/polyfill.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/application.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/express.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/middleware/init.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/middleware/query.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/request.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/response.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/router/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/router/layer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/router/route.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/view.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/db.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/array-flatten.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/.jshintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/bower.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/debug.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/lib/compat/buffer-concat.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/lib/compat/callsite-tostring.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/lib/compat/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/.eslintignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/CHANGELOG.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/CONTRIBUTING.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/bower.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/parse.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/stringify.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/test/parse.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/test/stringify.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/test/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/index.js delete mode 120000 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/.bin/mime delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/destroy/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/destroy/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/destroy/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits_browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/build/build.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/build/test.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/cli.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/mime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/types.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/codes.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/db.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/app.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/lib/helpers.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/application.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/express.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/init.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/query.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/request.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/response.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/layer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/match.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/route.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/view.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.jshintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/debug.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/test/methods.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.gitmodules delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/send.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/mime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/mime.types delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/node.types delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/public/echo.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/shared/templates/echo.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/echo.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/home.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/layouts/main.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/layouts/shared-templates.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/partials/page/nav.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/partials/page/title.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/yell.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/app.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/application.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/express.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/init.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/query.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/request.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/response.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/layer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/match.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/route.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/view.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.jshintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/debug.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/test/methods.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.gitmodules delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/send.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/mime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/mime.types delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/node.types delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/views/home.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/views/layouts/main.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/lib/express-handlebars.js delete mode 120000 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/.bin/handlebars delete mode 120000 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/.bin/semver delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/component.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/lib/async.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/examples/g.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/examples/usr-local.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/glob.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/inherits/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/inherits/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/inherits/inherits.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/inherits/inherits_browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/inherits/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/inherits/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/test/basic.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/test/brace-expand.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/test/caching.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/test/defaults.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/00-setup.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/bash-comparison.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/bash-results.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/cwd-test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/globstar-match.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/mark.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/new-glob-optional-options.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/nocase-nomagic.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/pause-resume.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/readme-issue.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/root-nomount.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/root.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/stat.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/glob/test/zz-cleanup.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/README.markdown delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/bin/handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars.runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/base.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/ast.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/base.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/compiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/javascript-compiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/parser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/printer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/visitor.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/exception.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/safe-string.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/amd/handlebars/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars.runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/base.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/printer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/exception.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/safe-string.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/cjs/handlebars/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.amd.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.amd.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/dist/handlebars.runtime.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars.runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/base.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/ast.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/base.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/compiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/javascript-compiler.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/parser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/printer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/compiler/visitor.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/exception.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/safe-string.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/handlebars/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/lib/index.js delete mode 120000 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/.bin/uglifyjs delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/bool.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_double.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_single.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/default_hash.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/default_singles.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/divide.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_options.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_wrap.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/nonopt.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/reflect.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/short.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/string.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/usage-options.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/example/xup.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/README.markdown delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/center.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/meat.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/break.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/idleness.txt delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/wrap.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/readme.markdown delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/test/_.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/test/_/argv.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/test/_/bin.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/test/parse.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/optimist/test/usage.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/README.md delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/bin/uglifyjs delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/ast.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/compress.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/mozilla-ast.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/output.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/parse.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/scope.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/sourcemap.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/transform.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/CHANGELOG.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/Makefile.dryice.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/assert-shim.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/mini-require.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/prefix-source-map.jsm delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/prefix-utils.jsm delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/suffix-browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/suffix-source-map.jsm delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/suffix-utils.jsm delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/test-prefix.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/build/test-suffix.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/array-set.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/base64-vlq.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/base64.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/binary-search.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/mapping-list.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-consumer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-map-generator.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/source-node.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/lib/source-map/util.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/amdefine.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/intercept.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/node_modules/amdefine/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/package.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/run-tests.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-api.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-array-set.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-base64-vlq.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-base64.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-binary-search.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-dog-fooding.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-consumer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-map-generator.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-source-node.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/test-util.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/source-map/test/source-map/util.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/arrays.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/blocks.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/conditionals.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/dead-code.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/debugger.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/drop-unused.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-105.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-12.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-143.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-22.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-44.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/issue-59.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/labels.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/loops.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/properties.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/sequences.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/switch.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/compress/typeof.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/test/run-tests.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/node_modules/uglify-js/tools/node.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/release-notes.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/handlebars/runtime.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/README.md delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/bin/semver delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/foot.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/head.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/semver.browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/semver.browser.js.gz delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/semver.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/semver.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/semver.min.js.gz delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/test/amd.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/test/gtr.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/test/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/test/ltr.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/semver/test/no-module.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/http/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/.eslintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/CHANGELOG.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/CONTRIBUTING.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/disabled.appveyor.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/examples/README.md delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/lib/auth.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/lib/cookies.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/lib/getProxyFromURI.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/lib/har.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/lib/helpers.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/lib/multipart.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/lib/oauth.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/lib/querystring.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/lib/redirect.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/lib/tunnel.js delete mode 120000 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/.bin/har-validator delete mode 120000 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/.bin/uuid delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/aws-sign2/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/aws-sign2/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/aws-sign2/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/aws-sign2/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/.jshintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/LICENSE.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/bl.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/.zuul.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/doc/stream.markdown delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/float.patch delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/lib/util.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/util.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits_browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/build/build.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/node.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/passthrough.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/readable.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/transform.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/node_modules/readable-stream/writable.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/test/basic-test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/test/sauce.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/bl/test/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/caseless/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/caseless/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/caseless/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/caseless/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/caseless/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/combined-stream/License delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/combined-stream/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/combined-stream/lib/combined_stream.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/License delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/combined-stream/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/extend/.eslintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/extend/.jscs.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/extend/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/extend/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/extend/CHANGELOG.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/extend/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/extend/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/extend/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/extend/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/extend/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/forever-agent/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/forever-agent/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/forever-agent/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/forever-agent/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/form-data/License delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/form-data/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/form-data/lib/browser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/form-data/lib/form_data.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/form-data/node_modules/async/CHANGELOG.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/form-data/node_modules/async/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/form-data/node_modules/async/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/form-data/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/README.md delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/bin/har-validator delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/error.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/cache.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/cacheEntry.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/content.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/cookie.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/creator.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/entry.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/har.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/log.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/page.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/pageTimings.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/postData.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/record.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/request.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/response.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/lib/schemas/timings.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/changelog.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/browser/bluebird.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/browser/bluebird.min.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/any.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/assert.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/async.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/bind.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/bluebird.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/call_get.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/cancel.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/captured_trace.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/catch_filter.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/context.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/debuggability.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/direct_resolve.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/each.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/errors.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/es5.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/filter.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/finally.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/generators.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/join.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/map.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/method.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/nodeify.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/progress.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/promise.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/promise_array.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/promise_resolver.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/promisify.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/props.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/queue.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/race.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/reduce.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/schedule.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/settle.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/some.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/synchronous_inspection.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/thenables.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/timers.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/using.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/js/main/util.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/bluebird/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/license delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/license delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/license delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/license delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/license delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/license delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/license delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/license delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/chalk/readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/commander/History.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/commander/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/commander/Readme.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/commander/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/commander/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/example.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/formats.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/example.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/is-property.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/.jshintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/LICENCE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/immutable.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/mutable.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/require.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/fixtures/cosmic.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/additionalItems.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/additionalProperties.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/allOf.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/anyOf.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/bignum.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/default.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/definitions.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/dependencies.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/enum.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/format.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/items.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maxItems.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maxLength.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maxProperties.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maximum.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minItems.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minLength.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minProperties.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minimum.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/multipleOf.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/not.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/nullAndFormat.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/nullAndObject.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/oneOf.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/pattern.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/patternProperties.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/properties.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/ref.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/refRemote.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/required.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/type.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/uniqueItems.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/har-validator/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/.npmignore delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/.travis.yml delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/LICENSE delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/bower.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/component.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/example/usage.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/images/hawk.png delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/images/logo.png delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/lib/browser.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/lib/client.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/lib/crypto.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/lib/index.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/lib/server.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/lib/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/boom/.npmignore delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/boom/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/boom/CONTRIBUTING.md delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/boom/LICENSE delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/boom/README.md delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/boom/images/boom.png delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/boom/package.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/cryptiles/LICENSE delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/cryptiles/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/cryptiles/README.md delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/cryptiles/index.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/cryptiles/test/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/.npmignore delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/CONTRIBUTING.md delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/LICENSE delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/Makefile delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/README.md delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/images/hoek.png delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/index.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/package.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/test/escaper.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/ignore.txt delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test1.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test2.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test3.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/sntp/.npmignore delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/sntp/.travis.yml delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/sntp/LICENSE delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/sntp/Makefile delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/sntp/README.md delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/sntp/examples/offset.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/sntp/examples/time.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/sntp/index.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/sntp/package.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/node_modules/sntp/test/index.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/package.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/test/browser.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/test/client.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/test/crypto.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/test/index.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/test/readme.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/test/server.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/test/uri.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/hawk/test/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/.dir-locals.el delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/http_signing.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/lib/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/lib/parser.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/lib/signer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/lib/util.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/lib/verify.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/asn1/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/asn1/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/asn1/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/errors.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/reader.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/types.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/writer.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/asn1/tst/ber/reader.test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/asn1/tst/ber/writer.test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/assert-plus/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/ctype/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/ctype/CHANGELOG delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/ctype/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/ctype/README delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/ctype/README.old delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/ctype/ctf.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/ctype/ctio.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/ctype/ctype.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/ctype/man/man3ctype/ctio.3ctype delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/ctype/tools/jsl.conf delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/node_modules/ctype/tools/jsstyle delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/http-signature/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/isstream/.jshintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/isstream/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/isstream/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/isstream/LICENSE.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/isstream/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/isstream/isstream.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/isstream/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/isstream/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/json-stringify-safe/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/json-stringify-safe/CHANGELOG.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/json-stringify-safe/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/json-stringify-safe/Makefile delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/json-stringify-safe/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/json-stringify-safe/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/json-stringify-safe/stringify.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/json-stringify-safe/test/mocha.opts delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/json-stringify-safe/test/stringify_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/mime-types/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/mime-types/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/mime-types/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/mime-types/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/mime-types/node_modules/mime-db/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/mime-types/node_modules/mime-db/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/mime-types/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/LICENSE.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/bench.sh delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/bin/uuid delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/bower.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/component.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/test/compare_v1.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/test/test.html delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/test/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/uuid.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/.eslintignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/CHANGELOG.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/CONTRIBUTING.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/bower.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/parse.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/stringify.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/test/parse.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/test/stringify.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/test/utils.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/LICENSE.txt delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/example.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/stringstream.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.editorconfig delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.jshintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.npmignore delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.travis.yml delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/lib/cookie.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/lib/memstore.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/lib/store.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/public-suffix.txt delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/api_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_jar_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_sorting_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_to_json_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_to_string_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/date_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/domain_and_path_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/bsd-examples.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/examples.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_data/parser.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/jar_serialization_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/lifetime_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/parsing_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/regression_test.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tunnel-agent/.jshintrc delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tunnel-agent/LICENSE delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tunnel-agent/README.md delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tunnel-agent/index.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tunnel-agent/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/package.json delete mode 100755 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/release.sh delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/request.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/package.json delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/public/.DS_Store delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/public/css/bootstrap.css delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/public/img/js.jpg delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/public/js/bootstrap.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/public/js/main.js delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/views/.DS_Store delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/views/404.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/views/500.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/views/about.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/views/index.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/views/layouts/.DS_Store delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/views/layouts/main.handlebars delete mode 100644 Excersizes/Loading Dynamic Content (Class 8)/views/search.handlebars delete mode 100644 Slide Content /.DS_Store delete mode 100644 Slide Content /Class 1- Overview.pdf delete mode 100644 Slide Content /Class 2 Re-intro to JavaScript and jQuery.pdf delete mode 100644 Slide Content /Class 3- Server-side scripting- conceptual.pdf delete mode 100644 Slide Content /Class 4- Install Fest.pdf delete mode 100644 Slide Content /Class 5- GitHub.pdf create mode 100644 Website_JS.html diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 4a2e570f0d43586dd3f512653573be4fab7f007e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHL%}*0S6n_so;snBwIGgkF~w!Ms`w^vyl@` zhiNCc9)IHn=4w6TM3XgrSO{-Hcia)q$~miTK=_fveHPS(j$h?|L6p;C+AoCTSvB8P zUWg`h*3L}8W+*h{_-urS+~ppR<`PNy$yx35^F952U3O1jPo>MA@9*#KvXAxlS1Q)q zL}KsZzEhXRN|gsso<4j2;^nJ%@8j(Q>iZD1s_zT^hn2|T`58?PeyNf3*|O^B*}P@z zHf#Hi*0!CycDL{8*t>6kM~9uWT3si9yBNrg4G2#JX>Xd1^1Se~{0S-|9H=d?5bqN% zn_e^7!1sh-B)g2=O25FPS7!xELK_A^fDaMrvbUF{;%)LT*QMgBvHxyL_EH)i?LEFE zB_I4|O0G(hNzMN>HCMeVmZT_U-5Qg1YCr9={y($w`~NkzYqK50fMKAX0c<{C}N<~KWU zGh+b2QY*LsU;{voszmE3HTNj8U)F&#qBTbdk^BJy3N%mEfpoyyC=3IJ0mFb{z%XDK zco-OS~^Mg%QVo_r^LzOzHQCk4QQBtcyGVKGDkFBw&v74cC zrI^|70ktdYEe2-p)Nf03!lK4*hM7BH<_@SwM!iEpH9Gm(${etmp=k{RhJir_@h5Wm!$;(09Y1{4sf)Igx@jvZ zx$zZs#{=eRx#Fhvp1dqXcvp7470%jKYkWaOsmmi4_qlGY@+c7Pl4wOivf*U$R(X)t ztJcX%%(lq2;zn$RC*0#9Pj_;8c~z~`ySuYC(pP4xG>~j+ncGVj5T>t%AEU8%#p@>Uii>+~AL=OLut)*-`l|t1zvCr-@ z3*OyRE$=kRW_(YfV!awO7G0^uJXqS?Ojx>BwT>lzEW)rN5}tAqt@rh=ZzMGLiz#a? zMw^00l+&`*lxE2aixa{D|Fv~Dj@_unN;_9W*JI&QR1#?_8q!imqd!DXuo}r}x;~F; zlP~|C&Bo>kTbFgYOPExfB-j@$;z=O>GAXtNy6_B^~!3$+ey_!K^e z8}L2cgkRwf{DGr*3ZKXGcoAR1SMW7_8{a`6Lu{bHZS3GR{3wev(tDrI_J+?8KOsDz z_i4+CqfkUO8bOYJ7TyFwX(XUT6G07ZD8mj(E;Mv9TA=<&r6bwyPdqQe)T5gK3NiuA z?N0zd{Ko_^1S-v9|DP`QA-p?b?SkWrMpLDb4=&690)`N^A=Sb4${rYK3PaEYV2l6 Z8Y&O`$AE|P0MP9J&0(Kf4-ew7?{7}5DRKY+ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /.DS_Store b/Excersizes/Build A Static Site With Express (Class 7) /.DS_Store deleted file mode 100644 index 57843fa2209c484d4630d3053b8726129ea0547a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMOK;Oa5S}S5B)sZAfYO3w=mkU%g@Vcj5yG<|)Ih3|&_b}2ZL-4kMz+&Xsz8pY z2YvuY-UogFX9Pb2F5D3ZPKYD3UZ)KSJ%LbBcdeaoGCMPCe_lVv0RT)^3P%A303b$P zqOpy{Z<-vJy{&abmM%i1cmNK0yXu#1N7!xN+MpTG3}^;41DXNNzTC`Kg) zs&E=Nr8{9F!n#5g4yeKbqnR^$;FriRO&46a0odH?9Z-z2dzy_zKe*a;Y z9qtFCqaU$jQ)k!aEwT94ZE`buw%$sYL^T~)LB&s6-c0z57nmLCDJv*7^eG{n72UF@ zIjiQ3{lNd#}+6wWw~sc``qRZ4;Eu_ zx#f&KOG{(NPL7yk$7&>tZ;kPG__bJpZ--tnCqg)m^)MScwusG z&Sya;XLS2{PdH9W_&ngk%{Gl@XMH+h69Jo_aOVWgD7l<0OE-U-c|KuVd?ssop5+!< za`Bd9+02=AlOhPjy!4dW=s=>g63&z^TY2slhfjY~gbpWC4dqazG=>aV^-@Cs!);33 zz!l?^Yt6HGd^m9>a*M$cI0Kg<4JD|;V|W5@;4OTBPw*AKV<+y$gLnjw<0-s=m+%_i z#5_7Uj{@&u4Ikh`m8YYz3Jx@;SBQ@Yf4MRi(w^%Gw@7vw(*+B3y)c^F*Xv`0u8*cQ z(6TzzBGOVbuznfXq;_pU*8k_%{{Fvy4?ypkW&hni3sZo$wKX)e+c-S?}z&NAD%-k{yzqO0z8R- A0ssI2 diff --git a/Excersizes/Build A Static Site With Express (Class 7) /app.js b/Excersizes/Build A Static Site With Express (Class 7) /app.js deleted file mode 100644 index 8a01512..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /app.js +++ /dev/null @@ -1,48 +0,0 @@ -var express = require('express'); - -var app = express(); - - -app.use(express.static(__dirname + '/public')); - - -//set up the server - -app.set('port', process.env.PORT || 3000) //listen to port 3000 - -//set up the views engine -var handlebars = require('express-handlebars') - .create({ defaultLayout:'main' }); - -app.engine('handlebars', handlebars.engine); -app.set('view engine', 'handlebars'); - - -app.use(express.static(__dirname + '/public')); //setup static file directory - -app.get('/', function(req, res){ //URL Routing for home - res.render('index'); -}); - - -app.get('/about', function(req, res){ //URL Routing for About - res.render('about'); -}); - -app.use(function(req, res, next){ - res.status(404); - res.render('404') -}); - - -app.use(function(err, req, res, next){ - console.error(err.stack); - res.status(500) - res.render('500'); -}); - -app.listen(app.get('port'), function(){ - console.log('Express started on http://localhost:' + - app.get('port') + '; press Ctrl-C to terminate.'); -}); // Terminal message when port is activated - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/.npmignore deleted file mode 100644 index d838da9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/.npmignore +++ /dev/null @@ -1 +0,0 @@ -examples/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/HISTORY.md deleted file mode 100644 index 8ef061f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/HISTORY.md +++ /dev/null @@ -1,363 +0,0 @@ -Express Handlebars Change History -================================= - -2.0.1 (2015-04-23) ------------------- - -* Guarded against unexpected Handlebars API change that was released in a patch. - ([#125][]) - - -[#125]: https://github.com/ericf/express-handlebars/issues/125 - - -2.0.0 (2015-03-22) ------------------- - -* __[!]__ Upgraded to Handlebars 3.0 by default, but still works with Handlebars - 2.x by using the `handlebars` config option. ([#105][]) - -* __[!]__ Removed using prototype properties for default config values. The - default values are now embedded in the constructor. ([#105][]) - -* __[!]__ Removed `handlebarsVersion` instance property and - `getHandlebarsSemver()` static function on the `ExpressHandlebars` - constructor. ([#105][]) - -* __[!]__ Replaced undocumented `compileTemplate()` hook with the protected but - supported `_compileTemplate()` and `_precompileTemplate()` hooks. ([#95][]) - -* Fixed layout path resolution on Windows. ([#113][] @Tineler) - -* Added `compilerOptions` config property which is passed along to - `Handlebars.compile()` and `Handlebars.precompile()`. ([#95][]) - -* Exposed Express Handlebars metadata to the data channel during render. This - metadata is accessible via `{{@exphbs.*}}` ([#89][], [#101][]) - -* Added new "protected" hooks for AOP-ing template compilation and rendering, - all of which can optionally return a Promise: ([#105][]) - - * `_compileTemplate()` - * `_precompileTemplate()` - * `_renderTemplate()` - - -[#89]: https://github.com/ericf/express-handlebars/issues/89 -[#95]: https://github.com/ericf/express-handlebars/issues/95 -[#101]: https://github.com/ericf/express-handlebars/issues/101 -[#105]: https://github.com/ericf/express-handlebars/issues/105 -[#113]: https://github.com/ericf/express-handlebars/issues/113 - - -1.2.2 (2015-03-06) ------------------- - -* Upgraded `glob` dependency to v5 which now officially supports symlinks via - the new `follow` option. ([#98][]) - - -1.2.1 (2015-02-17) ------------------- - -* Locked down `glob` dependency to a v4 version range that is known to work with - this package _and_ support symlinks. The `glob` version can be updated when - [isaacs/node-glob#139](https://github.com/isaacs/node-glob/issues/139) is - resolved. ([#98][] @adgad) - - -[#98]: https://github.com/ericf/express-handlebars/issues/98 - - -1.2.0 (2015-02-17) ------------------- - -* Added support for render-level `partials` to be specified when calling - `renderView()` (which is the method Express calls). The `options.partials` - value matches what Handlebars accepts during template rendering: it should - have the shape `{partialName: fn}` or be a Promise for such an object. - ([#82][]) - - -[#82]: https://github.com/ericf/express-handlebars/issues/82 - - -1.1.0 (2014-09-14) ------------------- - -* __[!]__ Upgraded Handlebars to 2.0.0 final, it was beta before. - -* Added support for `partialsDir` to be configured with a collection (or promise - for a collection) of templates, via the new `templates` prop in `partialDir` - config objects. This allows developers to hand Express Handlebars the compiled - partials templates to use for a specific partials dir. - ([#81][] @joanniclaborde) - -* Upgraded Promise dependency. - - -[#81]: https://github.com/ericf/express-handlebars/issues/81 - - -1.0.3 (2014-09-05) ------------------- - -* Fixed issue with namespaced partials dirs not actually being namespaces. - ([#76][] @inerte) - - -[#76]: https://github.com/ericf/express-handlebars/issues/76 - - -1.0.2 (2014-09-05) ------------------- - -* Fixed `engines` entry in `package.json` to Node `>=0.10` to reflect this - package's requirements. ([#78][]) - - -[#78]: https://github.com/ericf/express-handlebars/issues/78 - - -1.0.1 (2014-08-08) ------------------- - -* Fixed bug where rendered content was only be returned if a layout template was - being used. Now a layout-less render will actually return content. ([#73][]) - - -[#73]: https://github.com/ericf/express-handlebars/issues/73 - - -1.0.0 (2014-08-07) ------------------- - -* __[!]__ Renamed to: `express-handlebars`. ([#65][]) - -* __[!]__ Rewritten to use Promises instead of `async` for asynchronous code. - ([#68][]) This resulted in the following public API changes: - - * `loadPartials()` --> `getPartials()`, returns a Promise. - * `loadTemplate()` --> `getTemplate()`, returns a Promise. - * `loadTemplates()` --> `getTemplates()`, returns a Promise. - * `render(file, context, [options])`, returns a Promise. - - -* `partialsDir` can now be set with an array of objects in the following form to - support namespaced partials: ([#70][] @joanniclaborde) - - { dir: 'foo/bar/', namespace: 'bar' } - -* Added support for Handlebars' `data` channel via `options.data`. ([#62][]) - -* Added `compileTemplate()` hook for the pre/post compile process, this also - supports returning a Promise. ([#39][], [#41][]) - -* Added `_renderTemplate()` hook that supports returning a Promise. - ([#39][], [#41][]) - -* Upgraded all dependencies, including Handlebars to 2.x. ([#59][]) - -* Added `graceful-fs` dependency to support large numbers of files to avoid - EMFILE errors. - -* Reduced complexity of cache code. - -* Updated examples to each be self-contained and have `package.json` files. - - -[#39]: https://github.com/ericf/express-handlebars/issues/39 -[#41]: https://github.com/ericf/express-handlebars/issues/41 -[#59]: https://github.com/ericf/express-handlebars/issues/59 -[#62]: https://github.com/ericf/express-handlebars/issues/62 -[#65]: https://github.com/ericf/express-handlebars/issues/65 -[#68]: https://github.com/ericf/express-handlebars/issues/68 -[#70]: https://github.com/ericf/express-handlebars/issues/70 - - -0.5.1 (2014-08-05) ------------------- - -* __[!]__ Last release before `v1.0` which will have breaking changes. - -* Improved `extname` docs in README and added example. ([#30][] @Crashthatch) - -* `extname` can now be specified _without_ the leading `"."`. - ([#51][] @calvinmetcalf) - - -[#30]: https://github.com/ericf/express-handlebars/issues/30 -[#51]: https://github.com/ericf/express-handlebars/issues/51 - - -0.5.0 (2013-07-25) ------------------- - -* Added `loadTemplates()` method which will load all the templates in a - specified directory. ([#21][]) - -* Added support for multiple partials directories. This enables the - `partialsDir` configuration property to be specified as an *array* of - directories, and loads all of the templates in each one. - - This feature allows an app's partials to be split up in multiple directories, - which is common if an app has some shared partials which will also be exposed - to the client, and some server-side-only partials. ([#20][]) - -* Added runnable code examples in this package's "examples/" directory. - ([#22][]) - -* Improved optional argument handling in public methods to treat Express - `locals` function objects as `options` and not `callback` params to the method - being invoked. ([#27][]) - - -[#20]: https://github.com/ericf/express-handlebars/issues/20 -[#21]: https://github.com/ericf/express-handlebars/issues/21 -[#22]: https://github.com/ericf/express-handlebars/issues/22 -[#27]: https://github.com/ericf/express-handlebars/issues/27 - - -0.4.1 (2013-04-06) ------------------- - -* Updated `async` dependency to the latest stable minor version: "~0.2". - - -0.4.0 (2013-03-24) ------------------- - -* __[!]__ Removed the following "get" -> "load" aliases which kept in v0.2.0 for - back-compat: - - * `getPartials()` -> `loadPartials()` - * `getTemplate()` -> `loadTemplate()` - - This is the future version where these aliases have been removed. - -* __[!]__ Renamed `lib/express3-handlebars.js` -> `lib/express-handlebars.js`. - -* Exposed `getHandlebarsSemver()` function as a static property on the - `ExpressHandlebars` constructor. - -* Rearranged module exports by moving the engine factory function to `index.js`, - making the `lib/express3-handlebars.js` module only responsible for exporting - the `ExpressHandlebars` constructor. - - -0.3.3 (2013-03-22) ------------------- - -* Updated internal `_resolveLayoutPath()` method to take the full - `options`/locals objects which the view is rendered with. This makes it easier - to override. ([#14][]) - - -[#14]: https://github.com/ericf/express-handlebars/issues/14 - - -0.3.2 (2013-02-20) ------------------- - -* Transfered ownership and copyright to Yahoo! Inc. This software is still free - to use, and is now licensed under the Yahoo! Inc. BSD license. - - -0.3.1 (2013-02-18) ------------------- - -* Updated README with info about `options.helpers` for `render()` and - `renderView()` docs. ([#7][]) - - -[#7]: https://github.com/ericf/express-handlebars/issues/7 - - -0.3.0 (2013-02-18) ------------------- - -* Added support for render-level helpers, via `options.helpers`, to the - `render()` and `renderView()` methods. Handlebars' `registerHelper()` function - now works as expected and does not have to be called before the - `ExpressHandlebars` instance is created. Helpers are now merged from: - `handlebars.helpers` (global), `helpers` (instance), and `options.helpers` - (render-level) before a template is rendered; this provides flexibility at - all levels. ([#3][], [#11][]) - -* Added `handlebarsVersion` property which is the version number of `handlebars` - as a semver. This is used internally to branch on certain operations which - differ between Handlebars releases. - - -[#3]: https://github.com/ericf/express-handlebars/issues/3 -[#11]: https://github.com/ericf/express-handlebars/issues/11 - - -0.2.3 (2013-02-13) ------------------- - -* Fixed issue with naming nested partials when using the latest version of - Handlebars (1.0.rc.2). Previous versions require a hack to replace "/"s with - "."s in partial names, and the latest version of Handlebars fixes that bug. - This hack will only be applied to old versions of Handlebars. ([#9][]) - - -[#9]: https://github.com/ericf/express-handlebars/issues/9 - - -0.2.2 (2013-02-04) ------------------- - -* Updated README with the public method renames which happened v0.2.0. - - -0.2.1 (2013-02-04) ------------------- - -* `extname`, `layoutsDir`, and `partialsDir` property values will now reference - the values on the prototype unless an `ExpressHandlebars` instance is - constructed with config values for these properties. - -* Improved clarity of method implementations, and exposed more override "hooks" - via new private methods: `_getPartialName()`, `_renderTemplate()`, and - `_resolveLayoutPath()`. - - -0.2.0 (2013-02-01) ------------------- - -* __[!]__ Renamed methods prefixed with "get" to "load" for clarity: - - * `getPartials()` -> `loadPartials()` - * `getTemplate()` -> `loadTemplate()` - - Aliases for these methods have been created to maintain back-compat, but the - old method names are now deprecated will be removed in the future. ([#5][]) - -* All paths are resolved before checking in or adding to caches. ([#1][]) - -* Force `{precompiled: false}` option within `render()` and `renderView()` - methods to prevent trying to render with precompiled templates. ([#2][]) - - -[#1]: https://github.com/ericf/express-handlebars/issues/1 -[#2]: https://github.com/ericf/express-handlebars/issues/2 -[#5]: https://github.com/ericf/express-handlebars/issues/5 - - -0.1.2 (2013-01-10) ------------------- - -* Tweaked formatting of README documentation. - - -0.1.1 (2013-01-10) ------------------- - -* Added README documentation. - - -0.1.0 (2013-01-07) ------------------- - -* Initial release. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/LICENSE deleted file mode 100644 index 58708e7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2014, Yahoo Inc. All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following -conditions are met: - -* Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - -* Neither the name of Yahoo Inc. nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission of Yahoo Inc. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/README.md deleted file mode 100644 index 370881b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/README.md +++ /dev/null @@ -1,568 +0,0 @@ -Express Handlebars -================== - -A [Handlebars][] view engine for [Express][] which doesn't suck. - -[![npm version][npm-badge]][npm] -[![dependency status][dep-badge]][dep-status] - -**This package used to be named `express3-handlebars`. The previous `express-handlebars` package by @jneen can be found [here][jneen-exphbs].** - - -[Express]: https://github.com/visionmedia/express -[Handlebars]: https://github.com/wycats/handlebars.js -[npm]: https://www.npmjs.org/package/express-handlebars -[npm-badge]: https://img.shields.io/npm/v/express-handlebars.svg?style=flat-square -[dep-status]: https://david-dm.org/ericf/express-handlebars -[dep-badge]: https://img.shields.io/david/ericf/express-handlebars.svg?style=flat-square -[jneen-exphbs]: https://github.com/jneen/express-handlebars - - -## Goals & Design - -I created this project out of frustration with the existing Handlebars view engines for Express. As of version 3.x, Express got out of the business of being a generic view engine — this was a great decision — leaving developers to implement the concepts of layouts, partials, and doing file I/O for their template engines of choice. - -### Goals and Features - -After building a half-dozen Express apps, I developed requirements and opinions about what a Handlebars view engine should provide and how it should be implemented. The following is that list: - -* Add back the concept of "layout", which was removed in Express 3.x. - -* Add back the concept of "partials" via Handlebars' partials mechanism. - -* Support a directories of partials; e.g., `{{> foo/bar}}` which exists on the file system at `views/partials/foo/bar.handlebars`, by default. - -* Smart file system I/O and template caching. When in development, templates are always loaded from disk. In production, raw files and compiled templates are cached, including partials. - -* All async and non-blocking. File system I/O is slow and servers should not be blocked from handling requests while reading from disk. I/O queuing is used to avoid doing unnecessary work. - -* Ability to easily precompiled templates and partials for use on the client, enabling template sharing and reuse. - -* Ability to use a different Handlebars module/implementation other than the Handlebars npm package. - -### Package Design - -This package was designed to work great for both the simple and complex use cases. I _intentionally_ made sure the full implementation is exposed and is easily overridable. - -The package exports a function which can be invoked with no arguments or with a `config` object and it will return a function (closed over sane defaults) which can be registered with an Express app. It's an engine factory function. - -This exported engine factory has two properties which expose the underlying implementation: - -* `ExpressHandlebars()`: The constructor function which holds the internal implementation on its `prototype`. This produces instance objects which store their configuration, `compiled` and `precompiled` templates, and expose an `engine()` function which can be registered with an Express app. - -* `create()`: A convenience factory function for creating `ExpressHandlebars` instances. - -An instance-based approach is used so that multiple `ExpressHandlebars` instances can be created with their own configuration, templates, partials, and helpers. - - -## Installation - -Install using npm: - -```shell -$ npm install express-handlebars -``` - - -## Usage - -This view engine uses sane defaults that leverage the "Express-way" of structuring an app's views. This makes it trivial to use in basic apps: - -### Basic Usage - -**Directory Structure:** - -``` -. -├── app.js -└── views - ├── home.handlebars - └── layouts - └── main.handlebars - -2 directories, 3 files -``` - -**app.js:** - -Creates a super simple Express app which shows the basic way to register a Handlebars view engine using this package. - -```javascript -var express = require('express'); -var exphbs = require('express-handlebars'); - -var app = express(); - -app.engine('handlebars', exphbs({defaultLayout: 'main'})); -app.set('view engine', 'handlebars'); - -app.get('/', function (req, res) { - res.render('home'); -}); - -app.listen(3000); -``` - -**views/layouts/main.handlebars:** - -The main layout is the HTML page wrapper which can be reused for the different views of the app. `{{{body}}}` is used as a placeholder for where the main content should be rendered. - -```handlebars - - - - - Example App - - - - {{{body}}} - - - -``` - -**views/home.handlebars:** - -The content for the app's home view which will be rendered into the layout's `{{{body}}}`. - -```handlebars -

Example App: Home

-``` - -#### Running the Example - -The above example is bundled in this package's [examples directory][], where it can be run by: - -```shell -$ cd examples/basic/ -$ npm install -$ npm start -``` - -### Using Instances - -Another way to use this view engine is to create an instance(s) of `ExpressHandlebars`, allowing access to the full API: - -```javascript -var express = require('express'); -var exphbs = require('express-handlebars'); - -var app = express(); -var hbs = exphbs.create({ /* config */ }); - -// Register `hbs.engine` with the Express app. -app.engine('handlebars', hbs.engine); -app.set('view engine', 'handlebars'); - -// ...still have a reference to `hbs`, on which methods like `loadPartials()` -// can be called. -``` - -**Note:** The [Advanced Usage][] example demonstrates how `ExpressHandlebars` instances can be leveraged. - -### Template Caching - -This view engine uses a smart template caching strategy. In development, templates will always be loaded from disk, i.e., no caching. In production, raw files and compiled Handlebars templates are aggressively cached. - -The easiest way to control template/view caching is through Express' [view cache setting][]: - -```javascript -app.enable('view cache'); -``` - -Express enables this setting by default when in production mode, i.e.: - -``` -process.env.NODE_ENV === "production" -``` - -**Note:** All of the public API methods accept `options.cache`, which gives control over caching when calling these methods directly. - -### Layouts - -A layout is simply a Handlebars template with a `{{{body}}}` placeholder. Usually it will be an HTML page wrapper into which views will be rendered. - -This view engine adds back the concept of "layout", which was removed in Express 3.x. It can be configured with a path to the layouts directory, by default it's set to `"views/layouts/"`. - -There are two ways to set a default layout: configuring the view engine's `defaultLayout` property, or setting [Express locals][] `app.locals.layout`. - -The layout into which a view should be rendered can be overridden per-request by assigning a different value to the `layout` request local. The following will render the "home" view with no layout: - -```javascript -app.get('/', function (req, res, next) { - res.render('home', {layout: false}); -}); -``` - -### Helpers - -Helper functions, or "helpers" are functions that can be [registered with Handlebars][] and can be called within a template. Helpers can be used for transforming output, iterating over data, etc. To keep with the spirit of *logic-less* templates, helpers are the place where logic should be defined. - -Handlebars ships with some [built-in helpers][], such as: `with`, `if`, `each`, etc. Most application will need to extend this set of helpers to include app-specific logic and transformations. Beyond defining global helpers on `Handlebars`, this view engine supports `ExpressHandlebars` instance-level helpers via the `helpers` configuration property, and render-level helpers via `options.helpers` when calling the `render()` and `renderView()` methods. - -The following example shows helpers being specified at each level: - -**app.js:** - -Creates a super simple Express app which shows the basic way to register `ExpressHandlebars` instance-level helpers, and override one at the render-level. - -```javascript -var express = require('express'); -var exphbs = require('express-handlebars'); - -var app = express(); - -var hbs = exphbs.create({ - // Specify helpers which are only registered on this instance. - helpers: { - foo: function () { return 'FOO!'; }, - bar: function () { return 'BAR!'; } - } -}); - -app.engine('handlebars', hbs.engine); -app.set('view engine', 'handlebars'); - -app.get('/', function (req, res, next) { - res.render('home', { - showTitle: true, - - // Override `foo` helper only for this rendering. - helpers: { - foo: function () { return 'foo.'; } - } - }); -}); - -app.listen(3000); -``` - -**views/home.handlebars:** - -The app's home view which uses helper functions to help render the contents. - -```handlebars - - - - - Example App - Home - - - - - {{#if showTitle}} -

Home

- {{/if}} - - -

{{foo}}

- - -

{{bar}}

- - - -``` - -#### More on Helpers - -Refer to the [Handlebars website][] for more information on defining helpers: - -* [Expression Helpers][] -* [Block Helpers][] - -### Metadata - -Handlebars has a data channel feature that propagates data through all scopes, including helpers and partials. Values in the data channel can be accessed via the `{{@variable}}` syntax. Express Handlebars provides metadata about a template it renders on a `{{@exphbs}}` object allowing access to things like the view name passed to `res.render()` via `{{@exphbs.view}}`. - -The following is the list of metadata that's accessible on the `{{@exphbs}}` data object: - -* `cache`: Boolean whether or not the template is cached. -* `view`: String name of the view passed to `res.render()`. -* `layout`: String name of the layout view. -* `data`: Original data object passed when rendering the template. -* `helpers`: Collection of helpers used when rendering the template. -* `partials`: Collection of partials used when rendering the template. - - -[examples directory]: https://github.com/ericf/express-handlebars/tree/master/examples -[view cache setting]: http://expressjs.com/api.html#app-settings -[Express locals]: http://expressjs.com/api.html#app.locals -[registered with Handlebars]: https://github.com/wycats/handlebars.js/#registering-helpers -[built-in helpers]: http://handlebarsjs.com/#builtins -[Handlebars website]: http://handlebarsjs.com/ -[Expression Helpers]: http://handlebarsjs.com/expressions.html#helpers -[Block Helpers]: http://handlebarsjs.com/block_helpers.html - - -## API - -### Configuration and Defaults - -There are two main ways to use this package: via its engine factory function, or creating `ExpressHandlebars` instances; both use the same configuration properties and defaults. - -```javascript -var exphbs = require('express-handlebars'); - -// Using the engine factory: -exphbs({ /* config */ }); - -// Create an instance: -exphbs.create({ /* config */ }); -``` - -The following is the list of configuration properties and their default values (if any): - -#### `handlebars=require('handlebars')` -The Handlebars module/implementation. This allows for the `ExpressHandlebars` instance to use a different Handlebars module/implementation than that provided by the Handlebars npm package. - -#### `extname=".handlebars"` -The string name of the file extension used by the templates. This value should correspond with the `extname` under which this view engine is registered with Express when calling `app.engine()`. - -The following example sets up an Express app to use `.hbs` as the file extension for views: - -```javascript -var express = require('express'); -var exphbs = require('express-handlebars'); - -var app = express(); - -app.engine('.hbs', exphbs({extname: '.hbs'})); -app.set('view engine', '.hbs'); -``` - -**Note:** Setting the app's `"view engine"` setting will make that value the default file extension used for looking up views. - -#### `layoutsDir="views/layouts/"` -The string path to the directory where the layout templates reside. - -**Note:** If you configure Express to look for views in a custom location (e.g., `app.set('views', 'some/path/')`), you will need to reflect that by passing an updated path as the `layoutsDir` property in your configuration. - -#### `partialsDir="views/partials/"` -The string path to the directory where the partials templates reside or object with the following properties: - -* `dir`: The string path to the directory where the partials templates reside. -* `namespace`: Optional string namespace to prefix the partial names. -* `templates`: Optional collection (or promise of a collection) of templates in the form: `{filename: template}`. - -**Note:** If you configure Express to look for views in a custom location (e.g., `app.set('views', 'some/path/')`), you will need to reflect that by passing an updated path as the `partialsDir` property in your configuration. - -**Note:** Multiple partials dirs can be used by making `partialsDir` an array of strings, and/or config objects as described above. The namespacing feature is useful if multiple partials dirs are used and their file paths might clash. - -#### `defaultLayout` -The string name or path of a template in the `layoutsDir` to use as the default layout. This is overridden by a `layout` specified in the app or response `locals`. **Note:** A falsy value will render without a layout; e.g., `res.render('home', {layout: false});`. - -#### `helpers` -An object which holds the helper functions used when rendering templates with this `ExpressHandlebars` instance. When rendering a template, a collection of helpers will be generated by merging: `handlebars.helpers` (global), `helpers` (instance), and `options.helpers` (render-level). This allows Handlebars' `registerHelper()` function to operate as expected, will providing two extra levels over helper overrides. - -#### `compilerOptions` -An object which holds options that will be passed along to the Handlebars compiler functions: `Handlebars.compile()` and `Handlebars.precompile()`. - -### Properties - -The public API properties are provided via `ExpressHandlebars` instances. In additional to the properties listed in the **Configuration and Defaults** section, the following are additional public properties: - -#### `engine` -A function reference to the `renderView()` method which is bound to `this` `ExpressHandlebars` instance. This bound function should be used when registering this view engine with an Express app. - -#### `extname` -The normalized `extname` which will _always_ start with `.` and defaults to `.handlebars`. - -#### `compiled` -An object cache which holds compiled Handlebars template functions in the format: `{"path/to/template": [Function]}`. - -#### `precompiled` -An object cache which holds precompiled Handlebars template strings in the format: `{"path/to/template": [String]}`. - -### Methods - -The following is the list of public API methods provided via `ExpressHandlebars` instances: - -**Note:** All of the public methods return a [`Promise`][promise] (with the exception of `renderView()` which is the interface with Express.) - -#### `getPartials([options])` -Retrieves the partials in the `partialsDir` and returns a Promise for an object mapping the partials in the form `{name: partial}`. - -By default each partial will be a compiled Handlebars template function. Use `options.precompiled` to receive the partials as precompiled templates — this is useful for sharing templates with client code. - -**Parameters:** - -* `[options]`: Optional object containing any of the following properties: - - * `[cache]`: Whether cached templates can be used if they have already been requested. This is recommended for production to avoid unnecessary file I/O. - - * `[precompiled=false]`: Whether precompiled templates should be provided, instead of compiled Handlebars template functions. - -The name of each partial corresponds to its location in `partialsDir`. For example, consider the following directory structure: - -``` -views -└── partials - ├── foo - │   └── bar.handlebars - └── title.handlebars - -2 directories, 2 files -``` - -`getPartials()` would produce the following result: - -```javascript -var hbs = require('express-handlebars').create(); - -hbs.getPartials().then(function (partials) { - console.log(partials); - // => { 'foo/bar': [Function], - // => title: [Function] } -}); -``` - -#### `getTemplate(filePath, [options])` -Retrieves the template at the specified `filePath` and returns a Promise for the compiled Handlebars template function. - -Use `options.precompiled` to receive a precompiled Handlebars template. - -**Parameters:** - -* `filePath`: String path to the Handlebars template file. - -* `[options]`: Optional object containing any of the following properties: - - * `[cache]`: Whether a cached template can be used if it have already been requested. This is recommended for production to avoid necessary file I/O. - - * `[precompiled=false]`: Whether a precompiled template should be provided, instead of a compiled Handlebars template function. - -#### `getTemplates(dirPath, [options])` -Retrieves the all the templates in the specified `dirPath` and returns a Promise for an object mapping the compiled templates in the form `{filename: template}`. - -Use `options.precompiled` to receive precompiled Handlebars templates — this is useful for sharing templates with client code. - -**Parameters:** - -* `dirPath`: String path to the directory containing Handlebars template files. - -* `[options]`: Optional object containing any of the following properties: - - * `[cache]`: Whether cached templates can be used if it have already been requested. This is recommended for production to avoid necessary file I/O. - - * `[precompiled=false]`: Whether precompiled templates should be provided, instead of a compiled Handlebars template function. - -#### `render(filePath, context, [options])` -Renders the template at the specified `filePath` with the `context`, using this instance's `helpers` and partials by default, and returns a Promise for the resulting string. - -**Parameters:** - -* `filePath`: String path to the Handlebars template file. - -* `context`: Object in which the template will be executed. This contains all of the values to fill into the template. - -* `[options]`: Optional object which can contain any of the following properties which affect this view engine's behavior: - - * `[cache]`: Whether a cached template can be used if it have already been requested. This is recommended for production to avoid unnecessary file I/O. - - * `[data]`: Optional object which can contain any data that Handlebars will pipe through the template, all helpers, and all partials. This is a side data channel. - - * `[helpers]`: Render-level helpers that will be used instead of any instance-level helpers; these will be merged with (and will override) any global Handlebars helper functions. - - * `[partials]`: Render-level partials that will be used instead of any instance-level partials. This is used internally as an optimization to avoid re-loading all the partials. - -#### `renderView(viewPath, options|callback, [callback])` -Renders the template at the specified `viewPath` as the `{{{body}}}` within the layout specified by the `defaultLayout` or `options.layout`. Rendering will use this instance's `helpers` and partials, and passes the resulting string to the `callback`. - -This method is called by Express and is the main entry point into this Express view engine implementation. It adds the concept of a "layout" and delegates rendering to the `render()` method. - -The `options` will be used both as the context in which the Handlebars templates are rendered, and to signal this view engine on how it should behave, e.g., `options.cache=false` will load _always_ load the templates from disk. - -**Parameters:** - -* `viewPath`: String path to the Handlebars template file which should serve as the `{{{body}}}` when using a layout. - -* `[options]`: Optional object which will serve as the context in which the Handlebars templates are rendered. It may also contain any of the following properties which affect this view engine's behavior: - - * `[cache]`: Whether cached templates can be used if they have already been requested. This is recommended for production to avoid unnecessary file I/O. - - * `[data]`: Optional object which can contain any data that Handlebars will pipe through the template, all helpers, and all partials. This is a side data channel. - - * `[helpers]`: Render-level helpers that will be merged with (and will override) instance and global helper functions. - - * `[partials]`: Render-level partials will be merged with (and will override) instance and global partials. This should be a `{partialName: fn}` hash or a Promise of an object with this shape. - - * `[layout]`: Optional string path to the Handlebars template file to be used as the "layout". This overrides any `defaultLayout` value. Passing a falsy value will render with no layout (even if a `defaultLayout` is defined). - -* `callback`: Function to call once the template is retrieved. - -### Hooks - -The following is the list of protected methods that are called internally and serve as _hooks_ to override functionality of `ExpressHandlebars` instances. A value or a promise can be returned from these methods which allows them to perform async operations. - -#### `_compileTemplate(template, options)` -This hook will be called when a Handlebars template needs to be compiled. This function needs to return a compiled Handlebars template function, or a promise for one. - -By default this hook calls `Handlebars.compile()`, but it can be overridden to preform operations before and/or after Handlebars compiles the template. This is useful if you wanted to first process Markdown within a Handlebars template. - -**Parameters:** - -* `template`: String Handlebars template that needs to be compiled. - -* `options`: Object `compilerOptions` that were specified when the `ExpressHandlebars` instance as created. This object should be passed along to the `Handlebars.compile()` function. - -#### `_precompileTemplate(template, options)` -This hook will be called when a Handlebars template needs to be precompiled. This function needs to return a serialized Handlebars template spec. string, or a promise for one. - -By default this hook calls `Handlebars.precompile()`, but it can be overridden to preform operations before and/or after Handlebars precompiles the template. This is useful if you wanted to first process Markdown within a Handlebars template. - -**Parameters:** - -* `template`: String Handlebars template that needs to be precompiled. - -* `options`: Object `compilerOptions` that were specified when the `ExpressHandlebars` instance as created. This object should be passed along to the `Handlebars.compile()` function. - -#### `_renderTemplate(template, context, options)` -This hook will be called when a compiled Handlebars template needs to be rendered. This function needs to returned the rendered output string, or a promise for one. - -By default this hook simply calls the passed-in `template` with the `context` and `options` arguments, but it can be overridden to perform operations before and/or after rendering the template. - -**Parameters:** - -* `template`: Compiled Handlebars template function to call. - -* `context`: The context object in which to render the `template`. - -* `options`: Object that contains options and metadata for rendering the template: - - * `data`: Object to define custom `@variable` private variables. - - * `helpers`: Object to provide custom helpers in addition to the globally defined helpers. - - * `partials`: Object to provide custom partials in addition to the globally defined partials. - - -[promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise - - -## Examples - -### [Basic Usage][] - -This example shows the most basic way to use this view engine. - -### [Advanced Usage][] - -This example is more comprehensive and shows how to use many of the features of this view engine, including helpers, partials, multiple layouts, etc. - -As noted in the **Package Design** section, this view engine's implementation is instance-based, and more advanced usages can take advantage of this. The Advanced Usage example demonstrates how to use an `ExpressHandlebars` instance to share templates with the client, among other features. - - -[Basic Usage]: https://github.com/ericf/express-handlebars/tree/master/examples/basic -[Advanced Usage]: https://github.com/ericf/express-handlebars/tree/master/examples/advanced - - -License -------- - -This software is free to use under the Yahoo! Inc. BSD license. See the [LICENSE file][] for license text and copyright information. - - -[LICENSE file]: https://github.com/ericf/express-handlebars/blob/master/LICENSE diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/index.js deleted file mode 100644 index b1f6dd5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/index.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2014, Yahoo Inc. All rights reserved. - * Copyrights licensed under the New BSD License. - * See the accompanying LICENSE file for terms. - */ - -'use strict'; - -var ExpressHandlebars = require('./lib/express-handlebars'); - -exports = module.exports = exphbs; -exports.create = create; -exports.ExpressHandlebars = ExpressHandlebars; - -// ----------------------------------------------------------------------------- - -function exphbs(config) { - return create(config).engine; -} - -function create(config) { - return new ExpressHandlebars(config); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/lib/express-handlebars.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/lib/express-handlebars.js deleted file mode 100644 index 1894e4f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/lib/express-handlebars.js +++ /dev/null @@ -1,340 +0,0 @@ -/* - * Copyright (c) 2015, Yahoo Inc. All rights reserved. - * Copyrights licensed under the New BSD License. - * See the accompanying LICENSE file for terms. - */ - -'use strict'; - -var Promise = global.Promise || require('promise'); - -var glob = require('glob'); -var Handlebars = require('handlebars'); -var fs = require('graceful-fs'); -var path = require('path'); - -var utils = require('./utils'); - -module.exports = ExpressHandlebars; - -// ----------------------------------------------------------------------------- - -function ExpressHandlebars(config) { - // Config properties with defaults. - utils.assign(this, { - handlebars : Handlebars, - extname : '.handlebars', - layoutsDir : 'views/layouts/', - partialsDir : 'views/partials/', - defaultLayout : undefined, - helpers : undefined, - compilerOptions: undefined, - }, config); - - // Express view engine integration point. - this.engine = this.renderView.bind(this); - - // Normalize `extname`. - if (this.extname.charAt(0) !== '.') { - this.extname = '.' + this.extname; - } - - // Internal caches of compiled and precompiled templates. - this.compiled = Object.create(null); - this.precompiled = Object.create(null); - - // Private internal file system cache. - this._fsCache = Object.create(null); -} - -ExpressHandlebars.prototype.getPartials = function (options) { - var partialsDirs = Array.isArray(this.partialsDir) ? - this.partialsDir : [this.partialsDir]; - - partialsDirs = partialsDirs.map(function (dir) { - var dirPath; - var dirTemplates; - var dirNamespace; - - // Support `partialsDir` collection with object entries that contain a - // templates promise and a namespace. - if (typeof dir === 'string') { - dirPath = dir; - } else if (typeof dir === 'object') { - dirTemplates = dir.templates; - dirNamespace = dir.namespace; - dirPath = dir.dir; - } - - // We must have some path to templates, or templates themselves. - if (!(dirPath || dirTemplates)) { - throw new Error('A partials dir must be a string or config object'); - } - - // Make sure we're have a promise for the templates. - var templatesPromise = dirTemplates ? Promise.resolve(dirTemplates) : - this.getTemplates(dirPath, options); - - return templatesPromise.then(function (templates) { - return { - templates: templates, - namespace: dirNamespace, - }; - }); - }, this); - - return Promise.all(partialsDirs).then(function (dirs) { - var getTemplateName = this._getTemplateName.bind(this); - - return dirs.reduce(function (partials, dir) { - var templates = dir.templates; - var namespace = dir.namespace; - var filePaths = Object.keys(templates); - - filePaths.forEach(function (filePath) { - var partialName = getTemplateName(filePath, namespace); - partials[partialName] = templates[filePath]; - }); - - return partials; - }, {}); - }.bind(this)); -}; - -ExpressHandlebars.prototype.getTemplate = function (filePath, options) { - filePath = path.resolve(filePath); - options || (options = {}); - - var precompiled = options.precompiled; - var cache = precompiled ? this.precompiled : this.compiled; - var template = options.cache && cache[filePath]; - - if (template) { - return template; - } - - // Optimistically cache template promise to reduce file system I/O, but - // remove from cache if there was a problem. - template = cache[filePath] = this._getFile(filePath, {cache: options.cache}) - .then(function (file) { - if (precompiled) { - return this._precompileTemplate(file, this.compilerOptions); - } - - return this._compileTemplate(file, this.compilerOptions); - }.bind(this)); - - return template.catch(function (err) { - delete cache[filePath]; - throw err; - }); -}; - -ExpressHandlebars.prototype.getTemplates = function (dirPath, options) { - options || (options = {}); - var cache = options.cache; - - return this._getDir(dirPath, {cache: cache}).then(function (filePaths) { - var templates = filePaths.map(function (filePath) { - return this.getTemplate(path.join(dirPath, filePath), options); - }, this); - - return Promise.all(templates).then(function (templates) { - return filePaths.reduce(function (hash, filePath, i) { - hash[filePath] = templates[i]; - return hash; - }, {}); - }); - }.bind(this)); -}; - -ExpressHandlebars.prototype.render = function (filePath, context, options) { - options || (options = {}); - - return Promise.all([ - this.getTemplate(filePath, {cache: options.cache}), - options.partials || this.getPartials({cache: options.cache}), - ]).then(function (templates) { - var template = templates[0]; - var partials = templates[1]; - var helpers = options.helpers || this.helpers; - - // Add ExpressHandlebars metadata to the data channel so that it's - // accessible within the templates and helpers, namespaced under: - // `@exphbs.*` - var data = utils.assign({}, options.data, { - exphbs: utils.assign({}, options, { - filePath: filePath, - helpers : helpers, - partials: partials, - }), - }); - - return this._renderTemplate(template, context, { - data : data, - helpers : helpers, - partials: partials, - }); - }.bind(this)); -}; - -ExpressHandlebars.prototype.renderView = function (viewPath, options, callback) { - options || (options = {}); - - var context = options; - - // Express provides `settings.views` which is the path to the views dir that - // the developer set on the Express app. When this value exists, it's used - // to compute the view's name. - var view; - var viewsPath = options.settings && options.settings.views; - if (viewsPath) { - view = this._getTemplateName(path.relative(viewsPath, viewPath)); - } - - // Merge render-level and instance-level helpers together. - var helpers = utils.assign({}, this.helpers, options.helpers); - - // Merge render-level and instance-level partials together. - var partials = Promise.all([ - this.getPartials({cache: options.cache}), - Promise.resolve(options.partials), - ]).then(function (partials) { - return utils.assign.apply(null, [{}].concat(partials)); - }); - - // Pluck-out ExpressHandlebars-specific options and Handlebars-specific - // rendering options. - options = { - cache : options.cache, - view : view, - layout: 'layout' in options ? options.layout : this.defaultLayout, - - data : options.data, - helpers : helpers, - partials: partials, - }; - - this.render(viewPath, context, options) - .then(function (body) { - var layoutPath = this._resolveLayoutPath(options.layout); - - if (layoutPath) { - return this.render( - layoutPath, - utils.assign({}, context, {body: body}), - utils.assign({}, options, {layout: undefined}) - ); - } - - return body; - }.bind(this)) - .then(utils.passValue(callback)) - .catch(utils.passError(callback)); -}; - -// -- Protected Hooks ---------------------------------------------------------- - -ExpressHandlebars.prototype._compileTemplate = function (template, options) { - return this.handlebars.compile(template, options); -}; - -ExpressHandlebars.prototype._precompileTemplate = function (template, options) { - return this.handlebars.precompile(template, options); -}; - -ExpressHandlebars.prototype._renderTemplate = function (template, context, options) { - return template(context, options); -}; - -// -- Private ------------------------------------------------------------------ - -ExpressHandlebars.prototype._getDir = function (dirPath, options) { - dirPath = path.resolve(dirPath); - options || (options = {}); - - var cache = this._fsCache; - var dir = options.cache && cache[dirPath]; - - if (dir) { - return dir.then(function (dir) { - return dir.concat(); - }); - } - - var pattern = '**/*' + this.extname; - - // Optimistically cache dir promise to reduce file system I/O, but remove - // from cache if there was a problem. - dir = cache[dirPath] = new Promise(function (resolve, reject) { - glob(pattern, { - cwd : dirPath, - follow: true - }, function (err, dir) { - if (err) { - reject(err); - } else { - resolve(dir); - } - }); - }); - - return dir.then(function (dir) { - return dir.concat(); - }).catch(function (err) { - delete cache[dirPath]; - throw err; - }); -}; - -ExpressHandlebars.prototype._getFile = function (filePath, options) { - filePath = path.resolve(filePath); - options || (options = {}); - - var cache = this._fsCache; - var file = options.cache && cache[filePath]; - - if (file) { - return file; - } - - // Optimistically cache file promise to reduce file system I/O, but remove - // from cache if there was a problem. - file = cache[filePath] = new Promise(function (resolve, reject) { - fs.readFile(filePath, 'utf8', function (err, file) { - if (err) { - reject(err); - } else { - resolve(file); - } - }); - }); - - return file.catch(function (err) { - delete cache[filePath]; - throw err; - }); -}; - -ExpressHandlebars.prototype._getTemplateName = function (filePath, namespace) { - var extRegex = new RegExp(this.extname + '$'); - var name = filePath.replace(extRegex, ''); - - if (namespace) { - name = namespace + '/' + name; - } - - return name; -}; - -ExpressHandlebars.prototype._resolveLayoutPath = function (layoutPath) { - if (!layoutPath) { - return null; - } - - if (!path.extname(layoutPath)) { - layoutPath += this.extname; - } - - return path.resolve(this.layoutsDir, layoutPath); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/lib/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/lib/utils.js deleted file mode 100644 index a16da39..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/lib/utils.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2014, Yahoo Inc. All rights reserved. - * Copyrights licensed under the New BSD License. - * See the accompanying LICENSE file for terms. - */ - -'use strict'; - -exports.assign = Object.assign || require('object.assign'); -exports.passError = passError; -exports.passValue = passValue; - -// ----------------------------------------------------------------------------- - -function passError(callback) { - return function (reason) { - setImmediate(function () { - callback(reason); - }); - }; -} - -function passValue(callback) { - return function (value) { - setImmediate(function () { - callback(null, value); - }); - }; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/.bin/handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/.bin/handlebars deleted file mode 120000 index fb7d090..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/.bin/handlebars +++ /dev/null @@ -1 +0,0 @@ -../handlebars/bin/handlebars \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/README.md deleted file mode 100644 index 063cf95..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/README.md +++ /dev/null @@ -1,377 +0,0 @@ -[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Dependency Status](https://david-dm.org/isaacs/node-glob.svg)](https://david-dm.org/isaacs/node-glob) [![devDependency Status](https://david-dm.org/isaacs/node-glob/dev-status.svg)](https://david-dm.org/isaacs/node-glob#info=devDependencies) [![optionalDependency Status](https://david-dm.org/isaacs/node-glob/optional-status.svg)](https://david-dm.org/isaacs/node-glob#info=optionalDependencies) - -# Glob - -Match files using the patterns the shell uses, like stars and stuff. - -This is a glob implementation in JavaScript. It uses the `minimatch` -library to do its matching. - -![](oh-my-glob.gif) - -## Usage - -```javascript -var glob = require("glob") - -// options is optional -glob("**/*.js", options, function (er, files) { - // files is an array of filenames. - // If the `nonull` option is set, and nothing - // was found, then files is ["**/*.js"] - // er is an error object or null. -}) -``` - -## Glob Primer - -"Globs" are the patterns you type when you do stuff like `ls *.js` on -the command line, or put `build/*` in a `.gitignore` file. - -Before parsing the path part patterns, braced sections are expanded -into a set. Braced sections start with `{` and end with `}`, with any -number of comma-delimited sections within. Braced sections may contain -slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`. - -The following characters have special magic meaning when used in a -path portion: - -* `*` Matches 0 or more characters in a single path portion -* `?` Matches 1 character -* `[...]` Matches a range of characters, similar to a RegExp range. - If the first character of the range is `!` or `^` then it matches - any character not in the range. -* `!(pattern|pattern|pattern)` Matches anything that does not match - any of the patterns provided. -* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the - patterns provided. -* `+(pattern|pattern|pattern)` Matches one or more occurrences of the - patterns provided. -* `*(a|b|c)` Matches zero or more occurrences of the patterns provided -* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns - provided -* `**` If a "globstar" is alone in a path portion, then it matches - zero or more directories and subdirectories searching for matches. - It does not crawl symlinked directories. - -### Dots - -If a file or directory path portion has a `.` as the first character, -then it will not match any glob pattern unless that pattern's -corresponding path part also has a `.` as its first character. - -For example, the pattern `a/.*/c` would match the file at `a/.b/c`. -However the pattern `a/*/c` would not, because `*` does not start with -a dot character. - -You can make glob treat dots as normal characters by setting -`dot:true` in the options. - -### Basename Matching - -If you set `matchBase:true` in the options, and the pattern has no -slashes in it, then it will seek for any file anywhere in the tree -with a matching basename. For example, `*.js` would match -`test/simple/basic.js`. - -### Negation - -The intent for negation would be for a pattern starting with `!` to -match everything that *doesn't* match the supplied pattern. However, -the implementation is weird, and for the time being, this should be -avoided. The behavior is deprecated in version 5, and will be removed -entirely in version 6. - -### Empty Sets - -If no matching files are found, then an empty array is returned. This -differs from the shell, where the pattern itself is returned. For -example: - - $ echo a*s*d*f - a*s*d*f - -To get the bash-style behavior, set the `nonull:true` in the options. - -### See Also: - -* `man sh` -* `man bash` (Search for "Pattern Matching") -* `man 3 fnmatch` -* `man 5 gitignore` -* [minimatch documentation](https://github.com/isaacs/minimatch) - -## glob.hasMagic(pattern, [options]) - -Returns `true` if there are any special characters in the pattern, and -`false` otherwise. - -Note that the options affect the results. If `noext:true` is set in -the options object, then `+(a|b)` will not be considered a magic -pattern. If the pattern has a brace expansion, like `a/{b/c,x/y}` -then that is considered magical, unless `nobrace:true` is set in the -options. - -## glob(pattern, [options], cb) - -* `pattern` {String} Pattern to be matched -* `options` {Object} -* `cb` {Function} - * `err` {Error | null} - * `matches` {Array} filenames found matching the pattern - -Perform an asynchronous glob search. - -## glob.sync(pattern, [options]) - -* `pattern` {String} Pattern to be matched -* `options` {Object} -* return: {Array} filenames found matching the pattern - -Perform a synchronous glob search. - -## Class: glob.Glob - -Create a Glob object by instantiating the `glob.Glob` class. - -```javascript -var Glob = require("glob").Glob -var mg = new Glob(pattern, options, cb) -``` - -It's an EventEmitter, and starts walking the filesystem to find matches -immediately. - -### new glob.Glob(pattern, [options], [cb]) - -* `pattern` {String} pattern to search for -* `options` {Object} -* `cb` {Function} Called when an error occurs, or matches are found - * `err` {Error | null} - * `matches` {Array} filenames found matching the pattern - -Note that if the `sync` flag is set in the options, then matches will -be immediately available on the `g.found` member. - -### Properties - -* `minimatch` The minimatch object that the glob uses. -* `options` The options object passed in. -* `aborted` Boolean which is set to true when calling `abort()`. There - is no way at this time to continue a glob search after aborting, but - you can re-use the statCache to avoid having to duplicate syscalls. -* `cache` Convenience object. Each field has the following possible - values: - * `false` - Path does not exist - * `true` - Path exists - * `'DIR'` - Path exists, and is not a directory - * `'FILE'` - Path exists, and is a directory - * `[file, entries, ...]` - Path exists, is a directory, and the - array value is the results of `fs.readdir` -* `statCache` Cache of `fs.stat` results, to prevent statting the same - path multiple times. -* `symlinks` A record of which paths are symbolic links, which is - relevant in resolving `**` patterns. -* `realpathCache` An optional object which is passed to `fs.realpath` - to minimize unnecessary syscalls. It is stored on the instantiated - Glob object, and may be re-used. - -### Events - -* `end` When the matching is finished, this is emitted with all the - matches found. If the `nonull` option is set, and no match was found, - then the `matches` list contains the original pattern. The matches - are sorted, unless the `nosort` flag is set. -* `match` Every time a match is found, this is emitted with the matched. -* `error` Emitted when an unexpected error is encountered, or whenever - any fs error occurs if `options.strict` is set. -* `abort` When `abort()` is called, this event is raised. - -### Methods - -* `pause` Temporarily stop the search -* `resume` Resume the search -* `abort` Stop the search forever - -### Options - -All the options that can be passed to Minimatch can also be passed to -Glob to change pattern matching behavior. Also, some have been added, -or have glob-specific ramifications. - -All options are false by default, unless otherwise noted. - -All options are added to the Glob object, as well. - -If you are running many `glob` operations, you can pass a Glob object -as the `options` argument to a subsequent operation to shortcut some -`stat` and `readdir` calls. At the very least, you may pass in shared -`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that -parallel glob operations will be sped up by sharing information about -the filesystem. - -* `cwd` The current working directory in which to search. Defaults - to `process.cwd()`. -* `root` The place where patterns starting with `/` will be mounted - onto. Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix - systems, and `C:\` or some such on Windows.) -* `dot` Include `.dot` files in normal matches and `globstar` matches. - Note that an explicit dot in a portion of the pattern will always - match dot files. -* `nomount` By default, a pattern starting with a forward-slash will be - "mounted" onto the root setting, so that a valid filesystem path is - returned. Set this flag to disable that behavior. -* `mark` Add a `/` character to directory matches. Note that this - requires additional stat calls. -* `nosort` Don't sort the results. -* `stat` Set to true to stat *all* results. This reduces performance - somewhat, and is completely unnecessary, unless `readdir` is presumed - to be an untrustworthy indicator of file existence. -* `silent` When an unusual error is encountered when attempting to - read a directory, a warning will be printed to stderr. Set the - `silent` option to true to suppress these warnings. -* `strict` When an unusual error is encountered when attempting to - read a directory, the process will just continue on in search of - other matches. Set the `strict` option to raise an error in these - cases. -* `cache` See `cache` property above. Pass in a previously generated - cache object to save some fs calls. -* `statCache` A cache of results of filesystem information, to prevent - unnecessary stat calls. While it should not normally be necessary - to set this, you may pass the statCache from one glob() call to the - options object of another, if you know that the filesystem will not - change between calls. (See "Race Conditions" below.) -* `symlinks` A cache of known symbolic links. You may pass in a - previously generated `symlinks` object to save `lstat` calls when - resolving `**` matches. -* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead. -* `nounique` In some cases, brace-expanded patterns can result in the - same file showing up multiple times in the result set. By default, - this implementation prevents duplicates in the result set. Set this - flag to disable that behavior. -* `nonull` Set to never return an empty set, instead returning a set - containing the pattern itself. This is the default in glob(3). -* `debug` Set to enable debug logging in minimatch and glob. -* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets. -* `noglobstar` Do not match `**` against multiple filenames. (Ie, - treat it as a normal `*` instead.) -* `noext` Do not match `+(a|b)` "extglob" patterns. -* `nocase` Perform a case-insensitive match. Note: on - case-insensitive filesystems, non-magic patterns will match by - default, since `stat` and `readdir` will not raise errors. -* `matchBase` Perform a basename-only match if the pattern does not - contain any slash characters. That is, `*.js` would be treated as - equivalent to `**/*.js`, matching all js files in all directories. -* `nodir` Do not match directories, only files. (Note: to match - *only* directories, simply put a `/` at the end of the pattern.) -* `ignore` Add a pattern or an array of patterns to exclude matches. -* `follow` Follow symlinked directories when expanding `**` patterns. - Note that this can result in a lot of duplicate references in the - presence of cyclic links. -* `realpath` Set to true to call `fs.realpath` on all of the results. - In the case of a symlink that cannot be resolved, the full absolute - path to the matched entry is returned (though it will usually be a - broken symlink) -* `nonegate` Suppress deprecated `negate` behavior. (See below.) - Default=true -* `nocomment` Suppress deprecated `comment` behavior. (See below.) - Default=true - -## Comparisons to other fnmatch/glob implementations - -While strict compliance with the existing standards is a worthwhile -goal, some discrepancies exist between node-glob and other -implementations, and are intentional. - -The double-star character `**` is supported by default, unless the -`noglobstar` flag is set. This is supported in the manner of bsdglob -and bash 4.3, where `**` only has special significance if it is the only -thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but -`a/**b` will not. - -Note that symlinked directories are not crawled as part of a `**`, -though their contents may match against subsequent portions of the -pattern. This prevents infinite loops and duplicates and the like. - -If an escaped pattern has no matches, and the `nonull` flag is set, -then glob returns the pattern as-provided, rather than -interpreting the character escapes. For example, -`glob.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than -`"*a?"`. This is akin to setting the `nullglob` option in bash, except -that it does not resolve escaped pattern characters. - -If brace expansion is not disabled, then it is performed before any -other interpretation of the glob pattern. Thus, a pattern like -`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded -**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are -checked for validity. Since those two are valid, matching proceeds. - -### Comments and Negation - -**Note**: In version 5 of this module, negation and comments are -**disabled** by default. You can explicitly set `nonegate:false` or -`nocomment:false` to re-enable them. They are going away entirely in -version 6. - -The intent for negation would be for a pattern starting with `!` to -match everything that *doesn't* match the supplied pattern. However, -the implementation is weird. It is better to use the `ignore` option -to set a pattern or set of patterns to exclude from matches. If you -want the "everything except *x*" type of behavior, you can use `**` as -the main pattern, and set an `ignore` for the things to exclude. - -The comments feature is added in minimatch, primarily to more easily -support use cases like ignore files, where a `#` at the start of a -line makes the pattern "empty". However, in the context of a -straightforward filesystem globber, "comments" don't make much sense. - -## Windows - -**Please only use forward-slashes in glob expressions.** - -Though windows uses either `/` or `\` as its path separator, only `/` -characters are used by this glob implementation. You must use -forward-slashes **only** in glob expressions. Back-slashes will always -be interpreted as escape characters, not path separators. - -Results from absolute patterns such as `/foo/*` are mounted onto the -root setting using `path.join`. On windows, this will by default result -in `/foo/*` matching `C:\foo\bar.txt`. - -## Race Conditions - -Glob searching, by its very nature, is susceptible to race conditions, -since it relies on directory walking and such. - -As a result, it is possible that a file that exists when glob looks for -it may have been deleted or modified by the time it returns the result. - -As part of its internal implementation, this program caches all stat -and readdir calls that it makes, in order to cut down on system -overhead. However, this also makes it even more susceptible to races, -especially if the cache or statCache objects are reused between glob -calls. - -Users are thus advised not to use a glob result as a guarantee of -filesystem state in the face of rapid changes. For the vast majority -of operations, this is never a problem. - -## Contributing - -Any change to behavior (including bugfixes) must come with a test. - -Patches that fail tests or reduce performance will be rejected. - -``` -# to run tests -npm test - -# to re-generate test fixtures -npm run test-regen - -# to benchmark against bash/zsh -npm run bench - -# to profile javascript -npm run prof -``` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/common.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/common.js deleted file mode 100644 index e36a631..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/common.js +++ /dev/null @@ -1,245 +0,0 @@ -exports.alphasort = alphasort -exports.alphasorti = alphasorti -exports.setopts = setopts -exports.ownProp = ownProp -exports.makeAbs = makeAbs -exports.finish = finish -exports.mark = mark -exports.isIgnored = isIgnored -exports.childrenIgnored = childrenIgnored - -function ownProp (obj, field) { - return Object.prototype.hasOwnProperty.call(obj, field) -} - -var path = require("path") -var minimatch = require("minimatch") -var isAbsolute = require("path-is-absolute") -var Minimatch = minimatch.Minimatch - -function alphasorti (a, b) { - return a.toLowerCase().localeCompare(b.toLowerCase()) -} - -function alphasort (a, b) { - return a.localeCompare(b) -} - -function setupIgnores (self, options) { - self.ignore = options.ignore || [] - - if (!Array.isArray(self.ignore)) - self.ignore = [self.ignore] - - if (self.ignore.length) { - self.ignore = self.ignore.map(ignoreMap) - } -} - -function ignoreMap (pattern) { - var gmatcher = null - if (pattern.slice(-3) === '/**') { - var gpattern = pattern.replace(/(\/\*\*)+$/, '') - gmatcher = new Minimatch(gpattern) - } - - return { - matcher: new Minimatch(pattern), - gmatcher: gmatcher - } -} - -function setopts (self, pattern, options) { - if (!options) - options = {} - - // base-matching: just use globstar for that. - if (options.matchBase && -1 === pattern.indexOf("/")) { - if (options.noglobstar) { - throw new Error("base matching requires globstar") - } - pattern = "**/" + pattern - } - - self.silent = !!options.silent - self.pattern = pattern - self.strict = options.strict !== false - self.realpath = !!options.realpath - self.realpathCache = options.realpathCache || Object.create(null) - self.follow = !!options.follow - self.dot = !!options.dot - self.mark = !!options.mark - self.nodir = !!options.nodir - if (self.nodir) - self.mark = true - self.sync = !!options.sync - self.nounique = !!options.nounique - self.nonull = !!options.nonull - self.nosort = !!options.nosort - self.nocase = !!options.nocase - self.stat = !!options.stat - self.noprocess = !!options.noprocess - - self.maxLength = options.maxLength || Infinity - self.cache = options.cache || Object.create(null) - self.statCache = options.statCache || Object.create(null) - self.symlinks = options.symlinks || Object.create(null) - - setupIgnores(self, options) - - self.changedCwd = false - var cwd = process.cwd() - if (!ownProp(options, "cwd")) - self.cwd = cwd - else { - self.cwd = options.cwd - self.changedCwd = path.resolve(options.cwd) !== cwd - } - - self.root = options.root || path.resolve(self.cwd, "/") - self.root = path.resolve(self.root) - if (process.platform === "win32") - self.root = self.root.replace(/\\/g, "/") - - self.nomount = !!options.nomount - - // disable comments and negation unless the user explicitly - // passes in false as the option. - options.nonegate = options.nonegate === false ? false : true - options.nocomment = options.nocomment === false ? false : true - deprecationWarning(options) - - self.minimatch = new Minimatch(pattern, options) - self.options = self.minimatch.options -} - -// TODO(isaacs): remove entirely in v6 -// exported to reset in tests -exports.deprecationWarned -function deprecationWarning(options) { - if (!options.nonegate || !options.nocomment) { - if (process.noDeprecation !== true && !exports.deprecationWarned) { - var msg = 'glob WARNING: comments and negation will be disabled in v6' - if (process.throwDeprecation) - throw new Error(msg) - else if (process.traceDeprecation) - console.trace(msg) - else - console.error(msg) - - exports.deprecationWarned = true - } - } -} - -function finish (self) { - var nou = self.nounique - var all = nou ? [] : Object.create(null) - - for (var i = 0, l = self.matches.length; i < l; i ++) { - var matches = self.matches[i] - if (!matches || Object.keys(matches).length === 0) { - if (self.nonull) { - // do like the shell, and spit out the literal glob - var literal = self.minimatch.globSet[i] - if (nou) - all.push(literal) - else - all[literal] = true - } - } else { - // had matches - var m = Object.keys(matches) - if (nou) - all.push.apply(all, m) - else - m.forEach(function (m) { - all[m] = true - }) - } - } - - if (!nou) - all = Object.keys(all) - - if (!self.nosort) - all = all.sort(self.nocase ? alphasorti : alphasort) - - // at *some* point we statted all of these - if (self.mark) { - for (var i = 0; i < all.length; i++) { - all[i] = self._mark(all[i]) - } - if (self.nodir) { - all = all.filter(function (e) { - return !(/\/$/.test(e)) - }) - } - } - - if (self.ignore.length) - all = all.filter(function(m) { - return !isIgnored(self, m) - }) - - self.found = all -} - -function mark (self, p) { - var abs = makeAbs(self, p) - var c = self.cache[abs] - var m = p - if (c) { - var isDir = c === 'DIR' || Array.isArray(c) - var slash = p.slice(-1) === '/' - - if (isDir && !slash) - m += '/' - else if (!isDir && slash) - m = m.slice(0, -1) - - if (m !== p) { - var mabs = makeAbs(self, m) - self.statCache[mabs] = self.statCache[abs] - self.cache[mabs] = self.cache[abs] - } - } - - return m -} - -// lotta situps... -function makeAbs (self, f) { - var abs = f - if (f.charAt(0) === '/') { - abs = path.join(self.root, f) - } else if (isAbsolute(f) || f === '') { - abs = f - } else if (self.changedCwd) { - abs = path.resolve(self.cwd, f) - } else { - abs = path.resolve(f) - } - return abs -} - - -// Return true, if pattern ends with globstar '**', for the accompanying parent directory. -// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents -function isIgnored (self, path) { - if (!self.ignore.length) - return false - - return self.ignore.some(function(item) { - return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) - }) -} - -function childrenIgnored (self, path) { - if (!self.ignore.length) - return false - - return self.ignore.some(function(item) { - return !!(item.gmatcher && item.gmatcher.match(path)) - }) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/glob.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/glob.js deleted file mode 100644 index 022d2ac..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/glob.js +++ /dev/null @@ -1,752 +0,0 @@ -// Approach: -// -// 1. Get the minimatch set -// 2. For each pattern in the set, PROCESS(pattern, false) -// 3. Store matches per-set, then uniq them -// -// PROCESS(pattern, inGlobStar) -// Get the first [n] items from pattern that are all strings -// Join these together. This is PREFIX. -// If there is no more remaining, then stat(PREFIX) and -// add to matches if it succeeds. END. -// -// If inGlobStar and PREFIX is symlink and points to dir -// set ENTRIES = [] -// else readdir(PREFIX) as ENTRIES -// If fail, END -// -// with ENTRIES -// If pattern[n] is GLOBSTAR -// // handle the case where the globstar match is empty -// // by pruning it out, and testing the resulting pattern -// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) -// // handle other cases. -// for ENTRY in ENTRIES (not dotfiles) -// // attach globstar + tail onto the entry -// // Mark that this entry is a globstar match -// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) -// -// else // not globstar -// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) -// Test ENTRY against pattern[n] -// If fails, continue -// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) -// -// Caveat: -// Cache all stats and readdirs results to minimize syscall. Since all -// we ever care about is existence and directory-ness, we can just keep -// `true` for files, and [children,...] for directories, or `false` for -// things that don't exist. - -module.exports = glob - -var fs = require('fs') -var minimatch = require('minimatch') -var Minimatch = minimatch.Minimatch -var inherits = require('inherits') -var EE = require('events').EventEmitter -var path = require('path') -var assert = require('assert') -var isAbsolute = require('path-is-absolute') -var globSync = require('./sync.js') -var common = require('./common.js') -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var inflight = require('inflight') -var util = require('util') -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored - -var once = require('once') - -function glob (pattern, options, cb) { - if (typeof options === 'function') cb = options, options = {} - if (!options) options = {} - - if (options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return globSync(pattern, options) - } - - return new Glob(pattern, options, cb) -} - -glob.sync = globSync -var GlobSync = glob.GlobSync = globSync.GlobSync - -// old api surface -glob.glob = glob - -glob.hasMagic = function (pattern, options_) { - var options = util._extend({}, options_) - options.noprocess = true - - var g = new Glob(pattern, options) - var set = g.minimatch.set - if (set.length > 1) - return true - - for (var j = 0; j < set[0].length; j++) { - if (typeof set[0][j] !== 'string') - return true - } - - return false -} - -glob.Glob = Glob -inherits(Glob, EE) -function Glob (pattern, options, cb) { - if (typeof options === 'function') { - cb = options - options = null - } - - if (options && options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return new GlobSync(pattern, options) - } - - if (!(this instanceof Glob)) - return new Glob(pattern, options, cb) - - setopts(this, pattern, options) - this._didRealPath = false - - // process each pattern in the minimatch set - var n = this.minimatch.set.length - - // The matches are stored as {: true,...} so that - // duplicates are automagically pruned. - // Later, we do an Object.keys() on these. - // Keep them as a list so we can fill in when nonull is set. - this.matches = new Array(n) - - if (typeof cb === 'function') { - cb = once(cb) - this.on('error', cb) - this.on('end', function (matches) { - cb(null, matches) - }) - } - - var self = this - var n = this.minimatch.set.length - this._processing = 0 - this.matches = new Array(n) - - this._emitQueue = [] - this._processQueue = [] - this.paused = false - - if (this.noprocess) - return this - - if (n === 0) - return done() - - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false, done) - } - - function done () { - --self._processing - if (self._processing <= 0) - self._finish() - } -} - -Glob.prototype._finish = function () { - assert(this instanceof Glob) - if (this.aborted) - return - - if (this.realpath && !this._didRealpath) - return this._realpath() - - common.finish(this) - this.emit('end', this.found) -} - -Glob.prototype._realpath = function () { - if (this._didRealpath) - return - - this._didRealpath = true - - var n = this.matches.length - if (n === 0) - return this._finish() - - var self = this - for (var i = 0; i < this.matches.length; i++) - this._realpathSet(i, next) - - function next () { - if (--n === 0) - self._finish() - } -} - -Glob.prototype._realpathSet = function (index, cb) { - var matchset = this.matches[index] - if (!matchset) - return cb() - - var found = Object.keys(matchset) - var self = this - var n = found.length - - if (n === 0) - return cb() - - var set = this.matches[index] = Object.create(null) - found.forEach(function (p, i) { - // If there's a problem with the stat, then it means that - // one or more of the links in the realpath couldn't be - // resolved. just return the abs value in that case. - p = self._makeAbs(p) - fs.realpath(p, self.realpathCache, function (er, real) { - if (!er) - set[real] = true - else if (er.syscall === 'stat') - set[p] = true - else - self.emit('error', er) // srsly wtf right here - - if (--n === 0) { - self.matches[index] = set - cb() - } - }) - }) -} - -Glob.prototype._mark = function (p) { - return common.mark(this, p) -} - -Glob.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} - -Glob.prototype.abort = function () { - this.aborted = true - this.emit('abort') -} - -Glob.prototype.pause = function () { - if (!this.paused) { - this.paused = true - this.emit('pause') - } -} - -Glob.prototype.resume = function () { - if (this.paused) { - this.emit('resume') - this.paused = false - if (this._emitQueue.length) { - var eq = this._emitQueue.slice(0) - this._emitQueue.length = 0 - for (var i = 0; i < eq.length; i ++) { - var e = eq[i] - this._emitMatch(e[0], e[1]) - } - } - if (this._processQueue.length) { - var pq = this._processQueue.slice(0) - this._processQueue.length = 0 - for (var i = 0; i < pq.length; i ++) { - var p = pq[i] - this._processing-- - this._process(p[0], p[1], p[2], p[3]) - } - } - } -} - -Glob.prototype._process = function (pattern, index, inGlobStar, cb) { - assert(this instanceof Glob) - assert(typeof cb === 'function') - - if (this.aborted) - return - - this._processing++ - if (this.paused) { - this._processQueue.push([pattern, index, inGlobStar, cb]) - return - } - - //console.error('PROCESS %d', this._processing, pattern) - - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ - } - // now n is the index of the first one that is *not* a string. - - // see if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index, cb) - return - - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break - - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break - } - - var remain = pattern.slice(n) - - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix - - var abs = this._makeAbs(read) - - //if ignored, skip _processing - if (childrenIgnored(this, read)) - return cb() - - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) -} - -Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} - -Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - - // if the abs isn't a dir, then nothing can match! - if (!entries) - return cb() - - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' - - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } - - //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) - - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return cb() - - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. - - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this._emitMatch(index, e) - } - // This was the last one, and no stats were needed - return cb() - } - - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - this._process([e].concat(remain), index, inGlobStar, cb) - } - cb() -} - -Glob.prototype._emitMatch = function (index, e) { - if (this.aborted) - return - - if (this.matches[index][e]) - return - - if (isIgnored(this, e)) - return - - if (this.paused) { - this._emitQueue.push([index, e]) - return - } - - var abs = this._makeAbs(e) - - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } - - if (this.mark) - e = this._mark(e) - - this.matches[index][e] = true - - var st = this.statCache[abs] - if (st) - this.emit('stat', e, st) - - this.emit('match', e) -} - -Glob.prototype._readdirInGlobStar = function (abs, cb) { - if (this.aborted) - return - - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false, cb) - - var lstatkey = 'lstat\0' + abs - var self = this - var lstatcb = inflight(lstatkey, lstatcb_) - - if (lstatcb) - fs.lstat(abs, lstatcb) - - function lstatcb_ (er, lstat) { - if (er) - return cb() - - var isSym = lstat.isSymbolicLink() - self.symlinks[abs] = isSym - - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && !lstat.isDirectory()) { - self.cache[abs] = 'FILE' - cb() - } else - self._readdir(abs, false, cb) - } -} - -Glob.prototype._readdir = function (abs, inGlobStar, cb) { - if (this.aborted) - return - - cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) - if (!cb) - return - - //console.error('RD %j %j', +inGlobStar, abs) - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs, cb) - - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return cb() - - if (Array.isArray(c)) - return cb(null, c) - } - - var self = this - fs.readdir(abs, readdirCb(this, abs, cb)) -} - -function readdirCb (self, abs, cb) { - return function (er, entries) { - if (er) - self._readdirError(abs, er, cb) - else - self._readdirEntries(abs, entries, cb) - } -} - -Glob.prototype._readdirEntries = function (abs, entries, cb) { - if (this.aborted) - return - - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } - - this.cache[abs] = entries - return cb(null, entries) -} - -Glob.prototype._readdirError = function (f, er, cb) { - if (this.aborted) - return - - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - this.cache[this._makeAbs(f)] = 'FILE' - break - - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break - - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) { - this.emit('error', er) - // If the error is handled, then we abort - // if not, we threw out of here - this.abort() - } - if (!this.silent) - console.error('glob error', er) - break - } - - return cb() -} - -Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} - - -Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - //console.error('pgs2', prefix, remain[0], entries) - - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return cb() - - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) - - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false, cb) - - var isSym = this.symlinks[abs] - var len = entries.length - - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return cb() - - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue - - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true, cb) - - var below = gspref.concat(entries[i], remain) - this._process(below, index, true, cb) - } - - cb() -} - -Glob.prototype._processSimple = function (prefix, index, cb) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var self = this - this._stat(prefix, function (er, exists) { - self._processSimple2(prefix, index, er, exists, cb) - }) -} -Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { - - //console.error('ps2', prefix, exists) - - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return cb() - - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } - - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') - - // Mark this as a match - this._emitMatch(index, prefix) - cb() -} - -// Returns either 'DIR', 'FILE', or false -Glob.prototype._stat = function (f, cb) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' - - if (f.length > this.maxLength) - return cb() - - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] - - if (Array.isArray(c)) - c = 'DIR' - - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return cb(null, c) - - if (needDir && c === 'FILE') - return cb() - - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } - - var exists - var stat = this.statCache[abs] - if (stat !== undefined) { - if (stat === false) - return cb(null, stat) - else { - var type = stat.isDirectory() ? 'DIR' : 'FILE' - if (needDir && type === 'FILE') - return cb() - else - return cb(null, type, stat) - } - } - - var self = this - var statcb = inflight('stat\0' + abs, lstatcb_) - if (statcb) - fs.lstat(abs, statcb) - - function lstatcb_ (er, lstat) { - if (lstat && lstat.isSymbolicLink()) { - // If it's a symlink, then treat it as the target, unless - // the target does not exist, then treat it as a file. - return fs.stat(abs, function (er, stat) { - if (er) - self._stat2(f, abs, null, lstat, cb) - else - self._stat2(f, abs, er, stat, cb) - }) - } else { - self._stat2(f, abs, er, lstat, cb) - } - } -} - -Glob.prototype._stat2 = function (f, abs, er, stat, cb) { - if (er) { - this.statCache[abs] = false - return cb() - } - - var needDir = f.slice(-1) === '/' - this.statCache[abs] = stat - - if (abs.slice(-1) === '/' && !stat.isDirectory()) - return cb(null, false, stat) - - var c = stat.isDirectory() ? 'DIR' : 'FILE' - this.cache[abs] = this.cache[abs] || c - - if (needDir && c !== 'DIR') - return cb() - - return cb(null, c, stat) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/.eslintrc b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/.eslintrc deleted file mode 100644 index b7a1550..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/.eslintrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "env" : { - "node" : true - }, - "rules" : { - "semi": [2, "never"], - "strict": 0, - "quotes": [1, "single", "avoid-escape"], - "no-use-before-define": 0, - "curly": 0, - "no-underscore-dangle": 0, - "no-lonely-if": 1, - "no-unused-vars": [2, {"vars" : "all", "args" : "after-used"}], - "no-mixed-requires": 0, - "space-infix-ops": 0 - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/LICENSE deleted file mode 100644 index 05eeeb8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/README.md deleted file mode 100644 index 6dc8929..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# inflight - -Add callbacks to requests in flight to avoid async duplication - -## USAGE - -```javascript -var inflight = require('inflight') - -// some request that does some stuff -function req(key, callback) { - // key is any random string. like a url or filename or whatever. - // - // will return either a falsey value, indicating that the - // request for this key is already in flight, or a new callback - // which when called will call all callbacks passed to inflightk - // with the same key - callback = inflight(key, callback) - - // If we got a falsey value back, then there's already a req going - if (!callback) return - - // this is where you'd fetch the url or whatever - // callback is also once()-ified, so it can safely be assigned - // to multiple events etc. First call wins. - setTimeout(function() { - callback(null, key) - }, 100) -} - -// only assigns a single setTimeout -// when it dings, all cbs get called -req('foo', cb1) -req('foo', cb2) -req('foo', cb3) -req('foo', cb4) -``` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/inflight.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/inflight.js deleted file mode 100644 index 8bc96cb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/inflight.js +++ /dev/null @@ -1,44 +0,0 @@ -var wrappy = require('wrappy') -var reqs = Object.create(null) -var once = require('once') - -module.exports = wrappy(inflight) - -function inflight (key, cb) { - if (reqs[key]) { - reqs[key].push(cb) - return null - } else { - reqs[key] = [cb] - return makeres(key) - } -} - -function makeres (key) { - return once(function RES () { - var cbs = reqs[key] - var len = cbs.length - var args = slice(arguments) - for (var i = 0; i < len; i++) { - cbs[i].apply(null, args) - } - if (cbs.length > len) { - // added more in the interim. - // de-zalgo, just in case, but don't call again. - cbs.splice(0, len) - process.nextTick(function () { - RES.apply(null, args) - }) - } else { - delete reqs[key] - } - }) -} - -function slice (args) { - var length = args.length - var array = [] - - for (var i = 0; i < length; i++) array[i] = args[i] - return array -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md deleted file mode 100644 index 98eab25..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# wrappy - -Callback wrapping utility - -## USAGE - -```javascript -var wrappy = require("wrappy") - -// var wrapper = wrappy(wrapperFunction) - -// make sure a cb is called only once -// See also: http://npm.im/once for this specific use case -var once = wrappy(function (cb) { - var called = false - return function () { - if (called) return - called = true - return cb.apply(this, arguments) - } -}) - -function printBoo () { - console.log('boo') -} -// has some rando property -printBoo.iAmBooPrinter = true - -var onlyPrintOnce = once(printBoo) - -onlyPrintOnce() // prints 'boo' -onlyPrintOnce() // does nothing - -// random property is retained! -assert.equal(onlyPrintOnce.iAmBooPrinter, true) -``` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json deleted file mode 100644 index 8145dc8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "wrappy", - "version": "1.0.1", - "description": "Callback wrapping utility", - "main": "wrappy.js", - "directories": { - "test": "test" - }, - "dependencies": {}, - "devDependencies": { - "tap": "^0.4.12" - }, - "scripts": { - "test": "tap test/*.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/wrappy" - }, - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "ISC", - "bugs": { - "url": "https://github.com/npm/wrappy/issues" - }, - "homepage": "https://github.com/npm/wrappy", - "gitHead": "006a8cbac6b99988315834c207896eed71fd069a", - "_id": "wrappy@1.0.1", - "_shasum": "1e65969965ccbc2db4548c6b84a6f2c5aedd4739", - "_from": "wrappy@>=1.0.0 <2.0.0", - "_npmVersion": "2.0.0", - "_nodeVersion": "0.10.31", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "dist": { - "shasum": "1e65969965ccbc2db4548c6b84a6f2c5aedd4739", - "tarball": "http://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" - }, - "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js deleted file mode 100644 index 5ed0fcd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js +++ /dev/null @@ -1,51 +0,0 @@ -var test = require('tap').test -var wrappy = require('../wrappy.js') - -test('basic', function (t) { - function onceifier (cb) { - var called = false - return function () { - if (called) return - called = true - return cb.apply(this, arguments) - } - } - onceifier.iAmOnce = {} - var once = wrappy(onceifier) - t.equal(once.iAmOnce, onceifier.iAmOnce) - - var called = 0 - function boo () { - t.equal(called, 0) - called++ - } - // has some rando property - boo.iAmBoo = true - - var onlyPrintOnce = once(boo) - - onlyPrintOnce() // prints 'boo' - onlyPrintOnce() // does nothing - t.equal(called, 1) - - // random property is retained! - t.equal(onlyPrintOnce.iAmBoo, true) - - var logs = [] - var logwrap = wrappy(function (msg, cb) { - logs.push(msg + ' wrapping cb') - return function () { - logs.push(msg + ' before cb') - var ret = cb.apply(this, arguments) - logs.push(msg + ' after cb') - } - }) - - var c = logwrap('foo', function () { - t.same(logs, [ 'foo wrapping cb', 'foo before cb' ]) - }) - c() - t.same(logs, [ 'foo wrapping cb', 'foo before cb', 'foo after cb' ]) - - t.end() -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js deleted file mode 100644 index bb7e7d6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js +++ /dev/null @@ -1,33 +0,0 @@ -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -module.exports = wrappy -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') - - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k] - }) - - return wrapper - - function wrapper() { - var args = new Array(arguments.length) - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - var ret = fn.apply(this, args) - var cb = args[args.length-1] - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k] - }) - } - return ret - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/package.json deleted file mode 100644 index a6645bc..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "inflight", - "version": "1.0.4", - "description": "Add callbacks to requests in flight to avoid async duplication", - "main": "inflight.js", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - }, - "devDependencies": { - "tap": "^0.4.10" - }, - "scripts": { - "test": "tap test.js" - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/inflight" - }, - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/inflight/issues" - }, - "homepage": "https://github.com/isaacs/inflight", - "license": "ISC", - "gitHead": "c7b5531d572a867064d4a1da9e013e8910b7d1ba", - "_id": "inflight@1.0.4", - "_shasum": "6cbb4521ebd51ce0ec0a936bfd7657ef7e9b172a", - "_from": "inflight@>=1.0.4 <2.0.0", - "_npmVersion": "2.1.3", - "_nodeVersion": "0.10.32", - "_npmUser": { - "name": "othiym23", - "email": "ogd@aoaioxxysz.net" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - }, - { - "name": "othiym23", - "email": "ogd@aoaioxxysz.net" - }, - { - "name": "iarna", - "email": "me@re-becca.org" - } - ], - "dist": { - "shasum": "6cbb4521ebd51ce0ec0a936bfd7657ef7e9b172a", - "tarball": "http://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/test.js deleted file mode 100644 index 2bb75b3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inflight/test.js +++ /dev/null @@ -1,97 +0,0 @@ -var test = require('tap').test -var inf = require('./inflight.js') - - -function req (key, cb) { - cb = inf(key, cb) - if (cb) setTimeout(function () { - cb(key) - cb(key) - }) - return cb -} - -test('basic', function (t) { - var calleda = false - var a = req('key', function (k) { - t.notOk(calleda) - calleda = true - t.equal(k, 'key') - if (calledb) t.end() - }) - t.ok(a, 'first returned cb function') - - var calledb = false - var b = req('key', function (k) { - t.notOk(calledb) - calledb = true - t.equal(k, 'key') - if (calleda) t.end() - }) - - t.notOk(b, 'second should get falsey inflight response') -}) - -test('timing', function (t) { - var expect = [ - 'method one', - 'start one', - 'end one', - 'two', - 'tick', - 'three' - ] - var i = 0 - - function log (m) { - t.equal(m, expect[i], m + ' === ' + expect[i]) - ++i - if (i === expect.length) - t.end() - } - - function method (name, cb) { - log('method ' + name) - process.nextTick(cb) - } - - var one = inf('foo', function () { - log('start one') - var three = inf('foo', function () { - log('three') - }) - if (three) method('three', three) - log('end one') - }) - - method('one', one) - - var two = inf('foo', function () { - log('two') - }) - if (two) method('one', two) - - process.nextTick(log.bind(null, 'tick')) -}) - -test('parameters', function (t) { - t.plan(8) - - var a = inf('key', function (first, second, third) { - t.equal(first, 1) - t.equal(second, 2) - t.equal(third, 3) - }) - t.ok(a, 'first returned cb function') - - var b = inf('key', function (first, second, third) { - t.equal(first, 1) - t.equal(second, 2) - t.equal(third, 3) - }) - t.notOk(b, 'second should get falsey inflight response') - - setTimeout(function () { - a(1, 2, 3) - }) -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/LICENSE deleted file mode 100644 index dea3013..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/README.md deleted file mode 100644 index b1c5665..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/README.md +++ /dev/null @@ -1,42 +0,0 @@ -Browser-friendly inheritance fully compatible with standard node.js -[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). - -This package exports standard `inherits` from node.js `util` module in -node environment, but also provides alternative browser-friendly -implementation through [browser -field](https://gist.github.com/shtylman/4339901). Alternative -implementation is a literal copy of standard one located in standalone -module to avoid requiring of `util`. It also has a shim for old -browsers with no `Object.create` support. - -While keeping you sure you are using standard `inherits` -implementation in node.js environment, it allows bundlers such as -[browserify](https://github.com/substack/node-browserify) to not -include full `util` package to your client code if all you need is -just `inherits` function. It worth, because browser shim for `util` -package is large and `inherits` is often the single function you need -from it. - -It's recommended to use this package instead of -`require('util').inherits` for any code that has chances to be used -not only in node.js but in browser too. - -## usage - -```js -var inherits = require('inherits'); -// then use exactly as the standard one -``` - -## note on version ~1.0 - -Version ~1.0 had completely different motivation and is not compatible -neither with 2.0 nor with standard node.js `inherits`. - -If you are using version ~1.0 and planning to switch to ~2.0, be -careful: - -* new version uses `super_` instead of `super` for referencing - superclass -* new version overwrites current prototype while old one preserves any - existing fields on it diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits.js deleted file mode 100644 index 29f5e24..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('util').inherits diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits_browser.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits_browser.js deleted file mode 100644 index c1e78a7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits_browser.js +++ /dev/null @@ -1,23 +0,0 @@ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/package.json deleted file mode 100644 index a703bdd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "inherits", - "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", - "version": "2.0.1", - "keywords": [ - "inheritance", - "class", - "klass", - "oop", - "object-oriented", - "inherits", - "browser", - "browserify" - ], - "main": "./inherits.js", - "browser": "./inherits_browser.js", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/inherits" - }, - "license": "ISC", - "scripts": { - "test": "node test" - }, - "bugs": { - "url": "https://github.com/isaacs/inherits/issues" - }, - "_id": "inherits@2.0.1", - "dist": { - "shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", - "tarball": "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "_from": "inherits@>=2.0.0 <3.0.0", - "_npmVersion": "1.3.8", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "directories": {}, - "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", - "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/isaacs/inherits" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/test.js deleted file mode 100644 index fc53012..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/inherits/test.js +++ /dev/null @@ -1,25 +0,0 @@ -var inherits = require('./inherits.js') -var assert = require('assert') - -function test(c) { - assert(c.constructor === Child) - assert(c.constructor.super_ === Parent) - assert(Object.getPrototypeOf(c) === Child.prototype) - assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) - assert(c instanceof Child) - assert(c instanceof Parent) -} - -function Child() { - Parent.call(this) - test(this) -} - -function Parent() {} - -inherits(Child, Parent) - -var c = new Child -test(c) - -console.log('ok') diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/README.md deleted file mode 100644 index d458bc2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/README.md +++ /dev/null @@ -1,216 +0,0 @@ -# minimatch - -A minimal matching utility. - -[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch) - - -This is the matching library used internally by npm. - -It works by converting glob expressions into JavaScript `RegExp` -objects. - -## Usage - -```javascript -var minimatch = require("minimatch") - -minimatch("bar.foo", "*.foo") // true! -minimatch("bar.foo", "*.bar") // false! -minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! -``` - -## Features - -Supports these glob features: - -* Brace Expansion -* Extended glob matching -* "Globstar" `**` matching - -See: - -* `man sh` -* `man bash` -* `man 3 fnmatch` -* `man 5 gitignore` - -## Minimatch Class - -Create a minimatch object by instanting the `minimatch.Minimatch` class. - -```javascript -var Minimatch = require("minimatch").Minimatch -var mm = new Minimatch(pattern, options) -``` - -### Properties - -* `pattern` The original pattern the minimatch object represents. -* `options` The options supplied to the constructor. -* `set` A 2-dimensional array of regexp or string expressions. - Each row in the - array corresponds to a brace-expanded pattern. Each item in the row - corresponds to a single path-part. For example, the pattern - `{a,b/c}/d` would expand to a set of patterns like: - - [ [ a, d ] - , [ b, c, d ] ] - - If a portion of the pattern doesn't have any "magic" in it - (that is, it's something like `"foo"` rather than `fo*o?`), then it - will be left as a string rather than converted to a regular - expression. - -* `regexp` Created by the `makeRe` method. A single regular expression - expressing the entire pattern. This is useful in cases where you wish - to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. -* `negate` True if the pattern is negated. -* `comment` True if the pattern is a comment. -* `empty` True if the pattern is `""`. - -### Methods - -* `makeRe` Generate the `regexp` member if necessary, and return it. - Will return `false` if the pattern is invalid. -* `match(fname)` Return true if the filename matches the pattern, or - false otherwise. -* `matchOne(fileArray, patternArray, partial)` Take a `/`-split - filename, and match it against a single row in the `regExpSet`. This - method is mainly for internal use, but is exposed so that it can be - used by a glob-walker that needs to avoid excessive filesystem calls. - -All other methods are internal, and will be called as necessary. - -## Functions - -The top-level exported function has a `cache` property, which is an LRU -cache set to store 100 items. So, calling these methods repeatedly -with the same pattern and options will use the same Minimatch object, -saving the cost of parsing it multiple times. - -### minimatch(path, pattern, options) - -Main export. Tests a path against the pattern using the options. - -```javascript -var isJS = minimatch(file, "*.js", { matchBase: true }) -``` - -### minimatch.filter(pattern, options) - -Returns a function that tests its -supplied argument, suitable for use with `Array.filter`. Example: - -```javascript -var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) -``` - -### minimatch.match(list, pattern, options) - -Match against the list of -files, in the style of fnmatch or glob. If nothing is matched, and -options.nonull is set, then return a list containing the pattern itself. - -```javascript -var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) -``` - -### minimatch.makeRe(pattern, options) - -Make a regular expression object from the pattern. - -## Options - -All options are `false` by default. - -### debug - -Dump a ton of stuff to stderr. - -### nobrace - -Do not expand `{a,b}` and `{1..3}` brace sets. - -### noglobstar - -Disable `**` matching against multiple folder names. - -### dot - -Allow patterns to match filenames starting with a period, even if -the pattern does not explicitly have a period in that spot. - -Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` -is set. - -### noext - -Disable "extglob" style patterns like `+(a|b)`. - -### nocase - -Perform a case-insensitive match. - -### nonull - -When a match is not found by `minimatch.match`, return a list containing -the pattern itself if this option is set. When not set, an empty list -is returned if there are no matches. - -### matchBase - -If set, then patterns without slashes will be matched -against the basename of the path if it contains slashes. For example, -`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. - -### nocomment - -Suppress the behavior of treating `#` at the start of a pattern as a -comment. - -### nonegate - -Suppress the behavior of treating a leading `!` character as negation. - -### flipNegate - -Returns from negate expressions the same as if they were not negated. -(Ie, true on a hit, false on a miss.) - - -## Comparisons to other fnmatch/glob implementations - -While strict compliance with the existing standards is a worthwhile -goal, some discrepancies exist between minimatch and other -implementations, and are intentional. - -If the pattern starts with a `!` character, then it is negated. Set the -`nonegate` flag to suppress this behavior, and treat leading `!` -characters normally. This is perhaps relevant if you wish to start the -pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` -characters at the start of a pattern will negate the pattern multiple -times. - -If a pattern starts with `#`, then it is treated as a comment, and -will not match anything. Use `\#` to match a literal `#` at the -start of a line, or set the `nocomment` flag to suppress this behavior. - -The double-star character `**` is supported by default, unless the -`noglobstar` flag is set. This is supported in the manner of bsdglob -and bash 4.1, where `**` only has special significance if it is the only -thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but -`a/**b` will not. - -If an escaped pattern has no matches, and the `nonull` flag is set, -then minimatch.match returns the pattern as-provided, rather than -interpreting the character escapes. For example, -`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than -`"*a?"`. This is akin to setting the `nullglob` option in bash, except -that it does not resolve escaped pattern characters. - -If brace expansion is not disabled, then it is performed before any -other interpretation of the glob pattern. Thus, a pattern like -`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded -**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are -checked for validity. Since those two are valid, matching proceeds. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/browser.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/browser.js deleted file mode 100644 index 7d05159..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/browser.js +++ /dev/null @@ -1,1159 +0,0 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.minimatch = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o any number of characters -var star = qmark + '*?' - -// ** when dots are allowed. Anything goes, except .. and . -// not (^ or / followed by one or two dots followed by $ or /), -// followed by anything, any number of times. -var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' - -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' - -// characters that need to be escaped in RegExp. -var reSpecials = charSet('().*{}+?[]^$\\!') - -// "abc" -> { a:true, b:true, c:true } -function charSet (s) { - return s.split('').reduce(function (set, c) { - set[c] = true - return set - }, {}) -} - -// normalizes slashes. -var slashSplit = /\/+/ - -minimatch.filter = filter -function filter (pattern, options) { - options = options || {} - return function (p, i, list) { - return minimatch(p, pattern, options) - } -} - -function ext (a, b) { - a = a || {} - b = b || {} - var t = {} - Object.keys(b).forEach(function (k) { - t[k] = b[k] - }) - Object.keys(a).forEach(function (k) { - t[k] = a[k] - }) - return t -} - -minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return minimatch - - var orig = minimatch - - var m = function minimatch (p, pattern, options) { - return orig.minimatch(p, pattern, ext(def, options)) - } - - m.Minimatch = function Minimatch (pattern, options) { - return new orig.Minimatch(pattern, ext(def, options)) - } - - return m -} - -Minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return Minimatch - return minimatch.defaults(def).Minimatch -} - -function minimatch (p, pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {} - - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - return false - } - - // "" only matches "" - if (pattern.trim() === '') return p === '' - - return new Minimatch(pattern, options).match(p) -} - -function Minimatch (pattern, options) { - if (!(this instanceof Minimatch)) { - return new Minimatch(pattern, options) - } - - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {} - pattern = pattern.trim() - - // windows support: need to use /, not \ - if (path.sep !== '/') { - pattern = pattern.split(path.sep).join('/') - } - - this.options = options - this.set = [] - this.pattern = pattern - this.regexp = null - this.negate = false - this.comment = false - this.empty = false - - // make the set of regexps etc. - this.make() -} - -Minimatch.prototype.debug = function () {} - -Minimatch.prototype.make = make -function make () { - // don't do it more than once. - if (this._made) return - - var pattern = this.pattern - var options = this.options - - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - this.comment = true - return - } - if (!pattern) { - this.empty = true - return - } - - // step 1: figure out negation, etc. - this.parseNegate() - - // step 2: expand braces - var set = this.globSet = this.braceExpand() - - if (options.debug) this.debug = console.error - - this.debug(this.pattern, set) - - // step 3: now we have a set, so turn each one into a series of path-portion - // matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - set = this.globParts = set.map(function (s) { - return s.split(slashSplit) - }) - - this.debug(this.pattern, set) - - // glob --> regexps - set = set.map(function (s, si, set) { - return s.map(this.parse, this) - }, this) - - this.debug(this.pattern, set) - - // filter out everything that didn't compile properly. - set = set.filter(function (s) { - return s.indexOf(false) === -1 - }) - - this.debug(this.pattern, set) - - this.set = set -} - -Minimatch.prototype.parseNegate = parseNegate -function parseNegate () { - var pattern = this.pattern - var negate = false - var options = this.options - var negateOffset = 0 - - if (options.nonegate) return - - for (var i = 0, l = pattern.length - ; i < l && pattern.charAt(i) === '!' - ; i++) { - negate = !negate - negateOffset++ - } - - if (negateOffset) this.pattern = pattern.substr(negateOffset) - this.negate = negate -} - -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -minimatch.braceExpand = function (pattern, options) { - return braceExpand(pattern, options) -} - -Minimatch.prototype.braceExpand = braceExpand - -function braceExpand (pattern, options) { - if (!options) { - if (this instanceof Minimatch) { - options = this.options - } else { - options = {} - } - } - - pattern = typeof pattern === 'undefined' - ? this.pattern : pattern - - if (typeof pattern === 'undefined') { - throw new Error('undefined pattern') - } - - if (options.nobrace || - !pattern.match(/\{.*\}/)) { - // shortcut. no need to expand. - return [pattern] - } - - return expand(pattern) -} - -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -Minimatch.prototype.parse = parse -var SUBPARSE = {} -function parse (pattern, isSub) { - var options = this.options - - // shortcuts - if (!options.noglobstar && pattern === '**') return GLOBSTAR - if (pattern === '') return '' - - var re = '' - var hasMagic = !!options.nocase - var escaping = false - // ? => one single character - var patternListStack = [] - var negativeLists = [] - var plType - var stateChar - var inClass = false - var reClassStart = -1 - var classStart = -1 - // . and .. never match anything that doesn't start with ., - // even when options.dot is set. - var patternStart = pattern.charAt(0) === '.' ? '' // anything - // not (start or / followed by . or .. followed by / or end) - : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' - : '(?!\\.)' - var self = this - - function clearStateChar () { - if (stateChar) { - // we had some state-tracking character - // that wasn't consumed by this pass. - switch (stateChar) { - case '*': - re += star - hasMagic = true - break - case '?': - re += qmark - hasMagic = true - break - default: - re += '\\' + stateChar - break - } - self.debug('clearStateChar %j %j', stateChar, re) - stateChar = false - } - } - - for (var i = 0, len = pattern.length, c - ; (i < len) && (c = pattern.charAt(i)) - ; i++) { - this.debug('%s\t%s %s %j', pattern, i, re, c) - - // skip over any that are escaped. - if (escaping && reSpecials[c]) { - re += '\\' + c - escaping = false - continue - } - - switch (c) { - case '/': - // completely not allowed, even escaped. - // Should already be path-split by now. - return false - - case '\\': - clearStateChar() - escaping = true - continue - - // the various stateChar values - // for the "extglob" stuff. - case '?': - case '*': - case '+': - case '@': - case '!': - this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) - - // all of those are literals inside a class, except that - // the glob [!a] means [^a] in regexp - if (inClass) { - this.debug(' in class') - if (c === '!' && i === classStart + 1) c = '^' - re += c - continue - } - - // if we already have a stateChar, then it means - // that there was something like ** or +? in there. - // Handle the stateChar, then proceed with this one. - self.debug('call clearStateChar %j', stateChar) - clearStateChar() - stateChar = c - // if extglob is disabled, then +(asdf|foo) isn't a thing. - // just clear the statechar *now*, rather than even diving into - // the patternList stuff. - if (options.noext) clearStateChar() - continue - - case '(': - if (inClass) { - re += '(' - continue - } - - if (!stateChar) { - re += '\\(' - continue - } - - plType = stateChar - patternListStack.push({ - type: plType, - start: i - 1, - reStart: re.length - }) - // negation is (?:(?!js)[^/]*) - re += stateChar === '!' ? '(?:(?!(?:' : '(?:' - this.debug('plType %j %j', stateChar, re) - stateChar = false - continue - - case ')': - if (inClass || !patternListStack.length) { - re += '\\)' - continue - } - - clearStateChar() - hasMagic = true - re += ')' - var pl = patternListStack.pop() - plType = pl.type - // negation is (?:(?!js)[^/]*) - // The others are (?:) - switch (plType) { - case '!': - negativeLists.push(pl) - re += ')[^/]*?)' - pl.reEnd = re.length - break - case '?': - case '+': - case '*': - re += plType - break - case '@': break // the default anyway - } - continue - - case '|': - if (inClass || !patternListStack.length || escaping) { - re += '\\|' - escaping = false - continue - } - - clearStateChar() - re += '|' - continue - - // these are mostly the same in regexp and glob - case '[': - // swallow any state-tracking char before the [ - clearStateChar() - - if (inClass) { - re += '\\' + c - continue - } - - inClass = true - classStart = i - reClassStart = re.length - re += c - continue - - case ']': - // a right bracket shall lose its special - // meaning and represent itself in - // a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - if (i === classStart + 1 || !inClass) { - re += '\\' + c - escaping = false - continue - } - - // handle the case where we left a class open. - // "[z-a]" is valid, equivalent to "\[z-a\]" - if (inClass) { - // split where the last [ was, make sure we don't have - // an invalid re. if so, re-walk the contents of the - // would-be class to re-translate any characters that - // were passed through as-is - // TODO: It would probably be faster to determine this - // without a try/catch and a new RegExp, but it's tricky - // to do safely. For now, this is safe and works. - var cs = pattern.substring(classStart + 1, i) - try { - RegExp('[' + cs + ']') - } catch (er) { - // not a valid class! - var sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' - hasMagic = hasMagic || sp[1] - inClass = false - continue - } - } - - // finish up the class. - hasMagic = true - inClass = false - re += c - continue - - default: - // swallow any state char that wasn't consumed - clearStateChar() - - if (escaping) { - // no need - escaping = false - } else if (reSpecials[c] - && !(c === '^' && inClass)) { - re += '\\' - } - - re += c - - } // switch - } // for - - // handle the case where we left a class open. - // "[abc" is valid, equivalent to "\[abc" - if (inClass) { - // split where the last [ was, and escape it - // this is a huge pita. We now have to re-walk - // the contents of the would-be class to re-translate - // any characters that were passed through as-is - cs = pattern.substr(classStart + 1) - sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] - hasMagic = hasMagic || sp[1] - } - - // handle the case where we had a +( thing at the *end* - // of the pattern. - // each pattern list stack adds 3 chars, and we need to go through - // and escape any | chars that were passed through as-is for the regexp. - // Go through and escape them, taking care not to double-escape any - // | chars that were already escaped. - for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + 3) - // maybe some even number of \, then maybe 1 \, followed by a | - tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { - if (!$2) { - // the | isn't already escaped, so escape it. - $2 = '\\' - } - - // need to escape all those slashes *again*, without escaping the - // one that we need for escaping the | character. As it works out, - // escaping an even number of slashes can be done by simply repeating - // it exactly after itself. That's why this trick works. - // - // I am sorry that you have to see this. - return $1 + $1 + $2 + '|' - }) - - this.debug('tail=%j\n %s', tail, tail) - var t = pl.type === '*' ? star - : pl.type === '?' ? qmark - : '\\' + pl.type - - hasMagic = true - re = re.slice(0, pl.reStart) + t + '\\(' + tail - } - - // handle trailing things that only matter at the very end. - clearStateChar() - if (escaping) { - // trailing \\ - re += '\\\\' - } - - // only need to apply the nodot start if the re starts with - // something that could conceivably capture a dot - var addPatternStart = false - switch (re.charAt(0)) { - case '.': - case '[': - case '(': addPatternStart = true - } - - // Hack to work around lack of negative lookbehind in JS - // A pattern like: *.!(x).!(y|z) needs to ensure that a name - // like 'a.xyz.yz' doesn't match. So, the first negative - // lookahead, has to look ALL the way ahead, to the end of - // the pattern. - for (var n = negativeLists.length - 1; n > -1; n--) { - var nl = negativeLists[n] - - var nlBefore = re.slice(0, nl.reStart) - var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) - var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) - var nlAfter = re.slice(nl.reEnd) - - nlLast += nlAfter - - // Handle nested stuff like *(*.js|!(*.json)), where open parens - // mean that we should *not* include the ) in the bit that is considered - // "after" the negated section. - var openParensBefore = nlBefore.split('(').length - 1 - var cleanAfter = nlAfter - for (i = 0; i < openParensBefore; i++) { - cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') - } - nlAfter = cleanAfter - - var dollar = '' - if (nlAfter === '' && isSub !== SUBPARSE) { - dollar = '$' - } - var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast - re = newRe - } - - // if the re is not "" at this point, then we need to make sure - // it doesn't match against an empty path part. - // Otherwise a/* will match a/, which it should not. - if (re !== '' && hasMagic) { - re = '(?=.)' + re - } - - if (addPatternStart) { - re = patternStart + re - } - - // parsing just a piece of a larger pattern. - if (isSub === SUBPARSE) { - return [re, hasMagic] - } - - // skip the regexp for non-magical patterns - // unescape anything in it, though, so that it'll be - // an exact match against a file etc. - if (!hasMagic) { - return globUnescape(pattern) - } - - var flags = options.nocase ? 'i' : '' - var regExp = new RegExp('^' + re + '$', flags) - - regExp._glob = pattern - regExp._src = re - - return regExp -} - -minimatch.makeRe = function (pattern, options) { - return new Minimatch(pattern, options || {}).makeRe() -} - -Minimatch.prototype.makeRe = makeRe -function makeRe () { - if (this.regexp || this.regexp === false) return this.regexp - - // at this point, this.set is a 2d array of partial - // pattern strings, or "**". - // - // It's better to use .match(). This function shouldn't - // be used, really, but it's pretty convenient sometimes, - // when you just want to work with a regex. - var set = this.set - - if (!set.length) { - this.regexp = false - return this.regexp - } - var options = this.options - - var twoStar = options.noglobstar ? star - : options.dot ? twoStarDot - : twoStarNoDot - var flags = options.nocase ? 'i' : '' - - var re = set.map(function (pattern) { - return pattern.map(function (p) { - return (p === GLOBSTAR) ? twoStar - : (typeof p === 'string') ? regExpEscape(p) - : p._src - }).join('\\\/') - }).join('|') - - // must match entire pattern - // ending in a * or ** will make it less strict. - re = '^(?:' + re + ')$' - - // can match anything, as long as it's not this. - if (this.negate) re = '^(?!' + re + ').*$' - - try { - this.regexp = new RegExp(re, flags) - } catch (ex) { - this.regexp = false - } - return this.regexp -} - -minimatch.match = function (list, pattern, options) { - options = options || {} - var mm = new Minimatch(pattern, options) - list = list.filter(function (f) { - return mm.match(f) - }) - if (mm.options.nonull && !list.length) { - list.push(pattern) - } - return list -} - -Minimatch.prototype.match = match -function match (f, partial) { - this.debug('match', f, this.pattern) - // short-circuit in the case of busted things. - // comments, etc. - if (this.comment) return false - if (this.empty) return f === '' - - if (f === '/' && partial) return true - - var options = this.options - - // windows: need to use /, not \ - if (path.sep !== '/') { - f = f.split(path.sep).join('/') - } - - // treat the test path as a set of pathparts. - f = f.split(slashSplit) - this.debug(this.pattern, 'split', f) - - // just ONE of the pattern sets in this.set needs to match - // in order for it to be valid. If negating, then just one - // match means that we have failed. - // Either way, return on the first hit. - - var set = this.set - this.debug(this.pattern, 'set', set) - - // Find the basename of the path by looking for the last non-empty segment - var filename - var i - for (i = f.length - 1; i >= 0; i--) { - filename = f[i] - if (filename) break - } - - for (i = 0; i < set.length; i++) { - var pattern = set[i] - var file = f - if (options.matchBase && pattern.length === 1) { - file = [filename] - } - var hit = this.matchOne(file, pattern, partial) - if (hit) { - if (options.flipNegate) return true - return !this.negate - } - } - - // didn't get any hits. this is success if it's a negative - // pattern, failure otherwise. - if (options.flipNegate) return false - return this.negate -} - -// set partial to true to test if, for example, -// "/a/b" matches the start of "/*/b/*/d" -// Partial means, if you run out of file before you run -// out of pattern, then that's fine, as long as all -// the parts match. -Minimatch.prototype.matchOne = function (file, pattern, partial) { - var options = this.options - - this.debug('matchOne', - { 'this': this, file: file, pattern: pattern }) - - this.debug('matchOne', file.length, pattern.length) - - for (var fi = 0, - pi = 0, - fl = file.length, - pl = pattern.length - ; (fi < fl) && (pi < pl) - ; fi++, pi++) { - this.debug('matchOne loop') - var p = pattern[pi] - var f = file[fi] - - this.debug(pattern, p, f) - - // should be impossible. - // some invalid regexp stuff in the set. - if (p === false) return false - - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]) - - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi - var pr = pi + 1 - if (pr === pl) { - this.debug('** at the end') - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) return false - } - return true - } - - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr] - - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) - - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee) - // found a match. - return true - } else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr) - break - } - - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue') - fr++ - } - } - - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - // If there's more *pattern* left, then - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr) - if (fr === fl) return true - } - return false - } - - // something other than ** - // non-magic patterns just have to match exactly - // patterns with magic have been turned into regexps. - var hit - if (typeof p === 'string') { - if (options.nocase) { - hit = f.toLowerCase() === p.toLowerCase() - } else { - hit = f === p - } - this.debug('string match', p, f, hit) - } else { - hit = f.match(p) - this.debug('pattern match', p, f, hit) - } - - if (!hit) return false - } - - // Note: ending in / means that we'll get a final "" - // at the end of the pattern. This can only match a - // corresponding "" at the end of the file. - // If the file ends in /, then it can only match a - // a pattern that ends in /, unless the pattern just - // doesn't have any more for it. But, a/b/ should *not* - // match "a/b/*", even though "" matches against the - // [^/]*? pattern, except in partial mode, where it might - // simply not be reached yet. - // However, a/b/ should still satisfy a/* - - // now either we fell off the end of the pattern, or we're done. - if (fi === fl && pi === pl) { - // ran out of pattern and filename at the same time. - // an exact hit! - return true - } else if (fi === fl) { - // ran out of file, but still had pattern left. - // this is ok if we're doing the match as part of - // a glob fs traversal. - return partial - } else if (pi === pl) { - // ran out of pattern, still have file left. - // this is only acceptable if we're on the very last - // empty segment of a file with a trailing slash. - // a/* should match a/b/ - var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') - return emptyFileEnd - } - - // should be unreachable. - throw new Error('wtf?') -} - -// replace stuff like \* with * -function globUnescape (s) { - return s.replace(/\\(.)/g, '$1') -} - -function regExpEscape (s) { - return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') -} - -},{"brace-expansion":2,"path":undefined}],2:[function(require,module,exports){ -var concatMap = require('concat-map'); -var balanced = require('balanced-match'); - -module.exports = expandTop; - -var escSlash = '\0SLASH'+Math.random()+'\0'; -var escOpen = '\0OPEN'+Math.random()+'\0'; -var escClose = '\0CLOSE'+Math.random()+'\0'; -var escComma = '\0COMMA'+Math.random()+'\0'; -var escPeriod = '\0PERIOD'+Math.random()+'\0'; - -function numeric(str) { - return parseInt(str, 10) == str - ? parseInt(str, 10) - : str.charCodeAt(0); -} - -function escapeBraces(str) { - return str.split('\\\\').join(escSlash) - .split('\\{').join(escOpen) - .split('\\}').join(escClose) - .split('\\,').join(escComma) - .split('\\.').join(escPeriod); -} - -function unescapeBraces(str) { - return str.split(escSlash).join('\\') - .split(escOpen).join('{') - .split(escClose).join('}') - .split(escComma).join(',') - .split(escPeriod).join('.'); -} - - -// Basically just str.split(","), but handling cases -// where we have nested braced sections, which should be -// treated as individual members, like {a,{b,c},d} -function parseCommaParts(str) { - if (!str) - return ['']; - - var parts = []; - var m = balanced('{', '}', str); - - if (!m) - return str.split(','); - - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(','); - - p[p.length-1] += '{' + body + '}'; - var postParts = parseCommaParts(post); - if (post.length) { - p[p.length-1] += postParts.shift(); - p.push.apply(p, postParts); - } - - parts.push.apply(parts, p); - - return parts; -} - -function expandTop(str) { - if (!str) - return []; - - var expansions = expand(escapeBraces(str)); - return expansions.filter(identity).map(unescapeBraces); -} - -function identity(e) { - return e; -} - -function embrace(str) { - return '{' + str + '}'; -} -function isPadded(el) { - return /^-?0\d/.test(el); -} - -function lte(i, y) { - return i <= y; -} -function gte(i, y) { - return i >= y; -} - -function expand(str) { - var expansions = []; - - var m = balanced('{', '}', str); - if (!m || /\$$/.test(m.pre)) return [str]; - - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = /^(.*,)+(.+)?$/.test(m.body); - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,.*}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str); - } - return [str]; - } - - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0]).map(embrace); - if (n.length === 1) { - var post = m.post.length - ? expand(m.post) - : ['']; - return post.map(function(p) { - return m.pre + n[0] + p; - }); - } - } - } - - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. - - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post) - : ['']; - - var N; - - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length) - var incr = n.length == 3 - ? Math.abs(numeric(n[2])) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); - - N = []; - - for (var i = x; test(i, y); i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; - } - } - } - N.push(c); - } - } else { - N = concatMap(n, function(el) { return expand(el) }); - } - - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - expansions.push([pre, N[j], post[k]].join('')) - } - } - - return expansions; -} - - -},{"balanced-match":3,"concat-map":4}],3:[function(require,module,exports){ -module.exports = balanced; -function balanced(a, b, str) { - var bal = 0; - var m = {}; - var ended = false; - - for (var i = 0; i < str.length; i++) { - if (a == str.substr(i, a.length)) { - if (!('start' in m)) m.start = i; - bal++; - } - else if (b == str.substr(i, b.length) && 'start' in m) { - ended = true; - bal--; - if (!bal) { - m.end = i; - m.pre = str.substr(0, m.start); - m.body = (m.end - m.start > 1) - ? str.substring(m.start + a.length, m.end) - : ''; - m.post = str.slice(m.end + b.length); - return m; - } - } - } - - // if we opened more than we closed, find the one we closed - if (bal && ended) { - var start = m.start + a.length; - m = balanced(a, b, str.substr(start)); - if (m) { - m.start += start; - m.end += start; - m.pre = str.slice(0, start) + m.pre; - } - return m; - } -} - -},{}],4:[function(require,module,exports){ -module.exports = function (xs, fn) { - var res = []; - for (var i = 0; i < xs.length; i++) { - var x = fn(xs[i], i); - if (Array.isArray(x)) res.push.apply(res, x); - else res.push(x); - } - return res; -}; - -},{}]},{},[1])(1) -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js deleted file mode 100644 index ec4c05c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js +++ /dev/null @@ -1,912 +0,0 @@ -module.exports = minimatch -minimatch.Minimatch = Minimatch - -var path = { sep: '/' } -try { - path = require('path') -} catch (er) {} - -var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} -var expand = require('brace-expansion') - -// any single thing other than / -// don't need to escape / when using new RegExp() -var qmark = '[^/]' - -// * => any number of characters -var star = qmark + '*?' - -// ** when dots are allowed. Anything goes, except .. and . -// not (^ or / followed by one or two dots followed by $ or /), -// followed by anything, any number of times. -var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' - -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' - -// characters that need to be escaped in RegExp. -var reSpecials = charSet('().*{}+?[]^$\\!') - -// "abc" -> { a:true, b:true, c:true } -function charSet (s) { - return s.split('').reduce(function (set, c) { - set[c] = true - return set - }, {}) -} - -// normalizes slashes. -var slashSplit = /\/+/ - -minimatch.filter = filter -function filter (pattern, options) { - options = options || {} - return function (p, i, list) { - return minimatch(p, pattern, options) - } -} - -function ext (a, b) { - a = a || {} - b = b || {} - var t = {} - Object.keys(b).forEach(function (k) { - t[k] = b[k] - }) - Object.keys(a).forEach(function (k) { - t[k] = a[k] - }) - return t -} - -minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return minimatch - - var orig = minimatch - - var m = function minimatch (p, pattern, options) { - return orig.minimatch(p, pattern, ext(def, options)) - } - - m.Minimatch = function Minimatch (pattern, options) { - return new orig.Minimatch(pattern, ext(def, options)) - } - - return m -} - -Minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return Minimatch - return minimatch.defaults(def).Minimatch -} - -function minimatch (p, pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {} - - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - return false - } - - // "" only matches "" - if (pattern.trim() === '') return p === '' - - return new Minimatch(pattern, options).match(p) -} - -function Minimatch (pattern, options) { - if (!(this instanceof Minimatch)) { - return new Minimatch(pattern, options) - } - - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {} - pattern = pattern.trim() - - // windows support: need to use /, not \ - if (path.sep !== '/') { - pattern = pattern.split(path.sep).join('/') - } - - this.options = options - this.set = [] - this.pattern = pattern - this.regexp = null - this.negate = false - this.comment = false - this.empty = false - - // make the set of regexps etc. - this.make() -} - -Minimatch.prototype.debug = function () {} - -Minimatch.prototype.make = make -function make () { - // don't do it more than once. - if (this._made) return - - var pattern = this.pattern - var options = this.options - - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - this.comment = true - return - } - if (!pattern) { - this.empty = true - return - } - - // step 1: figure out negation, etc. - this.parseNegate() - - // step 2: expand braces - var set = this.globSet = this.braceExpand() - - if (options.debug) this.debug = console.error - - this.debug(this.pattern, set) - - // step 3: now we have a set, so turn each one into a series of path-portion - // matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - set = this.globParts = set.map(function (s) { - return s.split(slashSplit) - }) - - this.debug(this.pattern, set) - - // glob --> regexps - set = set.map(function (s, si, set) { - return s.map(this.parse, this) - }, this) - - this.debug(this.pattern, set) - - // filter out everything that didn't compile properly. - set = set.filter(function (s) { - return s.indexOf(false) === -1 - }) - - this.debug(this.pattern, set) - - this.set = set -} - -Minimatch.prototype.parseNegate = parseNegate -function parseNegate () { - var pattern = this.pattern - var negate = false - var options = this.options - var negateOffset = 0 - - if (options.nonegate) return - - for (var i = 0, l = pattern.length - ; i < l && pattern.charAt(i) === '!' - ; i++) { - negate = !negate - negateOffset++ - } - - if (negateOffset) this.pattern = pattern.substr(negateOffset) - this.negate = negate -} - -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -minimatch.braceExpand = function (pattern, options) { - return braceExpand(pattern, options) -} - -Minimatch.prototype.braceExpand = braceExpand - -function braceExpand (pattern, options) { - if (!options) { - if (this instanceof Minimatch) { - options = this.options - } else { - options = {} - } - } - - pattern = typeof pattern === 'undefined' - ? this.pattern : pattern - - if (typeof pattern === 'undefined') { - throw new Error('undefined pattern') - } - - if (options.nobrace || - !pattern.match(/\{.*\}/)) { - // shortcut. no need to expand. - return [pattern] - } - - return expand(pattern) -} - -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -Minimatch.prototype.parse = parse -var SUBPARSE = {} -function parse (pattern, isSub) { - var options = this.options - - // shortcuts - if (!options.noglobstar && pattern === '**') return GLOBSTAR - if (pattern === '') return '' - - var re = '' - var hasMagic = !!options.nocase - var escaping = false - // ? => one single character - var patternListStack = [] - var negativeLists = [] - var plType - var stateChar - var inClass = false - var reClassStart = -1 - var classStart = -1 - // . and .. never match anything that doesn't start with ., - // even when options.dot is set. - var patternStart = pattern.charAt(0) === '.' ? '' // anything - // not (start or / followed by . or .. followed by / or end) - : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' - : '(?!\\.)' - var self = this - - function clearStateChar () { - if (stateChar) { - // we had some state-tracking character - // that wasn't consumed by this pass. - switch (stateChar) { - case '*': - re += star - hasMagic = true - break - case '?': - re += qmark - hasMagic = true - break - default: - re += '\\' + stateChar - break - } - self.debug('clearStateChar %j %j', stateChar, re) - stateChar = false - } - } - - for (var i = 0, len = pattern.length, c - ; (i < len) && (c = pattern.charAt(i)) - ; i++) { - this.debug('%s\t%s %s %j', pattern, i, re, c) - - // skip over any that are escaped. - if (escaping && reSpecials[c]) { - re += '\\' + c - escaping = false - continue - } - - switch (c) { - case '/': - // completely not allowed, even escaped. - // Should already be path-split by now. - return false - - case '\\': - clearStateChar() - escaping = true - continue - - // the various stateChar values - // for the "extglob" stuff. - case '?': - case '*': - case '+': - case '@': - case '!': - this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) - - // all of those are literals inside a class, except that - // the glob [!a] means [^a] in regexp - if (inClass) { - this.debug(' in class') - if (c === '!' && i === classStart + 1) c = '^' - re += c - continue - } - - // if we already have a stateChar, then it means - // that there was something like ** or +? in there. - // Handle the stateChar, then proceed with this one. - self.debug('call clearStateChar %j', stateChar) - clearStateChar() - stateChar = c - // if extglob is disabled, then +(asdf|foo) isn't a thing. - // just clear the statechar *now*, rather than even diving into - // the patternList stuff. - if (options.noext) clearStateChar() - continue - - case '(': - if (inClass) { - re += '(' - continue - } - - if (!stateChar) { - re += '\\(' - continue - } - - plType = stateChar - patternListStack.push({ - type: plType, - start: i - 1, - reStart: re.length - }) - // negation is (?:(?!js)[^/]*) - re += stateChar === '!' ? '(?:(?!(?:' : '(?:' - this.debug('plType %j %j', stateChar, re) - stateChar = false - continue - - case ')': - if (inClass || !patternListStack.length) { - re += '\\)' - continue - } - - clearStateChar() - hasMagic = true - re += ')' - var pl = patternListStack.pop() - plType = pl.type - // negation is (?:(?!js)[^/]*) - // The others are (?:) - switch (plType) { - case '!': - negativeLists.push(pl) - re += ')[^/]*?)' - pl.reEnd = re.length - break - case '?': - case '+': - case '*': - re += plType - break - case '@': break // the default anyway - } - continue - - case '|': - if (inClass || !patternListStack.length || escaping) { - re += '\\|' - escaping = false - continue - } - - clearStateChar() - re += '|' - continue - - // these are mostly the same in regexp and glob - case '[': - // swallow any state-tracking char before the [ - clearStateChar() - - if (inClass) { - re += '\\' + c - continue - } - - inClass = true - classStart = i - reClassStart = re.length - re += c - continue - - case ']': - // a right bracket shall lose its special - // meaning and represent itself in - // a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - if (i === classStart + 1 || !inClass) { - re += '\\' + c - escaping = false - continue - } - - // handle the case where we left a class open. - // "[z-a]" is valid, equivalent to "\[z-a\]" - if (inClass) { - // split where the last [ was, make sure we don't have - // an invalid re. if so, re-walk the contents of the - // would-be class to re-translate any characters that - // were passed through as-is - // TODO: It would probably be faster to determine this - // without a try/catch and a new RegExp, but it's tricky - // to do safely. For now, this is safe and works. - var cs = pattern.substring(classStart + 1, i) - try { - RegExp('[' + cs + ']') - } catch (er) { - // not a valid class! - var sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' - hasMagic = hasMagic || sp[1] - inClass = false - continue - } - } - - // finish up the class. - hasMagic = true - inClass = false - re += c - continue - - default: - // swallow any state char that wasn't consumed - clearStateChar() - - if (escaping) { - // no need - escaping = false - } else if (reSpecials[c] - && !(c === '^' && inClass)) { - re += '\\' - } - - re += c - - } // switch - } // for - - // handle the case where we left a class open. - // "[abc" is valid, equivalent to "\[abc" - if (inClass) { - // split where the last [ was, and escape it - // this is a huge pita. We now have to re-walk - // the contents of the would-be class to re-translate - // any characters that were passed through as-is - cs = pattern.substr(classStart + 1) - sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] - hasMagic = hasMagic || sp[1] - } - - // handle the case where we had a +( thing at the *end* - // of the pattern. - // each pattern list stack adds 3 chars, and we need to go through - // and escape any | chars that were passed through as-is for the regexp. - // Go through and escape them, taking care not to double-escape any - // | chars that were already escaped. - for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + 3) - // maybe some even number of \, then maybe 1 \, followed by a | - tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { - if (!$2) { - // the | isn't already escaped, so escape it. - $2 = '\\' - } - - // need to escape all those slashes *again*, without escaping the - // one that we need for escaping the | character. As it works out, - // escaping an even number of slashes can be done by simply repeating - // it exactly after itself. That's why this trick works. - // - // I am sorry that you have to see this. - return $1 + $1 + $2 + '|' - }) - - this.debug('tail=%j\n %s', tail, tail) - var t = pl.type === '*' ? star - : pl.type === '?' ? qmark - : '\\' + pl.type - - hasMagic = true - re = re.slice(0, pl.reStart) + t + '\\(' + tail - } - - // handle trailing things that only matter at the very end. - clearStateChar() - if (escaping) { - // trailing \\ - re += '\\\\' - } - - // only need to apply the nodot start if the re starts with - // something that could conceivably capture a dot - var addPatternStart = false - switch (re.charAt(0)) { - case '.': - case '[': - case '(': addPatternStart = true - } - - // Hack to work around lack of negative lookbehind in JS - // A pattern like: *.!(x).!(y|z) needs to ensure that a name - // like 'a.xyz.yz' doesn't match. So, the first negative - // lookahead, has to look ALL the way ahead, to the end of - // the pattern. - for (var n = negativeLists.length - 1; n > -1; n--) { - var nl = negativeLists[n] - - var nlBefore = re.slice(0, nl.reStart) - var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) - var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) - var nlAfter = re.slice(nl.reEnd) - - nlLast += nlAfter - - // Handle nested stuff like *(*.js|!(*.json)), where open parens - // mean that we should *not* include the ) in the bit that is considered - // "after" the negated section. - var openParensBefore = nlBefore.split('(').length - 1 - var cleanAfter = nlAfter - for (i = 0; i < openParensBefore; i++) { - cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') - } - nlAfter = cleanAfter - - var dollar = '' - if (nlAfter === '' && isSub !== SUBPARSE) { - dollar = '$' - } - var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast - re = newRe - } - - // if the re is not "" at this point, then we need to make sure - // it doesn't match against an empty path part. - // Otherwise a/* will match a/, which it should not. - if (re !== '' && hasMagic) { - re = '(?=.)' + re - } - - if (addPatternStart) { - re = patternStart + re - } - - // parsing just a piece of a larger pattern. - if (isSub === SUBPARSE) { - return [re, hasMagic] - } - - // skip the regexp for non-magical patterns - // unescape anything in it, though, so that it'll be - // an exact match against a file etc. - if (!hasMagic) { - return globUnescape(pattern) - } - - var flags = options.nocase ? 'i' : '' - var regExp = new RegExp('^' + re + '$', flags) - - regExp._glob = pattern - regExp._src = re - - return regExp -} - -minimatch.makeRe = function (pattern, options) { - return new Minimatch(pattern, options || {}).makeRe() -} - -Minimatch.prototype.makeRe = makeRe -function makeRe () { - if (this.regexp || this.regexp === false) return this.regexp - - // at this point, this.set is a 2d array of partial - // pattern strings, or "**". - // - // It's better to use .match(). This function shouldn't - // be used, really, but it's pretty convenient sometimes, - // when you just want to work with a regex. - var set = this.set - - if (!set.length) { - this.regexp = false - return this.regexp - } - var options = this.options - - var twoStar = options.noglobstar ? star - : options.dot ? twoStarDot - : twoStarNoDot - var flags = options.nocase ? 'i' : '' - - var re = set.map(function (pattern) { - return pattern.map(function (p) { - return (p === GLOBSTAR) ? twoStar - : (typeof p === 'string') ? regExpEscape(p) - : p._src - }).join('\\\/') - }).join('|') - - // must match entire pattern - // ending in a * or ** will make it less strict. - re = '^(?:' + re + ')$' - - // can match anything, as long as it's not this. - if (this.negate) re = '^(?!' + re + ').*$' - - try { - this.regexp = new RegExp(re, flags) - } catch (ex) { - this.regexp = false - } - return this.regexp -} - -minimatch.match = function (list, pattern, options) { - options = options || {} - var mm = new Minimatch(pattern, options) - list = list.filter(function (f) { - return mm.match(f) - }) - if (mm.options.nonull && !list.length) { - list.push(pattern) - } - return list -} - -Minimatch.prototype.match = match -function match (f, partial) { - this.debug('match', f, this.pattern) - // short-circuit in the case of busted things. - // comments, etc. - if (this.comment) return false - if (this.empty) return f === '' - - if (f === '/' && partial) return true - - var options = this.options - - // windows: need to use /, not \ - if (path.sep !== '/') { - f = f.split(path.sep).join('/') - } - - // treat the test path as a set of pathparts. - f = f.split(slashSplit) - this.debug(this.pattern, 'split', f) - - // just ONE of the pattern sets in this.set needs to match - // in order for it to be valid. If negating, then just one - // match means that we have failed. - // Either way, return on the first hit. - - var set = this.set - this.debug(this.pattern, 'set', set) - - // Find the basename of the path by looking for the last non-empty segment - var filename - var i - for (i = f.length - 1; i >= 0; i--) { - filename = f[i] - if (filename) break - } - - for (i = 0; i < set.length; i++) { - var pattern = set[i] - var file = f - if (options.matchBase && pattern.length === 1) { - file = [filename] - } - var hit = this.matchOne(file, pattern, partial) - if (hit) { - if (options.flipNegate) return true - return !this.negate - } - } - - // didn't get any hits. this is success if it's a negative - // pattern, failure otherwise. - if (options.flipNegate) return false - return this.negate -} - -// set partial to true to test if, for example, -// "/a/b" matches the start of "/*/b/*/d" -// Partial means, if you run out of file before you run -// out of pattern, then that's fine, as long as all -// the parts match. -Minimatch.prototype.matchOne = function (file, pattern, partial) { - var options = this.options - - this.debug('matchOne', - { 'this': this, file: file, pattern: pattern }) - - this.debug('matchOne', file.length, pattern.length) - - for (var fi = 0, - pi = 0, - fl = file.length, - pl = pattern.length - ; (fi < fl) && (pi < pl) - ; fi++, pi++) { - this.debug('matchOne loop') - var p = pattern[pi] - var f = file[fi] - - this.debug(pattern, p, f) - - // should be impossible. - // some invalid regexp stuff in the set. - if (p === false) return false - - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]) - - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi - var pr = pi + 1 - if (pr === pl) { - this.debug('** at the end') - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) return false - } - return true - } - - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr] - - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) - - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee) - // found a match. - return true - } else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr) - break - } - - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue') - fr++ - } - } - - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - // If there's more *pattern* left, then - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr) - if (fr === fl) return true - } - return false - } - - // something other than ** - // non-magic patterns just have to match exactly - // patterns with magic have been turned into regexps. - var hit - if (typeof p === 'string') { - if (options.nocase) { - hit = f.toLowerCase() === p.toLowerCase() - } else { - hit = f === p - } - this.debug('string match', p, f, hit) - } else { - hit = f.match(p) - this.debug('pattern match', p, f, hit) - } - - if (!hit) return false - } - - // Note: ending in / means that we'll get a final "" - // at the end of the pattern. This can only match a - // corresponding "" at the end of the file. - // If the file ends in /, then it can only match a - // a pattern that ends in /, unless the pattern just - // doesn't have any more for it. But, a/b/ should *not* - // match "a/b/*", even though "" matches against the - // [^/]*? pattern, except in partial mode, where it might - // simply not be reached yet. - // However, a/b/ should still satisfy a/* - - // now either we fell off the end of the pattern, or we're done. - if (fi === fl && pi === pl) { - // ran out of pattern and filename at the same time. - // an exact hit! - return true - } else if (fi === fl) { - // ran out of file, but still had pattern left. - // this is ok if we're doing the match as part of - // a glob fs traversal. - return partial - } else if (pi === pl) { - // ran out of pattern, still have file left. - // this is only acceptable if we're on the very last - // empty segment of a file with a trailing slash. - // a/* should match a/b/ - var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') - return emptyFileEnd - } - - // should be unreachable. - throw new Error('wtf?') -} - -// replace stuff like \* with * -function globUnescape (s) { - return s.replace(/\\(.)/g, '$1') -} - -function regExpEscape (s) { - return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore deleted file mode 100644 index 249bc20..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -*.sw* diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml deleted file mode 100644 index 6e5919d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ -language: node_js -node_js: - - "0.10" diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md deleted file mode 100644 index 62bc7ba..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md +++ /dev/null @@ -1,121 +0,0 @@ -# brace-expansion - -[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), -as known from sh/bash, in JavaScript. - -[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) - -[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) - -## Example - -```js -var expand = require('brace-expansion'); - -expand('file-{a,b,c}.jpg') -// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] - -expand('-v{,,}') -// => ['-v', '-v', '-v'] - -expand('file{0..2}.jpg') -// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] - -expand('file-{a..c}.jpg') -// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] - -expand('file{2..0}.jpg') -// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] - -expand('file{0..4..2}.jpg') -// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] - -expand('file-{a..e..2}.jpg') -// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] - -expand('file{00..10..5}.jpg') -// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] - -expand('{{A..C},{a..c}}') -// => ['A', 'B', 'C', 'a', 'b', 'c'] - -expand('ppp{,config,oe{,conf}}') -// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] -``` - -## API - -```js -var expand = require('brace-expansion'); -``` - -### var expanded = expand(str) - -Return an array of all possible and valid expansions of `str`. If none are -found, `[str]` is returned. - -Valid expansions are: - -```js -/^(.*,)+(.+)?$/ -// {a,b,...} -``` - -A comma seperated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. - -```js -/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ -// {x..y[..incr]} -``` - -A numeric sequence from `x` to `y` inclusive, with optional increment. -If `x` or `y` start with a leading `0`, all the numbers will be padded -to have equal length. Negative numbers and backwards iteration work too. - -```js -/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ -// {x..y[..incr]} -``` - -An alphabetic sequence from `x` to `y` inclusive, with optional increment. -`x` and `y` must be exactly one character, and if given, `incr` must be a -number. - -For compatibility reasons, the string `${` is not eligible for brace expansion. - -## Installation - -With [npm](https://npmjs.org) do: - -```bash -npm install brace-expansion -``` - -## Contributors - -- [Julian Gruber](https://github.com/juliangruber) -- [Isaac Z. Schlueter](https://github.com/isaacs) - -## License - -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js deleted file mode 100644 index 60ecfc7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js +++ /dev/null @@ -1,8 +0,0 @@ -var expand = require('./'); - -console.log(expand('http://any.org/archive{1996..1999}/vol{1..4}/part{a,b,c}.html')); -console.log(expand('http://www.numericals.com/file{1..100..10}.txt')); -console.log(expand('http://www.letters.com/file{a..z..2}.txt')); -console.log(expand('mkdir /usr/local/src/bash/{old,new,dist,bugs}')); -console.log(expand('chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}')); - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js deleted file mode 100644 index a23104e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js +++ /dev/null @@ -1,191 +0,0 @@ -var concatMap = require('concat-map'); -var balanced = require('balanced-match'); - -module.exports = expandTop; - -var escSlash = '\0SLASH'+Math.random()+'\0'; -var escOpen = '\0OPEN'+Math.random()+'\0'; -var escClose = '\0CLOSE'+Math.random()+'\0'; -var escComma = '\0COMMA'+Math.random()+'\0'; -var escPeriod = '\0PERIOD'+Math.random()+'\0'; - -function numeric(str) { - return parseInt(str, 10) == str - ? parseInt(str, 10) - : str.charCodeAt(0); -} - -function escapeBraces(str) { - return str.split('\\\\').join(escSlash) - .split('\\{').join(escOpen) - .split('\\}').join(escClose) - .split('\\,').join(escComma) - .split('\\.').join(escPeriod); -} - -function unescapeBraces(str) { - return str.split(escSlash).join('\\') - .split(escOpen).join('{') - .split(escClose).join('}') - .split(escComma).join(',') - .split(escPeriod).join('.'); -} - - -// Basically just str.split(","), but handling cases -// where we have nested braced sections, which should be -// treated as individual members, like {a,{b,c},d} -function parseCommaParts(str) { - if (!str) - return ['']; - - var parts = []; - var m = balanced('{', '}', str); - - if (!m) - return str.split(','); - - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(','); - - p[p.length-1] += '{' + body + '}'; - var postParts = parseCommaParts(post); - if (post.length) { - p[p.length-1] += postParts.shift(); - p.push.apply(p, postParts); - } - - parts.push.apply(parts, p); - - return parts; -} - -function expandTop(str) { - if (!str) - return []; - - return expand(escapeBraces(str), true).map(unescapeBraces); -} - -function identity(e) { - return e; -} - -function embrace(str) { - return '{' + str + '}'; -} -function isPadded(el) { - return /^-?0\d/.test(el); -} - -function lte(i, y) { - return i <= y; -} -function gte(i, y) { - return i >= y; -} - -function expand(str, isTop) { - var expansions = []; - - var m = balanced('{', '}', str); - if (!m || /\$$/.test(m.pre)) return [str]; - - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = /^(.*,)+(.+)?$/.test(m.body); - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,.*}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str); - } - return [str]; - } - - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0], false).map(embrace); - if (n.length === 1) { - var post = m.post.length - ? expand(m.post, false) - : ['']; - return post.map(function(p) { - return m.pre + n[0] + p; - }); - } - } - } - - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. - - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post, false) - : ['']; - - var N; - - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length) - var incr = n.length == 3 - ? Math.abs(numeric(n[2])) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); - - N = []; - - for (var i = x; test(i, y); i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; - } - } - } - N.push(c); - } - } else { - N = concatMap(n, function(el) { return expand(el, false) }); - } - - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) - expansions.push(expansion); - } - } - - return expansions; -} - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore deleted file mode 100644 index fd4f2b0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -.DS_Store diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml deleted file mode 100644 index cc4dba2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile deleted file mode 100644 index fa5da71..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile +++ /dev/null @@ -1,6 +0,0 @@ - -test: - @node_modules/.bin/tape test/*.js - -.PHONY: test - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md deleted file mode 100644 index 2aff0eb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# balanced-match - -Match balanced string pairs, like `{` and `}` or `` and ``. - -[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) -[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) - -[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) - -## Example - -Get the first matching pair of braces: - -```js -var balanced = require('balanced-match'); - -console.log(balanced('{', '}', 'pre{in{nested}}post')); -console.log(balanced('{', '}', 'pre{first}between{second}post')); -``` - -The matches are: - -```bash -$ node example.js -{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } -{ start: 3, - end: 9, - pre: 'pre', - body: 'first', - post: 'between{second}post' } -``` - -## API - -### var m = balanced(a, b, str) - -For the first non-nested matching pair of `a` and `b` in `str`, return an -object with those keys: - -* **start** the index of the first match of `a` -* **end** the index of the matching `b` -* **pre** the preamble, `a` and `b` not included -* **body** the match, `a` and `b` not included -* **post** the postscript, `a` and `b` not included - -If there's no match, `undefined` will be returned. - -If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']`. - -## Installation - -With [npm](https://npmjs.org) do: - -```bash -npm install balanced-match -``` - -## License - -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js deleted file mode 100644 index c02ad34..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js +++ /dev/null @@ -1,5 +0,0 @@ -var balanced = require('./'); - -console.log(balanced('{', '}', 'pre{in{nested}}post')); -console.log(balanced('{', '}', 'pre{first}between{second}post')); - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js deleted file mode 100644 index d165ae8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js +++ /dev/null @@ -1,38 +0,0 @@ -module.exports = balanced; -function balanced(a, b, str) { - var bal = 0; - var m = {}; - var ended = false; - - for (var i = 0; i < str.length; i++) { - if (a == str.substr(i, a.length)) { - if (!('start' in m)) m.start = i; - bal++; - } - else if (b == str.substr(i, b.length) && 'start' in m) { - ended = true; - bal--; - if (!bal) { - m.end = i; - m.pre = str.substr(0, m.start); - m.body = (m.end - m.start > 1) - ? str.substring(m.start + a.length, m.end) - : ''; - m.post = str.slice(m.end + b.length); - return m; - } - } - } - - // if we opened more than we closed, find the one we closed - if (bal && ended) { - var start = m.start + a.length; - m = balanced(a, b, str.substr(start)); - if (m) { - m.start += start; - m.end += start; - m.pre = str.slice(0, start) + m.pre; - } - return m; - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json deleted file mode 100644 index ede6efe..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "balanced-match", - "description": "Match balanced character pairs, like \"{\" and \"}\"", - "version": "0.2.0", - "repository": { - "type": "git", - "url": "git://github.com/juliangruber/balanced-match.git" - }, - "homepage": "https://github.com/juliangruber/balanced-match", - "main": "index.js", - "scripts": { - "test": "make test" - }, - "dependencies": {}, - "devDependencies": { - "tape": "~1.1.1" - }, - "keywords": [ - "match", - "regexp", - "test", - "balanced", - "parse" - ], - "author": { - "name": "Julian Gruber", - "email": "mail@juliangruber.com", - "url": "http://juliangruber.com" - }, - "license": "MIT", - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/8..latest", - "firefox/20..latest", - "firefox/nightly", - "chrome/25..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "gitHead": "ba40ed78e7114a4a67c51da768a100184dead39c", - "bugs": { - "url": "https://github.com/juliangruber/balanced-match/issues" - }, - "_id": "balanced-match@0.2.0", - "_shasum": "38f6730c03aab6d5edbb52bd934885e756d71674", - "_from": "balanced-match@>=0.2.0 <0.3.0", - "_npmVersion": "2.1.8", - "_nodeVersion": "0.10.32", - "_npmUser": { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - "maintainers": [ - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - } - ], - "dist": { - "shasum": "38f6730c03aab6d5edbb52bd934885e756d71674", - "tarball": "http://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js deleted file mode 100644 index 36bfd39..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js +++ /dev/null @@ -1,56 +0,0 @@ -var test = require('tape'); -var balanced = require('..'); - -test('balanced', function(t) { - t.deepEqual(balanced('{', '}', 'pre{in{nest}}post'), { - start: 3, - end: 12, - pre: 'pre', - body: 'in{nest}', - post: 'post' - }); - t.deepEqual(balanced('{', '}', '{{{{{{{{{in}post'), { - start: 8, - end: 11, - pre: '{{{{{{{{', - body: 'in', - post: 'post' - }); - t.deepEqual(balanced('{', '}', 'pre{body{in}post'), { - start: 8, - end: 11, - pre: 'pre{body', - body: 'in', - post: 'post' - }); - t.deepEqual(balanced('{', '}', 'pre}{in{nest}}post'), { - start: 4, - end: 13, - pre: 'pre}', - body: 'in{nest}', - post: 'post' - }); - t.deepEqual(balanced('{', '}', 'pre{body}between{body2}post'), { - start: 3, - end: 8, - pre: 'pre', - body: 'body', - post: 'between{body2}post' - }); - t.notOk(balanced('{', '}', 'nope'), 'should be notOk'); - t.deepEqual(balanced('', '', 'preinnestpost'), { - start: 3, - end: 19, - pre: 'pre', - body: 'innest', - post: 'post' - }); - t.deepEqual(balanced('', '', 'preinnestpost'), { - start: 7, - end: 23, - pre: 'pre', - body: 'innest', - post: 'post' - }); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE deleted file mode 100644 index ee27ba4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -This software is released under the MIT 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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown deleted file mode 100644 index 408f70a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown +++ /dev/null @@ -1,62 +0,0 @@ -concat-map -========== - -Concatenative mapdashery. - -[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map) - -[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map) - -example -======= - -``` js -var concatMap = require('concat-map'); -var xs = [ 1, 2, 3, 4, 5, 6 ]; -var ys = concatMap(xs, function (x) { - return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; -}); -console.dir(ys); -``` - -*** - -``` -[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ] -``` - -methods -======= - -``` js -var concatMap = require('concat-map') -``` - -concatMap(xs, fn) ------------------ - -Return an array of concatenated elements by calling `fn(x, i)` for each element -`x` and each index `i` in the array `xs`. - -When `fn(x, i)` returns an array, its result will be concatenated with the -result array. If `fn(x, i)` returns anything else, that value will be pushed -onto the end of the result array. - -install -======= - -With [npm](http://npmjs.org) do: - -``` -npm install concat-map -``` - -license -======= - -MIT - -notes -===== - -This module was written while sitting high above the ground in a tree. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js deleted file mode 100644 index 3365621..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js +++ /dev/null @@ -1,6 +0,0 @@ -var concatMap = require('../'); -var xs = [ 1, 2, 3, 4, 5, 6 ]; -var ys = concatMap(xs, function (x) { - return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; -}); -console.dir(ys); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js deleted file mode 100644 index b29a781..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = function (xs, fn) { - var res = []; - for (var i = 0; i < xs.length; i++) { - var x = fn(xs[i], i); - if (isArray(x)) res.push.apply(res, x); - else res.push(x); - } - return res; -}; - -var isArray = Array.isArray || function (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json deleted file mode 100644 index b516138..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "concat-map", - "description": "concatenative mapdashery", - "version": "0.0.1", - "repository": { - "type": "git", - "url": "git://github.com/substack/node-concat-map.git" - }, - "main": "index.js", - "keywords": [ - "concat", - "concatMap", - "map", - "functional", - "higher-order" - ], - "directories": { - "example": "example", - "test": "test" - }, - "scripts": { - "test": "tape test/*.js" - }, - "devDependencies": { - "tape": "~2.4.0" - }, - "license": "MIT", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "testling": { - "files": "test/*.js", - "browsers": { - "ie": [ - 6, - 7, - 8, - 9 - ], - "ff": [ - 3.5, - 10, - 15 - ], - "chrome": [ - 10, - 22 - ], - "safari": [ - 5.1 - ], - "opera": [ - 12 - ] - } - }, - "bugs": { - "url": "https://github.com/substack/node-concat-map/issues" - }, - "homepage": "https://github.com/substack/node-concat-map", - "_id": "concat-map@0.0.1", - "dist": { - "shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b", - "tarball": "http://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - }, - "_from": "concat-map@0.0.1", - "_npmVersion": "1.3.21", - "_npmUser": { - "name": "substack", - "email": "mail@substack.net" - }, - "maintainers": [ - { - "name": "substack", - "email": "mail@substack.net" - } - ], - "_shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b", - "_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js deleted file mode 100644 index fdbd702..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js +++ /dev/null @@ -1,39 +0,0 @@ -var concatMap = require('../'); -var test = require('tape'); - -test('empty or not', function (t) { - var xs = [ 1, 2, 3, 4, 5, 6 ]; - var ixes = []; - var ys = concatMap(xs, function (x, ix) { - ixes.push(ix); - return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; - }); - t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]); - t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]); - t.end(); -}); - -test('always something', function (t) { - var xs = [ 'a', 'b', 'c', 'd' ]; - var ys = concatMap(xs, function (x) { - return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ]; - }); - t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); - t.end(); -}); - -test('scalars', function (t) { - var xs = [ 'a', 'b', 'c', 'd' ]; - var ys = concatMap(xs, function (x) { - return x === 'b' ? [ 'B', 'B', 'B' ] : x; - }); - t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); - t.end(); -}); - -test('undefs', function (t) { - var xs = [ 'a', 'b', 'c', 'd' ]; - var ys = concatMap(xs, function () {}); - t.same(ys, [ undefined, undefined, undefined, undefined ]); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json deleted file mode 100644 index 5f1866c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "brace-expansion", - "description": "Brace expansion as known from sh/bash", - "version": "1.1.0", - "repository": { - "type": "git", - "url": "git://github.com/juliangruber/brace-expansion.git" - }, - "homepage": "https://github.com/juliangruber/brace-expansion", - "main": "index.js", - "scripts": { - "test": "tape test/*.js", - "gentest": "bash test/generate.sh" - }, - "dependencies": { - "balanced-match": "^0.2.0", - "concat-map": "0.0.1" - }, - "devDependencies": { - "tape": "^3.0.3" - }, - "keywords": [], - "author": { - "name": "Julian Gruber", - "email": "mail@juliangruber.com", - "url": "http://juliangruber.com" - }, - "license": "MIT", - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/8..latest", - "firefox/20..latest", - "firefox/nightly", - "chrome/25..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "gitHead": "b5fa3b1c74e5e2dba2d0efa19b28335641bc1164", - "bugs": { - "url": "https://github.com/juliangruber/brace-expansion/issues" - }, - "_id": "brace-expansion@1.1.0", - "_shasum": "c9b7d03c03f37bc704be100e522b40db8f6cfcd9", - "_from": "brace-expansion@>=1.0.0 <2.0.0", - "_npmVersion": "2.1.10", - "_nodeVersion": "0.10.32", - "_npmUser": { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - "maintainers": [ - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - { - "name": "isaacs", - "email": "isaacs@npmjs.com" - } - ], - "dist": { - "shasum": "c9b7d03c03f37bc704be100e522b40db8f6cfcd9", - "tarball": "http://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js deleted file mode 100644 index 5fe2b8a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js +++ /dev/null @@ -1,32 +0,0 @@ -var test = require('tape'); -var expand = require('..'); -var fs = require('fs'); -var resfile = __dirname + '/bash-results.txt'; -var cases = fs.readFileSync(resfile, 'utf8').split('><><><><'); - -// throw away the EOF marker -cases.pop() - -test('matches bash expansions', function(t) { - cases.forEach(function(testcase) { - var set = testcase.split('\n'); - var pattern = set.shift(); - var actual = expand(pattern); - - // If it expands to the empty string, then it's actually - // just nothing, but Bash is a singly typed language, so - // "nothing" is the same as "". - if (set.length === 1 && set[0] === '') { - set = [] - } else { - // otherwise, strip off the [] that were added so that - // "" expansions would be preserved properly. - set = set.map(function (s) { - return s.replace(/^\[|\]$/g, '') - }) - } - - t.same(actual, set, pattern); - }); - t.end(); -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt deleted file mode 100644 index 958148d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt +++ /dev/null @@ -1,1075 +0,0 @@ -A{b,{d,e},{f,g}}Z -[AbZ] -[AdZ] -[AeZ] -[AfZ] -[AgZ]><><><><><><><\{a,b}{{a,b},a,b} -[{a,b}a] -[{a,b}b] -[{a,b}a] -[{a,b}b]><><><><{{a,b} -[{a] -[{b]><><><><{a,b}} -[a}] -[b}]><><><><{,} -><><><><><><><{,}b -[b] -[b]><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><{-01..5} -[-01] -[000] -[001] -[002] -[003] -[004] -[005]><><><><{-05..100..5} -[-05] -[000] -[005] -[010] -[015] -[020] -[025] -[030] -[035] -[040] -[045] -[050] -[055] -[060] -[065] -[070] -[075] -[080] -[085] -[090] -[095] -[100]><><><><{-05..100} -[-05] -[-04] -[-03] -[-02] -[-01] -[000] -[001] -[002] -[003] -[004] -[005] -[006] -[007] -[008] -[009] -[010] -[011] -[012] -[013] -[014] -[015] -[016] -[017] -[018] -[019] -[020] -[021] -[022] -[023] -[024] -[025] -[026] -[027] -[028] -[029] -[030] -[031] -[032] -[033] -[034] -[035] -[036] -[037] -[038] -[039] -[040] -[041] -[042] -[043] -[044] -[045] -[046] -[047] -[048] -[049] -[050] -[051] -[052] -[053] -[054] -[055] -[056] -[057] -[058] -[059] -[060] -[061] -[062] -[063] -[064] -[065] -[066] -[067] -[068] -[069] -[070] -[071] -[072] -[073] -[074] -[075] -[076] -[077] -[078] -[079] -[080] -[081] -[082] -[083] -[084] -[085] -[086] -[087] -[088] -[089] -[090] -[091] -[092] -[093] -[094] -[095] -[096] -[097] -[098] -[099] -[100]><><><><{0..5..2} -[0] -[2] -[4]><><><><{0001..05..2} -[0001] -[0003] -[0005]><><><><{0001..-5..2} -[0001] -[-001] -[-003] -[-005]><><><><{0001..-5..-2} -[0001] -[-001] -[-003] -[-005]><><><><{0001..5..-2} -[0001] -[0003] -[0005]><><><><{01..5} -[01] -[02] -[03] -[04] -[05]><><><><{1..05} -[01] -[02] -[03] -[04] -[05]><><><><{1..05..3} -[01] -[04]><><><><{05..100} -[005] -[006] -[007] -[008] -[009] -[010] -[011] -[012] -[013] -[014] -[015] -[016] -[017] -[018] -[019] -[020] -[021] -[022] -[023] -[024] -[025] -[026] -[027] -[028] -[029] -[030] -[031] -[032] -[033] -[034] -[035] -[036] -[037] -[038] -[039] -[040] -[041] -[042] -[043] -[044] -[045] -[046] -[047] -[048] -[049] -[050] -[051] -[052] -[053] -[054] -[055] -[056] -[057] -[058] -[059] -[060] -[061] -[062] -[063] -[064] -[065] -[066] -[067] -[068] -[069] -[070] -[071] -[072] -[073] -[074] -[075] -[076] -[077] -[078] -[079] -[080] -[081] -[082] -[083] -[084] -[085] -[086] -[087] -[088] -[089] -[090] -[091] -[092] -[093] -[094] -[095] -[096] -[097] -[098] -[099] -[100]><><><><{0a..0z} -[{0a..0z}]><><><><{a,b\}c,d} -[a] -[b}c] -[d]><><><><{a,b{c,d} -[{a,bc] -[{a,bd]><><><><{a,b}c,d} -[ac,d}] -[bc,d}]><><><><{a..F} -[a] -[`] -[_] -[^] -[]] -[] -[[] -[Z] -[Y] -[X] -[W] -[V] -[U] -[T] -[S] -[R] -[Q] -[P] -[O] -[N] -[M] -[L] -[K] -[J] -[I] -[H] -[G] -[F]><><><><{A..f} -[A] -[B] -[C] -[D] -[E] -[F] -[G] -[H] -[I] -[J] -[K] -[L] -[M] -[N] -[O] -[P] -[Q] -[R] -[S] -[T] -[U] -[V] -[W] -[X] -[Y] -[Z] -[[] -[] -[]] -[^] -[_] -[`] -[a] -[b] -[c] -[d] -[e] -[f]><><><><{a..Z} -[a] -[`] -[_] -[^] -[]] -[] -[[] -[Z]><><><><{A..z} -[A] -[B] -[C] -[D] -[E] -[F] -[G] -[H] -[I] -[J] -[K] -[L] -[M] -[N] -[O] -[P] -[Q] -[R] -[S] -[T] -[U] -[V] -[W] -[X] -[Y] -[Z] -[[] -[] -[]] -[^] -[_] -[`] -[a] -[b] -[c] -[d] -[e] -[f] -[g] -[h] -[i] -[j] -[k] -[l] -[m] -[n] -[o] -[p] -[q] -[r] -[s] -[t] -[u] -[v] -[w] -[x] -[y] -[z]><><><><{z..A} -[z] -[y] -[x] -[w] -[v] -[u] -[t] -[s] -[r] -[q] -[p] -[o] -[n] -[m] -[l] -[k] -[j] -[i] -[h] -[g] -[f] -[e] -[d] -[c] -[b] -[a] -[`] -[_] -[^] -[]] -[] -[[] -[Z] -[Y] -[X] -[W] -[V] -[U] -[T] -[S] -[R] -[Q] -[P] -[O] -[N] -[M] -[L] -[K] -[J] -[I] -[H] -[G] -[F] -[E] -[D] -[C] -[B] -[A]><><><><{Z..a} -[Z] -[[] -[] -[]] -[^] -[_] -[`] -[a]><><><><{a..F..2} -[a] -[_] -[]] -[[] -[Y] -[W] -[U] -[S] -[Q] -[O] -[M] -[K] -[I] -[G]><><><><{A..f..02} -[A] -[C] -[E] -[G] -[I] -[K] -[M] -[O] -[Q] -[S] -[U] -[W] -[Y] -[[] -[]] -[_] -[a] -[c] -[e]><><><><{a..Z..5} -[a] -[]><><><><><><><{A..z..10} -[A] -[K] -[U] -[_] -[i] -[s]><><><><{z..A..-2} -[z] -[x] -[v] -[t] -[r] -[p] -[n] -[l] -[j] -[h] -[f] -[d] -[b] -[`] -[^] -[] -[Z] -[X] -[V] -[T] -[R] -[P] -[N] -[L] -[J] -[H] -[F] -[D] -[B]><><><><{Z..a..20} -[Z]><><><><{a{,b} -[{a] -[{ab]><><><><{a},b} -[a}] -[b]><><><><{x,y{,}g} -[x] -[yg] -[yg]><><><><{x,y{}g} -[x] -[y{}g]><><><><{{a,b} -[{a] -[{b]><><><><{{a,b},c} -[a] -[b] -[c]><><><><{{a,b}c} -[{ac}] -[{bc}]><><><><{{a,b},} -[a] -[b]><><><><><><><{{a,b},}c -[ac] -[bc] -[c]><><><><{{a,b}.} -[{a.}] -[{b.}]><><><><{{a,b}} -[{a}] -[{b}]><><><><><><>< -><><><><{-10..00} -[-10] -[-09] -[-08] -[-07] -[-06] -[-05] -[-04] -[-03] -[-02] -[-01] -[000]><><><><{a,\\{a,b}c} -[a] -[\ac] -[\bc]><><><><{a,\{a,b}c} -[ac}] -[{ac}] -[bc}]><><><><><><><{-10.\.00} -[{-10..00}]><><><><><><><><><><{l,n,m}xyz -[lxyz] -[nxyz] -[mxyz]><><><><{abc\,def} -[{abc,def}]><><><><{abc} -[{abc}]><><><><{x\,y,\{abc\},trie} -[x,y] -[{abc}] -[trie]><><><><{} -[{}]><><><><} -[}]><><><><{ -[{]><><><><><><><{1..10} -[1] -[2] -[3] -[4] -[5] -[6] -[7] -[8] -[9] -[10]><><><><{0..10,braces} -[0..10] -[braces]><><><><{{0..10},braces} -[0] -[1] -[2] -[3] -[4] -[5] -[6] -[7] -[8] -[9] -[10] -[braces]><><><><><><><{3..3} -[3]><><><><><><><{10..1} -[10] -[9] -[8] -[7] -[6] -[5] -[4] -[3] -[2] -[1]><><><><{10..1}y -[10y] -[9y] -[8y] -[7y] -[6y] -[5y] -[4y] -[3y] -[2y] -[1y]><><><><><><><{a..f} -[a] -[b] -[c] -[d] -[e] -[f]><><><><{f..a} -[f] -[e] -[d] -[c] -[b] -[a]><><><><{a..A} -[a] -[`] -[_] -[^] -[]] -[] -[[] -[Z] -[Y] -[X] -[W] -[V] -[U] -[T] -[S] -[R] -[Q] -[P] -[O] -[N] -[M] -[L] -[K] -[J] -[I] -[H] -[G] -[F] -[E] -[D] -[C] -[B] -[A]><><><><{A..a} -[A] -[B] -[C] -[D] -[E] -[F] -[G] -[H] -[I] -[J] -[K] -[L] -[M] -[N] -[O] -[P] -[Q] -[R] -[S] -[T] -[U] -[V] -[W] -[X] -[Y] -[Z] -[[] -[] -[]] -[^] -[_] -[`] -[a]><><><><{f..f} -[f]><><><><{1..f} -[{1..f}]><><><><{f..1} -[{f..1}]><><><><{-1..-10} -[-1] -[-2] -[-3] -[-4] -[-5] -[-6] -[-7] -[-8] -[-9] -[-10]><><><><{-20..0} -[-20] -[-19] -[-18] -[-17] -[-16] -[-15] -[-14] -[-13] -[-12] -[-11] -[-10] -[-9] -[-8] -[-7] -[-6] -[-5] -[-4] -[-3] -[-2] -[-1] -[0]><><><><><><><><><><{klklkl}{1,2,3} -[{klklkl}1] -[{klklkl}2] -[{klklkl}3]><><><><{1..10..2} -[1] -[3] -[5] -[7] -[9]><><><><{-1..-10..2} -[-1] -[-3] -[-5] -[-7] -[-9]><><><><{-1..-10..-2} -[-1] -[-3] -[-5] -[-7] -[-9]><><><><{10..1..-2} -[10] -[8] -[6] -[4] -[2]><><><><{10..1..2} -[10] -[8] -[6] -[4] -[2]><><><><{1..20..2} -[1] -[3] -[5] -[7] -[9] -[11] -[13] -[15] -[17] -[19]><><><><{1..20..20} -[1]><><><><{100..0..5} -[100] -[95] -[90] -[85] -[80] -[75] -[70] -[65] -[60] -[55] -[50] -[45] -[40] -[35] -[30] -[25] -[20] -[15] -[10] -[5] -[0]><><><><{100..0..-5} -[100] -[95] -[90] -[85] -[80] -[75] -[70] -[65] -[60] -[55] -[50] -[45] -[40] -[35] -[30] -[25] -[20] -[15] -[10] -[5] -[0]><><><><{a..z} -[a] -[b] -[c] -[d] -[e] -[f] -[g] -[h] -[i] -[j] -[k] -[l] -[m] -[n] -[o] -[p] -[q] -[r] -[s] -[t] -[u] -[v] -[w] -[x] -[y] -[z]><><><><{a..z..2} -[a] -[c] -[e] -[g] -[i] -[k] -[m] -[o] -[q] -[s] -[u] -[w] -[y]><><><><{z..a..-2} -[z] -[x] -[v] -[t] -[r] -[p] -[n] -[l] -[j] -[h] -[f] -[d] -[b]><><><><{2147483645..2147483649} -[2147483645] -[2147483646] -[2147483647] -[2147483648] -[2147483649]><><><><{10..0..2} -[10] -[8] -[6] -[4] -[2] -[0]><><><><{10..0..-2} -[10] -[8] -[6] -[4] -[2] -[0]><><><><{-50..-0..5} -[-50] -[-45] -[-40] -[-35] -[-30] -[-25] -[-20] -[-15] -[-10] -[-5] -[0]><><><><{1..10.f} -[{1..10.f}]><><><><{1..ff} -[{1..ff}]><><><><{1..10..ff} -[{1..10..ff}]><><><><{1.20..2} -[{1.20..2}]><><><><{1..20..f2} -[{1..20..f2}]><><><><{1..20..2f} -[{1..20..2f}]><><><><{1..2f..2} -[{1..2f..2}]><><><><{1..ff..2} -[{1..ff..2}]><><><><{1..ff} -[{1..ff}]><><><><{1..f} -[{1..f}]><><><><{1..0f} -[{1..0f}]><><><><{1..10f} -[{1..10f}]><><><><{1..10.f} -[{1..10.f}]><><><><{1..10.f} -[{1..10.f}]><><><>< \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt deleted file mode 100644 index e5161c3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt +++ /dev/null @@ -1,182 +0,0 @@ -# skip quotes for now -# "{x,x}" -# {"x,x"} -# {x","x} -# '{a,b}{{a,b},a,b}' -A{b,{d,e},{f,g}}Z -PRE-{a,b}{{a,b},a,b}-POST -\\{a,b}{{a,b},a,b} -{{a,b} -{a,b}} -{,} -a{,} -{,}b -a{,}b -a{b}c -a{1..5}b -a{01..5}b -a{-01..5}b -a{-01..5..3}b -a{001..9}b -a{b,c{d,e},{f,g}h}x{y,z -a{b,c{d,e},{f,g}h}x{y,z\\} -a{b,c{d,e},{f,g}h}x{y,z} -a{b{c{d,e}f{x,y{{g}h -a{b{c{d,e}f{x,y{}g}h -a{b{c{d,e}f{x,y}}g}h -a{b{c{d,e}f}g}h -a{{x,y},z}b -f{x,y{g,z}}h -f{x,y{{g,z}}h -f{x,y{{g,z}}h} -f{x,y{{g}h -f{x,y{{g}}h -f{x,y{}g}h -z{a,b{,c}d -z{a,b},c}d -{-01..5} -{-05..100..5} -{-05..100} -{0..5..2} -{0001..05..2} -{0001..-5..2} -{0001..-5..-2} -{0001..5..-2} -{01..5} -{1..05} -{1..05..3} -{05..100} -{0a..0z} -{a,b\\}c,d} -{a,b{c,d} -{a,b}c,d} -{a..F} -{A..f} -{a..Z} -{A..z} -{z..A} -{Z..a} -{a..F..2} -{A..f..02} -{a..Z..5} -d{a..Z..5}b -{A..z..10} -{z..A..-2} -{Z..a..20} -{a{,b} -{a},b} -{x,y{,}g} -{x,y{}g} -{{a,b} -{{a,b},c} -{{a,b}c} -{{a,b},} -X{{a,b},}X -{{a,b},}c -{{a,b}.} -{{a,b}} -X{a..#}X -# this next one is an empty string - -{-10..00} -# Need to escape slashes in here for reasons i guess. -{a,\\\\{a,b}c} -{a,\\{a,b}c} -a,\\{b,c} -{-10.\\.00} -#### bash tests/braces.tests -# Note that some tests are edited out because some features of -# bash are intentionally not supported in this brace expander. -ff{c,b,a} -f{d,e,f}g -{l,n,m}xyz -{abc\\,def} -{abc} -{x\\,y,\\{abc\\},trie} -# not impementing back-ticks obviously -# XXXX\\{`echo a b c | tr ' ' ','`\\} -{} -# We only ever have to worry about parsing a single argument, -# not a command line, so spaces have a different meaning than bash. -# { } -} -{ -abcd{efgh -# spaces -# foo {1,2} bar -# not impementing back-ticks obviously -# `zecho foo {1,2} bar` -# $(zecho foo {1,2} bar) -# ${var} is not a variable here, like it is in bash. omit. -# foo{bar,${var}.} -# foo{bar,${var}} -# isaacs: skip quotes for now -# "${var}"{x,y} -# $var{x,y} -# ${var}{x,y} -# new sequence brace operators -{1..10} -# this doesn't work yet -{0..10,braces} -# but this does -{{0..10},braces} -x{{0..10},braces}y -{3..3} -x{3..3}y -{10..1} -{10..1}y -x{10..1}y -{a..f} -{f..a} -{a..A} -{A..a} -{f..f} -# mixes are incorrectly-formed brace expansions -{1..f} -{f..1} -# spaces -# 0{1..9} {10..20} -# do negative numbers work? -{-1..-10} -{-20..0} -# weirdly-formed brace expansions -- fixed in post-bash-3.1 -a-{b{d,e}}-c -a-{bdef-{g,i}-c -# isaacs: skip quotes for now -# {"klklkl"}{1,2,3} -# isaacs: this is a valid test, though -{klklkl}{1,2,3} -# {"x,x"} -{1..10..2} -{-1..-10..2} -{-1..-10..-2} -{10..1..-2} -{10..1..2} -{1..20..2} -{1..20..20} -{100..0..5} -{100..0..-5} -{a..z} -{a..z..2} -{z..a..-2} -# make sure brace expansion handles ints > 2**31 - 1 using intmax_t -{2147483645..2147483649} -# unwanted zero-padding -- fixed post-bash-4.0 -{10..0..2} -{10..0..-2} -{-50..-0..5} -# bad -{1..10.f} -{1..ff} -{1..10..ff} -{1.20..2} -{1..20..f2} -{1..20..2f} -{1..2f..2} -{1..ff..2} -{1..ff} -{1..f} -{1..0f} -{1..10f} -{1..10.f} -{1..10.f} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js deleted file mode 100644 index 3fcc185..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js +++ /dev/null @@ -1,9 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('ignores ${', function(t) { - t.deepEqual(expand('${1..3}'), ['${1..3}']); - t.deepEqual(expand('${a,b}${c,d}'), ['${a,b}${c,d}']); - t.deepEqual(expand('x${a,b}x${c,d}x'), ['x${a,b}x${c,d}x']); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js deleted file mode 100644 index e429121..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js +++ /dev/null @@ -1,10 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('empty option', function(t) { - t.deepEqual(expand('-v{,,,,}'), [ - '-v', '-v', '-v', '-v', '-v' - ]); - t.end(); -}); - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh deleted file mode 100644 index e040e66..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -set -e - -# Bash 4.3 because of arbitrary need to pick a single standard. - -if [ "${BASH_VERSINFO[0]}" != "4" ] || [ "${BASH_VERSINFO[1]}" != "3" ]; then - echo "this script requires bash 4.3" >&2 - exit 1 -fi - -CDPATH= cd "$(dirname "$0")" - -js='require("./")(process.argv[1]).join(" ")' - -cat cases.txt | \ - while read case; do - if [ "${case:0:1}" = "#" ]; then - continue; - fi; - b="$($BASH -c 'for c in '"$case"'; do echo ["$c"]; done')" - echo "$case" - echo -n "$b><><><><"; - done > bash-results.txt diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js deleted file mode 100644 index 8d434c2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js +++ /dev/null @@ -1,15 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('negative increment', function(t) { - t.deepEqual(expand('{3..1}'), ['3', '2', '1']); - t.deepEqual(expand('{10..8}'), ['10', '9', '8']); - t.deepEqual(expand('{10..08}'), ['10', '09', '08']); - t.deepEqual(expand('{c..a}'), ['c', 'b', 'a']); - - t.deepEqual(expand('{4..0..2}'), ['4', '2', '0']); - t.deepEqual(expand('{4..0..-2}'), ['4', '2', '0']); - t.deepEqual(expand('{e..a..2}'), ['e', 'c', 'a']); - - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js deleted file mode 100644 index 0862dc5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js +++ /dev/null @@ -1,16 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('nested', function(t) { - t.deepEqual(expand('{a,b{1..3},c}'), [ - 'a', 'b1', 'b2', 'b3', 'c' - ]); - t.deepEqual(expand('{{A..Z},{a..z}}'), - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('') - ); - t.deepEqual(expand('ppp{,config,oe{,conf}}'), [ - 'ppp', 'pppconfig', 'pppoe', 'pppoeconf' - ]); - t.end(); -}); - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js deleted file mode 100644 index c00ad15..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js +++ /dev/null @@ -1,10 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('order', function(t) { - t.deepEqual(expand('a{d,c,b}e'), [ - 'ade', 'ace', 'abe' - ]); - t.end(); -}); - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js deleted file mode 100644 index e415877..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js +++ /dev/null @@ -1,13 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('pad', function(t) { - t.deepEqual(expand('{9..11}'), [ - '9', '10', '11' - ]); - t.deepEqual(expand('{09..11}'), [ - '09', '10', '11' - ]); - t.end(); -}); - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js deleted file mode 100644 index 3038fba..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js +++ /dev/null @@ -1,7 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('x and y of same type', function(t) { - t.deepEqual(expand('{a..9}'), ['{a..9}']); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js deleted file mode 100644 index f73a957..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js +++ /dev/null @@ -1,50 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('numeric sequences', function(t) { - t.deepEqual(expand('a{1..2}b{2..3}c'), [ - 'a1b2c', 'a1b3c', 'a2b2c', 'a2b3c' - ]); - t.deepEqual(expand('{1..2}{2..3}'), [ - '12', '13', '22', '23' - ]); - t.end(); -}); - -test('numeric sequences with step count', function(t) { - t.deepEqual(expand('{0..8..2}'), [ - '0', '2', '4', '6', '8' - ]); - t.deepEqual(expand('{1..8..2}'), [ - '1', '3', '5', '7' - ]); - t.end(); -}); - -test('numeric sequence with negative x / y', function(t) { - t.deepEqual(expand('{3..-2}'), [ - '3', '2', '1', '0', '-1', '-2' - ]); - t.end(); -}); - -test('alphabetic sequences', function(t) { - t.deepEqual(expand('1{a..b}2{b..c}3'), [ - '1a2b3', '1a2c3', '1b2b3', '1b2c3' - ]); - t.deepEqual(expand('{a..b}{b..c}'), [ - 'ab', 'ac', 'bb', 'bc' - ]); - t.end(); -}); - -test('alphabetic sequences with step count', function(t) { - t.deepEqual(expand('{a..k..2}'), [ - 'a', 'c', 'e', 'g', 'i', 'k' - ]); - t.deepEqual(expand('{b..k..2}'), [ - 'b', 'd', 'f', 'h', 'j' - ]); - t.end(); -}); - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/package.json deleted file mode 100644 index aa2844d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me" - }, - "name": "minimatch", - "description": "a glob matcher in javascript", - "version": "2.0.10", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/minimatch.git" - }, - "main": "minimatch.js", - "scripts": { - "posttest": "standard minimatch.js test/*.js", - "test": "tap test/*.js", - "prepublish": "browserify -o browser.js -e minimatch.js -s minimatch --bare" - }, - "engines": { - "node": "*" - }, - "dependencies": { - "brace-expansion": "^1.0.0" - }, - "devDependencies": { - "browserify": "^9.0.3", - "standard": "^3.7.2", - "tap": "^1.2.0" - }, - "license": "ISC", - "files": [ - "minimatch.js", - "browser.js" - ], - "gitHead": "6afb85f0c324b321f76a38df81891e562693e257", - "bugs": { - "url": "https://github.com/isaacs/minimatch/issues" - }, - "homepage": "https://github.com/isaacs/minimatch#readme", - "_id": "minimatch@2.0.10", - "_shasum": "8d087c39c6b38c001b97fca7ce6d0e1e80afbac7", - "_from": "minimatch@>=2.0.1 <3.0.0", - "_npmVersion": "3.1.0", - "_nodeVersion": "2.2.1", - "_npmUser": { - "name": "isaacs", - "email": "isaacs@npmjs.com" - }, - "dist": { - "shasum": "8d087c39c6b38c001b97fca7ce6d0e1e80afbac7", - "tarball": "http://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "directories": {}, - "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/README.md deleted file mode 100644 index a2981ea..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# once - -Only call a function once. - -## usage - -```javascript -var once = require('once') - -function load (file, cb) { - cb = once(cb) - loader.load('file') - loader.once('load', cb) - loader.once('error', cb) -} -``` - -Or add to the Function.prototype in a responsible way: - -```javascript -// only has to be done once -require('once').proto() - -function load (file, cb) { - cb = cb.once() - loader.load('file') - loader.once('load', cb) - loader.once('error', cb) -} -``` - -Ironically, the prototype feature makes this module twice as -complicated as necessary. - -To check whether you function has been called, use `fn.called`. Once the -function is called for the first time the return value of the original -function is saved in `fn.value` and subsequent calls will continue to -return this value. - -```javascript -var once = require('once') - -function load (cb) { - cb = once(cb) - var stream = createStream() - stream.once('data', cb) - stream.once('end', function () { - if (!cb.called) cb(new Error('not found')) - }) -} -``` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/README.md deleted file mode 100644 index 98eab25..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# wrappy - -Callback wrapping utility - -## USAGE - -```javascript -var wrappy = require("wrappy") - -// var wrapper = wrappy(wrapperFunction) - -// make sure a cb is called only once -// See also: http://npm.im/once for this specific use case -var once = wrappy(function (cb) { - var called = false - return function () { - if (called) return - called = true - return cb.apply(this, arguments) - } -}) - -function printBoo () { - console.log('boo') -} -// has some rando property -printBoo.iAmBooPrinter = true - -var onlyPrintOnce = once(printBoo) - -onlyPrintOnce() // prints 'boo' -onlyPrintOnce() // does nothing - -// random property is retained! -assert.equal(onlyPrintOnce.iAmBooPrinter, true) -``` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/package.json deleted file mode 100644 index 8145dc8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "wrappy", - "version": "1.0.1", - "description": "Callback wrapping utility", - "main": "wrappy.js", - "directories": { - "test": "test" - }, - "dependencies": {}, - "devDependencies": { - "tap": "^0.4.12" - }, - "scripts": { - "test": "tap test/*.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/wrappy" - }, - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "ISC", - "bugs": { - "url": "https://github.com/npm/wrappy/issues" - }, - "homepage": "https://github.com/npm/wrappy", - "gitHead": "006a8cbac6b99988315834c207896eed71fd069a", - "_id": "wrappy@1.0.1", - "_shasum": "1e65969965ccbc2db4548c6b84a6f2c5aedd4739", - "_from": "wrappy@>=1.0.0 <2.0.0", - "_npmVersion": "2.0.0", - "_nodeVersion": "0.10.31", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "dist": { - "shasum": "1e65969965ccbc2db4548c6b84a6f2c5aedd4739", - "tarball": "http://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" - }, - "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js deleted file mode 100644 index 5ed0fcd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js +++ /dev/null @@ -1,51 +0,0 @@ -var test = require('tap').test -var wrappy = require('../wrappy.js') - -test('basic', function (t) { - function onceifier (cb) { - var called = false - return function () { - if (called) return - called = true - return cb.apply(this, arguments) - } - } - onceifier.iAmOnce = {} - var once = wrappy(onceifier) - t.equal(once.iAmOnce, onceifier.iAmOnce) - - var called = 0 - function boo () { - t.equal(called, 0) - called++ - } - // has some rando property - boo.iAmBoo = true - - var onlyPrintOnce = once(boo) - - onlyPrintOnce() // prints 'boo' - onlyPrintOnce() // does nothing - t.equal(called, 1) - - // random property is retained! - t.equal(onlyPrintOnce.iAmBoo, true) - - var logs = [] - var logwrap = wrappy(function (msg, cb) { - logs.push(msg + ' wrapping cb') - return function () { - logs.push(msg + ' before cb') - var ret = cb.apply(this, arguments) - logs.push(msg + ' after cb') - } - }) - - var c = logwrap('foo', function () { - t.same(logs, [ 'foo wrapping cb', 'foo before cb' ]) - }) - c() - t.same(logs, [ 'foo wrapping cb', 'foo before cb', 'foo after cb' ]) - - t.end() -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js deleted file mode 100644 index bb7e7d6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js +++ /dev/null @@ -1,33 +0,0 @@ -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -module.exports = wrappy -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') - - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k] - }) - - return wrapper - - function wrapper() { - var args = new Array(arguments.length) - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - var ret = fn.apply(this, args) - var cb = args[args.length-1] - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k] - }) - } - return ret - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/once.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/once.js deleted file mode 100644 index 2e1e721..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/once.js +++ /dev/null @@ -1,21 +0,0 @@ -var wrappy = require('wrappy') -module.exports = wrappy(once) - -once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(this) - }, - configurable: true - }) -}) - -function once (fn) { - var f = function () { - if (f.called) return f.value - f.called = true - return f.value = fn.apply(this, arguments) - } - f.called = false - return f -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/package.json deleted file mode 100644 index 8f46e50..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "once", - "version": "1.3.2", - "description": "Run a function exactly one time", - "main": "once.js", - "directories": { - "test": "test" - }, - "dependencies": { - "wrappy": "1" - }, - "devDependencies": { - "tap": "~0.3.0" - }, - "scripts": { - "test": "tap test/*.js" - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/once.git" - }, - "keywords": [ - "once", - "function", - "one", - "single" - ], - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "ISC", - "gitHead": "e35eed5a7867574e2bf2260a1ba23970958b22f2", - "bugs": { - "url": "https://github.com/isaacs/once/issues" - }, - "homepage": "https://github.com/isaacs/once#readme", - "_id": "once@1.3.2", - "_shasum": "d8feeca93b039ec1dcdee7741c92bdac5e28081b", - "_from": "once@>=1.3.0 <2.0.0", - "_npmVersion": "2.9.1", - "_nodeVersion": "2.0.0", - "_npmUser": { - "name": "isaacs", - "email": "isaacs@npmjs.com" - }, - "dist": { - "shasum": "d8feeca93b039ec1dcdee7741c92bdac5e28081b", - "tarball": "http://registry.npmjs.org/once/-/once-1.3.2.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "_resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/test/once.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/test/once.js deleted file mode 100644 index c618360..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/once/test/once.js +++ /dev/null @@ -1,23 +0,0 @@ -var test = require('tap').test -var once = require('../once.js') - -test('once', function (t) { - var f = 0 - function fn (g) { - t.equal(f, 0) - f ++ - return f + g + this - } - fn.ownProperty = {} - var foo = once(fn) - t.equal(fn.ownProperty, foo.ownProperty) - t.notOk(foo.called) - for (var i = 0; i < 1E3; i++) { - t.same(f, i === 0 ? 0 : 1) - var g = foo.call(1, 1) - t.ok(foo.called) - t.same(g, 3) - t.same(f, 1) - } - t.end() -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/index.js deleted file mode 100644 index 19f103f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/index.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -function posix(path) { - return path.charAt(0) === '/'; -}; - -function win32(path) { - // https://github.com/joyent/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 - var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; - var result = splitDeviceRe.exec(path); - var device = result[1] || ''; - var isUnc = !!device && device.charAt(1) !== ':'; - - // UNC paths are always absolute - return !!result[2] || isUnc; -}; - -module.exports = process.platform === 'win32' ? win32 : posix; -module.exports.posix = posix; -module.exports.win32 = win32; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/license b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/license deleted file mode 100644 index 654d0bf..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/package.json deleted file mode 100644 index 301658f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "path-is-absolute", - "version": "1.0.0", - "description": "Node.js 0.12 path.isAbsolute() ponyfill", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/sindresorhus/path-is-absolute" - }, - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "node test.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "path", - "paths", - "file", - "dir", - "absolute", - "isabsolute", - "is-absolute", - "built-in", - "util", - "utils", - "core", - "ponyfill", - "polyfill", - "shim", - "is", - "detect", - "check" - ], - "gitHead": "7a76a0c9f2263192beedbe0a820e4d0baee5b7a1", - "bugs": { - "url": "https://github.com/sindresorhus/path-is-absolute/issues" - }, - "homepage": "https://github.com/sindresorhus/path-is-absolute", - "_id": "path-is-absolute@1.0.0", - "_shasum": "263dada66ab3f2fb10bf7f9d24dd8f3e570ef912", - "_from": "path-is-absolute@>=1.0.0 <2.0.0", - "_npmVersion": "2.5.1", - "_nodeVersion": "0.12.0", - "_npmUser": { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - "maintainers": [ - { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - } - ], - "dist": { - "shasum": "263dada66ab3f2fb10bf7f9d24dd8f3e570ef912", - "tarball": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/readme.md deleted file mode 100644 index cdf94f4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/readme.md +++ /dev/null @@ -1,51 +0,0 @@ -# path-is-absolute [![Build Status](https://travis-ci.org/sindresorhus/path-is-absolute.svg?branch=master)](https://travis-ci.org/sindresorhus/path-is-absolute) - -> Node.js 0.12 [`path.isAbsolute()`](http://nodejs.org/api/path.html#path_path_isabsolute_path) ponyfill - -> Ponyfill: A polyfill that doesn't overwrite the native method - - -## Install - -``` -$ npm install --save path-is-absolute -``` - - -## Usage - -```js -var pathIsAbsolute = require('path-is-absolute'); - -// Linux -pathIsAbsolute('/home/foo'); -//=> true - -// Windows -pathIsAbsolute('C:/Users/'); -//=> true - -// Any OS -pathIsAbsolute.posix('/home/foo'); -//=> true -``` - - -## API - -See the [`path.isAbsolute()` docs](http://nodejs.org/api/path.html#path_path_isabsolute_path). - -### pathIsAbsolute(path) - -### pathIsAbsolute.posix(path) - -The Posix specific version. - -### pathIsAbsolute.win32(path) - -The Windows specific version. - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/package.json deleted file mode 100644 index 0c2d083..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "name": "glob", - "description": "a little globber", - "version": "5.0.14", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-glob.git" - }, - "main": "glob.js", - "files": [ - "glob.js", - "sync.js", - "common.js" - ], - "engines": { - "node": "*" - }, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "devDependencies": { - "mkdirp": "0", - "rimraf": "^2.2.8", - "tap": "^1.1.4", - "tick": "0.0.6" - }, - "scripts": { - "prepublish": "npm run benchclean", - "profclean": "rm -f v8.log profile.txt", - "test": "tap test/*.js --cov", - "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js", - "bench": "bash benchmark.sh", - "prof": "bash prof.sh && cat profile.txt", - "benchclean": "node benchclean.js" - }, - "license": "ISC", - "gitHead": "c47d4514f8f93f23b589afa18947306116bfe40f", - "bugs": { - "url": "https://github.com/isaacs/node-glob/issues" - }, - "homepage": "https://github.com/isaacs/node-glob#readme", - "_id": "glob@5.0.14", - "_shasum": "a811d507acb605441edd6cd2622a3c6f06cc00e1", - "_from": "glob@>=5.0.0 <6.0.0", - "_npmVersion": "3.1.0", - "_nodeVersion": "2.2.1", - "_npmUser": { - "name": "isaacs", - "email": "isaacs@npmjs.com" - }, - "dist": { - "shasum": "a811d507acb605441edd6cd2622a3c6f06cc00e1", - "tarball": "http://registry.npmjs.org/glob/-/glob-5.0.14.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "directories": {}, - "_resolved": "https://registry.npmjs.org/glob/-/glob-5.0.14.tgz" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/sync.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/sync.js deleted file mode 100644 index 09883d2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/glob/sync.js +++ /dev/null @@ -1,460 +0,0 @@ -module.exports = globSync -globSync.GlobSync = GlobSync - -var fs = require('fs') -var minimatch = require('minimatch') -var Minimatch = minimatch.Minimatch -var Glob = require('./glob.js').Glob -var util = require('util') -var path = require('path') -var assert = require('assert') -var isAbsolute = require('path-is-absolute') -var common = require('./common.js') -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var childrenIgnored = common.childrenIgnored - -function globSync (pattern, options) { - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') - - return new GlobSync(pattern, options).found -} - -function GlobSync (pattern, options) { - if (!pattern) - throw new Error('must provide pattern') - - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') - - if (!(this instanceof GlobSync)) - return new GlobSync(pattern, options) - - setopts(this, pattern, options) - - if (this.noprocess) - return this - - var n = this.minimatch.set.length - this.matches = new Array(n) - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false) - } - this._finish() -} - -GlobSync.prototype._finish = function () { - assert(this instanceof GlobSync) - if (this.realpath) { - var self = this - this.matches.forEach(function (matchset, index) { - var set = self.matches[index] = Object.create(null) - for (var p in matchset) { - try { - p = self._makeAbs(p) - var real = fs.realpathSync(p, self.realpathCache) - set[real] = true - } catch (er) { - if (er.syscall === 'stat') - set[self._makeAbs(p)] = true - else - throw er - } - } - }) - } - common.finish(this) -} - - -GlobSync.prototype._process = function (pattern, index, inGlobStar) { - assert(this instanceof GlobSync) - - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ - } - // now n is the index of the first one that is *not* a string. - - // See if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index) - return - - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break - - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break - } - - var remain = pattern.slice(n) - - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix - - var abs = this._makeAbs(read) - - //if ignored, skip processing - if (childrenIgnored(this, read)) - return - - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar) -} - - -GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { - var entries = this._readdir(abs, inGlobStar) - - // if the abs isn't a dir, then nothing can match! - if (!entries) - return - - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' - - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } - - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return - - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. - - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix.slice(-1) !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this.matches[index][e] = true - } - // This was the last one, and no stats were needed - return - } - - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) - newPattern = [prefix, e] - else - newPattern = [e] - this._process(newPattern.concat(remain), index, inGlobStar) - } -} - - -GlobSync.prototype._emitMatch = function (index, e) { - var abs = this._makeAbs(e) - if (this.mark) - e = this._mark(e) - - if (this.matches[index][e]) - return - - if (this.nodir) { - var c = this.cache[this._makeAbs(e)] - if (c === 'DIR' || Array.isArray(c)) - return - } - - this.matches[index][e] = true - if (this.stat) - this._stat(e) -} - - -GlobSync.prototype._readdirInGlobStar = function (abs) { - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false) - - var entries - var lstat - var stat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - // lstat failed, doesn't exist - return null - } - - var isSym = lstat.isSymbolicLink() - this.symlinks[abs] = isSym - - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && !lstat.isDirectory()) - this.cache[abs] = 'FILE' - else - entries = this._readdir(abs, false) - - return entries -} - -GlobSync.prototype._readdir = function (abs, inGlobStar) { - var entries - - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs) - - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return null - - if (Array.isArray(c)) - return c - } - - try { - return this._readdirEntries(abs, fs.readdirSync(abs)) - } catch (er) { - this._readdirError(abs, er) - return null - } -} - -GlobSync.prototype._readdirEntries = function (abs, entries) { - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } - - this.cache[abs] = entries - - // mark and cache dir-ness - return entries -} - -GlobSync.prototype._readdirError = function (f, er) { - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - this.cache[this._makeAbs(f)] = 'FILE' - break - - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break - - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) - throw er - if (!this.silent) - console.error('glob error', er) - break - } -} - -GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { - - var entries = this._readdir(abs, inGlobStar) - - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return - - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) - - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false) - - var len = entries.length - var isSym = this.symlinks[abs] - - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return - - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue - - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true) - - var below = gspref.concat(entries[i], remain) - this._process(below, index, true) - } -} - -GlobSync.prototype._processSimple = function (prefix, index) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var exists = this._stat(prefix) - - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return - - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } - - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') - - // Mark this as a match - this.matches[index][prefix] = true -} - -// Returns either 'DIR', 'FILE', or false -GlobSync.prototype._stat = function (f) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' - - if (f.length > this.maxLength) - return false - - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] - - if (Array.isArray(c)) - c = 'DIR' - - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return c - - if (needDir && c === 'FILE') - return false - - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } - - var exists - var stat = this.statCache[abs] - if (!stat) { - var lstat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - return false - } - - if (lstat.isSymbolicLink()) { - try { - stat = fs.statSync(abs) - } catch (er) { - stat = lstat - } - } else { - stat = lstat - } - } - - this.statCache[abs] = stat - - var c = stat.isDirectory() ? 'DIR' : 'FILE' - this.cache[abs] = this.cache[abs] || c - - if (needDir && c !== 'DIR') - return false - - return c -} - -GlobSync.prototype._mark = function (p) { - return common.mark(this, p) -} - -GlobSync.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/.npmignore deleted file mode 100644 index c2658d7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/README.md deleted file mode 100644 index 13a2e86..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# graceful-fs - -graceful-fs functions as a drop-in replacement for the fs module, -making various improvements. - -The improvements are meant to normalize behavior across different -platforms and environments, and to make filesystem access more -resilient to errors. - -## Improvements over [fs module](http://api.nodejs.org/fs.html) - -graceful-fs: - -* Queues up `open` and `readdir` calls, and retries them once - something closes if there is an EMFILE error from too many file - descriptors. -* fixes `lchmod` for Node versions prior to 0.6.2. -* implements `fs.lutimes` if possible. Otherwise it becomes a noop. -* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or - `lchown` if the user isn't root. -* makes `lchmod` and `lchown` become noops, if not available. -* retries reading a file if `read` results in EAGAIN error. - -On Windows, it retries renaming a file for up to one second if `EACCESS` -or `EPERM` error occurs, likely because antivirus software has locked -the directory. - -## USAGE - -```javascript -// use just like fs -var fs = require('graceful-fs') - -// now go and do stuff with it... -fs.readFileSync('some-file-or-whatever') -``` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/fs.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/fs.js deleted file mode 100644 index 64ad980..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/fs.js +++ /dev/null @@ -1,11 +0,0 @@ -// eeeeeevvvvviiiiiiillllll -// more evil than monkey-patching the native builtin? -// Not sure. - -var mod = require("module") -var pre = '(function (exports, require, module, __filename, __dirname) { ' -var post = '});' -var src = pre + process.binding('natives').fs + post -var vm = require('vm') -var fn = vm.runInThisContext(src) -fn(exports, require, module, __filename, __dirname) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/graceful-fs.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/graceful-fs.js deleted file mode 100644 index fb206b8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/graceful-fs.js +++ /dev/null @@ -1,158 +0,0 @@ -// Monkey-patching the fs module. -// It's ugly, but there is simply no other way to do this. -var fs = module.exports = require('./fs.js') - -var assert = require('assert') - -// fix up some busted stuff, mostly on windows and old nodes -require('./polyfills.js') - -var util = require('util') - -function noop () {} - -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs') -else if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS: ' + m.split(/\n/).join('\nGFS: ') - console.error(m) - } - -if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug('fds', fds) - debug(queue) - assert.equal(queue.length, 0) - }) -} - - -var originalOpen = fs.open -fs.open = open - -function open(path, flags, mode, cb) { - if (typeof mode === "function") cb = mode, mode = null - if (typeof cb !== "function") cb = noop - new OpenReq(path, flags, mode, cb) -} - -function OpenReq(path, flags, mode, cb) { - this.path = path - this.flags = flags - this.mode = mode - this.cb = cb - Req.call(this) -} - -util.inherits(OpenReq, Req) - -OpenReq.prototype.process = function() { - originalOpen.call(fs, this.path, this.flags, this.mode, this.done) -} - -var fds = {} -OpenReq.prototype.done = function(er, fd) { - debug('open done', er, fd) - if (fd) - fds['fd' + fd] = this.path - Req.prototype.done.call(this, er, fd) -} - - -var originalReaddir = fs.readdir -fs.readdir = readdir - -function readdir(path, cb) { - if (typeof cb !== "function") cb = noop - new ReaddirReq(path, cb) -} - -function ReaddirReq(path, cb) { - this.path = path - this.cb = cb - Req.call(this) -} - -util.inherits(ReaddirReq, Req) - -ReaddirReq.prototype.process = function() { - originalReaddir.call(fs, this.path, this.done) -} - -ReaddirReq.prototype.done = function(er, files) { - if (files && files.sort) - files = files.sort() - Req.prototype.done.call(this, er, files) - onclose() -} - - -var originalClose = fs.close -fs.close = close - -function close (fd, cb) { - debug('close', fd) - if (typeof cb !== "function") cb = noop - delete fds['fd' + fd] - originalClose.call(fs, fd, function(er) { - onclose() - cb(er) - }) -} - - -var originalCloseSync = fs.closeSync -fs.closeSync = closeSync - -function closeSync (fd) { - try { - return originalCloseSync(fd) - } finally { - onclose() - } -} - - -// Req class -function Req () { - // start processing - this.done = this.done.bind(this) - this.failures = 0 - this.process() -} - -Req.prototype.done = function (er, result) { - var tryAgain = false - if (er) { - var code = er.code - var tryAgain = code === "EMFILE" || code === "ENFILE" - if (process.platform === "win32") - tryAgain = tryAgain || code === "OK" - } - - if (tryAgain) { - this.failures ++ - enqueue(this) - } else { - var cb = this.cb - cb(er, result) - } -} - -var queue = [] - -function enqueue(req) { - queue.push(req) - debug('enqueue %d %s', queue.length, req.constructor.name, req) -} - -function onclose() { - var req = queue.shift() - if (req) { - debug('process', req.constructor.name, req) - req.process() - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/package.json deleted file mode 100644 index 1e77dd0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me" - }, - "name": "graceful-fs", - "description": "A drop-in replacement for fs, making various improvements.", - "version": "3.0.8", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-graceful-fs.git" - }, - "main": "graceful-fs.js", - "engines": { - "node": ">=0.4.0" - }, - "directories": { - "test": "test" - }, - "scripts": { - "test": "tap test/*.js" - }, - "keywords": [ - "fs", - "module", - "reading", - "retry", - "retries", - "queue", - "error", - "errors", - "handling", - "EMFILE", - "EAGAIN", - "EINVAL", - "EPERM", - "EACCESS" - ], - "license": "ISC", - "devDependencies": { - "mkdirp": "^0.5.0", - "rimraf": "^2.2.8", - "tap": "^1.2.0" - }, - "gitHead": "45c57aa5e323c35a985a525de6f0c9a6ef59e1f8", - "bugs": { - "url": "https://github.com/isaacs/node-graceful-fs/issues" - }, - "homepage": "https://github.com/isaacs/node-graceful-fs#readme", - "_id": "graceful-fs@3.0.8", - "_shasum": "ce813e725fa82f7e6147d51c9a5ca68270551c22", - "_from": "graceful-fs@>=3.0.2 <4.0.0", - "_npmVersion": "2.10.1", - "_nodeVersion": "2.0.1", - "_npmUser": { - "name": "isaacs", - "email": "isaacs@npmjs.com" - }, - "dist": { - "shasum": "ce813e725fa82f7e6147d51c9a5ca68270551c22", - "tarball": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/polyfills.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/polyfills.js deleted file mode 100644 index 4270539..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/polyfills.js +++ /dev/null @@ -1,255 +0,0 @@ -var fs = require('./fs.js') -var constants = require('constants') - -var origCwd = process.cwd -var cwd = null -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) -} - -// (re-)implement some things that are known busted or missing. - -// lchmod, broken prior to 0.6.2 -// back-port the fix here. -if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - fs.lchmod = function (path, mode, callback) { - callback = callback || noop - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , 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, mode) - - // 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 - } -} - - -// lutimes implementation, or no-op -if (!fs.lutimes) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - cb = cb || noop - if (er) return cb(er) - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - return cb(er || er2) - }) - }) - }) - } - - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - , err - , err2 - , ret - - try { - var ret = fs.futimesSync(fd, at, mt) - } catch (er) { - err = er - } - try { - fs.closeSync(fd) - } catch (er) { - err2 = er - } - if (err || err2) throw (err || err2) - return ret - } - - } else if (fs.utimensat && constants.hasOwnProperty("AT_SYMLINK_NOFOLLOW")) { - // maybe utimensat will be bound soonish? - fs.lutimes = function (path, at, mt, cb) { - fs.utimensat(path, at, mt, constants.AT_SYMLINK_NOFOLLOW, cb) - } - - fs.lutimesSync = function (path, at, mt) { - return fs.utimensatSync(path, at, mt, constants.AT_SYMLINK_NOFOLLOW) - } - - } else { - fs.lutimes = function (_a, _b, _c, cb) { process.nextTick(cb) } - fs.lutimesSync = function () {} - } -} - - -// https://github.com/isaacs/node-graceful-fs/issues/4 -// Chown should not fail on einval or eperm if non-root. -// It should not fail on enosys ever, as this just indicates -// that a fs doesn't support the intended operation. - -fs.chown = chownFix(fs.chown) -fs.fchown = chownFix(fs.fchown) -fs.lchown = chownFix(fs.lchown) - -fs.chmod = chownFix(fs.chmod) -fs.fchmod = chownFix(fs.fchmod) -fs.lchmod = chownFix(fs.lchmod) - -fs.chownSync = chownFixSync(fs.chownSync) -fs.fchownSync = chownFixSync(fs.fchownSync) -fs.lchownSync = chownFixSync(fs.lchownSync) - -fs.chmodSync = chownFix(fs.chmodSync) -fs.fchmodSync = chownFix(fs.fchmodSync) -fs.lchmodSync = chownFix(fs.lchmodSync) - -function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er, res) { - if (chownErOk(er)) er = null - cb(er, res) - }) - } -} - -function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } - } -} - -// ENOSYS means that the fs doesn't support the op. Just ignore -// that, because it doesn't matter. -// -// if there's no getuid, or if getuid() is something other -// than 0, and the error is EINVAL or EPERM, then just ignore -// it. -// -// This specific case is a silent failure in cp, install, tar, -// and most other unix tools that manage permissions. -// -// When running as root, or if other types of errors are -// encountered, then it's strict. -function chownErOk (er) { - if (!er) - return true - - if (er.code === "ENOSYS") - return true - - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } - - return false -} - - -// if lchmod/lchown do not exist, then make them no-ops -if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - process.nextTick(cb) - } - fs.lchmodSync = function () {} -} -if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - process.nextTick(cb) - } - fs.lchownSync = function () {} -} - - - -// on Windows, A/V software can lock the directory, causing this -// to fail with an EACCES or EPERM if the directory contains newly -// created files. Try again on failure, for up to 1 second. -if (process.platform === "win32") { - var rename_ = fs.rename - fs.rename = function rename (from, to, cb) { - var start = Date.now() - rename_(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 1000) { - return rename_(from, to, CB) - } - if(cb) cb(er) - }) - } -} - - -// if read() returns EAGAIN, then just try it again. -var read = fs.read -fs.read = function (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) - } - } - return read.call(fs, fd, buffer, offset, length, position, callback) -} - -var readSync = fs.readSync -fs.readSync = function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue - } - throw er - } - } -} - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/max-open.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/max-open.js deleted file mode 100644 index a6b9ba4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/max-open.js +++ /dev/null @@ -1,69 +0,0 @@ -var test = require('tap').test -var fs = require('../') - -test('open lots of stuff', function (t) { - // Get around EBADF from libuv by making sure that stderr is opened - // Otherwise Darwin will refuse to give us a FD for stderr! - process.stderr.write('') - - // How many parallel open()'s to do - var n = 1024 - var opens = 0 - var fds = [] - var going = true - var closing = false - var doneCalled = 0 - - for (var i = 0; i < n; i++) { - go() - } - - function go() { - opens++ - fs.open(__filename, 'r', function (er, fd) { - if (er) throw er - fds.push(fd) - if (going) go() - }) - } - - // should hit ulimit pretty fast - setTimeout(function () { - going = false - t.equal(opens - fds.length, n) - done() - }, 100) - - - function done () { - if (closing) return - doneCalled++ - - if (fds.length === 0) { - console.error('done called %d times', doneCalled) - // First because of the timeout - // Then to close the fd's opened afterwards - // Then this time, to complete. - // Might take multiple passes, depending on CPU speed - // and ulimit, but at least 3 in every case. - t.ok(doneCalled >= 2) - return t.end() - } - - closing = true - setTimeout(function () { - // console.error('do closing again') - closing = false - done() - }, 100) - - // console.error('closing time') - var closes = fds.slice(0) - fds.length = 0 - closes.forEach(function (fd) { - fs.close(fd, function (er) { - if (er) throw er - }) - }) - } -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/open.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/open.js deleted file mode 100644 index 85732f2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/open.js +++ /dev/null @@ -1,39 +0,0 @@ -var test = require('tap').test -var fs = require('../graceful-fs.js') - -test('graceful fs is monkeypatched fs', function (t) { - t.equal(fs, require('../fs.js')) - t.end() -}) - -test('open an existing file works', function (t) { - var fd = fs.openSync(__filename, 'r') - fs.closeSync(fd) - fs.open(__filename, 'r', function (er, fd) { - if (er) throw er - fs.close(fd, function (er) { - if (er) throw er - t.pass('works') - t.end() - }) - }) -}) - -test('open a non-existing file throws', function (t) { - var er - try { - var fd = fs.openSync('this file does not exist', 'r') - } catch (x) { - er = x - } - t.ok(er, 'should throw') - t.notOk(fd, 'should not get an fd') - t.equal(er.code, 'ENOENT') - - fs.open('neither does this file', 'r', function (er, fd) { - t.ok(er, 'should throw') - t.notOk(fd, 'should not get an fd') - t.equal(er.code, 'ENOENT') - t.end() - }) -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/readdir-sort.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/readdir-sort.js deleted file mode 100644 index cb63a68..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/readdir-sort.js +++ /dev/null @@ -1,20 +0,0 @@ -var test = require("tap").test -var fs = require("../fs.js") - -var readdir = fs.readdir -fs.readdir = function(path, cb) { - process.nextTick(function() { - cb(null, ["b", "z", "a"]) - }) -} - -var g = require("../") - -test("readdir reorder", function (t) { - g.readdir("whatevers", function (er, files) { - if (er) - throw er - t.same(files, [ "a", "b", "z" ]) - t.end() - }) -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/write-then-read.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/write-then-read.js deleted file mode 100644 index 21e4c26..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/graceful-fs/test/write-then-read.js +++ /dev/null @@ -1,47 +0,0 @@ -var fs = require('../'); -var rimraf = require('rimraf'); -var mkdirp = require('mkdirp'); -var test = require('tap').test; -var p = require('path').resolve(__dirname, 'files'); - -process.chdir(__dirname) - -// Make sure to reserve the stderr fd -process.stderr.write(''); - -var num = 4097; -var paths = new Array(num); - -test('make files', function (t) { - rimraf.sync(p); - mkdirp.sync(p); - - for (var i = 0; i < num; ++i) { - paths[i] = 'files/file-' + i; - fs.writeFileSync(paths[i], 'content'); - } - - t.end(); -}) - -test('read files', function (t) { - // now read them - var done = 0; - for (var i = 0; i < num; ++i) { - fs.readFile(paths[i], function(err, data) { - if (err) - throw err; - - ++done; - if (done === num) { - t.pass('success'); - t.end() - } - }); - } -}); - -test('cleanup', function (t) { - rimraf.sync(p); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/.gitmodules b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/.gitmodules deleted file mode 100644 index 1739275..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "spec/mustache"] - path = spec/mustache - url = git://github.com/mustache/spec.git diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/.istanbul.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/.istanbul.yml deleted file mode 100644 index e6911f1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/.istanbul.yml +++ /dev/null @@ -1,2 +0,0 @@ -instrumentation: - excludes: ['**/spec/**'] diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/.npmignore deleted file mode 100644 index f10592c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/.npmignore +++ /dev/null @@ -1,25 +0,0 @@ -.DS_Store -.gitignore -.rvmrc -.eslintrc -.travis.yml -.rspec -Gemfile -Gemfile.lock -Rakefile -Gruntfile.js -*.gemspec -*.nuspec -*.log -bench/* -configurations/* -components/* -coverage/* -dist/cdnjs/* -dist/components/* -spec/* -src/* -tasks/* -tmp/* -publish/* -vendor/* diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/CONTRIBUTING.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/CONTRIBUTING.md deleted file mode 100644 index b84fdb0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/CONTRIBUTING.md +++ /dev/null @@ -1,80 +0,0 @@ -# How to Contribute - -## Reporting Issues - -Please see our [FAQ](https://github.com/wycats/handlebars.js/blob/master/FAQ.md) for common issues that people run into. - -Should you run into other issues with the project, please don't hesitate to let us know by filing an [issue][issue]! In general we are going to ask for an example of the problem failing, which can be as simple as a jsfiddle/jsbin/etc. We've put together a jsfiddle [template][jsfiddle] to ease this. (We will keep this link up to date as new releases occur, so feel free to check back here) - -Pull requests containing only failing thats demonstrating the issue are welcomed and this also helps ensure that your issue won't regress in the future once it's fixed. - -Documentation issues on the handlebarsjs.com site should be reported on [handlebars-site](https://github.com/wycats/handlebars-site). - -## Pull Requests - -We also accept [pull requests][pull-request]! - -Generally we like to see pull requests that -- Maintain the existing code style -- Are focused on a single change (i.e. avoid large refactoring or style adjustments in untouched code if not the primary goal of the pull request) -- Have [good commit messages](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) -- Have tests -- Don't significantly decrease the current code coverage (see coverage/lcov-report/index.html) - -## Building - -To build Handlebars.js you'll need a few things installed. - -* Node.js -* [Grunt](http://gruntjs.com/getting-started) - -Before building, you need to make sure that the Git submodule `spec/mustache` is included (i.e. the directory `spec/mustache` should not be empty). To include it, if using Git version 1.6.5 or newer, use `git clone --recursive` rather than `git clone`. Or, if you already cloned without `--recursive`, use `git submodule update --init`. - -Project dependencies may be installed via `npm install`. - -To build Handlebars.js from scratch, you'll want to run `grunt` -in the root of the project. That will build Handlebars and output the -results to the dist/ folder. To re-run tests, run `grunt test` or `npm test`. -You can also run our set of benchmarks with `grunt bench`. - -The `grunt dev` implements watching for tests and allows for in browser testing at `http://localhost:9999/spec/`. - -If you notice any problems, please report them to the GitHub issue tracker at -[http://github.com/wycats/handlebars.js/issues](http://github.com/wycats/handlebars.js/issues). - -## Ember testing - -The current ember distribution should be tested as part of the handlebars release process. This requires building the `handlebars-source` gem locally and then executing the ember test script. - -```sh -npm link -grunt build release -cp dist/*.js $emberRepoDir/bower_components/handlebars/ - -cd $emberRepoDir -npm link handlebars -npm test -``` - -## Releasing - -Handlebars utilizes the [release yeoman generator][generator-release] to perform most release tasks. - -A full release may be completed with the following: - -``` -yo release -npm publish -yo release:publish components handlebars.js dist/components/ - -cd dist/components/ -gem build handlebars-source.gemspec -gem push handlebars-source-*.gem -``` - -After this point the handlebars site needs to be updated to point to the new version numbers. The jsfiddle link should be updated to point to the most recent distribution for all instances in our documentation. - -[generator-release]: https://github.com/walmartlabs/generator-release -[pull-request]: https://github.com/wycats/handlebars.js/pull/new/master -[issue]: https://github.com/wycats/handlebars.js/issues/new -[jsfiddle]: http://jsfiddle.net/9D88g/26/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/FAQ.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/FAQ.md deleted file mode 100644 index 108e839..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/FAQ.md +++ /dev/null @@ -1,60 +0,0 @@ -# Frequently Asked Questions - -1. How can I file a bug report: - - See our guidelines on [reporting issues](https://github.com/wycats/handlebars.js/blob/master/CONTRIBUTING.md#reporting-issues). - -1. Why isn't my Mustache template working? - - Handlebars deviates from Mustache slightly on a few behaviors. These variations are documented in our [readme](https://github.com/wycats/handlebars.js#differences-between-handlebarsjs-and-mustache). - -1. Why is it slower when compiling? - - The Handlebars compiler must parse the template and construct a JavaScript program which can then be run. Under some environments such as older mobile devices this can have a performance impact which can be avoided by precompiling. Generally it's recommended that precompilation and the runtime library be used on all clients. - -1. Why doesn't this work with Content Security Policy restrictions? - - When not using the precompiler, Handlebars generates a dynamic function for each template which can cause issues with pages that have enabled Content Policy. It's recommended that templates are precompiled or the `unsafe-eval` policy is enabled for sites that must generate dynamic templates at runtime. - -1. How can I include script tags in my template? - - If loading the template via an inlined ` - ``` - - It's generally recommended that templates are served through external, precompiled, files, which do not suffer from this issue. - -1. Why are my precompiled scripts throwing exceptions? - - When using the precompiler, it's important that a supporting version of the Handlebars runtime be loaded on the target page. In version 1.x there were rudimentary checks to compare the version but these did not always work. This is fixed under 2.x but the version checking does not work between these two versions. If you see unexpected errors such as `undefined is not a function` or similar, please verify that the same version is being used for both the precompiler and the client. This can be checked via: - - ```sh - handlebars --version - ``` - If using the integrated precompiler and - - ```javascript - console.log(Handlebars.VERSION); - ``` - On the client side. - - We include the built client libraries in the npm package for those who want to be certain that they are using the same client libraries as the compiler. - - Should these match, please file an issue with us, per our [issue filing guidelines](https://github.com/wycats/handlebars.js/blob/master/CONTRIBUTING.md#reporting-issues). - -1. Why doesn't IE like the `default` name in the AMD module? - - Some browsers such as particular versions of IE treat `default` as a reserved word in JavaScript source files. To safely use this you need to reference this via the `Handlebars['default']` lookup method. This is an unfortunate side effect of the shims necessary to backport the Handlebars ES6 code to all current browsers. - -1. How do I load the runtime library when using AMD? - - There are two options for loading under AMD environments. The first is to use the `handlebars.runtime.amd.js` file. This may require a [path mapping](https://github.com/wycats/handlebars.js/blob/master/spec/amd-runtime.html#L31) as well as access via the `default` field. - - The other option is to load the `handlebars.runtime.js` UMD build, which might not require path configuration and exposes the library as both the module root and the `default` field for compatibility. - - If not using ES6 transpilers or accessing submodules in the build the former option should be sufficient for most use cases. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/LICENSE deleted file mode 100644 index a2d22cb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2011-2014 by Yehuda Katz - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/README.markdown b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/README.markdown deleted file mode 100644 index d6aa6bd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/README.markdown +++ /dev/null @@ -1,438 +0,0 @@ -[![Travis Build Status](https://img.shields.io/travis/wycats/handlebars.js/master.svg)](https://travis-ci.org/wycats/handlebars.js) -[![Selenium Test Status](https://saucelabs.com/buildstatus/handlebars)](https://saucelabs.com/u/handlebars) - -Handlebars.js -============= - -Handlebars.js is an extension to the [Mustache templating -language](http://mustache.github.com/) created by Chris Wanstrath. -Handlebars.js and Mustache are both logicless templating languages that -keep the view and the code separated like we all know they should be. - -Checkout the official Handlebars docs site at -[http://www.handlebarsjs.com](http://www.handlebarsjs.com). - -Installing ----------- -Installing Handlebars is easy. Simply download the package [from the official site](http://handlebarsjs.com/) or the [bower repository][bower-repo] and add it to your web pages (you should usually use the most recent version). - -For web browsers, a free CDN is available at [jsDelivr](http://www.jsdelivr.com/#!handlebarsjs). Advanced usage, such as [version aliasing & concocting](https://github.com/jsdelivr/jsdelivr#usage), is available. - -Alternatively, if you prefer having the latest version of handlebars from -the 'master' branch, passing builds of the 'master' branch are automatically -published to S3. You may download the latest passing master build by grabbing -a `handlebars-latest.js` file from the [builds page][builds-page]. When the -build is published, it is also available as a `handlebars-gitSHA.js` file on -the builds page if you need a version to refer to others. -`handlebars-runtime.js` builds are also available. - -**Note**: The S3 builds page is provided as a convenience for the community, -but you should not use it for hosting Handlebars in production. - -Usage ------ -In general, the syntax of Handlebars.js templates is a superset -of Mustache templates. For basic syntax, check out the [Mustache -manpage](http://mustache.github.com/mustache.5.html). - -Once you have a template, use the `Handlebars.compile` method to compile -the template into a function. The generated function takes a context -argument, which will be used to render the template. - -```js -var source = "

Hello, my name is {{name}}. I am from {{hometown}}. I have " + - "{{kids.length}} kids:

" + - "
    {{#kids}}
  • {{name}} is {{age}}
  • {{/kids}}
"; -var template = Handlebars.compile(source); - -var data = { "name": "Alan", "hometown": "Somewhere, TX", - "kids": [{"name": "Jimmy", "age": "12"}, {"name": "Sally", "age": "4"}]}; -var result = template(data); - -// Would render: -//

Hello, my name is Alan. I am from Somewhere, TX. I have 2 kids:

-//
    -//
  • Jimmy is 12
  • -//
  • Sally is 4
  • -//
-``` - - -Registering Helpers -------------------- - -You can register helpers that Handlebars will use when evaluating your -template. Here's an example, which assumes that your objects have a URL -embedded in them, as well as the text for a link: - -```js -Handlebars.registerHelper('link_to', function() { - return new Handlebars.SafeString("" + Handlebars.Utils.escapeExpression(this.body) + ""); -}); - -var context = { posts: [{url: "/hello-world", body: "Hello World!"}] }; -var source = "
    {{#posts}}
  • {{link_to}}
  • {{/posts}}
" - -var template = Handlebars.compile(source); -template(context); - -// Would render: -// -// -``` - -Helpers take precedence over fields defined on the context. To access a field -that is masked by a helper, a path reference may be used. In the example above -a field named `link_to` on the `context` object would be referenced using: - -``` -{{./link_to}} -``` - -Escaping --------- - -By default, the `{{expression}}` syntax will escape its contents. This -helps to protect you against accidental XSS problems caused by malicious -data passed from the server as JSON. - -To explicitly *not* escape the contents, use the triple-mustache -(`{{{}}}`). You have seen this used in the above example. - - -Differences Between Handlebars.js and Mustache ----------------------------------------------- -Handlebars.js adds a couple of additional features to make writing -templates easier and also changes a tiny detail of how partials work. - -### Paths - -Handlebars.js supports an extended expression syntax that we call paths. -Paths are made up of typical expressions and `.` characters. Expressions -allow you to not only display data from the current context, but to -display data from contexts that are descendants and ancestors of the -current context. - -To display data from descendant contexts, use the `.` character. So, for -example, if your data were structured like: - -```js -var data = {"person": { "name": "Alan" }, "company": {"name": "Rad, Inc." } }; -``` - -You could display the person's name from the top-level context with the -following expression: - -``` -{{person.name}} -``` - -You can backtrack using `../`. For example, if you've already traversed -into the person object you could still display the company's name with -an expression like `{{../company.name}}`, so: - -``` -{{#with person}}{{name}} - {{../company.name}}{{/with}} -``` - -would render: - -``` -Alan - Rad, Inc. -``` - -### Strings - -When calling a helper, you can pass paths or Strings as parameters. For -instance: - -```js -Handlebars.registerHelper('link_to', function(title, options) { - return "" + title + "!" -}); - -var context = { posts: [{url: "/hello-world", body: "Hello World!"}] }; -var source = '
    {{#posts}}
  • {{{link_to "Post"}}}
  • {{/posts}}
' - -var template = Handlebars.compile(source); -template(context); - -// Would render: -// -// -``` - -When you pass a String as a parameter to a helper, the literal String -gets passed to the helper function. - - -### Block Helpers - -Handlebars.js also adds the ability to define block helpers. Block -helpers are functions that can be called from anywhere in the template. -Here's an example: - -```js -var source = "
    {{#people}}
  • {{#link}}{{name}}{{/link}}
  • {{/people}}
"; -Handlebars.registerHelper('link', function(options) { - return '' + options.fn(this) + ''; -}); -var template = Handlebars.compile(source); - -var data = { "people": [ - { "name": "Alan", "id": 1 }, - { "name": "Yehuda", "id": 2 } - ]}; -template(data); - -// Should render: -// -``` - -Whenever the block helper is called it is given one or more parameters, -any arguments that are passed into the helper in the call, and an `options` -object containing the `fn` function which executes the block's child. -The block's current context may be accessed through `this`. - -Block helpers have the same syntax as mustache sections but should not be -confused with one another. Sections are akin to an implicit `each` or -`with` statement depending on the input data and helpers are explicit -pieces of code that are free to implement whatever behavior they like. -The [mustache spec](http://mustache.github.io/mustache.5.html) -defines the exact behavior of sections. In the case of name conflicts, -helpers are given priority. - -### Partials - -You can register additional templates as partials, which will be used by -Handlebars when it encounters a partial (`{{> partialName}}`). Partials -can either be String templates or compiled template functions. Here's an -example: - -```js -var source = "
    {{#people}}
  • {{> link}}
  • {{/people}}
"; - -Handlebars.registerPartial('link', '{{name}}') -var template = Handlebars.compile(source); - -var data = { "people": [ - { "name": "Alan", "id": 1 }, - { "name": "Yehuda", "id": 2 } - ]}; - -template(data); - -// Should render: -// -``` - -Partials can also accept parameters - -```js -var source = "
{{> roster rosterProperties people=listOfPeople}}
"; - -Handlebars.registerPartial('roster', '

{{rosterName}}

{{#people}}{{id}}: {{name}}{{/people}}') -var template = Handlebars.compile(source); - -var data = { - "listOfPeople": [ - { "name": "Alan", "id": 1 }, - { "name": "Yehuda", "id": 2 } - ], - "rosterProperties": { - "rosterName": "Cool People" - } -}; - -template(data); - -// Should render: -//
-//

Cool People

-// 1: Alan -// 2: Yehuda -//
- -``` - -### Comments - -You can add comments to your templates with the following syntax: - -```js -{{! This is a comment }} -``` - -You can also use real html comments if you want them to end up in the output. - -```html -
- {{! This comment will not end up in the output }} - -
-``` - - -### Compatibility - -There are a few Mustache behaviors that Handlebars does not implement. -- Handlebars deviates from Mustache slightly in that it does not perform recursive lookup by default. The compile time `compat` flag must be set to enable this functionality. Users should note that there is a performance cost for enabling this flag. The exact cost varies by template, but it's recommended that performance sensitive operations should avoid this mode and instead opt for explicit path references. -- The optional Mustache-style lambdas are not supported. Instead Handlebars provides it's own lambda resolution that follows the behaviors of helpers. -- Alternative delimeters are not supported. - - -Precompiling Templates ----------------------- - -Handlebars allows templates to be precompiled and included as javascript -code rather than the handlebars template allowing for faster startup time. - -### Installation -The precompiler script may be installed via npm using the `npm install -g handlebars` -command. - -### Usage - -
-Precompile handlebar templates.
-Usage: handlebars template...
-
-Options:
-  -a, --amd            Create an AMD format function (allows loading with RequireJS)          [boolean]
-  -f, --output         Output File                                                            [string]
-  -k, --known          Known helpers                                                          [string]
-  -o, --knownOnly      Known helpers only                                                     [boolean]
-  -m, --min            Minimize output                                                        [boolean]
-  -s, --simple         Output template function only.                                         [boolean]
-  -r, --root           Template root. Base value that will be stripped from template names.   [string]
-  -c, --commonjs       Exports CommonJS style, path to Handlebars module                      [string]
-  -h, --handlebarPath  Path to handlebar.js (only valid for amd-style)                        [string]
-  -n, --namespace      Template namespace                                                     [string]
-  -p, --partial        Compiling a partial template                                           [boolean]
-  -d, --data           Include data when compiling                                            [boolean]
-  -e, --extension      Template extension.                                                    [string]
-  -b, --bom            Removes the BOM (Byte Order Mark) from the beginning of the templates. [boolean]
-
- -If using the precompiler's normal mode, the resulting templates will be -stored to the `Handlebars.templates` object using the relative template -name sans the extension. These templates may be executed in the same -manner as templates. - -If using the simple mode the precompiler will generate a single -javascript method. To execute this method it must be passed to -the `Handlebars.template` method and the resulting object may be used as normal. - -### Optimizations - -- Rather than using the full _handlebars.js_ library, implementations that - do not need to compile templates at runtime may include _handlebars.runtime.js_ - whose min+gzip size is approximately 1k. -- If a helper is known to exist in the target environment they may be defined - using the `--known name` argument may be used to optimize accesses to these - helpers for size and speed. -- When all helpers are known in advance the `--knownOnly` argument may be used - to optimize all block helper references. -- Implementations that do not use `@data` variables can improve performance of - iteration centric templates by specifying `{data: false}` in the compiler options. - -Supported Environments ----------------------- - -Handlebars has been designed to work in any ECMAScript 3 environment. This includes - -- Node.js -- Chrome -- Firefox -- Safari 5+ -- Opera 11+ -- IE 6+ - -Older versions and other runtimes are likely to work but have not been formally -tested. The compiler requires `JSON.stringify` to be implemented natively or via a polyfill. If using the precompiler this is not necessary. - -[![Selenium Test Status](https://saucelabs.com/browser-matrix/handlebars.svg)](https://saucelabs.com/u/handlebars) - -Performance ------------ - -In a rough performance test, precompiled Handlebars.js templates (in -the original version of Handlebars.js) rendered in about half the -time of Mustache templates. It would be a shame if it were any other -way, since they were precompiled, but the difference in architecture -does have some big performance advantages. Justin Marney, a.k.a. -[gotascii](http://github.com/gotascii), confirmed that with an -[independent test](http://sorescode.com/2010/09/12/benchmarks.html). The -rewritten Handlebars (current version) is faster than the old version, -with many [performance tests](https://travis-ci.org/wycats/handlebars.js/builds/33392182#L538) being 5 to 7 times faster than the Mustache equivalent. - - -Upgrading ---------- - -See [release-notes.md](https://github.com/wycats/handlebars.js/blob/master/release-notes.md) for upgrade notes. - -Known Issues ------------- - -See [FAQ.md](https://github.com/wycats/handlebars.js/blob/master/FAQ.md) for known issues and common pitfalls. - - -Handlebars in the Wild ----------------------- - -* [Assemble](http://assemble.io), by [@jonschlinkert](https://github.com/jonschlinkert) - and [@doowb](https://github.com/doowb), is a static site generator that uses Handlebars.js - as its template engine. -* [CoSchedule](http://coschedule.com) An editorial calendar for WordPress that uses Handlebars.js -* [dashbars](https://github.com/pismute/dashbars) A modern helper library for Handlebars.js. -* [Ember.js](http://www.emberjs.com) makes Handlebars.js the primary way to - structure your views, also with automatic data binding support. -* [Ghost](https://ghost.org/) Just a blogging platform. -* [handlebars_assets](http://github.com/leshill/handlebars_assets): A Rails Asset Pipeline gem - from Les Hill (@leshill). -* [handlebars-helpers](https://github.com/assemble/handlebars-helpers) is an extensive library - with 100+ handlebars helpers. -* [handlebars-layouts](https://github.com/shannonmoeller/handlebars-layouts) is a set of helpers which implement extendible and embeddable layout blocks as seen in other popular templating languages. -* [hbs](http://github.com/donpark/hbs): An Express.js view engine adapter for Handlebars.js, - from Don Park. -* [koa-hbs](https://github.com/jwilm/koa-hbs): [koa](https://github.com/koajs/koa) generator based - renderer for Handlebars.js. -* [jblotus](http://github.com/jblotus) created [http://tryhandlebarsjs.com](http://tryhandlebarsjs.com) - for anyone who would like to try out Handlebars.js in their browser. -* [jQuery plugin](http://71104.github.io/jquery-handlebars/): allows you to use - Handlebars.js with [jQuery](http://jquery.com/). -* [Lumbar](http://walmartlabs.github.io/lumbar) provides easy module-based template management for - handlebars projects. -* [sammy.js](http://github.com/quirkey/sammy) by Aaron Quint, a.k.a. quirkey, - supports Handlebars.js as one of its template plugins. -* [SproutCore](http://www.sproutcore.com) uses Handlebars.js as its main - templating engine, extending it with automatic data binding support. -* [YUI](http://yuilibrary.com/yui/docs/handlebars/) implements a port of handlebars -* [Swag](https://github.com/elving/swag) by [@elving](https://github.com/elving) is a growing collection of helpers for handlebars.js. Give your handlebars.js templates some swag son! -* [DOMBars](https://github.com/blakeembrey/dombars) is a DOM-based templating engine built on the Handlebars parser and runtime - -External Resources ------------------- - -* [Gist about Synchronous and asynchronous loading of external handlebars templates](https://gist.github.com/2287070) - -Have a project using Handlebars? Send us a [pull request][pull-request]! - -License -------- -Handlebars.js is released under the MIT license. - -[bower-repo]: https://github.com/components/handlebars.js -[builds-page]: http://builds.handlebarsjs.com.s3.amazonaws.com/bucket-listing.html?sort=lastmod&sortdir=desc -[pull-request]: https://github.com/wycats/handlebars.js/pull/new/master diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/bin/handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/bin/handlebars deleted file mode 100755 index 4ed98b3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/bin/handlebars +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env node - -var optimist = require('optimist') - .usage('Precompile handlebar templates.\nUsage: $0 [template|directory]...', { - 'f': { - 'type': 'string', - 'description': 'Output File', - 'alias': 'output' - }, - 'map': { - 'type': 'string', - 'description': 'Source Map File' - }, - 'a': { - 'type': 'boolean', - 'description': 'Exports amd style (require.js)', - 'alias': 'amd' - }, - 'c': { - 'type': 'string', - 'description': 'Exports CommonJS style, path to Handlebars module', - 'alias': 'commonjs', - 'default': null - }, - 'h': { - 'type': 'string', - 'description': 'Path to handlebar.js (only valid for amd-style)', - 'alias': 'handlebarPath', - 'default': '' - }, - 'k': { - 'type': 'string', - 'description': 'Known helpers', - 'alias': 'known' - }, - 'o': { - 'type': 'boolean', - 'description': 'Known helpers only', - 'alias': 'knownOnly' - }, - 'm': { - 'type': 'boolean', - 'description': 'Minimize output', - 'alias': 'min' - }, - 'n': { - 'type': 'string', - 'description': 'Template namespace', - 'alias': 'namespace', - 'default': 'Handlebars.templates' - }, - 's': { - 'type': 'boolean', - 'description': 'Output template function only.', - 'alias': 'simple' - }, - 'r': { - 'type': 'string', - 'description': 'Template root. Base value that will be stripped from template names.', - 'alias': 'root' - }, - 'p' : { - 'type': 'boolean', - 'description': 'Compiling a partial template', - 'alias': 'partial' - }, - 'd' : { - 'type': 'boolean', - 'description': 'Include data when compiling', - 'alias': 'data' - }, - 'e': { - 'type': 'string', - 'description': 'Template extension.', - 'alias': 'extension', - 'default': 'handlebars' - }, - 'b': { - 'type': 'boolean', - 'description': 'Removes the BOM (Byte Order Mark) from the beginning of the templates.', - 'alias': 'bom' - }, - 'v': { - 'type': 'boolean', - 'description': 'Prints the current compiler version', - 'alias': 'version' - }, - - 'help': { - 'type': 'boolean', - 'description': 'Outputs this message' - } - }) - - .check(function(argv) { - if (argv.version) { - return; - } - }); - - -var argv = optimist.argv; -argv.templates = argv._; -delete argv._; - -if (argv.help || (!argv.templates.length && !argv.version)) { - optimist.showHelp(); - return; -} - -return require('../dist/cjs/precompiler').cli(argv); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.js deleted file mode 100644 index 3e2b5f9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.js +++ /dev/null @@ -1,48 +0,0 @@ -define(['exports', 'module', './handlebars.runtime', './handlebars/compiler/ast', './handlebars/compiler/base', './handlebars/compiler/compiler', './handlebars/compiler/javascript-compiler', './handlebars/compiler/visitor', './handlebars/no-conflict'], function (exports, module, _handlebarsRuntime, _handlebarsCompilerAst, _handlebarsCompilerBase, _handlebarsCompilerCompiler, _handlebarsCompilerJavascriptCompiler, _handlebarsCompilerVisitor, _handlebarsNoConflict) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _runtime = _interopRequire(_handlebarsRuntime); - - // Compiler imports - - var _AST = _interopRequire(_handlebarsCompilerAst); - - var _JavaScriptCompiler = _interopRequire(_handlebarsCompilerJavascriptCompiler); - - var _Visitor = _interopRequire(_handlebarsCompilerVisitor); - - var _noConflict = _interopRequire(_handlebarsNoConflict); - - var _create = _runtime.create; - function create() { - var hb = _create(); - - hb.compile = function (input, options) { - return _handlebarsCompilerCompiler.compile(input, options, hb); - }; - hb.precompile = function (input, options) { - return _handlebarsCompilerCompiler.precompile(input, options, hb); - }; - - hb.AST = _AST; - hb.Compiler = _handlebarsCompilerCompiler.Compiler; - hb.JavaScriptCompiler = _JavaScriptCompiler; - hb.Parser = _handlebarsCompilerBase.parser; - hb.parse = _handlebarsCompilerBase.parse; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict(inst); - - inst.Visitor = _Visitor; - - inst['default'] = inst; - - module.exports = inst; -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.runtime.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.runtime.js deleted file mode 100644 index 73218be..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.runtime.js +++ /dev/null @@ -1,41 +0,0 @@ -define(['exports', 'module', './handlebars/base', './handlebars/safe-string', './handlebars/exception', './handlebars/utils', './handlebars/runtime', './handlebars/no-conflict'], function (exports, module, _handlebarsBase, _handlebarsSafeString, _handlebarsException, _handlebarsUtils, _handlebarsRuntime, _handlebarsNoConflict) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - // Each of these augment the Handlebars object. No need to setup here. - // (This is done to easily share code between commonjs and browse envs) - - var _SafeString = _interopRequire(_handlebarsSafeString); - - var _Exception = _interopRequire(_handlebarsException); - - var _noConflict = _interopRequire(_handlebarsNoConflict); - - // For compatibility and usage outside of module systems, make the Handlebars object a namespace - function create() { - var hb = new _handlebarsBase.HandlebarsEnvironment(); - - _handlebarsUtils.extend(hb, _handlebarsBase); - hb.SafeString = _SafeString; - hb.Exception = _Exception; - hb.Utils = _handlebarsUtils; - hb.escapeExpression = _handlebarsUtils.escapeExpression; - - hb.VM = _handlebarsRuntime; - hb.template = function (spec) { - return _handlebarsRuntime.template(spec, hb); - }; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict(inst); - - inst['default'] = inst; - - module.exports = inst; -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/base.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/base.js deleted file mode 100644 index 4b7e4b3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/base.js +++ /dev/null @@ -1,268 +0,0 @@ -define(['exports', './utils', './exception'], function (exports, _utils, _exception) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.HandlebarsEnvironment = HandlebarsEnvironment; - exports.createFrame = createFrame; - - var _Exception = _interopRequire(_exception); - - var VERSION = '3.0.1'; - exports.VERSION = VERSION; - var COMPILER_REVISION = 6; - - exports.COMPILER_REVISION = COMPILER_REVISION; - var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' - }; - - exports.REVISION_CHANGES = REVISION_CHANGES; - var isArray = _utils.isArray, - isFunction = _utils.isFunction, - toString = _utils.toString, - objectType = '[object Object]'; - - function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); - } - - HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function registerHelper(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { - throw new _Exception('Arg not supported with multiple helpers'); - } - _utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (toString.call(name) === objectType) { - _utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _Exception('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - } - }; - - function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function () { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _Exception('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _Exception('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (var j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function (conditional, options) { - if (isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - - instance.registerHelper('with', function (context, options) { - if (isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!_utils.isEmpty(context)) { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = { data: data }; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function (message, options) { - var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); - } - - var logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function log(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - var method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } - }; - - exports.logger = logger; - var log = logger.log; - - exports.log = log; - - function createFrame(object) { - var frame = _utils.extend({}, object); - frame._parent = object; - return frame; - } -}); -/* [args, ]options */ \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/ast.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/ast.js deleted file mode 100644 index c025389..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/ast.js +++ /dev/null @@ -1,152 +0,0 @@ -define(['exports', 'module'], function (exports, module) { - 'use strict'; - - var AST = { - Program: function Program(statements, blockParams, strip, locInfo) { - this.loc = locInfo; - this.type = 'Program'; - this.body = statements; - - this.blockParams = blockParams; - this.strip = strip; - }, - - MustacheStatement: function MustacheStatement(path, params, hash, escaped, strip, locInfo) { - this.loc = locInfo; - this.type = 'MustacheStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.escaped = escaped; - - this.strip = strip; - }, - - BlockStatement: function BlockStatement(path, params, hash, program, inverse, openStrip, inverseStrip, closeStrip, locInfo) { - this.loc = locInfo; - this.type = 'BlockStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.program = program; - this.inverse = inverse; - - this.openStrip = openStrip; - this.inverseStrip = inverseStrip; - this.closeStrip = closeStrip; - }, - - PartialStatement: function PartialStatement(name, params, hash, strip, locInfo) { - this.loc = locInfo; - this.type = 'PartialStatement'; - - this.name = name; - this.params = params || []; - this.hash = hash; - - this.indent = ''; - this.strip = strip; - }, - - ContentStatement: function ContentStatement(string, locInfo) { - this.loc = locInfo; - this.type = 'ContentStatement'; - this.original = this.value = string; - }, - - CommentStatement: function CommentStatement(comment, strip, locInfo) { - this.loc = locInfo; - this.type = 'CommentStatement'; - this.value = comment; - - this.strip = strip; - }, - - SubExpression: function SubExpression(path, params, hash, locInfo) { - this.loc = locInfo; - - this.type = 'SubExpression'; - this.path = path; - this.params = params || []; - this.hash = hash; - }, - - PathExpression: function PathExpression(data, depth, parts, original, locInfo) { - this.loc = locInfo; - this.type = 'PathExpression'; - - this.data = data; - this.original = original; - this.parts = parts; - this.depth = depth; - }, - - StringLiteral: function StringLiteral(string, locInfo) { - this.loc = locInfo; - this.type = 'StringLiteral'; - this.original = this.value = string; - }, - - NumberLiteral: function NumberLiteral(number, locInfo) { - this.loc = locInfo; - this.type = 'NumberLiteral'; - this.original = this.value = Number(number); - }, - - BooleanLiteral: function BooleanLiteral(bool, locInfo) { - this.loc = locInfo; - this.type = 'BooleanLiteral'; - this.original = this.value = bool === 'true'; - }, - - UndefinedLiteral: function UndefinedLiteral(locInfo) { - this.loc = locInfo; - this.type = 'UndefinedLiteral'; - this.original = this.value = undefined; - }, - - NullLiteral: function NullLiteral(locInfo) { - this.loc = locInfo; - this.type = 'NullLiteral'; - this.original = this.value = null; - }, - - Hash: function Hash(pairs, locInfo) { - this.loc = locInfo; - this.type = 'Hash'; - this.pairs = pairs; - }, - HashPair: function HashPair(key, value, locInfo) { - this.loc = locInfo; - this.type = 'HashPair'; - this.key = key; - this.value = value; - }, - - // Public API used to evaluate derived attributes regarding AST nodes - helpers: { - // a mustache is definitely a helper if: - // * it is an eligible helper, and - // * it has at least one parameter or hash segment - helperExpression: function helperExpression(node) { - return !!(node.type === 'SubExpression' || node.params.length || node.hash); - }, - - scopedId: function scopedId(path) { - return /^\.|this\b/.test(path.original); - }, - - // an ID is simple if it only has one part, and that part is not - // `..` or `this`. - simpleId: function simpleId(path) { - return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; - } - } - }; - - // Must be exported as an object rather than the root of the module as the jison lexer - // must modify the object to operate properly. - module.exports = AST; -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/base.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/base.js deleted file mode 100644 index 35473b1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/base.js +++ /dev/null @@ -1,36 +0,0 @@ -define(['exports', './parser', './ast', './whitespace-control', './helpers', '../utils'], function (exports, _parser, _ast, _whitespaceControl, _helpers, _utils) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.parse = parse; - - var _parser2 = _interopRequire(_parser); - - var _AST = _interopRequire(_ast); - - var _WhitespaceControl = _interopRequire(_whitespaceControl); - - exports.parser = _parser2; - - var yy = {}; - _utils.extend(yy, _helpers, _AST); - - function parse(input, options) { - // Just return if an already-compiled AST was passed in. - if (input.type === 'Program') { - return input; - } - - _parser2.yy = yy; - - // Altering the shared object here, but this is ok as parser is a sync operation - yy.locInfo = function (locInfo) { - return new yy.SourceLocation(options && options.srcName, locInfo); - }; - - var strip = new _WhitespaceControl(); - return strip.accept(_parser2.parse(input)); - } -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/code-gen.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/code-gen.js deleted file mode 100644 index 4baf088..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/code-gen.js +++ /dev/null @@ -1,161 +0,0 @@ -define(['exports', 'module', '../utils'], function (exports, module, _utils) { - 'use strict'; - - var SourceNode = undefined; - - try { - /* istanbul ignore next */ - if (typeof define !== 'function' || !define.amd) { - // We don't support this in AMD environments. For these environments, we asusme that - // they are running on the browser and thus have no need for the source-map library. - var SourceMap = require('source-map'); - SourceNode = SourceMap.SourceNode; - } - } catch (err) {} - - /* istanbul ignore if: tested but not covered in istanbul due to dist build */ - if (!SourceNode) { - SourceNode = function (line, column, srcFile, chunks) { - this.src = ''; - if (chunks) { - this.add(chunks); - } - }; - /* istanbul ignore next */ - SourceNode.prototype = { - add: function add(chunks) { - if (_utils.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src += chunks; - }, - prepend: function prepend(chunks) { - if (_utils.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src = chunks + this.src; - }, - toStringWithSourceMap: function toStringWithSourceMap() { - return { code: this.toString() }; - }, - toString: function toString() { - return this.src; - } - }; - } - - function castChunk(chunk, codeGen, loc) { - if (_utils.isArray(chunk)) { - var ret = []; - - for (var i = 0, len = chunk.length; i < len; i++) { - ret.push(codeGen.wrap(chunk[i], loc)); - } - return ret; - } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { - // Handle primitives that the SourceNode will throw up on - return chunk + ''; - } - return chunk; - } - - function CodeGen(srcFile) { - this.srcFile = srcFile; - this.source = []; - } - - CodeGen.prototype = { - prepend: function prepend(source, loc) { - this.source.unshift(this.wrap(source, loc)); - }, - push: function push(source, loc) { - this.source.push(this.wrap(source, loc)); - }, - - merge: function merge() { - var source = this.empty(); - this.each(function (line) { - source.add([' ', line, '\n']); - }); - return source; - }, - - each: function each(iter) { - for (var i = 0, len = this.source.length; i < len; i++) { - iter(this.source[i]); - } - }, - - empty: function empty() { - var loc = arguments[0] === undefined ? this.currentLocation || { start: {} } : arguments[0]; - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile); - }, - wrap: function wrap(chunk) { - var loc = arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1]; - - if (chunk instanceof SourceNode) { - return chunk; - } - - chunk = castChunk(chunk, this, loc); - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); - }, - - functionCall: function functionCall(fn, type, params) { - params = this.generateList(params); - return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); - }, - - quotedString: function quotedString(str) { - return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 - .replace(/\u2029/g, '\\u2029') + '"'; - }, - - objectLiteral: function objectLiteral(obj) { - var pairs = []; - - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - var value = castChunk(obj[key], this); - if (value !== 'undefined') { - pairs.push([this.quotedString(key), ':', value]); - } - } - } - - var ret = this.generateList(pairs); - ret.prepend('{'); - ret.add('}'); - return ret; - }, - - generateList: function generateList(entries, loc) { - var ret = this.empty(loc); - - for (var i = 0, len = entries.length; i < len; i++) { - if (i) { - ret.add(','); - } - - ret.add(castChunk(entries[i], this, loc)); - } - - return ret; - }, - - generateArray: function generateArray(entries, loc) { - var ret = this.generateList(entries, loc); - ret.prepend('['); - ret.add(']'); - - return ret; - } - }; - - module.exports = CodeGen; -}); -/*global define */ - -/* NOP */ \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/compiler.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/compiler.js deleted file mode 100644 index 152e528..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/compiler.js +++ /dev/null @@ -1,523 +0,0 @@ -define(['exports', '../exception', '../utils', './ast'], function (exports, _exception, _utils, _ast) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.Compiler = Compiler; - exports.precompile = precompile; - exports.compile = compile; - - var _Exception = _interopRequire(_exception); - - var _AST = _interopRequire(_ast); - - var slice = [].slice; - - function Compiler() {} - - // the foundHelper register will disambiguate helper lookup from finding a - // function in a context. This is necessary for mustache compatibility, which - // requires that context functions in blocks are evaluated by blockHelperMissing, - // and then proceed as if the resulting value was provided to blockHelperMissing. - - Compiler.prototype = { - compiler: Compiler, - - equals: function equals(other) { - var len = this.opcodes.length; - if (other.opcodes.length !== len) { - return false; - } - - for (var i = 0; i < len; i++) { - var opcode = this.opcodes[i], - otherOpcode = other.opcodes[i]; - if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { - return false; - } - } - - // We know that length is the same between the two arrays because they are directly tied - // to the opcode behavior above. - len = this.children.length; - for (var i = 0; i < len; i++) { - if (!this.children[i].equals(other.children[i])) { - return false; - } - } - - return true; - }, - - guid: 0, - - compile: function compile(program, options) { - this.sourceNode = []; - this.opcodes = []; - this.children = []; - this.options = options; - this.stringParams = options.stringParams; - this.trackIds = options.trackIds; - - options.blockParams = options.blockParams || []; - - // These changes will propagate to the other compiler components - var knownHelpers = options.knownHelpers; - options.knownHelpers = { - helperMissing: true, - blockHelperMissing: true, - each: true, - 'if': true, - unless: true, - 'with': true, - log: true, - lookup: true - }; - if (knownHelpers) { - for (var _name in knownHelpers) { - if (_name in knownHelpers) { - options.knownHelpers[_name] = knownHelpers[_name]; - } - } - } - - return this.accept(program); - }, - - compileProgram: function compileProgram(program) { - var childCompiler = new this.compiler(), - // eslint-disable-line new-cap - result = childCompiler.compile(program, this.options), - guid = this.guid++; - - this.usePartial = this.usePartial || result.usePartial; - - this.children[guid] = result; - this.useDepths = this.useDepths || result.useDepths; - - return guid; - }, - - accept: function accept(node) { - this.sourceNode.unshift(node); - var ret = this[node.type](node); - this.sourceNode.shift(); - return ret; - }, - - Program: function Program(program) { - this.options.blockParams.unshift(program.blockParams); - - var body = program.body, - bodyLength = body.length; - for (var i = 0; i < bodyLength; i++) { - this.accept(body[i]); - } - - this.options.blockParams.shift(); - - this.isSimple = bodyLength === 1; - this.blockParams = program.blockParams ? program.blockParams.length : 0; - - return this; - }, - - BlockStatement: function BlockStatement(block) { - transformLiteralToPath(block); - - var program = block.program, - inverse = block.inverse; - - program = program && this.compileProgram(program); - inverse = inverse && this.compileProgram(inverse); - - var type = this.classifySexpr(block); - - if (type === 'helper') { - this.helperSexpr(block, program, inverse); - } else if (type === 'simple') { - this.simpleSexpr(block); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('blockValue', block.path.original); - } else { - this.ambiguousSexpr(block, program, inverse); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('ambiguousBlockValue'); - } - - this.opcode('append'); - }, - - PartialStatement: function PartialStatement(partial) { - this.usePartial = true; - - var params = partial.params; - if (params.length > 1) { - throw new _Exception('Unsupported number of partial arguments: ' + params.length, partial); - } else if (!params.length) { - params.push({ type: 'PathExpression', parts: [], depth: 0 }); - } - - var partialName = partial.name.original, - isDynamic = partial.name.type === 'SubExpression'; - if (isDynamic) { - this.accept(partial.name); - } - - this.setupFullMustacheParams(partial, undefined, undefined, true); - - var indent = partial.indent || ''; - if (this.options.preventIndent && indent) { - this.opcode('appendContent', indent); - indent = ''; - } - - this.opcode('invokePartial', isDynamic, partialName, indent); - this.opcode('append'); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.SubExpression(mustache); // eslint-disable-line new-cap - - if (mustache.escaped && !this.options.noEscape) { - this.opcode('appendEscaped'); - } else { - this.opcode('append'); - } - }, - - ContentStatement: function ContentStatement(content) { - if (content.value) { - this.opcode('appendContent', content.value); - } - }, - - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - transformLiteralToPath(sexpr); - var type = this.classifySexpr(sexpr); - - if (type === 'simple') { - this.simpleSexpr(sexpr); - } else if (type === 'helper') { - this.helperSexpr(sexpr); - } else { - this.ambiguousSexpr(sexpr); - } - }, - ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) { - var path = sexpr.path, - name = path.parts[0], - isBlock = program != null || inverse != null; - - this.opcode('getContext', path.depth); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - this.accept(path); - - this.opcode('invokeAmbiguous', name, isBlock); - }, - - simpleSexpr: function simpleSexpr(sexpr) { - this.accept(sexpr.path); - this.opcode('resolvePossibleLambda'); - }, - - helperSexpr: function helperSexpr(sexpr, program, inverse) { - var params = this.setupFullMustacheParams(sexpr, program, inverse), - path = sexpr.path, - name = path.parts[0]; - - if (this.options.knownHelpers[name]) { - this.opcode('invokeKnownHelper', params.length, name); - } else if (this.options.knownHelpersOnly) { - throw new _Exception('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); - } else { - path.falsy = true; - - this.accept(path); - this.opcode('invokeHelper', params.length, path.original, _AST.helpers.simpleId(path)); - } - }, - - PathExpression: function PathExpression(path) { - this.addDepth(path.depth); - this.opcode('getContext', path.depth); - - var name = path.parts[0], - scoped = _AST.helpers.scopedId(path), - blockParamId = !path.depth && !scoped && this.blockParamIndex(name); - - if (blockParamId) { - this.opcode('lookupBlockParam', blockParamId, path.parts); - } else if (!name) { - // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` - this.opcode('pushContext'); - } else if (path.data) { - this.options.data = true; - this.opcode('lookupData', path.depth, path.parts); - } else { - this.opcode('lookupOnContext', path.parts, path.falsy, scoped); - } - }, - - StringLiteral: function StringLiteral(string) { - this.opcode('pushString', string.value); - }, - - NumberLiteral: function NumberLiteral(number) { - this.opcode('pushLiteral', number.value); - }, - - BooleanLiteral: function BooleanLiteral(bool) { - this.opcode('pushLiteral', bool.value); - }, - - UndefinedLiteral: function UndefinedLiteral() { - this.opcode('pushLiteral', 'undefined'); - }, - - NullLiteral: function NullLiteral() { - this.opcode('pushLiteral', 'null'); - }, - - Hash: function Hash(hash) { - var pairs = hash.pairs, - i = 0, - l = pairs.length; - - this.opcode('pushHash'); - - for (; i < l; i++) { - this.pushParam(pairs[i].value); - } - while (i--) { - this.opcode('assignToHash', pairs[i].key); - } - this.opcode('popHash'); - }, - - // HELPERS - opcode: function opcode(name) { - this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); - }, - - addDepth: function addDepth(depth) { - if (!depth) { - return; - } - - this.useDepths = true; - }, - - classifySexpr: function classifySexpr(sexpr) { - var isSimple = _AST.helpers.simpleId(sexpr.path); - - var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); - - // a mustache is an eligible helper if: - // * its id is simple (a single part, not `this` or `..`) - var isHelper = !isBlockParam && _AST.helpers.helperExpression(sexpr); - - // if a mustache is an eligible helper but not a definite - // helper, it is ambiguous, and will be resolved in a later - // pass or at runtime. - var isEligible = !isBlockParam && (isHelper || isSimple); - - // if ambiguous, we can possibly resolve the ambiguity now - // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. - if (isEligible && !isHelper) { - var _name2 = sexpr.path.parts[0], - options = this.options; - - if (options.knownHelpers[_name2]) { - isHelper = true; - } else if (options.knownHelpersOnly) { - isEligible = false; - } - } - - if (isHelper) { - return 'helper'; - } else if (isEligible) { - return 'ambiguous'; - } else { - return 'simple'; - } - }, - - pushParams: function pushParams(params) { - for (var i = 0, l = params.length; i < l; i++) { - this.pushParam(params[i]); - } - }, - - pushParam: function pushParam(val) { - var value = val.value != null ? val.value : val.original || ''; - - if (this.stringParams) { - if (value.replace) { - value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.'); - } - - if (val.depth) { - this.addDepth(val.depth); - } - this.opcode('getContext', val.depth || 0); - this.opcode('pushStringParam', value, val.type); - - if (val.type === 'SubExpression') { - // SubExpressions get evaluated and passed in - // in string params mode. - this.accept(val); - } - } else { - if (this.trackIds) { - var blockParamIndex = undefined; - if (val.parts && !_AST.helpers.scopedId(val) && !val.depth) { - blockParamIndex = this.blockParamIndex(val.parts[0]); - } - if (blockParamIndex) { - var blockParamChild = val.parts.slice(1).join('.'); - this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); - } else { - value = val.original || value; - if (value.replace) { - value = value.replace(/^\.\//g, '').replace(/^\.$/g, ''); - } - - this.opcode('pushId', val.type, value); - } - } - this.accept(val); - } - }, - - setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) { - var params = sexpr.params; - this.pushParams(params); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - if (sexpr.hash) { - this.accept(sexpr.hash); - } else { - this.opcode('emptyHash', omitEmpty); - } - - return params; - }, - - blockParamIndex: function blockParamIndex(name) { - for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) { - var blockParams = this.options.blockParams[depth], - param = blockParams && _utils.indexOf(blockParams, name); - if (blockParams && param >= 0) { - return [depth, param]; - } - } - } - }; - - function precompile(input, options, env) { - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); - } - - options = options || {}; - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options); - return new env.JavaScriptCompiler().compile(environment, options); - } - - function compile(input, _x, env) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); - } - - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var compiled = undefined; - - function compileInput() { - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options), - templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); - return env.template(templateSpec); - } - - // Template is only compiled on first use and cached after that point. - function ret(context, execOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled.call(this, context, execOptions); - } - ret._setup = function (setupOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._setup(setupOptions); - }; - ret._child = function (i, data, blockParams, depths) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._child(i, data, blockParams, depths); - }; - return ret; - } - - function argEquals(a, b) { - if (a === b) { - return true; - } - - if (_utils.isArray(a) && _utils.isArray(b) && a.length === b.length) { - for (var i = 0; i < a.length; i++) { - if (!argEquals(a[i], b[i])) { - return false; - } - } - return true; - } - } - - function transformLiteralToPath(sexpr) { - if (!sexpr.path.parts) { - var literal = sexpr.path; - // Casting to string here to make false and 0 literal values play nicely with the rest - // of the system. - sexpr.path = new _AST.PathExpression(false, 0, [literal.original + ''], literal.original + '', literal.loc); - } - } -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/helpers.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/helpers.js deleted file mode 100644 index 97efc9e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/helpers.js +++ /dev/null @@ -1,131 +0,0 @@ -define(['exports', '../exception'], function (exports, _exception) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.SourceLocation = SourceLocation; - exports.id = id; - exports.stripFlags = stripFlags; - exports.stripComment = stripComment; - exports.preparePath = preparePath; - exports.prepareMustache = prepareMustache; - exports.prepareRawBlock = prepareRawBlock; - exports.prepareBlock = prepareBlock; - - var _Exception = _interopRequire(_exception); - - function SourceLocation(source, locInfo) { - this.source = source; - this.start = { - line: locInfo.first_line, - column: locInfo.first_column - }; - this.end = { - line: locInfo.last_line, - column: locInfo.last_column - }; - } - - function id(token) { - if (/^\[.*\]$/.test(token)) { - return token.substr(1, token.length - 2); - } else { - return token; - } - } - - function stripFlags(open, close) { - return { - open: open.charAt(2) === '~', - close: close.charAt(close.length - 3) === '~' - }; - } - - function stripComment(comment) { - return comment.replace(/^\{\{~?\!-?-?/, '').replace(/-?-?~?\}\}$/, ''); - } - - function preparePath(data, parts, locInfo) { - locInfo = this.locInfo(locInfo); - - var original = data ? '@' : '', - dig = [], - depth = 0, - depthString = ''; - - for (var i = 0, l = parts.length; i < l; i++) { - var part = parts[i].part, - - // If we have [] syntax then we do not treat path references as operators, - // i.e. foo.[this] resolves to approximately context.foo['this'] - isLiteral = parts[i].original !== part; - original += (parts[i].separator || '') + part; - - if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { - if (dig.length > 0) { - throw new _Exception('Invalid path: ' + original, { loc: locInfo }); - } else if (part === '..') { - depth++; - depthString += '../'; - } - } else { - dig.push(part); - } - } - - return new this.PathExpression(data, depth, dig, original, locInfo); - } - - function prepareMustache(path, params, hash, open, strip, locInfo) { - // Must use charAt to support IE pre-10 - var escapeFlag = open.charAt(3) || open.charAt(2), - escaped = escapeFlag !== '{' && escapeFlag !== '&'; - - return new this.MustacheStatement(path, params, hash, escaped, strip, this.locInfo(locInfo)); - } - - function prepareRawBlock(openRawBlock, content, close, locInfo) { - if (openRawBlock.path.original !== close) { - var errorNode = { loc: openRawBlock.path.loc }; - - throw new _Exception(openRawBlock.path.original + ' doesn\'t match ' + close, errorNode); - } - - locInfo = this.locInfo(locInfo); - var program = new this.Program([content], null, {}, locInfo); - - return new this.BlockStatement(openRawBlock.path, openRawBlock.params, openRawBlock.hash, program, undefined, {}, {}, {}, locInfo); - } - - function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { - // When we are chaining inverse calls, we will not have a close path - if (close && close.path && openBlock.path.original !== close.path.original) { - var errorNode = { loc: openBlock.path.loc }; - - throw new _Exception(openBlock.path.original + ' doesn\'t match ' + close.path.original, errorNode); - } - - program.blockParams = openBlock.blockParams; - - var inverse = undefined, - inverseStrip = undefined; - - if (inverseAndProgram) { - if (inverseAndProgram.chain) { - inverseAndProgram.program.body[0].closeStrip = close.strip; - } - - inverseStrip = inverseAndProgram.strip; - inverse = inverseAndProgram.program; - } - - if (inverted) { - inverted = inverse; - inverse = program; - program = inverted; - } - - return new this.BlockStatement(openBlock.path, openBlock.params, openBlock.hash, program, inverse, openBlock.strip, inverseStrip, close && close.strip, this.locInfo(locInfo)); - } -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/javascript-compiler.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/javascript-compiler.js deleted file mode 100644 index befdf50..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/javascript-compiler.js +++ /dev/null @@ -1,1053 +0,0 @@ -define(['exports', 'module', '../base', '../exception', '../utils', './code-gen'], function (exports, module, _base, _exception, _utils, _codeGen) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _Exception = _interopRequire(_exception); - - var _CodeGen = _interopRequire(_codeGen); - - function Literal(value) { - this.value = value; - } - - function JavaScriptCompiler() {} - - JavaScriptCompiler.prototype = { - // PUBLIC API: You can override these methods in a subclass to provide - // alternative compiled forms for name lookup and buffering semantics - nameLookup: function nameLookup(parent, name /* , type*/) { - if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { - return [parent, '.', name]; - } else { - return [parent, '[\'', name, '\']']; - } - }, - depthedLookup: function depthedLookup(name) { - return [this.aliasable('this.lookup'), '(depths, "', name, '")']; - }, - - compilerInfo: function compilerInfo() { - var revision = _base.COMPILER_REVISION, - versions = _base.REVISION_CHANGES[revision]; - return [revision, versions]; - }, - - appendToBuffer: function appendToBuffer(source, location, explicit) { - // Force a source as this simplifies the merge logic. - if (!_utils.isArray(source)) { - source = [source]; - } - source = this.source.wrap(source, location); - - if (this.environment.isSimple) { - return ['return ', source, ';']; - } else if (explicit) { - // This is a case where the buffer operation occurs as a child of another - // construct, generally braces. We have to explicitly output these buffer - // operations to ensure that the emitted code goes in the correct location. - return ['buffer += ', source, ';']; - } else { - source.appendToBuffer = true; - return source; - } - }, - - initializeBuffer: function initializeBuffer() { - return this.quotedString(''); - }, - // END PUBLIC API - - compile: function compile(environment, options, context, asObject) { - this.environment = environment; - this.options = options; - this.stringParams = this.options.stringParams; - this.trackIds = this.options.trackIds; - this.precompile = !asObject; - - this.name = this.environment.name; - this.isChild = !!context; - this.context = context || { - programs: [], - environments: [] - }; - - this.preamble(); - - this.stackSlot = 0; - this.stackVars = []; - this.aliases = {}; - this.registers = { list: [] }; - this.hashes = []; - this.compileStack = []; - this.inlineStack = []; - this.blockParams = []; - - this.compileChildren(environment, options); - - this.useDepths = this.useDepths || environment.useDepths || this.options.compat; - this.useBlockParams = this.useBlockParams || environment.useBlockParams; - - var opcodes = environment.opcodes, - opcode = undefined, - firstLoc = undefined, - i = undefined, - l = undefined; - - for (i = 0, l = opcodes.length; i < l; i++) { - opcode = opcodes[i]; - - this.source.currentLocation = opcode.loc; - firstLoc = firstLoc || opcode.loc; - this[opcode.opcode].apply(this, opcode.args); - } - - // Flush any trailing content that might be pending. - this.source.currentLocation = firstLoc; - this.pushSource(''); - - /* istanbul ignore next */ - if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { - throw new _Exception('Compile completed with content left on stack'); - } - - var fn = this.createFunctionContext(asObject); - if (!this.isChild) { - var ret = { - compiler: this.compilerInfo(), - main: fn - }; - var programs = this.context.programs; - for (i = 0, l = programs.length; i < l; i++) { - if (programs[i]) { - ret[i] = programs[i]; - } - } - - if (this.environment.usePartial) { - ret.usePartial = true; - } - if (this.options.data) { - ret.useData = true; - } - if (this.useDepths) { - ret.useDepths = true; - } - if (this.useBlockParams) { - ret.useBlockParams = true; - } - if (this.options.compat) { - ret.compat = true; - } - - if (!asObject) { - ret.compiler = JSON.stringify(ret.compiler); - - this.source.currentLocation = { start: { line: 1, column: 0 } }; - ret = this.objectLiteral(ret); - - if (options.srcName) { - ret = ret.toStringWithSourceMap({ file: options.destName }); - ret.map = ret.map && ret.map.toString(); - } else { - ret = ret.toString(); - } - } else { - ret.compilerOptions = this.options; - } - - return ret; - } else { - return fn; - } - }, - - preamble: function preamble() { - // track the last context pushed into place to allow skipping the - // getContext opcode when it would be a noop - this.lastContext = 0; - this.source = new _CodeGen(this.options.srcName); - }, - - createFunctionContext: function createFunctionContext(asObject) { - var varDeclarations = ''; - - var locals = this.stackVars.concat(this.registers.list); - if (locals.length > 0) { - varDeclarations += ', ' + locals.join(', '); - } - - // Generate minimizer alias mappings - // - // When using true SourceNodes, this will update all references to the given alias - // as the source nodes are reused in situ. For the non-source node compilation mode, - // aliases will not be used, but this case is already being run on the client and - // we aren't concern about minimizing the template size. - var aliasCount = 0; - for (var alias in this.aliases) { - // eslint-disable-line guard-for-in - var node = this.aliases[alias]; - - if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) { - varDeclarations += ', alias' + ++aliasCount + '=' + alias; - node.children[0] = 'alias' + aliasCount; - } - } - - var params = ['depth0', 'helpers', 'partials', 'data']; - - if (this.useBlockParams || this.useDepths) { - params.push('blockParams'); - } - if (this.useDepths) { - params.push('depths'); - } - - // Perform a second pass over the output to merge content when possible - var source = this.mergeSource(varDeclarations); - - if (asObject) { - params.push(source); - - return Function.apply(this, params); - } else { - return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); - } - }, - mergeSource: function mergeSource(varDeclarations) { - var isSimple = this.environment.isSimple, - appendOnly = !this.forceBuffer, - appendFirst = undefined, - sourceSeen = undefined, - bufferStart = undefined, - bufferEnd = undefined; - this.source.each(function (line) { - if (line.appendToBuffer) { - if (bufferStart) { - line.prepend(' + '); - } else { - bufferStart = line; - } - bufferEnd = line; - } else { - if (bufferStart) { - if (!sourceSeen) { - appendFirst = true; - } else { - bufferStart.prepend('buffer += '); - } - bufferEnd.add(';'); - bufferStart = bufferEnd = undefined; - } - - sourceSeen = true; - if (!isSimple) { - appendOnly = false; - } - } - }); - - if (appendOnly) { - if (bufferStart) { - bufferStart.prepend('return '); - bufferEnd.add(';'); - } else if (!sourceSeen) { - this.source.push('return "";'); - } - } else { - varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); - - if (bufferStart) { - bufferStart.prepend('return buffer + '); - bufferEnd.add(';'); - } else { - this.source.push('return buffer;'); - } - } - - if (varDeclarations) { - this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); - } - - return this.source.merge(); - }, - - // [blockValue] - // - // On stack, before: hash, inverse, program, value - // On stack, after: return value of blockHelperMissing - // - // The purpose of this opcode is to take a block of the form - // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and - // replace it on the stack with the result of properly - // invoking blockHelperMissing. - blockValue: function blockValue(name) { - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs(name, 0, params); - - var blockName = this.popStack(); - params.splice(1, 0, blockName); - - this.push(this.source.functionCall(blockHelperMissing, 'call', params)); - }, - - // [ambiguousBlockValue] - // - // On stack, before: hash, inverse, program, value - // Compiler value, before: lastHelper=value of last found helper, if any - // On stack, after, if no lastHelper: same as [blockValue] - // On stack, after, if lastHelper: value - ambiguousBlockValue: function ambiguousBlockValue() { - // We're being a bit cheeky and reusing the options value from the prior exec - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs('', 0, params, true); - - this.flushInline(); - - var current = this.topStack(); - params.splice(1, 0, current); - - this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']); - }, - - // [appendContent] - // - // On stack, before: ... - // On stack, after: ... - // - // Appends the string value of `content` to the current buffer - appendContent: function appendContent(content) { - if (this.pendingContent) { - content = this.pendingContent + content; - } else { - this.pendingLocation = this.source.currentLocation; - } - - this.pendingContent = content; - }, - - // [append] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Coerces `value` to a String and appends it to the current buffer. - // - // If `value` is truthy, or 0, it is coerced into a string and appended - // Otherwise, the empty string is appended - append: function append() { - if (this.isInline()) { - this.replaceStack(function (current) { - return [' != null ? ', current, ' : ""']; - }); - - this.pushSource(this.appendToBuffer(this.popStack())); - } else { - var local = this.popStack(); - this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); - if (this.environment.isSimple) { - this.pushSource(['else { ', this.appendToBuffer('\'\'', undefined, true), ' }']); - } - } - }, - - // [appendEscaped] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Escape `value` and append it to the buffer - appendEscaped: function appendEscaped() { - this.pushSource(this.appendToBuffer([this.aliasable('this.escapeExpression'), '(', this.popStack(), ')'])); - }, - - // [getContext] - // - // On stack, before: ... - // On stack, after: ... - // Compiler value, after: lastContext=depth - // - // Set the value of the `lastContext` compiler value to the depth - getContext: function getContext(depth) { - this.lastContext = depth; - }, - - // [pushContext] - // - // On stack, before: ... - // On stack, after: currentContext, ... - // - // Pushes the value of the current context onto the stack. - pushContext: function pushContext() { - this.pushStackLiteral(this.contextName(this.lastContext)); - }, - - // [lookupOnContext] - // - // On stack, before: ... - // On stack, after: currentContext[name], ... - // - // Looks up the value of `name` on the current context and pushes - // it onto the stack. - lookupOnContext: function lookupOnContext(parts, falsy, scoped) { - var i = 0; - - if (!scoped && this.options.compat && !this.lastContext) { - // The depthed query is expected to handle the undefined logic for the root level that - // is implemented below, so we evaluate that directly in compat mode - this.push(this.depthedLookup(parts[i++])); - } else { - this.pushContext(); - } - - this.resolvePath('context', parts, i, falsy); - }, - - // [lookupBlockParam] - // - // On stack, before: ... - // On stack, after: blockParam[name], ... - // - // Looks up the value of `parts` on the given block param and pushes - // it onto the stack. - lookupBlockParam: function lookupBlockParam(blockParamId, parts) { - this.useBlockParams = true; - - this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); - this.resolvePath('context', parts, 1); - }, - - // [lookupData] - // - // On stack, before: ... - // On stack, after: data, ... - // - // Push the data lookup operator - lookupData: function lookupData(depth, parts) { - if (!depth) { - this.pushStackLiteral('data'); - } else { - this.pushStackLiteral('this.data(data, ' + depth + ')'); - } - - this.resolvePath('data', parts, 0, true); - }, - - resolvePath: function resolvePath(type, parts, i, falsy) { - var _this = this; - - if (this.options.strict || this.options.assumeObjects) { - this.push(strictLookup(this.options.strict, this, parts, type)); - return; - } - - var len = parts.length; - for (; i < len; i++) { - /*eslint-disable no-loop-func */ - this.replaceStack(function (current) { - var lookup = _this.nameLookup(current, parts[i], type); - // We want to ensure that zero and false are handled properly if the context (falsy flag) - // needs to have the special handling for these values. - if (!falsy) { - return [' != null ? ', lookup, ' : ', current]; - } else { - // Otherwise we can use generic falsy handling - return [' && ', lookup]; - } - }); - /*eslint-enable no-loop-func */ - } - }, - - // [resolvePossibleLambda] - // - // On stack, before: value, ... - // On stack, after: resolved value, ... - // - // If the `value` is a lambda, replace it on the stack by - // the return value of the lambda - resolvePossibleLambda: function resolvePossibleLambda() { - this.push([this.aliasable('this.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); - }, - - // [pushStringParam] - // - // On stack, before: ... - // On stack, after: string, currentContext, ... - // - // This opcode is designed for use in string mode, which - // provides the string value of a parameter along with its - // depth rather than resolving it immediately. - pushStringParam: function pushStringParam(string, type) { - this.pushContext(); - this.pushString(type); - - // If it's a subexpression, the string result - // will be pushed after this opcode. - if (type !== 'SubExpression') { - if (typeof string === 'string') { - this.pushString(string); - } else { - this.pushStackLiteral(string); - } - } - }, - - emptyHash: function emptyHash(omitEmpty) { - if (this.trackIds) { - this.push('{}'); // hashIds - } - if (this.stringParams) { - this.push('{}'); // hashContexts - this.push('{}'); // hashTypes - } - this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); - }, - pushHash: function pushHash() { - if (this.hash) { - this.hashes.push(this.hash); - } - this.hash = { values: [], types: [], contexts: [], ids: [] }; - }, - popHash: function popHash() { - var hash = this.hash; - this.hash = this.hashes.pop(); - - if (this.trackIds) { - this.push(this.objectLiteral(hash.ids)); - } - if (this.stringParams) { - this.push(this.objectLiteral(hash.contexts)); - this.push(this.objectLiteral(hash.types)); - } - - this.push(this.objectLiteral(hash.values)); - }, - - // [pushString] - // - // On stack, before: ... - // On stack, after: quotedString(string), ... - // - // Push a quoted version of `string` onto the stack - pushString: function pushString(string) { - this.pushStackLiteral(this.quotedString(string)); - }, - - // [pushLiteral] - // - // On stack, before: ... - // On stack, after: value, ... - // - // Pushes a value onto the stack. This operation prevents - // the compiler from creating a temporary variable to hold - // it. - pushLiteral: function pushLiteral(value) { - this.pushStackLiteral(value); - }, - - // [pushProgram] - // - // On stack, before: ... - // On stack, after: program(guid), ... - // - // Push a program expression onto the stack. This takes - // a compile-time guid and converts it into a runtime-accessible - // expression. - pushProgram: function pushProgram(guid) { - if (guid != null) { - this.pushStackLiteral(this.programExpression(guid)); - } else { - this.pushStackLiteral(null); - } - }, - - // [invokeHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // Pops off the helper's parameters, invokes the helper, - // and pushes the helper's return value onto the stack. - // - // If the helper is not found, `helperMissing` is called. - invokeHelper: function invokeHelper(paramSize, name, isSimple) { - var nonHelper = this.popStack(), - helper = this.setupHelper(paramSize, name), - simple = isSimple ? [helper.name, ' || '] : ''; - - var lookup = ['('].concat(simple, nonHelper); - if (!this.options.strict) { - lookup.push(' || ', this.aliasable('helpers.helperMissing')); - } - lookup.push(')'); - - this.push(this.source.functionCall(lookup, 'call', helper.callParams)); - }, - - // [invokeKnownHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // This operation is used when the helper is known to exist, - // so a `helperMissing` fallback is not required. - invokeKnownHelper: function invokeKnownHelper(paramSize, name) { - var helper = this.setupHelper(paramSize, name); - this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); - }, - - // [invokeAmbiguous] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of disambiguation - // - // This operation is used when an expression like `{{foo}}` - // is provided, but we don't know at compile-time whether it - // is a helper or a path. - // - // This operation emits more code than the other options, - // and can be avoided by passing the `knownHelpers` and - // `knownHelpersOnly` flags at compile-time. - invokeAmbiguous: function invokeAmbiguous(name, helperCall) { - this.useRegister('helper'); - - var nonHelper = this.popStack(); - - this.emptyHash(); - var helper = this.setupHelper(0, name, helperCall); - - var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); - - var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; - if (!this.options.strict) { - lookup[0] = '(helper = '; - lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing')); - } - - this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']); - }, - - // [invokePartial] - // - // On stack, before: context, ... - // On stack after: result of partial invocation - // - // This operation pops off a context, invokes a partial with that context, - // and pushes the result of the invocation back. - invokePartial: function invokePartial(isDynamic, name, indent) { - var params = [], - options = this.setupParams(name, 1, params, false); - - if (isDynamic) { - name = this.popStack(); - delete options.name; - } - - if (indent) { - options.indent = JSON.stringify(indent); - } - options.helpers = 'helpers'; - options.partials = 'partials'; - - if (!isDynamic) { - params.unshift(this.nameLookup('partials', name, 'partial')); - } else { - params.unshift(name); - } - - if (this.options.compat) { - options.depths = 'depths'; - } - options = this.objectLiteral(options); - params.push(options); - - this.push(this.source.functionCall('this.invokePartial', '', params)); - }, - - // [assignToHash] - // - // On stack, before: value, ..., hash, ... - // On stack, after: ..., hash, ... - // - // Pops a value off the stack and assigns it to the current hash - assignToHash: function assignToHash(key) { - var value = this.popStack(), - context = undefined, - type = undefined, - id = undefined; - - if (this.trackIds) { - id = this.popStack(); - } - if (this.stringParams) { - type = this.popStack(); - context = this.popStack(); - } - - var hash = this.hash; - if (context) { - hash.contexts[key] = context; - } - if (type) { - hash.types[key] = type; - } - if (id) { - hash.ids[key] = id; - } - hash.values[key] = value; - }, - - pushId: function pushId(type, name, child) { - if (type === 'BlockParam') { - this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : '')); - } else if (type === 'PathExpression') { - this.pushString(name); - } else if (type === 'SubExpression') { - this.pushStackLiteral('true'); - } else { - this.pushStackLiteral('null'); - } - }, - - // HELPERS - - compiler: JavaScriptCompiler, - - compileChildren: function compileChildren(environment, options) { - var children = environment.children, - child = undefined, - compiler = undefined; - - for (var i = 0, l = children.length; i < l; i++) { - child = children[i]; - compiler = new this.compiler(); // eslint-disable-line new-cap - - var index = this.matchExistingProgram(child); - - if (index == null) { - this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children - index = this.context.programs.length; - child.index = index; - child.name = 'program' + index; - this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); - this.context.environments[index] = child; - - this.useDepths = this.useDepths || compiler.useDepths; - this.useBlockParams = this.useBlockParams || compiler.useBlockParams; - } else { - child.index = index; - child.name = 'program' + index; - - this.useDepths = this.useDepths || child.useDepths; - this.useBlockParams = this.useBlockParams || child.useBlockParams; - } - } - }, - matchExistingProgram: function matchExistingProgram(child) { - for (var i = 0, len = this.context.environments.length; i < len; i++) { - var environment = this.context.environments[i]; - if (environment && environment.equals(child)) { - return i; - } - } - }, - - programExpression: function programExpression(guid) { - var child = this.environment.children[guid], - programParams = [child.index, 'data', child.blockParams]; - - if (this.useBlockParams || this.useDepths) { - programParams.push('blockParams'); - } - if (this.useDepths) { - programParams.push('depths'); - } - - return 'this.program(' + programParams.join(', ') + ')'; - }, - - useRegister: function useRegister(name) { - if (!this.registers[name]) { - this.registers[name] = true; - this.registers.list.push(name); - } - }, - - push: function push(expr) { - if (!(expr instanceof Literal)) { - expr = this.source.wrap(expr); - } - - this.inlineStack.push(expr); - return expr; - }, - - pushStackLiteral: function pushStackLiteral(item) { - this.push(new Literal(item)); - }, - - pushSource: function pushSource(source) { - if (this.pendingContent) { - this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); - this.pendingContent = undefined; - } - - if (source) { - this.source.push(source); - } - }, - - replaceStack: function replaceStack(callback) { - var prefix = ['('], - stack = undefined, - createdStack = undefined, - usedLiteral = undefined; - - /* istanbul ignore next */ - if (!this.isInline()) { - throw new _Exception('replaceStack on non-inline'); - } - - // We want to merge the inline statement into the replacement statement via ',' - var top = this.popStack(true); - - if (top instanceof Literal) { - // Literals do not need to be inlined - stack = [top.value]; - prefix = ['(', stack]; - usedLiteral = true; - } else { - // Get or create the current stack name for use by the inline - createdStack = true; - var _name = this.incrStack(); - - prefix = ['((', this.push(_name), ' = ', top, ')']; - stack = this.topStack(); - } - - var item = callback.call(this, stack); - - if (!usedLiteral) { - this.popStack(); - } - if (createdStack) { - this.stackSlot--; - } - this.push(prefix.concat(item, ')')); - }, - - incrStack: function incrStack() { - this.stackSlot++; - if (this.stackSlot > this.stackVars.length) { - this.stackVars.push('stack' + this.stackSlot); - } - return this.topStackName(); - }, - topStackName: function topStackName() { - return 'stack' + this.stackSlot; - }, - flushInline: function flushInline() { - var inlineStack = this.inlineStack; - this.inlineStack = []; - for (var i = 0, len = inlineStack.length; i < len; i++) { - var entry = inlineStack[i]; - /* istanbul ignore if */ - if (entry instanceof Literal) { - this.compileStack.push(entry); - } else { - var stack = this.incrStack(); - this.pushSource([stack, ' = ', entry, ';']); - this.compileStack.push(stack); - } - } - }, - isInline: function isInline() { - return this.inlineStack.length; - }, - - popStack: function popStack(wrapped) { - var inline = this.isInline(), - item = (inline ? this.inlineStack : this.compileStack).pop(); - - if (!wrapped && item instanceof Literal) { - return item.value; - } else { - if (!inline) { - /* istanbul ignore next */ - if (!this.stackSlot) { - throw new _Exception('Invalid stack pop'); - } - this.stackSlot--; - } - return item; - } - }, - - topStack: function topStack() { - var stack = this.isInline() ? this.inlineStack : this.compileStack, - item = stack[stack.length - 1]; - - /* istanbul ignore if */ - if (item instanceof Literal) { - return item.value; - } else { - return item; - } - }, - - contextName: function contextName(context) { - if (this.useDepths && context) { - return 'depths[' + context + ']'; - } else { - return 'depth' + context; - } - }, - - quotedString: function quotedString(str) { - return this.source.quotedString(str); - }, - - objectLiteral: function objectLiteral(obj) { - return this.source.objectLiteral(obj); - }, - - aliasable: function aliasable(name) { - var ret = this.aliases[name]; - if (ret) { - ret.referenceCount++; - return ret; - } - - ret = this.aliases[name] = this.source.wrap(name); - ret.aliasable = true; - ret.referenceCount = 1; - - return ret; - }, - - setupHelper: function setupHelper(paramSize, name, blockHelper) { - var params = [], - paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); - var foundHelper = this.nameLookup('helpers', name, 'helper'); - - return { - params: params, - paramsInit: paramsInit, - name: foundHelper, - callParams: [this.contextName(0)].concat(params) - }; - }, - - setupParams: function setupParams(helper, paramSize, params) { - var options = {}, - contexts = [], - types = [], - ids = [], - param = undefined; - - options.name = this.quotedString(helper); - options.hash = this.popStack(); - - if (this.trackIds) { - options.hashIds = this.popStack(); - } - if (this.stringParams) { - options.hashTypes = this.popStack(); - options.hashContexts = this.popStack(); - } - - var inverse = this.popStack(), - program = this.popStack(); - - // Avoid setting fn and inverse if neither are set. This allows - // helpers to do a check for `if (options.fn)` - if (program || inverse) { - options.fn = program || 'this.noop'; - options.inverse = inverse || 'this.noop'; - } - - // The parameters go on to the stack in order (making sure that they are evaluated in order) - // so we need to pop them off the stack in reverse order - var i = paramSize; - while (i--) { - param = this.popStack(); - params[i] = param; - - if (this.trackIds) { - ids[i] = this.popStack(); - } - if (this.stringParams) { - types[i] = this.popStack(); - contexts[i] = this.popStack(); - } - } - - if (this.trackIds) { - options.ids = this.source.generateArray(ids); - } - if (this.stringParams) { - options.types = this.source.generateArray(types); - options.contexts = this.source.generateArray(contexts); - } - - if (this.options.data) { - options.data = 'data'; - } - if (this.useBlockParams) { - options.blockParams = 'blockParams'; - } - return options; - }, - - setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) { - var options = this.setupParams(helper, paramSize, params, true); - options = this.objectLiteral(options); - if (useRegister) { - this.useRegister('options'); - params.push('options'); - return ['options=', options]; - } else { - params.push(options); - return ''; - } - } - }; - - (function () { - var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' '); - - var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; - - for (var i = 0, l = reservedWords.length; i < l; i++) { - compilerWords[reservedWords[i]] = true; - } - })(); - - JavaScriptCompiler.isValidJavaScriptVariableName = function (name) { - return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name); - }; - - function strictLookup(requireTerminal, compiler, parts, type) { - var stack = compiler.popStack(), - i = 0, - len = parts.length; - if (requireTerminal) { - len--; - } - - for (; i < len; i++) { - stack = compiler.nameLookup(stack, parts[i], type); - } - - if (requireTerminal) { - return [compiler.aliasable('this.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')']; - } else { - return stack; - } - } - - module.exports = JavaScriptCompiler; -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/parser.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/parser.js deleted file mode 100644 index 889545d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/parser.js +++ /dev/null @@ -1,678 +0,0 @@ -define(["exports", "module"], function (exports, module) { - /* istanbul ignore next */ - /* Jison generated parser */ - "use strict"; - - var handlebars = (function () { - var parser = { trace: function trace() {}, - yy: {}, - symbols_: { error: 2, root: 3, program: 4, EOF: 5, program_repetition0: 6, statement: 7, mustache: 8, block: 9, rawBlock: 10, partial: 11, content: 12, COMMENT: 13, CONTENT: 14, openRawBlock: 15, END_RAW_BLOCK: 16, OPEN_RAW_BLOCK: 17, helperName: 18, openRawBlock_repetition0: 19, openRawBlock_option0: 20, CLOSE_RAW_BLOCK: 21, openBlock: 22, block_option0: 23, closeBlock: 24, openInverse: 25, block_option1: 26, OPEN_BLOCK: 27, openBlock_repetition0: 28, openBlock_option0: 29, openBlock_option1: 30, CLOSE: 31, OPEN_INVERSE: 32, openInverse_repetition0: 33, openInverse_option0: 34, openInverse_option1: 35, openInverseChain: 36, OPEN_INVERSE_CHAIN: 37, openInverseChain_repetition0: 38, openInverseChain_option0: 39, openInverseChain_option1: 40, inverseAndProgram: 41, INVERSE: 42, inverseChain: 43, inverseChain_option0: 44, OPEN_ENDBLOCK: 45, OPEN: 46, mustache_repetition0: 47, mustache_option0: 48, OPEN_UNESCAPED: 49, mustache_repetition1: 50, mustache_option1: 51, CLOSE_UNESCAPED: 52, OPEN_PARTIAL: 53, partialName: 54, partial_repetition0: 55, partial_option0: 56, param: 57, sexpr: 58, OPEN_SEXPR: 59, sexpr_repetition0: 60, sexpr_option0: 61, CLOSE_SEXPR: 62, hash: 63, hash_repetition_plus0: 64, hashSegment: 65, ID: 66, EQUALS: 67, blockParams: 68, OPEN_BLOCK_PARAMS: 69, blockParams_repetition_plus0: 70, CLOSE_BLOCK_PARAMS: 71, path: 72, dataName: 73, STRING: 74, NUMBER: 75, BOOLEAN: 76, UNDEFINED: 77, NULL: 78, DATA: 79, pathSegments: 80, SEP: 81, $accept: 0, $end: 1 }, - terminals_: { 2: "error", 5: "EOF", 13: "COMMENT", 14: "CONTENT", 16: "END_RAW_BLOCK", 17: "OPEN_RAW_BLOCK", 21: "CLOSE_RAW_BLOCK", 27: "OPEN_BLOCK", 31: "CLOSE", 32: "OPEN_INVERSE", 37: "OPEN_INVERSE_CHAIN", 42: "INVERSE", 45: "OPEN_ENDBLOCK", 46: "OPEN", 49: "OPEN_UNESCAPED", 52: "CLOSE_UNESCAPED", 53: "OPEN_PARTIAL", 59: "OPEN_SEXPR", 62: "CLOSE_SEXPR", 66: "ID", 67: "EQUALS", 69: "OPEN_BLOCK_PARAMS", 71: "CLOSE_BLOCK_PARAMS", 74: "STRING", 75: "NUMBER", 76: "BOOLEAN", 77: "UNDEFINED", 78: "NULL", 79: "DATA", 81: "SEP" }, - productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [12, 1], [10, 3], [15, 5], [9, 4], [9, 4], [22, 6], [25, 6], [36, 6], [41, 2], [43, 3], [43, 1], [24, 3], [8, 5], [8, 5], [11, 5], [57, 1], [57, 1], [58, 5], [63, 1], [65, 3], [68, 3], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [54, 1], [54, 1], [73, 2], [72, 1], [80, 3], [80, 1], [6, 0], [6, 2], [19, 0], [19, 2], [20, 0], [20, 1], [23, 0], [23, 1], [26, 0], [26, 1], [28, 0], [28, 2], [29, 0], [29, 1], [30, 0], [30, 1], [33, 0], [33, 2], [34, 0], [34, 1], [35, 0], [35, 1], [38, 0], [38, 2], [39, 0], [39, 1], [40, 0], [40, 1], [44, 0], [44, 1], [47, 0], [47, 2], [48, 0], [48, 1], [50, 0], [50, 2], [51, 0], [51, 1], [55, 0], [55, 2], [56, 0], [56, 1], [60, 0], [60, 2], [61, 0], [61, 1], [64, 1], [64, 2], [70, 1], [70, 2]], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { - - var $0 = $$.length - 1; - switch (yystate) { - case 1: - return $$[$0 - 1]; - break; - case 2: - this.$ = new yy.Program($$[$0], null, {}, yy.locInfo(this._$)); - break; - case 3: - this.$ = $$[$0]; - break; - case 4: - this.$ = $$[$0]; - break; - case 5: - this.$ = $$[$0]; - break; - case 6: - this.$ = $$[$0]; - break; - case 7: - this.$ = $$[$0]; - break; - case 8: - this.$ = new yy.CommentStatement(yy.stripComment($$[$0]), yy.stripFlags($$[$0], $$[$0]), yy.locInfo(this._$)); - break; - case 9: - this.$ = new yy.ContentStatement($$[$0], yy.locInfo(this._$)); - break; - case 10: - this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); - break; - case 11: - this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] }; - break; - case 12: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$); - break; - case 13: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$); - break; - case 14: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 15: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 16: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 17: - this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] }; - break; - case 18: - var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$), - program = new yy.Program([inverse], null, {}, yy.locInfo(this._$)); - program.chained = true; - - this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true }; - - break; - case 19: - this.$ = $$[$0]; - break; - case 20: - this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) }; - break; - case 21: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 22: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 23: - this.$ = new yy.PartialStatement($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.stripFlags($$[$0 - 4], $$[$0]), yy.locInfo(this._$)); - break; - case 24: - this.$ = $$[$0]; - break; - case 25: - this.$ = $$[$0]; - break; - case 26: - this.$ = new yy.SubExpression($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.locInfo(this._$)); - break; - case 27: - this.$ = new yy.Hash($$[$0], yy.locInfo(this._$)); - break; - case 28: - this.$ = new yy.HashPair(yy.id($$[$0 - 2]), $$[$0], yy.locInfo(this._$)); - break; - case 29: - this.$ = yy.id($$[$0 - 1]); - break; - case 30: - this.$ = $$[$0]; - break; - case 31: - this.$ = $$[$0]; - break; - case 32: - this.$ = new yy.StringLiteral($$[$0], yy.locInfo(this._$)); - break; - case 33: - this.$ = new yy.NumberLiteral($$[$0], yy.locInfo(this._$)); - break; - case 34: - this.$ = new yy.BooleanLiteral($$[$0], yy.locInfo(this._$)); - break; - case 35: - this.$ = new yy.UndefinedLiteral(yy.locInfo(this._$)); - break; - case 36: - this.$ = new yy.NullLiteral(yy.locInfo(this._$)); - break; - case 37: - this.$ = $$[$0]; - break; - case 38: - this.$ = $$[$0]; - break; - case 39: - this.$ = yy.preparePath(true, $$[$0], this._$); - break; - case 40: - this.$ = yy.preparePath(false, $$[$0], this._$); - break; - case 41: - $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2]; - break; - case 42: - this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }]; - break; - case 43: - this.$ = []; - break; - case 44: - $$[$0 - 1].push($$[$0]); - break; - case 45: - this.$ = []; - break; - case 46: - $$[$0 - 1].push($$[$0]); - break; - case 53: - this.$ = []; - break; - case 54: - $$[$0 - 1].push($$[$0]); - break; - case 59: - this.$ = []; - break; - case 60: - $$[$0 - 1].push($$[$0]); - break; - case 65: - this.$ = []; - break; - case 66: - $$[$0 - 1].push($$[$0]); - break; - case 73: - this.$ = []; - break; - case 74: - $$[$0 - 1].push($$[$0]); - break; - case 77: - this.$ = []; - break; - case 78: - $$[$0 - 1].push($$[$0]); - break; - case 81: - this.$ = []; - break; - case 82: - $$[$0 - 1].push($$[$0]); - break; - case 85: - this.$ = []; - break; - case 86: - $$[$0 - 1].push($$[$0]); - break; - case 89: - this.$ = [$$[$0]]; - break; - case 90: - $$[$0 - 1].push($$[$0]); - break; - case 91: - this.$ = [$$[$0]]; - break; - case 92: - $$[$0 - 1].push($$[$0]); - break; - } - }, - table: [{ 3: 1, 4: 2, 5: [2, 43], 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: [1, 11], 14: [1, 18], 15: 16, 17: [1, 21], 22: 14, 25: 15, 27: [1, 19], 32: [1, 20], 37: [2, 2], 42: [2, 2], 45: [2, 2], 46: [1, 12], 49: [1, 13], 53: [1, 17] }, { 1: [2, 1] }, { 5: [2, 44], 13: [2, 44], 14: [2, 44], 17: [2, 44], 27: [2, 44], 32: [2, 44], 37: [2, 44], 42: [2, 44], 45: [2, 44], 46: [2, 44], 49: [2, 44], 53: [2, 44] }, { 5: [2, 3], 13: [2, 3], 14: [2, 3], 17: [2, 3], 27: [2, 3], 32: [2, 3], 37: [2, 3], 42: [2, 3], 45: [2, 3], 46: [2, 3], 49: [2, 3], 53: [2, 3] }, { 5: [2, 4], 13: [2, 4], 14: [2, 4], 17: [2, 4], 27: [2, 4], 32: [2, 4], 37: [2, 4], 42: [2, 4], 45: [2, 4], 46: [2, 4], 49: [2, 4], 53: [2, 4] }, { 5: [2, 5], 13: [2, 5], 14: [2, 5], 17: [2, 5], 27: [2, 5], 32: [2, 5], 37: [2, 5], 42: [2, 5], 45: [2, 5], 46: [2, 5], 49: [2, 5], 53: [2, 5] }, { 5: [2, 6], 13: [2, 6], 14: [2, 6], 17: [2, 6], 27: [2, 6], 32: [2, 6], 37: [2, 6], 42: [2, 6], 45: [2, 6], 46: [2, 6], 49: [2, 6], 53: [2, 6] }, { 5: [2, 7], 13: [2, 7], 14: [2, 7], 17: [2, 7], 27: [2, 7], 32: [2, 7], 37: [2, 7], 42: [2, 7], 45: [2, 7], 46: [2, 7], 49: [2, 7], 53: [2, 7] }, { 5: [2, 8], 13: [2, 8], 14: [2, 8], 17: [2, 8], 27: [2, 8], 32: [2, 8], 37: [2, 8], 42: [2, 8], 45: [2, 8], 46: [2, 8], 49: [2, 8], 53: [2, 8] }, { 18: 22, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 33, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 34, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 4: 35, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 12: 36, 14: [1, 18] }, { 18: 38, 54: 37, 58: 39, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 9], 13: [2, 9], 14: [2, 9], 16: [2, 9], 17: [2, 9], 27: [2, 9], 32: [2, 9], 37: [2, 9], 42: [2, 9], 45: [2, 9], 46: [2, 9], 49: [2, 9], 53: [2, 9] }, { 18: 41, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 42, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 43, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [2, 73], 47: 44, 59: [2, 73], 66: [2, 73], 74: [2, 73], 75: [2, 73], 76: [2, 73], 77: [2, 73], 78: [2, 73], 79: [2, 73] }, { 21: [2, 30], 31: [2, 30], 52: [2, 30], 59: [2, 30], 62: [2, 30], 66: [2, 30], 69: [2, 30], 74: [2, 30], 75: [2, 30], 76: [2, 30], 77: [2, 30], 78: [2, 30], 79: [2, 30] }, { 21: [2, 31], 31: [2, 31], 52: [2, 31], 59: [2, 31], 62: [2, 31], 66: [2, 31], 69: [2, 31], 74: [2, 31], 75: [2, 31], 76: [2, 31], 77: [2, 31], 78: [2, 31], 79: [2, 31] }, { 21: [2, 32], 31: [2, 32], 52: [2, 32], 59: [2, 32], 62: [2, 32], 66: [2, 32], 69: [2, 32], 74: [2, 32], 75: [2, 32], 76: [2, 32], 77: [2, 32], 78: [2, 32], 79: [2, 32] }, { 21: [2, 33], 31: [2, 33], 52: [2, 33], 59: [2, 33], 62: [2, 33], 66: [2, 33], 69: [2, 33], 74: [2, 33], 75: [2, 33], 76: [2, 33], 77: [2, 33], 78: [2, 33], 79: [2, 33] }, { 21: [2, 34], 31: [2, 34], 52: [2, 34], 59: [2, 34], 62: [2, 34], 66: [2, 34], 69: [2, 34], 74: [2, 34], 75: [2, 34], 76: [2, 34], 77: [2, 34], 78: [2, 34], 79: [2, 34] }, { 21: [2, 35], 31: [2, 35], 52: [2, 35], 59: [2, 35], 62: [2, 35], 66: [2, 35], 69: [2, 35], 74: [2, 35], 75: [2, 35], 76: [2, 35], 77: [2, 35], 78: [2, 35], 79: [2, 35] }, { 21: [2, 36], 31: [2, 36], 52: [2, 36], 59: [2, 36], 62: [2, 36], 66: [2, 36], 69: [2, 36], 74: [2, 36], 75: [2, 36], 76: [2, 36], 77: [2, 36], 78: [2, 36], 79: [2, 36] }, { 21: [2, 40], 31: [2, 40], 52: [2, 40], 59: [2, 40], 62: [2, 40], 66: [2, 40], 69: [2, 40], 74: [2, 40], 75: [2, 40], 76: [2, 40], 77: [2, 40], 78: [2, 40], 79: [2, 40], 81: [1, 45] }, { 66: [1, 32], 80: 46 }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 50: 47, 52: [2, 77], 59: [2, 77], 66: [2, 77], 74: [2, 77], 75: [2, 77], 76: [2, 77], 77: [2, 77], 78: [2, 77], 79: [2, 77] }, { 23: 48, 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 49, 45: [2, 49] }, { 26: 54, 41: 55, 42: [1, 53], 45: [2, 51] }, { 16: [1, 56] }, { 31: [2, 81], 55: 57, 59: [2, 81], 66: [2, 81], 74: [2, 81], 75: [2, 81], 76: [2, 81], 77: [2, 81], 78: [2, 81], 79: [2, 81] }, { 31: [2, 37], 59: [2, 37], 66: [2, 37], 74: [2, 37], 75: [2, 37], 76: [2, 37], 77: [2, 37], 78: [2, 37], 79: [2, 37] }, { 31: [2, 38], 59: [2, 38], 66: [2, 38], 74: [2, 38], 75: [2, 38], 76: [2, 38], 77: [2, 38], 78: [2, 38], 79: [2, 38] }, { 18: 58, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 28: 59, 31: [2, 53], 59: [2, 53], 66: [2, 53], 69: [2, 53], 74: [2, 53], 75: [2, 53], 76: [2, 53], 77: [2, 53], 78: [2, 53], 79: [2, 53] }, { 31: [2, 59], 33: 60, 59: [2, 59], 66: [2, 59], 69: [2, 59], 74: [2, 59], 75: [2, 59], 76: [2, 59], 77: [2, 59], 78: [2, 59], 79: [2, 59] }, { 19: 61, 21: [2, 45], 59: [2, 45], 66: [2, 45], 74: [2, 45], 75: [2, 45], 76: [2, 45], 77: [2, 45], 78: [2, 45], 79: [2, 45] }, { 18: 65, 31: [2, 75], 48: 62, 57: 63, 58: 66, 59: [1, 40], 63: 64, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 66: [1, 70] }, { 21: [2, 39], 31: [2, 39], 52: [2, 39], 59: [2, 39], 62: [2, 39], 66: [2, 39], 69: [2, 39], 74: [2, 39], 75: [2, 39], 76: [2, 39], 77: [2, 39], 78: [2, 39], 79: [2, 39], 81: [1, 45] }, { 18: 65, 51: 71, 52: [2, 79], 57: 72, 58: 66, 59: [1, 40], 63: 73, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 24: 74, 45: [1, 75] }, { 45: [2, 50] }, { 4: 76, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 45: [2, 19] }, { 18: 77, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 78, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 24: 79, 45: [1, 75] }, { 45: [2, 52] }, { 5: [2, 10], 13: [2, 10], 14: [2, 10], 17: [2, 10], 27: [2, 10], 32: [2, 10], 37: [2, 10], 42: [2, 10], 45: [2, 10], 46: [2, 10], 49: [2, 10], 53: [2, 10] }, { 18: 65, 31: [2, 83], 56: 80, 57: 81, 58: 66, 59: [1, 40], 63: 82, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 59: [2, 85], 60: 83, 62: [2, 85], 66: [2, 85], 74: [2, 85], 75: [2, 85], 76: [2, 85], 77: [2, 85], 78: [2, 85], 79: [2, 85] }, { 18: 65, 29: 84, 31: [2, 55], 57: 85, 58: 66, 59: [1, 40], 63: 86, 64: 67, 65: 68, 66: [1, 69], 69: [2, 55], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 31: [2, 61], 34: 87, 57: 88, 58: 66, 59: [1, 40], 63: 89, 64: 67, 65: 68, 66: [1, 69], 69: [2, 61], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 20: 90, 21: [2, 47], 57: 91, 58: 66, 59: [1, 40], 63: 92, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [1, 93] }, { 31: [2, 74], 59: [2, 74], 66: [2, 74], 74: [2, 74], 75: [2, 74], 76: [2, 74], 77: [2, 74], 78: [2, 74], 79: [2, 74] }, { 31: [2, 76] }, { 21: [2, 24], 31: [2, 24], 52: [2, 24], 59: [2, 24], 62: [2, 24], 66: [2, 24], 69: [2, 24], 74: [2, 24], 75: [2, 24], 76: [2, 24], 77: [2, 24], 78: [2, 24], 79: [2, 24] }, { 21: [2, 25], 31: [2, 25], 52: [2, 25], 59: [2, 25], 62: [2, 25], 66: [2, 25], 69: [2, 25], 74: [2, 25], 75: [2, 25], 76: [2, 25], 77: [2, 25], 78: [2, 25], 79: [2, 25] }, { 21: [2, 27], 31: [2, 27], 52: [2, 27], 62: [2, 27], 65: 94, 66: [1, 95], 69: [2, 27] }, { 21: [2, 89], 31: [2, 89], 52: [2, 89], 62: [2, 89], 66: [2, 89], 69: [2, 89] }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 67: [1, 96], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 21: [2, 41], 31: [2, 41], 52: [2, 41], 59: [2, 41], 62: [2, 41], 66: [2, 41], 69: [2, 41], 74: [2, 41], 75: [2, 41], 76: [2, 41], 77: [2, 41], 78: [2, 41], 79: [2, 41], 81: [2, 41] }, { 52: [1, 97] }, { 52: [2, 78], 59: [2, 78], 66: [2, 78], 74: [2, 78], 75: [2, 78], 76: [2, 78], 77: [2, 78], 78: [2, 78], 79: [2, 78] }, { 52: [2, 80] }, { 5: [2, 12], 13: [2, 12], 14: [2, 12], 17: [2, 12], 27: [2, 12], 32: [2, 12], 37: [2, 12], 42: [2, 12], 45: [2, 12], 46: [2, 12], 49: [2, 12], 53: [2, 12] }, { 18: 98, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 100, 44: 99, 45: [2, 71] }, { 31: [2, 65], 38: 101, 59: [2, 65], 66: [2, 65], 69: [2, 65], 74: [2, 65], 75: [2, 65], 76: [2, 65], 77: [2, 65], 78: [2, 65], 79: [2, 65] }, { 45: [2, 17] }, { 5: [2, 13], 13: [2, 13], 14: [2, 13], 17: [2, 13], 27: [2, 13], 32: [2, 13], 37: [2, 13], 42: [2, 13], 45: [2, 13], 46: [2, 13], 49: [2, 13], 53: [2, 13] }, { 31: [1, 102] }, { 31: [2, 82], 59: [2, 82], 66: [2, 82], 74: [2, 82], 75: [2, 82], 76: [2, 82], 77: [2, 82], 78: [2, 82], 79: [2, 82] }, { 31: [2, 84] }, { 18: 65, 57: 104, 58: 66, 59: [1, 40], 61: 103, 62: [2, 87], 63: 105, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 30: 106, 31: [2, 57], 68: 107, 69: [1, 108] }, { 31: [2, 54], 59: [2, 54], 66: [2, 54], 69: [2, 54], 74: [2, 54], 75: [2, 54], 76: [2, 54], 77: [2, 54], 78: [2, 54], 79: [2, 54] }, { 31: [2, 56], 69: [2, 56] }, { 31: [2, 63], 35: 109, 68: 110, 69: [1, 108] }, { 31: [2, 60], 59: [2, 60], 66: [2, 60], 69: [2, 60], 74: [2, 60], 75: [2, 60], 76: [2, 60], 77: [2, 60], 78: [2, 60], 79: [2, 60] }, { 31: [2, 62], 69: [2, 62] }, { 21: [1, 111] }, { 21: [2, 46], 59: [2, 46], 66: [2, 46], 74: [2, 46], 75: [2, 46], 76: [2, 46], 77: [2, 46], 78: [2, 46], 79: [2, 46] }, { 21: [2, 48] }, { 5: [2, 21], 13: [2, 21], 14: [2, 21], 17: [2, 21], 27: [2, 21], 32: [2, 21], 37: [2, 21], 42: [2, 21], 45: [2, 21], 46: [2, 21], 49: [2, 21], 53: [2, 21] }, { 21: [2, 90], 31: [2, 90], 52: [2, 90], 62: [2, 90], 66: [2, 90], 69: [2, 90] }, { 67: [1, 96] }, { 18: 65, 57: 112, 58: 66, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 22], 13: [2, 22], 14: [2, 22], 17: [2, 22], 27: [2, 22], 32: [2, 22], 37: [2, 22], 42: [2, 22], 45: [2, 22], 46: [2, 22], 49: [2, 22], 53: [2, 22] }, { 31: [1, 113] }, { 45: [2, 18] }, { 45: [2, 72] }, { 18: 65, 31: [2, 67], 39: 114, 57: 115, 58: 66, 59: [1, 40], 63: 116, 64: 67, 65: 68, 66: [1, 69], 69: [2, 67], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 23], 13: [2, 23], 14: [2, 23], 17: [2, 23], 27: [2, 23], 32: [2, 23], 37: [2, 23], 42: [2, 23], 45: [2, 23], 46: [2, 23], 49: [2, 23], 53: [2, 23] }, { 62: [1, 117] }, { 59: [2, 86], 62: [2, 86], 66: [2, 86], 74: [2, 86], 75: [2, 86], 76: [2, 86], 77: [2, 86], 78: [2, 86], 79: [2, 86] }, { 62: [2, 88] }, { 31: [1, 118] }, { 31: [2, 58] }, { 66: [1, 120], 70: 119 }, { 31: [1, 121] }, { 31: [2, 64] }, { 14: [2, 11] }, { 21: [2, 28], 31: [2, 28], 52: [2, 28], 62: [2, 28], 66: [2, 28], 69: [2, 28] }, { 5: [2, 20], 13: [2, 20], 14: [2, 20], 17: [2, 20], 27: [2, 20], 32: [2, 20], 37: [2, 20], 42: [2, 20], 45: [2, 20], 46: [2, 20], 49: [2, 20], 53: [2, 20] }, { 31: [2, 69], 40: 122, 68: 123, 69: [1, 108] }, { 31: [2, 66], 59: [2, 66], 66: [2, 66], 69: [2, 66], 74: [2, 66], 75: [2, 66], 76: [2, 66], 77: [2, 66], 78: [2, 66], 79: [2, 66] }, { 31: [2, 68], 69: [2, 68] }, { 21: [2, 26], 31: [2, 26], 52: [2, 26], 59: [2, 26], 62: [2, 26], 66: [2, 26], 69: [2, 26], 74: [2, 26], 75: [2, 26], 76: [2, 26], 77: [2, 26], 78: [2, 26], 79: [2, 26] }, { 13: [2, 14], 14: [2, 14], 17: [2, 14], 27: [2, 14], 32: [2, 14], 37: [2, 14], 42: [2, 14], 45: [2, 14], 46: [2, 14], 49: [2, 14], 53: [2, 14] }, { 66: [1, 125], 71: [1, 124] }, { 66: [2, 91], 71: [2, 91] }, { 13: [2, 15], 14: [2, 15], 17: [2, 15], 27: [2, 15], 32: [2, 15], 42: [2, 15], 45: [2, 15], 46: [2, 15], 49: [2, 15], 53: [2, 15] }, { 31: [1, 126] }, { 31: [2, 70] }, { 31: [2, 29] }, { 66: [2, 92], 71: [2, 92] }, { 13: [2, 16], 14: [2, 16], 17: [2, 16], 27: [2, 16], 32: [2, 16], 37: [2, 16], 42: [2, 16], 45: [2, 16], 46: [2, 16], 49: [2, 16], 53: [2, 16] }], - defaultActions: { 4: [2, 1], 49: [2, 50], 51: [2, 19], 55: [2, 52], 64: [2, 76], 73: [2, 80], 78: [2, 17], 82: [2, 84], 92: [2, 48], 99: [2, 18], 100: [2, 72], 105: [2, 88], 107: [2, 58], 110: [2, 64], 111: [2, 11], 123: [2, 70], 124: [2, 29] }, - parseError: function parseError(str, hash) { - throw new Error(str); - }, - parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], - lstack = [], - table = this.table, - yytext = "", - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - this.yy.parser = this; - if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - var ranges = this.lexer.options && this.lexer.options.ranges; - if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError; - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - function lex() { - var token; - token = self.lexer.lex() || 1; - if (typeof token !== "number") { - token = self.symbols_[token] || token; - } - return token; - } - var symbol, - preErrorSymbol, - state, - action, - a, - r, - yyval = {}, - p, - len, - newState, - expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == "undefined") { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === "undefined" || !action.length || !action[0]) { - var errStr = ""; - if (!recovering) { - expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected }); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; - if (ranges) { - yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; - } - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; - } - }; - /* Jison generated lexer */ - var lexer = (function () { - var lexer = { EOF: 1, - parseError: function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, - setInput: function setInput(input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ""; - this.conditionStack = ["INITIAL"]; - this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; - if (this.options.ranges) this.yylloc.range = [0, 0]; - this.offset = 0; - return this; - }, - input: function input() { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) this.yylloc.range[1]++; - - this._input = this._input.slice(1); - return ch; - }, - unput: function unput(ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); - - if (lines.length - 1) this.yylineno -= lines.length - 1; - var r = this.yylloc.range; - - this.yylloc = { first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - return this; - }, - more: function more() { - this._more = true; - return this; - }, - less: function less(n) { - this.unput(this.match.slice(n)); - }, - pastInput: function pastInput() { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); - }, - upcomingInput: function upcomingInput() { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20 - next.length); - } - return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); - }, - showPosition: function showPosition() { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, - next: function next() { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, match, tempMatch, index, col, lines; - if (!this._more) { - this.yytext = ""; - this.match = ""; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = { first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) this.done = false; - if (token) { - return token; - } else { - return; - } - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { text: "", token: null, line: this.yylineno }); - } - }, - lex: function lex() { - var r = this.next(); - if (typeof r !== "undefined") { - return r; - } else { - return this.lex(); - } - }, - begin: function begin(condition) { - this.conditionStack.push(condition); - }, - popState: function popState() { - return this.conditionStack.pop(); - }, - _currentRules: function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - }, - topState: function topState() { - return this.conditionStack[this.conditionStack.length - 2]; - }, - pushState: function begin(condition) { - this.begin(condition); - } }; - lexer.options = {}; - lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { - - function strip(start, end) { - return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end); - } - - var YYSTATE = YY_START; - switch ($avoiding_name_collisions) { - case 0: - if (yy_.yytext.slice(-2) === "\\\\") { - strip(0, 1); - this.begin("mu"); - } else if (yy_.yytext.slice(-1) === "\\") { - strip(0, 1); - this.begin("emu"); - } else { - this.begin("mu"); - } - if (yy_.yytext) { - return 14; - }break; - case 1: - return 14; - break; - case 2: - this.popState(); - return 14; - - break; - case 3: - yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9); - this.popState(); - return 16; - - break; - case 4: - return 14; - break; - case 5: - this.popState(); - return 13; - - break; - case 6: - return 59; - break; - case 7: - return 62; - break; - case 8: - return 17; - break; - case 9: - this.popState(); - this.begin("raw"); - return 21; - - break; - case 10: - return 53; - break; - case 11: - return 27; - break; - case 12: - return 45; - break; - case 13: - this.popState();return 42; - break; - case 14: - this.popState();return 42; - break; - case 15: - return 32; - break; - case 16: - return 37; - break; - case 17: - return 49; - break; - case 18: - return 46; - break; - case 19: - this.unput(yy_.yytext); - this.popState(); - this.begin("com"); - - break; - case 20: - this.popState(); - return 13; - - break; - case 21: - return 46; - break; - case 22: - return 67; - break; - case 23: - return 66; - break; - case 24: - return 66; - break; - case 25: - return 81; - break; - case 26: - // ignore whitespace - break; - case 27: - this.popState();return 52; - break; - case 28: - this.popState();return 31; - break; - case 29: - yy_.yytext = strip(1, 2).replace(/\\"/g, "\"");return 74; - break; - case 30: - yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 74; - break; - case 31: - return 79; - break; - case 32: - return 76; - break; - case 33: - return 76; - break; - case 34: - return 77; - break; - case 35: - return 78; - break; - case 36: - return 75; - break; - case 37: - return 69; - break; - case 38: - return 71; - break; - case 39: - return 66; - break; - case 40: - return 66; - break; - case 41: - return "INVALID"; - break; - case 42: - return 5; - break; - } - }; - lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]*?(?=(\{\{\{\{\/)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[[^\]]*\])/, /^(?:.)/, /^(?:$)/]; - lexer.conditions = { mu: { rules: [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], inclusive: false }, emu: { rules: [2], inclusive: false }, com: { rules: [5], inclusive: false }, raw: { rules: [3, 4], inclusive: false }, INITIAL: { rules: [0, 1, 42], inclusive: true } }; - return lexer; - })(); - parser.lexer = lexer; - function Parser() { - this.yy = {}; - }Parser.prototype = parser;parser.Parser = Parser; - return new Parser(); - })();module.exports = handlebars; -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/printer.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/printer.js deleted file mode 100644 index 6b4c230..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/printer.js +++ /dev/null @@ -1,165 +0,0 @@ -define(['exports', './visitor'], function (exports, _visitor) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.print = print; - exports.PrintVisitor = PrintVisitor; - /*eslint-disable new-cap */ - - var _Visitor = _interopRequire(_visitor); - - function print(ast) { - return new PrintVisitor().accept(ast); - } - - function PrintVisitor() { - this.padding = 0; - } - - PrintVisitor.prototype = new _Visitor(); - - PrintVisitor.prototype.pad = function (string) { - var out = ''; - - for (var i = 0, l = this.padding; i < l; i++) { - out = out + ' '; - } - - out = out + string + '\n'; - return out; - }; - - PrintVisitor.prototype.Program = function (program) { - var out = '', - body = program.body, - i = undefined, - l = undefined; - - if (program.blockParams) { - var blockParams = 'BLOCK PARAMS: ['; - for (i = 0, l = program.blockParams.length; i < l; i++) { - blockParams += ' ' + program.blockParams[i]; - } - blockParams += ' ]'; - out += this.pad(blockParams); - } - - for (i = 0, l = body.length; i < l; i++) { - out = out + this.accept(body[i]); - } - - this.padding--; - - return out; - }; - - PrintVisitor.prototype.MustacheStatement = function (mustache) { - return this.pad('{{ ' + this.SubExpression(mustache) + ' }}'); - }; - - PrintVisitor.prototype.BlockStatement = function (block) { - var out = ''; - - out = out + this.pad('BLOCK:'); - this.padding++; - out = out + this.pad(this.SubExpression(block)); - if (block.program) { - out = out + this.pad('PROGRAM:'); - this.padding++; - out = out + this.accept(block.program); - this.padding--; - } - if (block.inverse) { - if (block.program) { - this.padding++; - } - out = out + this.pad('{{^}}'); - this.padding++; - out = out + this.accept(block.inverse); - this.padding--; - if (block.program) { - this.padding--; - } - } - this.padding--; - - return out; - }; - - PrintVisitor.prototype.PartialStatement = function (partial) { - var content = 'PARTIAL:' + partial.name.original; - if (partial.params[0]) { - content += ' ' + this.accept(partial.params[0]); - } - if (partial.hash) { - content += ' ' + this.accept(partial.hash); - } - return this.pad('{{> ' + content + ' }}'); - }; - - PrintVisitor.prototype.ContentStatement = function (content) { - return this.pad('CONTENT[ \'' + content.value + '\' ]'); - }; - - PrintVisitor.prototype.CommentStatement = function (comment) { - return this.pad('{{! \'' + comment.value + '\' }}'); - }; - - PrintVisitor.prototype.SubExpression = function (sexpr) { - var params = sexpr.params, - paramStrings = [], - hash = undefined; - - for (var i = 0, l = params.length; i < l; i++) { - paramStrings.push(this.accept(params[i])); - } - - params = '[' + paramStrings.join(', ') + ']'; - - hash = sexpr.hash ? ' ' + this.accept(sexpr.hash) : ''; - - return this.accept(sexpr.path) + ' ' + params + hash; - }; - - PrintVisitor.prototype.PathExpression = function (id) { - var path = id.parts.join('/'); - return (id.data ? '@' : '') + 'PATH:' + path; - }; - - PrintVisitor.prototype.StringLiteral = function (string) { - return '"' + string.value + '"'; - }; - - PrintVisitor.prototype.NumberLiteral = function (number) { - return 'NUMBER{' + number.value + '}'; - }; - - PrintVisitor.prototype.BooleanLiteral = function (bool) { - return 'BOOLEAN{' + bool.value + '}'; - }; - - PrintVisitor.prototype.UndefinedLiteral = function () { - return 'UNDEFINED'; - }; - - PrintVisitor.prototype.NullLiteral = function () { - return 'NULL'; - }; - - PrintVisitor.prototype.Hash = function (hash) { - var pairs = hash.pairs, - joinedPairs = []; - - for (var i = 0, l = pairs.length; i < l; i++) { - joinedPairs.push(this.accept(pairs[i])); - } - - return 'HASH{' + joinedPairs.join(', ') + '}'; - }; - PrintVisitor.prototype.HashPair = function (pair) { - return pair.key + '=' + this.accept(pair.value); - }; - /*eslint-enable new-cap */ -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/visitor.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/visitor.js deleted file mode 100644 index c86bd51..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/visitor.js +++ /dev/null @@ -1,127 +0,0 @@ -define(['exports', 'module', '../exception', './ast'], function (exports, module, _exception, _ast) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _Exception = _interopRequire(_exception); - - var _AST = _interopRequire(_ast); - - function Visitor() { - this.parents = []; - } - - Visitor.prototype = { - constructor: Visitor, - mutating: false, - - // Visits a given value. If mutating, will replace the value if necessary. - acceptKey: function acceptKey(node, name) { - var value = this.accept(node[name]); - if (this.mutating) { - // Hacky sanity check: - if (value && (!value.type || !_AST[value.type])) { - throw new _Exception('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); - } - node[name] = value; - } - }, - - // Performs an accept operation with added sanity check to ensure - // required keys are not removed. - acceptRequired: function acceptRequired(node, name) { - this.acceptKey(node, name); - - if (!node[name]) { - throw new _Exception(node.type + ' requires ' + name); - } - }, - - // Traverses a given array. If mutating, empty respnses will be removed - // for child elements. - acceptArray: function acceptArray(array) { - for (var i = 0, l = array.length; i < l; i++) { - this.acceptKey(array, i); - - if (!array[i]) { - array.splice(i, 1); - i--; - l--; - } - } - }, - - accept: function accept(object) { - if (!object) { - return; - } - - if (this.current) { - this.parents.unshift(this.current); - } - this.current = object; - - var ret = this[object.type](object); - - this.current = this.parents.shift(); - - if (!this.mutating || ret) { - return ret; - } else if (ret !== false) { - return object; - } - }, - - Program: function Program(program) { - this.acceptArray(program.body); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.acceptRequired(mustache, 'path'); - this.acceptArray(mustache.params); - this.acceptKey(mustache, 'hash'); - }, - - BlockStatement: function BlockStatement(block) { - this.acceptRequired(block, 'path'); - this.acceptArray(block.params); - this.acceptKey(block, 'hash'); - - this.acceptKey(block, 'program'); - this.acceptKey(block, 'inverse'); - }, - - PartialStatement: function PartialStatement(partial) { - this.acceptRequired(partial, 'name'); - this.acceptArray(partial.params); - this.acceptKey(partial, 'hash'); - }, - - ContentStatement: function ContentStatement() {}, - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - this.acceptRequired(sexpr, 'path'); - this.acceptArray(sexpr.params); - this.acceptKey(sexpr, 'hash'); - }, - - PathExpression: function PathExpression() {}, - - StringLiteral: function StringLiteral() {}, - NumberLiteral: function NumberLiteral() {}, - BooleanLiteral: function BooleanLiteral() {}, - UndefinedLiteral: function UndefinedLiteral() {}, - NullLiteral: function NullLiteral() {}, - - Hash: function Hash(hash) { - this.acceptArray(hash.pairs); - }, - HashPair: function HashPair(pair) { - this.acceptRequired(pair, 'value'); - } - }; - - module.exports = Visitor; -}); -/* content */ /* comment */ /* path */ /* string */ /* number */ /* bool */ /* literal */ /* literal */ \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/whitespace-control.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/whitespace-control.js deleted file mode 100644 index 9f1d30f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/whitespace-control.js +++ /dev/null @@ -1,209 +0,0 @@ -define(['exports', 'module', './visitor'], function (exports, module, _visitor) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _Visitor = _interopRequire(_visitor); - - function WhitespaceControl() {} - WhitespaceControl.prototype = new _Visitor(); - - WhitespaceControl.prototype.Program = function (program) { - var isRoot = !this.isRootSeen; - this.isRootSeen = true; - - var body = program.body; - for (var i = 0, l = body.length; i < l; i++) { - var current = body[i], - strip = this.accept(current); - - if (!strip) { - continue; - } - - var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), - _isNextWhitespace = isNextWhitespace(body, i, isRoot), - openStandalone = strip.openStandalone && _isPrevWhitespace, - closeStandalone = strip.closeStandalone && _isNextWhitespace, - inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; - - if (strip.close) { - omitRight(body, i, true); - } - if (strip.open) { - omitLeft(body, i, true); - } - - if (inlineStandalone) { - omitRight(body, i); - - if (omitLeft(body, i)) { - // If we are on a standalone node, save the indent info for partials - if (current.type === 'PartialStatement') { - // Pull out the whitespace from the final line - current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1]; - } - } - } - if (openStandalone) { - omitRight((current.program || current.inverse).body); - - // Strip out the previous content node if it's whitespace only - omitLeft(body, i); - } - if (closeStandalone) { - // Always strip the next node - omitRight(body, i); - - omitLeft((current.inverse || current.program).body); - } - } - - return program; - }; - WhitespaceControl.prototype.BlockStatement = function (block) { - this.accept(block.program); - this.accept(block.inverse); - - // Find the inverse program that is involed with whitespace stripping. - var program = block.program || block.inverse, - inverse = block.program && block.inverse, - firstInverse = inverse, - lastInverse = inverse; - - if (inverse && inverse.chained) { - firstInverse = inverse.body[0].program; - - // Walk the inverse chain to find the last inverse that is actually in the chain. - while (lastInverse.chained) { - lastInverse = lastInverse.body[lastInverse.body.length - 1].program; - } - } - - var strip = { - open: block.openStrip.open, - close: block.closeStrip.close, - - // Determine the standalone candiacy. Basically flag our content as being possibly standalone - // so our parent can determine if we actually are standalone - openStandalone: isNextWhitespace(program.body), - closeStandalone: isPrevWhitespace((firstInverse || program).body) - }; - - if (block.openStrip.close) { - omitRight(program.body, null, true); - } - - if (inverse) { - var inverseStrip = block.inverseStrip; - - if (inverseStrip.open) { - omitLeft(program.body, null, true); - } - - if (inverseStrip.close) { - omitRight(firstInverse.body, null, true); - } - if (block.closeStrip.open) { - omitLeft(lastInverse.body, null, true); - } - - // Find standalone else statments - if (isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) { - omitLeft(program.body); - omitRight(firstInverse.body); - } - } else if (block.closeStrip.open) { - omitLeft(program.body, null, true); - } - - return strip; - }; - - WhitespaceControl.prototype.MustacheStatement = function (mustache) { - return mustache.strip; - }; - - WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) { - /* istanbul ignore next */ - var strip = node.strip || {}; - return { - inlineStandalone: true, - open: strip.open, - close: strip.close - }; - }; - - function isPrevWhitespace(body, i, isRoot) { - if (i === undefined) { - i = body.length; - } - - // Nodes that end with newlines are considered whitespace (but are special - // cased for strip operations) - var prev = body[i - 1], - sibling = body[i - 2]; - if (!prev) { - return isRoot; - } - - if (prev.type === 'ContentStatement') { - return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original); - } - } - function isNextWhitespace(body, i, isRoot) { - if (i === undefined) { - i = -1; - } - - var next = body[i + 1], - sibling = body[i + 2]; - if (!next) { - return isRoot; - } - - if (next.type === 'ContentStatement') { - return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original); - } - } - - // Marks the node to the right of the position as omitted. - // I.e. {{foo}}' ' will mark the ' ' node as omitted. - // - // If i is undefined, then the first child will be marked as such. - // - // If mulitple is truthy then all whitespace will be stripped out until non-whitespace - // content is met. - function omitRight(body, i, multiple) { - var current = body[i == null ? 0 : i + 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) { - return; - } - - var original = current.value; - current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, ''); - current.rightStripped = current.value !== original; - } - - // Marks the node to the left of the position as omitted. - // I.e. ' '{{foo}} will mark the ' ' node as omitted. - // - // If i is undefined then the last child will be marked as such. - // - // If mulitple is truthy then all whitespace will be stripped out until non-whitespace - // content is met. - function omitLeft(body, i, multiple) { - var current = body[i == null ? body.length - 1 : i - 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) { - return; - } - - // We omit the last node if it's whitespace only and not preceeded by a non-content node. - var original = current.value; - current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, ''); - current.leftStripped = current.value !== original; - return current.leftStripped; - } - - module.exports = WhitespaceControl; -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/exception.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/exception.js deleted file mode 100644 index a1ccecf..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/exception.js +++ /dev/null @@ -1,37 +0,0 @@ -define(['exports', 'module'], function (exports, module) { - 'use strict'; - - var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - - function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } - } - - Exception.prototype = new Error(); - - module.exports = Exception; -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/no-conflict.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/no-conflict.js deleted file mode 100644 index c7dda86..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/no-conflict.js +++ /dev/null @@ -1,16 +0,0 @@ -define(['exports', 'module'], function (exports, module) { - /*global window */ - 'use strict'; - - module.exports = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; - }; -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/runtime.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/runtime.js deleted file mode 100644 index e1186e4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/runtime.js +++ /dev/null @@ -1,226 +0,0 @@ -define(['exports', './utils', './exception', './base'], function (exports, _utils, _exception, _base) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.checkRevision = checkRevision; - - // TODO: Remove this line and break up compilePartial - - exports.template = template; - exports.wrapProgram = wrapProgram; - exports.resolvePartial = resolvePartial; - exports.invokePartial = invokePartial; - exports.noop = noop; - - var _Exception = _interopRequire(_exception); - - function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _base.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _base.REVISION_CHANGES[currentRevision], - compilerVersions = _base.REVISION_CHANGES[compilerRevision]; - throw new _Exception('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _Exception('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } - } - - function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _Exception('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _Exception('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = _utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _Exception('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _Exception('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: _utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - return templateSpec[i]; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = _utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _Exception('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _Exception('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; - } - - function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; - } - - function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; - } - - function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new _Exception('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } - } - - function noop() { - return ''; - } - - function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _base.createFrame(data) : {}; - data.root = context; - } - return data; - } -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/safe-string.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/safe-string.js deleted file mode 100644 index f2b3d53..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/safe-string.js +++ /dev/null @@ -1,14 +0,0 @@ -define(['exports', 'module'], function (exports, module) { - // Build out our basic SafeString type - 'use strict'; - - function SafeString(string) { - this.string = string; - } - - SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; - }; - - module.exports = SafeString; -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/utils.js deleted file mode 100644 index e2d6fff..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/utils.js +++ /dev/null @@ -1,116 +0,0 @@ -define(['exports'], function (exports) { - 'use strict'; - - exports.__esModule = true; - exports.extend = extend; - - // Older IE versions do not directly support indexOf so we must implement our own, sadly. - exports.indexOf = indexOf; - exports.escapeExpression = escapeExpression; - exports.isEmpty = isEmpty; - exports.blockParams = blockParams; - exports.appendContextPath = appendContextPath; - var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '`': '`' - }; - - var badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - - function escapeChar(chr) { - return escape[chr]; - } - - function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; - } - - var toString = Object.prototype.toString; - - exports.toString = toString; - // Sourced from lodash - // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt - /*eslint-disable func-style, no-var */ - var isFunction = function isFunction(value) { - return typeof value === 'function'; - }; - // fallback for older versions of Chrome and Safari - /* istanbul ignore next */ - if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; - } - var isFunction; - exports.isFunction = isFunction; - /*eslint-enable func-style, no-var */ - - /* istanbul ignore next */ - var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; - };exports.isArray = isArray; - - function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; - } - - function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); - } - - function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } - } - - function blockParams(params, ids) { - params.path = ids; - return params; - } - - function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; - } -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/precompiler.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/precompiler.js deleted file mode 100644 index dc5aac8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/amd/precompiler.js +++ /dev/null @@ -1,184 +0,0 @@ -define(['exports', 'fs', './handlebars', 'path', 'source-map', 'uglify-js'], function (exports, _fs, _handlebars, _path, _sourceMap, _uglifyJs) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - /*eslint-disable no-console */ - - var _fs2 = _interopRequire(_fs); - - var _uglify = _interopRequire(_uglifyJs); - - module.exports.cli = function (opts) { - if (opts.version) { - console.log(_handlebars.VERSION); - return; - } - - if (!opts.templates.length) { - throw new _handlebars.Exception('Must define at least one template or directory.'); - } - - opts.templates.forEach(function (template) { - try { - _fs2.statSync(template); - } catch (err) { - throw new _handlebars.Exception('Unable to open template file "' + template + '"'); - } - }); - - if (opts.simple && opts.min) { - throw new _handlebars.Exception('Unable to minimize simple output'); - } - if (opts.simple && (opts.templates.length !== 1 || _fs2.statSync(opts.templates[0]).isDirectory())) { - throw new _handlebars.Exception('Unable to output multiple templates in simple mode'); - } - - // Convert the known list into a hash - var known = {}; - if (opts.known && !Array.isArray(opts.known)) { - opts.known = [opts.known]; - } - if (opts.known) { - for (var i = 0, len = opts.known.length; i < len; i++) { - known[opts.known[i]] = true; - } - } - - // Build file extension pattern - var extension = opts.extension.replace(/[\\^$*+?.():=!|{}\-\[\]]/g, function (arg) { - return '\\' + arg; - }); - extension = new RegExp('\\.' + extension + '$'); - - var output = new _sourceMap.SourceNode(); - if (!opts.simple) { - if (opts.amd) { - output.add('define([\'' + opts.handlebarPath + 'handlebars.runtime\'], function(Handlebars) {\n Handlebars = Handlebars["default"];'); - } else if (opts.commonjs) { - output.add('var Handlebars = require("' + opts.commonjs + '");'); - } else { - output.add('(function() {\n'); - } - output.add(' var template = Handlebars.template, templates = '); - if (opts.namespace) { - output.add(opts.namespace); - output.add(' = '); - output.add(opts.namespace); - output.add(' || '); - } - output.add('{};\n'); - } - function processTemplate(template, root) { - var path = template, - stat = _fs2.statSync(path); - if (stat.isDirectory()) { - _fs2.readdirSync(template).map(function (file) { - var childPath = template + '/' + file; - - if (extension.test(childPath) || _fs2.statSync(childPath).isDirectory()) { - processTemplate(childPath, root || template); - } - }); - } else { - var data = _fs2.readFileSync(path, 'utf8'); - - if (opts.bom && data.indexOf('') === 0) { - data = data.substring(1); - } - - var options = { - knownHelpers: known, - knownHelpersOnly: opts.o - }; - - if (opts.map) { - options.srcName = path; - } - if (opts.data) { - options.data = true; - } - - // Clean the template name - if (!root) { - template = _path.basename(template); - } else if (template.indexOf(root) === 0) { - template = template.substring(root.length + 1); - } - template = template.replace(extension, ''); - - var precompiled = _handlebars.precompile(data, options); - - // If we are generating a source map, we have to reconstruct the SourceNode object - if (opts.map) { - var consumer = new _sourceMap.SourceMapConsumer(precompiled.map); - precompiled = _sourceMap.SourceNode.fromStringWithSourceMap(precompiled.code, consumer); - } - - if (opts.simple) { - output.add([precompiled, '\n']); - } else if (opts.partial) { - if (opts.amd && (opts.templates.length == 1 && !_fs2.statSync(opts.templates[0]).isDirectory())) { - output.add('return '); - } - output.add(['Handlebars.partials[\'', template, '\'] = template(', precompiled, ');\n']); - } else { - if (opts.amd && (opts.templates.length == 1 && !_fs2.statSync(opts.templates[0]).isDirectory())) { - output.add('return '); - } - output.add(['templates[\'', template, '\'] = template(', precompiled, ');\n']); - } - } - } - - opts.templates.forEach(function (template) { - processTemplate(template, opts.root); - }); - - // Output the content - if (!opts.simple) { - if (opts.amd) { - if (opts.templates.length > 1 || opts.templates.length == 1 && _fs2.statSync(opts.templates[0]).isDirectory()) { - if (opts.partial) { - output.add('return Handlebars.partials;\n'); - } else { - output.add('return templates;\n'); - } - } - output.add('});'); - } else if (!opts.commonjs) { - output.add('})();'); - } - } - - if (opts.map) { - output.add('\n//# sourceMappingURL=' + opts.map + '\n'); - } - - output = output.toStringWithSourceMap(); - output.map = output.map + ''; - - if (opts.min) { - output = _uglify.minify(output.code, { - fromString: true, - - outSourceMap: opts.map, - inSourceMap: JSON.parse(output.map) - }); - if (opts.map) { - output.code += '\n//# sourceMappingURL=' + opts.map + '\n'; - } - } - - if (opts.map) { - _fs2.writeFileSync(opts.map, output.map, 'utf8'); - } - output = output.code; - - if (opts.output) { - _fs2.writeFileSync(opts.output, output, 'utf8'); - } else { - console.log(output); - } - }; -}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.js deleted file mode 100644 index f294436..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.js +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; - -var _runtime = require('./handlebars.runtime'); - -var _runtime2 = _interopRequireWildcard(_runtime); - -// Compiler imports - -var _AST = require('./handlebars/compiler/ast'); - -var _AST2 = _interopRequireWildcard(_AST); - -var _Parser$parse = require('./handlebars/compiler/base'); - -var _Compiler$compile$precompile = require('./handlebars/compiler/compiler'); - -var _JavaScriptCompiler = require('./handlebars/compiler/javascript-compiler'); - -var _JavaScriptCompiler2 = _interopRequireWildcard(_JavaScriptCompiler); - -var _Visitor = require('./handlebars/compiler/visitor'); - -var _Visitor2 = _interopRequireWildcard(_Visitor); - -var _noConflict = require('./handlebars/no-conflict'); - -var _noConflict2 = _interopRequireWildcard(_noConflict); - -var _create = _runtime2['default'].create; -function create() { - var hb = _create(); - - hb.compile = function (input, options) { - return _Compiler$compile$precompile.compile(input, options, hb); - }; - hb.precompile = function (input, options) { - return _Compiler$compile$precompile.precompile(input, options, hb); - }; - - hb.AST = _AST2['default']; - hb.Compiler = _Compiler$compile$precompile.Compiler; - hb.JavaScriptCompiler = _JavaScriptCompiler2['default']; - hb.Parser = _Parser$parse.parser; - hb.parse = _Parser$parse.parse; - - return hb; -} - -var inst = create(); -inst.create = create; - -_noConflict2['default'](inst); - -inst.Visitor = _Visitor2['default']; - -inst['default'] = inst; - -exports['default'] = inst; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.runtime.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.runtime.js deleted file mode 100644 index e52f2fd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.runtime.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; - -var _import = require('./handlebars/base'); - -var base = _interopRequireWildcard(_import); - -// Each of these augment the Handlebars object. No need to setup here. -// (This is done to easily share code between commonjs and browse envs) - -var _SafeString = require('./handlebars/safe-string'); - -var _SafeString2 = _interopRequireWildcard(_SafeString); - -var _Exception = require('./handlebars/exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -var _import2 = require('./handlebars/utils'); - -var Utils = _interopRequireWildcard(_import2); - -var _import3 = require('./handlebars/runtime'); - -var runtime = _interopRequireWildcard(_import3); - -var _noConflict = require('./handlebars/no-conflict'); - -var _noConflict2 = _interopRequireWildcard(_noConflict); - -// For compatibility and usage outside of module systems, make the Handlebars object a namespace -function create() { - var hb = new base.HandlebarsEnvironment(); - - Utils.extend(hb, base); - hb.SafeString = _SafeString2['default']; - hb.Exception = _Exception2['default']; - hb.Utils = Utils; - hb.escapeExpression = Utils.escapeExpression; - - hb.VM = runtime; - hb.template = function (spec) { - return runtime.template(spec, hb); - }; - - return hb; -} - -var inst = create(); -inst.create = create; - -_noConflict2['default'](inst); - -inst['default'] = inst; - -exports['default'] = inst; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/base.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/base.js deleted file mode 100644 index c7c6a69..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/base.js +++ /dev/null @@ -1,273 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; -exports.HandlebarsEnvironment = HandlebarsEnvironment; -exports.createFrame = createFrame; - -var _import = require('./utils'); - -var Utils = _interopRequireWildcard(_import); - -var _Exception = require('./exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -var VERSION = '3.0.1'; -exports.VERSION = VERSION; -var COMPILER_REVISION = 6; - -exports.COMPILER_REVISION = COMPILER_REVISION; -var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' -}; - -exports.REVISION_CHANGES = REVISION_CHANGES; -var isArray = Utils.isArray, - isFunction = Utils.isFunction, - toString = Utils.toString, - objectType = '[object Object]'; - -function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); -} - -HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function registerHelper(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { - throw new _Exception2['default']('Arg not supported with multiple helpers'); - } - Utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (toString.call(name) === objectType) { - Utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _Exception2['default']('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - } -}; - -function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function () { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _Exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _Exception2['default']('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: Utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (var j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function (conditional, options) { - if (isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || Utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - - instance.registerHelper('with', function (context, options) { - if (isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!Utils.isEmpty(context)) { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = { data: data }; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function (message, options) { - var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); -} - -var logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function log(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - var method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } -}; - -exports.logger = logger; -var log = logger.log; - -exports.log = log; - -function createFrame(object) { - var frame = Utils.extend({}, object); - frame._parent = object; - return frame; -} - -/* [args, ]options */ \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js deleted file mode 100644 index 88b290a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js +++ /dev/null @@ -1,152 +0,0 @@ -'use strict'; - -exports.__esModule = true; -var AST = { - Program: function Program(statements, blockParams, strip, locInfo) { - this.loc = locInfo; - this.type = 'Program'; - this.body = statements; - - this.blockParams = blockParams; - this.strip = strip; - }, - - MustacheStatement: function MustacheStatement(path, params, hash, escaped, strip, locInfo) { - this.loc = locInfo; - this.type = 'MustacheStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.escaped = escaped; - - this.strip = strip; - }, - - BlockStatement: function BlockStatement(path, params, hash, program, inverse, openStrip, inverseStrip, closeStrip, locInfo) { - this.loc = locInfo; - this.type = 'BlockStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.program = program; - this.inverse = inverse; - - this.openStrip = openStrip; - this.inverseStrip = inverseStrip; - this.closeStrip = closeStrip; - }, - - PartialStatement: function PartialStatement(name, params, hash, strip, locInfo) { - this.loc = locInfo; - this.type = 'PartialStatement'; - - this.name = name; - this.params = params || []; - this.hash = hash; - - this.indent = ''; - this.strip = strip; - }, - - ContentStatement: function ContentStatement(string, locInfo) { - this.loc = locInfo; - this.type = 'ContentStatement'; - this.original = this.value = string; - }, - - CommentStatement: function CommentStatement(comment, strip, locInfo) { - this.loc = locInfo; - this.type = 'CommentStatement'; - this.value = comment; - - this.strip = strip; - }, - - SubExpression: function SubExpression(path, params, hash, locInfo) { - this.loc = locInfo; - - this.type = 'SubExpression'; - this.path = path; - this.params = params || []; - this.hash = hash; - }, - - PathExpression: function PathExpression(data, depth, parts, original, locInfo) { - this.loc = locInfo; - this.type = 'PathExpression'; - - this.data = data; - this.original = original; - this.parts = parts; - this.depth = depth; - }, - - StringLiteral: function StringLiteral(string, locInfo) { - this.loc = locInfo; - this.type = 'StringLiteral'; - this.original = this.value = string; - }, - - NumberLiteral: function NumberLiteral(number, locInfo) { - this.loc = locInfo; - this.type = 'NumberLiteral'; - this.original = this.value = Number(number); - }, - - BooleanLiteral: function BooleanLiteral(bool, locInfo) { - this.loc = locInfo; - this.type = 'BooleanLiteral'; - this.original = this.value = bool === 'true'; - }, - - UndefinedLiteral: function UndefinedLiteral(locInfo) { - this.loc = locInfo; - this.type = 'UndefinedLiteral'; - this.original = this.value = undefined; - }, - - NullLiteral: function NullLiteral(locInfo) { - this.loc = locInfo; - this.type = 'NullLiteral'; - this.original = this.value = null; - }, - - Hash: function Hash(pairs, locInfo) { - this.loc = locInfo; - this.type = 'Hash'; - this.pairs = pairs; - }, - HashPair: function HashPair(key, value, locInfo) { - this.loc = locInfo; - this.type = 'HashPair'; - this.key = key; - this.value = value; - }, - - // Public API used to evaluate derived attributes regarding AST nodes - helpers: { - // a mustache is definitely a helper if: - // * it is an eligible helper, and - // * it has at least one parameter or hash segment - helperExpression: function helperExpression(node) { - return !!(node.type === 'SubExpression' || node.params.length || node.hash); - }, - - scopedId: function scopedId(path) { - return /^\.|this\b/.test(path.original); - }, - - // an ID is simple if it only has one part, and that part is not - // `..` or `this`. - simpleId: function simpleId(path) { - return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; - } - } -}; - -// Must be exported as an object rather than the root of the module as the jison lexer -// must modify the object to operate properly. -exports['default'] = AST; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js deleted file mode 100644 index d4bafe0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; -exports.parse = parse; - -var _parser = require('./parser'); - -var _parser2 = _interopRequireWildcard(_parser); - -var _AST = require('./ast'); - -var _AST2 = _interopRequireWildcard(_AST); - -var _WhitespaceControl = require('./whitespace-control'); - -var _WhitespaceControl2 = _interopRequireWildcard(_WhitespaceControl); - -var _import = require('./helpers'); - -var Helpers = _interopRequireWildcard(_import); - -var _extend = require('../utils'); - -exports.parser = _parser2['default']; - -var yy = {}; -_extend.extend(yy, Helpers, _AST2['default']); - -function parse(input, options) { - // Just return if an already-compiled AST was passed in. - if (input.type === 'Program') { - return input; - } - - _parser2['default'].yy = yy; - - // Altering the shared object here, but this is ok as parser is a sync operation - yy.locInfo = function (locInfo) { - return new yy.SourceLocation(options && options.srcName, locInfo); - }; - - var strip = new _WhitespaceControl2['default'](); - return strip.accept(_parser2['default'].parse(input)); -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js deleted file mode 100644 index 8c48c8b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js +++ /dev/null @@ -1,164 +0,0 @@ -'use strict'; - -exports.__esModule = true; -/*global define */ - -var _isArray = require('../utils'); - -var SourceNode = undefined; - -try { - /* istanbul ignore next */ - if (typeof define !== 'function' || !define.amd) { - // We don't support this in AMD environments. For these environments, we asusme that - // they are running on the browser and thus have no need for the source-map library. - var SourceMap = require('source-map'); - SourceNode = SourceMap.SourceNode; - } -} catch (err) {} - -/* istanbul ignore if: tested but not covered in istanbul due to dist build */ -if (!SourceNode) { - SourceNode = function (line, column, srcFile, chunks) { - this.src = ''; - if (chunks) { - this.add(chunks); - } - }; - /* istanbul ignore next */ - SourceNode.prototype = { - add: function add(chunks) { - if (_isArray.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src += chunks; - }, - prepend: function prepend(chunks) { - if (_isArray.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src = chunks + this.src; - }, - toStringWithSourceMap: function toStringWithSourceMap() { - return { code: this.toString() }; - }, - toString: function toString() { - return this.src; - } - }; -} - -function castChunk(chunk, codeGen, loc) { - if (_isArray.isArray(chunk)) { - var ret = []; - - for (var i = 0, len = chunk.length; i < len; i++) { - ret.push(codeGen.wrap(chunk[i], loc)); - } - return ret; - } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { - // Handle primitives that the SourceNode will throw up on - return chunk + ''; - } - return chunk; -} - -function CodeGen(srcFile) { - this.srcFile = srcFile; - this.source = []; -} - -CodeGen.prototype = { - prepend: function prepend(source, loc) { - this.source.unshift(this.wrap(source, loc)); - }, - push: function push(source, loc) { - this.source.push(this.wrap(source, loc)); - }, - - merge: function merge() { - var source = this.empty(); - this.each(function (line) { - source.add([' ', line, '\n']); - }); - return source; - }, - - each: function each(iter) { - for (var i = 0, len = this.source.length; i < len; i++) { - iter(this.source[i]); - } - }, - - empty: function empty() { - var loc = arguments[0] === undefined ? this.currentLocation || { start: {} } : arguments[0]; - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile); - }, - wrap: function wrap(chunk) { - var loc = arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1]; - - if (chunk instanceof SourceNode) { - return chunk; - } - - chunk = castChunk(chunk, this, loc); - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); - }, - - functionCall: function functionCall(fn, type, params) { - params = this.generateList(params); - return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); - }, - - quotedString: function quotedString(str) { - return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 - .replace(/\u2029/g, '\\u2029') + '"'; - }, - - objectLiteral: function objectLiteral(obj) { - var pairs = []; - - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - var value = castChunk(obj[key], this); - if (value !== 'undefined') { - pairs.push([this.quotedString(key), ':', value]); - } - } - } - - var ret = this.generateList(pairs); - ret.prepend('{'); - ret.add('}'); - return ret; - }, - - generateList: function generateList(entries, loc) { - var ret = this.empty(loc); - - for (var i = 0, len = entries.length; i < len; i++) { - if (i) { - ret.add(','); - } - - ret.add(castChunk(entries[i], this, loc)); - } - - return ret; - }, - - generateArray: function generateArray(entries, loc) { - var ret = this.generateList(entries, loc); - ret.prepend('['); - ret.add(']'); - - return ret; - } -}; - -exports['default'] = CodeGen; -module.exports = exports['default']; - -/* NOP */ \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js deleted file mode 100644 index 4840fa5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js +++ /dev/null @@ -1,527 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; -exports.Compiler = Compiler; -exports.precompile = precompile; -exports.compile = compile; - -var _Exception = require('../exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -var _isArray$indexOf = require('../utils'); - -var _AST = require('./ast'); - -var _AST2 = _interopRequireWildcard(_AST); - -var slice = [].slice; - -function Compiler() {} - -// the foundHelper register will disambiguate helper lookup from finding a -// function in a context. This is necessary for mustache compatibility, which -// requires that context functions in blocks are evaluated by blockHelperMissing, -// and then proceed as if the resulting value was provided to blockHelperMissing. - -Compiler.prototype = { - compiler: Compiler, - - equals: function equals(other) { - var len = this.opcodes.length; - if (other.opcodes.length !== len) { - return false; - } - - for (var i = 0; i < len; i++) { - var opcode = this.opcodes[i], - otherOpcode = other.opcodes[i]; - if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { - return false; - } - } - - // We know that length is the same between the two arrays because they are directly tied - // to the opcode behavior above. - len = this.children.length; - for (var i = 0; i < len; i++) { - if (!this.children[i].equals(other.children[i])) { - return false; - } - } - - return true; - }, - - guid: 0, - - compile: function compile(program, options) { - this.sourceNode = []; - this.opcodes = []; - this.children = []; - this.options = options; - this.stringParams = options.stringParams; - this.trackIds = options.trackIds; - - options.blockParams = options.blockParams || []; - - // These changes will propagate to the other compiler components - var knownHelpers = options.knownHelpers; - options.knownHelpers = { - helperMissing: true, - blockHelperMissing: true, - each: true, - 'if': true, - unless: true, - 'with': true, - log: true, - lookup: true - }; - if (knownHelpers) { - for (var _name in knownHelpers) { - if (_name in knownHelpers) { - options.knownHelpers[_name] = knownHelpers[_name]; - } - } - } - - return this.accept(program); - }, - - compileProgram: function compileProgram(program) { - var childCompiler = new this.compiler(), - // eslint-disable-line new-cap - result = childCompiler.compile(program, this.options), - guid = this.guid++; - - this.usePartial = this.usePartial || result.usePartial; - - this.children[guid] = result; - this.useDepths = this.useDepths || result.useDepths; - - return guid; - }, - - accept: function accept(node) { - this.sourceNode.unshift(node); - var ret = this[node.type](node); - this.sourceNode.shift(); - return ret; - }, - - Program: function Program(program) { - this.options.blockParams.unshift(program.blockParams); - - var body = program.body, - bodyLength = body.length; - for (var i = 0; i < bodyLength; i++) { - this.accept(body[i]); - } - - this.options.blockParams.shift(); - - this.isSimple = bodyLength === 1; - this.blockParams = program.blockParams ? program.blockParams.length : 0; - - return this; - }, - - BlockStatement: function BlockStatement(block) { - transformLiteralToPath(block); - - var program = block.program, - inverse = block.inverse; - - program = program && this.compileProgram(program); - inverse = inverse && this.compileProgram(inverse); - - var type = this.classifySexpr(block); - - if (type === 'helper') { - this.helperSexpr(block, program, inverse); - } else if (type === 'simple') { - this.simpleSexpr(block); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('blockValue', block.path.original); - } else { - this.ambiguousSexpr(block, program, inverse); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('ambiguousBlockValue'); - } - - this.opcode('append'); - }, - - PartialStatement: function PartialStatement(partial) { - this.usePartial = true; - - var params = partial.params; - if (params.length > 1) { - throw new _Exception2['default']('Unsupported number of partial arguments: ' + params.length, partial); - } else if (!params.length) { - params.push({ type: 'PathExpression', parts: [], depth: 0 }); - } - - var partialName = partial.name.original, - isDynamic = partial.name.type === 'SubExpression'; - if (isDynamic) { - this.accept(partial.name); - } - - this.setupFullMustacheParams(partial, undefined, undefined, true); - - var indent = partial.indent || ''; - if (this.options.preventIndent && indent) { - this.opcode('appendContent', indent); - indent = ''; - } - - this.opcode('invokePartial', isDynamic, partialName, indent); - this.opcode('append'); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.SubExpression(mustache); // eslint-disable-line new-cap - - if (mustache.escaped && !this.options.noEscape) { - this.opcode('appendEscaped'); - } else { - this.opcode('append'); - } - }, - - ContentStatement: function ContentStatement(content) { - if (content.value) { - this.opcode('appendContent', content.value); - } - }, - - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - transformLiteralToPath(sexpr); - var type = this.classifySexpr(sexpr); - - if (type === 'simple') { - this.simpleSexpr(sexpr); - } else if (type === 'helper') { - this.helperSexpr(sexpr); - } else { - this.ambiguousSexpr(sexpr); - } - }, - ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) { - var path = sexpr.path, - name = path.parts[0], - isBlock = program != null || inverse != null; - - this.opcode('getContext', path.depth); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - this.accept(path); - - this.opcode('invokeAmbiguous', name, isBlock); - }, - - simpleSexpr: function simpleSexpr(sexpr) { - this.accept(sexpr.path); - this.opcode('resolvePossibleLambda'); - }, - - helperSexpr: function helperSexpr(sexpr, program, inverse) { - var params = this.setupFullMustacheParams(sexpr, program, inverse), - path = sexpr.path, - name = path.parts[0]; - - if (this.options.knownHelpers[name]) { - this.opcode('invokeKnownHelper', params.length, name); - } else if (this.options.knownHelpersOnly) { - throw new _Exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); - } else { - path.falsy = true; - - this.accept(path); - this.opcode('invokeHelper', params.length, path.original, _AST2['default'].helpers.simpleId(path)); - } - }, - - PathExpression: function PathExpression(path) { - this.addDepth(path.depth); - this.opcode('getContext', path.depth); - - var name = path.parts[0], - scoped = _AST2['default'].helpers.scopedId(path), - blockParamId = !path.depth && !scoped && this.blockParamIndex(name); - - if (blockParamId) { - this.opcode('lookupBlockParam', blockParamId, path.parts); - } else if (!name) { - // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` - this.opcode('pushContext'); - } else if (path.data) { - this.options.data = true; - this.opcode('lookupData', path.depth, path.parts); - } else { - this.opcode('lookupOnContext', path.parts, path.falsy, scoped); - } - }, - - StringLiteral: function StringLiteral(string) { - this.opcode('pushString', string.value); - }, - - NumberLiteral: function NumberLiteral(number) { - this.opcode('pushLiteral', number.value); - }, - - BooleanLiteral: function BooleanLiteral(bool) { - this.opcode('pushLiteral', bool.value); - }, - - UndefinedLiteral: function UndefinedLiteral() { - this.opcode('pushLiteral', 'undefined'); - }, - - NullLiteral: function NullLiteral() { - this.opcode('pushLiteral', 'null'); - }, - - Hash: function Hash(hash) { - var pairs = hash.pairs, - i = 0, - l = pairs.length; - - this.opcode('pushHash'); - - for (; i < l; i++) { - this.pushParam(pairs[i].value); - } - while (i--) { - this.opcode('assignToHash', pairs[i].key); - } - this.opcode('popHash'); - }, - - // HELPERS - opcode: function opcode(name) { - this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); - }, - - addDepth: function addDepth(depth) { - if (!depth) { - return; - } - - this.useDepths = true; - }, - - classifySexpr: function classifySexpr(sexpr) { - var isSimple = _AST2['default'].helpers.simpleId(sexpr.path); - - var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); - - // a mustache is an eligible helper if: - // * its id is simple (a single part, not `this` or `..`) - var isHelper = !isBlockParam && _AST2['default'].helpers.helperExpression(sexpr); - - // if a mustache is an eligible helper but not a definite - // helper, it is ambiguous, and will be resolved in a later - // pass or at runtime. - var isEligible = !isBlockParam && (isHelper || isSimple); - - // if ambiguous, we can possibly resolve the ambiguity now - // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. - if (isEligible && !isHelper) { - var _name2 = sexpr.path.parts[0], - options = this.options; - - if (options.knownHelpers[_name2]) { - isHelper = true; - } else if (options.knownHelpersOnly) { - isEligible = false; - } - } - - if (isHelper) { - return 'helper'; - } else if (isEligible) { - return 'ambiguous'; - } else { - return 'simple'; - } - }, - - pushParams: function pushParams(params) { - for (var i = 0, l = params.length; i < l; i++) { - this.pushParam(params[i]); - } - }, - - pushParam: function pushParam(val) { - var value = val.value != null ? val.value : val.original || ''; - - if (this.stringParams) { - if (value.replace) { - value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.'); - } - - if (val.depth) { - this.addDepth(val.depth); - } - this.opcode('getContext', val.depth || 0); - this.opcode('pushStringParam', value, val.type); - - if (val.type === 'SubExpression') { - // SubExpressions get evaluated and passed in - // in string params mode. - this.accept(val); - } - } else { - if (this.trackIds) { - var blockParamIndex = undefined; - if (val.parts && !_AST2['default'].helpers.scopedId(val) && !val.depth) { - blockParamIndex = this.blockParamIndex(val.parts[0]); - } - if (blockParamIndex) { - var blockParamChild = val.parts.slice(1).join('.'); - this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); - } else { - value = val.original || value; - if (value.replace) { - value = value.replace(/^\.\//g, '').replace(/^\.$/g, ''); - } - - this.opcode('pushId', val.type, value); - } - } - this.accept(val); - } - }, - - setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) { - var params = sexpr.params; - this.pushParams(params); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - if (sexpr.hash) { - this.accept(sexpr.hash); - } else { - this.opcode('emptyHash', omitEmpty); - } - - return params; - }, - - blockParamIndex: function blockParamIndex(name) { - for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) { - var blockParams = this.options.blockParams[depth], - param = blockParams && _isArray$indexOf.indexOf(blockParams, name); - if (blockParams && param >= 0) { - return [depth, param]; - } - } - } -}; - -function precompile(input, options, env) { - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); - } - - options = options || {}; - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options); - return new env.JavaScriptCompiler().compile(environment, options); -} - -function compile(input, _x, env) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); - } - - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var compiled = undefined; - - function compileInput() { - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options), - templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); - return env.template(templateSpec); - } - - // Template is only compiled on first use and cached after that point. - function ret(context, execOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled.call(this, context, execOptions); - } - ret._setup = function (setupOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._setup(setupOptions); - }; - ret._child = function (i, data, blockParams, depths) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._child(i, data, blockParams, depths); - }; - return ret; -} - -function argEquals(a, b) { - if (a === b) { - return true; - } - - if (_isArray$indexOf.isArray(a) && _isArray$indexOf.isArray(b) && a.length === b.length) { - for (var i = 0; i < a.length; i++) { - if (!argEquals(a[i], b[i])) { - return false; - } - } - return true; - } -} - -function transformLiteralToPath(sexpr) { - if (!sexpr.path.parts) { - var literal = sexpr.path; - // Casting to string here to make false and 0 literal values play nicely with the rest - // of the system. - sexpr.path = new _AST2['default'].PathExpression(false, 0, [literal.original + ''], literal.original + '', literal.loc); - } -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/helpers.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/helpers.js deleted file mode 100644 index dac4f0c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/helpers.js +++ /dev/null @@ -1,131 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; -exports.SourceLocation = SourceLocation; -exports.id = id; -exports.stripFlags = stripFlags; -exports.stripComment = stripComment; -exports.preparePath = preparePath; -exports.prepareMustache = prepareMustache; -exports.prepareRawBlock = prepareRawBlock; -exports.prepareBlock = prepareBlock; - -var _Exception = require('../exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -function SourceLocation(source, locInfo) { - this.source = source; - this.start = { - line: locInfo.first_line, - column: locInfo.first_column - }; - this.end = { - line: locInfo.last_line, - column: locInfo.last_column - }; -} - -function id(token) { - if (/^\[.*\]$/.test(token)) { - return token.substr(1, token.length - 2); - } else { - return token; - } -} - -function stripFlags(open, close) { - return { - open: open.charAt(2) === '~', - close: close.charAt(close.length - 3) === '~' - }; -} - -function stripComment(comment) { - return comment.replace(/^\{\{~?\!-?-?/, '').replace(/-?-?~?\}\}$/, ''); -} - -function preparePath(data, parts, locInfo) { - locInfo = this.locInfo(locInfo); - - var original = data ? '@' : '', - dig = [], - depth = 0, - depthString = ''; - - for (var i = 0, l = parts.length; i < l; i++) { - var part = parts[i].part, - - // If we have [] syntax then we do not treat path references as operators, - // i.e. foo.[this] resolves to approximately context.foo['this'] - isLiteral = parts[i].original !== part; - original += (parts[i].separator || '') + part; - - if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { - if (dig.length > 0) { - throw new _Exception2['default']('Invalid path: ' + original, { loc: locInfo }); - } else if (part === '..') { - depth++; - depthString += '../'; - } - } else { - dig.push(part); - } - } - - return new this.PathExpression(data, depth, dig, original, locInfo); -} - -function prepareMustache(path, params, hash, open, strip, locInfo) { - // Must use charAt to support IE pre-10 - var escapeFlag = open.charAt(3) || open.charAt(2), - escaped = escapeFlag !== '{' && escapeFlag !== '&'; - - return new this.MustacheStatement(path, params, hash, escaped, strip, this.locInfo(locInfo)); -} - -function prepareRawBlock(openRawBlock, content, close, locInfo) { - if (openRawBlock.path.original !== close) { - var errorNode = { loc: openRawBlock.path.loc }; - - throw new _Exception2['default'](openRawBlock.path.original + ' doesn\'t match ' + close, errorNode); - } - - locInfo = this.locInfo(locInfo); - var program = new this.Program([content], null, {}, locInfo); - - return new this.BlockStatement(openRawBlock.path, openRawBlock.params, openRawBlock.hash, program, undefined, {}, {}, {}, locInfo); -} - -function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { - // When we are chaining inverse calls, we will not have a close path - if (close && close.path && openBlock.path.original !== close.path.original) { - var errorNode = { loc: openBlock.path.loc }; - - throw new _Exception2['default'](openBlock.path.original + ' doesn\'t match ' + close.path.original, errorNode); - } - - program.blockParams = openBlock.blockParams; - - var inverse = undefined, - inverseStrip = undefined; - - if (inverseAndProgram) { - if (inverseAndProgram.chain) { - inverseAndProgram.program.body[0].closeStrip = close.strip; - } - - inverseStrip = inverseAndProgram.strip; - inverse = inverseAndProgram.program; - } - - if (inverted) { - inverted = inverse; - inverse = program; - program = inverted; - } - - return new this.BlockStatement(openBlock.path, openBlock.params, openBlock.hash, program, inverse, openBlock.strip, inverseStrip, close && close.strip, this.locInfo(locInfo)); -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js deleted file mode 100644 index c77f270..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js +++ /dev/null @@ -1,1062 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; - -var _COMPILER_REVISION$REVISION_CHANGES = require('../base'); - -var _Exception = require('../exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -var _isArray = require('../utils'); - -var _CodeGen = require('./code-gen'); - -var _CodeGen2 = _interopRequireWildcard(_CodeGen); - -function Literal(value) { - this.value = value; -} - -function JavaScriptCompiler() {} - -JavaScriptCompiler.prototype = { - // PUBLIC API: You can override these methods in a subclass to provide - // alternative compiled forms for name lookup and buffering semantics - nameLookup: function nameLookup(parent, name /* , type*/) { - if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { - return [parent, '.', name]; - } else { - return [parent, '[\'', name, '\']']; - } - }, - depthedLookup: function depthedLookup(name) { - return [this.aliasable('this.lookup'), '(depths, "', name, '")']; - }, - - compilerInfo: function compilerInfo() { - var revision = _COMPILER_REVISION$REVISION_CHANGES.COMPILER_REVISION, - versions = _COMPILER_REVISION$REVISION_CHANGES.REVISION_CHANGES[revision]; - return [revision, versions]; - }, - - appendToBuffer: function appendToBuffer(source, location, explicit) { - // Force a source as this simplifies the merge logic. - if (!_isArray.isArray(source)) { - source = [source]; - } - source = this.source.wrap(source, location); - - if (this.environment.isSimple) { - return ['return ', source, ';']; - } else if (explicit) { - // This is a case where the buffer operation occurs as a child of another - // construct, generally braces. We have to explicitly output these buffer - // operations to ensure that the emitted code goes in the correct location. - return ['buffer += ', source, ';']; - } else { - source.appendToBuffer = true; - return source; - } - }, - - initializeBuffer: function initializeBuffer() { - return this.quotedString(''); - }, - // END PUBLIC API - - compile: function compile(environment, options, context, asObject) { - this.environment = environment; - this.options = options; - this.stringParams = this.options.stringParams; - this.trackIds = this.options.trackIds; - this.precompile = !asObject; - - this.name = this.environment.name; - this.isChild = !!context; - this.context = context || { - programs: [], - environments: [] - }; - - this.preamble(); - - this.stackSlot = 0; - this.stackVars = []; - this.aliases = {}; - this.registers = { list: [] }; - this.hashes = []; - this.compileStack = []; - this.inlineStack = []; - this.blockParams = []; - - this.compileChildren(environment, options); - - this.useDepths = this.useDepths || environment.useDepths || this.options.compat; - this.useBlockParams = this.useBlockParams || environment.useBlockParams; - - var opcodes = environment.opcodes, - opcode = undefined, - firstLoc = undefined, - i = undefined, - l = undefined; - - for (i = 0, l = opcodes.length; i < l; i++) { - opcode = opcodes[i]; - - this.source.currentLocation = opcode.loc; - firstLoc = firstLoc || opcode.loc; - this[opcode.opcode].apply(this, opcode.args); - } - - // Flush any trailing content that might be pending. - this.source.currentLocation = firstLoc; - this.pushSource(''); - - /* istanbul ignore next */ - if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { - throw new _Exception2['default']('Compile completed with content left on stack'); - } - - var fn = this.createFunctionContext(asObject); - if (!this.isChild) { - var ret = { - compiler: this.compilerInfo(), - main: fn - }; - var programs = this.context.programs; - for (i = 0, l = programs.length; i < l; i++) { - if (programs[i]) { - ret[i] = programs[i]; - } - } - - if (this.environment.usePartial) { - ret.usePartial = true; - } - if (this.options.data) { - ret.useData = true; - } - if (this.useDepths) { - ret.useDepths = true; - } - if (this.useBlockParams) { - ret.useBlockParams = true; - } - if (this.options.compat) { - ret.compat = true; - } - - if (!asObject) { - ret.compiler = JSON.stringify(ret.compiler); - - this.source.currentLocation = { start: { line: 1, column: 0 } }; - ret = this.objectLiteral(ret); - - if (options.srcName) { - ret = ret.toStringWithSourceMap({ file: options.destName }); - ret.map = ret.map && ret.map.toString(); - } else { - ret = ret.toString(); - } - } else { - ret.compilerOptions = this.options; - } - - return ret; - } else { - return fn; - } - }, - - preamble: function preamble() { - // track the last context pushed into place to allow skipping the - // getContext opcode when it would be a noop - this.lastContext = 0; - this.source = new _CodeGen2['default'](this.options.srcName); - }, - - createFunctionContext: function createFunctionContext(asObject) { - var varDeclarations = ''; - - var locals = this.stackVars.concat(this.registers.list); - if (locals.length > 0) { - varDeclarations += ', ' + locals.join(', '); - } - - // Generate minimizer alias mappings - // - // When using true SourceNodes, this will update all references to the given alias - // as the source nodes are reused in situ. For the non-source node compilation mode, - // aliases will not be used, but this case is already being run on the client and - // we aren't concern about minimizing the template size. - var aliasCount = 0; - for (var alias in this.aliases) { - // eslint-disable-line guard-for-in - var node = this.aliases[alias]; - - if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) { - varDeclarations += ', alias' + ++aliasCount + '=' + alias; - node.children[0] = 'alias' + aliasCount; - } - } - - var params = ['depth0', 'helpers', 'partials', 'data']; - - if (this.useBlockParams || this.useDepths) { - params.push('blockParams'); - } - if (this.useDepths) { - params.push('depths'); - } - - // Perform a second pass over the output to merge content when possible - var source = this.mergeSource(varDeclarations); - - if (asObject) { - params.push(source); - - return Function.apply(this, params); - } else { - return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); - } - }, - mergeSource: function mergeSource(varDeclarations) { - var isSimple = this.environment.isSimple, - appendOnly = !this.forceBuffer, - appendFirst = undefined, - sourceSeen = undefined, - bufferStart = undefined, - bufferEnd = undefined; - this.source.each(function (line) { - if (line.appendToBuffer) { - if (bufferStart) { - line.prepend(' + '); - } else { - bufferStart = line; - } - bufferEnd = line; - } else { - if (bufferStart) { - if (!sourceSeen) { - appendFirst = true; - } else { - bufferStart.prepend('buffer += '); - } - bufferEnd.add(';'); - bufferStart = bufferEnd = undefined; - } - - sourceSeen = true; - if (!isSimple) { - appendOnly = false; - } - } - }); - - if (appendOnly) { - if (bufferStart) { - bufferStart.prepend('return '); - bufferEnd.add(';'); - } else if (!sourceSeen) { - this.source.push('return "";'); - } - } else { - varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); - - if (bufferStart) { - bufferStart.prepend('return buffer + '); - bufferEnd.add(';'); - } else { - this.source.push('return buffer;'); - } - } - - if (varDeclarations) { - this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); - } - - return this.source.merge(); - }, - - // [blockValue] - // - // On stack, before: hash, inverse, program, value - // On stack, after: return value of blockHelperMissing - // - // The purpose of this opcode is to take a block of the form - // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and - // replace it on the stack with the result of properly - // invoking blockHelperMissing. - blockValue: function blockValue(name) { - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs(name, 0, params); - - var blockName = this.popStack(); - params.splice(1, 0, blockName); - - this.push(this.source.functionCall(blockHelperMissing, 'call', params)); - }, - - // [ambiguousBlockValue] - // - // On stack, before: hash, inverse, program, value - // Compiler value, before: lastHelper=value of last found helper, if any - // On stack, after, if no lastHelper: same as [blockValue] - // On stack, after, if lastHelper: value - ambiguousBlockValue: function ambiguousBlockValue() { - // We're being a bit cheeky and reusing the options value from the prior exec - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs('', 0, params, true); - - this.flushInline(); - - var current = this.topStack(); - params.splice(1, 0, current); - - this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']); - }, - - // [appendContent] - // - // On stack, before: ... - // On stack, after: ... - // - // Appends the string value of `content` to the current buffer - appendContent: function appendContent(content) { - if (this.pendingContent) { - content = this.pendingContent + content; - } else { - this.pendingLocation = this.source.currentLocation; - } - - this.pendingContent = content; - }, - - // [append] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Coerces `value` to a String and appends it to the current buffer. - // - // If `value` is truthy, or 0, it is coerced into a string and appended - // Otherwise, the empty string is appended - append: function append() { - if (this.isInline()) { - this.replaceStack(function (current) { - return [' != null ? ', current, ' : ""']; - }); - - this.pushSource(this.appendToBuffer(this.popStack())); - } else { - var local = this.popStack(); - this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); - if (this.environment.isSimple) { - this.pushSource(['else { ', this.appendToBuffer('\'\'', undefined, true), ' }']); - } - } - }, - - // [appendEscaped] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Escape `value` and append it to the buffer - appendEscaped: function appendEscaped() { - this.pushSource(this.appendToBuffer([this.aliasable('this.escapeExpression'), '(', this.popStack(), ')'])); - }, - - // [getContext] - // - // On stack, before: ... - // On stack, after: ... - // Compiler value, after: lastContext=depth - // - // Set the value of the `lastContext` compiler value to the depth - getContext: function getContext(depth) { - this.lastContext = depth; - }, - - // [pushContext] - // - // On stack, before: ... - // On stack, after: currentContext, ... - // - // Pushes the value of the current context onto the stack. - pushContext: function pushContext() { - this.pushStackLiteral(this.contextName(this.lastContext)); - }, - - // [lookupOnContext] - // - // On stack, before: ... - // On stack, after: currentContext[name], ... - // - // Looks up the value of `name` on the current context and pushes - // it onto the stack. - lookupOnContext: function lookupOnContext(parts, falsy, scoped) { - var i = 0; - - if (!scoped && this.options.compat && !this.lastContext) { - // The depthed query is expected to handle the undefined logic for the root level that - // is implemented below, so we evaluate that directly in compat mode - this.push(this.depthedLookup(parts[i++])); - } else { - this.pushContext(); - } - - this.resolvePath('context', parts, i, falsy); - }, - - // [lookupBlockParam] - // - // On stack, before: ... - // On stack, after: blockParam[name], ... - // - // Looks up the value of `parts` on the given block param and pushes - // it onto the stack. - lookupBlockParam: function lookupBlockParam(blockParamId, parts) { - this.useBlockParams = true; - - this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); - this.resolvePath('context', parts, 1); - }, - - // [lookupData] - // - // On stack, before: ... - // On stack, after: data, ... - // - // Push the data lookup operator - lookupData: function lookupData(depth, parts) { - if (!depth) { - this.pushStackLiteral('data'); - } else { - this.pushStackLiteral('this.data(data, ' + depth + ')'); - } - - this.resolvePath('data', parts, 0, true); - }, - - resolvePath: function resolvePath(type, parts, i, falsy) { - var _this = this; - - if (this.options.strict || this.options.assumeObjects) { - this.push(strictLookup(this.options.strict, this, parts, type)); - return; - } - - var len = parts.length; - for (; i < len; i++) { - /*eslint-disable no-loop-func */ - this.replaceStack(function (current) { - var lookup = _this.nameLookup(current, parts[i], type); - // We want to ensure that zero and false are handled properly if the context (falsy flag) - // needs to have the special handling for these values. - if (!falsy) { - return [' != null ? ', lookup, ' : ', current]; - } else { - // Otherwise we can use generic falsy handling - return [' && ', lookup]; - } - }); - /*eslint-enable no-loop-func */ - } - }, - - // [resolvePossibleLambda] - // - // On stack, before: value, ... - // On stack, after: resolved value, ... - // - // If the `value` is a lambda, replace it on the stack by - // the return value of the lambda - resolvePossibleLambda: function resolvePossibleLambda() { - this.push([this.aliasable('this.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); - }, - - // [pushStringParam] - // - // On stack, before: ... - // On stack, after: string, currentContext, ... - // - // This opcode is designed for use in string mode, which - // provides the string value of a parameter along with its - // depth rather than resolving it immediately. - pushStringParam: function pushStringParam(string, type) { - this.pushContext(); - this.pushString(type); - - // If it's a subexpression, the string result - // will be pushed after this opcode. - if (type !== 'SubExpression') { - if (typeof string === 'string') { - this.pushString(string); - } else { - this.pushStackLiteral(string); - } - } - }, - - emptyHash: function emptyHash(omitEmpty) { - if (this.trackIds) { - this.push('{}'); // hashIds - } - if (this.stringParams) { - this.push('{}'); // hashContexts - this.push('{}'); // hashTypes - } - this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); - }, - pushHash: function pushHash() { - if (this.hash) { - this.hashes.push(this.hash); - } - this.hash = { values: [], types: [], contexts: [], ids: [] }; - }, - popHash: function popHash() { - var hash = this.hash; - this.hash = this.hashes.pop(); - - if (this.trackIds) { - this.push(this.objectLiteral(hash.ids)); - } - if (this.stringParams) { - this.push(this.objectLiteral(hash.contexts)); - this.push(this.objectLiteral(hash.types)); - } - - this.push(this.objectLiteral(hash.values)); - }, - - // [pushString] - // - // On stack, before: ... - // On stack, after: quotedString(string), ... - // - // Push a quoted version of `string` onto the stack - pushString: function pushString(string) { - this.pushStackLiteral(this.quotedString(string)); - }, - - // [pushLiteral] - // - // On stack, before: ... - // On stack, after: value, ... - // - // Pushes a value onto the stack. This operation prevents - // the compiler from creating a temporary variable to hold - // it. - pushLiteral: function pushLiteral(value) { - this.pushStackLiteral(value); - }, - - // [pushProgram] - // - // On stack, before: ... - // On stack, after: program(guid), ... - // - // Push a program expression onto the stack. This takes - // a compile-time guid and converts it into a runtime-accessible - // expression. - pushProgram: function pushProgram(guid) { - if (guid != null) { - this.pushStackLiteral(this.programExpression(guid)); - } else { - this.pushStackLiteral(null); - } - }, - - // [invokeHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // Pops off the helper's parameters, invokes the helper, - // and pushes the helper's return value onto the stack. - // - // If the helper is not found, `helperMissing` is called. - invokeHelper: function invokeHelper(paramSize, name, isSimple) { - var nonHelper = this.popStack(), - helper = this.setupHelper(paramSize, name), - simple = isSimple ? [helper.name, ' || '] : ''; - - var lookup = ['('].concat(simple, nonHelper); - if (!this.options.strict) { - lookup.push(' || ', this.aliasable('helpers.helperMissing')); - } - lookup.push(')'); - - this.push(this.source.functionCall(lookup, 'call', helper.callParams)); - }, - - // [invokeKnownHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // This operation is used when the helper is known to exist, - // so a `helperMissing` fallback is not required. - invokeKnownHelper: function invokeKnownHelper(paramSize, name) { - var helper = this.setupHelper(paramSize, name); - this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); - }, - - // [invokeAmbiguous] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of disambiguation - // - // This operation is used when an expression like `{{foo}}` - // is provided, but we don't know at compile-time whether it - // is a helper or a path. - // - // This operation emits more code than the other options, - // and can be avoided by passing the `knownHelpers` and - // `knownHelpersOnly` flags at compile-time. - invokeAmbiguous: function invokeAmbiguous(name, helperCall) { - this.useRegister('helper'); - - var nonHelper = this.popStack(); - - this.emptyHash(); - var helper = this.setupHelper(0, name, helperCall); - - var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); - - var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; - if (!this.options.strict) { - lookup[0] = '(helper = '; - lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing')); - } - - this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']); - }, - - // [invokePartial] - // - // On stack, before: context, ... - // On stack after: result of partial invocation - // - // This operation pops off a context, invokes a partial with that context, - // and pushes the result of the invocation back. - invokePartial: function invokePartial(isDynamic, name, indent) { - var params = [], - options = this.setupParams(name, 1, params, false); - - if (isDynamic) { - name = this.popStack(); - delete options.name; - } - - if (indent) { - options.indent = JSON.stringify(indent); - } - options.helpers = 'helpers'; - options.partials = 'partials'; - - if (!isDynamic) { - params.unshift(this.nameLookup('partials', name, 'partial')); - } else { - params.unshift(name); - } - - if (this.options.compat) { - options.depths = 'depths'; - } - options = this.objectLiteral(options); - params.push(options); - - this.push(this.source.functionCall('this.invokePartial', '', params)); - }, - - // [assignToHash] - // - // On stack, before: value, ..., hash, ... - // On stack, after: ..., hash, ... - // - // Pops a value off the stack and assigns it to the current hash - assignToHash: function assignToHash(key) { - var value = this.popStack(), - context = undefined, - type = undefined, - id = undefined; - - if (this.trackIds) { - id = this.popStack(); - } - if (this.stringParams) { - type = this.popStack(); - context = this.popStack(); - } - - var hash = this.hash; - if (context) { - hash.contexts[key] = context; - } - if (type) { - hash.types[key] = type; - } - if (id) { - hash.ids[key] = id; - } - hash.values[key] = value; - }, - - pushId: function pushId(type, name, child) { - if (type === 'BlockParam') { - this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : '')); - } else if (type === 'PathExpression') { - this.pushString(name); - } else if (type === 'SubExpression') { - this.pushStackLiteral('true'); - } else { - this.pushStackLiteral('null'); - } - }, - - // HELPERS - - compiler: JavaScriptCompiler, - - compileChildren: function compileChildren(environment, options) { - var children = environment.children, - child = undefined, - compiler = undefined; - - for (var i = 0, l = children.length; i < l; i++) { - child = children[i]; - compiler = new this.compiler(); // eslint-disable-line new-cap - - var index = this.matchExistingProgram(child); - - if (index == null) { - this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children - index = this.context.programs.length; - child.index = index; - child.name = 'program' + index; - this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); - this.context.environments[index] = child; - - this.useDepths = this.useDepths || compiler.useDepths; - this.useBlockParams = this.useBlockParams || compiler.useBlockParams; - } else { - child.index = index; - child.name = 'program' + index; - - this.useDepths = this.useDepths || child.useDepths; - this.useBlockParams = this.useBlockParams || child.useBlockParams; - } - } - }, - matchExistingProgram: function matchExistingProgram(child) { - for (var i = 0, len = this.context.environments.length; i < len; i++) { - var environment = this.context.environments[i]; - if (environment && environment.equals(child)) { - return i; - } - } - }, - - programExpression: function programExpression(guid) { - var child = this.environment.children[guid], - programParams = [child.index, 'data', child.blockParams]; - - if (this.useBlockParams || this.useDepths) { - programParams.push('blockParams'); - } - if (this.useDepths) { - programParams.push('depths'); - } - - return 'this.program(' + programParams.join(', ') + ')'; - }, - - useRegister: function useRegister(name) { - if (!this.registers[name]) { - this.registers[name] = true; - this.registers.list.push(name); - } - }, - - push: function push(expr) { - if (!(expr instanceof Literal)) { - expr = this.source.wrap(expr); - } - - this.inlineStack.push(expr); - return expr; - }, - - pushStackLiteral: function pushStackLiteral(item) { - this.push(new Literal(item)); - }, - - pushSource: function pushSource(source) { - if (this.pendingContent) { - this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); - this.pendingContent = undefined; - } - - if (source) { - this.source.push(source); - } - }, - - replaceStack: function replaceStack(callback) { - var prefix = ['('], - stack = undefined, - createdStack = undefined, - usedLiteral = undefined; - - /* istanbul ignore next */ - if (!this.isInline()) { - throw new _Exception2['default']('replaceStack on non-inline'); - } - - // We want to merge the inline statement into the replacement statement via ',' - var top = this.popStack(true); - - if (top instanceof Literal) { - // Literals do not need to be inlined - stack = [top.value]; - prefix = ['(', stack]; - usedLiteral = true; - } else { - // Get or create the current stack name for use by the inline - createdStack = true; - var _name = this.incrStack(); - - prefix = ['((', this.push(_name), ' = ', top, ')']; - stack = this.topStack(); - } - - var item = callback.call(this, stack); - - if (!usedLiteral) { - this.popStack(); - } - if (createdStack) { - this.stackSlot--; - } - this.push(prefix.concat(item, ')')); - }, - - incrStack: function incrStack() { - this.stackSlot++; - if (this.stackSlot > this.stackVars.length) { - this.stackVars.push('stack' + this.stackSlot); - } - return this.topStackName(); - }, - topStackName: function topStackName() { - return 'stack' + this.stackSlot; - }, - flushInline: function flushInline() { - var inlineStack = this.inlineStack; - this.inlineStack = []; - for (var i = 0, len = inlineStack.length; i < len; i++) { - var entry = inlineStack[i]; - /* istanbul ignore if */ - if (entry instanceof Literal) { - this.compileStack.push(entry); - } else { - var stack = this.incrStack(); - this.pushSource([stack, ' = ', entry, ';']); - this.compileStack.push(stack); - } - } - }, - isInline: function isInline() { - return this.inlineStack.length; - }, - - popStack: function popStack(wrapped) { - var inline = this.isInline(), - item = (inline ? this.inlineStack : this.compileStack).pop(); - - if (!wrapped && item instanceof Literal) { - return item.value; - } else { - if (!inline) { - /* istanbul ignore next */ - if (!this.stackSlot) { - throw new _Exception2['default']('Invalid stack pop'); - } - this.stackSlot--; - } - return item; - } - }, - - topStack: function topStack() { - var stack = this.isInline() ? this.inlineStack : this.compileStack, - item = stack[stack.length - 1]; - - /* istanbul ignore if */ - if (item instanceof Literal) { - return item.value; - } else { - return item; - } - }, - - contextName: function contextName(context) { - if (this.useDepths && context) { - return 'depths[' + context + ']'; - } else { - return 'depth' + context; - } - }, - - quotedString: function quotedString(str) { - return this.source.quotedString(str); - }, - - objectLiteral: function objectLiteral(obj) { - return this.source.objectLiteral(obj); - }, - - aliasable: function aliasable(name) { - var ret = this.aliases[name]; - if (ret) { - ret.referenceCount++; - return ret; - } - - ret = this.aliases[name] = this.source.wrap(name); - ret.aliasable = true; - ret.referenceCount = 1; - - return ret; - }, - - setupHelper: function setupHelper(paramSize, name, blockHelper) { - var params = [], - paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); - var foundHelper = this.nameLookup('helpers', name, 'helper'); - - return { - params: params, - paramsInit: paramsInit, - name: foundHelper, - callParams: [this.contextName(0)].concat(params) - }; - }, - - setupParams: function setupParams(helper, paramSize, params) { - var options = {}, - contexts = [], - types = [], - ids = [], - param = undefined; - - options.name = this.quotedString(helper); - options.hash = this.popStack(); - - if (this.trackIds) { - options.hashIds = this.popStack(); - } - if (this.stringParams) { - options.hashTypes = this.popStack(); - options.hashContexts = this.popStack(); - } - - var inverse = this.popStack(), - program = this.popStack(); - - // Avoid setting fn and inverse if neither are set. This allows - // helpers to do a check for `if (options.fn)` - if (program || inverse) { - options.fn = program || 'this.noop'; - options.inverse = inverse || 'this.noop'; - } - - // The parameters go on to the stack in order (making sure that they are evaluated in order) - // so we need to pop them off the stack in reverse order - var i = paramSize; - while (i--) { - param = this.popStack(); - params[i] = param; - - if (this.trackIds) { - ids[i] = this.popStack(); - } - if (this.stringParams) { - types[i] = this.popStack(); - contexts[i] = this.popStack(); - } - } - - if (this.trackIds) { - options.ids = this.source.generateArray(ids); - } - if (this.stringParams) { - options.types = this.source.generateArray(types); - options.contexts = this.source.generateArray(contexts); - } - - if (this.options.data) { - options.data = 'data'; - } - if (this.useBlockParams) { - options.blockParams = 'blockParams'; - } - return options; - }, - - setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) { - var options = this.setupParams(helper, paramSize, params, true); - options = this.objectLiteral(options); - if (useRegister) { - this.useRegister('options'); - params.push('options'); - return ['options=', options]; - } else { - params.push(options); - return ''; - } - } -}; - -(function () { - var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' '); - - var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; - - for (var i = 0, l = reservedWords.length; i < l; i++) { - compilerWords[reservedWords[i]] = true; - } -})(); - -JavaScriptCompiler.isValidJavaScriptVariableName = function (name) { - return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name); -}; - -function strictLookup(requireTerminal, compiler, parts, type) { - var stack = compiler.popStack(), - i = 0, - len = parts.length; - if (requireTerminal) { - len--; - } - - for (; i < len; i++) { - stack = compiler.nameLookup(stack, parts[i], type); - } - - if (requireTerminal) { - return [compiler.aliasable('this.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')']; - } else { - return stack; - } -} - -exports['default'] = JavaScriptCompiler; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js deleted file mode 100644 index c942f58..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js +++ /dev/null @@ -1,678 +0,0 @@ -"use strict"; - -exports.__esModule = true; -/* istanbul ignore next */ -/* Jison generated parser */ -var handlebars = (function () { - var parser = { trace: function trace() {}, - yy: {}, - symbols_: { error: 2, root: 3, program: 4, EOF: 5, program_repetition0: 6, statement: 7, mustache: 8, block: 9, rawBlock: 10, partial: 11, content: 12, COMMENT: 13, CONTENT: 14, openRawBlock: 15, END_RAW_BLOCK: 16, OPEN_RAW_BLOCK: 17, helperName: 18, openRawBlock_repetition0: 19, openRawBlock_option0: 20, CLOSE_RAW_BLOCK: 21, openBlock: 22, block_option0: 23, closeBlock: 24, openInverse: 25, block_option1: 26, OPEN_BLOCK: 27, openBlock_repetition0: 28, openBlock_option0: 29, openBlock_option1: 30, CLOSE: 31, OPEN_INVERSE: 32, openInverse_repetition0: 33, openInverse_option0: 34, openInverse_option1: 35, openInverseChain: 36, OPEN_INVERSE_CHAIN: 37, openInverseChain_repetition0: 38, openInverseChain_option0: 39, openInverseChain_option1: 40, inverseAndProgram: 41, INVERSE: 42, inverseChain: 43, inverseChain_option0: 44, OPEN_ENDBLOCK: 45, OPEN: 46, mustache_repetition0: 47, mustache_option0: 48, OPEN_UNESCAPED: 49, mustache_repetition1: 50, mustache_option1: 51, CLOSE_UNESCAPED: 52, OPEN_PARTIAL: 53, partialName: 54, partial_repetition0: 55, partial_option0: 56, param: 57, sexpr: 58, OPEN_SEXPR: 59, sexpr_repetition0: 60, sexpr_option0: 61, CLOSE_SEXPR: 62, hash: 63, hash_repetition_plus0: 64, hashSegment: 65, ID: 66, EQUALS: 67, blockParams: 68, OPEN_BLOCK_PARAMS: 69, blockParams_repetition_plus0: 70, CLOSE_BLOCK_PARAMS: 71, path: 72, dataName: 73, STRING: 74, NUMBER: 75, BOOLEAN: 76, UNDEFINED: 77, NULL: 78, DATA: 79, pathSegments: 80, SEP: 81, $accept: 0, $end: 1 }, - terminals_: { 2: "error", 5: "EOF", 13: "COMMENT", 14: "CONTENT", 16: "END_RAW_BLOCK", 17: "OPEN_RAW_BLOCK", 21: "CLOSE_RAW_BLOCK", 27: "OPEN_BLOCK", 31: "CLOSE", 32: "OPEN_INVERSE", 37: "OPEN_INVERSE_CHAIN", 42: "INVERSE", 45: "OPEN_ENDBLOCK", 46: "OPEN", 49: "OPEN_UNESCAPED", 52: "CLOSE_UNESCAPED", 53: "OPEN_PARTIAL", 59: "OPEN_SEXPR", 62: "CLOSE_SEXPR", 66: "ID", 67: "EQUALS", 69: "OPEN_BLOCK_PARAMS", 71: "CLOSE_BLOCK_PARAMS", 74: "STRING", 75: "NUMBER", 76: "BOOLEAN", 77: "UNDEFINED", 78: "NULL", 79: "DATA", 81: "SEP" }, - productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [12, 1], [10, 3], [15, 5], [9, 4], [9, 4], [22, 6], [25, 6], [36, 6], [41, 2], [43, 3], [43, 1], [24, 3], [8, 5], [8, 5], [11, 5], [57, 1], [57, 1], [58, 5], [63, 1], [65, 3], [68, 3], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [54, 1], [54, 1], [73, 2], [72, 1], [80, 3], [80, 1], [6, 0], [6, 2], [19, 0], [19, 2], [20, 0], [20, 1], [23, 0], [23, 1], [26, 0], [26, 1], [28, 0], [28, 2], [29, 0], [29, 1], [30, 0], [30, 1], [33, 0], [33, 2], [34, 0], [34, 1], [35, 0], [35, 1], [38, 0], [38, 2], [39, 0], [39, 1], [40, 0], [40, 1], [44, 0], [44, 1], [47, 0], [47, 2], [48, 0], [48, 1], [50, 0], [50, 2], [51, 0], [51, 1], [55, 0], [55, 2], [56, 0], [56, 1], [60, 0], [60, 2], [61, 0], [61, 1], [64, 1], [64, 2], [70, 1], [70, 2]], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { - - var $0 = $$.length - 1; - switch (yystate) { - case 1: - return $$[$0 - 1]; - break; - case 2: - this.$ = new yy.Program($$[$0], null, {}, yy.locInfo(this._$)); - break; - case 3: - this.$ = $$[$0]; - break; - case 4: - this.$ = $$[$0]; - break; - case 5: - this.$ = $$[$0]; - break; - case 6: - this.$ = $$[$0]; - break; - case 7: - this.$ = $$[$0]; - break; - case 8: - this.$ = new yy.CommentStatement(yy.stripComment($$[$0]), yy.stripFlags($$[$0], $$[$0]), yy.locInfo(this._$)); - break; - case 9: - this.$ = new yy.ContentStatement($$[$0], yy.locInfo(this._$)); - break; - case 10: - this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); - break; - case 11: - this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] }; - break; - case 12: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$); - break; - case 13: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$); - break; - case 14: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 15: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 16: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 17: - this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] }; - break; - case 18: - var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$), - program = new yy.Program([inverse], null, {}, yy.locInfo(this._$)); - program.chained = true; - - this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true }; - - break; - case 19: - this.$ = $$[$0]; - break; - case 20: - this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) }; - break; - case 21: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 22: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 23: - this.$ = new yy.PartialStatement($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.stripFlags($$[$0 - 4], $$[$0]), yy.locInfo(this._$)); - break; - case 24: - this.$ = $$[$0]; - break; - case 25: - this.$ = $$[$0]; - break; - case 26: - this.$ = new yy.SubExpression($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.locInfo(this._$)); - break; - case 27: - this.$ = new yy.Hash($$[$0], yy.locInfo(this._$)); - break; - case 28: - this.$ = new yy.HashPair(yy.id($$[$0 - 2]), $$[$0], yy.locInfo(this._$)); - break; - case 29: - this.$ = yy.id($$[$0 - 1]); - break; - case 30: - this.$ = $$[$0]; - break; - case 31: - this.$ = $$[$0]; - break; - case 32: - this.$ = new yy.StringLiteral($$[$0], yy.locInfo(this._$)); - break; - case 33: - this.$ = new yy.NumberLiteral($$[$0], yy.locInfo(this._$)); - break; - case 34: - this.$ = new yy.BooleanLiteral($$[$0], yy.locInfo(this._$)); - break; - case 35: - this.$ = new yy.UndefinedLiteral(yy.locInfo(this._$)); - break; - case 36: - this.$ = new yy.NullLiteral(yy.locInfo(this._$)); - break; - case 37: - this.$ = $$[$0]; - break; - case 38: - this.$ = $$[$0]; - break; - case 39: - this.$ = yy.preparePath(true, $$[$0], this._$); - break; - case 40: - this.$ = yy.preparePath(false, $$[$0], this._$); - break; - case 41: - $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2]; - break; - case 42: - this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }]; - break; - case 43: - this.$ = []; - break; - case 44: - $$[$0 - 1].push($$[$0]); - break; - case 45: - this.$ = []; - break; - case 46: - $$[$0 - 1].push($$[$0]); - break; - case 53: - this.$ = []; - break; - case 54: - $$[$0 - 1].push($$[$0]); - break; - case 59: - this.$ = []; - break; - case 60: - $$[$0 - 1].push($$[$0]); - break; - case 65: - this.$ = []; - break; - case 66: - $$[$0 - 1].push($$[$0]); - break; - case 73: - this.$ = []; - break; - case 74: - $$[$0 - 1].push($$[$0]); - break; - case 77: - this.$ = []; - break; - case 78: - $$[$0 - 1].push($$[$0]); - break; - case 81: - this.$ = []; - break; - case 82: - $$[$0 - 1].push($$[$0]); - break; - case 85: - this.$ = []; - break; - case 86: - $$[$0 - 1].push($$[$0]); - break; - case 89: - this.$ = [$$[$0]]; - break; - case 90: - $$[$0 - 1].push($$[$0]); - break; - case 91: - this.$ = [$$[$0]]; - break; - case 92: - $$[$0 - 1].push($$[$0]); - break; - } - }, - table: [{ 3: 1, 4: 2, 5: [2, 43], 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: [1, 11], 14: [1, 18], 15: 16, 17: [1, 21], 22: 14, 25: 15, 27: [1, 19], 32: [1, 20], 37: [2, 2], 42: [2, 2], 45: [2, 2], 46: [1, 12], 49: [1, 13], 53: [1, 17] }, { 1: [2, 1] }, { 5: [2, 44], 13: [2, 44], 14: [2, 44], 17: [2, 44], 27: [2, 44], 32: [2, 44], 37: [2, 44], 42: [2, 44], 45: [2, 44], 46: [2, 44], 49: [2, 44], 53: [2, 44] }, { 5: [2, 3], 13: [2, 3], 14: [2, 3], 17: [2, 3], 27: [2, 3], 32: [2, 3], 37: [2, 3], 42: [2, 3], 45: [2, 3], 46: [2, 3], 49: [2, 3], 53: [2, 3] }, { 5: [2, 4], 13: [2, 4], 14: [2, 4], 17: [2, 4], 27: [2, 4], 32: [2, 4], 37: [2, 4], 42: [2, 4], 45: [2, 4], 46: [2, 4], 49: [2, 4], 53: [2, 4] }, { 5: [2, 5], 13: [2, 5], 14: [2, 5], 17: [2, 5], 27: [2, 5], 32: [2, 5], 37: [2, 5], 42: [2, 5], 45: [2, 5], 46: [2, 5], 49: [2, 5], 53: [2, 5] }, { 5: [2, 6], 13: [2, 6], 14: [2, 6], 17: [2, 6], 27: [2, 6], 32: [2, 6], 37: [2, 6], 42: [2, 6], 45: [2, 6], 46: [2, 6], 49: [2, 6], 53: [2, 6] }, { 5: [2, 7], 13: [2, 7], 14: [2, 7], 17: [2, 7], 27: [2, 7], 32: [2, 7], 37: [2, 7], 42: [2, 7], 45: [2, 7], 46: [2, 7], 49: [2, 7], 53: [2, 7] }, { 5: [2, 8], 13: [2, 8], 14: [2, 8], 17: [2, 8], 27: [2, 8], 32: [2, 8], 37: [2, 8], 42: [2, 8], 45: [2, 8], 46: [2, 8], 49: [2, 8], 53: [2, 8] }, { 18: 22, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 33, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 34, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 4: 35, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 12: 36, 14: [1, 18] }, { 18: 38, 54: 37, 58: 39, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 9], 13: [2, 9], 14: [2, 9], 16: [2, 9], 17: [2, 9], 27: [2, 9], 32: [2, 9], 37: [2, 9], 42: [2, 9], 45: [2, 9], 46: [2, 9], 49: [2, 9], 53: [2, 9] }, { 18: 41, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 42, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 43, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [2, 73], 47: 44, 59: [2, 73], 66: [2, 73], 74: [2, 73], 75: [2, 73], 76: [2, 73], 77: [2, 73], 78: [2, 73], 79: [2, 73] }, { 21: [2, 30], 31: [2, 30], 52: [2, 30], 59: [2, 30], 62: [2, 30], 66: [2, 30], 69: [2, 30], 74: [2, 30], 75: [2, 30], 76: [2, 30], 77: [2, 30], 78: [2, 30], 79: [2, 30] }, { 21: [2, 31], 31: [2, 31], 52: [2, 31], 59: [2, 31], 62: [2, 31], 66: [2, 31], 69: [2, 31], 74: [2, 31], 75: [2, 31], 76: [2, 31], 77: [2, 31], 78: [2, 31], 79: [2, 31] }, { 21: [2, 32], 31: [2, 32], 52: [2, 32], 59: [2, 32], 62: [2, 32], 66: [2, 32], 69: [2, 32], 74: [2, 32], 75: [2, 32], 76: [2, 32], 77: [2, 32], 78: [2, 32], 79: [2, 32] }, { 21: [2, 33], 31: [2, 33], 52: [2, 33], 59: [2, 33], 62: [2, 33], 66: [2, 33], 69: [2, 33], 74: [2, 33], 75: [2, 33], 76: [2, 33], 77: [2, 33], 78: [2, 33], 79: [2, 33] }, { 21: [2, 34], 31: [2, 34], 52: [2, 34], 59: [2, 34], 62: [2, 34], 66: [2, 34], 69: [2, 34], 74: [2, 34], 75: [2, 34], 76: [2, 34], 77: [2, 34], 78: [2, 34], 79: [2, 34] }, { 21: [2, 35], 31: [2, 35], 52: [2, 35], 59: [2, 35], 62: [2, 35], 66: [2, 35], 69: [2, 35], 74: [2, 35], 75: [2, 35], 76: [2, 35], 77: [2, 35], 78: [2, 35], 79: [2, 35] }, { 21: [2, 36], 31: [2, 36], 52: [2, 36], 59: [2, 36], 62: [2, 36], 66: [2, 36], 69: [2, 36], 74: [2, 36], 75: [2, 36], 76: [2, 36], 77: [2, 36], 78: [2, 36], 79: [2, 36] }, { 21: [2, 40], 31: [2, 40], 52: [2, 40], 59: [2, 40], 62: [2, 40], 66: [2, 40], 69: [2, 40], 74: [2, 40], 75: [2, 40], 76: [2, 40], 77: [2, 40], 78: [2, 40], 79: [2, 40], 81: [1, 45] }, { 66: [1, 32], 80: 46 }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 50: 47, 52: [2, 77], 59: [2, 77], 66: [2, 77], 74: [2, 77], 75: [2, 77], 76: [2, 77], 77: [2, 77], 78: [2, 77], 79: [2, 77] }, { 23: 48, 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 49, 45: [2, 49] }, { 26: 54, 41: 55, 42: [1, 53], 45: [2, 51] }, { 16: [1, 56] }, { 31: [2, 81], 55: 57, 59: [2, 81], 66: [2, 81], 74: [2, 81], 75: [2, 81], 76: [2, 81], 77: [2, 81], 78: [2, 81], 79: [2, 81] }, { 31: [2, 37], 59: [2, 37], 66: [2, 37], 74: [2, 37], 75: [2, 37], 76: [2, 37], 77: [2, 37], 78: [2, 37], 79: [2, 37] }, { 31: [2, 38], 59: [2, 38], 66: [2, 38], 74: [2, 38], 75: [2, 38], 76: [2, 38], 77: [2, 38], 78: [2, 38], 79: [2, 38] }, { 18: 58, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 28: 59, 31: [2, 53], 59: [2, 53], 66: [2, 53], 69: [2, 53], 74: [2, 53], 75: [2, 53], 76: [2, 53], 77: [2, 53], 78: [2, 53], 79: [2, 53] }, { 31: [2, 59], 33: 60, 59: [2, 59], 66: [2, 59], 69: [2, 59], 74: [2, 59], 75: [2, 59], 76: [2, 59], 77: [2, 59], 78: [2, 59], 79: [2, 59] }, { 19: 61, 21: [2, 45], 59: [2, 45], 66: [2, 45], 74: [2, 45], 75: [2, 45], 76: [2, 45], 77: [2, 45], 78: [2, 45], 79: [2, 45] }, { 18: 65, 31: [2, 75], 48: 62, 57: 63, 58: 66, 59: [1, 40], 63: 64, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 66: [1, 70] }, { 21: [2, 39], 31: [2, 39], 52: [2, 39], 59: [2, 39], 62: [2, 39], 66: [2, 39], 69: [2, 39], 74: [2, 39], 75: [2, 39], 76: [2, 39], 77: [2, 39], 78: [2, 39], 79: [2, 39], 81: [1, 45] }, { 18: 65, 51: 71, 52: [2, 79], 57: 72, 58: 66, 59: [1, 40], 63: 73, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 24: 74, 45: [1, 75] }, { 45: [2, 50] }, { 4: 76, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 45: [2, 19] }, { 18: 77, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 78, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 24: 79, 45: [1, 75] }, { 45: [2, 52] }, { 5: [2, 10], 13: [2, 10], 14: [2, 10], 17: [2, 10], 27: [2, 10], 32: [2, 10], 37: [2, 10], 42: [2, 10], 45: [2, 10], 46: [2, 10], 49: [2, 10], 53: [2, 10] }, { 18: 65, 31: [2, 83], 56: 80, 57: 81, 58: 66, 59: [1, 40], 63: 82, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 59: [2, 85], 60: 83, 62: [2, 85], 66: [2, 85], 74: [2, 85], 75: [2, 85], 76: [2, 85], 77: [2, 85], 78: [2, 85], 79: [2, 85] }, { 18: 65, 29: 84, 31: [2, 55], 57: 85, 58: 66, 59: [1, 40], 63: 86, 64: 67, 65: 68, 66: [1, 69], 69: [2, 55], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 31: [2, 61], 34: 87, 57: 88, 58: 66, 59: [1, 40], 63: 89, 64: 67, 65: 68, 66: [1, 69], 69: [2, 61], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 20: 90, 21: [2, 47], 57: 91, 58: 66, 59: [1, 40], 63: 92, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [1, 93] }, { 31: [2, 74], 59: [2, 74], 66: [2, 74], 74: [2, 74], 75: [2, 74], 76: [2, 74], 77: [2, 74], 78: [2, 74], 79: [2, 74] }, { 31: [2, 76] }, { 21: [2, 24], 31: [2, 24], 52: [2, 24], 59: [2, 24], 62: [2, 24], 66: [2, 24], 69: [2, 24], 74: [2, 24], 75: [2, 24], 76: [2, 24], 77: [2, 24], 78: [2, 24], 79: [2, 24] }, { 21: [2, 25], 31: [2, 25], 52: [2, 25], 59: [2, 25], 62: [2, 25], 66: [2, 25], 69: [2, 25], 74: [2, 25], 75: [2, 25], 76: [2, 25], 77: [2, 25], 78: [2, 25], 79: [2, 25] }, { 21: [2, 27], 31: [2, 27], 52: [2, 27], 62: [2, 27], 65: 94, 66: [1, 95], 69: [2, 27] }, { 21: [2, 89], 31: [2, 89], 52: [2, 89], 62: [2, 89], 66: [2, 89], 69: [2, 89] }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 67: [1, 96], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 21: [2, 41], 31: [2, 41], 52: [2, 41], 59: [2, 41], 62: [2, 41], 66: [2, 41], 69: [2, 41], 74: [2, 41], 75: [2, 41], 76: [2, 41], 77: [2, 41], 78: [2, 41], 79: [2, 41], 81: [2, 41] }, { 52: [1, 97] }, { 52: [2, 78], 59: [2, 78], 66: [2, 78], 74: [2, 78], 75: [2, 78], 76: [2, 78], 77: [2, 78], 78: [2, 78], 79: [2, 78] }, { 52: [2, 80] }, { 5: [2, 12], 13: [2, 12], 14: [2, 12], 17: [2, 12], 27: [2, 12], 32: [2, 12], 37: [2, 12], 42: [2, 12], 45: [2, 12], 46: [2, 12], 49: [2, 12], 53: [2, 12] }, { 18: 98, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 100, 44: 99, 45: [2, 71] }, { 31: [2, 65], 38: 101, 59: [2, 65], 66: [2, 65], 69: [2, 65], 74: [2, 65], 75: [2, 65], 76: [2, 65], 77: [2, 65], 78: [2, 65], 79: [2, 65] }, { 45: [2, 17] }, { 5: [2, 13], 13: [2, 13], 14: [2, 13], 17: [2, 13], 27: [2, 13], 32: [2, 13], 37: [2, 13], 42: [2, 13], 45: [2, 13], 46: [2, 13], 49: [2, 13], 53: [2, 13] }, { 31: [1, 102] }, { 31: [2, 82], 59: [2, 82], 66: [2, 82], 74: [2, 82], 75: [2, 82], 76: [2, 82], 77: [2, 82], 78: [2, 82], 79: [2, 82] }, { 31: [2, 84] }, { 18: 65, 57: 104, 58: 66, 59: [1, 40], 61: 103, 62: [2, 87], 63: 105, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 30: 106, 31: [2, 57], 68: 107, 69: [1, 108] }, { 31: [2, 54], 59: [2, 54], 66: [2, 54], 69: [2, 54], 74: [2, 54], 75: [2, 54], 76: [2, 54], 77: [2, 54], 78: [2, 54], 79: [2, 54] }, { 31: [2, 56], 69: [2, 56] }, { 31: [2, 63], 35: 109, 68: 110, 69: [1, 108] }, { 31: [2, 60], 59: [2, 60], 66: [2, 60], 69: [2, 60], 74: [2, 60], 75: [2, 60], 76: [2, 60], 77: [2, 60], 78: [2, 60], 79: [2, 60] }, { 31: [2, 62], 69: [2, 62] }, { 21: [1, 111] }, { 21: [2, 46], 59: [2, 46], 66: [2, 46], 74: [2, 46], 75: [2, 46], 76: [2, 46], 77: [2, 46], 78: [2, 46], 79: [2, 46] }, { 21: [2, 48] }, { 5: [2, 21], 13: [2, 21], 14: [2, 21], 17: [2, 21], 27: [2, 21], 32: [2, 21], 37: [2, 21], 42: [2, 21], 45: [2, 21], 46: [2, 21], 49: [2, 21], 53: [2, 21] }, { 21: [2, 90], 31: [2, 90], 52: [2, 90], 62: [2, 90], 66: [2, 90], 69: [2, 90] }, { 67: [1, 96] }, { 18: 65, 57: 112, 58: 66, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 22], 13: [2, 22], 14: [2, 22], 17: [2, 22], 27: [2, 22], 32: [2, 22], 37: [2, 22], 42: [2, 22], 45: [2, 22], 46: [2, 22], 49: [2, 22], 53: [2, 22] }, { 31: [1, 113] }, { 45: [2, 18] }, { 45: [2, 72] }, { 18: 65, 31: [2, 67], 39: 114, 57: 115, 58: 66, 59: [1, 40], 63: 116, 64: 67, 65: 68, 66: [1, 69], 69: [2, 67], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 23], 13: [2, 23], 14: [2, 23], 17: [2, 23], 27: [2, 23], 32: [2, 23], 37: [2, 23], 42: [2, 23], 45: [2, 23], 46: [2, 23], 49: [2, 23], 53: [2, 23] }, { 62: [1, 117] }, { 59: [2, 86], 62: [2, 86], 66: [2, 86], 74: [2, 86], 75: [2, 86], 76: [2, 86], 77: [2, 86], 78: [2, 86], 79: [2, 86] }, { 62: [2, 88] }, { 31: [1, 118] }, { 31: [2, 58] }, { 66: [1, 120], 70: 119 }, { 31: [1, 121] }, { 31: [2, 64] }, { 14: [2, 11] }, { 21: [2, 28], 31: [2, 28], 52: [2, 28], 62: [2, 28], 66: [2, 28], 69: [2, 28] }, { 5: [2, 20], 13: [2, 20], 14: [2, 20], 17: [2, 20], 27: [2, 20], 32: [2, 20], 37: [2, 20], 42: [2, 20], 45: [2, 20], 46: [2, 20], 49: [2, 20], 53: [2, 20] }, { 31: [2, 69], 40: 122, 68: 123, 69: [1, 108] }, { 31: [2, 66], 59: [2, 66], 66: [2, 66], 69: [2, 66], 74: [2, 66], 75: [2, 66], 76: [2, 66], 77: [2, 66], 78: [2, 66], 79: [2, 66] }, { 31: [2, 68], 69: [2, 68] }, { 21: [2, 26], 31: [2, 26], 52: [2, 26], 59: [2, 26], 62: [2, 26], 66: [2, 26], 69: [2, 26], 74: [2, 26], 75: [2, 26], 76: [2, 26], 77: [2, 26], 78: [2, 26], 79: [2, 26] }, { 13: [2, 14], 14: [2, 14], 17: [2, 14], 27: [2, 14], 32: [2, 14], 37: [2, 14], 42: [2, 14], 45: [2, 14], 46: [2, 14], 49: [2, 14], 53: [2, 14] }, { 66: [1, 125], 71: [1, 124] }, { 66: [2, 91], 71: [2, 91] }, { 13: [2, 15], 14: [2, 15], 17: [2, 15], 27: [2, 15], 32: [2, 15], 42: [2, 15], 45: [2, 15], 46: [2, 15], 49: [2, 15], 53: [2, 15] }, { 31: [1, 126] }, { 31: [2, 70] }, { 31: [2, 29] }, { 66: [2, 92], 71: [2, 92] }, { 13: [2, 16], 14: [2, 16], 17: [2, 16], 27: [2, 16], 32: [2, 16], 37: [2, 16], 42: [2, 16], 45: [2, 16], 46: [2, 16], 49: [2, 16], 53: [2, 16] }], - defaultActions: { 4: [2, 1], 49: [2, 50], 51: [2, 19], 55: [2, 52], 64: [2, 76], 73: [2, 80], 78: [2, 17], 82: [2, 84], 92: [2, 48], 99: [2, 18], 100: [2, 72], 105: [2, 88], 107: [2, 58], 110: [2, 64], 111: [2, 11], 123: [2, 70], 124: [2, 29] }, - parseError: function parseError(str, hash) { - throw new Error(str); - }, - parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], - lstack = [], - table = this.table, - yytext = "", - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - this.yy.parser = this; - if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - var ranges = this.lexer.options && this.lexer.options.ranges; - if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError; - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - function lex() { - var token; - token = self.lexer.lex() || 1; - if (typeof token !== "number") { - token = self.symbols_[token] || token; - } - return token; - } - var symbol, - preErrorSymbol, - state, - action, - a, - r, - yyval = {}, - p, - len, - newState, - expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == "undefined") { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === "undefined" || !action.length || !action[0]) { - var errStr = ""; - if (!recovering) { - expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected }); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; - if (ranges) { - yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; - } - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; - } - }; - /* Jison generated lexer */ - var lexer = (function () { - var lexer = { EOF: 1, - parseError: function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, - setInput: function setInput(input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ""; - this.conditionStack = ["INITIAL"]; - this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; - if (this.options.ranges) this.yylloc.range = [0, 0]; - this.offset = 0; - return this; - }, - input: function input() { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) this.yylloc.range[1]++; - - this._input = this._input.slice(1); - return ch; - }, - unput: function unput(ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); - - if (lines.length - 1) this.yylineno -= lines.length - 1; - var r = this.yylloc.range; - - this.yylloc = { first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - return this; - }, - more: function more() { - this._more = true; - return this; - }, - less: function less(n) { - this.unput(this.match.slice(n)); - }, - pastInput: function pastInput() { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); - }, - upcomingInput: function upcomingInput() { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20 - next.length); - } - return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); - }, - showPosition: function showPosition() { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, - next: function next() { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, match, tempMatch, index, col, lines; - if (!this._more) { - this.yytext = ""; - this.match = ""; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = { first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) this.done = false; - if (token) { - return token; - } else { - return; - } - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { text: "", token: null, line: this.yylineno }); - } - }, - lex: function lex() { - var r = this.next(); - if (typeof r !== "undefined") { - return r; - } else { - return this.lex(); - } - }, - begin: function begin(condition) { - this.conditionStack.push(condition); - }, - popState: function popState() { - return this.conditionStack.pop(); - }, - _currentRules: function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - }, - topState: function topState() { - return this.conditionStack[this.conditionStack.length - 2]; - }, - pushState: function begin(condition) { - this.begin(condition); - } }; - lexer.options = {}; - lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { - - function strip(start, end) { - return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end); - } - - var YYSTATE = YY_START; - switch ($avoiding_name_collisions) { - case 0: - if (yy_.yytext.slice(-2) === "\\\\") { - strip(0, 1); - this.begin("mu"); - } else if (yy_.yytext.slice(-1) === "\\") { - strip(0, 1); - this.begin("emu"); - } else { - this.begin("mu"); - } - if (yy_.yytext) { - return 14; - }break; - case 1: - return 14; - break; - case 2: - this.popState(); - return 14; - - break; - case 3: - yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9); - this.popState(); - return 16; - - break; - case 4: - return 14; - break; - case 5: - this.popState(); - return 13; - - break; - case 6: - return 59; - break; - case 7: - return 62; - break; - case 8: - return 17; - break; - case 9: - this.popState(); - this.begin("raw"); - return 21; - - break; - case 10: - return 53; - break; - case 11: - return 27; - break; - case 12: - return 45; - break; - case 13: - this.popState();return 42; - break; - case 14: - this.popState();return 42; - break; - case 15: - return 32; - break; - case 16: - return 37; - break; - case 17: - return 49; - break; - case 18: - return 46; - break; - case 19: - this.unput(yy_.yytext); - this.popState(); - this.begin("com"); - - break; - case 20: - this.popState(); - return 13; - - break; - case 21: - return 46; - break; - case 22: - return 67; - break; - case 23: - return 66; - break; - case 24: - return 66; - break; - case 25: - return 81; - break; - case 26: - // ignore whitespace - break; - case 27: - this.popState();return 52; - break; - case 28: - this.popState();return 31; - break; - case 29: - yy_.yytext = strip(1, 2).replace(/\\"/g, "\"");return 74; - break; - case 30: - yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 74; - break; - case 31: - return 79; - break; - case 32: - return 76; - break; - case 33: - return 76; - break; - case 34: - return 77; - break; - case 35: - return 78; - break; - case 36: - return 75; - break; - case 37: - return 69; - break; - case 38: - return 71; - break; - case 39: - return 66; - break; - case 40: - return 66; - break; - case 41: - return "INVALID"; - break; - case 42: - return 5; - break; - } - }; - lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]*?(?=(\{\{\{\{\/)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[[^\]]*\])/, /^(?:.)/, /^(?:$)/]; - lexer.conditions = { mu: { rules: [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], inclusive: false }, emu: { rules: [2], inclusive: false }, com: { rules: [5], inclusive: false }, raw: { rules: [3, 4], inclusive: false }, INITIAL: { rules: [0, 1, 42], inclusive: true } }; - return lexer; - })(); - parser.lexer = lexer; - function Parser() { - this.yy = {}; - }Parser.prototype = parser;parser.Parser = Parser; - return new Parser(); -})();exports["default"] = handlebars; -module.exports = exports["default"]; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/printer.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/printer.js deleted file mode 100644 index 8caebf6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/printer.js +++ /dev/null @@ -1,165 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; -exports.print = print; -exports.PrintVisitor = PrintVisitor; -/*eslint-disable new-cap */ - -var _Visitor = require('./visitor'); - -var _Visitor2 = _interopRequireWildcard(_Visitor); - -function print(ast) { - return new PrintVisitor().accept(ast); -} - -function PrintVisitor() { - this.padding = 0; -} - -PrintVisitor.prototype = new _Visitor2['default'](); - -PrintVisitor.prototype.pad = function (string) { - var out = ''; - - for (var i = 0, l = this.padding; i < l; i++) { - out = out + ' '; - } - - out = out + string + '\n'; - return out; -}; - -PrintVisitor.prototype.Program = function (program) { - var out = '', - body = program.body, - i = undefined, - l = undefined; - - if (program.blockParams) { - var blockParams = 'BLOCK PARAMS: ['; - for (i = 0, l = program.blockParams.length; i < l; i++) { - blockParams += ' ' + program.blockParams[i]; - } - blockParams += ' ]'; - out += this.pad(blockParams); - } - - for (i = 0, l = body.length; i < l; i++) { - out = out + this.accept(body[i]); - } - - this.padding--; - - return out; -}; - -PrintVisitor.prototype.MustacheStatement = function (mustache) { - return this.pad('{{ ' + this.SubExpression(mustache) + ' }}'); -}; - -PrintVisitor.prototype.BlockStatement = function (block) { - var out = ''; - - out = out + this.pad('BLOCK:'); - this.padding++; - out = out + this.pad(this.SubExpression(block)); - if (block.program) { - out = out + this.pad('PROGRAM:'); - this.padding++; - out = out + this.accept(block.program); - this.padding--; - } - if (block.inverse) { - if (block.program) { - this.padding++; - } - out = out + this.pad('{{^}}'); - this.padding++; - out = out + this.accept(block.inverse); - this.padding--; - if (block.program) { - this.padding--; - } - } - this.padding--; - - return out; -}; - -PrintVisitor.prototype.PartialStatement = function (partial) { - var content = 'PARTIAL:' + partial.name.original; - if (partial.params[0]) { - content += ' ' + this.accept(partial.params[0]); - } - if (partial.hash) { - content += ' ' + this.accept(partial.hash); - } - return this.pad('{{> ' + content + ' }}'); -}; - -PrintVisitor.prototype.ContentStatement = function (content) { - return this.pad('CONTENT[ \'' + content.value + '\' ]'); -}; - -PrintVisitor.prototype.CommentStatement = function (comment) { - return this.pad('{{! \'' + comment.value + '\' }}'); -}; - -PrintVisitor.prototype.SubExpression = function (sexpr) { - var params = sexpr.params, - paramStrings = [], - hash = undefined; - - for (var i = 0, l = params.length; i < l; i++) { - paramStrings.push(this.accept(params[i])); - } - - params = '[' + paramStrings.join(', ') + ']'; - - hash = sexpr.hash ? ' ' + this.accept(sexpr.hash) : ''; - - return this.accept(sexpr.path) + ' ' + params + hash; -}; - -PrintVisitor.prototype.PathExpression = function (id) { - var path = id.parts.join('/'); - return (id.data ? '@' : '') + 'PATH:' + path; -}; - -PrintVisitor.prototype.StringLiteral = function (string) { - return '"' + string.value + '"'; -}; - -PrintVisitor.prototype.NumberLiteral = function (number) { - return 'NUMBER{' + number.value + '}'; -}; - -PrintVisitor.prototype.BooleanLiteral = function (bool) { - return 'BOOLEAN{' + bool.value + '}'; -}; - -PrintVisitor.prototype.UndefinedLiteral = function () { - return 'UNDEFINED'; -}; - -PrintVisitor.prototype.NullLiteral = function () { - return 'NULL'; -}; - -PrintVisitor.prototype.Hash = function (hash) { - var pairs = hash.pairs, - joinedPairs = []; - - for (var i = 0, l = pairs.length; i < l; i++) { - joinedPairs.push(this.accept(pairs[i])); - } - - return 'HASH{' + joinedPairs.join(', ') + '}'; -}; -PrintVisitor.prototype.HashPair = function (pair) { - return pair.key + '=' + this.accept(pair.value); -}; -/*eslint-enable new-cap */ \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js deleted file mode 100644 index d5a909b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js +++ /dev/null @@ -1,132 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; - -var _Exception = require('../exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -var _AST = require('./ast'); - -var _AST2 = _interopRequireWildcard(_AST); - -function Visitor() { - this.parents = []; -} - -Visitor.prototype = { - constructor: Visitor, - mutating: false, - - // Visits a given value. If mutating, will replace the value if necessary. - acceptKey: function acceptKey(node, name) { - var value = this.accept(node[name]); - if (this.mutating) { - // Hacky sanity check: - if (value && (!value.type || !_AST2['default'][value.type])) { - throw new _Exception2['default']('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); - } - node[name] = value; - } - }, - - // Performs an accept operation with added sanity check to ensure - // required keys are not removed. - acceptRequired: function acceptRequired(node, name) { - this.acceptKey(node, name); - - if (!node[name]) { - throw new _Exception2['default'](node.type + ' requires ' + name); - } - }, - - // Traverses a given array. If mutating, empty respnses will be removed - // for child elements. - acceptArray: function acceptArray(array) { - for (var i = 0, l = array.length; i < l; i++) { - this.acceptKey(array, i); - - if (!array[i]) { - array.splice(i, 1); - i--; - l--; - } - } - }, - - accept: function accept(object) { - if (!object) { - return; - } - - if (this.current) { - this.parents.unshift(this.current); - } - this.current = object; - - var ret = this[object.type](object); - - this.current = this.parents.shift(); - - if (!this.mutating || ret) { - return ret; - } else if (ret !== false) { - return object; - } - }, - - Program: function Program(program) { - this.acceptArray(program.body); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.acceptRequired(mustache, 'path'); - this.acceptArray(mustache.params); - this.acceptKey(mustache, 'hash'); - }, - - BlockStatement: function BlockStatement(block) { - this.acceptRequired(block, 'path'); - this.acceptArray(block.params); - this.acceptKey(block, 'hash'); - - this.acceptKey(block, 'program'); - this.acceptKey(block, 'inverse'); - }, - - PartialStatement: function PartialStatement(partial) { - this.acceptRequired(partial, 'name'); - this.acceptArray(partial.params); - this.acceptKey(partial, 'hash'); - }, - - ContentStatement: function ContentStatement() {}, - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - this.acceptRequired(sexpr, 'path'); - this.acceptArray(sexpr.params); - this.acceptKey(sexpr, 'hash'); - }, - - PathExpression: function PathExpression() {}, - - StringLiteral: function StringLiteral() {}, - NumberLiteral: function NumberLiteral() {}, - BooleanLiteral: function BooleanLiteral() {}, - UndefinedLiteral: function UndefinedLiteral() {}, - NullLiteral: function NullLiteral() {}, - - Hash: function Hash(hash) { - this.acceptArray(hash.pairs); - }, - HashPair: function HashPair(pair) { - this.acceptRequired(pair, 'value'); - } -}; - -exports['default'] = Visitor; -module.exports = exports['default']; -/* content */ /* comment */ /* path */ /* string */ /* number */ /* bool */ /* literal */ /* literal */ \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js deleted file mode 100644 index a8bc936..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js +++ /dev/null @@ -1,212 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; - -var _Visitor = require('./visitor'); - -var _Visitor2 = _interopRequireWildcard(_Visitor); - -function WhitespaceControl() {} -WhitespaceControl.prototype = new _Visitor2['default'](); - -WhitespaceControl.prototype.Program = function (program) { - var isRoot = !this.isRootSeen; - this.isRootSeen = true; - - var body = program.body; - for (var i = 0, l = body.length; i < l; i++) { - var current = body[i], - strip = this.accept(current); - - if (!strip) { - continue; - } - - var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), - _isNextWhitespace = isNextWhitespace(body, i, isRoot), - openStandalone = strip.openStandalone && _isPrevWhitespace, - closeStandalone = strip.closeStandalone && _isNextWhitespace, - inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; - - if (strip.close) { - omitRight(body, i, true); - } - if (strip.open) { - omitLeft(body, i, true); - } - - if (inlineStandalone) { - omitRight(body, i); - - if (omitLeft(body, i)) { - // If we are on a standalone node, save the indent info for partials - if (current.type === 'PartialStatement') { - // Pull out the whitespace from the final line - current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1]; - } - } - } - if (openStandalone) { - omitRight((current.program || current.inverse).body); - - // Strip out the previous content node if it's whitespace only - omitLeft(body, i); - } - if (closeStandalone) { - // Always strip the next node - omitRight(body, i); - - omitLeft((current.inverse || current.program).body); - } - } - - return program; -}; -WhitespaceControl.prototype.BlockStatement = function (block) { - this.accept(block.program); - this.accept(block.inverse); - - // Find the inverse program that is involed with whitespace stripping. - var program = block.program || block.inverse, - inverse = block.program && block.inverse, - firstInverse = inverse, - lastInverse = inverse; - - if (inverse && inverse.chained) { - firstInverse = inverse.body[0].program; - - // Walk the inverse chain to find the last inverse that is actually in the chain. - while (lastInverse.chained) { - lastInverse = lastInverse.body[lastInverse.body.length - 1].program; - } - } - - var strip = { - open: block.openStrip.open, - close: block.closeStrip.close, - - // Determine the standalone candiacy. Basically flag our content as being possibly standalone - // so our parent can determine if we actually are standalone - openStandalone: isNextWhitespace(program.body), - closeStandalone: isPrevWhitespace((firstInverse || program).body) - }; - - if (block.openStrip.close) { - omitRight(program.body, null, true); - } - - if (inverse) { - var inverseStrip = block.inverseStrip; - - if (inverseStrip.open) { - omitLeft(program.body, null, true); - } - - if (inverseStrip.close) { - omitRight(firstInverse.body, null, true); - } - if (block.closeStrip.open) { - omitLeft(lastInverse.body, null, true); - } - - // Find standalone else statments - if (isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) { - omitLeft(program.body); - omitRight(firstInverse.body); - } - } else if (block.closeStrip.open) { - omitLeft(program.body, null, true); - } - - return strip; -}; - -WhitespaceControl.prototype.MustacheStatement = function (mustache) { - return mustache.strip; -}; - -WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) { - /* istanbul ignore next */ - var strip = node.strip || {}; - return { - inlineStandalone: true, - open: strip.open, - close: strip.close - }; -}; - -function isPrevWhitespace(body, i, isRoot) { - if (i === undefined) { - i = body.length; - } - - // Nodes that end with newlines are considered whitespace (but are special - // cased for strip operations) - var prev = body[i - 1], - sibling = body[i - 2]; - if (!prev) { - return isRoot; - } - - if (prev.type === 'ContentStatement') { - return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original); - } -} -function isNextWhitespace(body, i, isRoot) { - if (i === undefined) { - i = -1; - } - - var next = body[i + 1], - sibling = body[i + 2]; - if (!next) { - return isRoot; - } - - if (next.type === 'ContentStatement') { - return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original); - } -} - -// Marks the node to the right of the position as omitted. -// I.e. {{foo}}' ' will mark the ' ' node as omitted. -// -// If i is undefined, then the first child will be marked as such. -// -// If mulitple is truthy then all whitespace will be stripped out until non-whitespace -// content is met. -function omitRight(body, i, multiple) { - var current = body[i == null ? 0 : i + 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) { - return; - } - - var original = current.value; - current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, ''); - current.rightStripped = current.value !== original; -} - -// Marks the node to the left of the position as omitted. -// I.e. ' '{{foo}} will mark the ' ' node as omitted. -// -// If i is undefined then the last child will be marked as such. -// -// If mulitple is truthy then all whitespace will be stripped out until non-whitespace -// content is met. -function omitLeft(body, i, multiple) { - var current = body[i == null ? body.length - 1 : i - 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) { - return; - } - - // We omit the last node if it's whitespace only and not preceeded by a non-content node. - var original = current.value; - current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, ''); - current.leftStripped = current.value !== original; - return current.leftStripped; -} - -exports['default'] = WhitespaceControl; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/exception.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/exception.js deleted file mode 100644 index 9bf550a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/exception.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -exports.__esModule = true; - -var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - -function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } -} - -Exception.prototype = new Error(); - -exports['default'] = Exception; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/no-conflict.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/no-conflict.js deleted file mode 100644 index 149e421..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/no-conflict.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -exports.__esModule = true; -/*global window */ - -exports['default'] = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; -}; - -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/runtime.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/runtime.js deleted file mode 100644 index 188ac80..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/runtime.js +++ /dev/null @@ -1,232 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; -exports.checkRevision = checkRevision; - -// TODO: Remove this line and break up compilePartial - -exports.template = template; -exports.wrapProgram = wrapProgram; -exports.resolvePartial = resolvePartial; -exports.invokePartial = invokePartial; -exports.noop = noop; - -var _import = require('./utils'); - -var Utils = _interopRequireWildcard(_import); - -var _Exception = require('./exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -var _COMPILER_REVISION$REVISION_CHANGES$createFrame = require('./base'); - -function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _COMPILER_REVISION$REVISION_CHANGES$createFrame.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[currentRevision], - compilerVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[compilerRevision]; - throw new _Exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _Exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } -} - -function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _Exception2['default']('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _Exception2['default']('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = Utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _Exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _Exception2['default']('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: Utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - return templateSpec[i]; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = Utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _Exception2['default']('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _Exception2['default']('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; -} - -function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; -} - -function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; -} - -function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new _Exception2['default']('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } -} - -function noop() { - return ''; -} - -function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _COMPILER_REVISION$REVISION_CHANGES$createFrame.createFrame(data) : {}; - data.root = context; - } - return data; -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/safe-string.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/safe-string.js deleted file mode 100644 index 62eb2d8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/safe-string.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -exports.__esModule = true; -// Build out our basic SafeString type -function SafeString(string) { - this.string = string; -} - -SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; -}; - -exports['default'] = SafeString; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/utils.js deleted file mode 100644 index 6ff8f37..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/utils.js +++ /dev/null @@ -1,114 +0,0 @@ -'use strict'; - -exports.__esModule = true; -exports.extend = extend; - -// Older IE versions do not directly support indexOf so we must implement our own, sadly. -exports.indexOf = indexOf; -exports.escapeExpression = escapeExpression; -exports.isEmpty = isEmpty; -exports.blockParams = blockParams; -exports.appendContextPath = appendContextPath; -var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '`': '`' -}; - -var badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - -function escapeChar(chr) { - return escape[chr]; -} - -function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; -} - -var toString = Object.prototype.toString; - -exports.toString = toString; -// Sourced from lodash -// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt -/*eslint-disable func-style, no-var */ -var isFunction = function isFunction(value) { - return typeof value === 'function'; -}; -// fallback for older versions of Chrome and Safari -/* istanbul ignore next */ -if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; -} -var isFunction; -exports.isFunction = isFunction; -/*eslint-enable func-style, no-var */ - -/* istanbul ignore next */ -var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; -};exports.isArray = isArray; - -function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; -} - -function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); -} - -function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } -} - -function blockParams(params, ids) { - params.path = ids; - return params; -} - -function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/precompiler.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/precompiler.js deleted file mode 100644 index e9f9648..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/cjs/precompiler.js +++ /dev/null @@ -1,194 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -/*eslint-disable no-console */ - -var _fs = require('fs'); - -var _fs2 = _interopRequireWildcard(_fs); - -var _import = require('./handlebars'); - -var Handlebars = _interopRequireWildcard(_import); - -var _basename = require('path'); - -var _SourceMapConsumer$SourceNode = require('source-map'); - -var _uglify = require('uglify-js'); - -var _uglify2 = _interopRequireWildcard(_uglify); - -module.exports.cli = function (opts) { - if (opts.version) { - console.log(Handlebars.VERSION); - return; - } - - if (!opts.templates.length) { - throw new Handlebars.Exception('Must define at least one template or directory.'); - } - - opts.templates.forEach(function (template) { - try { - _fs2['default'].statSync(template); - } catch (err) { - throw new Handlebars.Exception('Unable to open template file "' + template + '"'); - } - }); - - if (opts.simple && opts.min) { - throw new Handlebars.Exception('Unable to minimize simple output'); - } - if (opts.simple && (opts.templates.length !== 1 || _fs2['default'].statSync(opts.templates[0]).isDirectory())) { - throw new Handlebars.Exception('Unable to output multiple templates in simple mode'); - } - - // Convert the known list into a hash - var known = {}; - if (opts.known && !Array.isArray(opts.known)) { - opts.known = [opts.known]; - } - if (opts.known) { - for (var i = 0, len = opts.known.length; i < len; i++) { - known[opts.known[i]] = true; - } - } - - // Build file extension pattern - var extension = opts.extension.replace(/[\\^$*+?.():=!|{}\-\[\]]/g, function (arg) { - return '\\' + arg; - }); - extension = new RegExp('\\.' + extension + '$'); - - var output = new _SourceMapConsumer$SourceNode.SourceNode(); - if (!opts.simple) { - if (opts.amd) { - output.add('define([\'' + opts.handlebarPath + 'handlebars.runtime\'], function(Handlebars) {\n Handlebars = Handlebars["default"];'); - } else if (opts.commonjs) { - output.add('var Handlebars = require("' + opts.commonjs + '");'); - } else { - output.add('(function() {\n'); - } - output.add(' var template = Handlebars.template, templates = '); - if (opts.namespace) { - output.add(opts.namespace); - output.add(' = '); - output.add(opts.namespace); - output.add(' || '); - } - output.add('{};\n'); - } - function processTemplate(template, root) { - var path = template, - stat = _fs2['default'].statSync(path); - if (stat.isDirectory()) { - _fs2['default'].readdirSync(template).map(function (file) { - var childPath = template + '/' + file; - - if (extension.test(childPath) || _fs2['default'].statSync(childPath).isDirectory()) { - processTemplate(childPath, root || template); - } - }); - } else { - var data = _fs2['default'].readFileSync(path, 'utf8'); - - if (opts.bom && data.indexOf('') === 0) { - data = data.substring(1); - } - - var options = { - knownHelpers: known, - knownHelpersOnly: opts.o - }; - - if (opts.map) { - options.srcName = path; - } - if (opts.data) { - options.data = true; - } - - // Clean the template name - if (!root) { - template = _basename.basename(template); - } else if (template.indexOf(root) === 0) { - template = template.substring(root.length + 1); - } - template = template.replace(extension, ''); - - var precompiled = Handlebars.precompile(data, options); - - // If we are generating a source map, we have to reconstruct the SourceNode object - if (opts.map) { - var consumer = new _SourceMapConsumer$SourceNode.SourceMapConsumer(precompiled.map); - precompiled = _SourceMapConsumer$SourceNode.SourceNode.fromStringWithSourceMap(precompiled.code, consumer); - } - - if (opts.simple) { - output.add([precompiled, '\n']); - } else if (opts.partial) { - if (opts.amd && (opts.templates.length == 1 && !_fs2['default'].statSync(opts.templates[0]).isDirectory())) { - output.add('return '); - } - output.add(['Handlebars.partials[\'', template, '\'] = template(', precompiled, ');\n']); - } else { - if (opts.amd && (opts.templates.length == 1 && !_fs2['default'].statSync(opts.templates[0]).isDirectory())) { - output.add('return '); - } - output.add(['templates[\'', template, '\'] = template(', precompiled, ');\n']); - } - } - } - - opts.templates.forEach(function (template) { - processTemplate(template, opts.root); - }); - - // Output the content - if (!opts.simple) { - if (opts.amd) { - if (opts.templates.length > 1 || opts.templates.length == 1 && _fs2['default'].statSync(opts.templates[0]).isDirectory()) { - if (opts.partial) { - output.add('return Handlebars.partials;\n'); - } else { - output.add('return templates;\n'); - } - } - output.add('});'); - } else if (!opts.commonjs) { - output.add('})();'); - } - } - - if (opts.map) { - output.add('\n//# sourceMappingURL=' + opts.map + '\n'); - } - - output = output.toStringWithSourceMap(); - output.map = output.map + ''; - - if (opts.min) { - output = _uglify2['default'].minify(output.code, { - fromString: true, - - outSourceMap: opts.map, - inSourceMap: JSON.parse(output.map) - }); - if (opts.map) { - output.code += '\n//# sourceMappingURL=' + opts.map + '\n'; - } - } - - if (opts.map) { - _fs2['default'].writeFileSync(opts.map, output.map, 'utf8'); - } - output = output.code; - - if (opts.output) { - _fs2['default'].writeFileSync(opts.output, output, 'utf8'); - } else { - console.log(output); - } -}; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.js deleted file mode 100644 index 07640c5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.js +++ /dev/null @@ -1,3862 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -define('handlebars/utils',['exports'], function (exports) { - - - exports.__esModule = true; - exports.extend = extend; - - // Older IE versions do not directly support indexOf so we must implement our own, sadly. - exports.indexOf = indexOf; - exports.escapeExpression = escapeExpression; - exports.isEmpty = isEmpty; - exports.blockParams = blockParams; - exports.appendContextPath = appendContextPath; - var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '`': '`' - }; - - var badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - - function escapeChar(chr) { - return escape[chr]; - } - - function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; - } - - var toString = Object.prototype.toString; - - exports.toString = toString; - // Sourced from lodash - // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt - /*eslint-disable func-style, no-var */ - var isFunction = function isFunction(value) { - return typeof value === 'function'; - }; - // fallback for older versions of Chrome and Safari - /* istanbul ignore next */ - if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; - } - var isFunction; - exports.isFunction = isFunction; - /*eslint-enable func-style, no-var */ - - /* istanbul ignore next */ - var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; - };exports.isArray = isArray; - - function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; - } - - function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); - } - - function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } - } - - function blockParams(params, ids) { - params.path = ids; - return params; - } - - function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; - } -}); -define('handlebars/exception',['exports', 'module'], function (exports, module) { - - - var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - - function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } - } - - Exception.prototype = new Error(); - - module.exports = Exception; -}); -define('handlebars/base',['exports', './utils', './exception'], function (exports, _utils, _exception) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.HandlebarsEnvironment = HandlebarsEnvironment; - exports.createFrame = createFrame; - - var _Exception = _interopRequire(_exception); - - var VERSION = '3.0.1'; - exports.VERSION = VERSION; - var COMPILER_REVISION = 6; - - exports.COMPILER_REVISION = COMPILER_REVISION; - var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' - }; - - exports.REVISION_CHANGES = REVISION_CHANGES; - var isArray = _utils.isArray, - isFunction = _utils.isFunction, - toString = _utils.toString, - objectType = '[object Object]'; - - function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); - } - - HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function registerHelper(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { - throw new _Exception('Arg not supported with multiple helpers'); - } - _utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (toString.call(name) === objectType) { - _utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _Exception('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - } - }; - - function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function () { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _Exception('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _Exception('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (var j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function (conditional, options) { - if (isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - - instance.registerHelper('with', function (context, options) { - if (isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!_utils.isEmpty(context)) { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = { data: data }; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function (message, options) { - var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); - } - - var logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function log(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - var method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } - }; - - exports.logger = logger; - var log = logger.log; - - exports.log = log; - - function createFrame(object) { - var frame = _utils.extend({}, object); - frame._parent = object; - return frame; - } -}); -/* [args, ]options */; -define('handlebars/safe-string',['exports', 'module'], function (exports, module) { - // Build out our basic SafeString type - - - function SafeString(string) { - this.string = string; - } - - SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; - }; - - module.exports = SafeString; -}); -define('handlebars/runtime',['exports', './utils', './exception', './base'], function (exports, _utils, _exception, _base) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.checkRevision = checkRevision; - - // TODO: Remove this line and break up compilePartial - - exports.template = template; - exports.wrapProgram = wrapProgram; - exports.resolvePartial = resolvePartial; - exports.invokePartial = invokePartial; - exports.noop = noop; - - var _Exception = _interopRequire(_exception); - - function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _base.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _base.REVISION_CHANGES[currentRevision], - compilerVersions = _base.REVISION_CHANGES[compilerRevision]; - throw new _Exception('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _Exception('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } - } - - function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _Exception('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _Exception('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = _utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _Exception('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _Exception('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: _utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - return templateSpec[i]; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = _utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _Exception('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _Exception('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; - } - - function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; - } - - function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; - } - - function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new _Exception('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } - } - - function noop() { - return ''; - } - - function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _base.createFrame(data) : {}; - data.root = context; - } - return data; - } -}); -define('handlebars/no-conflict',['exports', 'module'], function (exports, module) { - /*global window */ - - - module.exports = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; - }; -}); -define('handlebars.runtime',['exports', 'module', './handlebars/base', './handlebars/safe-string', './handlebars/exception', './handlebars/utils', './handlebars/runtime', './handlebars/no-conflict'], function (exports, module, _handlebarsBase, _handlebarsSafeString, _handlebarsException, _handlebarsUtils, _handlebarsRuntime, _handlebarsNoConflict) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - // Each of these augment the Handlebars object. No need to setup here. - // (This is done to easily share code between commonjs and browse envs) - - var _SafeString = _interopRequire(_handlebarsSafeString); - - var _Exception = _interopRequire(_handlebarsException); - - var _noConflict = _interopRequire(_handlebarsNoConflict); - - // For compatibility and usage outside of module systems, make the Handlebars object a namespace - function create() { - var hb = new _handlebarsBase.HandlebarsEnvironment(); - - _handlebarsUtils.extend(hb, _handlebarsBase); - hb.SafeString = _SafeString; - hb.Exception = _Exception; - hb.Utils = _handlebarsUtils; - hb.escapeExpression = _handlebarsUtils.escapeExpression; - - hb.VM = _handlebarsRuntime; - hb.template = function (spec) { - return _handlebarsRuntime.template(spec, hb); - }; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict(inst); - - inst['default'] = inst; - - module.exports = inst; -}); -define('handlebars/compiler/ast',['exports', 'module'], function (exports, module) { - - - var AST = { - Program: function Program(statements, blockParams, strip, locInfo) { - this.loc = locInfo; - this.type = 'Program'; - this.body = statements; - - this.blockParams = blockParams; - this.strip = strip; - }, - - MustacheStatement: function MustacheStatement(path, params, hash, escaped, strip, locInfo) { - this.loc = locInfo; - this.type = 'MustacheStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.escaped = escaped; - - this.strip = strip; - }, - - BlockStatement: function BlockStatement(path, params, hash, program, inverse, openStrip, inverseStrip, closeStrip, locInfo) { - this.loc = locInfo; - this.type = 'BlockStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.program = program; - this.inverse = inverse; - - this.openStrip = openStrip; - this.inverseStrip = inverseStrip; - this.closeStrip = closeStrip; - }, - - PartialStatement: function PartialStatement(name, params, hash, strip, locInfo) { - this.loc = locInfo; - this.type = 'PartialStatement'; - - this.name = name; - this.params = params || []; - this.hash = hash; - - this.indent = ''; - this.strip = strip; - }, - - ContentStatement: function ContentStatement(string, locInfo) { - this.loc = locInfo; - this.type = 'ContentStatement'; - this.original = this.value = string; - }, - - CommentStatement: function CommentStatement(comment, strip, locInfo) { - this.loc = locInfo; - this.type = 'CommentStatement'; - this.value = comment; - - this.strip = strip; - }, - - SubExpression: function SubExpression(path, params, hash, locInfo) { - this.loc = locInfo; - - this.type = 'SubExpression'; - this.path = path; - this.params = params || []; - this.hash = hash; - }, - - PathExpression: function PathExpression(data, depth, parts, original, locInfo) { - this.loc = locInfo; - this.type = 'PathExpression'; - - this.data = data; - this.original = original; - this.parts = parts; - this.depth = depth; - }, - - StringLiteral: function StringLiteral(string, locInfo) { - this.loc = locInfo; - this.type = 'StringLiteral'; - this.original = this.value = string; - }, - - NumberLiteral: function NumberLiteral(number, locInfo) { - this.loc = locInfo; - this.type = 'NumberLiteral'; - this.original = this.value = Number(number); - }, - - BooleanLiteral: function BooleanLiteral(bool, locInfo) { - this.loc = locInfo; - this.type = 'BooleanLiteral'; - this.original = this.value = bool === 'true'; - }, - - UndefinedLiteral: function UndefinedLiteral(locInfo) { - this.loc = locInfo; - this.type = 'UndefinedLiteral'; - this.original = this.value = undefined; - }, - - NullLiteral: function NullLiteral(locInfo) { - this.loc = locInfo; - this.type = 'NullLiteral'; - this.original = this.value = null; - }, - - Hash: function Hash(pairs, locInfo) { - this.loc = locInfo; - this.type = 'Hash'; - this.pairs = pairs; - }, - HashPair: function HashPair(key, value, locInfo) { - this.loc = locInfo; - this.type = 'HashPair'; - this.key = key; - this.value = value; - }, - - // Public API used to evaluate derived attributes regarding AST nodes - helpers: { - // a mustache is definitely a helper if: - // * it is an eligible helper, and - // * it has at least one parameter or hash segment - helperExpression: function helperExpression(node) { - return !!(node.type === 'SubExpression' || node.params.length || node.hash); - }, - - scopedId: function scopedId(path) { - return /^\.|this\b/.test(path.original); - }, - - // an ID is simple if it only has one part, and that part is not - // `..` or `this`. - simpleId: function simpleId(path) { - return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; - } - } - }; - - // Must be exported as an object rather than the root of the module as the jison lexer - // must modify the object to operate properly. - module.exports = AST; -}); -define('handlebars/compiler/parser',["exports", "module"], function (exports, module) { - /* istanbul ignore next */ - /* Jison generated parser */ - - - var handlebars = (function () { - var parser = { trace: function trace() {}, - yy: {}, - symbols_: { error: 2, root: 3, program: 4, EOF: 5, program_repetition0: 6, statement: 7, mustache: 8, block: 9, rawBlock: 10, partial: 11, content: 12, COMMENT: 13, CONTENT: 14, openRawBlock: 15, END_RAW_BLOCK: 16, OPEN_RAW_BLOCK: 17, helperName: 18, openRawBlock_repetition0: 19, openRawBlock_option0: 20, CLOSE_RAW_BLOCK: 21, openBlock: 22, block_option0: 23, closeBlock: 24, openInverse: 25, block_option1: 26, OPEN_BLOCK: 27, openBlock_repetition0: 28, openBlock_option0: 29, openBlock_option1: 30, CLOSE: 31, OPEN_INVERSE: 32, openInverse_repetition0: 33, openInverse_option0: 34, openInverse_option1: 35, openInverseChain: 36, OPEN_INVERSE_CHAIN: 37, openInverseChain_repetition0: 38, openInverseChain_option0: 39, openInverseChain_option1: 40, inverseAndProgram: 41, INVERSE: 42, inverseChain: 43, inverseChain_option0: 44, OPEN_ENDBLOCK: 45, OPEN: 46, mustache_repetition0: 47, mustache_option0: 48, OPEN_UNESCAPED: 49, mustache_repetition1: 50, mustache_option1: 51, CLOSE_UNESCAPED: 52, OPEN_PARTIAL: 53, partialName: 54, partial_repetition0: 55, partial_option0: 56, param: 57, sexpr: 58, OPEN_SEXPR: 59, sexpr_repetition0: 60, sexpr_option0: 61, CLOSE_SEXPR: 62, hash: 63, hash_repetition_plus0: 64, hashSegment: 65, ID: 66, EQUALS: 67, blockParams: 68, OPEN_BLOCK_PARAMS: 69, blockParams_repetition_plus0: 70, CLOSE_BLOCK_PARAMS: 71, path: 72, dataName: 73, STRING: 74, NUMBER: 75, BOOLEAN: 76, UNDEFINED: 77, NULL: 78, DATA: 79, pathSegments: 80, SEP: 81, $accept: 0, $end: 1 }, - terminals_: { 2: "error", 5: "EOF", 13: "COMMENT", 14: "CONTENT", 16: "END_RAW_BLOCK", 17: "OPEN_RAW_BLOCK", 21: "CLOSE_RAW_BLOCK", 27: "OPEN_BLOCK", 31: "CLOSE", 32: "OPEN_INVERSE", 37: "OPEN_INVERSE_CHAIN", 42: "INVERSE", 45: "OPEN_ENDBLOCK", 46: "OPEN", 49: "OPEN_UNESCAPED", 52: "CLOSE_UNESCAPED", 53: "OPEN_PARTIAL", 59: "OPEN_SEXPR", 62: "CLOSE_SEXPR", 66: "ID", 67: "EQUALS", 69: "OPEN_BLOCK_PARAMS", 71: "CLOSE_BLOCK_PARAMS", 74: "STRING", 75: "NUMBER", 76: "BOOLEAN", 77: "UNDEFINED", 78: "NULL", 79: "DATA", 81: "SEP" }, - productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [12, 1], [10, 3], [15, 5], [9, 4], [9, 4], [22, 6], [25, 6], [36, 6], [41, 2], [43, 3], [43, 1], [24, 3], [8, 5], [8, 5], [11, 5], [57, 1], [57, 1], [58, 5], [63, 1], [65, 3], [68, 3], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [54, 1], [54, 1], [73, 2], [72, 1], [80, 3], [80, 1], [6, 0], [6, 2], [19, 0], [19, 2], [20, 0], [20, 1], [23, 0], [23, 1], [26, 0], [26, 1], [28, 0], [28, 2], [29, 0], [29, 1], [30, 0], [30, 1], [33, 0], [33, 2], [34, 0], [34, 1], [35, 0], [35, 1], [38, 0], [38, 2], [39, 0], [39, 1], [40, 0], [40, 1], [44, 0], [44, 1], [47, 0], [47, 2], [48, 0], [48, 1], [50, 0], [50, 2], [51, 0], [51, 1], [55, 0], [55, 2], [56, 0], [56, 1], [60, 0], [60, 2], [61, 0], [61, 1], [64, 1], [64, 2], [70, 1], [70, 2]], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { - - var $0 = $$.length - 1; - switch (yystate) { - case 1: - return $$[$0 - 1]; - break; - case 2: - this.$ = new yy.Program($$[$0], null, {}, yy.locInfo(this._$)); - break; - case 3: - this.$ = $$[$0]; - break; - case 4: - this.$ = $$[$0]; - break; - case 5: - this.$ = $$[$0]; - break; - case 6: - this.$ = $$[$0]; - break; - case 7: - this.$ = $$[$0]; - break; - case 8: - this.$ = new yy.CommentStatement(yy.stripComment($$[$0]), yy.stripFlags($$[$0], $$[$0]), yy.locInfo(this._$)); - break; - case 9: - this.$ = new yy.ContentStatement($$[$0], yy.locInfo(this._$)); - break; - case 10: - this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); - break; - case 11: - this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] }; - break; - case 12: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$); - break; - case 13: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$); - break; - case 14: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 15: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 16: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 17: - this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] }; - break; - case 18: - var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$), - program = new yy.Program([inverse], null, {}, yy.locInfo(this._$)); - program.chained = true; - - this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true }; - - break; - case 19: - this.$ = $$[$0]; - break; - case 20: - this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) }; - break; - case 21: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 22: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 23: - this.$ = new yy.PartialStatement($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.stripFlags($$[$0 - 4], $$[$0]), yy.locInfo(this._$)); - break; - case 24: - this.$ = $$[$0]; - break; - case 25: - this.$ = $$[$0]; - break; - case 26: - this.$ = new yy.SubExpression($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.locInfo(this._$)); - break; - case 27: - this.$ = new yy.Hash($$[$0], yy.locInfo(this._$)); - break; - case 28: - this.$ = new yy.HashPair(yy.id($$[$0 - 2]), $$[$0], yy.locInfo(this._$)); - break; - case 29: - this.$ = yy.id($$[$0 - 1]); - break; - case 30: - this.$ = $$[$0]; - break; - case 31: - this.$ = $$[$0]; - break; - case 32: - this.$ = new yy.StringLiteral($$[$0], yy.locInfo(this._$)); - break; - case 33: - this.$ = new yy.NumberLiteral($$[$0], yy.locInfo(this._$)); - break; - case 34: - this.$ = new yy.BooleanLiteral($$[$0], yy.locInfo(this._$)); - break; - case 35: - this.$ = new yy.UndefinedLiteral(yy.locInfo(this._$)); - break; - case 36: - this.$ = new yy.NullLiteral(yy.locInfo(this._$)); - break; - case 37: - this.$ = $$[$0]; - break; - case 38: - this.$ = $$[$0]; - break; - case 39: - this.$ = yy.preparePath(true, $$[$0], this._$); - break; - case 40: - this.$ = yy.preparePath(false, $$[$0], this._$); - break; - case 41: - $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2]; - break; - case 42: - this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }]; - break; - case 43: - this.$ = []; - break; - case 44: - $$[$0 - 1].push($$[$0]); - break; - case 45: - this.$ = []; - break; - case 46: - $$[$0 - 1].push($$[$0]); - break; - case 53: - this.$ = []; - break; - case 54: - $$[$0 - 1].push($$[$0]); - break; - case 59: - this.$ = []; - break; - case 60: - $$[$0 - 1].push($$[$0]); - break; - case 65: - this.$ = []; - break; - case 66: - $$[$0 - 1].push($$[$0]); - break; - case 73: - this.$ = []; - break; - case 74: - $$[$0 - 1].push($$[$0]); - break; - case 77: - this.$ = []; - break; - case 78: - $$[$0 - 1].push($$[$0]); - break; - case 81: - this.$ = []; - break; - case 82: - $$[$0 - 1].push($$[$0]); - break; - case 85: - this.$ = []; - break; - case 86: - $$[$0 - 1].push($$[$0]); - break; - case 89: - this.$ = [$$[$0]]; - break; - case 90: - $$[$0 - 1].push($$[$0]); - break; - case 91: - this.$ = [$$[$0]]; - break; - case 92: - $$[$0 - 1].push($$[$0]); - break; - } - }, - table: [{ 3: 1, 4: 2, 5: [2, 43], 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: [1, 11], 14: [1, 18], 15: 16, 17: [1, 21], 22: 14, 25: 15, 27: [1, 19], 32: [1, 20], 37: [2, 2], 42: [2, 2], 45: [2, 2], 46: [1, 12], 49: [1, 13], 53: [1, 17] }, { 1: [2, 1] }, { 5: [2, 44], 13: [2, 44], 14: [2, 44], 17: [2, 44], 27: [2, 44], 32: [2, 44], 37: [2, 44], 42: [2, 44], 45: [2, 44], 46: [2, 44], 49: [2, 44], 53: [2, 44] }, { 5: [2, 3], 13: [2, 3], 14: [2, 3], 17: [2, 3], 27: [2, 3], 32: [2, 3], 37: [2, 3], 42: [2, 3], 45: [2, 3], 46: [2, 3], 49: [2, 3], 53: [2, 3] }, { 5: [2, 4], 13: [2, 4], 14: [2, 4], 17: [2, 4], 27: [2, 4], 32: [2, 4], 37: [2, 4], 42: [2, 4], 45: [2, 4], 46: [2, 4], 49: [2, 4], 53: [2, 4] }, { 5: [2, 5], 13: [2, 5], 14: [2, 5], 17: [2, 5], 27: [2, 5], 32: [2, 5], 37: [2, 5], 42: [2, 5], 45: [2, 5], 46: [2, 5], 49: [2, 5], 53: [2, 5] }, { 5: [2, 6], 13: [2, 6], 14: [2, 6], 17: [2, 6], 27: [2, 6], 32: [2, 6], 37: [2, 6], 42: [2, 6], 45: [2, 6], 46: [2, 6], 49: [2, 6], 53: [2, 6] }, { 5: [2, 7], 13: [2, 7], 14: [2, 7], 17: [2, 7], 27: [2, 7], 32: [2, 7], 37: [2, 7], 42: [2, 7], 45: [2, 7], 46: [2, 7], 49: [2, 7], 53: [2, 7] }, { 5: [2, 8], 13: [2, 8], 14: [2, 8], 17: [2, 8], 27: [2, 8], 32: [2, 8], 37: [2, 8], 42: [2, 8], 45: [2, 8], 46: [2, 8], 49: [2, 8], 53: [2, 8] }, { 18: 22, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 33, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 34, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 4: 35, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 12: 36, 14: [1, 18] }, { 18: 38, 54: 37, 58: 39, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 9], 13: [2, 9], 14: [2, 9], 16: [2, 9], 17: [2, 9], 27: [2, 9], 32: [2, 9], 37: [2, 9], 42: [2, 9], 45: [2, 9], 46: [2, 9], 49: [2, 9], 53: [2, 9] }, { 18: 41, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 42, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 43, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [2, 73], 47: 44, 59: [2, 73], 66: [2, 73], 74: [2, 73], 75: [2, 73], 76: [2, 73], 77: [2, 73], 78: [2, 73], 79: [2, 73] }, { 21: [2, 30], 31: [2, 30], 52: [2, 30], 59: [2, 30], 62: [2, 30], 66: [2, 30], 69: [2, 30], 74: [2, 30], 75: [2, 30], 76: [2, 30], 77: [2, 30], 78: [2, 30], 79: [2, 30] }, { 21: [2, 31], 31: [2, 31], 52: [2, 31], 59: [2, 31], 62: [2, 31], 66: [2, 31], 69: [2, 31], 74: [2, 31], 75: [2, 31], 76: [2, 31], 77: [2, 31], 78: [2, 31], 79: [2, 31] }, { 21: [2, 32], 31: [2, 32], 52: [2, 32], 59: [2, 32], 62: [2, 32], 66: [2, 32], 69: [2, 32], 74: [2, 32], 75: [2, 32], 76: [2, 32], 77: [2, 32], 78: [2, 32], 79: [2, 32] }, { 21: [2, 33], 31: [2, 33], 52: [2, 33], 59: [2, 33], 62: [2, 33], 66: [2, 33], 69: [2, 33], 74: [2, 33], 75: [2, 33], 76: [2, 33], 77: [2, 33], 78: [2, 33], 79: [2, 33] }, { 21: [2, 34], 31: [2, 34], 52: [2, 34], 59: [2, 34], 62: [2, 34], 66: [2, 34], 69: [2, 34], 74: [2, 34], 75: [2, 34], 76: [2, 34], 77: [2, 34], 78: [2, 34], 79: [2, 34] }, { 21: [2, 35], 31: [2, 35], 52: [2, 35], 59: [2, 35], 62: [2, 35], 66: [2, 35], 69: [2, 35], 74: [2, 35], 75: [2, 35], 76: [2, 35], 77: [2, 35], 78: [2, 35], 79: [2, 35] }, { 21: [2, 36], 31: [2, 36], 52: [2, 36], 59: [2, 36], 62: [2, 36], 66: [2, 36], 69: [2, 36], 74: [2, 36], 75: [2, 36], 76: [2, 36], 77: [2, 36], 78: [2, 36], 79: [2, 36] }, { 21: [2, 40], 31: [2, 40], 52: [2, 40], 59: [2, 40], 62: [2, 40], 66: [2, 40], 69: [2, 40], 74: [2, 40], 75: [2, 40], 76: [2, 40], 77: [2, 40], 78: [2, 40], 79: [2, 40], 81: [1, 45] }, { 66: [1, 32], 80: 46 }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 50: 47, 52: [2, 77], 59: [2, 77], 66: [2, 77], 74: [2, 77], 75: [2, 77], 76: [2, 77], 77: [2, 77], 78: [2, 77], 79: [2, 77] }, { 23: 48, 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 49, 45: [2, 49] }, { 26: 54, 41: 55, 42: [1, 53], 45: [2, 51] }, { 16: [1, 56] }, { 31: [2, 81], 55: 57, 59: [2, 81], 66: [2, 81], 74: [2, 81], 75: [2, 81], 76: [2, 81], 77: [2, 81], 78: [2, 81], 79: [2, 81] }, { 31: [2, 37], 59: [2, 37], 66: [2, 37], 74: [2, 37], 75: [2, 37], 76: [2, 37], 77: [2, 37], 78: [2, 37], 79: [2, 37] }, { 31: [2, 38], 59: [2, 38], 66: [2, 38], 74: [2, 38], 75: [2, 38], 76: [2, 38], 77: [2, 38], 78: [2, 38], 79: [2, 38] }, { 18: 58, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 28: 59, 31: [2, 53], 59: [2, 53], 66: [2, 53], 69: [2, 53], 74: [2, 53], 75: [2, 53], 76: [2, 53], 77: [2, 53], 78: [2, 53], 79: [2, 53] }, { 31: [2, 59], 33: 60, 59: [2, 59], 66: [2, 59], 69: [2, 59], 74: [2, 59], 75: [2, 59], 76: [2, 59], 77: [2, 59], 78: [2, 59], 79: [2, 59] }, { 19: 61, 21: [2, 45], 59: [2, 45], 66: [2, 45], 74: [2, 45], 75: [2, 45], 76: [2, 45], 77: [2, 45], 78: [2, 45], 79: [2, 45] }, { 18: 65, 31: [2, 75], 48: 62, 57: 63, 58: 66, 59: [1, 40], 63: 64, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 66: [1, 70] }, { 21: [2, 39], 31: [2, 39], 52: [2, 39], 59: [2, 39], 62: [2, 39], 66: [2, 39], 69: [2, 39], 74: [2, 39], 75: [2, 39], 76: [2, 39], 77: [2, 39], 78: [2, 39], 79: [2, 39], 81: [1, 45] }, { 18: 65, 51: 71, 52: [2, 79], 57: 72, 58: 66, 59: [1, 40], 63: 73, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 24: 74, 45: [1, 75] }, { 45: [2, 50] }, { 4: 76, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 45: [2, 19] }, { 18: 77, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 78, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 24: 79, 45: [1, 75] }, { 45: [2, 52] }, { 5: [2, 10], 13: [2, 10], 14: [2, 10], 17: [2, 10], 27: [2, 10], 32: [2, 10], 37: [2, 10], 42: [2, 10], 45: [2, 10], 46: [2, 10], 49: [2, 10], 53: [2, 10] }, { 18: 65, 31: [2, 83], 56: 80, 57: 81, 58: 66, 59: [1, 40], 63: 82, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 59: [2, 85], 60: 83, 62: [2, 85], 66: [2, 85], 74: [2, 85], 75: [2, 85], 76: [2, 85], 77: [2, 85], 78: [2, 85], 79: [2, 85] }, { 18: 65, 29: 84, 31: [2, 55], 57: 85, 58: 66, 59: [1, 40], 63: 86, 64: 67, 65: 68, 66: [1, 69], 69: [2, 55], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 31: [2, 61], 34: 87, 57: 88, 58: 66, 59: [1, 40], 63: 89, 64: 67, 65: 68, 66: [1, 69], 69: [2, 61], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 20: 90, 21: [2, 47], 57: 91, 58: 66, 59: [1, 40], 63: 92, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [1, 93] }, { 31: [2, 74], 59: [2, 74], 66: [2, 74], 74: [2, 74], 75: [2, 74], 76: [2, 74], 77: [2, 74], 78: [2, 74], 79: [2, 74] }, { 31: [2, 76] }, { 21: [2, 24], 31: [2, 24], 52: [2, 24], 59: [2, 24], 62: [2, 24], 66: [2, 24], 69: [2, 24], 74: [2, 24], 75: [2, 24], 76: [2, 24], 77: [2, 24], 78: [2, 24], 79: [2, 24] }, { 21: [2, 25], 31: [2, 25], 52: [2, 25], 59: [2, 25], 62: [2, 25], 66: [2, 25], 69: [2, 25], 74: [2, 25], 75: [2, 25], 76: [2, 25], 77: [2, 25], 78: [2, 25], 79: [2, 25] }, { 21: [2, 27], 31: [2, 27], 52: [2, 27], 62: [2, 27], 65: 94, 66: [1, 95], 69: [2, 27] }, { 21: [2, 89], 31: [2, 89], 52: [2, 89], 62: [2, 89], 66: [2, 89], 69: [2, 89] }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 67: [1, 96], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 21: [2, 41], 31: [2, 41], 52: [2, 41], 59: [2, 41], 62: [2, 41], 66: [2, 41], 69: [2, 41], 74: [2, 41], 75: [2, 41], 76: [2, 41], 77: [2, 41], 78: [2, 41], 79: [2, 41], 81: [2, 41] }, { 52: [1, 97] }, { 52: [2, 78], 59: [2, 78], 66: [2, 78], 74: [2, 78], 75: [2, 78], 76: [2, 78], 77: [2, 78], 78: [2, 78], 79: [2, 78] }, { 52: [2, 80] }, { 5: [2, 12], 13: [2, 12], 14: [2, 12], 17: [2, 12], 27: [2, 12], 32: [2, 12], 37: [2, 12], 42: [2, 12], 45: [2, 12], 46: [2, 12], 49: [2, 12], 53: [2, 12] }, { 18: 98, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 100, 44: 99, 45: [2, 71] }, { 31: [2, 65], 38: 101, 59: [2, 65], 66: [2, 65], 69: [2, 65], 74: [2, 65], 75: [2, 65], 76: [2, 65], 77: [2, 65], 78: [2, 65], 79: [2, 65] }, { 45: [2, 17] }, { 5: [2, 13], 13: [2, 13], 14: [2, 13], 17: [2, 13], 27: [2, 13], 32: [2, 13], 37: [2, 13], 42: [2, 13], 45: [2, 13], 46: [2, 13], 49: [2, 13], 53: [2, 13] }, { 31: [1, 102] }, { 31: [2, 82], 59: [2, 82], 66: [2, 82], 74: [2, 82], 75: [2, 82], 76: [2, 82], 77: [2, 82], 78: [2, 82], 79: [2, 82] }, { 31: [2, 84] }, { 18: 65, 57: 104, 58: 66, 59: [1, 40], 61: 103, 62: [2, 87], 63: 105, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 30: 106, 31: [2, 57], 68: 107, 69: [1, 108] }, { 31: [2, 54], 59: [2, 54], 66: [2, 54], 69: [2, 54], 74: [2, 54], 75: [2, 54], 76: [2, 54], 77: [2, 54], 78: [2, 54], 79: [2, 54] }, { 31: [2, 56], 69: [2, 56] }, { 31: [2, 63], 35: 109, 68: 110, 69: [1, 108] }, { 31: [2, 60], 59: [2, 60], 66: [2, 60], 69: [2, 60], 74: [2, 60], 75: [2, 60], 76: [2, 60], 77: [2, 60], 78: [2, 60], 79: [2, 60] }, { 31: [2, 62], 69: [2, 62] }, { 21: [1, 111] }, { 21: [2, 46], 59: [2, 46], 66: [2, 46], 74: [2, 46], 75: [2, 46], 76: [2, 46], 77: [2, 46], 78: [2, 46], 79: [2, 46] }, { 21: [2, 48] }, { 5: [2, 21], 13: [2, 21], 14: [2, 21], 17: [2, 21], 27: [2, 21], 32: [2, 21], 37: [2, 21], 42: [2, 21], 45: [2, 21], 46: [2, 21], 49: [2, 21], 53: [2, 21] }, { 21: [2, 90], 31: [2, 90], 52: [2, 90], 62: [2, 90], 66: [2, 90], 69: [2, 90] }, { 67: [1, 96] }, { 18: 65, 57: 112, 58: 66, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 22], 13: [2, 22], 14: [2, 22], 17: [2, 22], 27: [2, 22], 32: [2, 22], 37: [2, 22], 42: [2, 22], 45: [2, 22], 46: [2, 22], 49: [2, 22], 53: [2, 22] }, { 31: [1, 113] }, { 45: [2, 18] }, { 45: [2, 72] }, { 18: 65, 31: [2, 67], 39: 114, 57: 115, 58: 66, 59: [1, 40], 63: 116, 64: 67, 65: 68, 66: [1, 69], 69: [2, 67], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 23], 13: [2, 23], 14: [2, 23], 17: [2, 23], 27: [2, 23], 32: [2, 23], 37: [2, 23], 42: [2, 23], 45: [2, 23], 46: [2, 23], 49: [2, 23], 53: [2, 23] }, { 62: [1, 117] }, { 59: [2, 86], 62: [2, 86], 66: [2, 86], 74: [2, 86], 75: [2, 86], 76: [2, 86], 77: [2, 86], 78: [2, 86], 79: [2, 86] }, { 62: [2, 88] }, { 31: [1, 118] }, { 31: [2, 58] }, { 66: [1, 120], 70: 119 }, { 31: [1, 121] }, { 31: [2, 64] }, { 14: [2, 11] }, { 21: [2, 28], 31: [2, 28], 52: [2, 28], 62: [2, 28], 66: [2, 28], 69: [2, 28] }, { 5: [2, 20], 13: [2, 20], 14: [2, 20], 17: [2, 20], 27: [2, 20], 32: [2, 20], 37: [2, 20], 42: [2, 20], 45: [2, 20], 46: [2, 20], 49: [2, 20], 53: [2, 20] }, { 31: [2, 69], 40: 122, 68: 123, 69: [1, 108] }, { 31: [2, 66], 59: [2, 66], 66: [2, 66], 69: [2, 66], 74: [2, 66], 75: [2, 66], 76: [2, 66], 77: [2, 66], 78: [2, 66], 79: [2, 66] }, { 31: [2, 68], 69: [2, 68] }, { 21: [2, 26], 31: [2, 26], 52: [2, 26], 59: [2, 26], 62: [2, 26], 66: [2, 26], 69: [2, 26], 74: [2, 26], 75: [2, 26], 76: [2, 26], 77: [2, 26], 78: [2, 26], 79: [2, 26] }, { 13: [2, 14], 14: [2, 14], 17: [2, 14], 27: [2, 14], 32: [2, 14], 37: [2, 14], 42: [2, 14], 45: [2, 14], 46: [2, 14], 49: [2, 14], 53: [2, 14] }, { 66: [1, 125], 71: [1, 124] }, { 66: [2, 91], 71: [2, 91] }, { 13: [2, 15], 14: [2, 15], 17: [2, 15], 27: [2, 15], 32: [2, 15], 42: [2, 15], 45: [2, 15], 46: [2, 15], 49: [2, 15], 53: [2, 15] }, { 31: [1, 126] }, { 31: [2, 70] }, { 31: [2, 29] }, { 66: [2, 92], 71: [2, 92] }, { 13: [2, 16], 14: [2, 16], 17: [2, 16], 27: [2, 16], 32: [2, 16], 37: [2, 16], 42: [2, 16], 45: [2, 16], 46: [2, 16], 49: [2, 16], 53: [2, 16] }], - defaultActions: { 4: [2, 1], 49: [2, 50], 51: [2, 19], 55: [2, 52], 64: [2, 76], 73: [2, 80], 78: [2, 17], 82: [2, 84], 92: [2, 48], 99: [2, 18], 100: [2, 72], 105: [2, 88], 107: [2, 58], 110: [2, 64], 111: [2, 11], 123: [2, 70], 124: [2, 29] }, - parseError: function parseError(str, hash) { - throw new Error(str); - }, - parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], - lstack = [], - table = this.table, - yytext = "", - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - this.yy.parser = this; - if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - var ranges = this.lexer.options && this.lexer.options.ranges; - if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError; - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - function lex() { - var token; - token = self.lexer.lex() || 1; - if (typeof token !== "number") { - token = self.symbols_[token] || token; - } - return token; - } - var symbol, - preErrorSymbol, - state, - action, - a, - r, - yyval = {}, - p, - len, - newState, - expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == "undefined") { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === "undefined" || !action.length || !action[0]) { - var errStr = ""; - if (!recovering) { - expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected }); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; - if (ranges) { - yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; - } - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; - } - }; - /* Jison generated lexer */ - var lexer = (function () { - var lexer = { EOF: 1, - parseError: function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, - setInput: function setInput(input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ""; - this.conditionStack = ["INITIAL"]; - this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; - if (this.options.ranges) this.yylloc.range = [0, 0]; - this.offset = 0; - return this; - }, - input: function input() { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) this.yylloc.range[1]++; - - this._input = this._input.slice(1); - return ch; - }, - unput: function unput(ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); - - if (lines.length - 1) this.yylineno -= lines.length - 1; - var r = this.yylloc.range; - - this.yylloc = { first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - return this; - }, - more: function more() { - this._more = true; - return this; - }, - less: function less(n) { - this.unput(this.match.slice(n)); - }, - pastInput: function pastInput() { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); - }, - upcomingInput: function upcomingInput() { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20 - next.length); - } - return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); - }, - showPosition: function showPosition() { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, - next: function next() { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, match, tempMatch, index, col, lines; - if (!this._more) { - this.yytext = ""; - this.match = ""; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = { first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) this.done = false; - if (token) { - return token; - } else { - return; - } - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { text: "", token: null, line: this.yylineno }); - } - }, - lex: function lex() { - var r = this.next(); - if (typeof r !== "undefined") { - return r; - } else { - return this.lex(); - } - }, - begin: function begin(condition) { - this.conditionStack.push(condition); - }, - popState: function popState() { - return this.conditionStack.pop(); - }, - _currentRules: function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - }, - topState: function topState() { - return this.conditionStack[this.conditionStack.length - 2]; - }, - pushState: function begin(condition) { - this.begin(condition); - } }; - lexer.options = {}; - lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { - - function strip(start, end) { - return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end); - } - - var YYSTATE = YY_START; - switch ($avoiding_name_collisions) { - case 0: - if (yy_.yytext.slice(-2) === "\\\\") { - strip(0, 1); - this.begin("mu"); - } else if (yy_.yytext.slice(-1) === "\\") { - strip(0, 1); - this.begin("emu"); - } else { - this.begin("mu"); - } - if (yy_.yytext) { - return 14; - }break; - case 1: - return 14; - break; - case 2: - this.popState(); - return 14; - - break; - case 3: - yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9); - this.popState(); - return 16; - - break; - case 4: - return 14; - break; - case 5: - this.popState(); - return 13; - - break; - case 6: - return 59; - break; - case 7: - return 62; - break; - case 8: - return 17; - break; - case 9: - this.popState(); - this.begin("raw"); - return 21; - - break; - case 10: - return 53; - break; - case 11: - return 27; - break; - case 12: - return 45; - break; - case 13: - this.popState();return 42; - break; - case 14: - this.popState();return 42; - break; - case 15: - return 32; - break; - case 16: - return 37; - break; - case 17: - return 49; - break; - case 18: - return 46; - break; - case 19: - this.unput(yy_.yytext); - this.popState(); - this.begin("com"); - - break; - case 20: - this.popState(); - return 13; - - break; - case 21: - return 46; - break; - case 22: - return 67; - break; - case 23: - return 66; - break; - case 24: - return 66; - break; - case 25: - return 81; - break; - case 26: - // ignore whitespace - break; - case 27: - this.popState();return 52; - break; - case 28: - this.popState();return 31; - break; - case 29: - yy_.yytext = strip(1, 2).replace(/\\"/g, "\"");return 74; - break; - case 30: - yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 74; - break; - case 31: - return 79; - break; - case 32: - return 76; - break; - case 33: - return 76; - break; - case 34: - return 77; - break; - case 35: - return 78; - break; - case 36: - return 75; - break; - case 37: - return 69; - break; - case 38: - return 71; - break; - case 39: - return 66; - break; - case 40: - return 66; - break; - case 41: - return "INVALID"; - break; - case 42: - return 5; - break; - } - }; - lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]*?(?=(\{\{\{\{\/)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[[^\]]*\])/, /^(?:.)/, /^(?:$)/]; - lexer.conditions = { mu: { rules: [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], inclusive: false }, emu: { rules: [2], inclusive: false }, com: { rules: [5], inclusive: false }, raw: { rules: [3, 4], inclusive: false }, INITIAL: { rules: [0, 1, 42], inclusive: true } }; - return lexer; - })(); - parser.lexer = lexer; - function Parser() { - this.yy = {}; - }Parser.prototype = parser;parser.Parser = Parser; - return new Parser(); - })();module.exports = handlebars; -}); -define('handlebars/compiler/visitor',['exports', 'module', '../exception', './ast'], function (exports, module, _exception, _ast) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _Exception = _interopRequire(_exception); - - var _AST = _interopRequire(_ast); - - function Visitor() { - this.parents = []; - } - - Visitor.prototype = { - constructor: Visitor, - mutating: false, - - // Visits a given value. If mutating, will replace the value if necessary. - acceptKey: function acceptKey(node, name) { - var value = this.accept(node[name]); - if (this.mutating) { - // Hacky sanity check: - if (value && (!value.type || !_AST[value.type])) { - throw new _Exception('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); - } - node[name] = value; - } - }, - - // Performs an accept operation with added sanity check to ensure - // required keys are not removed. - acceptRequired: function acceptRequired(node, name) { - this.acceptKey(node, name); - - if (!node[name]) { - throw new _Exception(node.type + ' requires ' + name); - } - }, - - // Traverses a given array. If mutating, empty respnses will be removed - // for child elements. - acceptArray: function acceptArray(array) { - for (var i = 0, l = array.length; i < l; i++) { - this.acceptKey(array, i); - - if (!array[i]) { - array.splice(i, 1); - i--; - l--; - } - } - }, - - accept: function accept(object) { - if (!object) { - return; - } - - if (this.current) { - this.parents.unshift(this.current); - } - this.current = object; - - var ret = this[object.type](object); - - this.current = this.parents.shift(); - - if (!this.mutating || ret) { - return ret; - } else if (ret !== false) { - return object; - } - }, - - Program: function Program(program) { - this.acceptArray(program.body); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.acceptRequired(mustache, 'path'); - this.acceptArray(mustache.params); - this.acceptKey(mustache, 'hash'); - }, - - BlockStatement: function BlockStatement(block) { - this.acceptRequired(block, 'path'); - this.acceptArray(block.params); - this.acceptKey(block, 'hash'); - - this.acceptKey(block, 'program'); - this.acceptKey(block, 'inverse'); - }, - - PartialStatement: function PartialStatement(partial) { - this.acceptRequired(partial, 'name'); - this.acceptArray(partial.params); - this.acceptKey(partial, 'hash'); - }, - - ContentStatement: function ContentStatement() {}, - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - this.acceptRequired(sexpr, 'path'); - this.acceptArray(sexpr.params); - this.acceptKey(sexpr, 'hash'); - }, - - PathExpression: function PathExpression() {}, - - StringLiteral: function StringLiteral() {}, - NumberLiteral: function NumberLiteral() {}, - BooleanLiteral: function BooleanLiteral() {}, - UndefinedLiteral: function UndefinedLiteral() {}, - NullLiteral: function NullLiteral() {}, - - Hash: function Hash(hash) { - this.acceptArray(hash.pairs); - }, - HashPair: function HashPair(pair) { - this.acceptRequired(pair, 'value'); - } - }; - - module.exports = Visitor; -}); -/* content */ /* comment */ /* path */ /* string */ /* number */ /* bool */ /* literal */ /* literal */; -define('handlebars/compiler/whitespace-control',['exports', 'module', './visitor'], function (exports, module, _visitor) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _Visitor = _interopRequire(_visitor); - - function WhitespaceControl() {} - WhitespaceControl.prototype = new _Visitor(); - - WhitespaceControl.prototype.Program = function (program) { - var isRoot = !this.isRootSeen; - this.isRootSeen = true; - - var body = program.body; - for (var i = 0, l = body.length; i < l; i++) { - var current = body[i], - strip = this.accept(current); - - if (!strip) { - continue; - } - - var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), - _isNextWhitespace = isNextWhitespace(body, i, isRoot), - openStandalone = strip.openStandalone && _isPrevWhitespace, - closeStandalone = strip.closeStandalone && _isNextWhitespace, - inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; - - if (strip.close) { - omitRight(body, i, true); - } - if (strip.open) { - omitLeft(body, i, true); - } - - if (inlineStandalone) { - omitRight(body, i); - - if (omitLeft(body, i)) { - // If we are on a standalone node, save the indent info for partials - if (current.type === 'PartialStatement') { - // Pull out the whitespace from the final line - current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1]; - } - } - } - if (openStandalone) { - omitRight((current.program || current.inverse).body); - - // Strip out the previous content node if it's whitespace only - omitLeft(body, i); - } - if (closeStandalone) { - // Always strip the next node - omitRight(body, i); - - omitLeft((current.inverse || current.program).body); - } - } - - return program; - }; - WhitespaceControl.prototype.BlockStatement = function (block) { - this.accept(block.program); - this.accept(block.inverse); - - // Find the inverse program that is involed with whitespace stripping. - var program = block.program || block.inverse, - inverse = block.program && block.inverse, - firstInverse = inverse, - lastInverse = inverse; - - if (inverse && inverse.chained) { - firstInverse = inverse.body[0].program; - - // Walk the inverse chain to find the last inverse that is actually in the chain. - while (lastInverse.chained) { - lastInverse = lastInverse.body[lastInverse.body.length - 1].program; - } - } - - var strip = { - open: block.openStrip.open, - close: block.closeStrip.close, - - // Determine the standalone candiacy. Basically flag our content as being possibly standalone - // so our parent can determine if we actually are standalone - openStandalone: isNextWhitespace(program.body), - closeStandalone: isPrevWhitespace((firstInverse || program).body) - }; - - if (block.openStrip.close) { - omitRight(program.body, null, true); - } - - if (inverse) { - var inverseStrip = block.inverseStrip; - - if (inverseStrip.open) { - omitLeft(program.body, null, true); - } - - if (inverseStrip.close) { - omitRight(firstInverse.body, null, true); - } - if (block.closeStrip.open) { - omitLeft(lastInverse.body, null, true); - } - - // Find standalone else statments - if (isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) { - omitLeft(program.body); - omitRight(firstInverse.body); - } - } else if (block.closeStrip.open) { - omitLeft(program.body, null, true); - } - - return strip; - }; - - WhitespaceControl.prototype.MustacheStatement = function (mustache) { - return mustache.strip; - }; - - WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) { - /* istanbul ignore next */ - var strip = node.strip || {}; - return { - inlineStandalone: true, - open: strip.open, - close: strip.close - }; - }; - - function isPrevWhitespace(body, i, isRoot) { - if (i === undefined) { - i = body.length; - } - - // Nodes that end with newlines are considered whitespace (but are special - // cased for strip operations) - var prev = body[i - 1], - sibling = body[i - 2]; - if (!prev) { - return isRoot; - } - - if (prev.type === 'ContentStatement') { - return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original); - } - } - function isNextWhitespace(body, i, isRoot) { - if (i === undefined) { - i = -1; - } - - var next = body[i + 1], - sibling = body[i + 2]; - if (!next) { - return isRoot; - } - - if (next.type === 'ContentStatement') { - return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original); - } - } - - // Marks the node to the right of the position as omitted. - // I.e. {{foo}}' ' will mark the ' ' node as omitted. - // - // If i is undefined, then the first child will be marked as such. - // - // If mulitple is truthy then all whitespace will be stripped out until non-whitespace - // content is met. - function omitRight(body, i, multiple) { - var current = body[i == null ? 0 : i + 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) { - return; - } - - var original = current.value; - current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, ''); - current.rightStripped = current.value !== original; - } - - // Marks the node to the left of the position as omitted. - // I.e. ' '{{foo}} will mark the ' ' node as omitted. - // - // If i is undefined then the last child will be marked as such. - // - // If mulitple is truthy then all whitespace will be stripped out until non-whitespace - // content is met. - function omitLeft(body, i, multiple) { - var current = body[i == null ? body.length - 1 : i - 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) { - return; - } - - // We omit the last node if it's whitespace only and not preceeded by a non-content node. - var original = current.value; - current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, ''); - current.leftStripped = current.value !== original; - return current.leftStripped; - } - - module.exports = WhitespaceControl; -}); -define('handlebars/compiler/helpers',['exports', '../exception'], function (exports, _exception) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.SourceLocation = SourceLocation; - exports.id = id; - exports.stripFlags = stripFlags; - exports.stripComment = stripComment; - exports.preparePath = preparePath; - exports.prepareMustache = prepareMustache; - exports.prepareRawBlock = prepareRawBlock; - exports.prepareBlock = prepareBlock; - - var _Exception = _interopRequire(_exception); - - function SourceLocation(source, locInfo) { - this.source = source; - this.start = { - line: locInfo.first_line, - column: locInfo.first_column - }; - this.end = { - line: locInfo.last_line, - column: locInfo.last_column - }; - } - - function id(token) { - if (/^\[.*\]$/.test(token)) { - return token.substr(1, token.length - 2); - } else { - return token; - } - } - - function stripFlags(open, close) { - return { - open: open.charAt(2) === '~', - close: close.charAt(close.length - 3) === '~' - }; - } - - function stripComment(comment) { - return comment.replace(/^\{\{~?\!-?-?/, '').replace(/-?-?~?\}\}$/, ''); - } - - function preparePath(data, parts, locInfo) { - locInfo = this.locInfo(locInfo); - - var original = data ? '@' : '', - dig = [], - depth = 0, - depthString = ''; - - for (var i = 0, l = parts.length; i < l; i++) { - var part = parts[i].part, - - // If we have [] syntax then we do not treat path references as operators, - // i.e. foo.[this] resolves to approximately context.foo['this'] - isLiteral = parts[i].original !== part; - original += (parts[i].separator || '') + part; - - if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { - if (dig.length > 0) { - throw new _Exception('Invalid path: ' + original, { loc: locInfo }); - } else if (part === '..') { - depth++; - depthString += '../'; - } - } else { - dig.push(part); - } - } - - return new this.PathExpression(data, depth, dig, original, locInfo); - } - - function prepareMustache(path, params, hash, open, strip, locInfo) { - // Must use charAt to support IE pre-10 - var escapeFlag = open.charAt(3) || open.charAt(2), - escaped = escapeFlag !== '{' && escapeFlag !== '&'; - - return new this.MustacheStatement(path, params, hash, escaped, strip, this.locInfo(locInfo)); - } - - function prepareRawBlock(openRawBlock, content, close, locInfo) { - if (openRawBlock.path.original !== close) { - var errorNode = { loc: openRawBlock.path.loc }; - - throw new _Exception(openRawBlock.path.original + ' doesn\'t match ' + close, errorNode); - } - - locInfo = this.locInfo(locInfo); - var program = new this.Program([content], null, {}, locInfo); - - return new this.BlockStatement(openRawBlock.path, openRawBlock.params, openRawBlock.hash, program, undefined, {}, {}, {}, locInfo); - } - - function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { - // When we are chaining inverse calls, we will not have a close path - if (close && close.path && openBlock.path.original !== close.path.original) { - var errorNode = { loc: openBlock.path.loc }; - - throw new _Exception(openBlock.path.original + ' doesn\'t match ' + close.path.original, errorNode); - } - - program.blockParams = openBlock.blockParams; - - var inverse = undefined, - inverseStrip = undefined; - - if (inverseAndProgram) { - if (inverseAndProgram.chain) { - inverseAndProgram.program.body[0].closeStrip = close.strip; - } - - inverseStrip = inverseAndProgram.strip; - inverse = inverseAndProgram.program; - } - - if (inverted) { - inverted = inverse; - inverse = program; - program = inverted; - } - - return new this.BlockStatement(openBlock.path, openBlock.params, openBlock.hash, program, inverse, openBlock.strip, inverseStrip, close && close.strip, this.locInfo(locInfo)); - } -}); -define('handlebars/compiler/base',['exports', './parser', './ast', './whitespace-control', './helpers', '../utils'], function (exports, _parser, _ast, _whitespaceControl, _helpers, _utils) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.parse = parse; - - var _parser2 = _interopRequire(_parser); - - var _AST = _interopRequire(_ast); - - var _WhitespaceControl = _interopRequire(_whitespaceControl); - - exports.parser = _parser2; - - var yy = {}; - _utils.extend(yy, _helpers, _AST); - - function parse(input, options) { - // Just return if an already-compiled AST was passed in. - if (input.type === 'Program') { - return input; - } - - _parser2.yy = yy; - - // Altering the shared object here, but this is ok as parser is a sync operation - yy.locInfo = function (locInfo) { - return new yy.SourceLocation(options && options.srcName, locInfo); - }; - - var strip = new _WhitespaceControl(); - return strip.accept(_parser2.parse(input)); - } -}); -define('handlebars/compiler/compiler',['exports', '../exception', '../utils', './ast'], function (exports, _exception, _utils, _ast) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.Compiler = Compiler; - exports.precompile = precompile; - exports.compile = compile; - - var _Exception = _interopRequire(_exception); - - var _AST = _interopRequire(_ast); - - var slice = [].slice; - - function Compiler() {} - - // the foundHelper register will disambiguate helper lookup from finding a - // function in a context. This is necessary for mustache compatibility, which - // requires that context functions in blocks are evaluated by blockHelperMissing, - // and then proceed as if the resulting value was provided to blockHelperMissing. - - Compiler.prototype = { - compiler: Compiler, - - equals: function equals(other) { - var len = this.opcodes.length; - if (other.opcodes.length !== len) { - return false; - } - - for (var i = 0; i < len; i++) { - var opcode = this.opcodes[i], - otherOpcode = other.opcodes[i]; - if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { - return false; - } - } - - // We know that length is the same between the two arrays because they are directly tied - // to the opcode behavior above. - len = this.children.length; - for (var i = 0; i < len; i++) { - if (!this.children[i].equals(other.children[i])) { - return false; - } - } - - return true; - }, - - guid: 0, - - compile: function compile(program, options) { - this.sourceNode = []; - this.opcodes = []; - this.children = []; - this.options = options; - this.stringParams = options.stringParams; - this.trackIds = options.trackIds; - - options.blockParams = options.blockParams || []; - - // These changes will propagate to the other compiler components - var knownHelpers = options.knownHelpers; - options.knownHelpers = { - helperMissing: true, - blockHelperMissing: true, - each: true, - 'if': true, - unless: true, - 'with': true, - log: true, - lookup: true - }; - if (knownHelpers) { - for (var _name in knownHelpers) { - if (_name in knownHelpers) { - options.knownHelpers[_name] = knownHelpers[_name]; - } - } - } - - return this.accept(program); - }, - - compileProgram: function compileProgram(program) { - var childCompiler = new this.compiler(), - // eslint-disable-line new-cap - result = childCompiler.compile(program, this.options), - guid = this.guid++; - - this.usePartial = this.usePartial || result.usePartial; - - this.children[guid] = result; - this.useDepths = this.useDepths || result.useDepths; - - return guid; - }, - - accept: function accept(node) { - this.sourceNode.unshift(node); - var ret = this[node.type](node); - this.sourceNode.shift(); - return ret; - }, - - Program: function Program(program) { - this.options.blockParams.unshift(program.blockParams); - - var body = program.body, - bodyLength = body.length; - for (var i = 0; i < bodyLength; i++) { - this.accept(body[i]); - } - - this.options.blockParams.shift(); - - this.isSimple = bodyLength === 1; - this.blockParams = program.blockParams ? program.blockParams.length : 0; - - return this; - }, - - BlockStatement: function BlockStatement(block) { - transformLiteralToPath(block); - - var program = block.program, - inverse = block.inverse; - - program = program && this.compileProgram(program); - inverse = inverse && this.compileProgram(inverse); - - var type = this.classifySexpr(block); - - if (type === 'helper') { - this.helperSexpr(block, program, inverse); - } else if (type === 'simple') { - this.simpleSexpr(block); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('blockValue', block.path.original); - } else { - this.ambiguousSexpr(block, program, inverse); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('ambiguousBlockValue'); - } - - this.opcode('append'); - }, - - PartialStatement: function PartialStatement(partial) { - this.usePartial = true; - - var params = partial.params; - if (params.length > 1) { - throw new _Exception('Unsupported number of partial arguments: ' + params.length, partial); - } else if (!params.length) { - params.push({ type: 'PathExpression', parts: [], depth: 0 }); - } - - var partialName = partial.name.original, - isDynamic = partial.name.type === 'SubExpression'; - if (isDynamic) { - this.accept(partial.name); - } - - this.setupFullMustacheParams(partial, undefined, undefined, true); - - var indent = partial.indent || ''; - if (this.options.preventIndent && indent) { - this.opcode('appendContent', indent); - indent = ''; - } - - this.opcode('invokePartial', isDynamic, partialName, indent); - this.opcode('append'); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.SubExpression(mustache); // eslint-disable-line new-cap - - if (mustache.escaped && !this.options.noEscape) { - this.opcode('appendEscaped'); - } else { - this.opcode('append'); - } - }, - - ContentStatement: function ContentStatement(content) { - if (content.value) { - this.opcode('appendContent', content.value); - } - }, - - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - transformLiteralToPath(sexpr); - var type = this.classifySexpr(sexpr); - - if (type === 'simple') { - this.simpleSexpr(sexpr); - } else if (type === 'helper') { - this.helperSexpr(sexpr); - } else { - this.ambiguousSexpr(sexpr); - } - }, - ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) { - var path = sexpr.path, - name = path.parts[0], - isBlock = program != null || inverse != null; - - this.opcode('getContext', path.depth); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - this.accept(path); - - this.opcode('invokeAmbiguous', name, isBlock); - }, - - simpleSexpr: function simpleSexpr(sexpr) { - this.accept(sexpr.path); - this.opcode('resolvePossibleLambda'); - }, - - helperSexpr: function helperSexpr(sexpr, program, inverse) { - var params = this.setupFullMustacheParams(sexpr, program, inverse), - path = sexpr.path, - name = path.parts[0]; - - if (this.options.knownHelpers[name]) { - this.opcode('invokeKnownHelper', params.length, name); - } else if (this.options.knownHelpersOnly) { - throw new _Exception('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); - } else { - path.falsy = true; - - this.accept(path); - this.opcode('invokeHelper', params.length, path.original, _AST.helpers.simpleId(path)); - } - }, - - PathExpression: function PathExpression(path) { - this.addDepth(path.depth); - this.opcode('getContext', path.depth); - - var name = path.parts[0], - scoped = _AST.helpers.scopedId(path), - blockParamId = !path.depth && !scoped && this.blockParamIndex(name); - - if (blockParamId) { - this.opcode('lookupBlockParam', blockParamId, path.parts); - } else if (!name) { - // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` - this.opcode('pushContext'); - } else if (path.data) { - this.options.data = true; - this.opcode('lookupData', path.depth, path.parts); - } else { - this.opcode('lookupOnContext', path.parts, path.falsy, scoped); - } - }, - - StringLiteral: function StringLiteral(string) { - this.opcode('pushString', string.value); - }, - - NumberLiteral: function NumberLiteral(number) { - this.opcode('pushLiteral', number.value); - }, - - BooleanLiteral: function BooleanLiteral(bool) { - this.opcode('pushLiteral', bool.value); - }, - - UndefinedLiteral: function UndefinedLiteral() { - this.opcode('pushLiteral', 'undefined'); - }, - - NullLiteral: function NullLiteral() { - this.opcode('pushLiteral', 'null'); - }, - - Hash: function Hash(hash) { - var pairs = hash.pairs, - i = 0, - l = pairs.length; - - this.opcode('pushHash'); - - for (; i < l; i++) { - this.pushParam(pairs[i].value); - } - while (i--) { - this.opcode('assignToHash', pairs[i].key); - } - this.opcode('popHash'); - }, - - // HELPERS - opcode: function opcode(name) { - this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); - }, - - addDepth: function addDepth(depth) { - if (!depth) { - return; - } - - this.useDepths = true; - }, - - classifySexpr: function classifySexpr(sexpr) { - var isSimple = _AST.helpers.simpleId(sexpr.path); - - var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); - - // a mustache is an eligible helper if: - // * its id is simple (a single part, not `this` or `..`) - var isHelper = !isBlockParam && _AST.helpers.helperExpression(sexpr); - - // if a mustache is an eligible helper but not a definite - // helper, it is ambiguous, and will be resolved in a later - // pass or at runtime. - var isEligible = !isBlockParam && (isHelper || isSimple); - - // if ambiguous, we can possibly resolve the ambiguity now - // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. - if (isEligible && !isHelper) { - var _name2 = sexpr.path.parts[0], - options = this.options; - - if (options.knownHelpers[_name2]) { - isHelper = true; - } else if (options.knownHelpersOnly) { - isEligible = false; - } - } - - if (isHelper) { - return 'helper'; - } else if (isEligible) { - return 'ambiguous'; - } else { - return 'simple'; - } - }, - - pushParams: function pushParams(params) { - for (var i = 0, l = params.length; i < l; i++) { - this.pushParam(params[i]); - } - }, - - pushParam: function pushParam(val) { - var value = val.value != null ? val.value : val.original || ''; - - if (this.stringParams) { - if (value.replace) { - value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.'); - } - - if (val.depth) { - this.addDepth(val.depth); - } - this.opcode('getContext', val.depth || 0); - this.opcode('pushStringParam', value, val.type); - - if (val.type === 'SubExpression') { - // SubExpressions get evaluated and passed in - // in string params mode. - this.accept(val); - } - } else { - if (this.trackIds) { - var blockParamIndex = undefined; - if (val.parts && !_AST.helpers.scopedId(val) && !val.depth) { - blockParamIndex = this.blockParamIndex(val.parts[0]); - } - if (blockParamIndex) { - var blockParamChild = val.parts.slice(1).join('.'); - this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); - } else { - value = val.original || value; - if (value.replace) { - value = value.replace(/^\.\//g, '').replace(/^\.$/g, ''); - } - - this.opcode('pushId', val.type, value); - } - } - this.accept(val); - } - }, - - setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) { - var params = sexpr.params; - this.pushParams(params); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - if (sexpr.hash) { - this.accept(sexpr.hash); - } else { - this.opcode('emptyHash', omitEmpty); - } - - return params; - }, - - blockParamIndex: function blockParamIndex(name) { - for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) { - var blockParams = this.options.blockParams[depth], - param = blockParams && _utils.indexOf(blockParams, name); - if (blockParams && param >= 0) { - return [depth, param]; - } - } - } - }; - - function precompile(input, options, env) { - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); - } - - options = options || {}; - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options); - return new env.JavaScriptCompiler().compile(environment, options); - } - - function compile(input, _x, env) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); - } - - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var compiled = undefined; - - function compileInput() { - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options), - templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); - return env.template(templateSpec); - } - - // Template is only compiled on first use and cached after that point. - function ret(context, execOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled.call(this, context, execOptions); - } - ret._setup = function (setupOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._setup(setupOptions); - }; - ret._child = function (i, data, blockParams, depths) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._child(i, data, blockParams, depths); - }; - return ret; - } - - function argEquals(a, b) { - if (a === b) { - return true; - } - - if (_utils.isArray(a) && _utils.isArray(b) && a.length === b.length) { - for (var i = 0; i < a.length; i++) { - if (!argEquals(a[i], b[i])) { - return false; - } - } - return true; - } - } - - function transformLiteralToPath(sexpr) { - if (!sexpr.path.parts) { - var literal = sexpr.path; - // Casting to string here to make false and 0 literal values play nicely with the rest - // of the system. - sexpr.path = new _AST.PathExpression(false, 0, [literal.original + ''], literal.original + '', literal.loc); - } - } -}); -define('handlebars/compiler/code-gen',['exports', 'module', '../utils'], function (exports, module, _utils) { - - - var SourceNode = undefined; - - try { - /* istanbul ignore next */ - if (typeof define !== 'function' || !define.amd) { - // We don't support this in AMD environments. For these environments, we asusme that - // they are running on the browser and thus have no need for the source-map library. - var SourceMap = require('source-map'); - SourceNode = SourceMap.SourceNode; - } - } catch (err) {} - - /* istanbul ignore if: tested but not covered in istanbul due to dist build */ - if (!SourceNode) { - SourceNode = function (line, column, srcFile, chunks) { - this.src = ''; - if (chunks) { - this.add(chunks); - } - }; - /* istanbul ignore next */ - SourceNode.prototype = { - add: function add(chunks) { - if (_utils.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src += chunks; - }, - prepend: function prepend(chunks) { - if (_utils.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src = chunks + this.src; - }, - toStringWithSourceMap: function toStringWithSourceMap() { - return { code: this.toString() }; - }, - toString: function toString() { - return this.src; - } - }; - } - - function castChunk(chunk, codeGen, loc) { - if (_utils.isArray(chunk)) { - var ret = []; - - for (var i = 0, len = chunk.length; i < len; i++) { - ret.push(codeGen.wrap(chunk[i], loc)); - } - return ret; - } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { - // Handle primitives that the SourceNode will throw up on - return chunk + ''; - } - return chunk; - } - - function CodeGen(srcFile) { - this.srcFile = srcFile; - this.source = []; - } - - CodeGen.prototype = { - prepend: function prepend(source, loc) { - this.source.unshift(this.wrap(source, loc)); - }, - push: function push(source, loc) { - this.source.push(this.wrap(source, loc)); - }, - - merge: function merge() { - var source = this.empty(); - this.each(function (line) { - source.add([' ', line, '\n']); - }); - return source; - }, - - each: function each(iter) { - for (var i = 0, len = this.source.length; i < len; i++) { - iter(this.source[i]); - } - }, - - empty: function empty() { - var loc = arguments[0] === undefined ? this.currentLocation || { start: {} } : arguments[0]; - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile); - }, - wrap: function wrap(chunk) { - var loc = arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1]; - - if (chunk instanceof SourceNode) { - return chunk; - } - - chunk = castChunk(chunk, this, loc); - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); - }, - - functionCall: function functionCall(fn, type, params) { - params = this.generateList(params); - return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); - }, - - quotedString: function quotedString(str) { - return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 - .replace(/\u2029/g, '\\u2029') + '"'; - }, - - objectLiteral: function objectLiteral(obj) { - var pairs = []; - - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - var value = castChunk(obj[key], this); - if (value !== 'undefined') { - pairs.push([this.quotedString(key), ':', value]); - } - } - } - - var ret = this.generateList(pairs); - ret.prepend('{'); - ret.add('}'); - return ret; - }, - - generateList: function generateList(entries, loc) { - var ret = this.empty(loc); - - for (var i = 0, len = entries.length; i < len; i++) { - if (i) { - ret.add(','); - } - - ret.add(castChunk(entries[i], this, loc)); - } - - return ret; - }, - - generateArray: function generateArray(entries, loc) { - var ret = this.generateList(entries, loc); - ret.prepend('['); - ret.add(']'); - - return ret; - } - }; - - module.exports = CodeGen; -}); -/*global define */ - -/* NOP */; -define('handlebars/compiler/javascript-compiler',['exports', 'module', '../base', '../exception', '../utils', './code-gen'], function (exports, module, _base, _exception, _utils, _codeGen) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _Exception = _interopRequire(_exception); - - var _CodeGen = _interopRequire(_codeGen); - - function Literal(value) { - this.value = value; - } - - function JavaScriptCompiler() {} - - JavaScriptCompiler.prototype = { - // PUBLIC API: You can override these methods in a subclass to provide - // alternative compiled forms for name lookup and buffering semantics - nameLookup: function nameLookup(parent, name /* , type*/) { - if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { - return [parent, '.', name]; - } else { - return [parent, '[\'', name, '\']']; - } - }, - depthedLookup: function depthedLookup(name) { - return [this.aliasable('this.lookup'), '(depths, "', name, '")']; - }, - - compilerInfo: function compilerInfo() { - var revision = _base.COMPILER_REVISION, - versions = _base.REVISION_CHANGES[revision]; - return [revision, versions]; - }, - - appendToBuffer: function appendToBuffer(source, location, explicit) { - // Force a source as this simplifies the merge logic. - if (!_utils.isArray(source)) { - source = [source]; - } - source = this.source.wrap(source, location); - - if (this.environment.isSimple) { - return ['return ', source, ';']; - } else if (explicit) { - // This is a case where the buffer operation occurs as a child of another - // construct, generally braces. We have to explicitly output these buffer - // operations to ensure that the emitted code goes in the correct location. - return ['buffer += ', source, ';']; - } else { - source.appendToBuffer = true; - return source; - } - }, - - initializeBuffer: function initializeBuffer() { - return this.quotedString(''); - }, - // END PUBLIC API - - compile: function compile(environment, options, context, asObject) { - this.environment = environment; - this.options = options; - this.stringParams = this.options.stringParams; - this.trackIds = this.options.trackIds; - this.precompile = !asObject; - - this.name = this.environment.name; - this.isChild = !!context; - this.context = context || { - programs: [], - environments: [] - }; - - this.preamble(); - - this.stackSlot = 0; - this.stackVars = []; - this.aliases = {}; - this.registers = { list: [] }; - this.hashes = []; - this.compileStack = []; - this.inlineStack = []; - this.blockParams = []; - - this.compileChildren(environment, options); - - this.useDepths = this.useDepths || environment.useDepths || this.options.compat; - this.useBlockParams = this.useBlockParams || environment.useBlockParams; - - var opcodes = environment.opcodes, - opcode = undefined, - firstLoc = undefined, - i = undefined, - l = undefined; - - for (i = 0, l = opcodes.length; i < l; i++) { - opcode = opcodes[i]; - - this.source.currentLocation = opcode.loc; - firstLoc = firstLoc || opcode.loc; - this[opcode.opcode].apply(this, opcode.args); - } - - // Flush any trailing content that might be pending. - this.source.currentLocation = firstLoc; - this.pushSource(''); - - /* istanbul ignore next */ - if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { - throw new _Exception('Compile completed with content left on stack'); - } - - var fn = this.createFunctionContext(asObject); - if (!this.isChild) { - var ret = { - compiler: this.compilerInfo(), - main: fn - }; - var programs = this.context.programs; - for (i = 0, l = programs.length; i < l; i++) { - if (programs[i]) { - ret[i] = programs[i]; - } - } - - if (this.environment.usePartial) { - ret.usePartial = true; - } - if (this.options.data) { - ret.useData = true; - } - if (this.useDepths) { - ret.useDepths = true; - } - if (this.useBlockParams) { - ret.useBlockParams = true; - } - if (this.options.compat) { - ret.compat = true; - } - - if (!asObject) { - ret.compiler = JSON.stringify(ret.compiler); - - this.source.currentLocation = { start: { line: 1, column: 0 } }; - ret = this.objectLiteral(ret); - - if (options.srcName) { - ret = ret.toStringWithSourceMap({ file: options.destName }); - ret.map = ret.map && ret.map.toString(); - } else { - ret = ret.toString(); - } - } else { - ret.compilerOptions = this.options; - } - - return ret; - } else { - return fn; - } - }, - - preamble: function preamble() { - // track the last context pushed into place to allow skipping the - // getContext opcode when it would be a noop - this.lastContext = 0; - this.source = new _CodeGen(this.options.srcName); - }, - - createFunctionContext: function createFunctionContext(asObject) { - var varDeclarations = ''; - - var locals = this.stackVars.concat(this.registers.list); - if (locals.length > 0) { - varDeclarations += ', ' + locals.join(', '); - } - - // Generate minimizer alias mappings - // - // When using true SourceNodes, this will update all references to the given alias - // as the source nodes are reused in situ. For the non-source node compilation mode, - // aliases will not be used, but this case is already being run on the client and - // we aren't concern about minimizing the template size. - var aliasCount = 0; - for (var alias in this.aliases) { - // eslint-disable-line guard-for-in - var node = this.aliases[alias]; - - if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) { - varDeclarations += ', alias' + ++aliasCount + '=' + alias; - node.children[0] = 'alias' + aliasCount; - } - } - - var params = ['depth0', 'helpers', 'partials', 'data']; - - if (this.useBlockParams || this.useDepths) { - params.push('blockParams'); - } - if (this.useDepths) { - params.push('depths'); - } - - // Perform a second pass over the output to merge content when possible - var source = this.mergeSource(varDeclarations); - - if (asObject) { - params.push(source); - - return Function.apply(this, params); - } else { - return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); - } - }, - mergeSource: function mergeSource(varDeclarations) { - var isSimple = this.environment.isSimple, - appendOnly = !this.forceBuffer, - appendFirst = undefined, - sourceSeen = undefined, - bufferStart = undefined, - bufferEnd = undefined; - this.source.each(function (line) { - if (line.appendToBuffer) { - if (bufferStart) { - line.prepend(' + '); - } else { - bufferStart = line; - } - bufferEnd = line; - } else { - if (bufferStart) { - if (!sourceSeen) { - appendFirst = true; - } else { - bufferStart.prepend('buffer += '); - } - bufferEnd.add(';'); - bufferStart = bufferEnd = undefined; - } - - sourceSeen = true; - if (!isSimple) { - appendOnly = false; - } - } - }); - - if (appendOnly) { - if (bufferStart) { - bufferStart.prepend('return '); - bufferEnd.add(';'); - } else if (!sourceSeen) { - this.source.push('return "";'); - } - } else { - varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); - - if (bufferStart) { - bufferStart.prepend('return buffer + '); - bufferEnd.add(';'); - } else { - this.source.push('return buffer;'); - } - } - - if (varDeclarations) { - this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); - } - - return this.source.merge(); - }, - - // [blockValue] - // - // On stack, before: hash, inverse, program, value - // On stack, after: return value of blockHelperMissing - // - // The purpose of this opcode is to take a block of the form - // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and - // replace it on the stack with the result of properly - // invoking blockHelperMissing. - blockValue: function blockValue(name) { - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs(name, 0, params); - - var blockName = this.popStack(); - params.splice(1, 0, blockName); - - this.push(this.source.functionCall(blockHelperMissing, 'call', params)); - }, - - // [ambiguousBlockValue] - // - // On stack, before: hash, inverse, program, value - // Compiler value, before: lastHelper=value of last found helper, if any - // On stack, after, if no lastHelper: same as [blockValue] - // On stack, after, if lastHelper: value - ambiguousBlockValue: function ambiguousBlockValue() { - // We're being a bit cheeky and reusing the options value from the prior exec - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs('', 0, params, true); - - this.flushInline(); - - var current = this.topStack(); - params.splice(1, 0, current); - - this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']); - }, - - // [appendContent] - // - // On stack, before: ... - // On stack, after: ... - // - // Appends the string value of `content` to the current buffer - appendContent: function appendContent(content) { - if (this.pendingContent) { - content = this.pendingContent + content; - } else { - this.pendingLocation = this.source.currentLocation; - } - - this.pendingContent = content; - }, - - // [append] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Coerces `value` to a String and appends it to the current buffer. - // - // If `value` is truthy, or 0, it is coerced into a string and appended - // Otherwise, the empty string is appended - append: function append() { - if (this.isInline()) { - this.replaceStack(function (current) { - return [' != null ? ', current, ' : ""']; - }); - - this.pushSource(this.appendToBuffer(this.popStack())); - } else { - var local = this.popStack(); - this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); - if (this.environment.isSimple) { - this.pushSource(['else { ', this.appendToBuffer('\'\'', undefined, true), ' }']); - } - } - }, - - // [appendEscaped] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Escape `value` and append it to the buffer - appendEscaped: function appendEscaped() { - this.pushSource(this.appendToBuffer([this.aliasable('this.escapeExpression'), '(', this.popStack(), ')'])); - }, - - // [getContext] - // - // On stack, before: ... - // On stack, after: ... - // Compiler value, after: lastContext=depth - // - // Set the value of the `lastContext` compiler value to the depth - getContext: function getContext(depth) { - this.lastContext = depth; - }, - - // [pushContext] - // - // On stack, before: ... - // On stack, after: currentContext, ... - // - // Pushes the value of the current context onto the stack. - pushContext: function pushContext() { - this.pushStackLiteral(this.contextName(this.lastContext)); - }, - - // [lookupOnContext] - // - // On stack, before: ... - // On stack, after: currentContext[name], ... - // - // Looks up the value of `name` on the current context and pushes - // it onto the stack. - lookupOnContext: function lookupOnContext(parts, falsy, scoped) { - var i = 0; - - if (!scoped && this.options.compat && !this.lastContext) { - // The depthed query is expected to handle the undefined logic for the root level that - // is implemented below, so we evaluate that directly in compat mode - this.push(this.depthedLookup(parts[i++])); - } else { - this.pushContext(); - } - - this.resolvePath('context', parts, i, falsy); - }, - - // [lookupBlockParam] - // - // On stack, before: ... - // On stack, after: blockParam[name], ... - // - // Looks up the value of `parts` on the given block param and pushes - // it onto the stack. - lookupBlockParam: function lookupBlockParam(blockParamId, parts) { - this.useBlockParams = true; - - this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); - this.resolvePath('context', parts, 1); - }, - - // [lookupData] - // - // On stack, before: ... - // On stack, after: data, ... - // - // Push the data lookup operator - lookupData: function lookupData(depth, parts) { - if (!depth) { - this.pushStackLiteral('data'); - } else { - this.pushStackLiteral('this.data(data, ' + depth + ')'); - } - - this.resolvePath('data', parts, 0, true); - }, - - resolvePath: function resolvePath(type, parts, i, falsy) { - var _this = this; - - if (this.options.strict || this.options.assumeObjects) { - this.push(strictLookup(this.options.strict, this, parts, type)); - return; - } - - var len = parts.length; - for (; i < len; i++) { - /*eslint-disable no-loop-func */ - this.replaceStack(function (current) { - var lookup = _this.nameLookup(current, parts[i], type); - // We want to ensure that zero and false are handled properly if the context (falsy flag) - // needs to have the special handling for these values. - if (!falsy) { - return [' != null ? ', lookup, ' : ', current]; - } else { - // Otherwise we can use generic falsy handling - return [' && ', lookup]; - } - }); - /*eslint-enable no-loop-func */ - } - }, - - // [resolvePossibleLambda] - // - // On stack, before: value, ... - // On stack, after: resolved value, ... - // - // If the `value` is a lambda, replace it on the stack by - // the return value of the lambda - resolvePossibleLambda: function resolvePossibleLambda() { - this.push([this.aliasable('this.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); - }, - - // [pushStringParam] - // - // On stack, before: ... - // On stack, after: string, currentContext, ... - // - // This opcode is designed for use in string mode, which - // provides the string value of a parameter along with its - // depth rather than resolving it immediately. - pushStringParam: function pushStringParam(string, type) { - this.pushContext(); - this.pushString(type); - - // If it's a subexpression, the string result - // will be pushed after this opcode. - if (type !== 'SubExpression') { - if (typeof string === 'string') { - this.pushString(string); - } else { - this.pushStackLiteral(string); - } - } - }, - - emptyHash: function emptyHash(omitEmpty) { - if (this.trackIds) { - this.push('{}'); // hashIds - } - if (this.stringParams) { - this.push('{}'); // hashContexts - this.push('{}'); // hashTypes - } - this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); - }, - pushHash: function pushHash() { - if (this.hash) { - this.hashes.push(this.hash); - } - this.hash = { values: [], types: [], contexts: [], ids: [] }; - }, - popHash: function popHash() { - var hash = this.hash; - this.hash = this.hashes.pop(); - - if (this.trackIds) { - this.push(this.objectLiteral(hash.ids)); - } - if (this.stringParams) { - this.push(this.objectLiteral(hash.contexts)); - this.push(this.objectLiteral(hash.types)); - } - - this.push(this.objectLiteral(hash.values)); - }, - - // [pushString] - // - // On stack, before: ... - // On stack, after: quotedString(string), ... - // - // Push a quoted version of `string` onto the stack - pushString: function pushString(string) { - this.pushStackLiteral(this.quotedString(string)); - }, - - // [pushLiteral] - // - // On stack, before: ... - // On stack, after: value, ... - // - // Pushes a value onto the stack. This operation prevents - // the compiler from creating a temporary variable to hold - // it. - pushLiteral: function pushLiteral(value) { - this.pushStackLiteral(value); - }, - - // [pushProgram] - // - // On stack, before: ... - // On stack, after: program(guid), ... - // - // Push a program expression onto the stack. This takes - // a compile-time guid and converts it into a runtime-accessible - // expression. - pushProgram: function pushProgram(guid) { - if (guid != null) { - this.pushStackLiteral(this.programExpression(guid)); - } else { - this.pushStackLiteral(null); - } - }, - - // [invokeHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // Pops off the helper's parameters, invokes the helper, - // and pushes the helper's return value onto the stack. - // - // If the helper is not found, `helperMissing` is called. - invokeHelper: function invokeHelper(paramSize, name, isSimple) { - var nonHelper = this.popStack(), - helper = this.setupHelper(paramSize, name), - simple = isSimple ? [helper.name, ' || '] : ''; - - var lookup = ['('].concat(simple, nonHelper); - if (!this.options.strict) { - lookup.push(' || ', this.aliasable('helpers.helperMissing')); - } - lookup.push(')'); - - this.push(this.source.functionCall(lookup, 'call', helper.callParams)); - }, - - // [invokeKnownHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // This operation is used when the helper is known to exist, - // so a `helperMissing` fallback is not required. - invokeKnownHelper: function invokeKnownHelper(paramSize, name) { - var helper = this.setupHelper(paramSize, name); - this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); - }, - - // [invokeAmbiguous] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of disambiguation - // - // This operation is used when an expression like `{{foo}}` - // is provided, but we don't know at compile-time whether it - // is a helper or a path. - // - // This operation emits more code than the other options, - // and can be avoided by passing the `knownHelpers` and - // `knownHelpersOnly` flags at compile-time. - invokeAmbiguous: function invokeAmbiguous(name, helperCall) { - this.useRegister('helper'); - - var nonHelper = this.popStack(); - - this.emptyHash(); - var helper = this.setupHelper(0, name, helperCall); - - var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); - - var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; - if (!this.options.strict) { - lookup[0] = '(helper = '; - lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing')); - } - - this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']); - }, - - // [invokePartial] - // - // On stack, before: context, ... - // On stack after: result of partial invocation - // - // This operation pops off a context, invokes a partial with that context, - // and pushes the result of the invocation back. - invokePartial: function invokePartial(isDynamic, name, indent) { - var params = [], - options = this.setupParams(name, 1, params, false); - - if (isDynamic) { - name = this.popStack(); - delete options.name; - } - - if (indent) { - options.indent = JSON.stringify(indent); - } - options.helpers = 'helpers'; - options.partials = 'partials'; - - if (!isDynamic) { - params.unshift(this.nameLookup('partials', name, 'partial')); - } else { - params.unshift(name); - } - - if (this.options.compat) { - options.depths = 'depths'; - } - options = this.objectLiteral(options); - params.push(options); - - this.push(this.source.functionCall('this.invokePartial', '', params)); - }, - - // [assignToHash] - // - // On stack, before: value, ..., hash, ... - // On stack, after: ..., hash, ... - // - // Pops a value off the stack and assigns it to the current hash - assignToHash: function assignToHash(key) { - var value = this.popStack(), - context = undefined, - type = undefined, - id = undefined; - - if (this.trackIds) { - id = this.popStack(); - } - if (this.stringParams) { - type = this.popStack(); - context = this.popStack(); - } - - var hash = this.hash; - if (context) { - hash.contexts[key] = context; - } - if (type) { - hash.types[key] = type; - } - if (id) { - hash.ids[key] = id; - } - hash.values[key] = value; - }, - - pushId: function pushId(type, name, child) { - if (type === 'BlockParam') { - this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : '')); - } else if (type === 'PathExpression') { - this.pushString(name); - } else if (type === 'SubExpression') { - this.pushStackLiteral('true'); - } else { - this.pushStackLiteral('null'); - } - }, - - // HELPERS - - compiler: JavaScriptCompiler, - - compileChildren: function compileChildren(environment, options) { - var children = environment.children, - child = undefined, - compiler = undefined; - - for (var i = 0, l = children.length; i < l; i++) { - child = children[i]; - compiler = new this.compiler(); // eslint-disable-line new-cap - - var index = this.matchExistingProgram(child); - - if (index == null) { - this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children - index = this.context.programs.length; - child.index = index; - child.name = 'program' + index; - this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); - this.context.environments[index] = child; - - this.useDepths = this.useDepths || compiler.useDepths; - this.useBlockParams = this.useBlockParams || compiler.useBlockParams; - } else { - child.index = index; - child.name = 'program' + index; - - this.useDepths = this.useDepths || child.useDepths; - this.useBlockParams = this.useBlockParams || child.useBlockParams; - } - } - }, - matchExistingProgram: function matchExistingProgram(child) { - for (var i = 0, len = this.context.environments.length; i < len; i++) { - var environment = this.context.environments[i]; - if (environment && environment.equals(child)) { - return i; - } - } - }, - - programExpression: function programExpression(guid) { - var child = this.environment.children[guid], - programParams = [child.index, 'data', child.blockParams]; - - if (this.useBlockParams || this.useDepths) { - programParams.push('blockParams'); - } - if (this.useDepths) { - programParams.push('depths'); - } - - return 'this.program(' + programParams.join(', ') + ')'; - }, - - useRegister: function useRegister(name) { - if (!this.registers[name]) { - this.registers[name] = true; - this.registers.list.push(name); - } - }, - - push: function push(expr) { - if (!(expr instanceof Literal)) { - expr = this.source.wrap(expr); - } - - this.inlineStack.push(expr); - return expr; - }, - - pushStackLiteral: function pushStackLiteral(item) { - this.push(new Literal(item)); - }, - - pushSource: function pushSource(source) { - if (this.pendingContent) { - this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); - this.pendingContent = undefined; - } - - if (source) { - this.source.push(source); - } - }, - - replaceStack: function replaceStack(callback) { - var prefix = ['('], - stack = undefined, - createdStack = undefined, - usedLiteral = undefined; - - /* istanbul ignore next */ - if (!this.isInline()) { - throw new _Exception('replaceStack on non-inline'); - } - - // We want to merge the inline statement into the replacement statement via ',' - var top = this.popStack(true); - - if (top instanceof Literal) { - // Literals do not need to be inlined - stack = [top.value]; - prefix = ['(', stack]; - usedLiteral = true; - } else { - // Get or create the current stack name for use by the inline - createdStack = true; - var _name = this.incrStack(); - - prefix = ['((', this.push(_name), ' = ', top, ')']; - stack = this.topStack(); - } - - var item = callback.call(this, stack); - - if (!usedLiteral) { - this.popStack(); - } - if (createdStack) { - this.stackSlot--; - } - this.push(prefix.concat(item, ')')); - }, - - incrStack: function incrStack() { - this.stackSlot++; - if (this.stackSlot > this.stackVars.length) { - this.stackVars.push('stack' + this.stackSlot); - } - return this.topStackName(); - }, - topStackName: function topStackName() { - return 'stack' + this.stackSlot; - }, - flushInline: function flushInline() { - var inlineStack = this.inlineStack; - this.inlineStack = []; - for (var i = 0, len = inlineStack.length; i < len; i++) { - var entry = inlineStack[i]; - /* istanbul ignore if */ - if (entry instanceof Literal) { - this.compileStack.push(entry); - } else { - var stack = this.incrStack(); - this.pushSource([stack, ' = ', entry, ';']); - this.compileStack.push(stack); - } - } - }, - isInline: function isInline() { - return this.inlineStack.length; - }, - - popStack: function popStack(wrapped) { - var inline = this.isInline(), - item = (inline ? this.inlineStack : this.compileStack).pop(); - - if (!wrapped && item instanceof Literal) { - return item.value; - } else { - if (!inline) { - /* istanbul ignore next */ - if (!this.stackSlot) { - throw new _Exception('Invalid stack pop'); - } - this.stackSlot--; - } - return item; - } - }, - - topStack: function topStack() { - var stack = this.isInline() ? this.inlineStack : this.compileStack, - item = stack[stack.length - 1]; - - /* istanbul ignore if */ - if (item instanceof Literal) { - return item.value; - } else { - return item; - } - }, - - contextName: function contextName(context) { - if (this.useDepths && context) { - return 'depths[' + context + ']'; - } else { - return 'depth' + context; - } - }, - - quotedString: function quotedString(str) { - return this.source.quotedString(str); - }, - - objectLiteral: function objectLiteral(obj) { - return this.source.objectLiteral(obj); - }, - - aliasable: function aliasable(name) { - var ret = this.aliases[name]; - if (ret) { - ret.referenceCount++; - return ret; - } - - ret = this.aliases[name] = this.source.wrap(name); - ret.aliasable = true; - ret.referenceCount = 1; - - return ret; - }, - - setupHelper: function setupHelper(paramSize, name, blockHelper) { - var params = [], - paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); - var foundHelper = this.nameLookup('helpers', name, 'helper'); - - return { - params: params, - paramsInit: paramsInit, - name: foundHelper, - callParams: [this.contextName(0)].concat(params) - }; - }, - - setupParams: function setupParams(helper, paramSize, params) { - var options = {}, - contexts = [], - types = [], - ids = [], - param = undefined; - - options.name = this.quotedString(helper); - options.hash = this.popStack(); - - if (this.trackIds) { - options.hashIds = this.popStack(); - } - if (this.stringParams) { - options.hashTypes = this.popStack(); - options.hashContexts = this.popStack(); - } - - var inverse = this.popStack(), - program = this.popStack(); - - // Avoid setting fn and inverse if neither are set. This allows - // helpers to do a check for `if (options.fn)` - if (program || inverse) { - options.fn = program || 'this.noop'; - options.inverse = inverse || 'this.noop'; - } - - // The parameters go on to the stack in order (making sure that they are evaluated in order) - // so we need to pop them off the stack in reverse order - var i = paramSize; - while (i--) { - param = this.popStack(); - params[i] = param; - - if (this.trackIds) { - ids[i] = this.popStack(); - } - if (this.stringParams) { - types[i] = this.popStack(); - contexts[i] = this.popStack(); - } - } - - if (this.trackIds) { - options.ids = this.source.generateArray(ids); - } - if (this.stringParams) { - options.types = this.source.generateArray(types); - options.contexts = this.source.generateArray(contexts); - } - - if (this.options.data) { - options.data = 'data'; - } - if (this.useBlockParams) { - options.blockParams = 'blockParams'; - } - return options; - }, - - setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) { - var options = this.setupParams(helper, paramSize, params, true); - options = this.objectLiteral(options); - if (useRegister) { - this.useRegister('options'); - params.push('options'); - return ['options=', options]; - } else { - params.push(options); - return ''; - } - } - }; - - (function () { - var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' '); - - var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; - - for (var i = 0, l = reservedWords.length; i < l; i++) { - compilerWords[reservedWords[i]] = true; - } - })(); - - JavaScriptCompiler.isValidJavaScriptVariableName = function (name) { - return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name); - }; - - function strictLookup(requireTerminal, compiler, parts, type) { - var stack = compiler.popStack(), - i = 0, - len = parts.length; - if (requireTerminal) { - len--; - } - - for (; i < len; i++) { - stack = compiler.nameLookup(stack, parts[i], type); - } - - if (requireTerminal) { - return [compiler.aliasable('this.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')']; - } else { - return stack; - } - } - - module.exports = JavaScriptCompiler; -}); -define('handlebars',['exports', 'module', './handlebars.runtime', './handlebars/compiler/ast', './handlebars/compiler/base', './handlebars/compiler/compiler', './handlebars/compiler/javascript-compiler', './handlebars/compiler/visitor', './handlebars/no-conflict'], function (exports, module, _handlebarsRuntime, _handlebarsCompilerAst, _handlebarsCompilerBase, _handlebarsCompilerCompiler, _handlebarsCompilerJavascriptCompiler, _handlebarsCompilerVisitor, _handlebarsNoConflict) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _runtime = _interopRequire(_handlebarsRuntime); - - // Compiler imports - - var _AST = _interopRequire(_handlebarsCompilerAst); - - var _JavaScriptCompiler = _interopRequire(_handlebarsCompilerJavascriptCompiler); - - var _Visitor = _interopRequire(_handlebarsCompilerVisitor); - - var _noConflict = _interopRequire(_handlebarsNoConflict); - - var _create = _runtime.create; - function create() { - var hb = _create(); - - hb.compile = function (input, options) { - return _handlebarsCompilerCompiler.compile(input, options, hb); - }; - hb.precompile = function (input, options) { - return _handlebarsCompilerCompiler.precompile(input, options, hb); - }; - - hb.AST = _AST; - hb.Compiler = _handlebarsCompilerCompiler.Compiler; - hb.JavaScriptCompiler = _JavaScriptCompiler; - hb.Parser = _handlebarsCompilerBase.parser; - hb.parse = _handlebarsCompilerBase.parse; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict(inst); - - inst.Visitor = _Visitor; - - inst['default'] = inst; - - module.exports = inst; -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.min.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.min.js deleted file mode 100644 index 752a053..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.min.js +++ /dev/null @@ -1,29 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -define("handlebars/utils",["exports"],function(a){function b(a){return i[a]}function c(a){for(var b=1;bc;c++)if(a[c]===b)return c;return-1}function e(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return k.test(a)?a.replace(j,b):a}function f(a){return a||0===a?n(a)&&0===a.length?!0:!1:!0}function g(a,b){return a.path=b,a}function h(a,b){return(a?a+".":"")+b}a.__esModule=!0,a.extend=c,a.indexOf=d,a.escapeExpression=e,a.isEmpty=f,a.blockParams=g,a.appendContextPath=h;var i={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},j=/[&<>"'`]/g,k=/[&<>"'`]/,l=Object.prototype.toString;a.toString=l;var m=function(a){return"function"==typeof a};m(/x/)&&(a.isFunction=m=function(a){return"function"==typeof a&&"[object Function]"===l.call(a)});var m;a.isFunction=m;var n=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===l.call(a):!1};a.isArray=n}),define("handlebars/exception",["exports","module"],function(a,b){function c(a,b){var e=b&&b.loc,f=void 0,g=void 0;e&&(f=e.start.line,g=e.start.column,a+=" - "+f+":"+g);for(var h=Error.prototype.constructor.call(this,a),i=0;i0?(d.ids&&(d.ids=[d.name]),a.helpers.each(c,d)):e(this);if(d.data&&d.ids){var h=f(d.data);h.contextPath=b.appendContextPath(d.data.contextPath,d.name),d={data:h}}return g(c,d)}),a.registerHelper("each",function(a,c){function d(c,d,f){k&&(k.key=c,k.index=d,k.first=0===d,k.last=!!f,n&&(k.contextPath=n+c)),j+=e(a[c],{data:k,blockParams:b.blockParams([a[c],c],[n+c,null])})}if(!c)throw new h("Must pass iterator to #each");var e=c.fn,g=c.inverse,i=0,j="",k=void 0,n=void 0;if(c.data&&c.ids&&(n=b.appendContextPath(c.data.contextPath,c.ids[0])+"."),m(a)&&(a=a.call(this)),c.data&&(k=f(c.data)),a&&"object"==typeof a)if(l(a))for(var o=a.length;o>i;i++)d(i,i,i===a.length-1);else{var p=void 0;for(var q in a)a.hasOwnProperty(q)&&(p&&d(p,i-1),p=q,i++);p&&d(p,i-1,!0)}return 0===i&&(j=g(this)),j}),a.registerHelper("if",function(a,c){return m(a)&&(a=a.call(this)),!c.hash.includeZero&&!a||b.isEmpty(a)?c.inverse(this):c.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,c){m(a)&&(a=a.call(this));var d=c.fn;if(b.isEmpty(a))return c.inverse(this);if(c.data&&c.ids){var e=f(c.data);e.contextPath=b.appendContextPath(c.data.contextPath,c.ids[0]),c={data:e}}return d(a,c)}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)}),a.registerHelper("lookup",function(a,b){return a&&a[b]})}function f(a){var c=b.extend({},a);return c._parent=a,c}var g=function(a){return a&&a.__esModule?a["default"]:a};a.__esModule=!0,a.HandlebarsEnvironment=d,a.createFrame=f;var h=g(c),i="3.0.1";a.VERSION=i;var j=6;a.COMPILER_REVISION=j;var k={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1"};a.REVISION_CHANGES=k;var l=b.isArray,m=b.isFunction,n=b.toString,o="[object Object]";d.prototype={constructor:d,logger:p,log:q,registerHelper:function(a,c){if(n.call(a)===o){if(c)throw new h("Arg not supported with multiple helpers");b.extend(this.helpers,a)}else this.helpers[a]=c},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,c){if(n.call(a)===o)b.extend(this.partials,a);else{if("undefined"==typeof c)throw new h("Attempting to register a partial as undefined");this.partials[a]=c}},unregisterPartial:function(a){delete this.partials[a]}};var p={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:1,log:function(a,b){if("undefined"!=typeof console&&p.level<=a){var c=p.methodMap[a];(console[c]||console.log).call(console,b)}}};a.logger=p;var q=p.log;a.log=q}),define("handlebars/safe-string",["exports","module"],function(a,b){function c(a){this.string=a}c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b.exports=c}),define("handlebars/runtime",["exports","./utils","./exception","./base"],function(a,b,c,d){function e(a){var b=a&&a[0]||1,c=d.COMPILER_REVISION;if(b!==c){if(c>b){var e=d.REVISION_CHANGES[c],f=d.REVISION_CHANGES[b];throw new m("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+e+") or downgrade your runtime to an older version ("+f+").")}throw new m("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function f(a,c){function d(d,e,f){f.hash&&(e=b.extend({},e,f.hash)),d=c.VM.resolvePartial.call(this,d,e,f);var g=c.VM.invokePartial.call(this,d,e,f);if(null==g&&c.compile&&(f.partials[f.name]=c.compile(d,a.compilerOptions,c),g=f.partials[f.name](e,f)),null!=g){if(f.indent){for(var h=g.split("\n"),i=0,j=h.length;j>i&&(h[i]||i+1!==j);i++)h[i]=f.indent+h[i];g=h.join("\n")}return g}throw new m("The partial "+f.name+" could not be compiled when running in runtime-only mode")}function e(b){var c=void 0===arguments[1]?{}:arguments[1],d=c.data;e._setup(c),!c.partial&&a.useData&&(d=k(b,d));var g=void 0,h=a.useBlockParams?[]:void 0;return a.useDepths&&(g=c.depths?[b].concat(c.depths):[b]),a.main.call(f,b,f.helpers,f.partials,d,h,g)}if(!c)throw new m("No environment passed to template");if(!a||!a.main)throw new m("Unknown template object: "+typeof a);c.VM.checkRevision(a.compiler);var f={strict:function(a,b){if(!(b in a))throw new m('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;c>d;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:b.escapeExpression,invokePartial:d,fn:function(b){return a[b]},programs:[],program:function(a,b,c,d,e){var f=this.programs[a],h=this.fn(a);return b||e||d||c?f=g(this,a,h,b,c,d,e):f||(f=this.programs[a]=g(this,a,h)),f},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,c){var d=a||c;return a&&c&&a!==c&&(d=b.extend({},c,a)),d},noop:c.VM.noop,compilerInfo:a.compiler};return e.isTop=!0,e._setup=function(b){b.partial?(f.helpers=b.helpers,f.partials=b.partials):(f.helpers=f.merge(b.helpers,c.helpers),a.usePartial&&(f.partials=f.merge(b.partials,c.partials)))},e._child=function(b,c,d,e){if(a.useBlockParams&&!d)throw new m("must pass block params");if(a.useDepths&&!e)throw new m("must pass parent depths");return g(f,b,a[b],c,0,d,e)},e}function g(a,b,c,d,e,f,g){function h(b){var e=void 0===arguments[1]?{}:arguments[1];return c.call(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),g&&[b].concat(g))}return h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function h(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a=c.partials[c.name],a}function i(a,b,c){if(c.partial=!0,void 0===a)throw new m("The partial "+c.name+" could not be found");return a instanceof Function?a(b,c):void 0}function j(){return""}function k(a,b){return b&&"root"in b||(b=b?d.createFrame(b):{},b.root=a),b}var l=function(a){return a&&a.__esModule?a["default"]:a};a.__esModule=!0,a.checkRevision=e,a.template=f,a.wrapProgram=g,a.resolvePartial=h,a.invokePartial=i,a.noop=j;var m=l(c)}),define("handlebars/no-conflict",["exports","module"],function(a,b){b.exports=function(a){var b="undefined"!=typeof global?global:window,c=b.Handlebars;a.noConflict=function(){b.Handlebars===a&&(b.Handlebars=c)}}}),define("handlebars.runtime",["exports","module","./handlebars/base","./handlebars/safe-string","./handlebars/exception","./handlebars/utils","./handlebars/runtime","./handlebars/no-conflict"],function(a,b,c,d,e,f,g,h){function i(){var a=new c.HandlebarsEnvironment;return f.extend(a,c),a.SafeString=k,a.Exception=l,a.Utils=f,a.escapeExpression=f.escapeExpression,a.VM=g,a.template=function(b){return g.template(b,a)},a}var j=function(a){return a&&a.__esModule?a["default"]:a},k=j(d),l=j(e),m=j(h),n=i();n.create=i,m(n),n["default"]=n,b.exports=n}),define("handlebars/compiler/ast",["exports","module"],function(a,b){var c={Program:function(a,b,c,d){this.loc=d,this.type="Program",this.body=a,this.blockParams=b,this.strip=c},MustacheStatement:function(a,b,c,d,e,f){this.loc=f,this.type="MustacheStatement",this.path=a,this.params=b||[],this.hash=c,this.escaped=d,this.strip=e},BlockStatement:function(a,b,c,d,e,f,g,h,i){this.loc=i,this.type="BlockStatement",this.path=a,this.params=b||[],this.hash=c,this.program=d,this.inverse=e,this.openStrip=f,this.inverseStrip=g,this.closeStrip=h},PartialStatement:function(a,b,c,d,e){this.loc=e,this.type="PartialStatement",this.name=a,this.params=b||[],this.hash=c,this.indent="",this.strip=d},ContentStatement:function(a,b){this.loc=b,this.type="ContentStatement",this.original=this.value=a},CommentStatement:function(a,b,c){this.loc=c,this.type="CommentStatement",this.value=a,this.strip=b},SubExpression:function(a,b,c,d){this.loc=d,this.type="SubExpression",this.path=a,this.params=b||[],this.hash=c},PathExpression:function(a,b,c,d,e){this.loc=e,this.type="PathExpression",this.data=a,this.original=d,this.parts=c,this.depth=b},StringLiteral:function(a,b){this.loc=b,this.type="StringLiteral",this.original=this.value=a},NumberLiteral:function(a,b){this.loc=b,this.type="NumberLiteral",this.original=this.value=Number(a)},BooleanLiteral:function(a,b){this.loc=b,this.type="BooleanLiteral",this.original=this.value="true"===a},UndefinedLiteral:function(a){this.loc=a,this.type="UndefinedLiteral",this.original=this.value=void 0},NullLiteral:function(a){this.loc=a,this.type="NullLiteral",this.original=this.value=null},Hash:function(a,b){this.loc=b,this.type="Hash",this.pairs=a},HashPair:function(a,b,c){this.loc=c,this.type="HashPair",this.key=a,this.value=b},helpers:{helperExpression:function(a){return!("SubExpression"!==a.type&&!a.params.length&&!a.hash)},scopedId:function(a){return/^\.|this\b/.test(a.original)},simpleId:function(a){return 1===a.parts.length&&!c.helpers.scopedId(a)&&!a.depth}}};b.exports=c}),define("handlebars/compiler/parser",["exports","module"],function(a,b){var c=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,content:12,COMMENT:13,CONTENT:14,openRawBlock:15,END_RAW_BLOCK:16,OPEN_RAW_BLOCK:17,helperName:18,openRawBlock_repetition0:19,openRawBlock_option0:20,CLOSE_RAW_BLOCK:21,openBlock:22,block_option0:23,closeBlock:24,openInverse:25,block_option1:26,OPEN_BLOCK:27,openBlock_repetition0:28,openBlock_option0:29,openBlock_option1:30,CLOSE:31,OPEN_INVERSE:32,openInverse_repetition0:33,openInverse_option0:34,openInverse_option1:35,openInverseChain:36,OPEN_INVERSE_CHAIN:37,openInverseChain_repetition0:38,openInverseChain_option0:39,openInverseChain_option1:40,inverseAndProgram:41,INVERSE:42,inverseChain:43,inverseChain_option0:44,OPEN_ENDBLOCK:45,OPEN:46,mustache_repetition0:47,mustache_option0:48,OPEN_UNESCAPED:49,mustache_repetition1:50,mustache_option1:51,CLOSE_UNESCAPED:52,OPEN_PARTIAL:53,partialName:54,partial_repetition0:55,partial_option0:56,param:57,sexpr:58,OPEN_SEXPR:59,sexpr_repetition0:60,sexpr_option0:61,CLOSE_SEXPR:62,hash:63,hash_repetition_plus0:64,hashSegment:65,ID:66,EQUALS:67,blockParams:68,OPEN_BLOCK_PARAMS:69,blockParams_repetition_plus0:70,CLOSE_BLOCK_PARAMS:71,path:72,dataName:73,STRING:74,NUMBER:75,BOOLEAN:76,UNDEFINED:77,NULL:78,DATA:79,pathSegments:80,SEP:81,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",13:"COMMENT",14:"CONTENT",16:"END_RAW_BLOCK",17:"OPEN_RAW_BLOCK",21:"CLOSE_RAW_BLOCK",27:"OPEN_BLOCK",31:"CLOSE",32:"OPEN_INVERSE",37:"OPEN_INVERSE_CHAIN",42:"INVERSE",45:"OPEN_ENDBLOCK",46:"OPEN",49:"OPEN_UNESCAPED",52:"CLOSE_UNESCAPED",53:"OPEN_PARTIAL",59:"OPEN_SEXPR",62:"CLOSE_SEXPR",66:"ID",67:"EQUALS",69:"OPEN_BLOCK_PARAMS",71:"CLOSE_BLOCK_PARAMS",74:"STRING",75:"NUMBER",76:"BOOLEAN",77:"UNDEFINED",78:"NULL",79:"DATA",81:"SEP"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[12,1],[10,3],[15,5],[9,4],[9,4],[22,6],[25,6],[36,6],[41,2],[43,3],[43,1],[24,3],[8,5],[8,5],[11,5],[57,1],[57,1],[58,5],[63,1],[65,3],[68,3],[18,1],[18,1],[18,1],[18,1],[18,1],[18,1],[18,1],[54,1],[54,1],[73,2],[72,1],[80,3],[80,1],[6,0],[6,2],[19,0],[19,2],[20,0],[20,1],[23,0],[23,1],[26,0],[26,1],[28,0],[28,2],[29,0],[29,1],[30,0],[30,1],[33,0],[33,2],[34,0],[34,1],[35,0],[35,1],[38,0],[38,2],[39,0],[39,1],[40,0],[40,1],[44,0],[44,1],[47,0],[47,2],[48,0],[48,1],[50,0],[50,2],[51,0],[51,1],[55,0],[55,2],[56,0],[56,1],[60,0],[60,2],[61,0],[61,1],[64,1],[64,2],[70,1],[70,2]],performAction:function(a,b,c,d,e,f){var g=f.length-1;switch(e){case 1:return f[g-1];case 2:this.$=new d.Program(f[g],null,{},d.locInfo(this._$));break;case 3:this.$=f[g];break;case 4:this.$=f[g];break;case 5:this.$=f[g];break;case 6:this.$=f[g];break;case 7:this.$=f[g];break;case 8:this.$=new d.CommentStatement(d.stripComment(f[g]),d.stripFlags(f[g],f[g]),d.locInfo(this._$));break;case 9:this.$=new d.ContentStatement(f[g],d.locInfo(this._$));break;case 10:this.$=d.prepareRawBlock(f[g-2],f[g-1],f[g],this._$);break;case 11:this.$={path:f[g-3],params:f[g-2],hash:f[g-1]};break;case 12:this.$=d.prepareBlock(f[g-3],f[g-2],f[g-1],f[g],!1,this._$);break;case 13:this.$=d.prepareBlock(f[g-3],f[g-2],f[g-1],f[g],!0,this._$);break;case 14:this.$={path:f[g-4],params:f[g-3],hash:f[g-2],blockParams:f[g-1],strip:d.stripFlags(f[g-5],f[g])};break;case 15:this.$={path:f[g-4],params:f[g-3],hash:f[g-2],blockParams:f[g-1],strip:d.stripFlags(f[g-5],f[g])};break;case 16:this.$={path:f[g-4],params:f[g-3],hash:f[g-2],blockParams:f[g-1],strip:d.stripFlags(f[g-5],f[g])};break;case 17:this.$={strip:d.stripFlags(f[g-1],f[g-1]),program:f[g]};break;case 18:var h=d.prepareBlock(f[g-2],f[g-1],f[g],f[g],!1,this._$),i=new d.Program([h],null,{},d.locInfo(this._$));i.chained=!0,this.$={strip:f[g-2].strip,program:i,chain:!0};break;case 19:this.$=f[g];break;case 20:this.$={path:f[g-1],strip:d.stripFlags(f[g-2],f[g])};break;case 21:this.$=d.prepareMustache(f[g-3],f[g-2],f[g-1],f[g-4],d.stripFlags(f[g-4],f[g]),this._$);break;case 22:this.$=d.prepareMustache(f[g-3],f[g-2],f[g-1],f[g-4],d.stripFlags(f[g-4],f[g]),this._$);break;case 23:this.$=new d.PartialStatement(f[g-3],f[g-2],f[g-1],d.stripFlags(f[g-4],f[g]),d.locInfo(this._$));break;case 24:this.$=f[g];break;case 25:this.$=f[g];break;case 26:this.$=new d.SubExpression(f[g-3],f[g-2],f[g-1],d.locInfo(this._$));break;case 27:this.$=new d.Hash(f[g],d.locInfo(this._$));break;case 28:this.$=new d.HashPair(d.id(f[g-2]),f[g],d.locInfo(this._$));break;case 29:this.$=d.id(f[g-1]);break;case 30:this.$=f[g];break;case 31:this.$=f[g];break;case 32:this.$=new d.StringLiteral(f[g],d.locInfo(this._$));break;case 33:this.$=new d.NumberLiteral(f[g],d.locInfo(this._$));break;case 34:this.$=new d.BooleanLiteral(f[g],d.locInfo(this._$));break;case 35:this.$=new d.UndefinedLiteral(d.locInfo(this._$));break;case 36:this.$=new d.NullLiteral(d.locInfo(this._$));break;case 37:this.$=f[g];break;case 38:this.$=f[g];break;case 39:this.$=d.preparePath(!0,f[g],this._$);break;case 40:this.$=d.preparePath(!1,f[g],this._$);break;case 41:f[g-2].push({part:d.id(f[g]),original:f[g],separator:f[g-1]}),this.$=f[g-2];break;case 42:this.$=[{part:d.id(f[g]),original:f[g]}];break;case 43:this.$=[];break;case 44:f[g-1].push(f[g]);break;case 45:this.$=[];break;case 46:f[g-1].push(f[g]);break;case 53:this.$=[];break;case 54:f[g-1].push(f[g]);break;case 59:this.$=[];break;case 60:f[g-1].push(f[g]);break;case 65:this.$=[];break;case 66:f[g-1].push(f[g]);break;case 73:this.$=[];break;case 74:f[g-1].push(f[g]);break;case 77:this.$=[];break;case 78:f[g-1].push(f[g]);break;case 81:this.$=[];break;case 82:f[g-1].push(f[g]);break;case 85:this.$=[];break;case 86:f[g-1].push(f[g]);break;case 89:this.$=[f[g]];break;case 90:f[g-1].push(f[g]);break;case 91:this.$=[f[g]];break;case 92:f[g-1].push(f[g])}},table:[{3:1,4:2,5:[2,43],6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],46:[2,43],49:[2,43],53:[2,43]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:[1,11],14:[1,18],15:16,17:[1,21],22:14,25:15,27:[1,19],32:[1,20],37:[2,2],42:[2,2],45:[2,2],46:[1,12],49:[1,13],53:[1,17]},{1:[2,1]},{5:[2,44],13:[2,44],14:[2,44],17:[2,44],27:[2,44],32:[2,44],37:[2,44],42:[2,44],45:[2,44],46:[2,44],49:[2,44],53:[2,44]},{5:[2,3],13:[2,3],14:[2,3],17:[2,3],27:[2,3],32:[2,3],37:[2,3],42:[2,3],45:[2,3],46:[2,3],49:[2,3],53:[2,3]},{5:[2,4],13:[2,4],14:[2,4],17:[2,4],27:[2,4],32:[2,4],37:[2,4],42:[2,4],45:[2,4],46:[2,4],49:[2,4],53:[2,4]},{5:[2,5],13:[2,5],14:[2,5],17:[2,5],27:[2,5],32:[2,5],37:[2,5],42:[2,5],45:[2,5],46:[2,5],49:[2,5],53:[2,5]},{5:[2,6],13:[2,6],14:[2,6],17:[2,6],27:[2,6],32:[2,6],37:[2,6],42:[2,6],45:[2,6],46:[2,6],49:[2,6],53:[2,6]},{5:[2,7],13:[2,7],14:[2,7],17:[2,7],27:[2,7],32:[2,7],37:[2,7],42:[2,7],45:[2,7],46:[2,7],49:[2,7],53:[2,7]},{5:[2,8],13:[2,8],14:[2,8],17:[2,8],27:[2,8],32:[2,8],37:[2,8],42:[2,8],45:[2,8],46:[2,8],49:[2,8],53:[2,8]},{18:22,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:33,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{4:34,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],37:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{4:35,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{12:36,14:[1,18]},{18:38,54:37,58:39,59:[1,40],66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,9],13:[2,9],14:[2,9],16:[2,9],17:[2,9],27:[2,9],32:[2,9],37:[2,9],42:[2,9],45:[2,9],46:[2,9],49:[2,9],53:[2,9]},{18:41,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:42,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:43,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{31:[2,73],47:44,59:[2,73],66:[2,73],74:[2,73],75:[2,73],76:[2,73],77:[2,73],78:[2,73],79:[2,73]},{21:[2,30],31:[2,30],52:[2,30],59:[2,30],62:[2,30],66:[2,30],69:[2,30],74:[2,30],75:[2,30],76:[2,30],77:[2,30],78:[2,30],79:[2,30]},{21:[2,31],31:[2,31],52:[2,31],59:[2,31],62:[2,31],66:[2,31],69:[2,31],74:[2,31],75:[2,31],76:[2,31],77:[2,31],78:[2,31],79:[2,31]},{21:[2,32],31:[2,32],52:[2,32],59:[2,32],62:[2,32],66:[2,32],69:[2,32],74:[2,32],75:[2,32],76:[2,32],77:[2,32],78:[2,32],79:[2,32]},{21:[2,33],31:[2,33],52:[2,33],59:[2,33],62:[2,33],66:[2,33],69:[2,33],74:[2,33],75:[2,33],76:[2,33],77:[2,33],78:[2,33],79:[2,33]},{21:[2,34],31:[2,34],52:[2,34],59:[2,34],62:[2,34],66:[2,34],69:[2,34],74:[2,34],75:[2,34],76:[2,34],77:[2,34],78:[2,34],79:[2,34]},{21:[2,35],31:[2,35],52:[2,35],59:[2,35],62:[2,35],66:[2,35],69:[2,35],74:[2,35],75:[2,35],76:[2,35],77:[2,35],78:[2,35],79:[2,35]},{21:[2,36],31:[2,36],52:[2,36],59:[2,36],62:[2,36],66:[2,36],69:[2,36],74:[2,36],75:[2,36],76:[2,36],77:[2,36],78:[2,36],79:[2,36]},{21:[2,40],31:[2,40],52:[2,40],59:[2,40],62:[2,40],66:[2,40],69:[2,40],74:[2,40],75:[2,40],76:[2,40],77:[2,40],78:[2,40],79:[2,40],81:[1,45]},{66:[1,32],80:46},{21:[2,42],31:[2,42],52:[2,42],59:[2,42],62:[2,42],66:[2,42],69:[2,42],74:[2,42],75:[2,42],76:[2,42],77:[2,42],78:[2,42],79:[2,42],81:[2,42]},{50:47,52:[2,77],59:[2,77],66:[2,77],74:[2,77],75:[2,77],76:[2,77],77:[2,77],78:[2,77],79:[2,77]},{23:48,36:50,37:[1,52],41:51,42:[1,53],43:49,45:[2,49]},{26:54,41:55,42:[1,53],45:[2,51]},{16:[1,56]},{31:[2,81],55:57,59:[2,81],66:[2,81],74:[2,81],75:[2,81],76:[2,81],77:[2,81],78:[2,81],79:[2,81]},{31:[2,37],59:[2,37],66:[2,37],74:[2,37],75:[2,37],76:[2,37],77:[2,37],78:[2,37],79:[2,37]},{31:[2,38],59:[2,38],66:[2,38],74:[2,38],75:[2,38],76:[2,38],77:[2,38],78:[2,38],79:[2,38]},{18:58,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{28:59,31:[2,53],59:[2,53],66:[2,53],69:[2,53],74:[2,53],75:[2,53],76:[2,53],77:[2,53],78:[2,53],79:[2,53]},{31:[2,59],33:60,59:[2,59],66:[2,59],69:[2,59],74:[2,59],75:[2,59],76:[2,59],77:[2,59],78:[2,59],79:[2,59]},{19:61,21:[2,45],59:[2,45],66:[2,45],74:[2,45],75:[2,45],76:[2,45],77:[2,45],78:[2,45],79:[2,45]},{18:65,31:[2,75],48:62,57:63,58:66,59:[1,40],63:64,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{66:[1,70]},{21:[2,39],31:[2,39],52:[2,39],59:[2,39],62:[2,39],66:[2,39],69:[2,39],74:[2,39],75:[2,39],76:[2,39],77:[2,39],78:[2,39],79:[2,39],81:[1,45]},{18:65,51:71,52:[2,79],57:72,58:66,59:[1,40],63:73,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{24:74,45:[1,75]},{45:[2,50]},{4:76,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],37:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{45:[2,19]},{18:77,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{4:78,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{24:79,45:[1,75]},{45:[2,52]},{5:[2,10],13:[2,10],14:[2,10],17:[2,10],27:[2,10],32:[2,10],37:[2,10],42:[2,10],45:[2,10],46:[2,10],49:[2,10],53:[2,10]},{18:65,31:[2,83],56:80,57:81,58:66,59:[1,40],63:82,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{59:[2,85],60:83,62:[2,85],66:[2,85],74:[2,85],75:[2,85],76:[2,85],77:[2,85],78:[2,85],79:[2,85]},{18:65,29:84,31:[2,55],57:85,58:66,59:[1,40],63:86,64:67,65:68,66:[1,69],69:[2,55],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:65,31:[2,61],34:87,57:88,58:66,59:[1,40],63:89,64:67,65:68,66:[1,69],69:[2,61],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:65,20:90,21:[2,47],57:91,58:66,59:[1,40],63:92,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{31:[1,93]},{31:[2,74],59:[2,74],66:[2,74],74:[2,74],75:[2,74],76:[2,74],77:[2,74],78:[2,74],79:[2,74]},{31:[2,76]},{21:[2,24],31:[2,24],52:[2,24],59:[2,24],62:[2,24],66:[2,24],69:[2,24],74:[2,24],75:[2,24],76:[2,24],77:[2,24],78:[2,24],79:[2,24]},{21:[2,25],31:[2,25],52:[2,25],59:[2,25],62:[2,25],66:[2,25],69:[2,25],74:[2,25],75:[2,25],76:[2,25],77:[2,25],78:[2,25],79:[2,25]},{21:[2,27],31:[2,27],52:[2,27],62:[2,27],65:94,66:[1,95],69:[2,27]},{21:[2,89],31:[2,89],52:[2,89],62:[2,89],66:[2,89],69:[2,89]},{21:[2,42],31:[2,42],52:[2,42],59:[2,42],62:[2,42],66:[2,42],67:[1,96],69:[2,42],74:[2,42],75:[2,42],76:[2,42],77:[2,42],78:[2,42],79:[2,42],81:[2,42]},{21:[2,41],31:[2,41],52:[2,41],59:[2,41],62:[2,41],66:[2,41],69:[2,41],74:[2,41],75:[2,41],76:[2,41],77:[2,41],78:[2,41],79:[2,41],81:[2,41]},{52:[1,97]},{52:[2,78],59:[2,78],66:[2,78],74:[2,78],75:[2,78],76:[2,78],77:[2,78],78:[2,78],79:[2,78]},{52:[2,80]},{5:[2,12],13:[2,12],14:[2,12],17:[2,12],27:[2,12],32:[2,12],37:[2,12],42:[2,12],45:[2,12],46:[2,12],49:[2,12],53:[2,12]},{18:98,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{36:50,37:[1,52],41:51,42:[1,53],43:100,44:99,45:[2,71]},{31:[2,65],38:101,59:[2,65],66:[2,65],69:[2,65],74:[2,65],75:[2,65],76:[2,65],77:[2,65],78:[2,65],79:[2,65]},{45:[2,17]},{5:[2,13],13:[2,13],14:[2,13],17:[2,13],27:[2,13],32:[2,13],37:[2,13],42:[2,13],45:[2,13],46:[2,13],49:[2,13],53:[2,13]},{31:[1,102]},{31:[2,82],59:[2,82],66:[2,82],74:[2,82],75:[2,82],76:[2,82],77:[2,82],78:[2,82],79:[2,82]},{31:[2,84]},{18:65,57:104,58:66,59:[1,40],61:103,62:[2,87],63:105,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{30:106,31:[2,57],68:107,69:[1,108]},{31:[2,54],59:[2,54],66:[2,54],69:[2,54],74:[2,54],75:[2,54],76:[2,54],77:[2,54],78:[2,54],79:[2,54]},{31:[2,56],69:[2,56]},{31:[2,63],35:109,68:110,69:[1,108]},{31:[2,60],59:[2,60],66:[2,60],69:[2,60],74:[2,60],75:[2,60],76:[2,60],77:[2,60],78:[2,60],79:[2,60]},{31:[2,62],69:[2,62]},{21:[1,111]},{21:[2,46],59:[2,46],66:[2,46],74:[2,46],75:[2,46],76:[2,46],77:[2,46],78:[2,46],79:[2,46]},{21:[2,48]},{5:[2,21],13:[2,21],14:[2,21],17:[2,21],27:[2,21],32:[2,21],37:[2,21],42:[2,21],45:[2,21],46:[2,21],49:[2,21],53:[2,21]},{21:[2,90],31:[2,90],52:[2,90],62:[2,90],66:[2,90],69:[2,90]},{67:[1,96]},{18:65,57:112,58:66,59:[1,40],66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,22],13:[2,22],14:[2,22],17:[2,22],27:[2,22],32:[2,22],37:[2,22],42:[2,22],45:[2,22],46:[2,22],49:[2,22],53:[2,22]},{31:[1,113]},{45:[2,18]},{45:[2,72]},{18:65,31:[2,67],39:114,57:115,58:66,59:[1,40],63:116,64:67,65:68,66:[1,69],69:[2,67],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,23],13:[2,23],14:[2,23],17:[2,23],27:[2,23],32:[2,23],37:[2,23],42:[2,23],45:[2,23],46:[2,23],49:[2,23],53:[2,23]},{62:[1,117]},{59:[2,86],62:[2,86],66:[2,86],74:[2,86],75:[2,86],76:[2,86],77:[2,86],78:[2,86],79:[2,86]},{62:[2,88]},{31:[1,118]},{31:[2,58]},{66:[1,120],70:119},{31:[1,121]},{31:[2,64]},{14:[2,11]},{21:[2,28],31:[2,28],52:[2,28],62:[2,28],66:[2,28],69:[2,28]},{5:[2,20],13:[2,20],14:[2,20],17:[2,20],27:[2,20],32:[2,20],37:[2,20],42:[2,20],45:[2,20],46:[2,20],49:[2,20],53:[2,20]},{31:[2,69],40:122,68:123,69:[1,108]},{31:[2,66],59:[2,66],66:[2,66],69:[2,66],74:[2,66],75:[2,66],76:[2,66],77:[2,66],78:[2,66],79:[2,66]},{31:[2,68],69:[2,68]},{21:[2,26],31:[2,26],52:[2,26],59:[2,26],62:[2,26],66:[2,26],69:[2,26],74:[2,26],75:[2,26],76:[2,26],77:[2,26],78:[2,26],79:[2,26]},{13:[2,14],14:[2,14],17:[2,14],27:[2,14],32:[2,14],37:[2,14],42:[2,14],45:[2,14],46:[2,14],49:[2,14],53:[2,14]},{66:[1,125],71:[1,124]},{66:[2,91],71:[2,91]},{13:[2,15],14:[2,15],17:[2,15],27:[2,15],32:[2,15],42:[2,15],45:[2,15],46:[2,15],49:[2,15],53:[2,15]},{31:[1,126]},{31:[2,70]},{31:[2,29]},{66:[2,92],71:[2,92]},{13:[2,16],14:[2,16],17:[2,16],27:[2,16],32:[2,16],37:[2,16],42:[2,16],45:[2,16],46:[2,16],49:[2,16],53:[2,16]}],defaultActions:{4:[2,1],49:[2,50],51:[2,19],55:[2,52],64:[2,76],73:[2,80],78:[2,17],82:[2,84],92:[2,48],99:[2,18],100:[2,72],105:[2,88],107:[2,58],110:[2,64],111:[2,11],123:[2,70],124:[2,29]},parseError:function(a){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:((null===n||"undefined"==typeof n)&&(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;gb[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno}) -},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 14;break;case 1:return 14;case 2:return this.popState(),14;case 3:return b.yytext=b.yytext.substr(5,b.yyleng-9),this.popState(),16;case 4:return 14;case 5:return this.popState(),13;case 6:return 59;case 7:return 62;case 8:return 17;case 9:return this.popState(),this.begin("raw"),21;case 10:return 53;case 11:return 27;case 12:return 45;case 13:return this.popState(),42;case 14:return this.popState(),42;case 15:return 32;case 16:return 37;case 17:return 49;case 18:return 46;case 19:this.unput(b.yytext),this.popState(),this.begin("com");break;case 20:return this.popState(),13;case 21:return 46;case 22:return 67;case 23:return 66;case 24:return 66;case 25:return 81;case 26:break;case 27:return this.popState(),52;case 28:return this.popState(),31;case 29:return b.yytext=e(1,2).replace(/\\"/g,'"'),74;case 30:return b.yytext=e(1,2).replace(/\\'/g,"'"),74;case 31:return 79;case 32:return 76;case 33:return 76;case 34:return 77;case 35:return 78;case 36:return 75;case 37:return 69;case 38:return 71;case 39:return 66;case 40:return 66;case 41:return"INVALID";case 42:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{\/)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[5],inclusive:!1},raw:{rules:[3,4],inclusive:!1},INITIAL:{rules:[0,1,42],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();b.exports=c}),define("handlebars/compiler/visitor",["exports","module","../exception","./ast"],function(a,b,c,d){function e(){this.parents=[]}var f=function(a){return a&&a.__esModule?a["default"]:a},g=f(c),h=f(d);e.prototype={constructor:e,mutating:!1,acceptKey:function(a,b){var c=this.accept(a[b]);if(this.mutating){if(c&&(!c.type||!h[c.type]))throw new g('Unexpected node type "'+c.type+'" found when accepting '+b+" on "+a.type);a[b]=c}},acceptRequired:function(a,b){if(this.acceptKey(a,b),!a[b])throw new g(a.type+" requires "+b)},acceptArray:function(a){for(var b=0,c=a.length;c>b;b++)this.acceptKey(a,b),a[b]||(a.splice(b,1),b--,c--)},accept:function(a){if(a){this.current&&this.parents.unshift(this.current),this.current=a;var b=this[a.type](a);return this.current=this.parents.shift(),!this.mutating||b?b:b!==!1?a:void 0}},Program:function(a){this.acceptArray(a.body)},MustacheStatement:function(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")},BlockStatement:function(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash"),this.acceptKey(a,"program"),this.acceptKey(a,"inverse")},PartialStatement:function(a){this.acceptRequired(a,"name"),this.acceptArray(a.params),this.acceptKey(a,"hash")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:function(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")},PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(a){this.acceptArray(a.pairs)},HashPair:function(a){this.acceptRequired(a,"value")}},b.exports=e}),define("handlebars/compiler/whitespace-control",["exports","module","./visitor"],function(a,b,c){function d(){}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"ContentStatement"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"ContentStatement"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"ContentStatement"===d.type&&(c||!d.rightStripped)){var e=d.value;d.value=d.value.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.value!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"ContentStatement"===d.type&&(c||!d.leftStripped)){var e=d.value;return d.value=d.value.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.value!==e,d.leftStripped}}var i=function(a){return a&&a.__esModule?a["default"]:a},j=i(c);d.prototype=new j,d.prototype.Program=function(a){var b=!this.isRootSeen;this.isRootSeen=!0;for(var c=a.body,d=0,i=c.length;i>d;d++){var j=c[d],k=this.accept(j);if(k){var l=e(c,d,b),m=f(c,d,b),n=k.openStandalone&&l,o=k.closeStandalone&&m,p=k.inlineStandalone&&l&&m;k.close&&g(c,d,!0),k.open&&h(c,d,!0),p&&(g(c,d),h(c,d)&&"PartialStatement"===j.type&&(j.indent=/([ \t]+$)/.exec(c[d-1].original)[1])),n&&(g((j.program||j.inverse).body),h(c,d)),o&&(g(c,d),h((j.inverse||j.program).body))}}return a},d.prototype.BlockStatement=function(a){this.accept(a.program),this.accept(a.inverse);var b=a.program||a.inverse,c=a.program&&a.inverse,d=c,i=c;if(c&&c.chained)for(d=c.body[0].program;i.chained;)i=i.body[i.body.length-1].program;var j={open:a.openStrip.open,close:a.closeStrip.close,openStandalone:f(b.body),closeStandalone:e((d||b).body)};if(a.openStrip.close&&g(b.body,null,!0),c){var k=a.inverseStrip;k.open&&h(b.body,null,!0),k.close&&g(d.body,null,!0),a.closeStrip.open&&h(i.body,null,!0),e(b.body)&&f(d.body)&&(h(b.body),g(d.body))}else a.closeStrip.open&&h(b.body,null,!0);return j},d.prototype.MustacheStatement=function(a){return a.strip},d.prototype.PartialStatement=d.prototype.CommentStatement=function(a){var b=a.strip||{};return{inlineStandalone:!0,open:b.open,close:b.close}},b.exports=d}),define("handlebars/compiler/helpers",["exports","../exception"],function(a,b){function c(a,b){this.source=a,this.start={line:b.first_line,column:b.first_column},this.end={line:b.last_line,column:b.last_column}}function d(a){return/^\[.*\]$/.test(a)?a.substr(1,a.length-2):a}function e(a,b){return{open:"~"===a.charAt(2),close:"~"===b.charAt(b.length-3)}}function f(a){return a.replace(/^\{\{~?\!-?-?/,"").replace(/-?-?~?\}\}$/,"")}function g(a,b,c){c=this.locInfo(c);for(var d=a?"@":"",e=[],f=0,g="",h=0,i=b.length;i>h;h++){var j=b[h].part,k=b[h].original!==j;if(d+=(b[h].separator||"")+j,k||".."!==j&&"."!==j&&"this"!==j)e.push(j);else{if(e.length>0)throw new l("Invalid path: "+d,{loc:c});".."===j&&(f++,g+="../")}}return new this.PathExpression(a,f,e,d,c)}function h(a,b,c,d,e,f){var g=d.charAt(3)||d.charAt(2),h="{"!==g&&"&"!==g;return new this.MustacheStatement(a,b,c,h,e,this.locInfo(f))}function i(a,b,c,d){if(a.path.original!==c){var e={loc:a.path.loc};throw new l(a.path.original+" doesn't match "+c,e)}d=this.locInfo(d);var f=new this.Program([b],null,{},d);return new this.BlockStatement(a.path,a.params,a.hash,f,void 0,{},{},{},d)}function j(a,b,c,d,e,f){if(d&&d.path&&a.path.original!==d.path.original){var g={loc:a.path.loc};throw new l(a.path.original+" doesn't match "+d.path.original,g)}b.blockParams=a.blockParams;var h=void 0,i=void 0;return c&&(c.chain&&(c.program.body[0].closeStrip=d.strip),i=c.strip,h=c.program),e&&(e=h,h=b,b=e),new this.BlockStatement(a.path,a.params,a.hash,b,h,a.strip,i,d&&d.strip,this.locInfo(f))}var k=function(a){return a&&a.__esModule?a["default"]:a};a.__esModule=!0,a.SourceLocation=c,a.id=d,a.stripFlags=e,a.stripComment=f,a.preparePath=g,a.prepareMustache=h,a.prepareRawBlock=i,a.prepareBlock=j;var l=k(b)}),define("handlebars/compiler/base",["exports","./parser","./ast","./whitespace-control","./helpers","../utils"],function(a,b,c,d,e,f){function g(a,b){if("Program"===a.type)return a;i.yy=l,l.locInfo=function(a){return new l.SourceLocation(b&&b.srcName,a)};var c=new k;return c.accept(i.parse(a))}var h=function(a){return a&&a.__esModule?a["default"]:a};a.__esModule=!0,a.parse=g;var i=h(b),j=h(c),k=h(d);a.parser=i;var l={};f.extend(l,e,j)}),define("handlebars/compiler/compiler",["exports","../exception","../utils","./ast"],function(a,b,c,d){function e(){}function f(a,b,c){if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a,b),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function g(a,b,c){function d(){var b=c.parse(a,f),d=(new c.Compiler).compile(b,f),e=(new c.JavaScriptCompiler).compile(d,f,void 0,!0);return c.template(e)}function e(a,b){return g||(g=d()),g.call(this,a,b)}var f=void 0===arguments[1]?{}:arguments[1];if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);"data"in f||(f.data=!0),f.compat&&(f.useDepths=!0);var g=void 0;return e._setup=function(a){return g||(g=d()),g._setup(a)},e._child=function(a,b,c,e){return g||(g=d()),g._child(a,b,c,e)},e}function h(a,b){if(a===b)return!0;if(c.isArray(a)&&c.isArray(b)&&a.length===b.length){for(var d=0;dc;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||!h(d.args,e.args))return!1}b=this.children.length;for(var c=0;b>c;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[];var c=b.knownHelpers;if(b.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)d in c&&(b.knownHelpers[d]=c[d]);return this.accept(a)},compileProgram:function(a){var b=new this.compiler,c=b.compile(a,this.options),d=this.guid++;return this.usePartial=this.usePartial||c.usePartial,this.children[d]=c,this.useDepths=this.useDepths||c.useDepths,d},accept:function(a){this.sourceNode.unshift(a);var b=this[a.type](a);return this.sourceNode.shift(),b},Program:function(a){this.options.blockParams.unshift(a.blockParams);for(var b=a.body,c=b.length,d=0;c>d;d++)this.accept(b[d]);return this.options.blockParams.shift(),this.isSimple=1===c,this.blockParams=a.blockParams?a.blockParams.length:0,this},BlockStatement:function(a){i(a);var b=a.program,c=a.inverse;b=b&&this.compileProgram(b),c=c&&this.compileProgram(c);var d=this.classifySexpr(a);"helper"===d?this.helperSexpr(a,b,c):"simple"===d?(this.simpleSexpr(a),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("blockValue",a.path.original)):(this.ambiguousSexpr(a,b,c),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},PartialStatement:function(a){this.usePartial=!0;var b=a.params;if(b.length>1)throw new k("Unsupported number of partial arguments: "+b.length,a);b.length||b.push({type:"PathExpression",parts:[],depth:0});var c=a.name.original,d="SubExpression"===a.name.type;d&&this.accept(a.name),this.setupFullMustacheParams(a,void 0,void 0,!0);var e=a.indent||"";this.options.preventIndent&&e&&(this.opcode("appendContent",e),e=""),this.opcode("invokePartial",d,c,e),this.opcode("append")},MustacheStatement:function(a){this.SubExpression(a),this.opcode(a.escaped&&!this.options.noEscape?"appendEscaped":"append")},ContentStatement:function(a){a.value&&this.opcode("appendContent",a.value)},CommentStatement:function(){},SubExpression:function(a){i(a);var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ambiguousSexpr:function(a,b,c){var d=a.path,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.accept(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){this.accept(a.path),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.path,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new k("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.falsy=!0,this.accept(e),this.opcode("invokeHelper",d.length,e.original,l.helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=l.helpers.scopedId(a),d=!a.depth&&!c&&this.blockParamIndex(b);d?this.opcode("lookupBlockParam",d,a.parts):b?a.data?(this.options.data=!0,this.opcode("lookupData",a.depth,a.parts)):this.opcode("lookupOnContext",a.parts,a.falsy,c):this.opcode("pushContext")},StringLiteral:function(a){this.opcode("pushString",a.value)},NumberLiteral:function(a){this.opcode("pushLiteral",a.value)},BooleanLiteral:function(a){this.opcode("pushLiteral",a.value)},UndefinedLiteral:function(){this.opcode("pushLiteral","undefined")},NullLiteral:function(){this.opcode("pushLiteral","null")},Hash:function(a){var b=a.pairs,c=0,d=b.length;for(this.opcode("pushHash");d>c;c++)this.pushParam(b[c].value);for(;c--;)this.opcode("assignToHash",b[c].key);this.opcode("popHash")},opcode:function(a){this.opcodes.push({opcode:a,args:m.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=l.helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&l.helpers.helperExpression(a),e=!c&&(d||b);if(e&&!d){var f=a.path.parts[0],g=this.options;g.knownHelpers[f]?d=!0:g.knownHelpersOnly&&(e=!1)}return d?"helper":e?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;c>b;b++)this.pushParam(a[b])},pushParam:function(a){var b=null!=a.value?a.value:a.original||"";if(this.stringParams)b.replace&&(b=b.replace(/^(\.?\.\/)*/g,"").replace(/\//g,".")),a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",b,a.type),"SubExpression"===a.type&&this.accept(a);else{if(this.trackIds){var c=void 0;if(!a.parts||l.helpers.scopedId(a)||a.depth||(c=this.blockParamIndex(a.parts[0])),c){var d=a.parts.slice(1).join(".");this.opcode("pushId","BlockParam",c,d)}else b=a.original||b,b.replace&&(b=b.replace(/^\.\//g,"").replace(/^\.$/g,"")),this.opcode("pushId",a.type,b)}this.accept(a)}},setupFullMustacheParams:function(a,b,c,d){var e=a.params;return this.pushParams(e),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.accept(a.hash):this.opcode("emptyHash",d),e},blockParamIndex:function(a){for(var b=0,d=this.options.blockParams.length;d>b;b++){var e=this.options.blockParams[b],f=e&&c.indexOf(e,a);if(e&&f>=0)return[b,f]}}}}),define("handlebars/compiler/code-gen",["exports","module","../utils"],function(a,b,c){function d(a,b,d){if(c.isArray(a)){for(var e=[],f=0,g=a.length;g>f;f++)e.push(b.wrap(a[f],d));return e}return"boolean"==typeof a||"number"==typeof a?a+"":a}function e(a){this.srcFile=a,this.source=[]}var f=void 0;try{if("function"!=typeof define||!define.amd){var g=require("source-map");f=g.SourceNode}}catch(h){}f||(f=function(a,b,c,d){this.src="",d&&this.add(d)},f.prototype={add:function(a){c.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){c.isArray(a)&&(a=a.join("")),this.src=a+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),e.prototype={prepend:function(a,b){this.source.unshift(this.wrap(a,b))},push:function(a,b){this.source.push(this.wrap(a,b))},merge:function(){var a=this.empty();return this.each(function(b){a.add([" ",b,"\n"])}),a},each:function(a){for(var b=0,c=this.source.length;c>b;b++)a(this.source[b])},empty:function(){var a=void 0===arguments[0]?this.currentLocation||{start:{}}:arguments[0];return new f(a.start.line,a.start.column,this.srcFile)},wrap:function(a){var b=void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return a instanceof f?a:(a=d(a,this,b),new f(b.start.line,b.start.column,this.srcFile,a))},functionCall:function(a,b,c){return c=this.generateList(c),this.wrap([a,b?"."+b+"(":"(",c,")"])},quotedString:function(a){return'"'+(a+"").replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},objectLiteral:function(a){var b=[];for(var c in a)if(a.hasOwnProperty(c)){var e=d(a[c],this);"undefined"!==e&&b.push([this.quotedString(c),":",e])}var f=this.generateList(b);return f.prepend("{"),f.add("}"),f},generateList:function(a,b){for(var c=this.empty(b),e=0,f=a.length;f>e;e++)e&&c.add(","),c.add(d(a[e],this,b));return c},generateArray:function(a,b){var c=this.generateList(a,b);return c.prepend("["),c.add("]"),c}},b.exports=e}),define("handlebars/compiler/javascript-compiler",["exports","module","../base","../exception","../utils","./code-gen"],function(a,b,c,d,e,f){function g(a){this.value=a}function h(){}function i(a,b,c,d){var e=b.popStack(),f=0,g=c.length;for(a&&g--;g>f;f++)e=b.nameLookup(e,c[f],d);return a?[b.aliasable("this.strict"),"(",e,", ",b.quotedString(c[f]),")"]:e}var j=function(a){return a&&a.__esModule?a["default"]:a},k=j(d),l=j(f);h.prototype={nameLookup:function(a,b){return h.isValidJavaScriptVariableName(b)?[a,".",b]:[a,"['",b,"']"]},depthedLookup:function(a){return[this.aliasable("this.lookup"),'(depths, "',a,'")']},compilerInfo:function(){var a=c.COMPILER_REVISION,b=c.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return e.isArray(a)||(a=[a]),a=this.source.wrap(a,b),this.environment.isSimple?["return ",a,";"]:c?["buffer += ",a,";"]:(a.appendToBuffer=!0,a)},initializeBuffer:function(){return this.quotedString("")},compile:function(a,b,c,d){this.environment=a,this.options=b,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,this.name=this.environment.name,this.isChild=!!c,this.context=c||{programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(a,b),this.useDepths=this.useDepths||a.useDepths||this.options.compat,this.useBlockParams=this.useBlockParams||a.useBlockParams;var e=a.opcodes,f=void 0,g=void 0,h=void 0,i=void 0;for(h=0,i=e.length;i>h;h++)f=e[h],this.source.currentLocation=f.loc,g=g||f.loc,this[f.opcode].apply(this,f.args);if(this.source.currentLocation=g,this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new k("Compile completed with content left on stack");var j=this.createFunctionContext(d);if(this.isChild)return j;var l={compiler:this.compilerInfo(),main:j},m=this.context.programs;for(h=0,i=m.length;i>h;h++)m[h]&&(l[h]=m[h]);return this.environment.usePartial&&(l.usePartial=!0),this.options.data&&(l.useData=!0),this.useDepths&&(l.useDepths=!0),this.useBlockParams&&(l.useBlockParams=!0),this.options.compat&&(l.compat=!0),d?l.compilerOptions=this.options:(l.compiler=JSON.stringify(l.compiler),this.source.currentLocation={start:{line:1,column:0}},l=this.objectLiteral(l),b.srcName?(l=l.toStringWithSourceMap({file:b.destName}),l.map=l.map&&l.map.toString()):l=l.toString()),l},preamble:function(){this.lastContext=0,this.source=new l(this.options.srcName)},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));var d=0;for(var e in this.aliases){var f=this.aliases[e];this.aliases.hasOwnProperty(e)&&f.children&&f.referenceCount>1&&(b+=", alias"+ ++d+"="+e,f.children[0]="alias"+d)}var g=["depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&g.push("blockParams"),this.useDepths&&g.push("depths");var h=this.mergeSource(b);return a?(g.push(h),Function.apply(this,g)):this.source.wrap(["function(",g.join(","),") {\n ",h,"}"])},mergeSource:function(a){var b=this.environment.isSimple,c=!this.forceBuffer,d=void 0,e=void 0,f=void 0,g=void 0;return this.source.each(function(a){a.appendToBuffer?(f?a.prepend(" + "):f=a,g=a):(f&&(e?f.prepend("buffer += "):d=!0,g.add(";"),f=g=void 0),e=!0,b||(c=!1))}),c?f?(f.prepend("return "),g.add(";")):e||this.source.push('return "";'):(a+=", buffer = "+(d?"":this.initializeBuffer()),f?(f.prepend("return buffer + "),g.add(";")):this.source.push("return buffer;")),a&&this.source.prepend("var "+a.substring(2)+(d?"":";\n")),this.source.merge()},blockValue:function(a){var b=this.aliasable("helpers.blockHelperMissing"),c=[this.contextName(0)];this.setupHelperArgs(a,0,c);var d=this.popStack();c.splice(1,0,d),this.push(this.source.functionCall(b,"call",c))},ambiguousBlockValue:function(){var a=this.aliasable("helpers.blockHelperMissing"),b=[this.contextName(0)];this.setupHelperArgs("",0,b,!0),this.flushInline();var c=this.topStack();b.splice(1,0,c),this.pushSource(["if (!",this.lastHelper,") { ",c," = ",this.source.functionCall(a,"call",b),"}"])},appendContent:function(a){this.pendingContent?a=this.pendingContent+a:this.pendingLocation=this.source.currentLocation,this.pendingContent=a},append:function(){if(this.isInline())this.replaceStack(function(a){return[" != null ? ",a,' : ""']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var a=this.popStack();this.pushSource(["if (",a," != null) { ",this.appendToBuffer(a,void 0,!0)," }"]),this.environment.isSimple&&this.pushSource(["else { ",this.appendToBuffer("''",void 0,!0)," }"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable("this.escapeExpression"),"(",this.popStack(),")"]))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c){var d=0;c||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[d++])),this.resolvePath("context",a,d,b)},lookupBlockParam:function(a,b){this.useBlockParams=!0,this.push(["blockParams[",a[0],"][",a[1],"]"]),this.resolvePath("context",b,1)},lookupData:function(a,b){this.pushStackLiteral(a?"this.data(data, "+a+")":"data"),this.resolvePath("data",b,0,!0)},resolvePath:function(a,b,c,d){var e=this;if(this.options.strict||this.options.assumeObjects)return void this.push(i(this.options.strict,this,b,a));for(var f=b.length;f>c;c++)this.replaceStack(function(f){var g=e.nameLookup(f,b[c],a);return d?[" && ",g]:[" != null ? ",g," : ",f]})},resolvePossibleLambda:function(){this.push([this.aliasable("this.lambda"),"(",this.popStack(),", ",this.contextName(0),")"])},pushStringParam:function(a,b){this.pushContext(),this.pushString(b),"SubExpression"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(a){this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}")),this.pushStackLiteral(a?"undefined":"{}")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(a.ids)),this.stringParams&&(this.push(this.objectLiteral(a.contexts)),this.push(this.objectLiteral(a.types))),this.push(this.objectLiteral(a.values))},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){this.pushStackLiteral(null!=a?this.programExpression(a):null)},invokeHelper:function(a,b,c){var d=this.popStack(),e=this.setupHelper(a,b),f=c?[e.name," || "]:"",g=["("].concat(f,d);this.options.strict||g.push(" || ",this.aliasable("helpers.helperMissing")),g.push(")"),this.push(this.source.functionCall(g,"call",e.callParams))},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(this.source.functionCall(c.name,"call",c.callParams))},invokeAmbiguous:function(a,b){this.useRegister("helper");var c=this.popStack();this.emptyHash();var d=this.setupHelper(0,a,b),e=this.lastHelper=this.nameLookup("helpers",a,"helper"),f=["(","(helper = ",e," || ",c,")"];this.options.strict||(f[0]="(helper = ",f.push(" != null ? helper : ",this.aliasable("helpers.helperMissing"))),this.push(["(",f,d.paramsInit?["),(",d.paramsInit]:[],"),","(typeof helper === ",this.aliasable('"function"')," ? ",this.source.functionCall("helper","call",d.callParams)," : helper))"])},invokePartial:function(a,b,c){var d=[],e=this.setupParams(b,1,d,!1);a&&(b=this.popStack(),delete e.name),c&&(e.indent=JSON.stringify(c)),e.helpers="helpers",e.partials="partials",d.unshift(a?b:this.nameLookup("partials",b,"partial")),this.options.compat&&(e.depths="depths"),e=this.objectLiteral(e),d.push(e),this.push(this.source.functionCall("this.invokePartial","",d))},assignToHash:function(a){var b=this.popStack(),c=void 0,d=void 0,e=void 0;this.trackIds&&(e=this.popStack()),this.stringParams&&(d=this.popStack(),c=this.popStack());var f=this.hash;c&&(f.contexts[a]=c),d&&(f.types[a]=d),e&&(f.ids[a]=e),f.values[a]=b},pushId:function(a,b,c){"BlockParam"===a?this.pushStackLiteral("blockParams["+b[0]+"].path["+b[1]+"]"+(c?" + "+JSON.stringify("."+c):"")):"PathExpression"===a?this.pushString(b):this.pushStackLiteral("SubExpression"===a?"true":"null")},compiler:h,compileChildren:function(a,b){for(var c=a.children,d=void 0,e=void 0,f=0,g=c.length;g>f;f++){d=c[f],e=new this.compiler;var h=this.matchExistingProgram(d);null==h?(this.context.programs.push(""),h=this.context.programs.length,d.index=h,d.name="program"+h,this.context.programs[h]=e.compile(d,b,this.context,!this.precompile),this.context.environments[h]=d,this.useDepths=this.useDepths||e.useDepths,this.useBlockParams=this.useBlockParams||e.useBlockParams):(d.index=h,d.name="program"+h,this.useDepths=this.useDepths||d.useDepths,this.useBlockParams=this.useBlockParams||d.useBlockParams)}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;c>b;b++){var d=this.context.environments[b];if(d&&d.equals(a))return b}},programExpression:function(a){var b=this.environment.children[a],c=[b.index,"data",b.blockParams];return(this.useBlockParams||this.useDepths)&&c.push("blockParams"),this.useDepths&&c.push("depths"),"this.program("+c.join(", ")+")"},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},push:function(a){return a instanceof g||(a=this.source.wrap(a)),this.inlineStack.push(a),a},pushStackLiteral:function(a){this.push(new g(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),a&&this.source.push(a)},replaceStack:function(a){var b=["("],c=void 0,d=void 0,e=void 0;if(!this.isInline())throw new k("replaceStack on non-inline");var f=this.popStack(!0);if(f instanceof g)c=[f.value],b=["(",c],e=!0;else{d=!0;var h=this.incrStack();b=["((",this.push(h)," = ",f,")"],c=this.topStack()}var i=a.call(this,c);e||this.popStack(),d&&this.stackSlot--,this.push(b.concat(i,")"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;this.inlineStack=[];for(var b=0,c=a.length;c>b;b++){var d=a[b];if(d instanceof g)this.compileStack.push(d);else{var e=this.incrStack();this.pushSource([e," = ",d,";"]),this.compileStack.push(e)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),c=(b?this.inlineStack:this.compileStack).pop();if(!a&&c instanceof g)return c.value;if(!b){if(!this.stackSlot)throw new k("Invalid stack pop");this.stackSlot--}return c},topStack:function(){var a=this.isInline()?this.inlineStack:this.compileStack,b=a[a.length-1];return b instanceof g?b.value:b},contextName:function(a){return this.useDepths&&a?"depths["+a+"]":"depth"+a},quotedString:function(a){return this.source.quotedString(a)},objectLiteral:function(a){return this.source.objectLiteral(a)},aliasable:function(a){var b=this.aliases[a];return b?(b.referenceCount++,b):(b=this.aliases[a]=this.source.wrap(a),b.aliasable=!0,b.referenceCount=1,b)},setupHelper:function(a,b,c){var d=[],e=this.setupHelperArgs(b,a,d,c),f=this.nameLookup("helpers",b,"helper");return{params:d,paramsInit:e,name:f,callParams:[this.contextName(0)].concat(d)}},setupParams:function(a,b,c){var d={},e=[],f=[],g=[],h=void 0;d.name=this.quotedString(a),d.hash=this.popStack(),this.trackIds&&(d.hashIds=this.popStack()),this.stringParams&&(d.hashTypes=this.popStack(),d.hashContexts=this.popStack());var i=this.popStack(),j=this.popStack();(j||i)&&(d.fn=j||"this.noop",d.inverse=i||"this.noop");for(var k=b;k--;)h=this.popStack(),c[k]=h,this.trackIds&&(g[k]=this.popStack()),this.stringParams&&(f[k]=this.popStack(),e[k]=this.popStack());return this.trackIds&&(d.ids=this.source.generateArray(g)),this.stringParams&&(d.types=this.source.generateArray(f),d.contexts=this.source.generateArray(e)),this.options.data&&(d.data="data"),this.useBlockParams&&(d.blockParams="blockParams"),d},setupHelperArgs:function(a,b,c,d){var e=this.setupParams(a,b,c,!0);return e=this.objectLiteral(e),d?(this.useRegister("options"),c.push("options"),["options=",e]):(c.push(e),"")}},function(){for(var a="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false".split(" "),b=h.RESERVED_WORDS={},c=0,d=a.length;d>c;c++)b[a[c]]=!0}(),h.isValidJavaScriptVariableName=function(a){return!h.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},b.exports=h}),define("handlebars",["exports","module","./handlebars.runtime","./handlebars/compiler/ast","./handlebars/compiler/base","./handlebars/compiler/compiler","./handlebars/compiler/javascript-compiler","./handlebars/compiler/visitor","./handlebars/no-conflict"],function(a,b,c,d,e,f,g,h,i){function j(){var a=q();return a.compile=function(b,c){return f.compile(b,c,a)},a.precompile=function(b,c){return f.precompile(b,c,a)},a.AST=m,a.Compiler=f.Compiler,a.JavaScriptCompiler=n,a.Parser=e.parser,a.parse=e.parse,a}var k=function(a){return a&&a.__esModule?a["default"]:a -},l=k(c),m=k(d),n=k(g),o=k(h),p=k(i),q=l.create,r=j();r.create=j,p(r),r.Visitor=o,r["default"]=r,b.exports=r}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.js deleted file mode 100644 index e0f7535..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.js +++ /dev/null @@ -1,4098 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define(factory); - else if(typeof exports === 'object') - exports["Handlebars"] = factory(); - else - root["Handlebars"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; - -/******/ // The require function -/******/ function __webpack_require__(moduleId) { - -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; - -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; - -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - -/******/ // Flag the module as loaded -/******/ module.loaded = true; - -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } - - -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; - -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; - -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; - -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - - var _runtime = __webpack_require__(1); - - var _runtime2 = _interopRequireWildcard(_runtime); - - // Compiler imports - - var _AST = __webpack_require__(2); - - var _AST2 = _interopRequireWildcard(_AST); - - var _Parser$parse = __webpack_require__(3); - - var _Compiler$compile$precompile = __webpack_require__(4); - - var _JavaScriptCompiler = __webpack_require__(5); - - var _JavaScriptCompiler2 = _interopRequireWildcard(_JavaScriptCompiler); - - var _Visitor = __webpack_require__(6); - - var _Visitor2 = _interopRequireWildcard(_Visitor); - - var _noConflict = __webpack_require__(7); - - var _noConflict2 = _interopRequireWildcard(_noConflict); - - var _create = _runtime2['default'].create; - function create() { - var hb = _create(); - - hb.compile = function (input, options) { - return _Compiler$compile$precompile.compile(input, options, hb); - }; - hb.precompile = function (input, options) { - return _Compiler$compile$precompile.precompile(input, options, hb); - }; - - hb.AST = _AST2['default']; - hb.Compiler = _Compiler$compile$precompile.Compiler; - hb.JavaScriptCompiler = _JavaScriptCompiler2['default']; - hb.Parser = _Parser$parse.parser; - hb.parse = _Parser$parse.parse; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict2['default'](inst); - - inst.Visitor = _Visitor2['default']; - - inst['default'] = inst; - - exports['default'] = inst; - module.exports = exports['default']; - -/***/ }, -/* 1 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - - var _import = __webpack_require__(9); - - var base = _interopRequireWildcard(_import); - - // Each of these augment the Handlebars object. No need to setup here. - // (This is done to easily share code between commonjs and browse envs) - - var _SafeString = __webpack_require__(10); - - var _SafeString2 = _interopRequireWildcard(_SafeString); - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _import2 = __webpack_require__(12); - - var Utils = _interopRequireWildcard(_import2); - - var _import3 = __webpack_require__(13); - - var runtime = _interopRequireWildcard(_import3); - - var _noConflict = __webpack_require__(7); - - var _noConflict2 = _interopRequireWildcard(_noConflict); - - // For compatibility and usage outside of module systems, make the Handlebars object a namespace - function create() { - var hb = new base.HandlebarsEnvironment(); - - Utils.extend(hb, base); - hb.SafeString = _SafeString2['default']; - hb.Exception = _Exception2['default']; - hb.Utils = Utils; - hb.escapeExpression = Utils.escapeExpression; - - hb.VM = runtime; - hb.template = function (spec) { - return runtime.template(spec, hb); - }; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict2['default'](inst); - - inst['default'] = inst; - - exports['default'] = inst; - module.exports = exports['default']; - -/***/ }, -/* 2 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - var AST = { - Program: function Program(statements, blockParams, strip, locInfo) { - this.loc = locInfo; - this.type = 'Program'; - this.body = statements; - - this.blockParams = blockParams; - this.strip = strip; - }, - - MustacheStatement: function MustacheStatement(path, params, hash, escaped, strip, locInfo) { - this.loc = locInfo; - this.type = 'MustacheStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.escaped = escaped; - - this.strip = strip; - }, - - BlockStatement: function BlockStatement(path, params, hash, program, inverse, openStrip, inverseStrip, closeStrip, locInfo) { - this.loc = locInfo; - this.type = 'BlockStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.program = program; - this.inverse = inverse; - - this.openStrip = openStrip; - this.inverseStrip = inverseStrip; - this.closeStrip = closeStrip; - }, - - PartialStatement: function PartialStatement(name, params, hash, strip, locInfo) { - this.loc = locInfo; - this.type = 'PartialStatement'; - - this.name = name; - this.params = params || []; - this.hash = hash; - - this.indent = ''; - this.strip = strip; - }, - - ContentStatement: function ContentStatement(string, locInfo) { - this.loc = locInfo; - this.type = 'ContentStatement'; - this.original = this.value = string; - }, - - CommentStatement: function CommentStatement(comment, strip, locInfo) { - this.loc = locInfo; - this.type = 'CommentStatement'; - this.value = comment; - - this.strip = strip; - }, - - SubExpression: function SubExpression(path, params, hash, locInfo) { - this.loc = locInfo; - - this.type = 'SubExpression'; - this.path = path; - this.params = params || []; - this.hash = hash; - }, - - PathExpression: function PathExpression(data, depth, parts, original, locInfo) { - this.loc = locInfo; - this.type = 'PathExpression'; - - this.data = data; - this.original = original; - this.parts = parts; - this.depth = depth; - }, - - StringLiteral: function StringLiteral(string, locInfo) { - this.loc = locInfo; - this.type = 'StringLiteral'; - this.original = this.value = string; - }, - - NumberLiteral: function NumberLiteral(number, locInfo) { - this.loc = locInfo; - this.type = 'NumberLiteral'; - this.original = this.value = Number(number); - }, - - BooleanLiteral: function BooleanLiteral(bool, locInfo) { - this.loc = locInfo; - this.type = 'BooleanLiteral'; - this.original = this.value = bool === 'true'; - }, - - UndefinedLiteral: function UndefinedLiteral(locInfo) { - this.loc = locInfo; - this.type = 'UndefinedLiteral'; - this.original = this.value = undefined; - }, - - NullLiteral: function NullLiteral(locInfo) { - this.loc = locInfo; - this.type = 'NullLiteral'; - this.original = this.value = null; - }, - - Hash: function Hash(pairs, locInfo) { - this.loc = locInfo; - this.type = 'Hash'; - this.pairs = pairs; - }, - HashPair: function HashPair(key, value, locInfo) { - this.loc = locInfo; - this.type = 'HashPair'; - this.key = key; - this.value = value; - }, - - // Public API used to evaluate derived attributes regarding AST nodes - helpers: { - // a mustache is definitely a helper if: - // * it is an eligible helper, and - // * it has at least one parameter or hash segment - helperExpression: function helperExpression(node) { - return !!(node.type === 'SubExpression' || node.params.length || node.hash); - }, - - scopedId: function scopedId(path) { - return /^\.|this\b/.test(path.original); - }, - - // an ID is simple if it only has one part, and that part is not - // `..` or `this`. - simpleId: function simpleId(path) { - return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; - } - } - }; - - // Must be exported as an object rather than the root of the module as the jison lexer - // must modify the object to operate properly. - exports['default'] = AST; - module.exports = exports['default']; - -/***/ }, -/* 3 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - exports.parse = parse; - - var _parser = __webpack_require__(14); - - var _parser2 = _interopRequireWildcard(_parser); - - var _AST = __webpack_require__(2); - - var _AST2 = _interopRequireWildcard(_AST); - - var _WhitespaceControl = __webpack_require__(15); - - var _WhitespaceControl2 = _interopRequireWildcard(_WhitespaceControl); - - var _import = __webpack_require__(16); - - var Helpers = _interopRequireWildcard(_import); - - var _extend = __webpack_require__(12); - - exports.parser = _parser2['default']; - - var yy = {}; - _extend.extend(yy, Helpers, _AST2['default']); - - function parse(input, options) { - // Just return if an already-compiled AST was passed in. - if (input.type === 'Program') { - return input; - } - - _parser2['default'].yy = yy; - - // Altering the shared object here, but this is ok as parser is a sync operation - yy.locInfo = function (locInfo) { - return new yy.SourceLocation(options && options.srcName, locInfo); - }; - - var strip = new _WhitespaceControl2['default'](); - return strip.accept(_parser2['default'].parse(input)); - } - -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - exports.Compiler = Compiler; - exports.precompile = precompile; - exports.compile = compile; - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _isArray$indexOf = __webpack_require__(12); - - var _AST = __webpack_require__(2); - - var _AST2 = _interopRequireWildcard(_AST); - - var slice = [].slice; - - function Compiler() {} - - // the foundHelper register will disambiguate helper lookup from finding a - // function in a context. This is necessary for mustache compatibility, which - // requires that context functions in blocks are evaluated by blockHelperMissing, - // and then proceed as if the resulting value was provided to blockHelperMissing. - - Compiler.prototype = { - compiler: Compiler, - - equals: function equals(other) { - var len = this.opcodes.length; - if (other.opcodes.length !== len) { - return false; - } - - for (var i = 0; i < len; i++) { - var opcode = this.opcodes[i], - otherOpcode = other.opcodes[i]; - if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { - return false; - } - } - - // We know that length is the same between the two arrays because they are directly tied - // to the opcode behavior above. - len = this.children.length; - for (var i = 0; i < len; i++) { - if (!this.children[i].equals(other.children[i])) { - return false; - } - } - - return true; - }, - - guid: 0, - - compile: function compile(program, options) { - this.sourceNode = []; - this.opcodes = []; - this.children = []; - this.options = options; - this.stringParams = options.stringParams; - this.trackIds = options.trackIds; - - options.blockParams = options.blockParams || []; - - // These changes will propagate to the other compiler components - var knownHelpers = options.knownHelpers; - options.knownHelpers = { - helperMissing: true, - blockHelperMissing: true, - each: true, - 'if': true, - unless: true, - 'with': true, - log: true, - lookup: true - }; - if (knownHelpers) { - for (var _name in knownHelpers) { - if (_name in knownHelpers) { - options.knownHelpers[_name] = knownHelpers[_name]; - } - } - } - - return this.accept(program); - }, - - compileProgram: function compileProgram(program) { - var childCompiler = new this.compiler(), - // eslint-disable-line new-cap - result = childCompiler.compile(program, this.options), - guid = this.guid++; - - this.usePartial = this.usePartial || result.usePartial; - - this.children[guid] = result; - this.useDepths = this.useDepths || result.useDepths; - - return guid; - }, - - accept: function accept(node) { - this.sourceNode.unshift(node); - var ret = this[node.type](node); - this.sourceNode.shift(); - return ret; - }, - - Program: function Program(program) { - this.options.blockParams.unshift(program.blockParams); - - var body = program.body, - bodyLength = body.length; - for (var i = 0; i < bodyLength; i++) { - this.accept(body[i]); - } - - this.options.blockParams.shift(); - - this.isSimple = bodyLength === 1; - this.blockParams = program.blockParams ? program.blockParams.length : 0; - - return this; - }, - - BlockStatement: function BlockStatement(block) { - transformLiteralToPath(block); - - var program = block.program, - inverse = block.inverse; - - program = program && this.compileProgram(program); - inverse = inverse && this.compileProgram(inverse); - - var type = this.classifySexpr(block); - - if (type === 'helper') { - this.helperSexpr(block, program, inverse); - } else if (type === 'simple') { - this.simpleSexpr(block); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('blockValue', block.path.original); - } else { - this.ambiguousSexpr(block, program, inverse); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('ambiguousBlockValue'); - } - - this.opcode('append'); - }, - - PartialStatement: function PartialStatement(partial) { - this.usePartial = true; - - var params = partial.params; - if (params.length > 1) { - throw new _Exception2['default']('Unsupported number of partial arguments: ' + params.length, partial); - } else if (!params.length) { - params.push({ type: 'PathExpression', parts: [], depth: 0 }); - } - - var partialName = partial.name.original, - isDynamic = partial.name.type === 'SubExpression'; - if (isDynamic) { - this.accept(partial.name); - } - - this.setupFullMustacheParams(partial, undefined, undefined, true); - - var indent = partial.indent || ''; - if (this.options.preventIndent && indent) { - this.opcode('appendContent', indent); - indent = ''; - } - - this.opcode('invokePartial', isDynamic, partialName, indent); - this.opcode('append'); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.SubExpression(mustache); // eslint-disable-line new-cap - - if (mustache.escaped && !this.options.noEscape) { - this.opcode('appendEscaped'); - } else { - this.opcode('append'); - } - }, - - ContentStatement: function ContentStatement(content) { - if (content.value) { - this.opcode('appendContent', content.value); - } - }, - - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - transformLiteralToPath(sexpr); - var type = this.classifySexpr(sexpr); - - if (type === 'simple') { - this.simpleSexpr(sexpr); - } else if (type === 'helper') { - this.helperSexpr(sexpr); - } else { - this.ambiguousSexpr(sexpr); - } - }, - ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) { - var path = sexpr.path, - name = path.parts[0], - isBlock = program != null || inverse != null; - - this.opcode('getContext', path.depth); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - this.accept(path); - - this.opcode('invokeAmbiguous', name, isBlock); - }, - - simpleSexpr: function simpleSexpr(sexpr) { - this.accept(sexpr.path); - this.opcode('resolvePossibleLambda'); - }, - - helperSexpr: function helperSexpr(sexpr, program, inverse) { - var params = this.setupFullMustacheParams(sexpr, program, inverse), - path = sexpr.path, - name = path.parts[0]; - - if (this.options.knownHelpers[name]) { - this.opcode('invokeKnownHelper', params.length, name); - } else if (this.options.knownHelpersOnly) { - throw new _Exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); - } else { - path.falsy = true; - - this.accept(path); - this.opcode('invokeHelper', params.length, path.original, _AST2['default'].helpers.simpleId(path)); - } - }, - - PathExpression: function PathExpression(path) { - this.addDepth(path.depth); - this.opcode('getContext', path.depth); - - var name = path.parts[0], - scoped = _AST2['default'].helpers.scopedId(path), - blockParamId = !path.depth && !scoped && this.blockParamIndex(name); - - if (blockParamId) { - this.opcode('lookupBlockParam', blockParamId, path.parts); - } else if (!name) { - // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` - this.opcode('pushContext'); - } else if (path.data) { - this.options.data = true; - this.opcode('lookupData', path.depth, path.parts); - } else { - this.opcode('lookupOnContext', path.parts, path.falsy, scoped); - } - }, - - StringLiteral: function StringLiteral(string) { - this.opcode('pushString', string.value); - }, - - NumberLiteral: function NumberLiteral(number) { - this.opcode('pushLiteral', number.value); - }, - - BooleanLiteral: function BooleanLiteral(bool) { - this.opcode('pushLiteral', bool.value); - }, - - UndefinedLiteral: function UndefinedLiteral() { - this.opcode('pushLiteral', 'undefined'); - }, - - NullLiteral: function NullLiteral() { - this.opcode('pushLiteral', 'null'); - }, - - Hash: function Hash(hash) { - var pairs = hash.pairs, - i = 0, - l = pairs.length; - - this.opcode('pushHash'); - - for (; i < l; i++) { - this.pushParam(pairs[i].value); - } - while (i--) { - this.opcode('assignToHash', pairs[i].key); - } - this.opcode('popHash'); - }, - - // HELPERS - opcode: function opcode(name) { - this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); - }, - - addDepth: function addDepth(depth) { - if (!depth) { - return; - } - - this.useDepths = true; - }, - - classifySexpr: function classifySexpr(sexpr) { - var isSimple = _AST2['default'].helpers.simpleId(sexpr.path); - - var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); - - // a mustache is an eligible helper if: - // * its id is simple (a single part, not `this` or `..`) - var isHelper = !isBlockParam && _AST2['default'].helpers.helperExpression(sexpr); - - // if a mustache is an eligible helper but not a definite - // helper, it is ambiguous, and will be resolved in a later - // pass or at runtime. - var isEligible = !isBlockParam && (isHelper || isSimple); - - // if ambiguous, we can possibly resolve the ambiguity now - // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. - if (isEligible && !isHelper) { - var _name2 = sexpr.path.parts[0], - options = this.options; - - if (options.knownHelpers[_name2]) { - isHelper = true; - } else if (options.knownHelpersOnly) { - isEligible = false; - } - } - - if (isHelper) { - return 'helper'; - } else if (isEligible) { - return 'ambiguous'; - } else { - return 'simple'; - } - }, - - pushParams: function pushParams(params) { - for (var i = 0, l = params.length; i < l; i++) { - this.pushParam(params[i]); - } - }, - - pushParam: function pushParam(val) { - var value = val.value != null ? val.value : val.original || ''; - - if (this.stringParams) { - if (value.replace) { - value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.'); - } - - if (val.depth) { - this.addDepth(val.depth); - } - this.opcode('getContext', val.depth || 0); - this.opcode('pushStringParam', value, val.type); - - if (val.type === 'SubExpression') { - // SubExpressions get evaluated and passed in - // in string params mode. - this.accept(val); - } - } else { - if (this.trackIds) { - var blockParamIndex = undefined; - if (val.parts && !_AST2['default'].helpers.scopedId(val) && !val.depth) { - blockParamIndex = this.blockParamIndex(val.parts[0]); - } - if (blockParamIndex) { - var blockParamChild = val.parts.slice(1).join('.'); - this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); - } else { - value = val.original || value; - if (value.replace) { - value = value.replace(/^\.\//g, '').replace(/^\.$/g, ''); - } - - this.opcode('pushId', val.type, value); - } - } - this.accept(val); - } - }, - - setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) { - var params = sexpr.params; - this.pushParams(params); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - if (sexpr.hash) { - this.accept(sexpr.hash); - } else { - this.opcode('emptyHash', omitEmpty); - } - - return params; - }, - - blockParamIndex: function blockParamIndex(name) { - for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) { - var blockParams = this.options.blockParams[depth], - param = blockParams && _isArray$indexOf.indexOf(blockParams, name); - if (blockParams && param >= 0) { - return [depth, param]; - } - } - } - }; - - function precompile(input, options, env) { - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); - } - - options = options || {}; - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options); - return new env.JavaScriptCompiler().compile(environment, options); - } - - function compile(input, _x, env) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); - } - - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var compiled = undefined; - - function compileInput() { - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options), - templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); - return env.template(templateSpec); - } - - // Template is only compiled on first use and cached after that point. - function ret(context, execOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled.call(this, context, execOptions); - } - ret._setup = function (setupOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._setup(setupOptions); - }; - ret._child = function (i, data, blockParams, depths) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._child(i, data, blockParams, depths); - }; - return ret; - } - - function argEquals(a, b) { - if (a === b) { - return true; - } - - if (_isArray$indexOf.isArray(a) && _isArray$indexOf.isArray(b) && a.length === b.length) { - for (var i = 0; i < a.length; i++) { - if (!argEquals(a[i], b[i])) { - return false; - } - } - return true; - } - } - - function transformLiteralToPath(sexpr) { - if (!sexpr.path.parts) { - var literal = sexpr.path; - // Casting to string here to make false and 0 literal values play nicely with the rest - // of the system. - sexpr.path = new _AST2['default'].PathExpression(false, 0, [literal.original + ''], literal.original + '', literal.loc); - } - } - -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - - var _COMPILER_REVISION$REVISION_CHANGES = __webpack_require__(9); - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _isArray = __webpack_require__(12); - - var _CodeGen = __webpack_require__(17); - - var _CodeGen2 = _interopRequireWildcard(_CodeGen); - - function Literal(value) { - this.value = value; - } - - function JavaScriptCompiler() {} - - JavaScriptCompiler.prototype = { - // PUBLIC API: You can override these methods in a subclass to provide - // alternative compiled forms for name lookup and buffering semantics - nameLookup: function nameLookup(parent, name /* , type*/) { - if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { - return [parent, '.', name]; - } else { - return [parent, '[\'', name, '\']']; - } - }, - depthedLookup: function depthedLookup(name) { - return [this.aliasable('this.lookup'), '(depths, "', name, '")']; - }, - - compilerInfo: function compilerInfo() { - var revision = _COMPILER_REVISION$REVISION_CHANGES.COMPILER_REVISION, - versions = _COMPILER_REVISION$REVISION_CHANGES.REVISION_CHANGES[revision]; - return [revision, versions]; - }, - - appendToBuffer: function appendToBuffer(source, location, explicit) { - // Force a source as this simplifies the merge logic. - if (!_isArray.isArray(source)) { - source = [source]; - } - source = this.source.wrap(source, location); - - if (this.environment.isSimple) { - return ['return ', source, ';']; - } else if (explicit) { - // This is a case where the buffer operation occurs as a child of another - // construct, generally braces. We have to explicitly output these buffer - // operations to ensure that the emitted code goes in the correct location. - return ['buffer += ', source, ';']; - } else { - source.appendToBuffer = true; - return source; - } - }, - - initializeBuffer: function initializeBuffer() { - return this.quotedString(''); - }, - // END PUBLIC API - - compile: function compile(environment, options, context, asObject) { - this.environment = environment; - this.options = options; - this.stringParams = this.options.stringParams; - this.trackIds = this.options.trackIds; - this.precompile = !asObject; - - this.name = this.environment.name; - this.isChild = !!context; - this.context = context || { - programs: [], - environments: [] - }; - - this.preamble(); - - this.stackSlot = 0; - this.stackVars = []; - this.aliases = {}; - this.registers = { list: [] }; - this.hashes = []; - this.compileStack = []; - this.inlineStack = []; - this.blockParams = []; - - this.compileChildren(environment, options); - - this.useDepths = this.useDepths || environment.useDepths || this.options.compat; - this.useBlockParams = this.useBlockParams || environment.useBlockParams; - - var opcodes = environment.opcodes, - opcode = undefined, - firstLoc = undefined, - i = undefined, - l = undefined; - - for (i = 0, l = opcodes.length; i < l; i++) { - opcode = opcodes[i]; - - this.source.currentLocation = opcode.loc; - firstLoc = firstLoc || opcode.loc; - this[opcode.opcode].apply(this, opcode.args); - } - - // Flush any trailing content that might be pending. - this.source.currentLocation = firstLoc; - this.pushSource(''); - - /* istanbul ignore next */ - if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { - throw new _Exception2['default']('Compile completed with content left on stack'); - } - - var fn = this.createFunctionContext(asObject); - if (!this.isChild) { - var ret = { - compiler: this.compilerInfo(), - main: fn - }; - var programs = this.context.programs; - for (i = 0, l = programs.length; i < l; i++) { - if (programs[i]) { - ret[i] = programs[i]; - } - } - - if (this.environment.usePartial) { - ret.usePartial = true; - } - if (this.options.data) { - ret.useData = true; - } - if (this.useDepths) { - ret.useDepths = true; - } - if (this.useBlockParams) { - ret.useBlockParams = true; - } - if (this.options.compat) { - ret.compat = true; - } - - if (!asObject) { - ret.compiler = JSON.stringify(ret.compiler); - - this.source.currentLocation = { start: { line: 1, column: 0 } }; - ret = this.objectLiteral(ret); - - if (options.srcName) { - ret = ret.toStringWithSourceMap({ file: options.destName }); - ret.map = ret.map && ret.map.toString(); - } else { - ret = ret.toString(); - } - } else { - ret.compilerOptions = this.options; - } - - return ret; - } else { - return fn; - } - }, - - preamble: function preamble() { - // track the last context pushed into place to allow skipping the - // getContext opcode when it would be a noop - this.lastContext = 0; - this.source = new _CodeGen2['default'](this.options.srcName); - }, - - createFunctionContext: function createFunctionContext(asObject) { - var varDeclarations = ''; - - var locals = this.stackVars.concat(this.registers.list); - if (locals.length > 0) { - varDeclarations += ', ' + locals.join(', '); - } - - // Generate minimizer alias mappings - // - // When using true SourceNodes, this will update all references to the given alias - // as the source nodes are reused in situ. For the non-source node compilation mode, - // aliases will not be used, but this case is already being run on the client and - // we aren't concern about minimizing the template size. - var aliasCount = 0; - for (var alias in this.aliases) { - // eslint-disable-line guard-for-in - var node = this.aliases[alias]; - - if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) { - varDeclarations += ', alias' + ++aliasCount + '=' + alias; - node.children[0] = 'alias' + aliasCount; - } - } - - var params = ['depth0', 'helpers', 'partials', 'data']; - - if (this.useBlockParams || this.useDepths) { - params.push('blockParams'); - } - if (this.useDepths) { - params.push('depths'); - } - - // Perform a second pass over the output to merge content when possible - var source = this.mergeSource(varDeclarations); - - if (asObject) { - params.push(source); - - return Function.apply(this, params); - } else { - return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); - } - }, - mergeSource: function mergeSource(varDeclarations) { - var isSimple = this.environment.isSimple, - appendOnly = !this.forceBuffer, - appendFirst = undefined, - sourceSeen = undefined, - bufferStart = undefined, - bufferEnd = undefined; - this.source.each(function (line) { - if (line.appendToBuffer) { - if (bufferStart) { - line.prepend(' + '); - } else { - bufferStart = line; - } - bufferEnd = line; - } else { - if (bufferStart) { - if (!sourceSeen) { - appendFirst = true; - } else { - bufferStart.prepend('buffer += '); - } - bufferEnd.add(';'); - bufferStart = bufferEnd = undefined; - } - - sourceSeen = true; - if (!isSimple) { - appendOnly = false; - } - } - }); - - if (appendOnly) { - if (bufferStart) { - bufferStart.prepend('return '); - bufferEnd.add(';'); - } else if (!sourceSeen) { - this.source.push('return "";'); - } - } else { - varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); - - if (bufferStart) { - bufferStart.prepend('return buffer + '); - bufferEnd.add(';'); - } else { - this.source.push('return buffer;'); - } - } - - if (varDeclarations) { - this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); - } - - return this.source.merge(); - }, - - // [blockValue] - // - // On stack, before: hash, inverse, program, value - // On stack, after: return value of blockHelperMissing - // - // The purpose of this opcode is to take a block of the form - // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and - // replace it on the stack with the result of properly - // invoking blockHelperMissing. - blockValue: function blockValue(name) { - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs(name, 0, params); - - var blockName = this.popStack(); - params.splice(1, 0, blockName); - - this.push(this.source.functionCall(blockHelperMissing, 'call', params)); - }, - - // [ambiguousBlockValue] - // - // On stack, before: hash, inverse, program, value - // Compiler value, before: lastHelper=value of last found helper, if any - // On stack, after, if no lastHelper: same as [blockValue] - // On stack, after, if lastHelper: value - ambiguousBlockValue: function ambiguousBlockValue() { - // We're being a bit cheeky and reusing the options value from the prior exec - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs('', 0, params, true); - - this.flushInline(); - - var current = this.topStack(); - params.splice(1, 0, current); - - this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']); - }, - - // [appendContent] - // - // On stack, before: ... - // On stack, after: ... - // - // Appends the string value of `content` to the current buffer - appendContent: function appendContent(content) { - if (this.pendingContent) { - content = this.pendingContent + content; - } else { - this.pendingLocation = this.source.currentLocation; - } - - this.pendingContent = content; - }, - - // [append] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Coerces `value` to a String and appends it to the current buffer. - // - // If `value` is truthy, or 0, it is coerced into a string and appended - // Otherwise, the empty string is appended - append: function append() { - if (this.isInline()) { - this.replaceStack(function (current) { - return [' != null ? ', current, ' : ""']; - }); - - this.pushSource(this.appendToBuffer(this.popStack())); - } else { - var local = this.popStack(); - this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); - if (this.environment.isSimple) { - this.pushSource(['else { ', this.appendToBuffer('\'\'', undefined, true), ' }']); - } - } - }, - - // [appendEscaped] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Escape `value` and append it to the buffer - appendEscaped: function appendEscaped() { - this.pushSource(this.appendToBuffer([this.aliasable('this.escapeExpression'), '(', this.popStack(), ')'])); - }, - - // [getContext] - // - // On stack, before: ... - // On stack, after: ... - // Compiler value, after: lastContext=depth - // - // Set the value of the `lastContext` compiler value to the depth - getContext: function getContext(depth) { - this.lastContext = depth; - }, - - // [pushContext] - // - // On stack, before: ... - // On stack, after: currentContext, ... - // - // Pushes the value of the current context onto the stack. - pushContext: function pushContext() { - this.pushStackLiteral(this.contextName(this.lastContext)); - }, - - // [lookupOnContext] - // - // On stack, before: ... - // On stack, after: currentContext[name], ... - // - // Looks up the value of `name` on the current context and pushes - // it onto the stack. - lookupOnContext: function lookupOnContext(parts, falsy, scoped) { - var i = 0; - - if (!scoped && this.options.compat && !this.lastContext) { - // The depthed query is expected to handle the undefined logic for the root level that - // is implemented below, so we evaluate that directly in compat mode - this.push(this.depthedLookup(parts[i++])); - } else { - this.pushContext(); - } - - this.resolvePath('context', parts, i, falsy); - }, - - // [lookupBlockParam] - // - // On stack, before: ... - // On stack, after: blockParam[name], ... - // - // Looks up the value of `parts` on the given block param and pushes - // it onto the stack. - lookupBlockParam: function lookupBlockParam(blockParamId, parts) { - this.useBlockParams = true; - - this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); - this.resolvePath('context', parts, 1); - }, - - // [lookupData] - // - // On stack, before: ... - // On stack, after: data, ... - // - // Push the data lookup operator - lookupData: function lookupData(depth, parts) { - if (!depth) { - this.pushStackLiteral('data'); - } else { - this.pushStackLiteral('this.data(data, ' + depth + ')'); - } - - this.resolvePath('data', parts, 0, true); - }, - - resolvePath: function resolvePath(type, parts, i, falsy) { - var _this = this; - - if (this.options.strict || this.options.assumeObjects) { - this.push(strictLookup(this.options.strict, this, parts, type)); - return; - } - - var len = parts.length; - for (; i < len; i++) { - /*eslint-disable no-loop-func */ - this.replaceStack(function (current) { - var lookup = _this.nameLookup(current, parts[i], type); - // We want to ensure that zero and false are handled properly if the context (falsy flag) - // needs to have the special handling for these values. - if (!falsy) { - return [' != null ? ', lookup, ' : ', current]; - } else { - // Otherwise we can use generic falsy handling - return [' && ', lookup]; - } - }); - /*eslint-enable no-loop-func */ - } - }, - - // [resolvePossibleLambda] - // - // On stack, before: value, ... - // On stack, after: resolved value, ... - // - // If the `value` is a lambda, replace it on the stack by - // the return value of the lambda - resolvePossibleLambda: function resolvePossibleLambda() { - this.push([this.aliasable('this.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); - }, - - // [pushStringParam] - // - // On stack, before: ... - // On stack, after: string, currentContext, ... - // - // This opcode is designed for use in string mode, which - // provides the string value of a parameter along with its - // depth rather than resolving it immediately. - pushStringParam: function pushStringParam(string, type) { - this.pushContext(); - this.pushString(type); - - // If it's a subexpression, the string result - // will be pushed after this opcode. - if (type !== 'SubExpression') { - if (typeof string === 'string') { - this.pushString(string); - } else { - this.pushStackLiteral(string); - } - } - }, - - emptyHash: function emptyHash(omitEmpty) { - if (this.trackIds) { - this.push('{}'); // hashIds - } - if (this.stringParams) { - this.push('{}'); // hashContexts - this.push('{}'); // hashTypes - } - this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); - }, - pushHash: function pushHash() { - if (this.hash) { - this.hashes.push(this.hash); - } - this.hash = { values: [], types: [], contexts: [], ids: [] }; - }, - popHash: function popHash() { - var hash = this.hash; - this.hash = this.hashes.pop(); - - if (this.trackIds) { - this.push(this.objectLiteral(hash.ids)); - } - if (this.stringParams) { - this.push(this.objectLiteral(hash.contexts)); - this.push(this.objectLiteral(hash.types)); - } - - this.push(this.objectLiteral(hash.values)); - }, - - // [pushString] - // - // On stack, before: ... - // On stack, after: quotedString(string), ... - // - // Push a quoted version of `string` onto the stack - pushString: function pushString(string) { - this.pushStackLiteral(this.quotedString(string)); - }, - - // [pushLiteral] - // - // On stack, before: ... - // On stack, after: value, ... - // - // Pushes a value onto the stack. This operation prevents - // the compiler from creating a temporary variable to hold - // it. - pushLiteral: function pushLiteral(value) { - this.pushStackLiteral(value); - }, - - // [pushProgram] - // - // On stack, before: ... - // On stack, after: program(guid), ... - // - // Push a program expression onto the stack. This takes - // a compile-time guid and converts it into a runtime-accessible - // expression. - pushProgram: function pushProgram(guid) { - if (guid != null) { - this.pushStackLiteral(this.programExpression(guid)); - } else { - this.pushStackLiteral(null); - } - }, - - // [invokeHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // Pops off the helper's parameters, invokes the helper, - // and pushes the helper's return value onto the stack. - // - // If the helper is not found, `helperMissing` is called. - invokeHelper: function invokeHelper(paramSize, name, isSimple) { - var nonHelper = this.popStack(), - helper = this.setupHelper(paramSize, name), - simple = isSimple ? [helper.name, ' || '] : ''; - - var lookup = ['('].concat(simple, nonHelper); - if (!this.options.strict) { - lookup.push(' || ', this.aliasable('helpers.helperMissing')); - } - lookup.push(')'); - - this.push(this.source.functionCall(lookup, 'call', helper.callParams)); - }, - - // [invokeKnownHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // This operation is used when the helper is known to exist, - // so a `helperMissing` fallback is not required. - invokeKnownHelper: function invokeKnownHelper(paramSize, name) { - var helper = this.setupHelper(paramSize, name); - this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); - }, - - // [invokeAmbiguous] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of disambiguation - // - // This operation is used when an expression like `{{foo}}` - // is provided, but we don't know at compile-time whether it - // is a helper or a path. - // - // This operation emits more code than the other options, - // and can be avoided by passing the `knownHelpers` and - // `knownHelpersOnly` flags at compile-time. - invokeAmbiguous: function invokeAmbiguous(name, helperCall) { - this.useRegister('helper'); - - var nonHelper = this.popStack(); - - this.emptyHash(); - var helper = this.setupHelper(0, name, helperCall); - - var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); - - var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; - if (!this.options.strict) { - lookup[0] = '(helper = '; - lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing')); - } - - this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']); - }, - - // [invokePartial] - // - // On stack, before: context, ... - // On stack after: result of partial invocation - // - // This operation pops off a context, invokes a partial with that context, - // and pushes the result of the invocation back. - invokePartial: function invokePartial(isDynamic, name, indent) { - var params = [], - options = this.setupParams(name, 1, params, false); - - if (isDynamic) { - name = this.popStack(); - delete options.name; - } - - if (indent) { - options.indent = JSON.stringify(indent); - } - options.helpers = 'helpers'; - options.partials = 'partials'; - - if (!isDynamic) { - params.unshift(this.nameLookup('partials', name, 'partial')); - } else { - params.unshift(name); - } - - if (this.options.compat) { - options.depths = 'depths'; - } - options = this.objectLiteral(options); - params.push(options); - - this.push(this.source.functionCall('this.invokePartial', '', params)); - }, - - // [assignToHash] - // - // On stack, before: value, ..., hash, ... - // On stack, after: ..., hash, ... - // - // Pops a value off the stack and assigns it to the current hash - assignToHash: function assignToHash(key) { - var value = this.popStack(), - context = undefined, - type = undefined, - id = undefined; - - if (this.trackIds) { - id = this.popStack(); - } - if (this.stringParams) { - type = this.popStack(); - context = this.popStack(); - } - - var hash = this.hash; - if (context) { - hash.contexts[key] = context; - } - if (type) { - hash.types[key] = type; - } - if (id) { - hash.ids[key] = id; - } - hash.values[key] = value; - }, - - pushId: function pushId(type, name, child) { - if (type === 'BlockParam') { - this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : '')); - } else if (type === 'PathExpression') { - this.pushString(name); - } else if (type === 'SubExpression') { - this.pushStackLiteral('true'); - } else { - this.pushStackLiteral('null'); - } - }, - - // HELPERS - - compiler: JavaScriptCompiler, - - compileChildren: function compileChildren(environment, options) { - var children = environment.children, - child = undefined, - compiler = undefined; - - for (var i = 0, l = children.length; i < l; i++) { - child = children[i]; - compiler = new this.compiler(); // eslint-disable-line new-cap - - var index = this.matchExistingProgram(child); - - if (index == null) { - this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children - index = this.context.programs.length; - child.index = index; - child.name = 'program' + index; - this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); - this.context.environments[index] = child; - - this.useDepths = this.useDepths || compiler.useDepths; - this.useBlockParams = this.useBlockParams || compiler.useBlockParams; - } else { - child.index = index; - child.name = 'program' + index; - - this.useDepths = this.useDepths || child.useDepths; - this.useBlockParams = this.useBlockParams || child.useBlockParams; - } - } - }, - matchExistingProgram: function matchExistingProgram(child) { - for (var i = 0, len = this.context.environments.length; i < len; i++) { - var environment = this.context.environments[i]; - if (environment && environment.equals(child)) { - return i; - } - } - }, - - programExpression: function programExpression(guid) { - var child = this.environment.children[guid], - programParams = [child.index, 'data', child.blockParams]; - - if (this.useBlockParams || this.useDepths) { - programParams.push('blockParams'); - } - if (this.useDepths) { - programParams.push('depths'); - } - - return 'this.program(' + programParams.join(', ') + ')'; - }, - - useRegister: function useRegister(name) { - if (!this.registers[name]) { - this.registers[name] = true; - this.registers.list.push(name); - } - }, - - push: function push(expr) { - if (!(expr instanceof Literal)) { - expr = this.source.wrap(expr); - } - - this.inlineStack.push(expr); - return expr; - }, - - pushStackLiteral: function pushStackLiteral(item) { - this.push(new Literal(item)); - }, - - pushSource: function pushSource(source) { - if (this.pendingContent) { - this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); - this.pendingContent = undefined; - } - - if (source) { - this.source.push(source); - } - }, - - replaceStack: function replaceStack(callback) { - var prefix = ['('], - stack = undefined, - createdStack = undefined, - usedLiteral = undefined; - - /* istanbul ignore next */ - if (!this.isInline()) { - throw new _Exception2['default']('replaceStack on non-inline'); - } - - // We want to merge the inline statement into the replacement statement via ',' - var top = this.popStack(true); - - if (top instanceof Literal) { - // Literals do not need to be inlined - stack = [top.value]; - prefix = ['(', stack]; - usedLiteral = true; - } else { - // Get or create the current stack name for use by the inline - createdStack = true; - var _name = this.incrStack(); - - prefix = ['((', this.push(_name), ' = ', top, ')']; - stack = this.topStack(); - } - - var item = callback.call(this, stack); - - if (!usedLiteral) { - this.popStack(); - } - if (createdStack) { - this.stackSlot--; - } - this.push(prefix.concat(item, ')')); - }, - - incrStack: function incrStack() { - this.stackSlot++; - if (this.stackSlot > this.stackVars.length) { - this.stackVars.push('stack' + this.stackSlot); - } - return this.topStackName(); - }, - topStackName: function topStackName() { - return 'stack' + this.stackSlot; - }, - flushInline: function flushInline() { - var inlineStack = this.inlineStack; - this.inlineStack = []; - for (var i = 0, len = inlineStack.length; i < len; i++) { - var entry = inlineStack[i]; - /* istanbul ignore if */ - if (entry instanceof Literal) { - this.compileStack.push(entry); - } else { - var stack = this.incrStack(); - this.pushSource([stack, ' = ', entry, ';']); - this.compileStack.push(stack); - } - } - }, - isInline: function isInline() { - return this.inlineStack.length; - }, - - popStack: function popStack(wrapped) { - var inline = this.isInline(), - item = (inline ? this.inlineStack : this.compileStack).pop(); - - if (!wrapped && item instanceof Literal) { - return item.value; - } else { - if (!inline) { - /* istanbul ignore next */ - if (!this.stackSlot) { - throw new _Exception2['default']('Invalid stack pop'); - } - this.stackSlot--; - } - return item; - } - }, - - topStack: function topStack() { - var stack = this.isInline() ? this.inlineStack : this.compileStack, - item = stack[stack.length - 1]; - - /* istanbul ignore if */ - if (item instanceof Literal) { - return item.value; - } else { - return item; - } - }, - - contextName: function contextName(context) { - if (this.useDepths && context) { - return 'depths[' + context + ']'; - } else { - return 'depth' + context; - } - }, - - quotedString: function quotedString(str) { - return this.source.quotedString(str); - }, - - objectLiteral: function objectLiteral(obj) { - return this.source.objectLiteral(obj); - }, - - aliasable: function aliasable(name) { - var ret = this.aliases[name]; - if (ret) { - ret.referenceCount++; - return ret; - } - - ret = this.aliases[name] = this.source.wrap(name); - ret.aliasable = true; - ret.referenceCount = 1; - - return ret; - }, - - setupHelper: function setupHelper(paramSize, name, blockHelper) { - var params = [], - paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); - var foundHelper = this.nameLookup('helpers', name, 'helper'); - - return { - params: params, - paramsInit: paramsInit, - name: foundHelper, - callParams: [this.contextName(0)].concat(params) - }; - }, - - setupParams: function setupParams(helper, paramSize, params) { - var options = {}, - contexts = [], - types = [], - ids = [], - param = undefined; - - options.name = this.quotedString(helper); - options.hash = this.popStack(); - - if (this.trackIds) { - options.hashIds = this.popStack(); - } - if (this.stringParams) { - options.hashTypes = this.popStack(); - options.hashContexts = this.popStack(); - } - - var inverse = this.popStack(), - program = this.popStack(); - - // Avoid setting fn and inverse if neither are set. This allows - // helpers to do a check for `if (options.fn)` - if (program || inverse) { - options.fn = program || 'this.noop'; - options.inverse = inverse || 'this.noop'; - } - - // The parameters go on to the stack in order (making sure that they are evaluated in order) - // so we need to pop them off the stack in reverse order - var i = paramSize; - while (i--) { - param = this.popStack(); - params[i] = param; - - if (this.trackIds) { - ids[i] = this.popStack(); - } - if (this.stringParams) { - types[i] = this.popStack(); - contexts[i] = this.popStack(); - } - } - - if (this.trackIds) { - options.ids = this.source.generateArray(ids); - } - if (this.stringParams) { - options.types = this.source.generateArray(types); - options.contexts = this.source.generateArray(contexts); - } - - if (this.options.data) { - options.data = 'data'; - } - if (this.useBlockParams) { - options.blockParams = 'blockParams'; - } - return options; - }, - - setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) { - var options = this.setupParams(helper, paramSize, params, true); - options = this.objectLiteral(options); - if (useRegister) { - this.useRegister('options'); - params.push('options'); - return ['options=', options]; - } else { - params.push(options); - return ''; - } - } - }; - - (function () { - var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' '); - - var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; - - for (var i = 0, l = reservedWords.length; i < l; i++) { - compilerWords[reservedWords[i]] = true; - } - })(); - - JavaScriptCompiler.isValidJavaScriptVariableName = function (name) { - return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name); - }; - - function strictLookup(requireTerminal, compiler, parts, type) { - var stack = compiler.popStack(), - i = 0, - len = parts.length; - if (requireTerminal) { - len--; - } - - for (; i < len; i++) { - stack = compiler.nameLookup(stack, parts[i], type); - } - - if (requireTerminal) { - return [compiler.aliasable('this.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')']; - } else { - return stack; - } - } - - exports['default'] = JavaScriptCompiler; - module.exports = exports['default']; - -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _AST = __webpack_require__(2); - - var _AST2 = _interopRequireWildcard(_AST); - - function Visitor() { - this.parents = []; - } - - Visitor.prototype = { - constructor: Visitor, - mutating: false, - - // Visits a given value. If mutating, will replace the value if necessary. - acceptKey: function acceptKey(node, name) { - var value = this.accept(node[name]); - if (this.mutating) { - // Hacky sanity check: - if (value && (!value.type || !_AST2['default'][value.type])) { - throw new _Exception2['default']('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); - } - node[name] = value; - } - }, - - // Performs an accept operation with added sanity check to ensure - // required keys are not removed. - acceptRequired: function acceptRequired(node, name) { - this.acceptKey(node, name); - - if (!node[name]) { - throw new _Exception2['default'](node.type + ' requires ' + name); - } - }, - - // Traverses a given array. If mutating, empty respnses will be removed - // for child elements. - acceptArray: function acceptArray(array) { - for (var i = 0, l = array.length; i < l; i++) { - this.acceptKey(array, i); - - if (!array[i]) { - array.splice(i, 1); - i--; - l--; - } - } - }, - - accept: function accept(object) { - if (!object) { - return; - } - - if (this.current) { - this.parents.unshift(this.current); - } - this.current = object; - - var ret = this[object.type](object); - - this.current = this.parents.shift(); - - if (!this.mutating || ret) { - return ret; - } else if (ret !== false) { - return object; - } - }, - - Program: function Program(program) { - this.acceptArray(program.body); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.acceptRequired(mustache, 'path'); - this.acceptArray(mustache.params); - this.acceptKey(mustache, 'hash'); - }, - - BlockStatement: function BlockStatement(block) { - this.acceptRequired(block, 'path'); - this.acceptArray(block.params); - this.acceptKey(block, 'hash'); - - this.acceptKey(block, 'program'); - this.acceptKey(block, 'inverse'); - }, - - PartialStatement: function PartialStatement(partial) { - this.acceptRequired(partial, 'name'); - this.acceptArray(partial.params); - this.acceptKey(partial, 'hash'); - }, - - ContentStatement: function ContentStatement() {}, - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - this.acceptRequired(sexpr, 'path'); - this.acceptArray(sexpr.params); - this.acceptKey(sexpr, 'hash'); - }, - - PathExpression: function PathExpression() {}, - - StringLiteral: function StringLiteral() {}, - NumberLiteral: function NumberLiteral() {}, - BooleanLiteral: function BooleanLiteral() {}, - UndefinedLiteral: function UndefinedLiteral() {}, - NullLiteral: function NullLiteral() {}, - - Hash: function Hash(hash) { - this.acceptArray(hash.pairs); - }, - HashPair: function HashPair(pair) { - this.acceptRequired(pair, 'value'); - } - }; - - exports['default'] = Visitor; - module.exports = exports['default']; - /* content */ /* comment */ /* path */ /* string */ /* number */ /* bool */ /* literal */ /* literal */ - -/***/ }, -/* 7 */ -/***/ function(module, exports, __webpack_require__) { - - /* WEBPACK VAR INJECTION */(function(global) {'use strict'; - - exports.__esModule = true; - /*global window */ - - exports['default'] = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; - }; - - module.exports = exports['default']; - /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) - -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - exports["default"] = function (obj) { - return obj && obj.__esModule ? obj : { - "default": obj - }; - }; - - exports.__esModule = true; - -/***/ }, -/* 9 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - exports.HandlebarsEnvironment = HandlebarsEnvironment; - exports.createFrame = createFrame; - - var _import = __webpack_require__(12); - - var Utils = _interopRequireWildcard(_import); - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var VERSION = '3.0.1'; - exports.VERSION = VERSION; - var COMPILER_REVISION = 6; - - exports.COMPILER_REVISION = COMPILER_REVISION; - var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' - }; - - exports.REVISION_CHANGES = REVISION_CHANGES; - var isArray = Utils.isArray, - isFunction = Utils.isFunction, - toString = Utils.toString, - objectType = '[object Object]'; - - function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); - } - - HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function registerHelper(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { - throw new _Exception2['default']('Arg not supported with multiple helpers'); - } - Utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (toString.call(name) === objectType) { - Utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _Exception2['default']('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - } - }; - - function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function () { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _Exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _Exception2['default']('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: Utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (var j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function (conditional, options) { - if (isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || Utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - - instance.registerHelper('with', function (context, options) { - if (isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!Utils.isEmpty(context)) { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = { data: data }; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function (message, options) { - var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); - } - - var logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function log(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - var method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } - }; - - exports.logger = logger; - var log = logger.log; - - exports.log = log; - - function createFrame(object) { - var frame = Utils.extend({}, object); - frame._parent = object; - return frame; - } - - /* [args, ]options */ - -/***/ }, -/* 10 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - // Build out our basic SafeString type - function SafeString(string) { - this.string = string; - } - - SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; - }; - - exports['default'] = SafeString; - module.exports = exports['default']; - -/***/ }, -/* 11 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - - function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } - } - - Exception.prototype = new Error(); - - exports['default'] = Exception; - module.exports = exports['default']; - -/***/ }, -/* 12 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - exports.extend = extend; - - // Older IE versions do not directly support indexOf so we must implement our own, sadly. - exports.indexOf = indexOf; - exports.escapeExpression = escapeExpression; - exports.isEmpty = isEmpty; - exports.blockParams = blockParams; - exports.appendContextPath = appendContextPath; - var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '`': '`' - }; - - var badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - - function escapeChar(chr) { - return escape[chr]; - } - - function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; - } - - var toString = Object.prototype.toString; - - exports.toString = toString; - // Sourced from lodash - // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt - /*eslint-disable func-style, no-var */ - var isFunction = function isFunction(value) { - return typeof value === 'function'; - }; - // fallback for older versions of Chrome and Safari - /* istanbul ignore next */ - if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; - } - var isFunction; - exports.isFunction = isFunction; - /*eslint-enable func-style, no-var */ - - /* istanbul ignore next */ - var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; - };exports.isArray = isArray; - - function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; - } - - function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); - } - - function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } - } - - function blockParams(params, ids) { - params.path = ids; - return params; - } - - function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; - } - -/***/ }, -/* 13 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - exports.checkRevision = checkRevision; - - // TODO: Remove this line and break up compilePartial - - exports.template = template; - exports.wrapProgram = wrapProgram; - exports.resolvePartial = resolvePartial; - exports.invokePartial = invokePartial; - exports.noop = noop; - - var _import = __webpack_require__(12); - - var Utils = _interopRequireWildcard(_import); - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _COMPILER_REVISION$REVISION_CHANGES$createFrame = __webpack_require__(9); - - function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _COMPILER_REVISION$REVISION_CHANGES$createFrame.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[currentRevision], - compilerVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[compilerRevision]; - throw new _Exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _Exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } - } - - function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _Exception2['default']('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _Exception2['default']('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = Utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _Exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _Exception2['default']('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: Utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - return templateSpec[i]; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = Utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _Exception2['default']('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _Exception2['default']('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; - } - - function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; - } - - function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; - } - - function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new _Exception2['default']('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } - } - - function noop() { - return ''; - } - - function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _COMPILER_REVISION$REVISION_CHANGES$createFrame.createFrame(data) : {}; - data.root = context; - } - return data; - } - -/***/ }, -/* 14 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - exports.__esModule = true; - /* istanbul ignore next */ - /* Jison generated parser */ - var handlebars = (function () { - var parser = { trace: function trace() {}, - yy: {}, - symbols_: { error: 2, root: 3, program: 4, EOF: 5, program_repetition0: 6, statement: 7, mustache: 8, block: 9, rawBlock: 10, partial: 11, content: 12, COMMENT: 13, CONTENT: 14, openRawBlock: 15, END_RAW_BLOCK: 16, OPEN_RAW_BLOCK: 17, helperName: 18, openRawBlock_repetition0: 19, openRawBlock_option0: 20, CLOSE_RAW_BLOCK: 21, openBlock: 22, block_option0: 23, closeBlock: 24, openInverse: 25, block_option1: 26, OPEN_BLOCK: 27, openBlock_repetition0: 28, openBlock_option0: 29, openBlock_option1: 30, CLOSE: 31, OPEN_INVERSE: 32, openInverse_repetition0: 33, openInverse_option0: 34, openInverse_option1: 35, openInverseChain: 36, OPEN_INVERSE_CHAIN: 37, openInverseChain_repetition0: 38, openInverseChain_option0: 39, openInverseChain_option1: 40, inverseAndProgram: 41, INVERSE: 42, inverseChain: 43, inverseChain_option0: 44, OPEN_ENDBLOCK: 45, OPEN: 46, mustache_repetition0: 47, mustache_option0: 48, OPEN_UNESCAPED: 49, mustache_repetition1: 50, mustache_option1: 51, CLOSE_UNESCAPED: 52, OPEN_PARTIAL: 53, partialName: 54, partial_repetition0: 55, partial_option0: 56, param: 57, sexpr: 58, OPEN_SEXPR: 59, sexpr_repetition0: 60, sexpr_option0: 61, CLOSE_SEXPR: 62, hash: 63, hash_repetition_plus0: 64, hashSegment: 65, ID: 66, EQUALS: 67, blockParams: 68, OPEN_BLOCK_PARAMS: 69, blockParams_repetition_plus0: 70, CLOSE_BLOCK_PARAMS: 71, path: 72, dataName: 73, STRING: 74, NUMBER: 75, BOOLEAN: 76, UNDEFINED: 77, NULL: 78, DATA: 79, pathSegments: 80, SEP: 81, $accept: 0, $end: 1 }, - terminals_: { 2: "error", 5: "EOF", 13: "COMMENT", 14: "CONTENT", 16: "END_RAW_BLOCK", 17: "OPEN_RAW_BLOCK", 21: "CLOSE_RAW_BLOCK", 27: "OPEN_BLOCK", 31: "CLOSE", 32: "OPEN_INVERSE", 37: "OPEN_INVERSE_CHAIN", 42: "INVERSE", 45: "OPEN_ENDBLOCK", 46: "OPEN", 49: "OPEN_UNESCAPED", 52: "CLOSE_UNESCAPED", 53: "OPEN_PARTIAL", 59: "OPEN_SEXPR", 62: "CLOSE_SEXPR", 66: "ID", 67: "EQUALS", 69: "OPEN_BLOCK_PARAMS", 71: "CLOSE_BLOCK_PARAMS", 74: "STRING", 75: "NUMBER", 76: "BOOLEAN", 77: "UNDEFINED", 78: "NULL", 79: "DATA", 81: "SEP" }, - productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [12, 1], [10, 3], [15, 5], [9, 4], [9, 4], [22, 6], [25, 6], [36, 6], [41, 2], [43, 3], [43, 1], [24, 3], [8, 5], [8, 5], [11, 5], [57, 1], [57, 1], [58, 5], [63, 1], [65, 3], [68, 3], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [54, 1], [54, 1], [73, 2], [72, 1], [80, 3], [80, 1], [6, 0], [6, 2], [19, 0], [19, 2], [20, 0], [20, 1], [23, 0], [23, 1], [26, 0], [26, 1], [28, 0], [28, 2], [29, 0], [29, 1], [30, 0], [30, 1], [33, 0], [33, 2], [34, 0], [34, 1], [35, 0], [35, 1], [38, 0], [38, 2], [39, 0], [39, 1], [40, 0], [40, 1], [44, 0], [44, 1], [47, 0], [47, 2], [48, 0], [48, 1], [50, 0], [50, 2], [51, 0], [51, 1], [55, 0], [55, 2], [56, 0], [56, 1], [60, 0], [60, 2], [61, 0], [61, 1], [64, 1], [64, 2], [70, 1], [70, 2]], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { - - var $0 = $$.length - 1; - switch (yystate) { - case 1: - return $$[$0 - 1]; - break; - case 2: - this.$ = new yy.Program($$[$0], null, {}, yy.locInfo(this._$)); - break; - case 3: - this.$ = $$[$0]; - break; - case 4: - this.$ = $$[$0]; - break; - case 5: - this.$ = $$[$0]; - break; - case 6: - this.$ = $$[$0]; - break; - case 7: - this.$ = $$[$0]; - break; - case 8: - this.$ = new yy.CommentStatement(yy.stripComment($$[$0]), yy.stripFlags($$[$0], $$[$0]), yy.locInfo(this._$)); - break; - case 9: - this.$ = new yy.ContentStatement($$[$0], yy.locInfo(this._$)); - break; - case 10: - this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); - break; - case 11: - this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] }; - break; - case 12: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$); - break; - case 13: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$); - break; - case 14: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 15: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 16: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 17: - this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] }; - break; - case 18: - var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$), - program = new yy.Program([inverse], null, {}, yy.locInfo(this._$)); - program.chained = true; - - this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true }; - - break; - case 19: - this.$ = $$[$0]; - break; - case 20: - this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) }; - break; - case 21: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 22: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 23: - this.$ = new yy.PartialStatement($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.stripFlags($$[$0 - 4], $$[$0]), yy.locInfo(this._$)); - break; - case 24: - this.$ = $$[$0]; - break; - case 25: - this.$ = $$[$0]; - break; - case 26: - this.$ = new yy.SubExpression($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.locInfo(this._$)); - break; - case 27: - this.$ = new yy.Hash($$[$0], yy.locInfo(this._$)); - break; - case 28: - this.$ = new yy.HashPair(yy.id($$[$0 - 2]), $$[$0], yy.locInfo(this._$)); - break; - case 29: - this.$ = yy.id($$[$0 - 1]); - break; - case 30: - this.$ = $$[$0]; - break; - case 31: - this.$ = $$[$0]; - break; - case 32: - this.$ = new yy.StringLiteral($$[$0], yy.locInfo(this._$)); - break; - case 33: - this.$ = new yy.NumberLiteral($$[$0], yy.locInfo(this._$)); - break; - case 34: - this.$ = new yy.BooleanLiteral($$[$0], yy.locInfo(this._$)); - break; - case 35: - this.$ = new yy.UndefinedLiteral(yy.locInfo(this._$)); - break; - case 36: - this.$ = new yy.NullLiteral(yy.locInfo(this._$)); - break; - case 37: - this.$ = $$[$0]; - break; - case 38: - this.$ = $$[$0]; - break; - case 39: - this.$ = yy.preparePath(true, $$[$0], this._$); - break; - case 40: - this.$ = yy.preparePath(false, $$[$0], this._$); - break; - case 41: - $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2]; - break; - case 42: - this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }]; - break; - case 43: - this.$ = []; - break; - case 44: - $$[$0 - 1].push($$[$0]); - break; - case 45: - this.$ = []; - break; - case 46: - $$[$0 - 1].push($$[$0]); - break; - case 53: - this.$ = []; - break; - case 54: - $$[$0 - 1].push($$[$0]); - break; - case 59: - this.$ = []; - break; - case 60: - $$[$0 - 1].push($$[$0]); - break; - case 65: - this.$ = []; - break; - case 66: - $$[$0 - 1].push($$[$0]); - break; - case 73: - this.$ = []; - break; - case 74: - $$[$0 - 1].push($$[$0]); - break; - case 77: - this.$ = []; - break; - case 78: - $$[$0 - 1].push($$[$0]); - break; - case 81: - this.$ = []; - break; - case 82: - $$[$0 - 1].push($$[$0]); - break; - case 85: - this.$ = []; - break; - case 86: - $$[$0 - 1].push($$[$0]); - break; - case 89: - this.$ = [$$[$0]]; - break; - case 90: - $$[$0 - 1].push($$[$0]); - break; - case 91: - this.$ = [$$[$0]]; - break; - case 92: - $$[$0 - 1].push($$[$0]); - break; - } - }, - table: [{ 3: 1, 4: 2, 5: [2, 43], 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: [1, 11], 14: [1, 18], 15: 16, 17: [1, 21], 22: 14, 25: 15, 27: [1, 19], 32: [1, 20], 37: [2, 2], 42: [2, 2], 45: [2, 2], 46: [1, 12], 49: [1, 13], 53: [1, 17] }, { 1: [2, 1] }, { 5: [2, 44], 13: [2, 44], 14: [2, 44], 17: [2, 44], 27: [2, 44], 32: [2, 44], 37: [2, 44], 42: [2, 44], 45: [2, 44], 46: [2, 44], 49: [2, 44], 53: [2, 44] }, { 5: [2, 3], 13: [2, 3], 14: [2, 3], 17: [2, 3], 27: [2, 3], 32: [2, 3], 37: [2, 3], 42: [2, 3], 45: [2, 3], 46: [2, 3], 49: [2, 3], 53: [2, 3] }, { 5: [2, 4], 13: [2, 4], 14: [2, 4], 17: [2, 4], 27: [2, 4], 32: [2, 4], 37: [2, 4], 42: [2, 4], 45: [2, 4], 46: [2, 4], 49: [2, 4], 53: [2, 4] }, { 5: [2, 5], 13: [2, 5], 14: [2, 5], 17: [2, 5], 27: [2, 5], 32: [2, 5], 37: [2, 5], 42: [2, 5], 45: [2, 5], 46: [2, 5], 49: [2, 5], 53: [2, 5] }, { 5: [2, 6], 13: [2, 6], 14: [2, 6], 17: [2, 6], 27: [2, 6], 32: [2, 6], 37: [2, 6], 42: [2, 6], 45: [2, 6], 46: [2, 6], 49: [2, 6], 53: [2, 6] }, { 5: [2, 7], 13: [2, 7], 14: [2, 7], 17: [2, 7], 27: [2, 7], 32: [2, 7], 37: [2, 7], 42: [2, 7], 45: [2, 7], 46: [2, 7], 49: [2, 7], 53: [2, 7] }, { 5: [2, 8], 13: [2, 8], 14: [2, 8], 17: [2, 8], 27: [2, 8], 32: [2, 8], 37: [2, 8], 42: [2, 8], 45: [2, 8], 46: [2, 8], 49: [2, 8], 53: [2, 8] }, { 18: 22, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 33, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 34, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 4: 35, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 12: 36, 14: [1, 18] }, { 18: 38, 54: 37, 58: 39, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 9], 13: [2, 9], 14: [2, 9], 16: [2, 9], 17: [2, 9], 27: [2, 9], 32: [2, 9], 37: [2, 9], 42: [2, 9], 45: [2, 9], 46: [2, 9], 49: [2, 9], 53: [2, 9] }, { 18: 41, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 42, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 43, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [2, 73], 47: 44, 59: [2, 73], 66: [2, 73], 74: [2, 73], 75: [2, 73], 76: [2, 73], 77: [2, 73], 78: [2, 73], 79: [2, 73] }, { 21: [2, 30], 31: [2, 30], 52: [2, 30], 59: [2, 30], 62: [2, 30], 66: [2, 30], 69: [2, 30], 74: [2, 30], 75: [2, 30], 76: [2, 30], 77: [2, 30], 78: [2, 30], 79: [2, 30] }, { 21: [2, 31], 31: [2, 31], 52: [2, 31], 59: [2, 31], 62: [2, 31], 66: [2, 31], 69: [2, 31], 74: [2, 31], 75: [2, 31], 76: [2, 31], 77: [2, 31], 78: [2, 31], 79: [2, 31] }, { 21: [2, 32], 31: [2, 32], 52: [2, 32], 59: [2, 32], 62: [2, 32], 66: [2, 32], 69: [2, 32], 74: [2, 32], 75: [2, 32], 76: [2, 32], 77: [2, 32], 78: [2, 32], 79: [2, 32] }, { 21: [2, 33], 31: [2, 33], 52: [2, 33], 59: [2, 33], 62: [2, 33], 66: [2, 33], 69: [2, 33], 74: [2, 33], 75: [2, 33], 76: [2, 33], 77: [2, 33], 78: [2, 33], 79: [2, 33] }, { 21: [2, 34], 31: [2, 34], 52: [2, 34], 59: [2, 34], 62: [2, 34], 66: [2, 34], 69: [2, 34], 74: [2, 34], 75: [2, 34], 76: [2, 34], 77: [2, 34], 78: [2, 34], 79: [2, 34] }, { 21: [2, 35], 31: [2, 35], 52: [2, 35], 59: [2, 35], 62: [2, 35], 66: [2, 35], 69: [2, 35], 74: [2, 35], 75: [2, 35], 76: [2, 35], 77: [2, 35], 78: [2, 35], 79: [2, 35] }, { 21: [2, 36], 31: [2, 36], 52: [2, 36], 59: [2, 36], 62: [2, 36], 66: [2, 36], 69: [2, 36], 74: [2, 36], 75: [2, 36], 76: [2, 36], 77: [2, 36], 78: [2, 36], 79: [2, 36] }, { 21: [2, 40], 31: [2, 40], 52: [2, 40], 59: [2, 40], 62: [2, 40], 66: [2, 40], 69: [2, 40], 74: [2, 40], 75: [2, 40], 76: [2, 40], 77: [2, 40], 78: [2, 40], 79: [2, 40], 81: [1, 45] }, { 66: [1, 32], 80: 46 }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 50: 47, 52: [2, 77], 59: [2, 77], 66: [2, 77], 74: [2, 77], 75: [2, 77], 76: [2, 77], 77: [2, 77], 78: [2, 77], 79: [2, 77] }, { 23: 48, 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 49, 45: [2, 49] }, { 26: 54, 41: 55, 42: [1, 53], 45: [2, 51] }, { 16: [1, 56] }, { 31: [2, 81], 55: 57, 59: [2, 81], 66: [2, 81], 74: [2, 81], 75: [2, 81], 76: [2, 81], 77: [2, 81], 78: [2, 81], 79: [2, 81] }, { 31: [2, 37], 59: [2, 37], 66: [2, 37], 74: [2, 37], 75: [2, 37], 76: [2, 37], 77: [2, 37], 78: [2, 37], 79: [2, 37] }, { 31: [2, 38], 59: [2, 38], 66: [2, 38], 74: [2, 38], 75: [2, 38], 76: [2, 38], 77: [2, 38], 78: [2, 38], 79: [2, 38] }, { 18: 58, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 28: 59, 31: [2, 53], 59: [2, 53], 66: [2, 53], 69: [2, 53], 74: [2, 53], 75: [2, 53], 76: [2, 53], 77: [2, 53], 78: [2, 53], 79: [2, 53] }, { 31: [2, 59], 33: 60, 59: [2, 59], 66: [2, 59], 69: [2, 59], 74: [2, 59], 75: [2, 59], 76: [2, 59], 77: [2, 59], 78: [2, 59], 79: [2, 59] }, { 19: 61, 21: [2, 45], 59: [2, 45], 66: [2, 45], 74: [2, 45], 75: [2, 45], 76: [2, 45], 77: [2, 45], 78: [2, 45], 79: [2, 45] }, { 18: 65, 31: [2, 75], 48: 62, 57: 63, 58: 66, 59: [1, 40], 63: 64, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 66: [1, 70] }, { 21: [2, 39], 31: [2, 39], 52: [2, 39], 59: [2, 39], 62: [2, 39], 66: [2, 39], 69: [2, 39], 74: [2, 39], 75: [2, 39], 76: [2, 39], 77: [2, 39], 78: [2, 39], 79: [2, 39], 81: [1, 45] }, { 18: 65, 51: 71, 52: [2, 79], 57: 72, 58: 66, 59: [1, 40], 63: 73, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 24: 74, 45: [1, 75] }, { 45: [2, 50] }, { 4: 76, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 45: [2, 19] }, { 18: 77, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 78, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 24: 79, 45: [1, 75] }, { 45: [2, 52] }, { 5: [2, 10], 13: [2, 10], 14: [2, 10], 17: [2, 10], 27: [2, 10], 32: [2, 10], 37: [2, 10], 42: [2, 10], 45: [2, 10], 46: [2, 10], 49: [2, 10], 53: [2, 10] }, { 18: 65, 31: [2, 83], 56: 80, 57: 81, 58: 66, 59: [1, 40], 63: 82, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 59: [2, 85], 60: 83, 62: [2, 85], 66: [2, 85], 74: [2, 85], 75: [2, 85], 76: [2, 85], 77: [2, 85], 78: [2, 85], 79: [2, 85] }, { 18: 65, 29: 84, 31: [2, 55], 57: 85, 58: 66, 59: [1, 40], 63: 86, 64: 67, 65: 68, 66: [1, 69], 69: [2, 55], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 31: [2, 61], 34: 87, 57: 88, 58: 66, 59: [1, 40], 63: 89, 64: 67, 65: 68, 66: [1, 69], 69: [2, 61], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 20: 90, 21: [2, 47], 57: 91, 58: 66, 59: [1, 40], 63: 92, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [1, 93] }, { 31: [2, 74], 59: [2, 74], 66: [2, 74], 74: [2, 74], 75: [2, 74], 76: [2, 74], 77: [2, 74], 78: [2, 74], 79: [2, 74] }, { 31: [2, 76] }, { 21: [2, 24], 31: [2, 24], 52: [2, 24], 59: [2, 24], 62: [2, 24], 66: [2, 24], 69: [2, 24], 74: [2, 24], 75: [2, 24], 76: [2, 24], 77: [2, 24], 78: [2, 24], 79: [2, 24] }, { 21: [2, 25], 31: [2, 25], 52: [2, 25], 59: [2, 25], 62: [2, 25], 66: [2, 25], 69: [2, 25], 74: [2, 25], 75: [2, 25], 76: [2, 25], 77: [2, 25], 78: [2, 25], 79: [2, 25] }, { 21: [2, 27], 31: [2, 27], 52: [2, 27], 62: [2, 27], 65: 94, 66: [1, 95], 69: [2, 27] }, { 21: [2, 89], 31: [2, 89], 52: [2, 89], 62: [2, 89], 66: [2, 89], 69: [2, 89] }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 67: [1, 96], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 21: [2, 41], 31: [2, 41], 52: [2, 41], 59: [2, 41], 62: [2, 41], 66: [2, 41], 69: [2, 41], 74: [2, 41], 75: [2, 41], 76: [2, 41], 77: [2, 41], 78: [2, 41], 79: [2, 41], 81: [2, 41] }, { 52: [1, 97] }, { 52: [2, 78], 59: [2, 78], 66: [2, 78], 74: [2, 78], 75: [2, 78], 76: [2, 78], 77: [2, 78], 78: [2, 78], 79: [2, 78] }, { 52: [2, 80] }, { 5: [2, 12], 13: [2, 12], 14: [2, 12], 17: [2, 12], 27: [2, 12], 32: [2, 12], 37: [2, 12], 42: [2, 12], 45: [2, 12], 46: [2, 12], 49: [2, 12], 53: [2, 12] }, { 18: 98, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 100, 44: 99, 45: [2, 71] }, { 31: [2, 65], 38: 101, 59: [2, 65], 66: [2, 65], 69: [2, 65], 74: [2, 65], 75: [2, 65], 76: [2, 65], 77: [2, 65], 78: [2, 65], 79: [2, 65] }, { 45: [2, 17] }, { 5: [2, 13], 13: [2, 13], 14: [2, 13], 17: [2, 13], 27: [2, 13], 32: [2, 13], 37: [2, 13], 42: [2, 13], 45: [2, 13], 46: [2, 13], 49: [2, 13], 53: [2, 13] }, { 31: [1, 102] }, { 31: [2, 82], 59: [2, 82], 66: [2, 82], 74: [2, 82], 75: [2, 82], 76: [2, 82], 77: [2, 82], 78: [2, 82], 79: [2, 82] }, { 31: [2, 84] }, { 18: 65, 57: 104, 58: 66, 59: [1, 40], 61: 103, 62: [2, 87], 63: 105, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 30: 106, 31: [2, 57], 68: 107, 69: [1, 108] }, { 31: [2, 54], 59: [2, 54], 66: [2, 54], 69: [2, 54], 74: [2, 54], 75: [2, 54], 76: [2, 54], 77: [2, 54], 78: [2, 54], 79: [2, 54] }, { 31: [2, 56], 69: [2, 56] }, { 31: [2, 63], 35: 109, 68: 110, 69: [1, 108] }, { 31: [2, 60], 59: [2, 60], 66: [2, 60], 69: [2, 60], 74: [2, 60], 75: [2, 60], 76: [2, 60], 77: [2, 60], 78: [2, 60], 79: [2, 60] }, { 31: [2, 62], 69: [2, 62] }, { 21: [1, 111] }, { 21: [2, 46], 59: [2, 46], 66: [2, 46], 74: [2, 46], 75: [2, 46], 76: [2, 46], 77: [2, 46], 78: [2, 46], 79: [2, 46] }, { 21: [2, 48] }, { 5: [2, 21], 13: [2, 21], 14: [2, 21], 17: [2, 21], 27: [2, 21], 32: [2, 21], 37: [2, 21], 42: [2, 21], 45: [2, 21], 46: [2, 21], 49: [2, 21], 53: [2, 21] }, { 21: [2, 90], 31: [2, 90], 52: [2, 90], 62: [2, 90], 66: [2, 90], 69: [2, 90] }, { 67: [1, 96] }, { 18: 65, 57: 112, 58: 66, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 22], 13: [2, 22], 14: [2, 22], 17: [2, 22], 27: [2, 22], 32: [2, 22], 37: [2, 22], 42: [2, 22], 45: [2, 22], 46: [2, 22], 49: [2, 22], 53: [2, 22] }, { 31: [1, 113] }, { 45: [2, 18] }, { 45: [2, 72] }, { 18: 65, 31: [2, 67], 39: 114, 57: 115, 58: 66, 59: [1, 40], 63: 116, 64: 67, 65: 68, 66: [1, 69], 69: [2, 67], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 23], 13: [2, 23], 14: [2, 23], 17: [2, 23], 27: [2, 23], 32: [2, 23], 37: [2, 23], 42: [2, 23], 45: [2, 23], 46: [2, 23], 49: [2, 23], 53: [2, 23] }, { 62: [1, 117] }, { 59: [2, 86], 62: [2, 86], 66: [2, 86], 74: [2, 86], 75: [2, 86], 76: [2, 86], 77: [2, 86], 78: [2, 86], 79: [2, 86] }, { 62: [2, 88] }, { 31: [1, 118] }, { 31: [2, 58] }, { 66: [1, 120], 70: 119 }, { 31: [1, 121] }, { 31: [2, 64] }, { 14: [2, 11] }, { 21: [2, 28], 31: [2, 28], 52: [2, 28], 62: [2, 28], 66: [2, 28], 69: [2, 28] }, { 5: [2, 20], 13: [2, 20], 14: [2, 20], 17: [2, 20], 27: [2, 20], 32: [2, 20], 37: [2, 20], 42: [2, 20], 45: [2, 20], 46: [2, 20], 49: [2, 20], 53: [2, 20] }, { 31: [2, 69], 40: 122, 68: 123, 69: [1, 108] }, { 31: [2, 66], 59: [2, 66], 66: [2, 66], 69: [2, 66], 74: [2, 66], 75: [2, 66], 76: [2, 66], 77: [2, 66], 78: [2, 66], 79: [2, 66] }, { 31: [2, 68], 69: [2, 68] }, { 21: [2, 26], 31: [2, 26], 52: [2, 26], 59: [2, 26], 62: [2, 26], 66: [2, 26], 69: [2, 26], 74: [2, 26], 75: [2, 26], 76: [2, 26], 77: [2, 26], 78: [2, 26], 79: [2, 26] }, { 13: [2, 14], 14: [2, 14], 17: [2, 14], 27: [2, 14], 32: [2, 14], 37: [2, 14], 42: [2, 14], 45: [2, 14], 46: [2, 14], 49: [2, 14], 53: [2, 14] }, { 66: [1, 125], 71: [1, 124] }, { 66: [2, 91], 71: [2, 91] }, { 13: [2, 15], 14: [2, 15], 17: [2, 15], 27: [2, 15], 32: [2, 15], 42: [2, 15], 45: [2, 15], 46: [2, 15], 49: [2, 15], 53: [2, 15] }, { 31: [1, 126] }, { 31: [2, 70] }, { 31: [2, 29] }, { 66: [2, 92], 71: [2, 92] }, { 13: [2, 16], 14: [2, 16], 17: [2, 16], 27: [2, 16], 32: [2, 16], 37: [2, 16], 42: [2, 16], 45: [2, 16], 46: [2, 16], 49: [2, 16], 53: [2, 16] }], - defaultActions: { 4: [2, 1], 49: [2, 50], 51: [2, 19], 55: [2, 52], 64: [2, 76], 73: [2, 80], 78: [2, 17], 82: [2, 84], 92: [2, 48], 99: [2, 18], 100: [2, 72], 105: [2, 88], 107: [2, 58], 110: [2, 64], 111: [2, 11], 123: [2, 70], 124: [2, 29] }, - parseError: function parseError(str, hash) { - throw new Error(str); - }, - parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], - lstack = [], - table = this.table, - yytext = "", - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - this.yy.parser = this; - if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - var ranges = this.lexer.options && this.lexer.options.ranges; - if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError; - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - function lex() { - var token; - token = self.lexer.lex() || 1; - if (typeof token !== "number") { - token = self.symbols_[token] || token; - } - return token; - } - var symbol, - preErrorSymbol, - state, - action, - a, - r, - yyval = {}, - p, - len, - newState, - expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == "undefined") { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === "undefined" || !action.length || !action[0]) { - var errStr = ""; - if (!recovering) { - expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected }); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; - if (ranges) { - yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; - } - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; - } - }; - /* Jison generated lexer */ - var lexer = (function () { - var lexer = { EOF: 1, - parseError: function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, - setInput: function setInput(input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ""; - this.conditionStack = ["INITIAL"]; - this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; - if (this.options.ranges) this.yylloc.range = [0, 0]; - this.offset = 0; - return this; - }, - input: function input() { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) this.yylloc.range[1]++; - - this._input = this._input.slice(1); - return ch; - }, - unput: function unput(ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); - - if (lines.length - 1) this.yylineno -= lines.length - 1; - var r = this.yylloc.range; - - this.yylloc = { first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - return this; - }, - more: function more() { - this._more = true; - return this; - }, - less: function less(n) { - this.unput(this.match.slice(n)); - }, - pastInput: function pastInput() { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); - }, - upcomingInput: function upcomingInput() { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20 - next.length); - } - return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); - }, - showPosition: function showPosition() { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, - next: function next() { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, match, tempMatch, index, col, lines; - if (!this._more) { - this.yytext = ""; - this.match = ""; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = { first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) this.done = false; - if (token) { - return token; - } else { - return; - } - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { text: "", token: null, line: this.yylineno }); - } - }, - lex: function lex() { - var r = this.next(); - if (typeof r !== "undefined") { - return r; - } else { - return this.lex(); - } - }, - begin: function begin(condition) { - this.conditionStack.push(condition); - }, - popState: function popState() { - return this.conditionStack.pop(); - }, - _currentRules: function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - }, - topState: function topState() { - return this.conditionStack[this.conditionStack.length - 2]; - }, - pushState: function begin(condition) { - this.begin(condition); - } }; - lexer.options = {}; - lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { - - function strip(start, end) { - return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end); - } - - var YYSTATE = YY_START; - switch ($avoiding_name_collisions) { - case 0: - if (yy_.yytext.slice(-2) === "\\\\") { - strip(0, 1); - this.begin("mu"); - } else if (yy_.yytext.slice(-1) === "\\") { - strip(0, 1); - this.begin("emu"); - } else { - this.begin("mu"); - } - if (yy_.yytext) { - return 14; - }break; - case 1: - return 14; - break; - case 2: - this.popState(); - return 14; - - break; - case 3: - yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9); - this.popState(); - return 16; - - break; - case 4: - return 14; - break; - case 5: - this.popState(); - return 13; - - break; - case 6: - return 59; - break; - case 7: - return 62; - break; - case 8: - return 17; - break; - case 9: - this.popState(); - this.begin("raw"); - return 21; - - break; - case 10: - return 53; - break; - case 11: - return 27; - break; - case 12: - return 45; - break; - case 13: - this.popState();return 42; - break; - case 14: - this.popState();return 42; - break; - case 15: - return 32; - break; - case 16: - return 37; - break; - case 17: - return 49; - break; - case 18: - return 46; - break; - case 19: - this.unput(yy_.yytext); - this.popState(); - this.begin("com"); - - break; - case 20: - this.popState(); - return 13; - - break; - case 21: - return 46; - break; - case 22: - return 67; - break; - case 23: - return 66; - break; - case 24: - return 66; - break; - case 25: - return 81; - break; - case 26: - // ignore whitespace - break; - case 27: - this.popState();return 52; - break; - case 28: - this.popState();return 31; - break; - case 29: - yy_.yytext = strip(1, 2).replace(/\\"/g, "\"");return 74; - break; - case 30: - yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 74; - break; - case 31: - return 79; - break; - case 32: - return 76; - break; - case 33: - return 76; - break; - case 34: - return 77; - break; - case 35: - return 78; - break; - case 36: - return 75; - break; - case 37: - return 69; - break; - case 38: - return 71; - break; - case 39: - return 66; - break; - case 40: - return 66; - break; - case 41: - return "INVALID"; - break; - case 42: - return 5; - break; - } - }; - lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]*?(?=(\{\{\{\{\/)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[[^\]]*\])/, /^(?:.)/, /^(?:$)/]; - lexer.conditions = { mu: { rules: [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], inclusive: false }, emu: { rules: [2], inclusive: false }, com: { rules: [5], inclusive: false }, raw: { rules: [3, 4], inclusive: false }, INITIAL: { rules: [0, 1, 42], inclusive: true } }; - return lexer; - })(); - parser.lexer = lexer; - function Parser() { - this.yy = {}; - }Parser.prototype = parser;parser.Parser = Parser; - return new Parser(); - })();exports["default"] = handlebars; - module.exports = exports["default"]; - -/***/ }, -/* 15 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - - var _Visitor = __webpack_require__(6); - - var _Visitor2 = _interopRequireWildcard(_Visitor); - - function WhitespaceControl() {} - WhitespaceControl.prototype = new _Visitor2['default'](); - - WhitespaceControl.prototype.Program = function (program) { - var isRoot = !this.isRootSeen; - this.isRootSeen = true; - - var body = program.body; - for (var i = 0, l = body.length; i < l; i++) { - var current = body[i], - strip = this.accept(current); - - if (!strip) { - continue; - } - - var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), - _isNextWhitespace = isNextWhitespace(body, i, isRoot), - openStandalone = strip.openStandalone && _isPrevWhitespace, - closeStandalone = strip.closeStandalone && _isNextWhitespace, - inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; - - if (strip.close) { - omitRight(body, i, true); - } - if (strip.open) { - omitLeft(body, i, true); - } - - if (inlineStandalone) { - omitRight(body, i); - - if (omitLeft(body, i)) { - // If we are on a standalone node, save the indent info for partials - if (current.type === 'PartialStatement') { - // Pull out the whitespace from the final line - current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1]; - } - } - } - if (openStandalone) { - omitRight((current.program || current.inverse).body); - - // Strip out the previous content node if it's whitespace only - omitLeft(body, i); - } - if (closeStandalone) { - // Always strip the next node - omitRight(body, i); - - omitLeft((current.inverse || current.program).body); - } - } - - return program; - }; - WhitespaceControl.prototype.BlockStatement = function (block) { - this.accept(block.program); - this.accept(block.inverse); - - // Find the inverse program that is involed with whitespace stripping. - var program = block.program || block.inverse, - inverse = block.program && block.inverse, - firstInverse = inverse, - lastInverse = inverse; - - if (inverse && inverse.chained) { - firstInverse = inverse.body[0].program; - - // Walk the inverse chain to find the last inverse that is actually in the chain. - while (lastInverse.chained) { - lastInverse = lastInverse.body[lastInverse.body.length - 1].program; - } - } - - var strip = { - open: block.openStrip.open, - close: block.closeStrip.close, - - // Determine the standalone candiacy. Basically flag our content as being possibly standalone - // so our parent can determine if we actually are standalone - openStandalone: isNextWhitespace(program.body), - closeStandalone: isPrevWhitespace((firstInverse || program).body) - }; - - if (block.openStrip.close) { - omitRight(program.body, null, true); - } - - if (inverse) { - var inverseStrip = block.inverseStrip; - - if (inverseStrip.open) { - omitLeft(program.body, null, true); - } - - if (inverseStrip.close) { - omitRight(firstInverse.body, null, true); - } - if (block.closeStrip.open) { - omitLeft(lastInverse.body, null, true); - } - - // Find standalone else statments - if (isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) { - omitLeft(program.body); - omitRight(firstInverse.body); - } - } else if (block.closeStrip.open) { - omitLeft(program.body, null, true); - } - - return strip; - }; - - WhitespaceControl.prototype.MustacheStatement = function (mustache) { - return mustache.strip; - }; - - WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) { - /* istanbul ignore next */ - var strip = node.strip || {}; - return { - inlineStandalone: true, - open: strip.open, - close: strip.close - }; - }; - - function isPrevWhitespace(body, i, isRoot) { - if (i === undefined) { - i = body.length; - } - - // Nodes that end with newlines are considered whitespace (but are special - // cased for strip operations) - var prev = body[i - 1], - sibling = body[i - 2]; - if (!prev) { - return isRoot; - } - - if (prev.type === 'ContentStatement') { - return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original); - } - } - function isNextWhitespace(body, i, isRoot) { - if (i === undefined) { - i = -1; - } - - var next = body[i + 1], - sibling = body[i + 2]; - if (!next) { - return isRoot; - } - - if (next.type === 'ContentStatement') { - return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original); - } - } - - // Marks the node to the right of the position as omitted. - // I.e. {{foo}}' ' will mark the ' ' node as omitted. - // - // If i is undefined, then the first child will be marked as such. - // - // If mulitple is truthy then all whitespace will be stripped out until non-whitespace - // content is met. - function omitRight(body, i, multiple) { - var current = body[i == null ? 0 : i + 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) { - return; - } - - var original = current.value; - current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, ''); - current.rightStripped = current.value !== original; - } - - // Marks the node to the left of the position as omitted. - // I.e. ' '{{foo}} will mark the ' ' node as omitted. - // - // If i is undefined then the last child will be marked as such. - // - // If mulitple is truthy then all whitespace will be stripped out until non-whitespace - // content is met. - function omitLeft(body, i, multiple) { - var current = body[i == null ? body.length - 1 : i - 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) { - return; - } - - // We omit the last node if it's whitespace only and not preceeded by a non-content node. - var original = current.value; - current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, ''); - current.leftStripped = current.value !== original; - return current.leftStripped; - } - - exports['default'] = WhitespaceControl; - module.exports = exports['default']; - -/***/ }, -/* 16 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - exports.SourceLocation = SourceLocation; - exports.id = id; - exports.stripFlags = stripFlags; - exports.stripComment = stripComment; - exports.preparePath = preparePath; - exports.prepareMustache = prepareMustache; - exports.prepareRawBlock = prepareRawBlock; - exports.prepareBlock = prepareBlock; - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - function SourceLocation(source, locInfo) { - this.source = source; - this.start = { - line: locInfo.first_line, - column: locInfo.first_column - }; - this.end = { - line: locInfo.last_line, - column: locInfo.last_column - }; - } - - function id(token) { - if (/^\[.*\]$/.test(token)) { - return token.substr(1, token.length - 2); - } else { - return token; - } - } - - function stripFlags(open, close) { - return { - open: open.charAt(2) === '~', - close: close.charAt(close.length - 3) === '~' - }; - } - - function stripComment(comment) { - return comment.replace(/^\{\{~?\!-?-?/, '').replace(/-?-?~?\}\}$/, ''); - } - - function preparePath(data, parts, locInfo) { - locInfo = this.locInfo(locInfo); - - var original = data ? '@' : '', - dig = [], - depth = 0, - depthString = ''; - - for (var i = 0, l = parts.length; i < l; i++) { - var part = parts[i].part, - - // If we have [] syntax then we do not treat path references as operators, - // i.e. foo.[this] resolves to approximately context.foo['this'] - isLiteral = parts[i].original !== part; - original += (parts[i].separator || '') + part; - - if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { - if (dig.length > 0) { - throw new _Exception2['default']('Invalid path: ' + original, { loc: locInfo }); - } else if (part === '..') { - depth++; - depthString += '../'; - } - } else { - dig.push(part); - } - } - - return new this.PathExpression(data, depth, dig, original, locInfo); - } - - function prepareMustache(path, params, hash, open, strip, locInfo) { - // Must use charAt to support IE pre-10 - var escapeFlag = open.charAt(3) || open.charAt(2), - escaped = escapeFlag !== '{' && escapeFlag !== '&'; - - return new this.MustacheStatement(path, params, hash, escaped, strip, this.locInfo(locInfo)); - } - - function prepareRawBlock(openRawBlock, content, close, locInfo) { - if (openRawBlock.path.original !== close) { - var errorNode = { loc: openRawBlock.path.loc }; - - throw new _Exception2['default'](openRawBlock.path.original + ' doesn\'t match ' + close, errorNode); - } - - locInfo = this.locInfo(locInfo); - var program = new this.Program([content], null, {}, locInfo); - - return new this.BlockStatement(openRawBlock.path, openRawBlock.params, openRawBlock.hash, program, undefined, {}, {}, {}, locInfo); - } - - function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { - // When we are chaining inverse calls, we will not have a close path - if (close && close.path && openBlock.path.original !== close.path.original) { - var errorNode = { loc: openBlock.path.loc }; - - throw new _Exception2['default'](openBlock.path.original + ' doesn\'t match ' + close.path.original, errorNode); - } - - program.blockParams = openBlock.blockParams; - - var inverse = undefined, - inverseStrip = undefined; - - if (inverseAndProgram) { - if (inverseAndProgram.chain) { - inverseAndProgram.program.body[0].closeStrip = close.strip; - } - - inverseStrip = inverseAndProgram.strip; - inverse = inverseAndProgram.program; - } - - if (inverted) { - inverted = inverse; - inverse = program; - program = inverted; - } - - return new this.BlockStatement(openBlock.path, openBlock.params, openBlock.hash, program, inverse, openBlock.strip, inverseStrip, close && close.strip, this.locInfo(locInfo)); - } - -/***/ }, -/* 17 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - /*global define */ - - var _isArray = __webpack_require__(12); - - var SourceNode = undefined; - - try { - /* istanbul ignore next */ - if (false) { - // We don't support this in AMD environments. For these environments, we asusme that - // they are running on the browser and thus have no need for the source-map library. - var SourceMap = require('source-map'); - SourceNode = SourceMap.SourceNode; - } - } catch (err) {} - - /* istanbul ignore if: tested but not covered in istanbul due to dist build */ - if (!SourceNode) { - SourceNode = function (line, column, srcFile, chunks) { - this.src = ''; - if (chunks) { - this.add(chunks); - } - }; - /* istanbul ignore next */ - SourceNode.prototype = { - add: function add(chunks) { - if (_isArray.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src += chunks; - }, - prepend: function prepend(chunks) { - if (_isArray.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src = chunks + this.src; - }, - toStringWithSourceMap: function toStringWithSourceMap() { - return { code: this.toString() }; - }, - toString: function toString() { - return this.src; - } - }; - } - - function castChunk(chunk, codeGen, loc) { - if (_isArray.isArray(chunk)) { - var ret = []; - - for (var i = 0, len = chunk.length; i < len; i++) { - ret.push(codeGen.wrap(chunk[i], loc)); - } - return ret; - } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { - // Handle primitives that the SourceNode will throw up on - return chunk + ''; - } - return chunk; - } - - function CodeGen(srcFile) { - this.srcFile = srcFile; - this.source = []; - } - - CodeGen.prototype = { - prepend: function prepend(source, loc) { - this.source.unshift(this.wrap(source, loc)); - }, - push: function push(source, loc) { - this.source.push(this.wrap(source, loc)); - }, - - merge: function merge() { - var source = this.empty(); - this.each(function (line) { - source.add([' ', line, '\n']); - }); - return source; - }, - - each: function each(iter) { - for (var i = 0, len = this.source.length; i < len; i++) { - iter(this.source[i]); - } - }, - - empty: function empty() { - var loc = arguments[0] === undefined ? this.currentLocation || { start: {} } : arguments[0]; - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile); - }, - wrap: function wrap(chunk) { - var loc = arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1]; - - if (chunk instanceof SourceNode) { - return chunk; - } - - chunk = castChunk(chunk, this, loc); - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); - }, - - functionCall: function functionCall(fn, type, params) { - params = this.generateList(params); - return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); - }, - - quotedString: function quotedString(str) { - return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 - .replace(/\u2029/g, '\\u2029') + '"'; - }, - - objectLiteral: function objectLiteral(obj) { - var pairs = []; - - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - var value = castChunk(obj[key], this); - if (value !== 'undefined') { - pairs.push([this.quotedString(key), ':', value]); - } - } - } - - var ret = this.generateList(pairs); - ret.prepend('{'); - ret.add('}'); - return ret; - }, - - generateList: function generateList(entries, loc) { - var ret = this.empty(loc); - - for (var i = 0, len = entries.length; i < len; i++) { - if (i) { - ret.add(','); - } - - ret.add(castChunk(entries[i], this, loc)); - } - - return ret; - }, - - generateArray: function generateArray(entries, loc) { - var ret = this.generateList(entries, loc); - ret.prepend('['); - ret.add(']'); - - return ret; - } - }; - - exports['default'] = CodeGen; - module.exports = exports['default']; - - /* NOP */ - -/***/ } -/******/ ]) -}); -; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.min.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.min.js deleted file mode 100644 index 150df8a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.min.js +++ /dev/null @@ -1,29 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=r();return a.compile=function(b,c){return k.compile(b,c,a)},a.precompile=function(b,c){return k.precompile(b,c,a)},a.AST=i["default"],a.Compiler=k.Compiler,a.JavaScriptCompiler=m["default"],a.Parser=j.parser,a.parse=j.parse,a}var e=c(8)["default"];b.__esModule=!0;var f=c(1),g=e(f),h=c(2),i=e(h),j=c(3),k=c(4),l=c(5),m=e(l),n=c(6),o=e(n),p=c(7),q=e(p),r=g["default"].create,s=d();s.create=d,q["default"](s),s.Visitor=o["default"],s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b,c){"use strict";function d(){var a=new g.HandlebarsEnvironment;return m.extend(a,g),a.SafeString=i["default"],a.Exception=k["default"],a.Utils=m,a.escapeExpression=m.escapeExpression,a.VM=o,a.template=function(b){return o.template(b,a)},a}var e=c(8)["default"];b.__esModule=!0;var f=c(9),g=e(f),h=c(10),i=e(h),j=c(11),k=e(j),l=c(12),m=e(l),n=c(13),o=e(n),p=c(7),q=e(p),r=d();r.create=d,q["default"](r),r["default"]=r,b["default"]=r,a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0;var c={Program:function(a,b,c,d){this.loc=d,this.type="Program",this.body=a,this.blockParams=b,this.strip=c},MustacheStatement:function(a,b,c,d,e,f){this.loc=f,this.type="MustacheStatement",this.path=a,this.params=b||[],this.hash=c,this.escaped=d,this.strip=e},BlockStatement:function(a,b,c,d,e,f,g,h,i){this.loc=i,this.type="BlockStatement",this.path=a,this.params=b||[],this.hash=c,this.program=d,this.inverse=e,this.openStrip=f,this.inverseStrip=g,this.closeStrip=h},PartialStatement:function(a,b,c,d,e){this.loc=e,this.type="PartialStatement",this.name=a,this.params=b||[],this.hash=c,this.indent="",this.strip=d},ContentStatement:function(a,b){this.loc=b,this.type="ContentStatement",this.original=this.value=a},CommentStatement:function(a,b,c){this.loc=c,this.type="CommentStatement",this.value=a,this.strip=b},SubExpression:function(a,b,c,d){this.loc=d,this.type="SubExpression",this.path=a,this.params=b||[],this.hash=c},PathExpression:function(a,b,c,d,e){this.loc=e,this.type="PathExpression",this.data=a,this.original=d,this.parts=c,this.depth=b},StringLiteral:function(a,b){this.loc=b,this.type="StringLiteral",this.original=this.value=a},NumberLiteral:function(a,b){this.loc=b,this.type="NumberLiteral",this.original=this.value=Number(a)},BooleanLiteral:function(a,b){this.loc=b,this.type="BooleanLiteral",this.original=this.value="true"===a},UndefinedLiteral:function(a){this.loc=a,this.type="UndefinedLiteral",this.original=this.value=void 0},NullLiteral:function(a){this.loc=a,this.type="NullLiteral",this.original=this.value=null},Hash:function(a,b){this.loc=b,this.type="Hash",this.pairs=a},HashPair:function(a,b,c){this.loc=c,this.type="HashPair",this.key=a,this.value=b},helpers:{helperExpression:function(a){return!("SubExpression"!==a.type&&!a.params.length&&!a.hash)},scopedId:function(a){return/^\.|this\b/.test(a.original)},simpleId:function(a){return 1===a.parts.length&&!c.helpers.scopedId(a)&&!a.depth}}};b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if("Program"===a.type)return a;g["default"].yy=o,o.locInfo=function(a){return new o.SourceLocation(b&&b.srcName,a)};var c=new k["default"];return c.accept(g["default"].parse(a))}var e=c(8)["default"];b.__esModule=!0,b.parse=d;var f=c(14),g=e(f),h=c(2),i=e(h),j=c(15),k=e(j),l=c(16),m=e(l),n=c(12);b.parser=g["default"];var o={};n.extend(o,m,i["default"])},function(a,b,c){"use strict";function d(){}function e(a,b,c){if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a,b),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function f(a,b,c){function d(){var b=c.parse(a,f),d=(new c.Compiler).compile(b,f),e=(new c.JavaScriptCompiler).compile(d,f,void 0,!0);return c.template(e)}function e(a,b){return g||(g=d()),g.call(this,a,b)}var f=void 0===arguments[1]?{}:arguments[1];if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);"data"in f||(f.data=!0),f.compat&&(f.useDepths=!0);var g=void 0;return e._setup=function(a){return g||(g=d()),g._setup(a)},e._child=function(a,b,c,e){return g||(g=d()),g._child(a,b,c,e)},e}function g(a,b){if(a===b)return!0;if(l.isArray(a)&&l.isArray(b)&&a.length===b.length){for(var c=0;cc;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||!g(d.args,e.args))return!1}b=this.children.length;for(var c=0;b>c;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[];var c=b.knownHelpers;if(b.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)d in c&&(b.knownHelpers[d]=c[d]);return this.accept(a)},compileProgram:function(a){var b=new this.compiler,c=b.compile(a,this.options),d=this.guid++;return this.usePartial=this.usePartial||c.usePartial,this.children[d]=c,this.useDepths=this.useDepths||c.useDepths,d},accept:function(a){this.sourceNode.unshift(a);var b=this[a.type](a);return this.sourceNode.shift(),b},Program:function(a){this.options.blockParams.unshift(a.blockParams);for(var b=a.body,c=b.length,d=0;c>d;d++)this.accept(b[d]);return this.options.blockParams.shift(),this.isSimple=1===c,this.blockParams=a.blockParams?a.blockParams.length:0,this},BlockStatement:function(a){h(a);var b=a.program,c=a.inverse;b=b&&this.compileProgram(b),c=c&&this.compileProgram(c);var d=this.classifySexpr(a);"helper"===d?this.helperSexpr(a,b,c):"simple"===d?(this.simpleSexpr(a),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("blockValue",a.path.original)):(this.ambiguousSexpr(a,b,c),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},PartialStatement:function(a){this.usePartial=!0;var b=a.params;if(b.length>1)throw new k["default"]("Unsupported number of partial arguments: "+b.length,a);b.length||b.push({type:"PathExpression",parts:[],depth:0});var c=a.name.original,d="SubExpression"===a.name.type;d&&this.accept(a.name),this.setupFullMustacheParams(a,void 0,void 0,!0);var e=a.indent||"";this.options.preventIndent&&e&&(this.opcode("appendContent",e),e=""),this.opcode("invokePartial",d,c,e),this.opcode("append")},MustacheStatement:function(a){this.SubExpression(a),this.opcode(a.escaped&&!this.options.noEscape?"appendEscaped":"append")},ContentStatement:function(a){a.value&&this.opcode("appendContent",a.value)},CommentStatement:function(){},SubExpression:function(a){h(a);var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ambiguousSexpr:function(a,b,c){var d=a.path,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.accept(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){this.accept(a.path),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.path,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new k["default"]("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.falsy=!0,this.accept(e),this.opcode("invokeHelper",d.length,e.original,n["default"].helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=n["default"].helpers.scopedId(a),d=!a.depth&&!c&&this.blockParamIndex(b);d?this.opcode("lookupBlockParam",d,a.parts):b?a.data?(this.options.data=!0,this.opcode("lookupData",a.depth,a.parts)):this.opcode("lookupOnContext",a.parts,a.falsy,c):this.opcode("pushContext")},StringLiteral:function(a){this.opcode("pushString",a.value)},NumberLiteral:function(a){this.opcode("pushLiteral",a.value)},BooleanLiteral:function(a){this.opcode("pushLiteral",a.value)},UndefinedLiteral:function(){this.opcode("pushLiteral","undefined")},NullLiteral:function(){this.opcode("pushLiteral","null")},Hash:function(a){var b=a.pairs,c=0,d=b.length;for(this.opcode("pushHash");d>c;c++)this.pushParam(b[c].value);for(;c--;)this.opcode("assignToHash",b[c].key);this.opcode("popHash")},opcode:function(a){this.opcodes.push({opcode:a,args:o.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=n["default"].helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&n["default"].helpers.helperExpression(a),e=!c&&(d||b);if(e&&!d){var f=a.path.parts[0],g=this.options;g.knownHelpers[f]?d=!0:g.knownHelpersOnly&&(e=!1)}return d?"helper":e?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;c>b;b++)this.pushParam(a[b])},pushParam:function(a){var b=null!=a.value?a.value:a.original||"";if(this.stringParams)b.replace&&(b=b.replace(/^(\.?\.\/)*/g,"").replace(/\//g,".")),a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",b,a.type),"SubExpression"===a.type&&this.accept(a);else{if(this.trackIds){var c=void 0;if(!a.parts||n["default"].helpers.scopedId(a)||a.depth||(c=this.blockParamIndex(a.parts[0])),c){var d=a.parts.slice(1).join(".");this.opcode("pushId","BlockParam",c,d)}else b=a.original||b,b.replace&&(b=b.replace(/^\.\//g,"").replace(/^\.$/g,"")),this.opcode("pushId",a.type,b)}this.accept(a)}},setupFullMustacheParams:function(a,b,c,d){var e=a.params;return this.pushParams(e),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.accept(a.hash):this.opcode("emptyHash",d),e},blockParamIndex:function(a){for(var b=0,c=this.options.blockParams.length;c>b;b++){var d=this.options.blockParams[b],e=d&&l.indexOf(d,a);if(d&&e>=0)return[b,e]}}}},function(a,b,c){"use strict";function d(a){this.value=a}function e(){}function f(a,b,c,d){var e=b.popStack(),f=0,g=c.length;for(a&&g--;g>f;f++)e=b.nameLookup(e,c[f],d);return a?[b.aliasable("this.strict"),"(",e,", ",b.quotedString(c[f]),")"]:e}var g=c(8)["default"];b.__esModule=!0;var h=c(9),i=c(11),j=g(i),k=c(12),l=c(17),m=g(l);e.prototype={nameLookup:function(a,b){return e.isValidJavaScriptVariableName(b)?[a,".",b]:[a,"['",b,"']"]},depthedLookup:function(a){return[this.aliasable("this.lookup"),'(depths, "',a,'")']},compilerInfo:function(){var a=h.COMPILER_REVISION,b=h.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return k.isArray(a)||(a=[a]),a=this.source.wrap(a,b),this.environment.isSimple?["return ",a,";"]:c?["buffer += ",a,";"]:(a.appendToBuffer=!0,a)},initializeBuffer:function(){return this.quotedString("")},compile:function(a,b,c,d){this.environment=a,this.options=b,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,this.name=this.environment.name,this.isChild=!!c,this.context=c||{programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(a,b),this.useDepths=this.useDepths||a.useDepths||this.options.compat,this.useBlockParams=this.useBlockParams||a.useBlockParams;var e=a.opcodes,f=void 0,g=void 0,h=void 0,i=void 0;for(h=0,i=e.length;i>h;h++)f=e[h],this.source.currentLocation=f.loc,g=g||f.loc,this[f.opcode].apply(this,f.args);if(this.source.currentLocation=g,this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new j["default"]("Compile completed with content left on stack");var k=this.createFunctionContext(d);if(this.isChild)return k;var l={compiler:this.compilerInfo(),main:k},m=this.context.programs;for(h=0,i=m.length;i>h;h++)m[h]&&(l[h]=m[h]);return this.environment.usePartial&&(l.usePartial=!0),this.options.data&&(l.useData=!0),this.useDepths&&(l.useDepths=!0),this.useBlockParams&&(l.useBlockParams=!0),this.options.compat&&(l.compat=!0),d?l.compilerOptions=this.options:(l.compiler=JSON.stringify(l.compiler),this.source.currentLocation={start:{line:1,column:0}},l=this.objectLiteral(l),b.srcName?(l=l.toStringWithSourceMap({file:b.destName}),l.map=l.map&&l.map.toString()):l=l.toString()),l},preamble:function(){this.lastContext=0,this.source=new m["default"](this.options.srcName)},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));var d=0;for(var e in this.aliases){var f=this.aliases[e];this.aliases.hasOwnProperty(e)&&f.children&&f.referenceCount>1&&(b+=", alias"+ ++d+"="+e,f.children[0]="alias"+d)}var g=["depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&g.push("blockParams"),this.useDepths&&g.push("depths");var h=this.mergeSource(b);return a?(g.push(h),Function.apply(this,g)):this.source.wrap(["function(",g.join(","),") {\n ",h,"}"])},mergeSource:function(a){var b=this.environment.isSimple,c=!this.forceBuffer,d=void 0,e=void 0,f=void 0,g=void 0;return this.source.each(function(a){a.appendToBuffer?(f?a.prepend(" + "):f=a,g=a):(f&&(e?f.prepend("buffer += "):d=!0,g.add(";"),f=g=void 0),e=!0,b||(c=!1))}),c?f?(f.prepend("return "),g.add(";")):e||this.source.push('return "";'):(a+=", buffer = "+(d?"":this.initializeBuffer()),f?(f.prepend("return buffer + "),g.add(";")):this.source.push("return buffer;")),a&&this.source.prepend("var "+a.substring(2)+(d?"":";\n")),this.source.merge()},blockValue:function(a){var b=this.aliasable("helpers.blockHelperMissing"),c=[this.contextName(0)];this.setupHelperArgs(a,0,c);var d=this.popStack();c.splice(1,0,d),this.push(this.source.functionCall(b,"call",c))},ambiguousBlockValue:function(){var a=this.aliasable("helpers.blockHelperMissing"),b=[this.contextName(0)];this.setupHelperArgs("",0,b,!0),this.flushInline();var c=this.topStack();b.splice(1,0,c),this.pushSource(["if (!",this.lastHelper,") { ",c," = ",this.source.functionCall(a,"call",b),"}"])},appendContent:function(a){this.pendingContent?a=this.pendingContent+a:this.pendingLocation=this.source.currentLocation,this.pendingContent=a},append:function(){if(this.isInline())this.replaceStack(function(a){return[" != null ? ",a,' : ""']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var a=this.popStack();this.pushSource(["if (",a," != null) { ",this.appendToBuffer(a,void 0,!0)," }"]),this.environment.isSimple&&this.pushSource(["else { ",this.appendToBuffer("''",void 0,!0)," }"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable("this.escapeExpression"),"(",this.popStack(),")"]))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c){var d=0;c||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[d++])),this.resolvePath("context",a,d,b)},lookupBlockParam:function(a,b){this.useBlockParams=!0,this.push(["blockParams[",a[0],"][",a[1],"]"]),this.resolvePath("context",b,1)},lookupData:function(a,b){this.pushStackLiteral(a?"this.data(data, "+a+")":"data"),this.resolvePath("data",b,0,!0)},resolvePath:function(a,b,c,d){var e=this;if(this.options.strict||this.options.assumeObjects)return void this.push(f(this.options.strict,this,b,a));for(var g=b.length;g>c;c++)this.replaceStack(function(f){var g=e.nameLookup(f,b[c],a);return d?[" && ",g]:[" != null ? ",g," : ",f]})},resolvePossibleLambda:function(){this.push([this.aliasable("this.lambda"),"(",this.popStack(),", ",this.contextName(0),")"])},pushStringParam:function(a,b){this.pushContext(),this.pushString(b),"SubExpression"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(a){this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}")),this.pushStackLiteral(a?"undefined":"{}")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(a.ids)),this.stringParams&&(this.push(this.objectLiteral(a.contexts)),this.push(this.objectLiteral(a.types))),this.push(this.objectLiteral(a.values))},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){this.pushStackLiteral(null!=a?this.programExpression(a):null)},invokeHelper:function(a,b,c){var d=this.popStack(),e=this.setupHelper(a,b),f=c?[e.name," || "]:"",g=["("].concat(f,d);this.options.strict||g.push(" || ",this.aliasable("helpers.helperMissing")),g.push(")"),this.push(this.source.functionCall(g,"call",e.callParams))},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(this.source.functionCall(c.name,"call",c.callParams))},invokeAmbiguous:function(a,b){this.useRegister("helper");var c=this.popStack();this.emptyHash();var d=this.setupHelper(0,a,b),e=this.lastHelper=this.nameLookup("helpers",a,"helper"),f=["(","(helper = ",e," || ",c,")"];this.options.strict||(f[0]="(helper = ",f.push(" != null ? helper : ",this.aliasable("helpers.helperMissing"))),this.push(["(",f,d.paramsInit?["),(",d.paramsInit]:[],"),","(typeof helper === ",this.aliasable('"function"')," ? ",this.source.functionCall("helper","call",d.callParams)," : helper))"])},invokePartial:function(a,b,c){var d=[],e=this.setupParams(b,1,d,!1);a&&(b=this.popStack(),delete e.name),c&&(e.indent=JSON.stringify(c)),e.helpers="helpers",e.partials="partials",d.unshift(a?b:this.nameLookup("partials",b,"partial")),this.options.compat&&(e.depths="depths"),e=this.objectLiteral(e),d.push(e),this.push(this.source.functionCall("this.invokePartial","",d))},assignToHash:function(a){var b=this.popStack(),c=void 0,d=void 0,e=void 0;this.trackIds&&(e=this.popStack()),this.stringParams&&(d=this.popStack(),c=this.popStack());var f=this.hash;c&&(f.contexts[a]=c),d&&(f.types[a]=d),e&&(f.ids[a]=e),f.values[a]=b},pushId:function(a,b,c){"BlockParam"===a?this.pushStackLiteral("blockParams["+b[0]+"].path["+b[1]+"]"+(c?" + "+JSON.stringify("."+c):"")):"PathExpression"===a?this.pushString(b):this.pushStackLiteral("SubExpression"===a?"true":"null")},compiler:e,compileChildren:function(a,b){for(var c=a.children,d=void 0,e=void 0,f=0,g=c.length;g>f;f++){d=c[f],e=new this.compiler;var h=this.matchExistingProgram(d);null==h?(this.context.programs.push(""),h=this.context.programs.length,d.index=h,d.name="program"+h,this.context.programs[h]=e.compile(d,b,this.context,!this.precompile),this.context.environments[h]=d,this.useDepths=this.useDepths||e.useDepths,this.useBlockParams=this.useBlockParams||e.useBlockParams):(d.index=h,d.name="program"+h,this.useDepths=this.useDepths||d.useDepths,this.useBlockParams=this.useBlockParams||d.useBlockParams)}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;c>b;b++){var d=this.context.environments[b];if(d&&d.equals(a))return b}},programExpression:function(a){var b=this.environment.children[a],c=[b.index,"data",b.blockParams];return(this.useBlockParams||this.useDepths)&&c.push("blockParams"),this.useDepths&&c.push("depths"),"this.program("+c.join(", ")+")"},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},push:function(a){return a instanceof d||(a=this.source.wrap(a)),this.inlineStack.push(a),a},pushStackLiteral:function(a){this.push(new d(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),a&&this.source.push(a)},replaceStack:function(a){var b=["("],c=void 0,e=void 0,f=void 0;if(!this.isInline())throw new j["default"]("replaceStack on non-inline");var g=this.popStack(!0);if(g instanceof d)c=[g.value],b=["(",c],f=!0;else{e=!0;var h=this.incrStack();b=["((",this.push(h)," = ",g,")"],c=this.topStack()}var i=a.call(this,c);f||this.popStack(),e&&this.stackSlot--,this.push(b.concat(i,")"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;this.inlineStack=[];for(var b=0,c=a.length;c>b;b++){var e=a[b];if(e instanceof d)this.compileStack.push(e);else{var f=this.incrStack();this.pushSource([f," = ",e,";"]),this.compileStack.push(f)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),c=(b?this.inlineStack:this.compileStack).pop();if(!a&&c instanceof d)return c.value;if(!b){if(!this.stackSlot)throw new j["default"]("Invalid stack pop");this.stackSlot--}return c},topStack:function(){var a=this.isInline()?this.inlineStack:this.compileStack,b=a[a.length-1];return b instanceof d?b.value:b},contextName:function(a){return this.useDepths&&a?"depths["+a+"]":"depth"+a},quotedString:function(a){return this.source.quotedString(a)},objectLiteral:function(a){return this.source.objectLiteral(a)},aliasable:function(a){var b=this.aliases[a];return b?(b.referenceCount++,b):(b=this.aliases[a]=this.source.wrap(a),b.aliasable=!0,b.referenceCount=1,b)},setupHelper:function(a,b,c){var d=[],e=this.setupHelperArgs(b,a,d,c),f=this.nameLookup("helpers",b,"helper");return{params:d,paramsInit:e,name:f,callParams:[this.contextName(0)].concat(d)}},setupParams:function(a,b,c){var d={},e=[],f=[],g=[],h=void 0;d.name=this.quotedString(a),d.hash=this.popStack(),this.trackIds&&(d.hashIds=this.popStack()),this.stringParams&&(d.hashTypes=this.popStack(),d.hashContexts=this.popStack());var i=this.popStack(),j=this.popStack();(j||i)&&(d.fn=j||"this.noop",d.inverse=i||"this.noop");for(var k=b;k--;)h=this.popStack(),c[k]=h,this.trackIds&&(g[k]=this.popStack()),this.stringParams&&(f[k]=this.popStack(),e[k]=this.popStack());return this.trackIds&&(d.ids=this.source.generateArray(g)),this.stringParams&&(d.types=this.source.generateArray(f),d.contexts=this.source.generateArray(e)),this.options.data&&(d.data="data"),this.useBlockParams&&(d.blockParams="blockParams"),d},setupHelperArgs:function(a,b,c,d){var e=this.setupParams(a,b,c,!0);return e=this.objectLiteral(e),d?(this.useRegister("options"),c.push("options"),["options=",e]):(c.push(e),"")}},function(){for(var a="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false".split(" "),b=e.RESERVED_WORDS={},c=0,d=a.length;d>c;c++)b[a[c]]=!0}(),e.isValidJavaScriptVariableName=function(a){return!e.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},b["default"]=e,a.exports=b["default"]},function(a,b,c){"use strict";function d(){this.parents=[]}var e=c(8)["default"];b.__esModule=!0;var f=c(11),g=e(f),h=c(2),i=e(h);d.prototype={constructor:d,mutating:!1,acceptKey:function(a,b){var c=this.accept(a[b]);if(this.mutating){if(c&&(!c.type||!i["default"][c.type]))throw new g["default"]('Unexpected node type "'+c.type+'" found when accepting '+b+" on "+a.type);a[b]=c}},acceptRequired:function(a,b){if(this.acceptKey(a,b),!a[b])throw new g["default"](a.type+" requires "+b)},acceptArray:function(a){for(var b=0,c=a.length;c>b;b++)this.acceptKey(a,b),a[b]||(a.splice(b,1),b--,c--)},accept:function(a){if(a){this.current&&this.parents.unshift(this.current),this.current=a;var b=this[a.type](a);return this.current=this.parents.shift(),!this.mutating||b?b:b!==!1?a:void 0}},Program:function(a){this.acceptArray(a.body)},MustacheStatement:function(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")},BlockStatement:function(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash"),this.acceptKey(a,"program"),this.acceptKey(a,"inverse")},PartialStatement:function(a){this.acceptRequired(a,"name"),this.acceptArray(a.params),this.acceptKey(a,"hash")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:function(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")},PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(a){this.acceptArray(a.pairs)},HashPair:function(a){this.acceptRequired(a,"value")}},b["default"]=d,a.exports=b["default"]},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){b.Handlebars===a&&(b.Handlebars=d)}},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0},function(a,b,c){"use strict";function d(a,b){this.helpers=a||{},this.partials=b||{},e(this)}function e(a){a.registerHelper("helperMissing",function(){if(1===arguments.length)return void 0;throw new k["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')}),a.registerHelper("blockHelperMissing",function(b,c){var d=c.inverse,e=c.fn;if(b===!0)return e(this);if(b===!1||null==b)return d(this);if(o(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):d(this);if(c.data&&c.ids){var g=f(c.data);g.contextPath=i.appendContextPath(c.data.contextPath,c.name),c={data:g}}return e(b,c)}),a.registerHelper("each",function(a,b){function c(b,c,e){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!e,l&&(j.contextPath=l+b)),h+=d(a[b],{data:j,blockParams:i.blockParams([a[b],b],[l+b,null])})}if(!b)throw new k["default"]("Must pass iterator to #each");var d=b.fn,e=b.inverse,g=0,h="",j=void 0,l=void 0;if(b.data&&b.ids&&(l=i.appendContextPath(b.data.contextPath,b.ids[0])+"."),p(a)&&(a=a.call(this)),b.data&&(j=f(b.data)),a&&"object"==typeof a)if(o(a))for(var m=a.length;m>g;g++)c(g,g,g===a.length-1);else{var n=void 0;for(var q in a)a.hasOwnProperty(q)&&(n&&c(n,g-1),n=q,g++);n&&c(n,g-1,!0)}return 0===g&&(h=e(this)),h}),a.registerHelper("if",function(a,b){return p(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||i.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,b){p(a)&&(a=a.call(this));var c=b.fn;if(i.isEmpty(a))return b.inverse(this);if(b.data&&b.ids){var d=f(b.data);d.contextPath=i.appendContextPath(b.data.contextPath,b.ids[0]),b={data:d}}return c(a,b)}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)}),a.registerHelper("lookup",function(a,b){return a&&a[b]})}function f(a){var b=i.extend({},a);return b._parent=a,b}var g=c(8)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d,b.createFrame=f;var h=c(12),i=g(h),j=c(11),k=g(j),l="3.0.1";b.VERSION=l;var m=6;b.COMPILER_REVISION=m;var n={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1"};b.REVISION_CHANGES=n;var o=i.isArray,p=i.isFunction,q=i.toString,r="[object Object]";d.prototype={constructor:d,logger:s,log:t,registerHelper:function(a,b){if(q.call(a)===r){if(b)throw new k["default"]("Arg not supported with multiple helpers");i.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(q.call(a)===r)i.extend(this.partials,a);else{if("undefined"==typeof b)throw new k["default"]("Attempting to register a partial as undefined");this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]}};var s={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:1,log:function(a,b){if("undefined"!=typeof console&&s.level<=a){var c=s.methodMap[a];(console[c]||console.log).call(console,b)}}};b.logger=s;var t=s.log;b.log=t},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b){"use strict";function c(a,b){var e=b&&b.loc,f=void 0,g=void 0;e&&(f=e.start.line,g=e.start.column,a+=" - "+f+":"+g);for(var h=Error.prototype.constructor.call(this,a),i=0;ic;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return l.test(a)?a.replace(k,c):a}function g(a){return a||0===a?o(a)&&0===a.length?!0:!1:!0}function h(a,b){return a.path=b,a}function i(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.blockParams=h,b.appendContextPath=i;var j={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},k=/[&<>"'`]/g,l=/[&<>"'`]/,m=Object.prototype.toString;b.toString=m;var n=function(a){return"function"==typeof a};n(/x/)&&(b.isFunction=n=function(a){return"function"==typeof a&&"[object Function]"===m.call(a)});var n;b.isFunction=n;var o=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===m.call(a):!1};b.isArray=o},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=p.COMPILER_REVISION;if(b!==c){if(c>b){var d=p.REVISION_CHANGES[c],e=p.REVISION_CHANGES[b];throw new o["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new o["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=m.extend({},d,e.hash)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;i>h&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new o["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){var c=void 0===arguments[1]?{}:arguments[1],f=c.data; -d._setup(c),!c.partial&&a.useData&&(f=j(b,f));var g=void 0,h=a.useBlockParams?[]:void 0;return a.useDepths&&(g=c.depths?[b].concat(c.depths):[b]),a.main.call(e,b,e.helpers,e.partials,f,h,g)}if(!b)throw new o["default"]("No environment passed to template");if(!a||!a.main)throw new o["default"]("Unknown template object: "+typeof a);b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new o["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;c>d;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:m.escapeExpression,invokePartial:c,fn:function(b){return a[b]},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=m.extend({},b,a)),c},noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new o["default"]("must pass block params");if(a.useDepths&&!g)throw new o["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=void 0===arguments[1]?{}:arguments[1];return c.call(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),g&&[b].concat(g))}return h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a=c.partials[c.name],a}function h(a,b,c){if(c.partial=!0,void 0===a)throw new o["default"]("The partial "+c.name+" could not be found");return a instanceof Function?a(b,c):void 0}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?p.createFrame(b):{},b.root=a),b}var k=c(8)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var l=c(12),m=k(l),n=c(11),o=k(n),p=c(9)},function(a,b){"use strict";b.__esModule=!0;var c=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,content:12,COMMENT:13,CONTENT:14,openRawBlock:15,END_RAW_BLOCK:16,OPEN_RAW_BLOCK:17,helperName:18,openRawBlock_repetition0:19,openRawBlock_option0:20,CLOSE_RAW_BLOCK:21,openBlock:22,block_option0:23,closeBlock:24,openInverse:25,block_option1:26,OPEN_BLOCK:27,openBlock_repetition0:28,openBlock_option0:29,openBlock_option1:30,CLOSE:31,OPEN_INVERSE:32,openInverse_repetition0:33,openInverse_option0:34,openInverse_option1:35,openInverseChain:36,OPEN_INVERSE_CHAIN:37,openInverseChain_repetition0:38,openInverseChain_option0:39,openInverseChain_option1:40,inverseAndProgram:41,INVERSE:42,inverseChain:43,inverseChain_option0:44,OPEN_ENDBLOCK:45,OPEN:46,mustache_repetition0:47,mustache_option0:48,OPEN_UNESCAPED:49,mustache_repetition1:50,mustache_option1:51,CLOSE_UNESCAPED:52,OPEN_PARTIAL:53,partialName:54,partial_repetition0:55,partial_option0:56,param:57,sexpr:58,OPEN_SEXPR:59,sexpr_repetition0:60,sexpr_option0:61,CLOSE_SEXPR:62,hash:63,hash_repetition_plus0:64,hashSegment:65,ID:66,EQUALS:67,blockParams:68,OPEN_BLOCK_PARAMS:69,blockParams_repetition_plus0:70,CLOSE_BLOCK_PARAMS:71,path:72,dataName:73,STRING:74,NUMBER:75,BOOLEAN:76,UNDEFINED:77,NULL:78,DATA:79,pathSegments:80,SEP:81,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",13:"COMMENT",14:"CONTENT",16:"END_RAW_BLOCK",17:"OPEN_RAW_BLOCK",21:"CLOSE_RAW_BLOCK",27:"OPEN_BLOCK",31:"CLOSE",32:"OPEN_INVERSE",37:"OPEN_INVERSE_CHAIN",42:"INVERSE",45:"OPEN_ENDBLOCK",46:"OPEN",49:"OPEN_UNESCAPED",52:"CLOSE_UNESCAPED",53:"OPEN_PARTIAL",59:"OPEN_SEXPR",62:"CLOSE_SEXPR",66:"ID",67:"EQUALS",69:"OPEN_BLOCK_PARAMS",71:"CLOSE_BLOCK_PARAMS",74:"STRING",75:"NUMBER",76:"BOOLEAN",77:"UNDEFINED",78:"NULL",79:"DATA",81:"SEP"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[12,1],[10,3],[15,5],[9,4],[9,4],[22,6],[25,6],[36,6],[41,2],[43,3],[43,1],[24,3],[8,5],[8,5],[11,5],[57,1],[57,1],[58,5],[63,1],[65,3],[68,3],[18,1],[18,1],[18,1],[18,1],[18,1],[18,1],[18,1],[54,1],[54,1],[73,2],[72,1],[80,3],[80,1],[6,0],[6,2],[19,0],[19,2],[20,0],[20,1],[23,0],[23,1],[26,0],[26,1],[28,0],[28,2],[29,0],[29,1],[30,0],[30,1],[33,0],[33,2],[34,0],[34,1],[35,0],[35,1],[38,0],[38,2],[39,0],[39,1],[40,0],[40,1],[44,0],[44,1],[47,0],[47,2],[48,0],[48,1],[50,0],[50,2],[51,0],[51,1],[55,0],[55,2],[56,0],[56,1],[60,0],[60,2],[61,0],[61,1],[64,1],[64,2],[70,1],[70,2]],performAction:function(a,b,c,d,e,f){var g=f.length-1;switch(e){case 1:return f[g-1];case 2:this.$=new d.Program(f[g],null,{},d.locInfo(this._$));break;case 3:this.$=f[g];break;case 4:this.$=f[g];break;case 5:this.$=f[g];break;case 6:this.$=f[g];break;case 7:this.$=f[g];break;case 8:this.$=new d.CommentStatement(d.stripComment(f[g]),d.stripFlags(f[g],f[g]),d.locInfo(this._$));break;case 9:this.$=new d.ContentStatement(f[g],d.locInfo(this._$));break;case 10:this.$=d.prepareRawBlock(f[g-2],f[g-1],f[g],this._$);break;case 11:this.$={path:f[g-3],params:f[g-2],hash:f[g-1]};break;case 12:this.$=d.prepareBlock(f[g-3],f[g-2],f[g-1],f[g],!1,this._$);break;case 13:this.$=d.prepareBlock(f[g-3],f[g-2],f[g-1],f[g],!0,this._$);break;case 14:this.$={path:f[g-4],params:f[g-3],hash:f[g-2],blockParams:f[g-1],strip:d.stripFlags(f[g-5],f[g])};break;case 15:this.$={path:f[g-4],params:f[g-3],hash:f[g-2],blockParams:f[g-1],strip:d.stripFlags(f[g-5],f[g])};break;case 16:this.$={path:f[g-4],params:f[g-3],hash:f[g-2],blockParams:f[g-1],strip:d.stripFlags(f[g-5],f[g])};break;case 17:this.$={strip:d.stripFlags(f[g-1],f[g-1]),program:f[g]};break;case 18:var h=d.prepareBlock(f[g-2],f[g-1],f[g],f[g],!1,this._$),i=new d.Program([h],null,{},d.locInfo(this._$));i.chained=!0,this.$={strip:f[g-2].strip,program:i,chain:!0};break;case 19:this.$=f[g];break;case 20:this.$={path:f[g-1],strip:d.stripFlags(f[g-2],f[g])};break;case 21:this.$=d.prepareMustache(f[g-3],f[g-2],f[g-1],f[g-4],d.stripFlags(f[g-4],f[g]),this._$);break;case 22:this.$=d.prepareMustache(f[g-3],f[g-2],f[g-1],f[g-4],d.stripFlags(f[g-4],f[g]),this._$);break;case 23:this.$=new d.PartialStatement(f[g-3],f[g-2],f[g-1],d.stripFlags(f[g-4],f[g]),d.locInfo(this._$));break;case 24:this.$=f[g];break;case 25:this.$=f[g];break;case 26:this.$=new d.SubExpression(f[g-3],f[g-2],f[g-1],d.locInfo(this._$));break;case 27:this.$=new d.Hash(f[g],d.locInfo(this._$));break;case 28:this.$=new d.HashPair(d.id(f[g-2]),f[g],d.locInfo(this._$));break;case 29:this.$=d.id(f[g-1]);break;case 30:this.$=f[g];break;case 31:this.$=f[g];break;case 32:this.$=new d.StringLiteral(f[g],d.locInfo(this._$));break;case 33:this.$=new d.NumberLiteral(f[g],d.locInfo(this._$));break;case 34:this.$=new d.BooleanLiteral(f[g],d.locInfo(this._$));break;case 35:this.$=new d.UndefinedLiteral(d.locInfo(this._$));break;case 36:this.$=new d.NullLiteral(d.locInfo(this._$));break;case 37:this.$=f[g];break;case 38:this.$=f[g];break;case 39:this.$=d.preparePath(!0,f[g],this._$);break;case 40:this.$=d.preparePath(!1,f[g],this._$);break;case 41:f[g-2].push({part:d.id(f[g]),original:f[g],separator:f[g-1]}),this.$=f[g-2];break;case 42:this.$=[{part:d.id(f[g]),original:f[g]}];break;case 43:this.$=[];break;case 44:f[g-1].push(f[g]);break;case 45:this.$=[];break;case 46:f[g-1].push(f[g]);break;case 53:this.$=[];break;case 54:f[g-1].push(f[g]);break;case 59:this.$=[];break;case 60:f[g-1].push(f[g]);break;case 65:this.$=[];break;case 66:f[g-1].push(f[g]);break;case 73:this.$=[];break;case 74:f[g-1].push(f[g]);break;case 77:this.$=[];break;case 78:f[g-1].push(f[g]);break;case 81:this.$=[];break;case 82:f[g-1].push(f[g]);break;case 85:this.$=[];break;case 86:f[g-1].push(f[g]);break;case 89:this.$=[f[g]];break;case 90:f[g-1].push(f[g]);break;case 91:this.$=[f[g]];break;case 92:f[g-1].push(f[g])}},table:[{3:1,4:2,5:[2,43],6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],46:[2,43],49:[2,43],53:[2,43]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:[1,11],14:[1,18],15:16,17:[1,21],22:14,25:15,27:[1,19],32:[1,20],37:[2,2],42:[2,2],45:[2,2],46:[1,12],49:[1,13],53:[1,17]},{1:[2,1]},{5:[2,44],13:[2,44],14:[2,44],17:[2,44],27:[2,44],32:[2,44],37:[2,44],42:[2,44],45:[2,44],46:[2,44],49:[2,44],53:[2,44]},{5:[2,3],13:[2,3],14:[2,3],17:[2,3],27:[2,3],32:[2,3],37:[2,3],42:[2,3],45:[2,3],46:[2,3],49:[2,3],53:[2,3]},{5:[2,4],13:[2,4],14:[2,4],17:[2,4],27:[2,4],32:[2,4],37:[2,4],42:[2,4],45:[2,4],46:[2,4],49:[2,4],53:[2,4]},{5:[2,5],13:[2,5],14:[2,5],17:[2,5],27:[2,5],32:[2,5],37:[2,5],42:[2,5],45:[2,5],46:[2,5],49:[2,5],53:[2,5]},{5:[2,6],13:[2,6],14:[2,6],17:[2,6],27:[2,6],32:[2,6],37:[2,6],42:[2,6],45:[2,6],46:[2,6],49:[2,6],53:[2,6]},{5:[2,7],13:[2,7],14:[2,7],17:[2,7],27:[2,7],32:[2,7],37:[2,7],42:[2,7],45:[2,7],46:[2,7],49:[2,7],53:[2,7]},{5:[2,8],13:[2,8],14:[2,8],17:[2,8],27:[2,8],32:[2,8],37:[2,8],42:[2,8],45:[2,8],46:[2,8],49:[2,8],53:[2,8]},{18:22,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:33,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{4:34,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],37:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{4:35,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{12:36,14:[1,18]},{18:38,54:37,58:39,59:[1,40],66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,9],13:[2,9],14:[2,9],16:[2,9],17:[2,9],27:[2,9],32:[2,9],37:[2,9],42:[2,9],45:[2,9],46:[2,9],49:[2,9],53:[2,9]},{18:41,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:42,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:43,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{31:[2,73],47:44,59:[2,73],66:[2,73],74:[2,73],75:[2,73],76:[2,73],77:[2,73],78:[2,73],79:[2,73]},{21:[2,30],31:[2,30],52:[2,30],59:[2,30],62:[2,30],66:[2,30],69:[2,30],74:[2,30],75:[2,30],76:[2,30],77:[2,30],78:[2,30],79:[2,30]},{21:[2,31],31:[2,31],52:[2,31],59:[2,31],62:[2,31],66:[2,31],69:[2,31],74:[2,31],75:[2,31],76:[2,31],77:[2,31],78:[2,31],79:[2,31]},{21:[2,32],31:[2,32],52:[2,32],59:[2,32],62:[2,32],66:[2,32],69:[2,32],74:[2,32],75:[2,32],76:[2,32],77:[2,32],78:[2,32],79:[2,32]},{21:[2,33],31:[2,33],52:[2,33],59:[2,33],62:[2,33],66:[2,33],69:[2,33],74:[2,33],75:[2,33],76:[2,33],77:[2,33],78:[2,33],79:[2,33]},{21:[2,34],31:[2,34],52:[2,34],59:[2,34],62:[2,34],66:[2,34],69:[2,34],74:[2,34],75:[2,34],76:[2,34],77:[2,34],78:[2,34],79:[2,34]},{21:[2,35],31:[2,35],52:[2,35],59:[2,35],62:[2,35],66:[2,35],69:[2,35],74:[2,35],75:[2,35],76:[2,35],77:[2,35],78:[2,35],79:[2,35]},{21:[2,36],31:[2,36],52:[2,36],59:[2,36],62:[2,36],66:[2,36],69:[2,36],74:[2,36],75:[2,36],76:[2,36],77:[2,36],78:[2,36],79:[2,36]},{21:[2,40],31:[2,40],52:[2,40],59:[2,40],62:[2,40],66:[2,40],69:[2,40],74:[2,40],75:[2,40],76:[2,40],77:[2,40],78:[2,40],79:[2,40],81:[1,45]},{66:[1,32],80:46},{21:[2,42],31:[2,42],52:[2,42],59:[2,42],62:[2,42],66:[2,42],69:[2,42],74:[2,42],75:[2,42],76:[2,42],77:[2,42],78:[2,42],79:[2,42],81:[2,42]},{50:47,52:[2,77],59:[2,77],66:[2,77],74:[2,77],75:[2,77],76:[2,77],77:[2,77],78:[2,77],79:[2,77]},{23:48,36:50,37:[1,52],41:51,42:[1,53],43:49,45:[2,49]},{26:54,41:55,42:[1,53],45:[2,51]},{16:[1,56]},{31:[2,81],55:57,59:[2,81],66:[2,81],74:[2,81],75:[2,81],76:[2,81],77:[2,81],78:[2,81],79:[2,81]},{31:[2,37],59:[2,37],66:[2,37],74:[2,37],75:[2,37],76:[2,37],77:[2,37],78:[2,37],79:[2,37]},{31:[2,38],59:[2,38],66:[2,38],74:[2,38],75:[2,38],76:[2,38],77:[2,38],78:[2,38],79:[2,38]},{18:58,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{28:59,31:[2,53],59:[2,53],66:[2,53],69:[2,53],74:[2,53],75:[2,53],76:[2,53],77:[2,53],78:[2,53],79:[2,53]},{31:[2,59],33:60,59:[2,59],66:[2,59],69:[2,59],74:[2,59],75:[2,59],76:[2,59],77:[2,59],78:[2,59],79:[2,59]},{19:61,21:[2,45],59:[2,45],66:[2,45],74:[2,45],75:[2,45],76:[2,45],77:[2,45],78:[2,45],79:[2,45]},{18:65,31:[2,75],48:62,57:63,58:66,59:[1,40],63:64,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{66:[1,70]},{21:[2,39],31:[2,39],52:[2,39],59:[2,39],62:[2,39],66:[2,39],69:[2,39],74:[2,39],75:[2,39],76:[2,39],77:[2,39],78:[2,39],79:[2,39],81:[1,45]},{18:65,51:71,52:[2,79],57:72,58:66,59:[1,40],63:73,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{24:74,45:[1,75]},{45:[2,50]},{4:76,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],37:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{45:[2,19]},{18:77,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{4:78,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{24:79,45:[1,75]},{45:[2,52]},{5:[2,10],13:[2,10],14:[2,10],17:[2,10],27:[2,10],32:[2,10],37:[2,10],42:[2,10],45:[2,10],46:[2,10],49:[2,10],53:[2,10]},{18:65,31:[2,83],56:80,57:81,58:66,59:[1,40],63:82,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{59:[2,85],60:83,62:[2,85],66:[2,85],74:[2,85],75:[2,85],76:[2,85],77:[2,85],78:[2,85],79:[2,85]},{18:65,29:84,31:[2,55],57:85,58:66,59:[1,40],63:86,64:67,65:68,66:[1,69],69:[2,55],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:65,31:[2,61],34:87,57:88,58:66,59:[1,40],63:89,64:67,65:68,66:[1,69],69:[2,61],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:65,20:90,21:[2,47],57:91,58:66,59:[1,40],63:92,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{31:[1,93]},{31:[2,74],59:[2,74],66:[2,74],74:[2,74],75:[2,74],76:[2,74],77:[2,74],78:[2,74],79:[2,74]},{31:[2,76]},{21:[2,24],31:[2,24],52:[2,24],59:[2,24],62:[2,24],66:[2,24],69:[2,24],74:[2,24],75:[2,24],76:[2,24],77:[2,24],78:[2,24],79:[2,24]},{21:[2,25],31:[2,25],52:[2,25],59:[2,25],62:[2,25],66:[2,25],69:[2,25],74:[2,25],75:[2,25],76:[2,25],77:[2,25],78:[2,25],79:[2,25]},{21:[2,27],31:[2,27],52:[2,27],62:[2,27],65:94,66:[1,95],69:[2,27]},{21:[2,89],31:[2,89],52:[2,89],62:[2,89],66:[2,89],69:[2,89]},{21:[2,42],31:[2,42],52:[2,42],59:[2,42],62:[2,42],66:[2,42],67:[1,96],69:[2,42],74:[2,42],75:[2,42],76:[2,42],77:[2,42],78:[2,42],79:[2,42],81:[2,42]},{21:[2,41],31:[2,41],52:[2,41],59:[2,41],62:[2,41],66:[2,41],69:[2,41],74:[2,41],75:[2,41],76:[2,41],77:[2,41],78:[2,41],79:[2,41],81:[2,41]},{52:[1,97]},{52:[2,78],59:[2,78],66:[2,78],74:[2,78],75:[2,78],76:[2,78],77:[2,78],78:[2,78],79:[2,78]},{52:[2,80]},{5:[2,12],13:[2,12],14:[2,12],17:[2,12],27:[2,12],32:[2,12],37:[2,12],42:[2,12],45:[2,12],46:[2,12],49:[2,12],53:[2,12]},{18:98,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{36:50,37:[1,52],41:51,42:[1,53],43:100,44:99,45:[2,71]},{31:[2,65],38:101,59:[2,65],66:[2,65],69:[2,65],74:[2,65],75:[2,65],76:[2,65],77:[2,65],78:[2,65],79:[2,65]},{45:[2,17]},{5:[2,13],13:[2,13],14:[2,13],17:[2,13],27:[2,13],32:[2,13],37:[2,13],42:[2,13],45:[2,13],46:[2,13],49:[2,13],53:[2,13]},{31:[1,102]},{31:[2,82],59:[2,82],66:[2,82],74:[2,82],75:[2,82],76:[2,82],77:[2,82],78:[2,82],79:[2,82]},{31:[2,84]},{18:65,57:104,58:66,59:[1,40],61:103,62:[2,87],63:105,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{30:106,31:[2,57],68:107,69:[1,108]},{31:[2,54],59:[2,54],66:[2,54],69:[2,54],74:[2,54],75:[2,54],76:[2,54],77:[2,54],78:[2,54],79:[2,54]},{31:[2,56],69:[2,56]},{31:[2,63],35:109,68:110,69:[1,108]},{31:[2,60],59:[2,60],66:[2,60],69:[2,60],74:[2,60],75:[2,60],76:[2,60],77:[2,60],78:[2,60],79:[2,60]},{31:[2,62],69:[2,62]},{21:[1,111]},{21:[2,46],59:[2,46],66:[2,46],74:[2,46],75:[2,46],76:[2,46],77:[2,46],78:[2,46],79:[2,46]},{21:[2,48]},{5:[2,21],13:[2,21],14:[2,21],17:[2,21],27:[2,21],32:[2,21],37:[2,21],42:[2,21],45:[2,21],46:[2,21],49:[2,21],53:[2,21]},{21:[2,90],31:[2,90],52:[2,90],62:[2,90],66:[2,90],69:[2,90]},{67:[1,96]},{18:65,57:112,58:66,59:[1,40],66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,22],13:[2,22],14:[2,22],17:[2,22],27:[2,22],32:[2,22],37:[2,22],42:[2,22],45:[2,22],46:[2,22],49:[2,22],53:[2,22]},{31:[1,113]},{45:[2,18]},{45:[2,72]},{18:65,31:[2,67],39:114,57:115,58:66,59:[1,40],63:116,64:67,65:68,66:[1,69],69:[2,67],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,23],13:[2,23],14:[2,23],17:[2,23],27:[2,23],32:[2,23],37:[2,23],42:[2,23],45:[2,23],46:[2,23],49:[2,23],53:[2,23]},{62:[1,117]},{59:[2,86],62:[2,86],66:[2,86],74:[2,86],75:[2,86],76:[2,86],77:[2,86],78:[2,86],79:[2,86]},{62:[2,88]},{31:[1,118]},{31:[2,58]},{66:[1,120],70:119},{31:[1,121]},{31:[2,64]},{14:[2,11]},{21:[2,28],31:[2,28],52:[2,28],62:[2,28],66:[2,28],69:[2,28]},{5:[2,20],13:[2,20],14:[2,20],17:[2,20],27:[2,20],32:[2,20],37:[2,20],42:[2,20],45:[2,20],46:[2,20],49:[2,20],53:[2,20]},{31:[2,69],40:122,68:123,69:[1,108]},{31:[2,66],59:[2,66],66:[2,66],69:[2,66],74:[2,66],75:[2,66],76:[2,66],77:[2,66],78:[2,66],79:[2,66]},{31:[2,68],69:[2,68]},{21:[2,26],31:[2,26],52:[2,26],59:[2,26],62:[2,26],66:[2,26],69:[2,26],74:[2,26],75:[2,26],76:[2,26],77:[2,26],78:[2,26],79:[2,26]},{13:[2,14],14:[2,14],17:[2,14],27:[2,14],32:[2,14],37:[2,14],42:[2,14],45:[2,14],46:[2,14],49:[2,14],53:[2,14]},{66:[1,125],71:[1,124]},{66:[2,91],71:[2,91]},{13:[2,15],14:[2,15],17:[2,15],27:[2,15],32:[2,15],42:[2,15],45:[2,15],46:[2,15],49:[2,15],53:[2,15]},{31:[1,126]},{31:[2,70]},{31:[2,29]},{66:[2,92],71:[2,92]},{13:[2,16],14:[2,16],17:[2,16],27:[2,16],32:[2,16],37:[2,16],42:[2,16],45:[2,16],46:[2,16],49:[2,16],53:[2,16]}],defaultActions:{4:[2,1],49:[2,50],51:[2,19],55:[2,52],64:[2,76],73:[2,80],78:[2,17],82:[2,84],92:[2,48],99:[2,18],100:[2,72],105:[2,88],107:[2,58],110:[2,64],111:[2,11],123:[2,70],124:[2,29]},parseError:function(a){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:((null===n||"undefined"==typeof n)&&(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;gb[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 14;break;case 1:return 14;case 2:return this.popState(),14;case 3:return b.yytext=b.yytext.substr(5,b.yyleng-9),this.popState(),16;case 4:return 14;case 5:return this.popState(),13;case 6:return 59;case 7:return 62;case 8:return 17;case 9:return this.popState(),this.begin("raw"),21;case 10:return 53;case 11:return 27;case 12:return 45;case 13:return this.popState(),42;case 14:return this.popState(),42;case 15:return 32;case 16:return 37;case 17:return 49;case 18:return 46;case 19:this.unput(b.yytext),this.popState(),this.begin("com");break;case 20:return this.popState(),13;case 21:return 46;case 22:return 67;case 23:return 66;case 24:return 66;case 25:return 81;case 26:break;case 27:return this.popState(),52;case 28:return this.popState(),31;case 29:return b.yytext=e(1,2).replace(/\\"/g,'"'),74;case 30:return b.yytext=e(1,2).replace(/\\'/g,"'"),74;case 31:return 79;case 32:return 76;case 33:return 76;case 34:return 77;case 35:return 78;case 36:return 75;case 37:return 69;case 38:return 71;case 39:return 66;case 40:return 66;case 41:return"INVALID";case 42:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{\/)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[5],inclusive:!1},raw:{rules:[3,4],inclusive:!1},INITIAL:{rules:[0,1,42],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(){}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"ContentStatement"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"ContentStatement"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"ContentStatement"===d.type&&(c||!d.rightStripped)){var e=d.value;d.value=d.value.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.value!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"ContentStatement"===d.type&&(c||!d.leftStripped)){var e=d.value;return d.value=d.value.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.value!==e,d.leftStripped}}var i=c(8)["default"];b.__esModule=!0;var j=c(6),k=i(j);d.prototype=new k["default"],d.prototype.Program=function(a){var b=!this.isRootSeen;this.isRootSeen=!0;for(var c=a.body,d=0,i=c.length;i>d;d++){var j=c[d],k=this.accept(j);if(k){var l=e(c,d,b),m=f(c,d,b),n=k.openStandalone&&l,o=k.closeStandalone&&m,p=k.inlineStandalone&&l&&m;k.close&&g(c,d,!0),k.open&&h(c,d,!0),p&&(g(c,d),h(c,d)&&"PartialStatement"===j.type&&(j.indent=/([ \t]+$)/.exec(c[d-1].original)[1])),n&&(g((j.program||j.inverse).body),h(c,d)),o&&(g(c,d),h((j.inverse||j.program).body))}}return a},d.prototype.BlockStatement=function(a){this.accept(a.program),this.accept(a.inverse);var b=a.program||a.inverse,c=a.program&&a.inverse,d=c,i=c;if(c&&c.chained)for(d=c.body[0].program;i.chained;)i=i.body[i.body.length-1].program;var j={open:a.openStrip.open,close:a.closeStrip.close,openStandalone:f(b.body),closeStandalone:e((d||b).body)};if(a.openStrip.close&&g(b.body,null,!0),c){var k=a.inverseStrip;k.open&&h(b.body,null,!0),k.close&&g(d.body,null,!0),a.closeStrip.open&&h(i.body,null,!0),e(b.body)&&f(d.body)&&(h(b.body),g(d.body))}else a.closeStrip.open&&h(b.body,null,!0);return j},d.prototype.MustacheStatement=function(a){return a.strip},d.prototype.PartialStatement=d.prototype.CommentStatement=function(a){var b=a.strip||{};return{inlineStandalone:!0,open:b.open,close:b.close}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){this.source=a,this.start={line:b.first_line,column:b.first_column},this.end={line:b.last_line,column:b.last_column}}function e(a){return/^\[.*\]$/.test(a)?a.substr(1,a.length-2):a}function f(a,b){return{open:"~"===a.charAt(2),close:"~"===b.charAt(b.length-3)}}function g(a){return a.replace(/^\{\{~?\!-?-?/,"").replace(/-?-?~?\}\}$/,"")}function h(a,b,c){c=this.locInfo(c);for(var d=a?"@":"",e=[],f=0,g="",h=0,i=b.length;i>h;h++){var j=b[h].part,k=b[h].original!==j;if(d+=(b[h].separator||"")+j,k||".."!==j&&"."!==j&&"this"!==j)e.push(j);else{if(e.length>0)throw new n["default"]("Invalid path: "+d,{loc:c});".."===j&&(f++,g+="../")}}return new this.PathExpression(a,f,e,d,c)}function i(a,b,c,d,e,f){var g=d.charAt(3)||d.charAt(2),h="{"!==g&&"&"!==g;return new this.MustacheStatement(a,b,c,h,e,this.locInfo(f))}function j(a,b,c,d){if(a.path.original!==c){var e={loc:a.path.loc};throw new n["default"](a.path.original+" doesn't match "+c,e)}d=this.locInfo(d);var f=new this.Program([b],null,{},d);return new this.BlockStatement(a.path,a.params,a.hash,f,void 0,{},{},{},d)}function k(a,b,c,d,e,f){if(d&&d.path&&a.path.original!==d.path.original){var g={loc:a.path.loc};throw new n["default"](a.path.original+" doesn't match "+d.path.original,g)}b.blockParams=a.blockParams;var h=void 0,i=void 0;return c&&(c.chain&&(c.program.body[0].closeStrip=d.strip),i=c.strip,h=c.program),e&&(e=h,h=b,b=e),new this.BlockStatement(a.path,a.params,a.hash,b,h,a.strip,i,d&&d.strip,this.locInfo(f))}var l=c(8)["default"];b.__esModule=!0,b.SourceLocation=d,b.id=e,b.stripFlags=f,b.stripComment=g,b.preparePath=h,b.prepareMustache=i,b.prepareRawBlock=j,b.prepareBlock=k;var m=c(11),n=l(m)},function(a,b,c){"use strict";function d(a,b,c){if(f.isArray(a)){for(var d=[],e=0,g=a.length;g>e;e++)d.push(b.wrap(a[e],c));return d}return"boolean"==typeof a||"number"==typeof a?a+"":a}function e(a){this.srcFile=a,this.source=[]}b.__esModule=!0;var f=c(12),g=void 0;try{}catch(h){}g||(g=function(a,b,c,d){this.src="",d&&this.add(d)},g.prototype={add:function(a){f.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){f.isArray(a)&&(a=a.join("")),this.src=a+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),e.prototype={prepend:function(a,b){this.source.unshift(this.wrap(a,b))},push:function(a,b){this.source.push(this.wrap(a,b))},merge:function(){var a=this.empty();return this.each(function(b){a.add([" ",b,"\n"])}),a},each:function(a){for(var b=0,c=this.source.length;c>b;b++)a(this.source[b])},empty:function(){var a=void 0===arguments[0]?this.currentLocation||{start:{}}:arguments[0];return new g(a.start.line,a.start.column,this.srcFile)},wrap:function(a){var b=void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return a instanceof g?a:(a=d(a,this,b),new g(b.start.line,b.start.column,this.srcFile,a))},functionCall:function(a,b,c){return c=this.generateList(c),this.wrap([a,b?"."+b+"(":"(",c,")"])},quotedString:function(a){return'"'+(a+"").replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},objectLiteral:function(a){var b=[];for(var c in a)if(a.hasOwnProperty(c)){var e=d(a[c],this);"undefined"!==e&&b.push([this.quotedString(c),":",e]) -}var f=this.generateList(b);return f.prepend("{"),f.add("}"),f},generateList:function(a,b){for(var c=this.empty(b),e=0,f=a.length;f>e;e++)e&&c.add(","),c.add(d(a[e],this,b));return c},generateArray:function(a,b){var c=this.generateList(a,b);return c.prepend("["),c.add("]"),c}},b["default"]=e,a.exports=b["default"]}])}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.js deleted file mode 100644 index 9b5c9dd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.js +++ /dev/null @@ -1,744 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -define('handlebars/utils',['exports'], function (exports) { - - - exports.__esModule = true; - exports.extend = extend; - - // Older IE versions do not directly support indexOf so we must implement our own, sadly. - exports.indexOf = indexOf; - exports.escapeExpression = escapeExpression; - exports.isEmpty = isEmpty; - exports.blockParams = blockParams; - exports.appendContextPath = appendContextPath; - var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '`': '`' - }; - - var badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - - function escapeChar(chr) { - return escape[chr]; - } - - function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; - } - - var toString = Object.prototype.toString; - - exports.toString = toString; - // Sourced from lodash - // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt - /*eslint-disable func-style, no-var */ - var isFunction = function isFunction(value) { - return typeof value === 'function'; - }; - // fallback for older versions of Chrome and Safari - /* istanbul ignore next */ - if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; - } - var isFunction; - exports.isFunction = isFunction; - /*eslint-enable func-style, no-var */ - - /* istanbul ignore next */ - var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; - };exports.isArray = isArray; - - function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; - } - - function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); - } - - function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } - } - - function blockParams(params, ids) { - params.path = ids; - return params; - } - - function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; - } -}); -define('handlebars/exception',['exports', 'module'], function (exports, module) { - - - var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - - function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } - } - - Exception.prototype = new Error(); - - module.exports = Exception; -}); -define('handlebars/base',['exports', './utils', './exception'], function (exports, _utils, _exception) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.HandlebarsEnvironment = HandlebarsEnvironment; - exports.createFrame = createFrame; - - var _Exception = _interopRequire(_exception); - - var VERSION = '3.0.1'; - exports.VERSION = VERSION; - var COMPILER_REVISION = 6; - - exports.COMPILER_REVISION = COMPILER_REVISION; - var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' - }; - - exports.REVISION_CHANGES = REVISION_CHANGES; - var isArray = _utils.isArray, - isFunction = _utils.isFunction, - toString = _utils.toString, - objectType = '[object Object]'; - - function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); - } - - HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function registerHelper(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { - throw new _Exception('Arg not supported with multiple helpers'); - } - _utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (toString.call(name) === objectType) { - _utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _Exception('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - } - }; - - function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function () { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _Exception('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _Exception('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (var j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function (conditional, options) { - if (isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - - instance.registerHelper('with', function (context, options) { - if (isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!_utils.isEmpty(context)) { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = { data: data }; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function (message, options) { - var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); - } - - var logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function log(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - var method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } - }; - - exports.logger = logger; - var log = logger.log; - - exports.log = log; - - function createFrame(object) { - var frame = _utils.extend({}, object); - frame._parent = object; - return frame; - } -}); -/* [args, ]options */; -define('handlebars/safe-string',['exports', 'module'], function (exports, module) { - // Build out our basic SafeString type - - - function SafeString(string) { - this.string = string; - } - - SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; - }; - - module.exports = SafeString; -}); -define('handlebars/runtime',['exports', './utils', './exception', './base'], function (exports, _utils, _exception, _base) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.checkRevision = checkRevision; - - // TODO: Remove this line and break up compilePartial - - exports.template = template; - exports.wrapProgram = wrapProgram; - exports.resolvePartial = resolvePartial; - exports.invokePartial = invokePartial; - exports.noop = noop; - - var _Exception = _interopRequire(_exception); - - function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _base.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _base.REVISION_CHANGES[currentRevision], - compilerVersions = _base.REVISION_CHANGES[compilerRevision]; - throw new _Exception('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _Exception('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } - } - - function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _Exception('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _Exception('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = _utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _Exception('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _Exception('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: _utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - return templateSpec[i]; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = _utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _Exception('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _Exception('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; - } - - function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; - } - - function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; - } - - function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new _Exception('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } - } - - function noop() { - return ''; - } - - function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _base.createFrame(data) : {}; - data.root = context; - } - return data; - } -}); -define('handlebars/no-conflict',['exports', 'module'], function (exports, module) { - /*global window */ - - - module.exports = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; - }; -}); -define('handlebars.runtime',['exports', 'module', './handlebars/base', './handlebars/safe-string', './handlebars/exception', './handlebars/utils', './handlebars/runtime', './handlebars/no-conflict'], function (exports, module, _handlebarsBase, _handlebarsSafeString, _handlebarsException, _handlebarsUtils, _handlebarsRuntime, _handlebarsNoConflict) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - // Each of these augment the Handlebars object. No need to setup here. - // (This is done to easily share code between commonjs and browse envs) - - var _SafeString = _interopRequire(_handlebarsSafeString); - - var _Exception = _interopRequire(_handlebarsException); - - var _noConflict = _interopRequire(_handlebarsNoConflict); - - // For compatibility and usage outside of module systems, make the Handlebars object a namespace - function create() { - var hb = new _handlebarsBase.HandlebarsEnvironment(); - - _handlebarsUtils.extend(hb, _handlebarsBase); - hb.SafeString = _SafeString; - hb.Exception = _Exception; - hb.Utils = _handlebarsUtils; - hb.escapeExpression = _handlebarsUtils.escapeExpression; - - hb.VM = _handlebarsRuntime; - hb.template = function (spec) { - return _handlebarsRuntime.template(spec, hb); - }; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict(inst); - - inst['default'] = inst; - - module.exports = inst; -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.min.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.min.js deleted file mode 100644 index c5f872f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.min.js +++ /dev/null @@ -1,27 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -define("handlebars/utils",["exports"],function(a){function b(a){return i[a]}function c(a){for(var b=1;bc;c++)if(a[c]===b)return c;return-1}function e(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return k.test(a)?a.replace(j,b):a}function f(a){return a||0===a?n(a)&&0===a.length?!0:!1:!0}function g(a,b){return a.path=b,a}function h(a,b){return(a?a+".":"")+b}a.__esModule=!0,a.extend=c,a.indexOf=d,a.escapeExpression=e,a.isEmpty=f,a.blockParams=g,a.appendContextPath=h;var i={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},j=/[&<>"'`]/g,k=/[&<>"'`]/,l=Object.prototype.toString;a.toString=l;var m=function(a){return"function"==typeof a};m(/x/)&&(a.isFunction=m=function(a){return"function"==typeof a&&"[object Function]"===l.call(a)});var m;a.isFunction=m;var n=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===l.call(a):!1};a.isArray=n}),define("handlebars/exception",["exports","module"],function(a,b){function c(a,b){var e=b&&b.loc,f=void 0,g=void 0;e&&(f=e.start.line,g=e.start.column,a+=" - "+f+":"+g);for(var h=Error.prototype.constructor.call(this,a),i=0;i0?(d.ids&&(d.ids=[d.name]),a.helpers.each(c,d)):e(this);if(d.data&&d.ids){var h=f(d.data);h.contextPath=b.appendContextPath(d.data.contextPath,d.name),d={data:h}}return g(c,d)}),a.registerHelper("each",function(a,c){function d(c,d,f){k&&(k.key=c,k.index=d,k.first=0===d,k.last=!!f,n&&(k.contextPath=n+c)),j+=e(a[c],{data:k,blockParams:b.blockParams([a[c],c],[n+c,null])})}if(!c)throw new h("Must pass iterator to #each");var e=c.fn,g=c.inverse,i=0,j="",k=void 0,n=void 0;if(c.data&&c.ids&&(n=b.appendContextPath(c.data.contextPath,c.ids[0])+"."),m(a)&&(a=a.call(this)),c.data&&(k=f(c.data)),a&&"object"==typeof a)if(l(a))for(var o=a.length;o>i;i++)d(i,i,i===a.length-1);else{var p=void 0;for(var q in a)a.hasOwnProperty(q)&&(p&&d(p,i-1),p=q,i++);p&&d(p,i-1,!0)}return 0===i&&(j=g(this)),j}),a.registerHelper("if",function(a,c){return m(a)&&(a=a.call(this)),!c.hash.includeZero&&!a||b.isEmpty(a)?c.inverse(this):c.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,c){m(a)&&(a=a.call(this));var d=c.fn;if(b.isEmpty(a))return c.inverse(this);if(c.data&&c.ids){var e=f(c.data);e.contextPath=b.appendContextPath(c.data.contextPath,c.ids[0]),c={data:e}}return d(a,c)}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)}),a.registerHelper("lookup",function(a,b){return a&&a[b]})}function f(a){var c=b.extend({},a);return c._parent=a,c}var g=function(a){return a&&a.__esModule?a["default"]:a};a.__esModule=!0,a.HandlebarsEnvironment=d,a.createFrame=f;var h=g(c),i="3.0.1";a.VERSION=i;var j=6;a.COMPILER_REVISION=j;var k={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1"};a.REVISION_CHANGES=k;var l=b.isArray,m=b.isFunction,n=b.toString,o="[object Object]";d.prototype={constructor:d,logger:p,log:q,registerHelper:function(a,c){if(n.call(a)===o){if(c)throw new h("Arg not supported with multiple helpers");b.extend(this.helpers,a)}else this.helpers[a]=c},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,c){if(n.call(a)===o)b.extend(this.partials,a);else{if("undefined"==typeof c)throw new h("Attempting to register a partial as undefined");this.partials[a]=c}},unregisterPartial:function(a){delete this.partials[a]}};var p={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:1,log:function(a,b){if("undefined"!=typeof console&&p.level<=a){var c=p.methodMap[a];(console[c]||console.log).call(console,b)}}};a.logger=p;var q=p.log;a.log=q}),define("handlebars/safe-string",["exports","module"],function(a,b){function c(a){this.string=a}c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b.exports=c}),define("handlebars/runtime",["exports","./utils","./exception","./base"],function(a,b,c,d){function e(a){var b=a&&a[0]||1,c=d.COMPILER_REVISION;if(b!==c){if(c>b){var e=d.REVISION_CHANGES[c],f=d.REVISION_CHANGES[b];throw new m("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+e+") or downgrade your runtime to an older version ("+f+").")}throw new m("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function f(a,c){function d(d,e,f){f.hash&&(e=b.extend({},e,f.hash)),d=c.VM.resolvePartial.call(this,d,e,f);var g=c.VM.invokePartial.call(this,d,e,f);if(null==g&&c.compile&&(f.partials[f.name]=c.compile(d,a.compilerOptions,c),g=f.partials[f.name](e,f)),null!=g){if(f.indent){for(var h=g.split("\n"),i=0,j=h.length;j>i&&(h[i]||i+1!==j);i++)h[i]=f.indent+h[i];g=h.join("\n")}return g}throw new m("The partial "+f.name+" could not be compiled when running in runtime-only mode")}function e(b){var c=void 0===arguments[1]?{}:arguments[1],d=c.data;e._setup(c),!c.partial&&a.useData&&(d=k(b,d));var g=void 0,h=a.useBlockParams?[]:void 0;return a.useDepths&&(g=c.depths?[b].concat(c.depths):[b]),a.main.call(f,b,f.helpers,f.partials,d,h,g)}if(!c)throw new m("No environment passed to template");if(!a||!a.main)throw new m("Unknown template object: "+typeof a);c.VM.checkRevision(a.compiler);var f={strict:function(a,b){if(!(b in a))throw new m('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;c>d;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:b.escapeExpression,invokePartial:d,fn:function(b){return a[b]},programs:[],program:function(a,b,c,d,e){var f=this.programs[a],h=this.fn(a);return b||e||d||c?f=g(this,a,h,b,c,d,e):f||(f=this.programs[a]=g(this,a,h)),f},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,c){var d=a||c;return a&&c&&a!==c&&(d=b.extend({},c,a)),d},noop:c.VM.noop,compilerInfo:a.compiler};return e.isTop=!0,e._setup=function(b){b.partial?(f.helpers=b.helpers,f.partials=b.partials):(f.helpers=f.merge(b.helpers,c.helpers),a.usePartial&&(f.partials=f.merge(b.partials,c.partials)))},e._child=function(b,c,d,e){if(a.useBlockParams&&!d)throw new m("must pass block params");if(a.useDepths&&!e)throw new m("must pass parent depths");return g(f,b,a[b],c,0,d,e)},e}function g(a,b,c,d,e,f,g){function h(b){var e=void 0===arguments[1]?{}:arguments[1];return c.call(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),g&&[b].concat(g))}return h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function h(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a=c.partials[c.name],a}function i(a,b,c){if(c.partial=!0,void 0===a)throw new m("The partial "+c.name+" could not be found");return a instanceof Function?a(b,c):void 0}function j(){return""}function k(a,b){return b&&"root"in b||(b=b?d.createFrame(b):{},b.root=a),b}var l=function(a){return a&&a.__esModule?a["default"]:a};a.__esModule=!0,a.checkRevision=e,a.template=f,a.wrapProgram=g,a.resolvePartial=h,a.invokePartial=i,a.noop=j;var m=l(c)}),define("handlebars/no-conflict",["exports","module"],function(a,b){b.exports=function(a){var b="undefined"!=typeof global?global:window,c=b.Handlebars;a.noConflict=function(){b.Handlebars===a&&(b.Handlebars=c)}}}),define("handlebars.runtime",["exports","module","./handlebars/base","./handlebars/safe-string","./handlebars/exception","./handlebars/utils","./handlebars/runtime","./handlebars/no-conflict"],function(a,b,c,d,e,f,g,h){function i(){var a=new c.HandlebarsEnvironment;return f.extend(a,c),a.SafeString=k,a.Exception=l,a.Utils=f,a.escapeExpression=f.escapeExpression,a.VM=g,a.template=function(b){return g.template(b,a)},a}var j=function(a){return a&&a.__esModule?a["default"]:a},k=j(d),l=j(e),m=j(h),n=i();n.create=i,m(n),n["default"]=n,b.exports=n}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.js deleted file mode 100644 index 2263826..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.js +++ /dev/null @@ -1,881 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define(factory); - else if(typeof exports === 'object') - exports["Handlebars"] = factory(); - else - root["Handlebars"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; - -/******/ // The require function -/******/ function __webpack_require__(moduleId) { - -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; - -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; - -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - -/******/ // Flag the module as loaded -/******/ module.loaded = true; - -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } - - -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; - -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; - -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; - -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(7)['default']; - - exports.__esModule = true; - - var _import = __webpack_require__(1); - - var base = _interopRequireWildcard(_import); - - // Each of these augment the Handlebars object. No need to setup here. - // (This is done to easily share code between commonjs and browse envs) - - var _SafeString = __webpack_require__(2); - - var _SafeString2 = _interopRequireWildcard(_SafeString); - - var _Exception = __webpack_require__(3); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _import2 = __webpack_require__(4); - - var Utils = _interopRequireWildcard(_import2); - - var _import3 = __webpack_require__(5); - - var runtime = _interopRequireWildcard(_import3); - - var _noConflict = __webpack_require__(6); - - var _noConflict2 = _interopRequireWildcard(_noConflict); - - // For compatibility and usage outside of module systems, make the Handlebars object a namespace - function create() { - var hb = new base.HandlebarsEnvironment(); - - Utils.extend(hb, base); - hb.SafeString = _SafeString2['default']; - hb.Exception = _Exception2['default']; - hb.Utils = Utils; - hb.escapeExpression = Utils.escapeExpression; - - hb.VM = runtime; - hb.template = function (spec) { - return runtime.template(spec, hb); - }; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict2['default'](inst); - - inst['default'] = inst; - - exports['default'] = inst; - module.exports = exports['default']; - -/***/ }, -/* 1 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(7)['default']; - - exports.__esModule = true; - exports.HandlebarsEnvironment = HandlebarsEnvironment; - exports.createFrame = createFrame; - - var _import = __webpack_require__(4); - - var Utils = _interopRequireWildcard(_import); - - var _Exception = __webpack_require__(3); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var VERSION = '3.0.1'; - exports.VERSION = VERSION; - var COMPILER_REVISION = 6; - - exports.COMPILER_REVISION = COMPILER_REVISION; - var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' - }; - - exports.REVISION_CHANGES = REVISION_CHANGES; - var isArray = Utils.isArray, - isFunction = Utils.isFunction, - toString = Utils.toString, - objectType = '[object Object]'; - - function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); - } - - HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function registerHelper(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { - throw new _Exception2['default']('Arg not supported with multiple helpers'); - } - Utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (toString.call(name) === objectType) { - Utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _Exception2['default']('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - } - }; - - function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function () { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _Exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _Exception2['default']('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: Utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (var j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function (conditional, options) { - if (isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || Utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - - instance.registerHelper('with', function (context, options) { - if (isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!Utils.isEmpty(context)) { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = { data: data }; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function (message, options) { - var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); - } - - var logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function log(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - var method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } - }; - - exports.logger = logger; - var log = logger.log; - - exports.log = log; - - function createFrame(object) { - var frame = Utils.extend({}, object); - frame._parent = object; - return frame; - } - - /* [args, ]options */ - -/***/ }, -/* 2 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - // Build out our basic SafeString type - function SafeString(string) { - this.string = string; - } - - SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; - }; - - exports['default'] = SafeString; - module.exports = exports['default']; - -/***/ }, -/* 3 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - - function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } - } - - Exception.prototype = new Error(); - - exports['default'] = Exception; - module.exports = exports['default']; - -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - exports.extend = extend; - - // Older IE versions do not directly support indexOf so we must implement our own, sadly. - exports.indexOf = indexOf; - exports.escapeExpression = escapeExpression; - exports.isEmpty = isEmpty; - exports.blockParams = blockParams; - exports.appendContextPath = appendContextPath; - var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '`': '`' - }; - - var badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - - function escapeChar(chr) { - return escape[chr]; - } - - function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; - } - - var toString = Object.prototype.toString; - - exports.toString = toString; - // Sourced from lodash - // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt - /*eslint-disable func-style, no-var */ - var isFunction = function isFunction(value) { - return typeof value === 'function'; - }; - // fallback for older versions of Chrome and Safari - /* istanbul ignore next */ - if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; - } - var isFunction; - exports.isFunction = isFunction; - /*eslint-enable func-style, no-var */ - - /* istanbul ignore next */ - var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; - };exports.isArray = isArray; - - function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; - } - - function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); - } - - function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } - } - - function blockParams(params, ids) { - params.path = ids; - return params; - } - - function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; - } - -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(7)['default']; - - exports.__esModule = true; - exports.checkRevision = checkRevision; - - // TODO: Remove this line and break up compilePartial - - exports.template = template; - exports.wrapProgram = wrapProgram; - exports.resolvePartial = resolvePartial; - exports.invokePartial = invokePartial; - exports.noop = noop; - - var _import = __webpack_require__(4); - - var Utils = _interopRequireWildcard(_import); - - var _Exception = __webpack_require__(3); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _COMPILER_REVISION$REVISION_CHANGES$createFrame = __webpack_require__(1); - - function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _COMPILER_REVISION$REVISION_CHANGES$createFrame.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[currentRevision], - compilerVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[compilerRevision]; - throw new _Exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _Exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } - } - - function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _Exception2['default']('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _Exception2['default']('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = Utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _Exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _Exception2['default']('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: Utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - return templateSpec[i]; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = Utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _Exception2['default']('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _Exception2['default']('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; - } - - function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; - } - - function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; - } - - function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new _Exception2['default']('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } - } - - function noop() { - return ''; - } - - function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _COMPILER_REVISION$REVISION_CHANGES$createFrame.createFrame(data) : {}; - data.root = context; - } - return data; - } - -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { - - /* WEBPACK VAR INJECTION */(function(global) {'use strict'; - - exports.__esModule = true; - /*global window */ - - exports['default'] = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; - }; - - module.exports = exports['default']; - /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) - -/***/ }, -/* 7 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - exports["default"] = function (obj) { - return obj && obj.__esModule ? obj : { - "default": obj - }; - }; - - exports.__esModule = true; - -/***/ } -/******/ ]) -}); -; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.min.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.min.js deleted file mode 100644 index 9571216..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.min.js +++ /dev/null @@ -1,27 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=new g.HandlebarsEnvironment;return m.extend(a,g),a.SafeString=i["default"],a.Exception=k["default"],a.Utils=m,a.escapeExpression=m.escapeExpression,a.VM=o,a.template=function(b){return o.template(b,a)},a}var e=c(7)["default"];b.__esModule=!0;var f=c(1),g=e(f),h=c(2),i=e(h),j=c(3),k=e(j),l=c(4),m=e(l),n=c(5),o=e(n),p=c(6),q=e(p),r=d();r.create=d,q["default"](r),r["default"]=r,b["default"]=r,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){this.helpers=a||{},this.partials=b||{},e(this)}function e(a){a.registerHelper("helperMissing",function(){if(1===arguments.length)return void 0;throw new k["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')}),a.registerHelper("blockHelperMissing",function(b,c){var d=c.inverse,e=c.fn;if(b===!0)return e(this);if(b===!1||null==b)return d(this);if(o(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):d(this);if(c.data&&c.ids){var g=f(c.data);g.contextPath=i.appendContextPath(c.data.contextPath,c.name),c={data:g}}return e(b,c)}),a.registerHelper("each",function(a,b){function c(b,c,e){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!e,l&&(j.contextPath=l+b)),h+=d(a[b],{data:j,blockParams:i.blockParams([a[b],b],[l+b,null])})}if(!b)throw new k["default"]("Must pass iterator to #each");var d=b.fn,e=b.inverse,g=0,h="",j=void 0,l=void 0;if(b.data&&b.ids&&(l=i.appendContextPath(b.data.contextPath,b.ids[0])+"."),p(a)&&(a=a.call(this)),b.data&&(j=f(b.data)),a&&"object"==typeof a)if(o(a))for(var m=a.length;m>g;g++)c(g,g,g===a.length-1);else{var n=void 0;for(var q in a)a.hasOwnProperty(q)&&(n&&c(n,g-1),n=q,g++);n&&c(n,g-1,!0)}return 0===g&&(h=e(this)),h}),a.registerHelper("if",function(a,b){return p(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||i.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,b){p(a)&&(a=a.call(this));var c=b.fn;if(i.isEmpty(a))return b.inverse(this);if(b.data&&b.ids){var d=f(b.data);d.contextPath=i.appendContextPath(b.data.contextPath,b.ids[0]),b={data:d}}return c(a,b)}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)}),a.registerHelper("lookup",function(a,b){return a&&a[b]})}function f(a){var b=i.extend({},a);return b._parent=a,b}var g=c(7)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d,b.createFrame=f;var h=c(4),i=g(h),j=c(3),k=g(j),l="3.0.1";b.VERSION=l;var m=6;b.COMPILER_REVISION=m;var n={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1"};b.REVISION_CHANGES=n;var o=i.isArray,p=i.isFunction,q=i.toString,r="[object Object]";d.prototype={constructor:d,logger:s,log:t,registerHelper:function(a,b){if(q.call(a)===r){if(b)throw new k["default"]("Arg not supported with multiple helpers");i.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(q.call(a)===r)i.extend(this.partials,a);else{if("undefined"==typeof b)throw new k["default"]("Attempting to register a partial as undefined");this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]}};var s={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:1,log:function(a,b){if("undefined"!=typeof console&&s.level<=a){var c=s.methodMap[a];(console[c]||console.log).call(console,b)}}};b.logger=s;var t=s.log;b.log=t},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b){"use strict";function c(a,b){var e=b&&b.loc,f=void 0,g=void 0;e&&(f=e.start.line,g=e.start.column,a+=" - "+f+":"+g);for(var h=Error.prototype.constructor.call(this,a),i=0;ic;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return l.test(a)?a.replace(k,c):a}function g(a){return a||0===a?o(a)&&0===a.length?!0:!1:!0}function h(a,b){return a.path=b,a}function i(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.blockParams=h,b.appendContextPath=i;var j={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},k=/[&<>"'`]/g,l=/[&<>"'`]/,m=Object.prototype.toString;b.toString=m;var n=function(a){return"function"==typeof a};n(/x/)&&(b.isFunction=n=function(a){return"function"==typeof a&&"[object Function]"===m.call(a)});var n;b.isFunction=n;var o=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===m.call(a):!1};b.isArray=o},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=p.COMPILER_REVISION;if(b!==c){if(c>b){var d=p.REVISION_CHANGES[c],e=p.REVISION_CHANGES[b];throw new o["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new o["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=m.extend({},d,e.hash)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;i>h&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new o["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){var c=void 0===arguments[1]?{}:arguments[1],f=c.data;d._setup(c),!c.partial&&a.useData&&(f=j(b,f));var g=void 0,h=a.useBlockParams?[]:void 0;return a.useDepths&&(g=c.depths?[b].concat(c.depths):[b]),a.main.call(e,b,e.helpers,e.partials,f,h,g)}if(!b)throw new o["default"]("No environment passed to template");if(!a||!a.main)throw new o["default"]("Unknown template object: "+typeof a);b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new o["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;c>d;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:m.escapeExpression,invokePartial:c,fn:function(b){return a[b]},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=m.extend({},b,a)),c},noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new o["default"]("must pass block params");if(a.useDepths&&!g)throw new o["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=void 0===arguments[1]?{}:arguments[1];return c.call(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),g&&[b].concat(g))}return h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a=c.partials[c.name],a}function h(a,b,c){if(c.partial=!0,void 0===a)throw new o["default"]("The partial "+c.name+" could not be found");return a instanceof Function?a(b,c):void 0}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?p.createFrame(b):{},b.root=a),b}var k=c(7)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var l=c(4),m=k(l),n=c(3),o=k(n),p=c(1)},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){b.Handlebars===a&&(b.Handlebars=d)}},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0}])}); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/docs/compiler-api.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/docs/compiler-api.md deleted file mode 100644 index c09414f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/docs/compiler-api.md +++ /dev/null @@ -1,276 +0,0 @@ -# Handlebars Compiler APIs - -There are a number of formal APIs that tool implementors may interact with. - -## AST - -Other tools may interact with the formal AST as defined below. Any JSON structure matching this pattern may be used and passed into the `compile` and `precompile` methods in the same way as the text for a template. - -AST structures may be generated either with the `Handlebars.parse` method and then manipulated, via the `Handlebars.AST` objects of the same name, or constructed manually as a generic JavaScript object matching the structure defined below. - -```javascript -var ast = Handlebars.parse(myTemplate); - -// Modify ast - -Handlebars.precompile(ast); -``` - - -### Basic - -```java -interface Node { - type: string; - loc: SourceLocation | null; -} - -interface SourceLocation { - source: string | null; - start: Position; - end: Position; -} - -interface Position { - line: uint >= 1; - column: uint >= 0; -} -``` - -### Programs - -```java -interface Program <: Node { - type: "Program"; - body: [ Statement ]; - - blockParams: [ string ]; -} -``` - -### Statements - -```java -interface Statement <: Node { } - -interface MustacheStatement <: Statement { - type: "MustacheStatement"; - - path: PathExpression | Literal; - params: [ Expression ]; - hash: Hash; - - escaped: boolean; - strip: StripFlags | null; -} - -interface BlockStatement <: Statement { - type: "BlockStatement"; - path: PathExpression; - params: [ Expression ]; - hash: Hash; - - program: Program | null; - inverse: Program | null; - - openStrip: StripFlags | null; - inverseStrip: StripFlags | null; - closeStrip: StripFlags | null; -} - -interface PartialStatement <: Statement { - type: "PartialStatement"; - name: PathExpression | SubExpression; - params: [ Expression ]; - hash: Hash; - - indent: string; - strip: StripFlags | null; -} -``` - -`name` will be a `SubExpression` when tied to a dynamic partial, i.e. `{{> (foo) }}`, otherwise this is a path or literal whose `original` value is used to lookup the desired partial. - - -```java -interface ContentStatement <: Statement { - type: "ContentStatement"; - value: string; - original: string; -} - -interface CommentStatement <: Statement { - type: "CommentStatement"; - value: string; - - strip: StripFlags | null; -} -``` - -### Expressions - -```java -interface Expression <: Node { } -``` - -##### SubExpressions - -```java -interface SubExpression <: Expression { - type: "SubExpression"; - path: PathExpression; - params: [ Expression ]; - hash: Hash; -} -``` - -##### Paths - -```java -interface PathExpression <: Expression { - type: "PathExpression"; - data: boolean; - depth: uint >= 0; - parts: [ string ]; - original: string; -} -``` - -- `data` is true when the given expression is a `@data` reference. -- `depth` is an integer representation of which context the expression references. `0` represents the current context, `1` would be `../`, etc. -- `parts` is an array of the names in the path. `foo.bar` would be `['foo', 'bar']`. Scope references, `.`, `..`, and `this` should be omitted from this array. -- `original` is the path as entered by the user. Separator and scope references are left untouched. - - -##### Literals - -```java -interface Literal <: Expression { } - -interface StringLiteral <: Literal { - type: "StringLiteral"; - value: string; - original: string; -} - -interface BooleanLiteral <: Literal { - type: "BooleanLiteral"; - value: boolean; - original: boolean; -} - -interface NumberLiteral <: Literal { - type: "NumberLiteral"; - value: number; - original: number; -} - -interface UndefinedLiteral <: Literal { - type: "UndefinedLiteral"; -} - -interface NullLiteral <: Literal { - type: "NullLiteral"; -} -``` - - -### Miscellaneous - -```java -interface Hash <: Node { - type: "Hash"; - pairs: [ HashPair ]; -} - -interface HashPair <: Node { - type: "HashPair"; - key: string; - value: Expression; -} - -interface StripFlags { - open: boolean; - close: boolean; -} -``` - -`StripFlags` are used to signify whitespace control character that may have been entered on a given statement. - -## AST Visitor - -`Handlebars.Visitor` is available as a base class for general interaction with AST structures. This will by default traverse the entire tree and individual methods may be overridden to provide specific responses to particular nodes. - -Recording all referenced partial names: - -```javascript -var Visitor = Handlebars.Visitor; - -function ImportScanner() { - this.partials = []; -} -ImportScanner.prototype = new Visitor(); - -ImportScanner.prototype.PartialStatement = function(partial) { - this.partials.push({request: partial.name.original}); - - Visitor.prototype.PartialStatement.call(this, partial); -}; - -var scanner = new ImportScanner(); -scanner.accept(ast); -``` - -The current node's ancestors will be maintained in the `parents` array, with the most recent parent listed first. - -The visitor may also be configured to operate in mutation mode by setting the `mutation` field to true. When in this mode, handler methods may return any valid AST node and it will replace the one they are currently operating on. Returning `false` will remove the given value (if valid) and returning `undefined` will leave the node in tact. This return structure only apply to mutation mode and non-mutation mode visitors are free to return whatever values they wish. - -Implementors that may need to support mutation mode are encouraged to utilize the `acceptKey`, `acceptRequired` and `acceptArray` helpers which provide the conditional overwrite behavior as well as implement sanity checks where pertinent. - -## JavaScript Compiler - -The `Handlebars.JavaScriptCompiler` object has a number of methods that may be customized to alter the output of the compiler: - -- `nameLookup(parent, name, type)` - Used to generate the code to resolve a give path component. - - - `parent` is the existing code in the path resolution - - `name` is the current path component - - `type` is the type of name being evaluated. May be one of `context`, `data`, `helper`, or `partial`. - - Note that this does not impact dynamic partials, which implementors need to be aware of. Overriding `VM.resolvePartial` may be required to support dynamic cases. - -- `depthedLookup(name)` - Used to generate code that resolves parameters within any context in the stack. Is only used in `compat` mode. - -- `compilerInfo()` - Allows for custom compiler flags used in the runtime version checking logic. - -- `appendToBuffer(source, location, explicit)` - Allows for code buffer emitting code. Defaults behavior is string concatenation. - - - `source` is the source code whose result is to be appending - - `location` is the location of the source in the source map. - - `explicit` is a flag signaling that the emit operation must occur, vs. the lazy evaled options otherwise. - -- `initializeBuffer()` - Allows for buffers other than the default string buffer to be used. Generally needs to be paired with a custom `appendToBuffer` implementation. - -```javascript -function MyCompiler() { - Handlebars.JavaScriptCompiler.apply(this, arguments); -} -MyCompiler.prototype = Object.create(Handlebars.JavaScriptCompiler); - -MyCompiler.nameLookup = function(parent, name, type) { - if (type === 'partial') { - return 'MyPartialList[' + JSON.stringify(name) ']'; - } else { - return Handlebars.JavaScriptCompiler.prototype.nameLookup.call(this, parent, name, type); - } -}; - -var env = Handlebars.create(); -env.JavaScriptCompiler = MyCompiler; -env.compile('my template'); -``` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.js deleted file mode 100644 index f114959..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.js +++ /dev/null @@ -1,41 +0,0 @@ -import runtime from './handlebars.runtime'; - -// Compiler imports -import AST from './handlebars/compiler/ast'; -import { parser as Parser, parse } from './handlebars/compiler/base'; -import { Compiler, compile, precompile } from './handlebars/compiler/compiler'; -import JavaScriptCompiler from './handlebars/compiler/javascript-compiler'; -import Visitor from './handlebars/compiler/visitor'; - -import noConflict from './handlebars/no-conflict'; - -let _create = runtime.create; -function create() { - let hb = _create(); - - hb.compile = function(input, options) { - return compile(input, options, hb); - }; - hb.precompile = function(input, options) { - return precompile(input, options, hb); - }; - - hb.AST = AST; - hb.Compiler = Compiler; - hb.JavaScriptCompiler = JavaScriptCompiler; - hb.Parser = Parser; - hb.parse = parse; - - return hb; -} - -let inst = create(); -inst.create = create; - -noConflict(inst); - -inst.Visitor = Visitor; - -inst['default'] = inst; - -export default inst; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.runtime.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.runtime.js deleted file mode 100644 index 3d05b54..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.runtime.js +++ /dev/null @@ -1,37 +0,0 @@ -import * as base from './handlebars/base'; - -// Each of these augment the Handlebars object. No need to setup here. -// (This is done to easily share code between commonjs and browse envs) -import SafeString from './handlebars/safe-string'; -import Exception from './handlebars/exception'; -import * as Utils from './handlebars/utils'; -import * as runtime from './handlebars/runtime'; - -import noConflict from './handlebars/no-conflict'; - -// For compatibility and usage outside of module systems, make the Handlebars object a namespace -function create() { - let hb = new base.HandlebarsEnvironment(); - - Utils.extend(hb, base); - hb.SafeString = SafeString; - hb.Exception = Exception; - hb.Utils = Utils; - hb.escapeExpression = Utils.escapeExpression; - - hb.VM = runtime; - hb.template = function(spec) { - return runtime.template(spec, hb); - }; - - return hb; -} - -let inst = create(); -inst.create = create; - -noConflict(inst); - -inst['default'] = inst; - -export default inst; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/base.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/base.js deleted file mode 100644 index cfe1e91..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/base.js +++ /dev/null @@ -1,244 +0,0 @@ -import * as Utils from './utils'; -import Exception from './exception'; - -export const VERSION = '3.0.1'; -export const COMPILER_REVISION = 6; - -export const REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' -}; - -const isArray = Utils.isArray, - isFunction = Utils.isFunction, - toString = Utils.toString, - objectType = '[object Object]'; - -export function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); -} - -HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { throw new Exception('Arg not supported with multiple helpers'); } - Utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function(name) { - delete this.helpers[name]; - }, - - registerPartial: function(name, partial) { - if (toString.call(name) === objectType) { - Utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new Exception('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function(name) { - delete this.partials[name]; - } -}; - -function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function(/* [args, ]options */) { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new Exception('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function(context, options) { - let inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - let data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name); - options = {data: data}; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function(context, options) { - if (!options) { - throw new Exception('Must pass iterator to #each'); - } - - let fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data, - contextPath; - - if (options.data && options.ids) { - contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { context = context.call(this); } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: Utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (let j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - let priorKey; - - for (let key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function(conditional, options) { - if (isFunction(conditional)) { conditional = conditional.call(this); } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if ((!options.hash.includeZero && !conditional) || Utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function(conditional, options) { - return instance.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn, hash: options.hash}); - }); - - instance.registerHelper('with', function(context, options) { - if (isFunction(context)) { context = context.call(this); } - - let fn = options.fn; - - if (!Utils.isEmpty(context)) { - if (options.data && options.ids) { - let data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = {data: data}; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function(message, options) { - let level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function(obj, field) { - return obj && obj[field]; - }); -} - -export let logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - let method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } -}; - -export let log = logger.log; - -export function createFrame(object) { - let frame = Utils.extend({}, object); - frame._parent = object; - return frame; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/ast.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/ast.js deleted file mode 100644 index 08b127f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/ast.js +++ /dev/null @@ -1,152 +0,0 @@ -let AST = { - Program: function(statements, blockParams, strip, locInfo) { - this.loc = locInfo; - this.type = 'Program'; - this.body = statements; - - this.blockParams = blockParams; - this.strip = strip; - }, - - MustacheStatement: function(path, params, hash, escaped, strip, locInfo) { - this.loc = locInfo; - this.type = 'MustacheStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.escaped = escaped; - - this.strip = strip; - }, - - BlockStatement: function(path, params, hash, program, inverse, openStrip, inverseStrip, closeStrip, locInfo) { - this.loc = locInfo; - this.type = 'BlockStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.program = program; - this.inverse = inverse; - - this.openStrip = openStrip; - this.inverseStrip = inverseStrip; - this.closeStrip = closeStrip; - }, - - PartialStatement: function(name, params, hash, strip, locInfo) { - this.loc = locInfo; - this.type = 'PartialStatement'; - - this.name = name; - this.params = params || []; - this.hash = hash; - - this.indent = ''; - this.strip = strip; - }, - - ContentStatement: function(string, locInfo) { - this.loc = locInfo; - this.type = 'ContentStatement'; - this.original = this.value = string; - }, - - CommentStatement: function(comment, strip, locInfo) { - this.loc = locInfo; - this.type = 'CommentStatement'; - this.value = comment; - - this.strip = strip; - }, - - SubExpression: function(path, params, hash, locInfo) { - this.loc = locInfo; - - this.type = 'SubExpression'; - this.path = path; - this.params = params || []; - this.hash = hash; - }, - - PathExpression: function(data, depth, parts, original, locInfo) { - this.loc = locInfo; - this.type = 'PathExpression'; - - this.data = data; - this.original = original; - this.parts = parts; - this.depth = depth; - }, - - StringLiteral: function(string, locInfo) { - this.loc = locInfo; - this.type = 'StringLiteral'; - this.original = - this.value = string; - }, - - NumberLiteral: function(number, locInfo) { - this.loc = locInfo; - this.type = 'NumberLiteral'; - this.original = - this.value = Number(number); - }, - - BooleanLiteral: function(bool, locInfo) { - this.loc = locInfo; - this.type = 'BooleanLiteral'; - this.original = - this.value = bool === 'true'; - }, - - UndefinedLiteral: function(locInfo) { - this.loc = locInfo; - this.type = 'UndefinedLiteral'; - this.original = this.value = undefined; - }, - - NullLiteral: function(locInfo) { - this.loc = locInfo; - this.type = 'NullLiteral'; - this.original = this.value = null; - }, - - Hash: function(pairs, locInfo) { - this.loc = locInfo; - this.type = 'Hash'; - this.pairs = pairs; - }, - HashPair: function(key, value, locInfo) { - this.loc = locInfo; - this.type = 'HashPair'; - this.key = key; - this.value = value; - }, - - // Public API used to evaluate derived attributes regarding AST nodes - helpers: { - // a mustache is definitely a helper if: - // * it is an eligible helper, and - // * it has at least one parameter or hash segment - helperExpression: function(node) { - return !!(node.type === 'SubExpression' || node.params.length || node.hash); - }, - - scopedId: function(path) { - return (/^\.|this\b/).test(path.original); - }, - - // an ID is simple if it only has one part, and that part is not - // `..` or `this`. - simpleId: function(path) { - return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; - } - } -}; - - -// Must be exported as an object rather than the root of the module as the jison lexer -// must modify the object to operate properly. -export default AST; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/base.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/base.js deleted file mode 100644 index 7075d9b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/base.js +++ /dev/null @@ -1,25 +0,0 @@ -import parser from './parser'; -import AST from './ast'; -import WhitespaceControl from './whitespace-control'; -import * as Helpers from './helpers'; -import { extend } from '../utils'; - -export { parser }; - -let yy = {}; -extend(yy, Helpers, AST); - -export function parse(input, options) { - // Just return if an already-compiled AST was passed in. - if (input.type === 'Program') { return input; } - - parser.yy = yy; - - // Altering the shared object here, but this is ok as parser is a sync operation - yy.locInfo = function(locInfo) { - return new yy.SourceLocation(options && options.srcName, locInfo); - }; - - let strip = new WhitespaceControl(); - return strip.accept(parser.parse(input)); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/code-gen.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/code-gen.js deleted file mode 100644 index bc7bc07..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/code-gen.js +++ /dev/null @@ -1,164 +0,0 @@ -/*global define */ -import {isArray} from '../utils'; - -let SourceNode; - -try { - /* istanbul ignore next */ - if (typeof define !== 'function' || !define.amd) { - // We don't support this in AMD environments. For these environments, we asusme that - // they are running on the browser and thus have no need for the source-map library. - let SourceMap = require('source-map'); - SourceNode = SourceMap.SourceNode; - } -} catch (err) { - /* NOP */ -} - -/* istanbul ignore if: tested but not covered in istanbul due to dist build */ -if (!SourceNode) { - SourceNode = function(line, column, srcFile, chunks) { - this.src = ''; - if (chunks) { - this.add(chunks); - } - }; - /* istanbul ignore next */ - SourceNode.prototype = { - add: function(chunks) { - if (isArray(chunks)) { - chunks = chunks.join(''); - } - this.src += chunks; - }, - prepend: function(chunks) { - if (isArray(chunks)) { - chunks = chunks.join(''); - } - this.src = chunks + this.src; - }, - toStringWithSourceMap: function() { - return {code: this.toString()}; - }, - toString: function() { - return this.src; - } - }; -} - - -function castChunk(chunk, codeGen, loc) { - if (isArray(chunk)) { - let ret = []; - - for (let i = 0, len = chunk.length; i < len; i++) { - ret.push(codeGen.wrap(chunk[i], loc)); - } - return ret; - } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { - // Handle primitives that the SourceNode will throw up on - return chunk + ''; - } - return chunk; -} - - -function CodeGen(srcFile) { - this.srcFile = srcFile; - this.source = []; -} - -CodeGen.prototype = { - prepend: function(source, loc) { - this.source.unshift(this.wrap(source, loc)); - }, - push: function(source, loc) { - this.source.push(this.wrap(source, loc)); - }, - - merge: function() { - let source = this.empty(); - this.each(function(line) { - source.add([' ', line, '\n']); - }); - return source; - }, - - each: function(iter) { - for (let i = 0, len = this.source.length; i < len; i++) { - iter(this.source[i]); - } - }, - - empty: function(loc = this.currentLocation || {start: {}}) { - return new SourceNode(loc.start.line, loc.start.column, this.srcFile); - }, - wrap: function(chunk, loc = this.currentLocation || {start: {}}) { - if (chunk instanceof SourceNode) { - return chunk; - } - - chunk = castChunk(chunk, this, loc); - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); - }, - - functionCall: function(fn, type, params) { - params = this.generateList(params); - return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); - }, - - quotedString: function(str) { - return '"' + (str + '') - .replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') - .replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 - .replace(/\u2029/g, '\\u2029') + '"'; - }, - - objectLiteral: function(obj) { - let pairs = []; - - for (let key in obj) { - if (obj.hasOwnProperty(key)) { - let value = castChunk(obj[key], this); - if (value !== 'undefined') { - pairs.push([this.quotedString(key), ':', value]); - } - } - } - - let ret = this.generateList(pairs); - ret.prepend('{'); - ret.add('}'); - return ret; - }, - - - generateList: function(entries, loc) { - let ret = this.empty(loc); - - for (let i = 0, len = entries.length; i < len; i++) { - if (i) { - ret.add(','); - } - - ret.add(castChunk(entries[i], this, loc)); - } - - return ret; - }, - - generateArray: function(entries, loc) { - let ret = this.generateList(entries, loc); - ret.prepend('['); - ret.add(']'); - - return ret; - } -}; - -export default CodeGen; - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/compiler.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/compiler.js deleted file mode 100644 index 4575421..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/compiler.js +++ /dev/null @@ -1,513 +0,0 @@ -import Exception from '../exception'; -import {isArray, indexOf} from '../utils'; -import AST from './ast'; - -const slice = [].slice; - -export function Compiler() {} - -// the foundHelper register will disambiguate helper lookup from finding a -// function in a context. This is necessary for mustache compatibility, which -// requires that context functions in blocks are evaluated by blockHelperMissing, -// and then proceed as if the resulting value was provided to blockHelperMissing. - -Compiler.prototype = { - compiler: Compiler, - - equals: function(other) { - let len = this.opcodes.length; - if (other.opcodes.length !== len) { - return false; - } - - for (let i = 0; i < len; i++) { - let opcode = this.opcodes[i], - otherOpcode = other.opcodes[i]; - if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { - return false; - } - } - - // We know that length is the same between the two arrays because they are directly tied - // to the opcode behavior above. - len = this.children.length; - for (let i = 0; i < len; i++) { - if (!this.children[i].equals(other.children[i])) { - return false; - } - } - - return true; - }, - - guid: 0, - - compile: function(program, options) { - this.sourceNode = []; - this.opcodes = []; - this.children = []; - this.options = options; - this.stringParams = options.stringParams; - this.trackIds = options.trackIds; - - options.blockParams = options.blockParams || []; - - // These changes will propagate to the other compiler components - let knownHelpers = options.knownHelpers; - options.knownHelpers = { - 'helperMissing': true, - 'blockHelperMissing': true, - 'each': true, - 'if': true, - 'unless': true, - 'with': true, - 'log': true, - 'lookup': true - }; - if (knownHelpers) { - for (let name in knownHelpers) { - if (name in knownHelpers) { - options.knownHelpers[name] = knownHelpers[name]; - } - } - } - - return this.accept(program); - }, - - compileProgram: function(program) { - let childCompiler = new this.compiler(), // eslint-disable-line new-cap - result = childCompiler.compile(program, this.options), - guid = this.guid++; - - this.usePartial = this.usePartial || result.usePartial; - - this.children[guid] = result; - this.useDepths = this.useDepths || result.useDepths; - - return guid; - }, - - accept: function(node) { - this.sourceNode.unshift(node); - let ret = this[node.type](node); - this.sourceNode.shift(); - return ret; - }, - - Program: function(program) { - this.options.blockParams.unshift(program.blockParams); - - let body = program.body, - bodyLength = body.length; - for (let i = 0; i < bodyLength; i++) { - this.accept(body[i]); - } - - this.options.blockParams.shift(); - - this.isSimple = bodyLength === 1; - this.blockParams = program.blockParams ? program.blockParams.length : 0; - - return this; - }, - - BlockStatement: function(block) { - transformLiteralToPath(block); - - let program = block.program, - inverse = block.inverse; - - program = program && this.compileProgram(program); - inverse = inverse && this.compileProgram(inverse); - - let type = this.classifySexpr(block); - - if (type === 'helper') { - this.helperSexpr(block, program, inverse); - } else if (type === 'simple') { - this.simpleSexpr(block); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('blockValue', block.path.original); - } else { - this.ambiguousSexpr(block, program, inverse); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('ambiguousBlockValue'); - } - - this.opcode('append'); - }, - - PartialStatement: function(partial) { - this.usePartial = true; - - let params = partial.params; - if (params.length > 1) { - throw new Exception('Unsupported number of partial arguments: ' + params.length, partial); - } else if (!params.length) { - params.push({type: 'PathExpression', parts: [], depth: 0}); - } - - let partialName = partial.name.original, - isDynamic = partial.name.type === 'SubExpression'; - if (isDynamic) { - this.accept(partial.name); - } - - this.setupFullMustacheParams(partial, undefined, undefined, true); - - let indent = partial.indent || ''; - if (this.options.preventIndent && indent) { - this.opcode('appendContent', indent); - indent = ''; - } - - this.opcode('invokePartial', isDynamic, partialName, indent); - this.opcode('append'); - }, - - MustacheStatement: function(mustache) { - this.SubExpression(mustache); // eslint-disable-line new-cap - - if (mustache.escaped && !this.options.noEscape) { - this.opcode('appendEscaped'); - } else { - this.opcode('append'); - } - }, - - ContentStatement: function(content) { - if (content.value) { - this.opcode('appendContent', content.value); - } - }, - - CommentStatement: function() {}, - - SubExpression: function(sexpr) { - transformLiteralToPath(sexpr); - let type = this.classifySexpr(sexpr); - - if (type === 'simple') { - this.simpleSexpr(sexpr); - } else if (type === 'helper') { - this.helperSexpr(sexpr); - } else { - this.ambiguousSexpr(sexpr); - } - }, - ambiguousSexpr: function(sexpr, program, inverse) { - let path = sexpr.path, - name = path.parts[0], - isBlock = program != null || inverse != null; - - this.opcode('getContext', path.depth); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - this.accept(path); - - this.opcode('invokeAmbiguous', name, isBlock); - }, - - simpleSexpr: function(sexpr) { - this.accept(sexpr.path); - this.opcode('resolvePossibleLambda'); - }, - - helperSexpr: function(sexpr, program, inverse) { - let params = this.setupFullMustacheParams(sexpr, program, inverse), - path = sexpr.path, - name = path.parts[0]; - - if (this.options.knownHelpers[name]) { - this.opcode('invokeKnownHelper', params.length, name); - } else if (this.options.knownHelpersOnly) { - throw new Exception('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); - } else { - path.falsy = true; - - this.accept(path); - this.opcode('invokeHelper', params.length, path.original, AST.helpers.simpleId(path)); - } - }, - - PathExpression: function(path) { - this.addDepth(path.depth); - this.opcode('getContext', path.depth); - - let name = path.parts[0], - scoped = AST.helpers.scopedId(path), - blockParamId = !path.depth && !scoped && this.blockParamIndex(name); - - if (blockParamId) { - this.opcode('lookupBlockParam', blockParamId, path.parts); - } else if (!name) { - // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` - this.opcode('pushContext'); - } else if (path.data) { - this.options.data = true; - this.opcode('lookupData', path.depth, path.parts); - } else { - this.opcode('lookupOnContext', path.parts, path.falsy, scoped); - } - }, - - StringLiteral: function(string) { - this.opcode('pushString', string.value); - }, - - NumberLiteral: function(number) { - this.opcode('pushLiteral', number.value); - }, - - BooleanLiteral: function(bool) { - this.opcode('pushLiteral', bool.value); - }, - - UndefinedLiteral: function() { - this.opcode('pushLiteral', 'undefined'); - }, - - NullLiteral: function() { - this.opcode('pushLiteral', 'null'); - }, - - Hash: function(hash) { - let pairs = hash.pairs, - i = 0, - l = pairs.length; - - this.opcode('pushHash'); - - for (; i < l; i++) { - this.pushParam(pairs[i].value); - } - while (i--) { - this.opcode('assignToHash', pairs[i].key); - } - this.opcode('popHash'); - }, - - // HELPERS - opcode: function(name) { - this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); - }, - - addDepth: function(depth) { - if (!depth) { - return; - } - - this.useDepths = true; - }, - - classifySexpr: function(sexpr) { - let isSimple = AST.helpers.simpleId(sexpr.path); - - let isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); - - // a mustache is an eligible helper if: - // * its id is simple (a single part, not `this` or `..`) - let isHelper = !isBlockParam && AST.helpers.helperExpression(sexpr); - - // if a mustache is an eligible helper but not a definite - // helper, it is ambiguous, and will be resolved in a later - // pass or at runtime. - let isEligible = !isBlockParam && (isHelper || isSimple); - - // if ambiguous, we can possibly resolve the ambiguity now - // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. - if (isEligible && !isHelper) { - let name = sexpr.path.parts[0], - options = this.options; - - if (options.knownHelpers[name]) { - isHelper = true; - } else if (options.knownHelpersOnly) { - isEligible = false; - } - } - - if (isHelper) { - return 'helper'; - } else if (isEligible) { - return 'ambiguous'; - } else { - return 'simple'; - } - }, - - pushParams: function(params) { - for (let i = 0, l = params.length; i < l; i++) { - this.pushParam(params[i]); - } - }, - - pushParam: function(val) { - let value = val.value != null ? val.value : val.original || ''; - - if (this.stringParams) { - if (value.replace) { - value = value - .replace(/^(\.?\.\/)*/g, '') - .replace(/\//g, '.'); - } - - if (val.depth) { - this.addDepth(val.depth); - } - this.opcode('getContext', val.depth || 0); - this.opcode('pushStringParam', value, val.type); - - if (val.type === 'SubExpression') { - // SubExpressions get evaluated and passed in - // in string params mode. - this.accept(val); - } - } else { - if (this.trackIds) { - let blockParamIndex; - if (val.parts && !AST.helpers.scopedId(val) && !val.depth) { - blockParamIndex = this.blockParamIndex(val.parts[0]); - } - if (blockParamIndex) { - let blockParamChild = val.parts.slice(1).join('.'); - this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); - } else { - value = val.original || value; - if (value.replace) { - value = value - .replace(/^\.\//g, '') - .replace(/^\.$/g, ''); - } - - this.opcode('pushId', val.type, value); - } - } - this.accept(val); - } - }, - - setupFullMustacheParams: function(sexpr, program, inverse, omitEmpty) { - let params = sexpr.params; - this.pushParams(params); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - if (sexpr.hash) { - this.accept(sexpr.hash); - } else { - this.opcode('emptyHash', omitEmpty); - } - - return params; - }, - - blockParamIndex: function(name) { - for (let depth = 0, len = this.options.blockParams.length; depth < len; depth++) { - let blockParams = this.options.blockParams[depth], - param = blockParams && indexOf(blockParams, name); - if (blockParams && param >= 0) { - return [depth, param]; - } - } - } -}; - -export function precompile(input, options, env) { - if (input == null || (typeof input !== 'string' && input.type !== 'Program')) { - throw new Exception('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); - } - - options = options || {}; - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - let ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options); - return new env.JavaScriptCompiler().compile(environment, options); -} - -export function compile(input, options = {}, env) { - if (input == null || (typeof input !== 'string' && input.type !== 'Program')) { - throw new Exception('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); - } - - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - let compiled; - - function compileInput() { - let ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options), - templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); - return env.template(templateSpec); - } - - // Template is only compiled on first use and cached after that point. - function ret(context, execOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled.call(this, context, execOptions); - } - ret._setup = function(setupOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._setup(setupOptions); - }; - ret._child = function(i, data, blockParams, depths) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._child(i, data, blockParams, depths); - }; - return ret; -} - -function argEquals(a, b) { - if (a === b) { - return true; - } - - if (isArray(a) && isArray(b) && a.length === b.length) { - for (let i = 0; i < a.length; i++) { - if (!argEquals(a[i], b[i])) { - return false; - } - } - return true; - } -} - -function transformLiteralToPath(sexpr) { - if (!sexpr.path.parts) { - let literal = sexpr.path; - // Casting to string here to make false and 0 literal values play nicely with the rest - // of the system. - sexpr.path = new AST.PathExpression(false, 0, [literal.original + ''], literal.original + '', literal.loc); - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/helpers.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/helpers.js deleted file mode 100644 index fc0120c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/helpers.js +++ /dev/null @@ -1,123 +0,0 @@ -import Exception from '../exception'; - -export function SourceLocation(source, locInfo) { - this.source = source; - this.start = { - line: locInfo.first_line, - column: locInfo.first_column - }; - this.end = { - line: locInfo.last_line, - column: locInfo.last_column - }; -} - -export function id(token) { - if (/^\[.*\]$/.test(token)) { - return token.substr(1, token.length - 2); - } else { - return token; - } -} - -export function stripFlags(open, close) { - return { - open: open.charAt(2) === '~', - close: close.charAt(close.length - 3) === '~' - }; -} - -export function stripComment(comment) { - return comment.replace(/^\{\{~?\!-?-?/, '') - .replace(/-?-?~?\}\}$/, ''); -} - -export function preparePath(data, parts, locInfo) { - locInfo = this.locInfo(locInfo); - - let original = data ? '@' : '', - dig = [], - depth = 0, - depthString = ''; - - for (let i = 0, l = parts.length; i < l; i++) { - let part = parts[i].part, - // If we have [] syntax then we do not treat path references as operators, - // i.e. foo.[this] resolves to approximately context.foo['this'] - isLiteral = parts[i].original !== part; - original += (parts[i].separator || '') + part; - - if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { - if (dig.length > 0) { - throw new Exception('Invalid path: ' + original, {loc: locInfo}); - } else if (part === '..') { - depth++; - depthString += '../'; - } - } else { - dig.push(part); - } - } - - return new this.PathExpression(data, depth, dig, original, locInfo); -} - -export function prepareMustache(path, params, hash, open, strip, locInfo) { - // Must use charAt to support IE pre-10 - let escapeFlag = open.charAt(3) || open.charAt(2), - escaped = escapeFlag !== '{' && escapeFlag !== '&'; - - return new this.MustacheStatement(path, params, hash, escaped, strip, this.locInfo(locInfo)); -} - -export function prepareRawBlock(openRawBlock, content, close, locInfo) { - if (openRawBlock.path.original !== close) { - let errorNode = {loc: openRawBlock.path.loc}; - - throw new Exception(openRawBlock.path.original + " doesn't match " + close, errorNode); - } - - locInfo = this.locInfo(locInfo); - let program = new this.Program([content], null, {}, locInfo); - - return new this.BlockStatement( - openRawBlock.path, openRawBlock.params, openRawBlock.hash, - program, undefined, - {}, {}, {}, - locInfo); -} - -export function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { - // When we are chaining inverse calls, we will not have a close path - if (close && close.path && openBlock.path.original !== close.path.original) { - let errorNode = {loc: openBlock.path.loc}; - - throw new Exception(openBlock.path.original + ' doesn\'t match ' + close.path.original, errorNode); - } - - program.blockParams = openBlock.blockParams; - - let inverse, - inverseStrip; - - if (inverseAndProgram) { - if (inverseAndProgram.chain) { - inverseAndProgram.program.body[0].closeStrip = close.strip; - } - - inverseStrip = inverseAndProgram.strip; - inverse = inverseAndProgram.program; - } - - if (inverted) { - inverted = inverse; - inverse = program; - program = inverted; - } - - return new this.BlockStatement( - openBlock.path, openBlock.params, openBlock.hash, - program, inverse, - openBlock.strip, inverseStrip, close && close.strip, - this.locInfo(locInfo)); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/javascript-compiler.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/javascript-compiler.js deleted file mode 100644 index 8830661..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/javascript-compiler.js +++ /dev/null @@ -1,1070 +0,0 @@ -import { COMPILER_REVISION, REVISION_CHANGES } from '../base'; -import Exception from '../exception'; -import {isArray} from '../utils'; -import CodeGen from './code-gen'; - -function Literal(value) { - this.value = value; -} - -function JavaScriptCompiler() {} - -JavaScriptCompiler.prototype = { - // PUBLIC API: You can override these methods in a subclass to provide - // alternative compiled forms for name lookup and buffering semantics - nameLookup: function(parent, name /* , type*/) { - if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { - return [parent, '.', name]; - } else { - return [parent, "['", name, "']"]; - } - }, - depthedLookup: function(name) { - return [this.aliasable('this.lookup'), '(depths, "', name, '")']; - }, - - compilerInfo: function() { - const revision = COMPILER_REVISION, - versions = REVISION_CHANGES[revision]; - return [revision, versions]; - }, - - appendToBuffer: function(source, location, explicit) { - // Force a source as this simplifies the merge logic. - if (!isArray(source)) { - source = [source]; - } - source = this.source.wrap(source, location); - - if (this.environment.isSimple) { - return ['return ', source, ';']; - } else if (explicit) { - // This is a case where the buffer operation occurs as a child of another - // construct, generally braces. We have to explicitly output these buffer - // operations to ensure that the emitted code goes in the correct location. - return ['buffer += ', source, ';']; - } else { - source.appendToBuffer = true; - return source; - } - }, - - initializeBuffer: function() { - return this.quotedString(''); - }, - // END PUBLIC API - - compile: function(environment, options, context, asObject) { - this.environment = environment; - this.options = options; - this.stringParams = this.options.stringParams; - this.trackIds = this.options.trackIds; - this.precompile = !asObject; - - this.name = this.environment.name; - this.isChild = !!context; - this.context = context || { - programs: [], - environments: [] - }; - - this.preamble(); - - this.stackSlot = 0; - this.stackVars = []; - this.aliases = {}; - this.registers = { list: [] }; - this.hashes = []; - this.compileStack = []; - this.inlineStack = []; - this.blockParams = []; - - this.compileChildren(environment, options); - - this.useDepths = this.useDepths || environment.useDepths || this.options.compat; - this.useBlockParams = this.useBlockParams || environment.useBlockParams; - - let opcodes = environment.opcodes, - opcode, - firstLoc, - i, - l; - - for (i = 0, l = opcodes.length; i < l; i++) { - opcode = opcodes[i]; - - this.source.currentLocation = opcode.loc; - firstLoc = firstLoc || opcode.loc; - this[opcode.opcode].apply(this, opcode.args); - } - - // Flush any trailing content that might be pending. - this.source.currentLocation = firstLoc; - this.pushSource(''); - - /* istanbul ignore next */ - if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { - throw new Exception('Compile completed with content left on stack'); - } - - let fn = this.createFunctionContext(asObject); - if (!this.isChild) { - let ret = { - compiler: this.compilerInfo(), - main: fn - }; - let programs = this.context.programs; - for (i = 0, l = programs.length; i < l; i++) { - if (programs[i]) { - ret[i] = programs[i]; - } - } - - if (this.environment.usePartial) { - ret.usePartial = true; - } - if (this.options.data) { - ret.useData = true; - } - if (this.useDepths) { - ret.useDepths = true; - } - if (this.useBlockParams) { - ret.useBlockParams = true; - } - if (this.options.compat) { - ret.compat = true; - } - - if (!asObject) { - ret.compiler = JSON.stringify(ret.compiler); - - this.source.currentLocation = {start: {line: 1, column: 0}}; - ret = this.objectLiteral(ret); - - if (options.srcName) { - ret = ret.toStringWithSourceMap({file: options.destName}); - ret.map = ret.map && ret.map.toString(); - } else { - ret = ret.toString(); - } - } else { - ret.compilerOptions = this.options; - } - - return ret; - } else { - return fn; - } - }, - - preamble: function() { - // track the last context pushed into place to allow skipping the - // getContext opcode when it would be a noop - this.lastContext = 0; - this.source = new CodeGen(this.options.srcName); - }, - - createFunctionContext: function(asObject) { - let varDeclarations = ''; - - let locals = this.stackVars.concat(this.registers.list); - if (locals.length > 0) { - varDeclarations += ', ' + locals.join(', '); - } - - // Generate minimizer alias mappings - // - // When using true SourceNodes, this will update all references to the given alias - // as the source nodes are reused in situ. For the non-source node compilation mode, - // aliases will not be used, but this case is already being run on the client and - // we aren't concern about minimizing the template size. - let aliasCount = 0; - for (let alias in this.aliases) { // eslint-disable-line guard-for-in - let node = this.aliases[alias]; - - if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) { - varDeclarations += ', alias' + (++aliasCount) + '=' + alias; - node.children[0] = 'alias' + aliasCount; - } - } - - let params = ['depth0', 'helpers', 'partials', 'data']; - - if (this.useBlockParams || this.useDepths) { - params.push('blockParams'); - } - if (this.useDepths) { - params.push('depths'); - } - - // Perform a second pass over the output to merge content when possible - let source = this.mergeSource(varDeclarations); - - if (asObject) { - params.push(source); - - return Function.apply(this, params); - } else { - return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); - } - }, - mergeSource: function(varDeclarations) { - let isSimple = this.environment.isSimple, - appendOnly = !this.forceBuffer, - appendFirst, - - sourceSeen, - bufferStart, - bufferEnd; - this.source.each((line) => { - if (line.appendToBuffer) { - if (bufferStart) { - line.prepend(' + '); - } else { - bufferStart = line; - } - bufferEnd = line; - } else { - if (bufferStart) { - if (!sourceSeen) { - appendFirst = true; - } else { - bufferStart.prepend('buffer += '); - } - bufferEnd.add(';'); - bufferStart = bufferEnd = undefined; - } - - sourceSeen = true; - if (!isSimple) { - appendOnly = false; - } - } - }); - - - if (appendOnly) { - if (bufferStart) { - bufferStart.prepend('return '); - bufferEnd.add(';'); - } else if (!sourceSeen) { - this.source.push('return "";'); - } - } else { - varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); - - if (bufferStart) { - bufferStart.prepend('return buffer + '); - bufferEnd.add(';'); - } else { - this.source.push('return buffer;'); - } - } - - if (varDeclarations) { - this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); - } - - return this.source.merge(); - }, - - // [blockValue] - // - // On stack, before: hash, inverse, program, value - // On stack, after: return value of blockHelperMissing - // - // The purpose of this opcode is to take a block of the form - // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and - // replace it on the stack with the result of properly - // invoking blockHelperMissing. - blockValue: function(name) { - let blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs(name, 0, params); - - let blockName = this.popStack(); - params.splice(1, 0, blockName); - - this.push(this.source.functionCall(blockHelperMissing, 'call', params)); - }, - - // [ambiguousBlockValue] - // - // On stack, before: hash, inverse, program, value - // Compiler value, before: lastHelper=value of last found helper, if any - // On stack, after, if no lastHelper: same as [blockValue] - // On stack, after, if lastHelper: value - ambiguousBlockValue: function() { - // We're being a bit cheeky and reusing the options value from the prior exec - let blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs('', 0, params, true); - - this.flushInline(); - - let current = this.topStack(); - params.splice(1, 0, current); - - this.pushSource([ - 'if (!', this.lastHelper, ') { ', - current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), - '}']); - }, - - // [appendContent] - // - // On stack, before: ... - // On stack, after: ... - // - // Appends the string value of `content` to the current buffer - appendContent: function(content) { - if (this.pendingContent) { - content = this.pendingContent + content; - } else { - this.pendingLocation = this.source.currentLocation; - } - - this.pendingContent = content; - }, - - // [append] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Coerces `value` to a String and appends it to the current buffer. - // - // If `value` is truthy, or 0, it is coerced into a string and appended - // Otherwise, the empty string is appended - append: function() { - if (this.isInline()) { - this.replaceStack((current) => [' != null ? ', current, ' : ""']); - - this.pushSource(this.appendToBuffer(this.popStack())); - } else { - let local = this.popStack(); - this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); - if (this.environment.isSimple) { - this.pushSource(['else { ', this.appendToBuffer("''", undefined, true), ' }']); - } - } - }, - - // [appendEscaped] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Escape `value` and append it to the buffer - appendEscaped: function() { - this.pushSource(this.appendToBuffer( - [this.aliasable('this.escapeExpression'), '(', this.popStack(), ')'])); - }, - - // [getContext] - // - // On stack, before: ... - // On stack, after: ... - // Compiler value, after: lastContext=depth - // - // Set the value of the `lastContext` compiler value to the depth - getContext: function(depth) { - this.lastContext = depth; - }, - - // [pushContext] - // - // On stack, before: ... - // On stack, after: currentContext, ... - // - // Pushes the value of the current context onto the stack. - pushContext: function() { - this.pushStackLiteral(this.contextName(this.lastContext)); - }, - - // [lookupOnContext] - // - // On stack, before: ... - // On stack, after: currentContext[name], ... - // - // Looks up the value of `name` on the current context and pushes - // it onto the stack. - lookupOnContext: function(parts, falsy, scoped) { - let i = 0; - - if (!scoped && this.options.compat && !this.lastContext) { - // The depthed query is expected to handle the undefined logic for the root level that - // is implemented below, so we evaluate that directly in compat mode - this.push(this.depthedLookup(parts[i++])); - } else { - this.pushContext(); - } - - this.resolvePath('context', parts, i, falsy); - }, - - // [lookupBlockParam] - // - // On stack, before: ... - // On stack, after: blockParam[name], ... - // - // Looks up the value of `parts` on the given block param and pushes - // it onto the stack. - lookupBlockParam: function(blockParamId, parts) { - this.useBlockParams = true; - - this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); - this.resolvePath('context', parts, 1); - }, - - // [lookupData] - // - // On stack, before: ... - // On stack, after: data, ... - // - // Push the data lookup operator - lookupData: function(depth, parts) { - if (!depth) { - this.pushStackLiteral('data'); - } else { - this.pushStackLiteral('this.data(data, ' + depth + ')'); - } - - this.resolvePath('data', parts, 0, true); - }, - - resolvePath: function(type, parts, i, falsy) { - if (this.options.strict || this.options.assumeObjects) { - this.push(strictLookup(this.options.strict, this, parts, type)); - return; - } - - let len = parts.length; - for (; i < len; i++) { - /*eslint-disable no-loop-func */ - this.replaceStack((current) => { - let lookup = this.nameLookup(current, parts[i], type); - // We want to ensure that zero and false are handled properly if the context (falsy flag) - // needs to have the special handling for these values. - if (!falsy) { - return [' != null ? ', lookup, ' : ', current]; - } else { - // Otherwise we can use generic falsy handling - return [' && ', lookup]; - } - }); - /*eslint-enable no-loop-func */ - } - }, - - // [resolvePossibleLambda] - // - // On stack, before: value, ... - // On stack, after: resolved value, ... - // - // If the `value` is a lambda, replace it on the stack by - // the return value of the lambda - resolvePossibleLambda: function() { - this.push([this.aliasable('this.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); - }, - - // [pushStringParam] - // - // On stack, before: ... - // On stack, after: string, currentContext, ... - // - // This opcode is designed for use in string mode, which - // provides the string value of a parameter along with its - // depth rather than resolving it immediately. - pushStringParam: function(string, type) { - this.pushContext(); - this.pushString(type); - - // If it's a subexpression, the string result - // will be pushed after this opcode. - if (type !== 'SubExpression') { - if (typeof string === 'string') { - this.pushString(string); - } else { - this.pushStackLiteral(string); - } - } - }, - - emptyHash: function(omitEmpty) { - if (this.trackIds) { - this.push('{}'); // hashIds - } - if (this.stringParams) { - this.push('{}'); // hashContexts - this.push('{}'); // hashTypes - } - this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); - }, - pushHash: function() { - if (this.hash) { - this.hashes.push(this.hash); - } - this.hash = {values: [], types: [], contexts: [], ids: []}; - }, - popHash: function() { - let hash = this.hash; - this.hash = this.hashes.pop(); - - if (this.trackIds) { - this.push(this.objectLiteral(hash.ids)); - } - if (this.stringParams) { - this.push(this.objectLiteral(hash.contexts)); - this.push(this.objectLiteral(hash.types)); - } - - this.push(this.objectLiteral(hash.values)); - }, - - // [pushString] - // - // On stack, before: ... - // On stack, after: quotedString(string), ... - // - // Push a quoted version of `string` onto the stack - pushString: function(string) { - this.pushStackLiteral(this.quotedString(string)); - }, - - // [pushLiteral] - // - // On stack, before: ... - // On stack, after: value, ... - // - // Pushes a value onto the stack. This operation prevents - // the compiler from creating a temporary variable to hold - // it. - pushLiteral: function(value) { - this.pushStackLiteral(value); - }, - - // [pushProgram] - // - // On stack, before: ... - // On stack, after: program(guid), ... - // - // Push a program expression onto the stack. This takes - // a compile-time guid and converts it into a runtime-accessible - // expression. - pushProgram: function(guid) { - if (guid != null) { - this.pushStackLiteral(this.programExpression(guid)); - } else { - this.pushStackLiteral(null); - } - }, - - // [invokeHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // Pops off the helper's parameters, invokes the helper, - // and pushes the helper's return value onto the stack. - // - // If the helper is not found, `helperMissing` is called. - invokeHelper: function(paramSize, name, isSimple) { - let nonHelper = this.popStack(), - helper = this.setupHelper(paramSize, name), - simple = isSimple ? [helper.name, ' || '] : ''; - - let lookup = ['('].concat(simple, nonHelper); - if (!this.options.strict) { - lookup.push(' || ', this.aliasable('helpers.helperMissing')); - } - lookup.push(')'); - - this.push(this.source.functionCall(lookup, 'call', helper.callParams)); - }, - - // [invokeKnownHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // This operation is used when the helper is known to exist, - // so a `helperMissing` fallback is not required. - invokeKnownHelper: function(paramSize, name) { - let helper = this.setupHelper(paramSize, name); - this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); - }, - - // [invokeAmbiguous] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of disambiguation - // - // This operation is used when an expression like `{{foo}}` - // is provided, but we don't know at compile-time whether it - // is a helper or a path. - // - // This operation emits more code than the other options, - // and can be avoided by passing the `knownHelpers` and - // `knownHelpersOnly` flags at compile-time. - invokeAmbiguous: function(name, helperCall) { - this.useRegister('helper'); - - let nonHelper = this.popStack(); - - this.emptyHash(); - let helper = this.setupHelper(0, name, helperCall); - - let helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); - - let lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; - if (!this.options.strict) { - lookup[0] = '(helper = '; - lookup.push( - ' != null ? helper : ', - this.aliasable('helpers.helperMissing') - ); - } - - this.push([ - '(', lookup, - (helper.paramsInit ? ['),(', helper.paramsInit] : []), '),', - '(typeof helper === ', this.aliasable('"function"'), ' ? ', - this.source.functionCall('helper', 'call', helper.callParams), ' : helper))' - ]); - }, - - // [invokePartial] - // - // On stack, before: context, ... - // On stack after: result of partial invocation - // - // This operation pops off a context, invokes a partial with that context, - // and pushes the result of the invocation back. - invokePartial: function(isDynamic, name, indent) { - let params = [], - options = this.setupParams(name, 1, params, false); - - if (isDynamic) { - name = this.popStack(); - delete options.name; - } - - if (indent) { - options.indent = JSON.stringify(indent); - } - options.helpers = 'helpers'; - options.partials = 'partials'; - - if (!isDynamic) { - params.unshift(this.nameLookup('partials', name, 'partial')); - } else { - params.unshift(name); - } - - if (this.options.compat) { - options.depths = 'depths'; - } - options = this.objectLiteral(options); - params.push(options); - - this.push(this.source.functionCall('this.invokePartial', '', params)); - }, - - // [assignToHash] - // - // On stack, before: value, ..., hash, ... - // On stack, after: ..., hash, ... - // - // Pops a value off the stack and assigns it to the current hash - assignToHash: function(key) { - let value = this.popStack(), - context, - type, - id; - - if (this.trackIds) { - id = this.popStack(); - } - if (this.stringParams) { - type = this.popStack(); - context = this.popStack(); - } - - let hash = this.hash; - if (context) { - hash.contexts[key] = context; - } - if (type) { - hash.types[key] = type; - } - if (id) { - hash.ids[key] = id; - } - hash.values[key] = value; - }, - - pushId: function(type, name, child) { - if (type === 'BlockParam') { - this.pushStackLiteral( - 'blockParams[' + name[0] + '].path[' + name[1] + ']' - + (child ? ' + ' + JSON.stringify('.' + child) : '')); - } else if (type === 'PathExpression') { - this.pushString(name); - } else if (type === 'SubExpression') { - this.pushStackLiteral('true'); - } else { - this.pushStackLiteral('null'); - } - }, - - // HELPERS - - compiler: JavaScriptCompiler, - - compileChildren: function(environment, options) { - let children = environment.children, child, compiler; - - for (let i = 0, l = children.length; i < l; i++) { - child = children[i]; - compiler = new this.compiler(); // eslint-disable-line new-cap - - let index = this.matchExistingProgram(child); - - if (index == null) { - this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children - index = this.context.programs.length; - child.index = index; - child.name = 'program' + index; - this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); - this.context.environments[index] = child; - - this.useDepths = this.useDepths || compiler.useDepths; - this.useBlockParams = this.useBlockParams || compiler.useBlockParams; - } else { - child.index = index; - child.name = 'program' + index; - - this.useDepths = this.useDepths || child.useDepths; - this.useBlockParams = this.useBlockParams || child.useBlockParams; - } - } - }, - matchExistingProgram: function(child) { - for (let i = 0, len = this.context.environments.length; i < len; i++) { - let environment = this.context.environments[i]; - if (environment && environment.equals(child)) { - return i; - } - } - }, - - programExpression: function(guid) { - let child = this.environment.children[guid], - programParams = [child.index, 'data', child.blockParams]; - - if (this.useBlockParams || this.useDepths) { - programParams.push('blockParams'); - } - if (this.useDepths) { - programParams.push('depths'); - } - - return 'this.program(' + programParams.join(', ') + ')'; - }, - - useRegister: function(name) { - if (!this.registers[name]) { - this.registers[name] = true; - this.registers.list.push(name); - } - }, - - push: function(expr) { - if (!(expr instanceof Literal)) { - expr = this.source.wrap(expr); - } - - this.inlineStack.push(expr); - return expr; - }, - - pushStackLiteral: function(item) { - this.push(new Literal(item)); - }, - - pushSource: function(source) { - if (this.pendingContent) { - this.source.push( - this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); - this.pendingContent = undefined; - } - - if (source) { - this.source.push(source); - } - }, - - replaceStack: function(callback) { - let prefix = ['('], - stack, - createdStack, - usedLiteral; - - /* istanbul ignore next */ - if (!this.isInline()) { - throw new Exception('replaceStack on non-inline'); - } - - // We want to merge the inline statement into the replacement statement via ',' - let top = this.popStack(true); - - if (top instanceof Literal) { - // Literals do not need to be inlined - stack = [top.value]; - prefix = ['(', stack]; - usedLiteral = true; - } else { - // Get or create the current stack name for use by the inline - createdStack = true; - let name = this.incrStack(); - - prefix = ['((', this.push(name), ' = ', top, ')']; - stack = this.topStack(); - } - - let item = callback.call(this, stack); - - if (!usedLiteral) { - this.popStack(); - } - if (createdStack) { - this.stackSlot--; - } - this.push(prefix.concat(item, ')')); - }, - - incrStack: function() { - this.stackSlot++; - if (this.stackSlot > this.stackVars.length) { this.stackVars.push('stack' + this.stackSlot); } - return this.topStackName(); - }, - topStackName: function() { - return 'stack' + this.stackSlot; - }, - flushInline: function() { - let inlineStack = this.inlineStack; - this.inlineStack = []; - for (let i = 0, len = inlineStack.length; i < len; i++) { - let entry = inlineStack[i]; - /* istanbul ignore if */ - if (entry instanceof Literal) { - this.compileStack.push(entry); - } else { - let stack = this.incrStack(); - this.pushSource([stack, ' = ', entry, ';']); - this.compileStack.push(stack); - } - } - }, - isInline: function() { - return this.inlineStack.length; - }, - - popStack: function(wrapped) { - let inline = this.isInline(), - item = (inline ? this.inlineStack : this.compileStack).pop(); - - if (!wrapped && (item instanceof Literal)) { - return item.value; - } else { - if (!inline) { - /* istanbul ignore next */ - if (!this.stackSlot) { - throw new Exception('Invalid stack pop'); - } - this.stackSlot--; - } - return item; - } - }, - - topStack: function() { - let stack = (this.isInline() ? this.inlineStack : this.compileStack), - item = stack[stack.length - 1]; - - /* istanbul ignore if */ - if (item instanceof Literal) { - return item.value; - } else { - return item; - } - }, - - contextName: function(context) { - if (this.useDepths && context) { - return 'depths[' + context + ']'; - } else { - return 'depth' + context; - } - }, - - quotedString: function(str) { - return this.source.quotedString(str); - }, - - objectLiteral: function(obj) { - return this.source.objectLiteral(obj); - }, - - aliasable: function(name) { - let ret = this.aliases[name]; - if (ret) { - ret.referenceCount++; - return ret; - } - - ret = this.aliases[name] = this.source.wrap(name); - ret.aliasable = true; - ret.referenceCount = 1; - - return ret; - }, - - setupHelper: function(paramSize, name, blockHelper) { - let params = [], - paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); - let foundHelper = this.nameLookup('helpers', name, 'helper'); - - return { - params: params, - paramsInit: paramsInit, - name: foundHelper, - callParams: [this.contextName(0)].concat(params) - }; - }, - - setupParams: function(helper, paramSize, params) { - let options = {}, contexts = [], types = [], ids = [], param; - - options.name = this.quotedString(helper); - options.hash = this.popStack(); - - if (this.trackIds) { - options.hashIds = this.popStack(); - } - if (this.stringParams) { - options.hashTypes = this.popStack(); - options.hashContexts = this.popStack(); - } - - let inverse = this.popStack(), - program = this.popStack(); - - // Avoid setting fn and inverse if neither are set. This allows - // helpers to do a check for `if (options.fn)` - if (program || inverse) { - options.fn = program || 'this.noop'; - options.inverse = inverse || 'this.noop'; - } - - // The parameters go on to the stack in order (making sure that they are evaluated in order) - // so we need to pop them off the stack in reverse order - let i = paramSize; - while (i--) { - param = this.popStack(); - params[i] = param; - - if (this.trackIds) { - ids[i] = this.popStack(); - } - if (this.stringParams) { - types[i] = this.popStack(); - contexts[i] = this.popStack(); - } - } - - if (this.trackIds) { - options.ids = this.source.generateArray(ids); - } - if (this.stringParams) { - options.types = this.source.generateArray(types); - options.contexts = this.source.generateArray(contexts); - } - - if (this.options.data) { - options.data = 'data'; - } - if (this.useBlockParams) { - options.blockParams = 'blockParams'; - } - return options; - }, - - setupHelperArgs: function(helper, paramSize, params, useRegister) { - let options = this.setupParams(helper, paramSize, params, true); - options = this.objectLiteral(options); - if (useRegister) { - this.useRegister('options'); - params.push('options'); - return ['options=', options]; - } else { - params.push(options); - return ''; - } - } -}; - - -(function() { - const reservedWords = ( - 'break else new var' + - ' case finally return void' + - ' catch for switch while' + - ' continue function this with' + - ' default if throw' + - ' delete in try' + - ' do instanceof typeof' + - ' abstract enum int short' + - ' boolean export interface static' + - ' byte extends long super' + - ' char final native synchronized' + - ' class float package throws' + - ' const goto private transient' + - ' debugger implements protected volatile' + - ' double import public let yield await' + - ' null true false' - ).split(' '); - - const compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; - - for (let i = 0, l = reservedWords.length; i < l; i++) { - compilerWords[reservedWords[i]] = true; - } -}()); - -JavaScriptCompiler.isValidJavaScriptVariableName = function(name) { - return !JavaScriptCompiler.RESERVED_WORDS[name] && (/^[a-zA-Z_$][0-9a-zA-Z_$]*$/).test(name); -}; - -function strictLookup(requireTerminal, compiler, parts, type) { - let stack = compiler.popStack(), - i = 0, - len = parts.length; - if (requireTerminal) { - len--; - } - - for (; i < len; i++) { - stack = compiler.nameLookup(stack, parts[i], type); - } - - if (requireTerminal) { - return [compiler.aliasable('this.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')']; - } else { - return stack; - } -} - -export default JavaScriptCompiler; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/parser.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/parser.js deleted file mode 100644 index f961a50..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/parser.js +++ /dev/null @@ -1,563 +0,0 @@ -/* istanbul ignore next */ -/* Jison generated parser */ -var handlebars = (function(){ -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"root":3,"program":4,"EOF":5,"program_repetition0":6,"statement":7,"mustache":8,"block":9,"rawBlock":10,"partial":11,"content":12,"COMMENT":13,"CONTENT":14,"openRawBlock":15,"END_RAW_BLOCK":16,"OPEN_RAW_BLOCK":17,"helperName":18,"openRawBlock_repetition0":19,"openRawBlock_option0":20,"CLOSE_RAW_BLOCK":21,"openBlock":22,"block_option0":23,"closeBlock":24,"openInverse":25,"block_option1":26,"OPEN_BLOCK":27,"openBlock_repetition0":28,"openBlock_option0":29,"openBlock_option1":30,"CLOSE":31,"OPEN_INVERSE":32,"openInverse_repetition0":33,"openInverse_option0":34,"openInverse_option1":35,"openInverseChain":36,"OPEN_INVERSE_CHAIN":37,"openInverseChain_repetition0":38,"openInverseChain_option0":39,"openInverseChain_option1":40,"inverseAndProgram":41,"INVERSE":42,"inverseChain":43,"inverseChain_option0":44,"OPEN_ENDBLOCK":45,"OPEN":46,"mustache_repetition0":47,"mustache_option0":48,"OPEN_UNESCAPED":49,"mustache_repetition1":50,"mustache_option1":51,"CLOSE_UNESCAPED":52,"OPEN_PARTIAL":53,"partialName":54,"partial_repetition0":55,"partial_option0":56,"param":57,"sexpr":58,"OPEN_SEXPR":59,"sexpr_repetition0":60,"sexpr_option0":61,"CLOSE_SEXPR":62,"hash":63,"hash_repetition_plus0":64,"hashSegment":65,"ID":66,"EQUALS":67,"blockParams":68,"OPEN_BLOCK_PARAMS":69,"blockParams_repetition_plus0":70,"CLOSE_BLOCK_PARAMS":71,"path":72,"dataName":73,"STRING":74,"NUMBER":75,"BOOLEAN":76,"UNDEFINED":77,"NULL":78,"DATA":79,"pathSegments":80,"SEP":81,"$accept":0,"$end":1}, -terminals_: {2:"error",5:"EOF",13:"COMMENT",14:"CONTENT",16:"END_RAW_BLOCK",17:"OPEN_RAW_BLOCK",21:"CLOSE_RAW_BLOCK",27:"OPEN_BLOCK",31:"CLOSE",32:"OPEN_INVERSE",37:"OPEN_INVERSE_CHAIN",42:"INVERSE",45:"OPEN_ENDBLOCK",46:"OPEN",49:"OPEN_UNESCAPED",52:"CLOSE_UNESCAPED",53:"OPEN_PARTIAL",59:"OPEN_SEXPR",62:"CLOSE_SEXPR",66:"ID",67:"EQUALS",69:"OPEN_BLOCK_PARAMS",71:"CLOSE_BLOCK_PARAMS",74:"STRING",75:"NUMBER",76:"BOOLEAN",77:"UNDEFINED",78:"NULL",79:"DATA",81:"SEP"}, -productions_: [0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[12,1],[10,3],[15,5],[9,4],[9,4],[22,6],[25,6],[36,6],[41,2],[43,3],[43,1],[24,3],[8,5],[8,5],[11,5],[57,1],[57,1],[58,5],[63,1],[65,3],[68,3],[18,1],[18,1],[18,1],[18,1],[18,1],[18,1],[18,1],[54,1],[54,1],[73,2],[72,1],[80,3],[80,1],[6,0],[6,2],[19,0],[19,2],[20,0],[20,1],[23,0],[23,1],[26,0],[26,1],[28,0],[28,2],[29,0],[29,1],[30,0],[30,1],[33,0],[33,2],[34,0],[34,1],[35,0],[35,1],[38,0],[38,2],[39,0],[39,1],[40,0],[40,1],[44,0],[44,1],[47,0],[47,2],[48,0],[48,1],[50,0],[50,2],[51,0],[51,1],[55,0],[55,2],[56,0],[56,1],[60,0],[60,2],[61,0],[61,1],[64,1],[64,2],[70,1],[70,2]], -performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { - -var $0 = $$.length - 1; -switch (yystate) { -case 1: return $$[$0-1]; -break; -case 2:this.$ = new yy.Program($$[$0], null, {}, yy.locInfo(this._$)); -break; -case 3:this.$ = $$[$0]; -break; -case 4:this.$ = $$[$0]; -break; -case 5:this.$ = $$[$0]; -break; -case 6:this.$ = $$[$0]; -break; -case 7:this.$ = $$[$0]; -break; -case 8:this.$ = new yy.CommentStatement(yy.stripComment($$[$0]), yy.stripFlags($$[$0], $$[$0]), yy.locInfo(this._$)); -break; -case 9:this.$ = new yy.ContentStatement($$[$0], yy.locInfo(this._$)); -break; -case 10:this.$ = yy.prepareRawBlock($$[$0-2], $$[$0-1], $$[$0], this._$); -break; -case 11:this.$ = { path: $$[$0-3], params: $$[$0-2], hash: $$[$0-1] }; -break; -case 12:this.$ = yy.prepareBlock($$[$0-3], $$[$0-2], $$[$0-1], $$[$0], false, this._$); -break; -case 13:this.$ = yy.prepareBlock($$[$0-3], $$[$0-2], $$[$0-1], $$[$0], true, this._$); -break; -case 14:this.$ = { path: $$[$0-4], params: $$[$0-3], hash: $$[$0-2], blockParams: $$[$0-1], strip: yy.stripFlags($$[$0-5], $$[$0]) }; -break; -case 15:this.$ = { path: $$[$0-4], params: $$[$0-3], hash: $$[$0-2], blockParams: $$[$0-1], strip: yy.stripFlags($$[$0-5], $$[$0]) }; -break; -case 16:this.$ = { path: $$[$0-4], params: $$[$0-3], hash: $$[$0-2], blockParams: $$[$0-1], strip: yy.stripFlags($$[$0-5], $$[$0]) }; -break; -case 17:this.$ = { strip: yy.stripFlags($$[$0-1], $$[$0-1]), program: $$[$0] }; -break; -case 18: - var inverse = yy.prepareBlock($$[$0-2], $$[$0-1], $$[$0], $$[$0], false, this._$), - program = new yy.Program([inverse], null, {}, yy.locInfo(this._$)); - program.chained = true; - - this.$ = { strip: $$[$0-2].strip, program: program, chain: true }; - -break; -case 19:this.$ = $$[$0]; -break; -case 20:this.$ = {path: $$[$0-1], strip: yy.stripFlags($$[$0-2], $$[$0])}; -break; -case 21:this.$ = yy.prepareMustache($$[$0-3], $$[$0-2], $$[$0-1], $$[$0-4], yy.stripFlags($$[$0-4], $$[$0]), this._$); -break; -case 22:this.$ = yy.prepareMustache($$[$0-3], $$[$0-2], $$[$0-1], $$[$0-4], yy.stripFlags($$[$0-4], $$[$0]), this._$); -break; -case 23:this.$ = new yy.PartialStatement($$[$0-3], $$[$0-2], $$[$0-1], yy.stripFlags($$[$0-4], $$[$0]), yy.locInfo(this._$)); -break; -case 24:this.$ = $$[$0]; -break; -case 25:this.$ = $$[$0]; -break; -case 26:this.$ = new yy.SubExpression($$[$0-3], $$[$0-2], $$[$0-1], yy.locInfo(this._$)); -break; -case 27:this.$ = new yy.Hash($$[$0], yy.locInfo(this._$)); -break; -case 28:this.$ = new yy.HashPair(yy.id($$[$0-2]), $$[$0], yy.locInfo(this._$)); -break; -case 29:this.$ = yy.id($$[$0-1]); -break; -case 30:this.$ = $$[$0]; -break; -case 31:this.$ = $$[$0]; -break; -case 32:this.$ = new yy.StringLiteral($$[$0], yy.locInfo(this._$)); -break; -case 33:this.$ = new yy.NumberLiteral($$[$0], yy.locInfo(this._$)); -break; -case 34:this.$ = new yy.BooleanLiteral($$[$0], yy.locInfo(this._$)); -break; -case 35:this.$ = new yy.UndefinedLiteral(yy.locInfo(this._$)); -break; -case 36:this.$ = new yy.NullLiteral(yy.locInfo(this._$)); -break; -case 37:this.$ = $$[$0]; -break; -case 38:this.$ = $$[$0]; -break; -case 39:this.$ = yy.preparePath(true, $$[$0], this._$); -break; -case 40:this.$ = yy.preparePath(false, $$[$0], this._$); -break; -case 41: $$[$0-2].push({part: yy.id($$[$0]), original: $$[$0], separator: $$[$0-1]}); this.$ = $$[$0-2]; -break; -case 42:this.$ = [{part: yy.id($$[$0]), original: $$[$0]}]; -break; -case 43:this.$ = []; -break; -case 44:$$[$0-1].push($$[$0]); -break; -case 45:this.$ = []; -break; -case 46:$$[$0-1].push($$[$0]); -break; -case 53:this.$ = []; -break; -case 54:$$[$0-1].push($$[$0]); -break; -case 59:this.$ = []; -break; -case 60:$$[$0-1].push($$[$0]); -break; -case 65:this.$ = []; -break; -case 66:$$[$0-1].push($$[$0]); -break; -case 73:this.$ = []; -break; -case 74:$$[$0-1].push($$[$0]); -break; -case 77:this.$ = []; -break; -case 78:$$[$0-1].push($$[$0]); -break; -case 81:this.$ = []; -break; -case 82:$$[$0-1].push($$[$0]); -break; -case 85:this.$ = []; -break; -case 86:$$[$0-1].push($$[$0]); -break; -case 89:this.$ = [$$[$0]]; -break; -case 90:$$[$0-1].push($$[$0]); -break; -case 91:this.$ = [$$[$0]]; -break; -case 92:$$[$0-1].push($$[$0]); -break; -} -}, -table: [{3:1,4:2,5:[2,43],6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],46:[2,43],49:[2,43],53:[2,43]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:[1,11],14:[1,18],15:16,17:[1,21],22:14,25:15,27:[1,19],32:[1,20],37:[2,2],42:[2,2],45:[2,2],46:[1,12],49:[1,13],53:[1,17]},{1:[2,1]},{5:[2,44],13:[2,44],14:[2,44],17:[2,44],27:[2,44],32:[2,44],37:[2,44],42:[2,44],45:[2,44],46:[2,44],49:[2,44],53:[2,44]},{5:[2,3],13:[2,3],14:[2,3],17:[2,3],27:[2,3],32:[2,3],37:[2,3],42:[2,3],45:[2,3],46:[2,3],49:[2,3],53:[2,3]},{5:[2,4],13:[2,4],14:[2,4],17:[2,4],27:[2,4],32:[2,4],37:[2,4],42:[2,4],45:[2,4],46:[2,4],49:[2,4],53:[2,4]},{5:[2,5],13:[2,5],14:[2,5],17:[2,5],27:[2,5],32:[2,5],37:[2,5],42:[2,5],45:[2,5],46:[2,5],49:[2,5],53:[2,5]},{5:[2,6],13:[2,6],14:[2,6],17:[2,6],27:[2,6],32:[2,6],37:[2,6],42:[2,6],45:[2,6],46:[2,6],49:[2,6],53:[2,6]},{5:[2,7],13:[2,7],14:[2,7],17:[2,7],27:[2,7],32:[2,7],37:[2,7],42:[2,7],45:[2,7],46:[2,7],49:[2,7],53:[2,7]},{5:[2,8],13:[2,8],14:[2,8],17:[2,8],27:[2,8],32:[2,8],37:[2,8],42:[2,8],45:[2,8],46:[2,8],49:[2,8],53:[2,8]},{18:22,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:33,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{4:34,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],37:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{4:35,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{12:36,14:[1,18]},{18:38,54:37,58:39,59:[1,40],66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,9],13:[2,9],14:[2,9],16:[2,9],17:[2,9],27:[2,9],32:[2,9],37:[2,9],42:[2,9],45:[2,9],46:[2,9],49:[2,9],53:[2,9]},{18:41,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:42,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:43,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{31:[2,73],47:44,59:[2,73],66:[2,73],74:[2,73],75:[2,73],76:[2,73],77:[2,73],78:[2,73],79:[2,73]},{21:[2,30],31:[2,30],52:[2,30],59:[2,30],62:[2,30],66:[2,30],69:[2,30],74:[2,30],75:[2,30],76:[2,30],77:[2,30],78:[2,30],79:[2,30]},{21:[2,31],31:[2,31],52:[2,31],59:[2,31],62:[2,31],66:[2,31],69:[2,31],74:[2,31],75:[2,31],76:[2,31],77:[2,31],78:[2,31],79:[2,31]},{21:[2,32],31:[2,32],52:[2,32],59:[2,32],62:[2,32],66:[2,32],69:[2,32],74:[2,32],75:[2,32],76:[2,32],77:[2,32],78:[2,32],79:[2,32]},{21:[2,33],31:[2,33],52:[2,33],59:[2,33],62:[2,33],66:[2,33],69:[2,33],74:[2,33],75:[2,33],76:[2,33],77:[2,33],78:[2,33],79:[2,33]},{21:[2,34],31:[2,34],52:[2,34],59:[2,34],62:[2,34],66:[2,34],69:[2,34],74:[2,34],75:[2,34],76:[2,34],77:[2,34],78:[2,34],79:[2,34]},{21:[2,35],31:[2,35],52:[2,35],59:[2,35],62:[2,35],66:[2,35],69:[2,35],74:[2,35],75:[2,35],76:[2,35],77:[2,35],78:[2,35],79:[2,35]},{21:[2,36],31:[2,36],52:[2,36],59:[2,36],62:[2,36],66:[2,36],69:[2,36],74:[2,36],75:[2,36],76:[2,36],77:[2,36],78:[2,36],79:[2,36]},{21:[2,40],31:[2,40],52:[2,40],59:[2,40],62:[2,40],66:[2,40],69:[2,40],74:[2,40],75:[2,40],76:[2,40],77:[2,40],78:[2,40],79:[2,40],81:[1,45]},{66:[1,32],80:46},{21:[2,42],31:[2,42],52:[2,42],59:[2,42],62:[2,42],66:[2,42],69:[2,42],74:[2,42],75:[2,42],76:[2,42],77:[2,42],78:[2,42],79:[2,42],81:[2,42]},{50:47,52:[2,77],59:[2,77],66:[2,77],74:[2,77],75:[2,77],76:[2,77],77:[2,77],78:[2,77],79:[2,77]},{23:48,36:50,37:[1,52],41:51,42:[1,53],43:49,45:[2,49]},{26:54,41:55,42:[1,53],45:[2,51]},{16:[1,56]},{31:[2,81],55:57,59:[2,81],66:[2,81],74:[2,81],75:[2,81],76:[2,81],77:[2,81],78:[2,81],79:[2,81]},{31:[2,37],59:[2,37],66:[2,37],74:[2,37],75:[2,37],76:[2,37],77:[2,37],78:[2,37],79:[2,37]},{31:[2,38],59:[2,38],66:[2,38],74:[2,38],75:[2,38],76:[2,38],77:[2,38],78:[2,38],79:[2,38]},{18:58,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{28:59,31:[2,53],59:[2,53],66:[2,53],69:[2,53],74:[2,53],75:[2,53],76:[2,53],77:[2,53],78:[2,53],79:[2,53]},{31:[2,59],33:60,59:[2,59],66:[2,59],69:[2,59],74:[2,59],75:[2,59],76:[2,59],77:[2,59],78:[2,59],79:[2,59]},{19:61,21:[2,45],59:[2,45],66:[2,45],74:[2,45],75:[2,45],76:[2,45],77:[2,45],78:[2,45],79:[2,45]},{18:65,31:[2,75],48:62,57:63,58:66,59:[1,40],63:64,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{66:[1,70]},{21:[2,39],31:[2,39],52:[2,39],59:[2,39],62:[2,39],66:[2,39],69:[2,39],74:[2,39],75:[2,39],76:[2,39],77:[2,39],78:[2,39],79:[2,39],81:[1,45]},{18:65,51:71,52:[2,79],57:72,58:66,59:[1,40],63:73,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{24:74,45:[1,75]},{45:[2,50]},{4:76,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],37:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{45:[2,19]},{18:77,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{4:78,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{24:79,45:[1,75]},{45:[2,52]},{5:[2,10],13:[2,10],14:[2,10],17:[2,10],27:[2,10],32:[2,10],37:[2,10],42:[2,10],45:[2,10],46:[2,10],49:[2,10],53:[2,10]},{18:65,31:[2,83],56:80,57:81,58:66,59:[1,40],63:82,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{59:[2,85],60:83,62:[2,85],66:[2,85],74:[2,85],75:[2,85],76:[2,85],77:[2,85],78:[2,85],79:[2,85]},{18:65,29:84,31:[2,55],57:85,58:66,59:[1,40],63:86,64:67,65:68,66:[1,69],69:[2,55],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:65,31:[2,61],34:87,57:88,58:66,59:[1,40],63:89,64:67,65:68,66:[1,69],69:[2,61],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:65,20:90,21:[2,47],57:91,58:66,59:[1,40],63:92,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{31:[1,93]},{31:[2,74],59:[2,74],66:[2,74],74:[2,74],75:[2,74],76:[2,74],77:[2,74],78:[2,74],79:[2,74]},{31:[2,76]},{21:[2,24],31:[2,24],52:[2,24],59:[2,24],62:[2,24],66:[2,24],69:[2,24],74:[2,24],75:[2,24],76:[2,24],77:[2,24],78:[2,24],79:[2,24]},{21:[2,25],31:[2,25],52:[2,25],59:[2,25],62:[2,25],66:[2,25],69:[2,25],74:[2,25],75:[2,25],76:[2,25],77:[2,25],78:[2,25],79:[2,25]},{21:[2,27],31:[2,27],52:[2,27],62:[2,27],65:94,66:[1,95],69:[2,27]},{21:[2,89],31:[2,89],52:[2,89],62:[2,89],66:[2,89],69:[2,89]},{21:[2,42],31:[2,42],52:[2,42],59:[2,42],62:[2,42],66:[2,42],67:[1,96],69:[2,42],74:[2,42],75:[2,42],76:[2,42],77:[2,42],78:[2,42],79:[2,42],81:[2,42]},{21:[2,41],31:[2,41],52:[2,41],59:[2,41],62:[2,41],66:[2,41],69:[2,41],74:[2,41],75:[2,41],76:[2,41],77:[2,41],78:[2,41],79:[2,41],81:[2,41]},{52:[1,97]},{52:[2,78],59:[2,78],66:[2,78],74:[2,78],75:[2,78],76:[2,78],77:[2,78],78:[2,78],79:[2,78]},{52:[2,80]},{5:[2,12],13:[2,12],14:[2,12],17:[2,12],27:[2,12],32:[2,12],37:[2,12],42:[2,12],45:[2,12],46:[2,12],49:[2,12],53:[2,12]},{18:98,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{36:50,37:[1,52],41:51,42:[1,53],43:100,44:99,45:[2,71]},{31:[2,65],38:101,59:[2,65],66:[2,65],69:[2,65],74:[2,65],75:[2,65],76:[2,65],77:[2,65],78:[2,65],79:[2,65]},{45:[2,17]},{5:[2,13],13:[2,13],14:[2,13],17:[2,13],27:[2,13],32:[2,13],37:[2,13],42:[2,13],45:[2,13],46:[2,13],49:[2,13],53:[2,13]},{31:[1,102]},{31:[2,82],59:[2,82],66:[2,82],74:[2,82],75:[2,82],76:[2,82],77:[2,82],78:[2,82],79:[2,82]},{31:[2,84]},{18:65,57:104,58:66,59:[1,40],61:103,62:[2,87],63:105,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{30:106,31:[2,57],68:107,69:[1,108]},{31:[2,54],59:[2,54],66:[2,54],69:[2,54],74:[2,54],75:[2,54],76:[2,54],77:[2,54],78:[2,54],79:[2,54]},{31:[2,56],69:[2,56]},{31:[2,63],35:109,68:110,69:[1,108]},{31:[2,60],59:[2,60],66:[2,60],69:[2,60],74:[2,60],75:[2,60],76:[2,60],77:[2,60],78:[2,60],79:[2,60]},{31:[2,62],69:[2,62]},{21:[1,111]},{21:[2,46],59:[2,46],66:[2,46],74:[2,46],75:[2,46],76:[2,46],77:[2,46],78:[2,46],79:[2,46]},{21:[2,48]},{5:[2,21],13:[2,21],14:[2,21],17:[2,21],27:[2,21],32:[2,21],37:[2,21],42:[2,21],45:[2,21],46:[2,21],49:[2,21],53:[2,21]},{21:[2,90],31:[2,90],52:[2,90],62:[2,90],66:[2,90],69:[2,90]},{67:[1,96]},{18:65,57:112,58:66,59:[1,40],66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,22],13:[2,22],14:[2,22],17:[2,22],27:[2,22],32:[2,22],37:[2,22],42:[2,22],45:[2,22],46:[2,22],49:[2,22],53:[2,22]},{31:[1,113]},{45:[2,18]},{45:[2,72]},{18:65,31:[2,67],39:114,57:115,58:66,59:[1,40],63:116,64:67,65:68,66:[1,69],69:[2,67],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,23],13:[2,23],14:[2,23],17:[2,23],27:[2,23],32:[2,23],37:[2,23],42:[2,23],45:[2,23],46:[2,23],49:[2,23],53:[2,23]},{62:[1,117]},{59:[2,86],62:[2,86],66:[2,86],74:[2,86],75:[2,86],76:[2,86],77:[2,86],78:[2,86],79:[2,86]},{62:[2,88]},{31:[1,118]},{31:[2,58]},{66:[1,120],70:119},{31:[1,121]},{31:[2,64]},{14:[2,11]},{21:[2,28],31:[2,28],52:[2,28],62:[2,28],66:[2,28],69:[2,28]},{5:[2,20],13:[2,20],14:[2,20],17:[2,20],27:[2,20],32:[2,20],37:[2,20],42:[2,20],45:[2,20],46:[2,20],49:[2,20],53:[2,20]},{31:[2,69],40:122,68:123,69:[1,108]},{31:[2,66],59:[2,66],66:[2,66],69:[2,66],74:[2,66],75:[2,66],76:[2,66],77:[2,66],78:[2,66],79:[2,66]},{31:[2,68],69:[2,68]},{21:[2,26],31:[2,26],52:[2,26],59:[2,26],62:[2,26],66:[2,26],69:[2,26],74:[2,26],75:[2,26],76:[2,26],77:[2,26],78:[2,26],79:[2,26]},{13:[2,14],14:[2,14],17:[2,14],27:[2,14],32:[2,14],37:[2,14],42:[2,14],45:[2,14],46:[2,14],49:[2,14],53:[2,14]},{66:[1,125],71:[1,124]},{66:[2,91],71:[2,91]},{13:[2,15],14:[2,15],17:[2,15],27:[2,15],32:[2,15],42:[2,15],45:[2,15],46:[2,15],49:[2,15],53:[2,15]},{31:[1,126]},{31:[2,70]},{31:[2,29]},{66:[2,92],71:[2,92]},{13:[2,16],14:[2,16],17:[2,16],27:[2,16],32:[2,16],37:[2,16],42:[2,16],45:[2,16],46:[2,16],49:[2,16],53:[2,16]}], -defaultActions: {4:[2,1],49:[2,50],51:[2,19],55:[2,52],64:[2,76],73:[2,80],78:[2,17],82:[2,84],92:[2,48],99:[2,18],100:[2,72],105:[2,88],107:[2,58],110:[2,64],111:[2,11],123:[2,70],124:[2,29]}, -parseError: function parseError(str, hash) { - throw new Error(str); -}, -parse: function parse(input) { - var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - this.yy.parser = this; - if (typeof this.lexer.yylloc == "undefined") - this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - var ranges = this.lexer.options && this.lexer.options.ranges; - if (typeof this.yy.parseError === "function") - this.parseError = this.yy.parseError; - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - function lex() { - var token; - token = self.lexer.lex() || 1; - if (typeof token !== "number") { - token = self.symbols_[token] || token; - } - return token; - } - var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == "undefined") { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === "undefined" || !action.length || !action[0]) { - var errStr = ""; - if (!recovering) { - expected = []; - for (p in table[state]) - if (this.terminals_[p] && p > 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) - recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column}; - if (ranges) { - yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; - } - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; -} -}; -/* Jison generated lexer */ -var lexer = (function(){ -var lexer = ({EOF:1, -parseError:function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, -setInput:function (input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; - if (this.options.ranges) this.yylloc.range = [0,0]; - this.offset = 0; - return this; - }, -input:function () { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) this.yylloc.range[1]++; - - this._input = this._input.slice(1); - return ch; - }, -unput:function (ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length-len-1); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length-1); - this.matched = this.matched.substr(0, this.matched.length-1); - - if (lines.length-1) this.yylineno -= lines.length-1; - var r = this.yylloc.range; - - this.yylloc = {first_line: this.yylloc.first_line, - last_line: this.yylineno+1, - first_column: this.yylloc.first_column, - last_column: lines ? - (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length: - this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - return this; - }, -more:function () { - this._more = true; - return this; - }, -less:function (n) { - this.unput(this.match.slice(n)); - }, -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); - }, -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c+"^"; - }, -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, - match, - tempMatch, - index, - col, - lines; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i=0;i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = {first_line: this.yylloc.last_line, - last_line: this.yylineno+1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length}; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]); - if (this.done && this._input) this.done = false; - if (token) return token; - else return; - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), - {text: "", token: null, line: this.yylineno}); - } - }, -lex:function lex() { - var r = this.next(); - if (typeof r !== 'undefined') { - return r; - } else { - return this.lex(); - } - }, -begin:function begin(condition) { - this.conditionStack.push(condition); - }, -popState:function popState() { - return this.conditionStack.pop(); - }, -_currentRules:function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; - }, -topState:function () { - return this.conditionStack[this.conditionStack.length-2]; - }, -pushState:function begin(condition) { - this.begin(condition); - }}); -lexer.options = {}; -lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { - - -function strip(start, end) { - return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng-end); -} - - -var YYSTATE=YY_START -switch($avoiding_name_collisions) { -case 0: - if(yy_.yytext.slice(-2) === "\\\\") { - strip(0,1); - this.begin("mu"); - } else if(yy_.yytext.slice(-1) === "\\") { - strip(0,1); - this.begin("emu"); - } else { - this.begin("mu"); - } - if(yy_.yytext) return 14; - -break; -case 1:return 14; -break; -case 2: - this.popState(); - return 14; - -break; -case 3: - yy_.yytext = yy_.yytext.substr(5, yy_.yyleng-9); - this.popState(); - return 16; - -break; -case 4: return 14; -break; -case 5: - this.popState(); - return 13; - -break; -case 6:return 59; -break; -case 7:return 62; -break; -case 8: return 17; -break; -case 9: - this.popState(); - this.begin('raw'); - return 21; - -break; -case 10:return 53; -break; -case 11:return 27; -break; -case 12:return 45; -break; -case 13:this.popState(); return 42; -break; -case 14:this.popState(); return 42; -break; -case 15:return 32; -break; -case 16:return 37; -break; -case 17:return 49; -break; -case 18:return 46; -break; -case 19: - this.unput(yy_.yytext); - this.popState(); - this.begin('com'); - -break; -case 20: - this.popState(); - return 13; - -break; -case 21:return 46; -break; -case 22:return 67; -break; -case 23:return 66; -break; -case 24:return 66; -break; -case 25:return 81; -break; -case 26:// ignore whitespace -break; -case 27:this.popState(); return 52; -break; -case 28:this.popState(); return 31; -break; -case 29:yy_.yytext = strip(1,2).replace(/\\"/g,'"'); return 74; -break; -case 30:yy_.yytext = strip(1,2).replace(/\\'/g,"'"); return 74; -break; -case 31:return 79; -break; -case 32:return 76; -break; -case 33:return 76; -break; -case 34:return 77; -break; -case 35:return 78; -break; -case 36:return 75; -break; -case 37:return 69; -break; -case 38:return 71; -break; -case 39:return 66; -break; -case 40:return 66; -break; -case 41:return 'INVALID'; -break; -case 42:return 5; -break; -} -}; -lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{\/)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/]; -lexer.conditions = {"mu":{"rules":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"com":{"rules":[5],"inclusive":false},"raw":{"rules":[3,4],"inclusive":false},"INITIAL":{"rules":[0,1,42],"inclusive":true}}; -return lexer;})() -parser.lexer = lexer; -function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser; -return new Parser; -})();export default handlebars; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/printer.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/printer.js deleted file mode 100644 index 691a356..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/printer.js +++ /dev/null @@ -1,151 +0,0 @@ -/*eslint-disable new-cap */ -import Visitor from './visitor'; - -export function print(ast) { - return new PrintVisitor().accept(ast); -} - -export function PrintVisitor() { - this.padding = 0; -} - -PrintVisitor.prototype = new Visitor(); - -PrintVisitor.prototype.pad = function(string) { - let out = ''; - - for (let i = 0, l = this.padding; i < l; i++) { - out = out + ' '; - } - - out = out + string + '\n'; - return out; -}; - -PrintVisitor.prototype.Program = function(program) { - let out = '', - body = program.body, - i, l; - - if (program.blockParams) { - let blockParams = 'BLOCK PARAMS: ['; - for (i = 0, l = program.blockParams.length; i < l; i++) { - blockParams += ' ' + program.blockParams[i]; - } - blockParams += ' ]'; - out += this.pad(blockParams); - } - - for (i = 0, l = body.length; i < l; i++) { - out = out + this.accept(body[i]); - } - - this.padding--; - - return out; -}; - -PrintVisitor.prototype.MustacheStatement = function(mustache) { - return this.pad('{{ ' + this.SubExpression(mustache) + ' }}'); -}; - -PrintVisitor.prototype.BlockStatement = function(block) { - let out = ''; - - out = out + this.pad('BLOCK:'); - this.padding++; - out = out + this.pad(this.SubExpression(block)); - if (block.program) { - out = out + this.pad('PROGRAM:'); - this.padding++; - out = out + this.accept(block.program); - this.padding--; - } - if (block.inverse) { - if (block.program) { this.padding++; } - out = out + this.pad('{{^}}'); - this.padding++; - out = out + this.accept(block.inverse); - this.padding--; - if (block.program) { this.padding--; } - } - this.padding--; - - return out; -}; - -PrintVisitor.prototype.PartialStatement = function(partial) { - let content = 'PARTIAL:' + partial.name.original; - if (partial.params[0]) { - content += ' ' + this.accept(partial.params[0]); - } - if (partial.hash) { - content += ' ' + this.accept(partial.hash); - } - return this.pad('{{> ' + content + ' }}'); -}; - -PrintVisitor.prototype.ContentStatement = function(content) { - return this.pad("CONTENT[ '" + content.value + "' ]"); -}; - -PrintVisitor.prototype.CommentStatement = function(comment) { - return this.pad("{{! '" + comment.value + "' }}"); -}; - -PrintVisitor.prototype.SubExpression = function(sexpr) { - let params = sexpr.params, - paramStrings = [], - hash; - - for (let i = 0, l = params.length; i < l; i++) { - paramStrings.push(this.accept(params[i])); - } - - params = '[' + paramStrings.join(', ') + ']'; - - hash = sexpr.hash ? ' ' + this.accept(sexpr.hash) : ''; - - return this.accept(sexpr.path) + ' ' + params + hash; -}; - -PrintVisitor.prototype.PathExpression = function(id) { - let path = id.parts.join('/'); - return (id.data ? '@' : '') + 'PATH:' + path; -}; - - -PrintVisitor.prototype.StringLiteral = function(string) { - return '"' + string.value + '"'; -}; - -PrintVisitor.prototype.NumberLiteral = function(number) { - return 'NUMBER{' + number.value + '}'; -}; - -PrintVisitor.prototype.BooleanLiteral = function(bool) { - return 'BOOLEAN{' + bool.value + '}'; -}; - -PrintVisitor.prototype.UndefinedLiteral = function() { - return 'UNDEFINED'; -}; - -PrintVisitor.prototype.NullLiteral = function() { - return 'NULL'; -}; - -PrintVisitor.prototype.Hash = function(hash) { - let pairs = hash.pairs, - joinedPairs = []; - - for (let i = 0, l = pairs.length; i < l; i++) { - joinedPairs.push(this.accept(pairs[i])); - } - - return 'HASH{' + joinedPairs.join(', ') + '}'; -}; -PrintVisitor.prototype.HashPair = function(pair) { - return pair.key + '=' + this.accept(pair.value); -}; -/*eslint-enable new-cap */ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/visitor.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/visitor.js deleted file mode 100644 index ba7b376..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/visitor.js +++ /dev/null @@ -1,119 +0,0 @@ -import Exception from '../exception'; -import AST from './ast'; - -function Visitor() { - this.parents = []; -} - -Visitor.prototype = { - constructor: Visitor, - mutating: false, - - // Visits a given value. If mutating, will replace the value if necessary. - acceptKey: function(node, name) { - let value = this.accept(node[name]); - if (this.mutating) { - // Hacky sanity check: - if (value && (!value.type || !AST[value.type])) { - throw new Exception('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); - } - node[name] = value; - } - }, - - // Performs an accept operation with added sanity check to ensure - // required keys are not removed. - acceptRequired: function(node, name) { - this.acceptKey(node, name); - - if (!node[name]) { - throw new Exception(node.type + ' requires ' + name); - } - }, - - // Traverses a given array. If mutating, empty respnses will be removed - // for child elements. - acceptArray: function(array) { - for (let i = 0, l = array.length; i < l; i++) { - this.acceptKey(array, i); - - if (!array[i]) { - array.splice(i, 1); - i--; - l--; - } - } - }, - - accept: function(object) { - if (!object) { - return; - } - - if (this.current) { - this.parents.unshift(this.current); - } - this.current = object; - - let ret = this[object.type](object); - - this.current = this.parents.shift(); - - if (!this.mutating || ret) { - return ret; - } else if (ret !== false) { - return object; - } - }, - - Program: function(program) { - this.acceptArray(program.body); - }, - - MustacheStatement: function(mustache) { - this.acceptRequired(mustache, 'path'); - this.acceptArray(mustache.params); - this.acceptKey(mustache, 'hash'); - }, - - BlockStatement: function(block) { - this.acceptRequired(block, 'path'); - this.acceptArray(block.params); - this.acceptKey(block, 'hash'); - - this.acceptKey(block, 'program'); - this.acceptKey(block, 'inverse'); - }, - - PartialStatement: function(partial) { - this.acceptRequired(partial, 'name'); - this.acceptArray(partial.params); - this.acceptKey(partial, 'hash'); - }, - - ContentStatement: function(/* content */) {}, - CommentStatement: function(/* comment */) {}, - - SubExpression: function(sexpr) { - this.acceptRequired(sexpr, 'path'); - this.acceptArray(sexpr.params); - this.acceptKey(sexpr, 'hash'); - }, - - PathExpression: function(/* path */) {}, - - StringLiteral: function(/* string */) {}, - NumberLiteral: function(/* number */) {}, - BooleanLiteral: function(/* bool */) {}, - UndefinedLiteral: function(/* literal */) {}, - NullLiteral: function(/* literal */) {}, - - Hash: function(hash) { - this.acceptArray(hash.pairs); - }, - HashPair: function(pair) { - this.acceptRequired(pair, 'value'); - } -}; - -export default Visitor; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/whitespace-control.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/whitespace-control.js deleted file mode 100644 index 5b76944..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/whitespace-control.js +++ /dev/null @@ -1,208 +0,0 @@ -import Visitor from './visitor'; - -function WhitespaceControl() { -} -WhitespaceControl.prototype = new Visitor(); - -WhitespaceControl.prototype.Program = function(program) { - let isRoot = !this.isRootSeen; - this.isRootSeen = true; - - let body = program.body; - for (let i = 0, l = body.length; i < l; i++) { - let current = body[i], - strip = this.accept(current); - - if (!strip) { - continue; - } - - let _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), - _isNextWhitespace = isNextWhitespace(body, i, isRoot), - - openStandalone = strip.openStandalone && _isPrevWhitespace, - closeStandalone = strip.closeStandalone && _isNextWhitespace, - inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; - - if (strip.close) { - omitRight(body, i, true); - } - if (strip.open) { - omitLeft(body, i, true); - } - - if (inlineStandalone) { - omitRight(body, i); - - if (omitLeft(body, i)) { - // If we are on a standalone node, save the indent info for partials - if (current.type === 'PartialStatement') { - // Pull out the whitespace from the final line - current.indent = (/([ \t]+$)/).exec(body[i - 1].original)[1]; - } - } - } - if (openStandalone) { - omitRight((current.program || current.inverse).body); - - // Strip out the previous content node if it's whitespace only - omitLeft(body, i); - } - if (closeStandalone) { - // Always strip the next node - omitRight(body, i); - - omitLeft((current.inverse || current.program).body); - } - } - - return program; -}; -WhitespaceControl.prototype.BlockStatement = function(block) { - this.accept(block.program); - this.accept(block.inverse); - - // Find the inverse program that is involed with whitespace stripping. - let program = block.program || block.inverse, - inverse = block.program && block.inverse, - firstInverse = inverse, - lastInverse = inverse; - - if (inverse && inverse.chained) { - firstInverse = inverse.body[0].program; - - // Walk the inverse chain to find the last inverse that is actually in the chain. - while (lastInverse.chained) { - lastInverse = lastInverse.body[lastInverse.body.length - 1].program; - } - } - - let strip = { - open: block.openStrip.open, - close: block.closeStrip.close, - - // Determine the standalone candiacy. Basically flag our content as being possibly standalone - // so our parent can determine if we actually are standalone - openStandalone: isNextWhitespace(program.body), - closeStandalone: isPrevWhitespace((firstInverse || program).body) - }; - - if (block.openStrip.close) { - omitRight(program.body, null, true); - } - - if (inverse) { - let inverseStrip = block.inverseStrip; - - if (inverseStrip.open) { - omitLeft(program.body, null, true); - } - - if (inverseStrip.close) { - omitRight(firstInverse.body, null, true); - } - if (block.closeStrip.open) { - omitLeft(lastInverse.body, null, true); - } - - // Find standalone else statments - if (isPrevWhitespace(program.body) - && isNextWhitespace(firstInverse.body)) { - omitLeft(program.body); - omitRight(firstInverse.body); - } - } else if (block.closeStrip.open) { - omitLeft(program.body, null, true); - } - - return strip; -}; - -WhitespaceControl.prototype.MustacheStatement = function(mustache) { - return mustache.strip; -}; - -WhitespaceControl.prototype.PartialStatement = - WhitespaceControl.prototype.CommentStatement = function(node) { - /* istanbul ignore next */ - let strip = node.strip || {}; - return { - inlineStandalone: true, - open: strip.open, - close: strip.close - }; -}; - - -function isPrevWhitespace(body, i, isRoot) { - if (i === undefined) { - i = body.length; - } - - // Nodes that end with newlines are considered whitespace (but are special - // cased for strip operations) - let prev = body[i - 1], - sibling = body[i - 2]; - if (!prev) { - return isRoot; - } - - if (prev.type === 'ContentStatement') { - return (sibling || !isRoot ? (/\r?\n\s*?$/) : (/(^|\r?\n)\s*?$/)).test(prev.original); - } -} -function isNextWhitespace(body, i, isRoot) { - if (i === undefined) { - i = -1; - } - - let next = body[i + 1], - sibling = body[i + 2]; - if (!next) { - return isRoot; - } - - if (next.type === 'ContentStatement') { - return (sibling || !isRoot ? (/^\s*?\r?\n/) : (/^\s*?(\r?\n|$)/)).test(next.original); - } -} - -// Marks the node to the right of the position as omitted. -// I.e. {{foo}}' ' will mark the ' ' node as omitted. -// -// If i is undefined, then the first child will be marked as such. -// -// If mulitple is truthy then all whitespace will be stripped out until non-whitespace -// content is met. -function omitRight(body, i, multiple) { - let current = body[i == null ? 0 : i + 1]; - if (!current || current.type !== 'ContentStatement' || (!multiple && current.rightStripped)) { - return; - } - - let original = current.value; - current.value = current.value.replace(multiple ? (/^\s+/) : (/^[ \t]*\r?\n?/), ''); - current.rightStripped = current.value !== original; -} - -// Marks the node to the left of the position as omitted. -// I.e. ' '{{foo}} will mark the ' ' node as omitted. -// -// If i is undefined then the last child will be marked as such. -// -// If mulitple is truthy then all whitespace will be stripped out until non-whitespace -// content is met. -function omitLeft(body, i, multiple) { - let current = body[i == null ? body.length - 1 : i - 1]; - if (!current || current.type !== 'ContentStatement' || (!multiple && current.leftStripped)) { - return; - } - - // We omit the last node if it's whitespace only and not preceeded by a non-content node. - let original = current.value; - current.value = current.value.replace(multiple ? (/\s+$/) : (/[ \t]+$/), ''); - current.leftStripped = current.value !== original; - return current.leftStripped; -} - -export default WhitespaceControl; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/exception.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/exception.js deleted file mode 100644 index 46ce18e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/exception.js +++ /dev/null @@ -1,34 +0,0 @@ - -const errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - -function Exception(message, node) { - let loc = node && node.loc, - line, - column; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - let tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (let idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } -} - -Exception.prototype = new Error(); - -export default Exception; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/no-conflict.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/no-conflict.js deleted file mode 100644 index a421f57..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/no-conflict.js +++ /dev/null @@ -1,12 +0,0 @@ -/*global window */ -export default function(Handlebars) { - /* istanbul ignore next */ - let root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function() { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/runtime.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/runtime.js deleted file mode 100644 index 874728f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/runtime.js +++ /dev/null @@ -1,214 +0,0 @@ -import * as Utils from './utils'; -import Exception from './exception'; -import { COMPILER_REVISION, REVISION_CHANGES, createFrame } from './base'; - -export function checkRevision(compilerInfo) { - const compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - const runtimeVersions = REVISION_CHANGES[currentRevision], - compilerVersions = REVISION_CHANGES[compilerRevision]; - throw new Exception('Template was precompiled with an older version of Handlebars than the current runtime. ' + - 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new Exception('Template was precompiled with a newer version of Handlebars than the current runtime. ' + - 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } -} - -// TODO: Remove this line and break up compilePartial - -export function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new Exception('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new Exception('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = Utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - let result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - let lines = result.split('\n'); - for (let i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new Exception('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - let container = { - strict: function(obj, name) { - if (!(name in obj)) { - throw new Exception('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function(depths, name) { - const len = depths.length; - for (let i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: Utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function(i) { - return templateSpec[i]; - }, - - programs: [], - program: function(i, data, declaredBlockParams, blockParams, depths) { - let programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function(param, common) { - let obj = param || common; - - if (param && common && (param !== common)) { - obj = Utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context, options = {}) { - let data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - let depths, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function(options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function(i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new Exception('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new Exception('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; -} - -export function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context, options = {}) { - return fn.call(container, - context, - container.helpers, container.partials, - options.data || data, - blockParams && [options.blockParams].concat(blockParams), - depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; -} - -export function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; -} - -export function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new Exception('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } -} - -export function noop() { return ''; } - -function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? createFrame(data) : {}; - data.root = context; - } - return data; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/safe-string.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/safe-string.js deleted file mode 100644 index 4680194..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/safe-string.js +++ /dev/null @@ -1,10 +0,0 @@ -// Build out our basic SafeString type -function SafeString(string) { - this.string = string; -} - -SafeString.prototype.toString = SafeString.prototype.toHTML = function() { - return '' + this.string; -}; - -export default SafeString; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/utils.js deleted file mode 100644 index c522394..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/utils.js +++ /dev/null @@ -1,101 +0,0 @@ -const escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '`': '`' -}; - -const badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - -function escapeChar(chr) { - return escape[chr]; -} - -export function extend(obj /* , ...source */) { - for (let i = 1; i < arguments.length; i++) { - for (let key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; -} - -export let toString = Object.prototype.toString; - -// Sourced from lodash -// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt -/*eslint-disable func-style, no-var */ -var isFunction = function(value) { - return typeof value === 'function'; -}; -// fallback for older versions of Chrome and Safari -/* istanbul ignore next */ -if (isFunction(/x/)) { - isFunction = function(value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; -} -export var isFunction; -/*eslint-enable func-style, no-var */ - -/* istanbul ignore next */ -export const isArray = Array.isArray || function(value) { - return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false; -}; - -// Older IE versions do not directly support indexOf so we must implement our own, sadly. -export function indexOf(array, value) { - for (let i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; -} - - -export function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { return string; } - return string.replace(badChars, escapeChar); -} - -export function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } -} - -export function blockParams(params, ids) { - params.path = ids; - return params; -} - -export function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/index.js deleted file mode 100644 index 0383c02..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/index.js +++ /dev/null @@ -1,25 +0,0 @@ -// USAGE: -// var handlebars = require('handlebars'); -/* eslint-disable no-var */ - -// var local = handlebars.create(); - -var handlebars = require('../dist/cjs/handlebars')['default']; - -var printer = require('../dist/cjs/handlebars/compiler/printer'); -handlebars.PrintVisitor = printer.PrintVisitor; -handlebars.print = printer.print; - -module.exports = handlebars; - -// Publish a Node.js require() handler for .handlebars and .hbs files -function extension(module, filename) { - var fs = require('fs'); - var templateString = fs.readFileSync(filename, 'utf8'); - module.exports = handlebars.compile(templateString); -} -/* istanbul ignore else */ -if (typeof require !== 'undefined' && require.extensions) { - require.extensions['.handlebars'] = extension; - require.extensions['.hbs'] = extension; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/precompiler.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/precompiler.js deleted file mode 100644 index 48cfebd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/lib/precompiler.js +++ /dev/null @@ -1,178 +0,0 @@ -/*eslint-disable no-console */ -import fs from 'fs'; -import * as Handlebars from './handlebars'; -import {basename} from 'path'; -import {SourceMapConsumer, SourceNode} from 'source-map'; -import uglify from 'uglify-js'; - -module.exports.cli = function(opts) { - if (opts.version) { - console.log(Handlebars.VERSION); - return; - } - - if (!opts.templates.length) { - throw new Handlebars.Exception('Must define at least one template or directory.'); - } - - opts.templates.forEach(function(template) { - try { - fs.statSync(template); - } catch (err) { - throw new Handlebars.Exception(`Unable to open template file "${template}"`); - } - }); - - if (opts.simple && opts.min) { - throw new Handlebars.Exception('Unable to minimize simple output'); - } - if (opts.simple && (opts.templates.length !== 1 || fs.statSync(opts.templates[0]).isDirectory())) { - throw new Handlebars.Exception('Unable to output multiple templates in simple mode'); - } - - // Convert the known list into a hash - let known = {}; - if (opts.known && !Array.isArray(opts.known)) { - opts.known = [opts.known]; - } - if (opts.known) { - for (let i = 0, len = opts.known.length; i < len; i++) { - known[opts.known[i]] = true; - } - } - - // Build file extension pattern - let extension = opts.extension.replace(/[\\^$*+?.():=!|{}\-\[\]]/g, function(arg) { return '\\' + arg; }); - extension = new RegExp('\\.' + extension + '$'); - - let output = new SourceNode(); - if (!opts.simple) { - if (opts.amd) { - output.add('define([\'' + opts.handlebarPath + 'handlebars.runtime\'], function(Handlebars) {\n Handlebars = Handlebars["default"];'); - } else if (opts.commonjs) { - output.add('var Handlebars = require("' + opts.commonjs + '");'); - } else { - output.add('(function() {\n'); - } - output.add(' var template = Handlebars.template, templates = '); - if (opts.namespace) { - output.add(opts.namespace); - output.add(' = '); - output.add(opts.namespace); - output.add(' || '); - } - output.add('{};\n'); - } - function processTemplate(template, root) { - let path = template, - stat = fs.statSync(path); - if (stat.isDirectory()) { - fs.readdirSync(template).map(function(file) { - let childPath = template + '/' + file; - - if (extension.test(childPath) || fs.statSync(childPath).isDirectory()) { - processTemplate(childPath, root || template); - } - }); - } else { - let data = fs.readFileSync(path, 'utf8'); - - if (opts.bom && data.indexOf('\uFEFF') === 0) { - data = data.substring(1); - } - - let options = { - knownHelpers: known, - knownHelpersOnly: opts.o - }; - - if (opts.map) { - options.srcName = path; - } - if (opts.data) { - options.data = true; - } - - // Clean the template name - if (!root) { - template = basename(template); - } else if (template.indexOf(root) === 0) { - template = template.substring(root.length + 1); - } - template = template.replace(extension, ''); - - let precompiled = Handlebars.precompile(data, options); - - // If we are generating a source map, we have to reconstruct the SourceNode object - if (opts.map) { - let consumer = new SourceMapConsumer(precompiled.map); - precompiled = SourceNode.fromStringWithSourceMap(precompiled.code, consumer); - } - - if (opts.simple) { - output.add([precompiled, '\n']); - } else if (opts.partial) { - if (opts.amd && (opts.templates.length == 1 && !fs.statSync(opts.templates[0]).isDirectory())) { - output.add('return '); - } - output.add(['Handlebars.partials[\'', template, '\'] = template(', precompiled, ');\n']); - } else { - if (opts.amd && (opts.templates.length == 1 && !fs.statSync(opts.templates[0]).isDirectory())) { - output.add('return '); - } - output.add(['templates[\'', template, '\'] = template(', precompiled, ');\n']); - } - } - } - - opts.templates.forEach(function(template) { - processTemplate(template, opts.root); - }); - - // Output the content - if (!opts.simple) { - if (opts.amd) { - if (opts.templates.length > 1 || (opts.templates.length == 1 && fs.statSync(opts.templates[0]).isDirectory())) { - if (opts.partial) { - output.add('return Handlebars.partials;\n'); - } else { - output.add('return templates;\n'); - } - } - output.add('});'); - } else if (!opts.commonjs) { - output.add('})();'); - } - } - - - if (opts.map) { - output.add('\n//# sourceMappingURL=' + opts.map + '\n'); - } - - output = output.toStringWithSourceMap(); - output.map = output.map + ''; - - if (opts.min) { - output = uglify.minify(output.code, { - fromString: true, - - outSourceMap: opts.map, - inSourceMap: JSON.parse(output.map) - }); - if (opts.map) { - output.code += '\n//# sourceMappingURL=' + opts.map + '\n'; - } - } - - if (opts.map) { - fs.writeFileSync(opts.map, output.map, 'utf8'); - } - output = output.code; - - if (opts.output) { - fs.writeFileSync(opts.output, output, 'utf8'); - } else { - console.log(output); - } -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/.bin/uglifyjs b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/.bin/uglifyjs deleted file mode 120000 index fef3468..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/.bin/uglifyjs +++ /dev/null @@ -1 +0,0 @@ -../uglify-js/bin/uglifyjs \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/.travis.yml deleted file mode 100644 index cc4dba2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/LICENSE deleted file mode 100644 index 432d1ae..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright 2010 James Halliday (mail@substack.net) - -This project is free software released under the MIT/X11 license: - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/bool.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/bool.js deleted file mode 100644 index a998fb7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/bool.js +++ /dev/null @@ -1,10 +0,0 @@ -#!/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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_double.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_double.js deleted file mode 100644 index a35a7e6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_double.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_single.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_single.js deleted file mode 100644 index 017bb68..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_single.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var argv = require('optimist') - .boolean('v') - .argv -; -console.dir(argv.v); -console.dir(argv._); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_hash.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_hash.js deleted file mode 100644 index ade7768..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_hash.js +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env node - -var argv = require('optimist') - .default({ x : 10, y : 10 }) - .argv -; - -console.log(argv.x + argv.y); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_singles.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_singles.js deleted file mode 100644 index d9b1ff4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_singles.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var argv = require('optimist') - .default('x', 10) - .default('y', 10) - .argv -; -console.log(argv.x + argv.y); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/divide.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/divide.js deleted file mode 100644 index 5e2ee82..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/divide.js +++ /dev/null @@ -1,8 +0,0 @@ -#!/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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count.js deleted file mode 100644 index b5f95bf..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count.js +++ /dev/null @@ -1,20 +0,0 @@ -#!/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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_options.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_options.js deleted file mode 100644 index d9ac709..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_options.js +++ /dev/null @@ -1,29 +0,0 @@ -#!/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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_wrap.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_wrap.js deleted file mode 100644 index 4267511..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_wrap.js +++ /dev/null @@ -1,29 +0,0 @@ -#!/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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/nonopt.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/nonopt.js deleted file mode 100644 index ee633ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/nonopt.js +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env node -var argv = require('optimist').argv; -console.log('(%d,%d)', argv.x, argv.y); -console.log(argv._); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/reflect.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/reflect.js deleted file mode 100644 index 816b3e1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/reflect.js +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -console.dir(require('optimist').argv); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/short.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/short.js deleted file mode 100644 index 1db0ad0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/short.js +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node -var argv = require('optimist').argv; -console.log('(%d,%d)', argv.x, argv.y); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/string.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/string.js deleted file mode 100644 index a8e5aeb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/string.js +++ /dev/null @@ -1,11 +0,0 @@ -#!/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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/usage-options.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/usage-options.js deleted file mode 100644 index b999977..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/usage-options.js +++ /dev/null @@ -1,19 +0,0 @@ -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/xup.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/xup.js deleted file mode 100644 index 8f6ecd2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/xup.js +++ /dev/null @@ -1,10 +0,0 @@ -#!/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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/index.js deleted file mode 100644 index 4da5a6d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/index.js +++ /dev/null @@ -1,343 +0,0 @@ -var path = require('path'); -var minimist = require('minimist'); -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 (processArgs, 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 options = { - boolean: [], - string: [], - alias: {}, - default: [] - }; - - self.boolean = function (bools) { - options.boolean.push.apply(options.boolean, [].concat(bools)); - return self; - }; - - self.string = function (strings) { - options.string.push.apply(options.string, [].concat(strings)); - return self; - }; - - self.default = function (key, value) { - if (typeof key === 'object') { - Object.keys(key).forEach(function (k) { - self.default(k, key[k]); - }); - } - else { - options.default[key] = value; - } - return self; - }; - - self.alias = function (x, y) { - if (typeof x === 'object') { - Object.keys(x).forEach(function (key) { - self.alias(key, x[key]); - }); - } - else { - options.alias[x] = (options.alias[x] || []).concat(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 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 parseArgs(args); - }; - - 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(options.default)) - .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(options.alias[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 (options.boolean[key]) type = '[boolean]'; - if (options.string[key]) type = '[string]'; - - if (!wrap && dpadding.length > 0) { - desc += dpadding; - } - - var prelude = ' ' + kswitch + spadding; - var extra = [ - type, - demanded[key] - ? '[required]' - : null - , - options.default[key] !== undefined - ? '[default: ' + JSON.stringify(options.default[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 : function () { return parseArgs(processArgs) }, - enumerable : true, - }); - - function parseArgs (args) { - var argv = minimist(args, options); - argv.$0 = self.$0; - - 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; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/.travis.yml deleted file mode 100644 index cc4dba2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/LICENSE deleted file mode 100644 index ee27ba4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -This software is released under the MIT 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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/example/parse.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/example/parse.js deleted file mode 100644 index abff3e8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/example/parse.js +++ /dev/null @@ -1,2 +0,0 @@ -var argv = require('../')(process.argv.slice(2)); -console.dir(argv); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/index.js deleted file mode 100644 index 71fb830..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/index.js +++ /dev/null @@ -1,187 +0,0 @@ -module.exports = function (args, opts) { - if (!opts) opts = {}; - - var flags = { bools : {}, strings : {} }; - - [].concat(opts['boolean']).filter(Boolean).forEach(function (key) { - flags.bools[key] = true; - }); - - var aliases = {}; - Object.keys(opts.alias || {}).forEach(function (key) { - aliases[key] = [].concat(opts.alias[key]); - aliases[key].forEach(function (x) { - aliases[x] = [key].concat(aliases[key].filter(function (y) { - return x !== y; - })); - }); - }); - - [].concat(opts.string).filter(Boolean).forEach(function (key) { - flags.strings[key] = true; - if (aliases[key]) { - flags.strings[aliases[key]] = true; - } - }); - - var defaults = opts['default'] || {}; - - var argv = { _ : [] }; - Object.keys(flags.bools).forEach(function (key) { - setArg(key, defaults[key] === undefined ? false : defaults[key]); - }); - - var notFlags = []; - - if (args.indexOf('--') !== -1) { - notFlags = args.slice(args.indexOf('--')+1); - args = args.slice(0, args.indexOf('--')); - } - - function setArg (key, val) { - var value = !flags.strings[key] && isNumber(val) - ? Number(val) : val - ; - setKey(argv, key.split('.'), value); - - (aliases[key] || []).forEach(function (x) { - setKey(argv, x.split('.'), value); - }); - } - - for (var i = 0; i < args.length; i++) { - var arg = args[i]; - - if (/^--.+=/.test(arg)) { - // 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 (/^--no-.+/.test(arg)) { - var key = arg.match(/^--no-(.+)/)[1]; - setArg(key, false); - } - else if (/^--.+/.test(arg)) { - var key = arg.match(/^--(.+)/)[1]; - var next = args[i + 1]; - if (next !== undefined && !/^-/.test(next) - && !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, flags.strings[key] ? '' : true); - } - } - else if (/^-[^-]+/.test(arg)) { - 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 (next === '-') { - setArg(letters[j], next) - continue; - } - - if (/[A-Za-z]/.test(letters[j]) - && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) { - setArg(letters[j], next); - broken = true; - break; - } - - if (letters[j+1] && letters[j+1].match(/\W/)) { - setArg(letters[j], arg.slice(j+2)); - broken = true; - break; - } - else { - setArg(letters[j], flags.strings[letters[j]] ? '' : true); - } - } - - var key = arg.slice(-1)[0]; - if (!broken && key !== '-') { - if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1]) - && !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, flags.strings[key] ? '' : true); - } - } - } - else { - argv._.push( - flags.strings['_'] || !isNumber(arg) ? arg : Number(arg) - ); - } - } - - Object.keys(defaults).forEach(function (key) { - if (!hasKey(argv, key.split('.'))) { - setKey(argv, key.split('.'), defaults[key]); - - (aliases[key] || []).forEach(function (x) { - setKey(argv, x.split('.'), defaults[key]); - }); - } - }); - - notFlags.forEach(function(key) { - argv._.push(key); - }); - - return argv; -}; - -function hasKey (obj, keys) { - var o = obj; - keys.slice(0,-1).forEach(function (key) { - o = (o[key] || {}); - }); - - var key = keys[keys.length - 1]; - return key in o; -} - -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 ]; - } -} - -function isNumber (x) { - if (typeof x === 'number') return true; - if (/^0x[0-9a-f]+$/i.test(x)) return true; - return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x); -} - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/package.json deleted file mode 100644 index 6c08d0a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "minimist", - "version": "0.0.10", - "description": "parse argument options", - "main": "index.js", - "devDependencies": { - "tape": "~1.0.4", - "tap": "~0.4.0" - }, - "scripts": { - "test": "tap test/*.js" - }, - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/6..latest", - "ff/5", - "firefox/latest", - "chrome/10", - "chrome/latest", - "safari/5.1", - "safari/latest", - "opera/12" - ] - }, - "repository": { - "type": "git", - "url": "git://github.com/substack/minimist.git" - }, - "homepage": "https://github.com/substack/minimist", - "keywords": [ - "argv", - "getopt", - "parser", - "optimist" - ], - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/substack/minimist/issues" - }, - "_id": "minimist@0.0.10", - "dist": { - "shasum": "de3f98543dbf96082be48ad1a0c7cda836301dcf", - "tarball": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" - }, - "_from": "minimist@>=0.0.1 <0.1.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "substack", - "email": "mail@substack.net" - }, - "maintainers": [ - { - "name": "substack", - "email": "mail@substack.net" - } - ], - "directories": {}, - "_shasum": "de3f98543dbf96082be48ad1a0c7cda836301dcf", - "_resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/readme.markdown b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/readme.markdown deleted file mode 100644 index c256353..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/readme.markdown +++ /dev/null @@ -1,73 +0,0 @@ -# minimist - -parse argument options - -This module is the guts of optimist's argument parser without all the -fanciful decoration. - -[![browser support](https://ci.testling.com/substack/minimist.png)](http://ci.testling.com/substack/minimist) - -[![build status](https://secure.travis-ci.org/substack/minimist.png)](http://travis-ci.org/substack/minimist) - -# example - -``` js -var argv = require('minimist')(process.argv.slice(2)); -console.dir(argv); -``` - -``` -$ node example/parse.js -a beep -b boop -{ _: [], a: 'beep', b: 'boop' } -``` - -``` -$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz -{ _: [ 'foo', 'bar', 'baz' ], - x: 3, - y: 4, - n: 5, - a: true, - b: true, - c: true, - beep: 'boop' } -``` - -# methods - -``` js -var parseArgs = require('minimist') -``` - -## var argv = parseArgs(args, opts={}) - -Return an argument object `argv` populated with the array arguments from `args`. - -`argv._` contains all the arguments that didn't have an option associated with -them. - -Numeric-looking arguments will be returned as numbers unless `opts.string` or -`opts.boolean` is set for that argument name. - -Any arguments after `'--'` will not be parsed and will end up in `argv._`. - -options can be: - -* `opts.string` - a string or array of strings argument names to always treat as -strings -* `opts.boolean` - a string or array of strings to always treat as booleans -* `opts.alias` - an object mapping string names to strings or arrays of string -argument names to use as aliases -* `opts.default` - an object mapping string argument names to default values - -# install - -With [npm](https://npmjs.org) do: - -``` -npm install minimist -``` - -# license - -MIT diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/bool.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/bool.js deleted file mode 100644 index 749e083..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/bool.js +++ /dev/null @@ -1,119 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('flag boolean default false', function (t) { - var argv = parse(['moo'], { - boolean: ['t', 'verbose'], - default: { verbose: false, t: false } - }); - - t.deepEqual(argv, { - verbose: false, - t: false, - _: ['moo'] - }); - - t.deepEqual(typeof argv.verbose, 'boolean'); - t.deepEqual(typeof argv.t, 'boolean'); - t.end(); - -}); - -test('boolean groups', function (t) { - var argv = parse([ '-x', '-z', 'one', 'two', 'three' ], { - boolean: ['x','y','z'] - }); - - t.deepEqual(argv, { - x : true, - y : false, - z : true, - _ : [ 'one', 'two', 'three' ] - }); - - t.deepEqual(typeof argv.x, 'boolean'); - t.deepEqual(typeof argv.y, 'boolean'); - t.deepEqual(typeof argv.z, 'boolean'); - t.end(); -}); -test('boolean and alias with chainable api', function (t) { - var aliased = [ '-h', 'derp' ]; - var regular = [ '--herp', 'derp' ]; - var opts = { - herp: { alias: 'h', boolean: true } - }; - var aliasedArgv = parse(aliased, { - boolean: 'herp', - alias: { h: 'herp' } - }); - var propertyArgv = parse(regular, { - boolean: 'herp', - alias: { h: 'herp' } - }); - var expected = { - herp: true, - h: true, - '_': [ 'derp' ] - }; - - t.same(aliasedArgv, expected); - t.same(propertyArgv, expected); - t.end(); -}); - -test('boolean and alias with options hash', function (t) { - var aliased = [ '-h', 'derp' ]; - var regular = [ '--herp', 'derp' ]; - var opts = { - alias: { 'h': 'herp' }, - boolean: 'herp' - }; - var aliasedArgv = parse(aliased, opts); - var propertyArgv = parse(regular, opts); - var expected = { - herp: true, - h: true, - '_': [ 'derp' ] - }; - t.same(aliasedArgv, expected); - t.same(propertyArgv, expected); - t.end(); -}); - -test('boolean and alias using explicit true', function (t) { - var aliased = [ '-h', 'true' ]; - var regular = [ '--herp', 'true' ]; - var opts = { - alias: { h: 'herp' }, - boolean: 'h' - }; - var aliasedArgv = parse(aliased, opts); - var propertyArgv = parse(regular, opts); - var expected = { - herp: true, - h: true, - '_': [ ] - }; - - t.same(aliasedArgv, expected); - t.same(propertyArgv, expected); - t.end(); -}); - -// regression, see https://github.com/substack/node-optimist/issues/71 -test('boolean and --x=true', function(t) { - var parsed = parse(['--boool', '--other=true'], { - boolean: 'boool' - }); - - t.same(parsed.boool, true); - t.same(parsed.other, 'true'); - - parsed = parse(['--boool', '--other=false'], { - boolean: 'boool' - }); - - t.same(parsed.boool, true); - t.same(parsed.other, 'false'); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dash.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dash.js deleted file mode 100644 index 8b034b9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dash.js +++ /dev/null @@ -1,24 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('-', function (t) { - t.plan(5); - t.deepEqual(parse([ '-n', '-' ]), { n: '-', _: [] }); - t.deepEqual(parse([ '-' ]), { _: [ '-' ] }); - t.deepEqual(parse([ '-f-' ]), { f: '-', _: [] }); - t.deepEqual( - parse([ '-b', '-' ], { boolean: 'b' }), - { b: true, _: [ '-' ] } - ); - t.deepEqual( - parse([ '-s', '-' ], { string: 's' }), - { s: '-', _: [] } - ); -}); - -test('-a -- b', function (t) { - t.plan(3); - t.deepEqual(parse([ '-a', '--', 'b' ]), { a: true, _: [ 'b' ] }); - t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] }); - t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] }); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/default_bool.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/default_bool.js deleted file mode 100644 index f0041ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/default_bool.js +++ /dev/null @@ -1,20 +0,0 @@ -var test = require('tape'); -var parse = require('../'); - -test('boolean default true', function (t) { - var argv = parse([], { - boolean: 'sometrue', - default: { sometrue: true } - }); - t.equal(argv.sometrue, true); - t.end(); -}); - -test('boolean default false', function (t) { - var argv = parse([], { - boolean: 'somefalse', - default: { somefalse: false } - }); - t.equal(argv.somefalse, false); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dotted.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dotted.js deleted file mode 100644 index d8b3e85..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dotted.js +++ /dev/null @@ -1,22 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('dotted alias', function (t) { - var argv = parse(['--a.b', '22'], {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}}); - t.equal(argv.a.b, 22); - t.equal(argv.aa.bb, 22); - t.end(); -}); - -test('dotted default', function (t) { - var argv = parse('', {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}}); - t.equal(argv.a.b, 11); - t.equal(argv.aa.bb, 11); - t.end(); -}); - -test('dotted default with no alias', function (t) { - var argv = parse('', {default: {'a.b': 11}}); - t.equal(argv.a.b, 11); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/long.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/long.js deleted file mode 100644 index 5d3a1e0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/long.js +++ /dev/null @@ -1,31 +0,0 @@ -var test = require('tape'); -var parse = require('../'); - -test('long opts', function (t) { - t.deepEqual( - parse([ '--bool' ]), - { bool : true, _ : [] }, - 'long boolean' - ); - t.deepEqual( - parse([ '--pow', 'xixxle' ]), - { pow : 'xixxle', _ : [] }, - 'long capture sp' - ); - t.deepEqual( - parse([ '--pow=xixxle' ]), - { pow : 'xixxle', _ : [] }, - 'long capture eq' - ); - t.deepEqual( - parse([ '--host', 'localhost', '--port', '555' ]), - { host : 'localhost', port : 555, _ : [] }, - 'long captures sp' - ); - t.deepEqual( - parse([ '--host=localhost', '--port=555' ]), - { host : 'localhost', port : 555, _ : [] }, - 'long captures eq' - ); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/num.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/num.js deleted file mode 100644 index 2cc77f4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/num.js +++ /dev/null @@ -1,36 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('nums', function (t) { - var argv = parse([ - '-x', '1234', - '-y', '5.67', - '-z', '1e7', - '-w', '10f', - '--hex', '0xdeadbeef', - '789' - ]); - t.deepEqual(argv, { - x : 1234, - y : 5.67, - z : 1e7, - w : '10f', - hex : 0xdeadbeef, - _ : [ 789 ] - }); - t.deepEqual(typeof argv.x, 'number'); - t.deepEqual(typeof argv.y, 'number'); - t.deepEqual(typeof argv.z, 'number'); - t.deepEqual(typeof argv.w, 'string'); - t.deepEqual(typeof argv.hex, 'number'); - t.deepEqual(typeof argv._[0], 'number'); - t.end(); -}); - -test('already a number', function (t) { - var argv = parse([ '-x', 1234, 789 ]); - t.deepEqual(argv, { x : 1234, _ : [ 789 ] }); - t.deepEqual(typeof argv.x, 'number'); - t.deepEqual(typeof argv._[0], 'number'); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse.js deleted file mode 100644 index 7b4a2a1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse.js +++ /dev/null @@ -1,197 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('parse args', function (t) { - t.deepEqual( - parse([ '--no-moo' ]), - { moo : false, _ : [] }, - 'no' - ); - t.deepEqual( - parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]), - { v : ['a','b','c'], _ : [] }, - 'multi' - ); - t.end(); -}); - -test('comprehensive', function (t) { - t.deepEqual( - parse([ - '--name=meowmers', 'bare', '-cats', 'woo', - '-h', 'awesome', '--multi=quux', - '--key', 'value', - '-b', '--bool', '--no-meep', '--multi=baz', - '--', '--not-a-flag', 'eek' - ]), - { - c : true, - a : true, - t : true, - s : 'woo', - h : 'awesome', - b : true, - bool : true, - key : 'value', - multi : [ 'quux', 'baz' ], - meep : false, - name : 'meowmers', - _ : [ 'bare', '--not-a-flag', 'eek' ] - } - ); - t.end(); -}); - -test('flag boolean', function (t) { - var argv = parse([ '-t', 'moo' ], { boolean: 't' }); - t.deepEqual(argv, { t : true, _ : [ 'moo' ] }); - t.deepEqual(typeof argv.t, 'boolean'); - t.end(); -}); - -test('flag boolean value', function (t) { - var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], { - boolean: [ 't', 'verbose' ], - default: { verbose: true } - }); - - t.deepEqual(argv, { - verbose: false, - t: true, - _: ['moo'] - }); - - t.deepEqual(typeof argv.verbose, 'boolean'); - t.deepEqual(typeof argv.t, 'boolean'); - t.end(); -}); - -test('newlines in params' , function (t) { - var args = parse([ '-s', "X\nX" ]) - t.deepEqual(args, { _ : [], s : "X\nX" }); - - // reproduce in bash: - // VALUE="new - // line" - // node program.js --s="$VALUE" - args = parse([ "--s=X\nX" ]) - t.deepEqual(args, { _ : [], s : "X\nX" }); - t.end(); -}); - -test('strings' , function (t) { - var s = parse([ '-s', '0001234' ], { string: 's' }).s; - t.equal(s, '0001234'); - t.equal(typeof s, 'string'); - - var x = parse([ '-x', '56' ], { string: 'x' }).x; - t.equal(x, '56'); - t.equal(typeof x, 'string'); - t.end(); -}); - -test('stringArgs', function (t) { - var s = parse([ ' ', ' ' ], { string: '_' })._; - t.same(s.length, 2); - t.same(typeof s[0], 'string'); - t.same(s[0], ' '); - t.same(typeof s[1], 'string'); - t.same(s[1], ' '); - t.end(); -}); - -test('empty strings', function(t) { - var s = parse([ '-s' ], { string: 's' }).s; - t.equal(s, ''); - t.equal(typeof s, 'string'); - - var str = parse([ '--str' ], { string: 'str' }).str; - t.equal(str, ''); - t.equal(typeof str, 'string'); - - var letters = parse([ '-art' ], { - string: [ 'a', 't' ] - }); - - t.equal(letters.a, ''); - t.equal(letters.r, true); - t.equal(letters.t, ''); - - t.end(); -}); - - -test('string and alias', function(t) { - var x = parse([ '--str', '000123' ], { - string: 's', - alias: { s: 'str' } - }); - - t.equal(x.str, '000123'); - t.equal(typeof x.str, 'string'); - t.equal(x.s, '000123'); - t.equal(typeof x.s, 'string'); - - var y = parse([ '-s', '000123' ], { - string: 'str', - alias: { str: 's' } - }); - - t.equal(y.str, '000123'); - t.equal(typeof y.str, 'string'); - t.equal(y.s, '000123'); - t.equal(typeof y.s, 'string'); - t.end(); -}); - -test('slashBreak', function (t) { - t.same( - parse([ '-I/foo/bar/baz' ]), - { I : '/foo/bar/baz', _ : [] } - ); - t.same( - parse([ '-xyz/foo/bar/baz' ]), - { x : true, y : true, z : '/foo/bar/baz', _ : [] } - ); - t.end(); -}); - -test('alias', function (t) { - var argv = parse([ '-f', '11', '--zoom', '55' ], { - alias: { z: 'zoom' } - }); - t.equal(argv.zoom, 55); - t.equal(argv.z, argv.zoom); - t.equal(argv.f, 11); - t.end(); -}); - -test('multiAlias', function (t) { - var argv = parse([ '-f', '11', '--zoom', '55' ], { - alias: { z: [ 'zm', 'zoom' ] } - }); - t.equal(argv.zoom, 55); - t.equal(argv.z, argv.zoom); - t.equal(argv.z, argv.zm); - t.equal(argv.f, 11); - t.end(); -}); - -test('nested dotted objects', function (t) { - var argv = parse([ - '--foo.bar', '3', '--foo.baz', '4', - '--foo.quux.quibble', '5', '--foo.quux.o_O', - '--beep.boop' - ]); - - t.same(argv.foo, { - bar : 3, - baz : 4, - quux : { - quibble : 5, - o_O : true - } - }); - t.same(argv.beep, { boop : true }); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse_modified.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse_modified.js deleted file mode 100644 index 21851b0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse_modified.js +++ /dev/null @@ -1,9 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('parse with modifier functions' , function (t) { - t.plan(1); - - var argv = parse([ '-b', '123' ], { boolean: 'b' }); - t.deepEqual(argv, { b: true, _: ['123'] }); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/short.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/short.js deleted file mode 100644 index d513a1c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/short.js +++ /dev/null @@ -1,67 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('numeric short args', function (t) { - t.plan(2); - t.deepEqual(parse([ '-n123' ]), { n: 123, _: [] }); - t.deepEqual( - parse([ '-123', '456' ]), - { 1: true, 2: true, 3: 456, _: [] } - ); -}); - -test('short', function (t) { - t.deepEqual( - parse([ '-b' ]), - { b : true, _ : [] }, - 'short boolean' - ); - t.deepEqual( - parse([ 'foo', 'bar', 'baz' ]), - { _ : [ 'foo', 'bar', 'baz' ] }, - 'bare' - ); - t.deepEqual( - parse([ '-cats' ]), - { c : true, a : true, t : true, s : true, _ : [] }, - 'group' - ); - t.deepEqual( - parse([ '-cats', 'meow' ]), - { c : true, a : true, t : true, s : 'meow', _ : [] }, - 'short group next' - ); - t.deepEqual( - parse([ '-h', 'localhost' ]), - { h : 'localhost', _ : [] }, - 'short capture' - ); - t.deepEqual( - parse([ '-h', 'localhost', '-p', '555' ]), - { h : 'localhost', p : 555, _ : [] }, - 'short captures' - ); - t.end(); -}); - -test('mixed short bool and capture', function (t) { - t.same( - parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), - { - f : true, p : 555, h : 'localhost', - _ : [ 'script.js' ] - } - ); - t.end(); -}); - -test('short and long', function (t) { - t.deepEqual( - parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), - { - f : true, p : 555, h : 'localhost', - _ : [ 'script.js' ] - } - ); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/whitespace.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/whitespace.js deleted file mode 100644 index 8a52a58..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/whitespace.js +++ /dev/null @@ -1,8 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('whitespace should be whitespace' , function (t) { - t.plan(1); - var x = parse([ '-x', '\t' ]).x; - t.equal(x, '\t'); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/LICENSE deleted file mode 100644 index ee27ba4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -This software is released under the MIT 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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/README.markdown b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/README.markdown deleted file mode 100644 index 346374e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/README.markdown +++ /dev/null @@ -1,70 +0,0 @@ -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/center.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/center.js deleted file mode 100644 index a3fbaae..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/center.js +++ /dev/null @@ -1,10 +0,0 @@ -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/meat.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/meat.js deleted file mode 100644 index a4665e1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/meat.js +++ /dev/null @@ -1,3 +0,0 @@ -var wrap = require('wordwrap')(15); - -console.log(wrap('You and your whole family are made out of meat.')); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/index.js deleted file mode 100644 index c9bc945..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/index.js +++ /dev/null @@ -1,76 +0,0 @@ -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/package.json deleted file mode 100644 index 1f0527e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "wordwrap", - "description": "Wrap those words. Show them at what columns to start and stop.", - "version": "0.0.3", - "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", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "gitHead": "e59aa1bd338914019456bdfba034508c9c4cb29d", - "bugs": { - "url": "https://github.com/substack/node-wordwrap/issues" - }, - "homepage": "https://github.com/substack/node-wordwrap#readme", - "_id": "wordwrap@0.0.3", - "_shasum": "a3d5da6cd5c0bc0008d37234bbaf1bed63059107", - "_from": "wordwrap@>=0.0.2 <0.1.0", - "_npmVersion": "2.9.0", - "_nodeVersion": "2.0.0", - "_npmUser": { - "name": "substack", - "email": "substack@gmail.com" - }, - "dist": { - "shasum": "a3d5da6cd5c0bc0008d37234bbaf1bed63059107", - "tarball": "http://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" - }, - "maintainers": [ - { - "name": "substack", - "email": "mail@substack.net" - } - ], - "_resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/break.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/break.js deleted file mode 100644 index 749292e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/break.js +++ /dev/null @@ -1,30 +0,0 @@ -var assert = require('assert'); -var wordwrap = require('../'); - -exports.hard = function () { - var s = 'Assert from {"type":"equal","ok":false,"found":1,"wanted":2,' - + '"stack":[],"id":"b7ddcd4c409de8799542a74d1a04689b",' - + '"browser":"chrome/6.0"}' - ; - var s_ = wordwrap.hard(80)(s); - - var lines = s_.split('\n'); - assert.equal(lines.length, 2); - assert.ok(lines[0].length < 80); - assert.ok(lines[1].length < 80); - - assert.equal(s, s_.replace(/\n/g, '')); -}; - -exports.break = function () { - var s = new Array(55+1).join('a'); - var s_ = wordwrap.hard(20)(s); - - var lines = s_.split('\n'); - assert.equal(lines.length, 3); - assert.ok(lines[0].length === 20); - assert.ok(lines[1].length === 20); - assert.ok(lines[2].length === 15); - - assert.equal(s, s_.replace(/\n/g, '')); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/idleness.txt b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/idleness.txt deleted file mode 100644 index aa3f490..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/idleness.txt +++ /dev/null @@ -1,63 +0,0 @@ -In Praise of Idleness - -By Bertrand Russell - -[1932] - -Like most of my generation, I was brought up on the saying: 'Satan finds some mischief for idle hands to do.' Being a highly virtuous child, I believed all that I was told, and acquired a conscience which has kept me working hard down to the present moment. But although my conscience has controlled my actions, my opinions have undergone a revolution. I think that there is far too much work done in the world, that immense harm is caused by the belief that work is virtuous, and that what needs to be preached in modern industrial countries is quite different from what always has been preached. Everyone knows the story of the traveler in Naples who saw twelve beggars lying in the sun (it was before the days of Mussolini), and offered a lira to the laziest of them. Eleven of them jumped up to claim it, so he gave it to the twelfth. this traveler was on the right lines. But in countries which do not enjoy Mediterranean sunshine idleness is more difficult, and a great public propaganda will be required to inaugurate it. I hope that, after reading the following pages, the leaders of the YMCA will start a campaign to induce good young men to do nothing. If so, I shall not have lived in vain. - -Before advancing my own arguments for laziness, I must dispose of one which I cannot accept. Whenever a person who already has enough to live on proposes to engage in some everyday kind of job, such as school-teaching or typing, he or she is told that such conduct takes the bread out of other people's mouths, and is therefore wicked. If this argument were valid, it would only be necessary for us all to be idle in order that we should all have our mouths full of bread. What people who say such things forget is that what a man earns he usually spends, and in spending he gives employment. As long as a man spends his income, he puts just as much bread into people's mouths in spending as he takes out of other people's mouths in earning. The real villain, from this point of view, is the man who saves. If he merely puts his savings in a stocking, like the proverbial French peasant, it is obvious that they do not give employment. If he invests his savings, the matter is less obvious, and different cases arise. - -One of the commonest things to do with savings is to lend them to some Government. In view of the fact that the bulk of the public expenditure of most civilized Governments consists in payment for past wars or preparation for future wars, the man who lends his money to a Government is in the same position as the bad men in Shakespeare who hire murderers. The net result of the man's economical habits is to increase the armed forces of the State to which he lends his savings. Obviously it would be better if he spent the money, even if he spent it in drink or gambling. - -But, I shall be told, the case is quite different when savings are invested in industrial enterprises. When such enterprises succeed, and produce something useful, this may be conceded. In these days, however, no one will deny that most enterprises fail. That means that a large amount of human labor, which might have been devoted to producing something that could be enjoyed, was expended on producing machines which, when produced, lay idle and did no good to anyone. The man who invests his savings in a concern that goes bankrupt is therefore injuring others as well as himself. If he spent his money, say, in giving parties for his friends, they (we may hope) would get pleasure, and so would all those upon whom he spent money, such as the butcher, the baker, and the bootlegger. But if he spends it (let us say) upon laying down rails for surface card in some place where surface cars turn out not to be wanted, he has diverted a mass of labor into channels where it gives pleasure to no one. Nevertheless, when he becomes poor through failure of his investment he will be regarded as a victim of undeserved misfortune, whereas the gay spendthrift, who has spent his money philanthropically, will be despised as a fool and a frivolous person. - -All this is only preliminary. I want to say, in all seriousness, that a great deal of harm is being done in the modern world by belief in the virtuousness of work, and that the road to happiness and prosperity lies in an organized diminution of work. - -First of all: what is work? Work is of two kinds: first, altering the position of matter at or near the earth's surface relatively to other such matter; second, telling other people to do so. The first kind is unpleasant and ill paid; the second is pleasant and highly paid. The second kind is capable of indefinite extension: there are not only those who give orders, but those who give advice as to what orders should be given. Usually two opposite kinds of advice are given simultaneously by two organized bodies of men; this is called politics. The skill required for this kind of work is not knowledge of the subjects as to which advice is given, but knowledge of the art of persuasive speaking and writing, i.e. of advertising. - -Throughout Europe, though not in America, there is a third class of men, more respected than either of the classes of workers. There are men who, through ownership of land, are able to make others pay for the privilege of being allowed to exist and to work. These landowners are idle, and I might therefore be expected to praise them. Unfortunately, their idleness is only rendered possible by the industry of others; indeed their desire for comfortable idleness is historically the source of the whole gospel of work. The last thing they have ever wished is that others should follow their example. - -From the beginning of civilization until the Industrial Revolution, a man could, as a rule, produce by hard work little more than was required for the subsistence of himself and his family, although his wife worked at least as hard as he did, and his children added their labor as soon as they were old enough to do so. The small surplus above bare necessaries was not left to those who produced it, but was appropriated by warriors and priests. In times of famine there was no surplus; the warriors and priests, however, still secured as much as at other times, with the result that many of the workers died of hunger. This system persisted in Russia until 1917 [1], and still persists in the East; in England, in spite of the Industrial Revolution, it remained in full force throughout the Napoleonic wars, and until a hundred years ago, when the new class of manufacturers acquired power. In America, the system came to an end with the Revolution, except in the South, where it persisted until the Civil War. A system which lasted so long and ended so recently has naturally left a profound impress upon men's thoughts and opinions. Much that we take for granted about the desirability of work is derived from this system, and, being pre-industrial, is not adapted to the modern world. Modern technique has made it possible for leisure, within limits, to be not the prerogative of small privileged classes, but a right evenly distributed throughout the community. The morality of work is the morality of slaves, and the modern world has no need of slavery. - -It is obvious that, in primitive communities, peasants, left to themselves, would not have parted with the slender surplus upon which the warriors and priests subsisted, but would have either produced less or consumed more. At first, sheer force compelled them to produce and part with the surplus. Gradually, however, it was found possible to induce many of them to accept an ethic according to which it was their duty to work hard, although part of their work went to support others in idleness. By this means the amount of compulsion required was lessened, and the expenses of government were diminished. To this day, 99 per cent of British wage-earners would be genuinely shocked if it were proposed that the King should not have a larger income than a working man. The conception of duty, speaking historically, has been a means used by the holders of power to induce others to live for the interests of their masters rather than for their own. Of course the holders of power conceal this fact from themselves by managing to believe that their interests are identical with the larger interests of humanity. Sometimes this is true; Athenian slave-owners, for instance, employed part of their leisure in making a permanent contribution to civilization which would have been impossible under a just economic system. Leisure is essential to civilization, and in former times leisure for the few was only rendered possible by the labors of the many. But their labors were valuable, not because work is good, but because leisure is good. And with modern technique it would be possible to distribute leisure justly without injury to civilization. - -Modern technique has made it possible to diminish enormously the amount of labor required to secure the necessaries of life for everyone. This was made obvious during the war. At that time all the men in the armed forces, and all the men and women engaged in the production of munitions, all the men and women engaged in spying, war propaganda, or Government offices connected with the war, were withdrawn from productive occupations. In spite of this, the general level of well-being among unskilled wage-earners on the side of the Allies was higher than before or since. The significance of this fact was concealed by finance: borrowing made it appear as if the future was nourishing the present. But that, of course, would have been impossible; a man cannot eat a loaf of bread that does not yet exist. The war showed conclusively that, by the scientific organization of production, it is possible to keep modern populations in fair comfort on a small part of the working capacity of the modern world. If, at the end of the war, the scientific organization, which had been created in order to liberate men for fighting and munition work, had been preserved, and the hours of the week had been cut down to four, all would have been well. Instead of that the old chaos was restored, those whose work was demanded were made to work long hours, and the rest were left to starve as unemployed. Why? Because work is a duty, and a man should not receive wages in proportion to what he has produced, but in proportion to his virtue as exemplified by his industry. - -This is the morality of the Slave State, applied in circumstances totally unlike those in which it arose. No wonder the result has been disastrous. Let us take an illustration. Suppose that, at a given moment, a certain number of people are engaged in the manufacture of pins. They make as many pins as the world needs, working (say) eight hours a day. Someone makes an invention by which the same number of men can make twice as many pins: pins are already so cheap that hardly any more will be bought at a lower price. In a sensible world, everybody concerned in the manufacturing of pins would take to working four hours instead of eight, and everything else would go on as before. But in the actual world this would be thought demoralizing. The men still work eight hours, there are too many pins, some employers go bankrupt, and half the men previously concerned in making pins are thrown out of work. There is, in the end, just as much leisure as on the other plan, but half the men are totally idle while half are still overworked. In this way, it is insured that the unavoidable leisure shall cause misery all round instead of being a universal source of happiness. Can anything more insane be imagined? - -The idea that the poor should have leisure has always been shocking to the rich. In England, in the early nineteenth century, fifteen hours was the ordinary day's work for a man; children sometimes did as much, and very commonly did twelve hours a day. When meddlesome busybodies suggested that perhaps these hours were rather long, they were told that work kept adults from drink and children from mischief. When I was a child, shortly after urban working men had acquired the vote, certain public holidays were established by law, to the great indignation of the upper classes. I remember hearing an old Duchess say: 'What do the poor want with holidays? They ought to work.' People nowadays are less frank, but the sentiment persists, and is the source of much of our economic confusion. - -Let us, for a moment, consider the ethics of work frankly, without superstition. Every human being, of necessity, consumes, in the course of his life, a certain amount of the produce of human labor. Assuming, as we may, that labor is on the whole disagreeable, it is unjust that a man should consume more than he produces. Of course he may provide services rather than commodities, like a medical man, for example; but he should provide something in return for his board and lodging. to this extent, the duty of work must be admitted, but to this extent only. - -I shall not dwell upon the fact that, in all modern societies outside the USSR, many people escape even this minimum amount of work, namely all those who inherit money and all those who marry money. I do not think the fact that these people are allowed to be idle is nearly so harmful as the fact that wage-earners are expected to overwork or starve. - -If the ordinary wage-earner worked four hours a day, there would be enough for everybody and no unemployment -- assuming a certain very moderate amount of sensible organization. This idea shocks the well-to-do, because they are convinced that the poor would not know how to use so much leisure. In America men often work long hours even when they are well off; such men, naturally, are indignant at the idea of leisure for wage-earners, except as the grim punishment of unemployment; in fact, they dislike leisure even for their sons. Oddly enough, while they wish their sons to work so hard as to have no time to be civilized, they do not mind their wives and daughters having no work at all. the snobbish admiration of uselessness, which, in an aristocratic society, extends to both sexes, is, under a plutocracy, confined to women; this, however, does not make it any more in agreement with common sense. - -The wise use of leisure, it must be conceded, is a product of civilization and education. A man who has worked long hours all his life will become bored if he becomes suddenly idle. But without a considerable amount of leisure a man is cut off from many of the best things. There is no longer any reason why the bulk of the population should suffer this deprivation; only a foolish asceticism, usually vicarious, makes us continue to insist on work in excessive quantities now that the need no longer exists. - -In the new creed which controls the government of Russia, while there is much that is very different from the traditional teaching of the West, there are some things that are quite unchanged. The attitude of the governing classes, and especially of those who conduct educational propaganda, on the subject of the dignity of labor, is almost exactly that which the governing classes of the world have always preached to what were called the 'honest poor'. Industry, sobriety, willingness to work long hours for distant advantages, even submissiveness to authority, all these reappear; moreover authority still represents the will of the Ruler of the Universe, Who, however, is now called by a new name, Dialectical Materialism. - -The victory of the proletariat in Russia has some points in common with the victory of the feminists in some other countries. For ages, men had conceded the superior saintliness of women, and had consoled women for their inferiority by maintaining that saintliness is more desirable than power. At last the feminists decided that they would have both, since the pioneers among them believed all that the men had told them about the desirability of virtue, but not what they had told them about the worthlessness of political power. A similar thing has happened in Russia as regards manual work. For ages, the rich and their sycophants have written in praise of 'honest toil', have praised the simple life, have professed a religion which teaches that the poor are much more likely to go to heaven than the rich, and in general have tried to make manual workers believe that there is some special nobility about altering the position of matter in space, just as men tried to make women believe that they derived some special nobility from their sexual enslavement. In Russia, all this teaching about the excellence of manual work has been taken seriously, with the result that the manual worker is more honored than anyone else. What are, in essence, revivalist appeals are made, but not for the old purposes: they are made to secure shock workers for special tasks. Manual work is the ideal which is held before the young, and is the basis of all ethical teaching. - -For the present, possibly, this is all to the good. A large country, full of natural resources, awaits development, and has has to be developed with very little use of credit. In these circumstances, hard work is necessary, and is likely to bring a great reward. But what will happen when the point has been reached where everybody could be comfortable without working long hours? - -In the West, we have various ways of dealing with this problem. We have no attempt at economic justice, so that a large proportion of the total produce goes to a small minority of the population, many of whom do no work at all. Owing to the absence of any central control over production, we produce hosts of things that are not wanted. We keep a large percentage of the working population idle, because we can dispense with their labor by making the others overwork. When all these methods prove inadequate, we have a war: we cause a number of people to manufacture high explosives, and a number of others to explode them, as if we were children who had just discovered fireworks. By a combination of all these devices we manage, though with difficulty, to keep alive the notion that a great deal of severe manual work must be the lot of the average man. - -In Russia, owing to more economic justice and central control over production, the problem will have to be differently solved. the rational solution would be, as soon as the necessaries and elementary comforts can be provided for all, to reduce the hours of labor gradually, allowing a popular vote to decide, at each stage, whether more leisure or more goods were to be preferred. But, having taught the supreme virtue of hard work, it is difficult to see how the authorities can aim at a paradise in which there will be much leisure and little work. It seems more likely that they will find continually fresh schemes, by which present leisure is to be sacrificed to future productivity. I read recently of an ingenious plan put forward by Russian engineers, for making the White Sea and the northern coasts of Siberia warm, by putting a dam across the Kara Sea. An admirable project, but liable to postpone proletarian comfort for a generation, while the nobility of toil is being displayed amid the ice-fields and snowstorms of the Arctic Ocean. This sort of thing, if it happens, will be the result of regarding the virtue of hard work as an end in itself, rather than as a means to a state of affairs in which it is no longer needed. - -The fact is that moving matter about, while a certain amount of it is necessary to our existence, is emphatically not one of the ends of human life. If it were, we should have to consider every navvy superior to Shakespeare. We have been misled in this matter by two causes. One is the necessity of keeping the poor contented, which has led the rich, for thousands of years, to preach the dignity of labor, while taking care themselves to remain undignified in this respect. The other is the new pleasure in mechanism, which makes us delight in the astonishingly clever changes that we can produce on the earth's surface. Neither of these motives makes any great appeal to the actual worker. If you ask him what he thinks the best part of his life, he is not likely to say: 'I enjoy manual work because it makes me feel that I am fulfilling man's noblest task, and because I like to think how much man can transform his planet. It is true that my body demands periods of rest, which I have to fill in as best I may, but I am never so happy as when the morning comes and I can return to the toil from which my contentment springs.' I have never heard working men say this sort of thing. They consider work, as it should be considered, a necessary means to a livelihood, and it is from their leisure that they derive whatever happiness they may enjoy. - -It will be said that, while a little leisure is pleasant, men would not know how to fill their days if they had only four hours of work out of the twenty-four. In so far as this is true in the modern world, it is a condemnation of our civilization; it would not have been true at any earlier period. There was formerly a capacity for light-heartedness and play which has been to some extent inhibited by the cult of efficiency. The modern man thinks that everything ought to be done for the sake of something else, and never for its own sake. Serious-minded persons, for example, are continually condemning the habit of going to the cinema, and telling us that it leads the young into crime. But all the work that goes to producing a cinema is respectable, because it is work, and because it brings a money profit. The notion that the desirable activities are those that bring a profit has made everything topsy-turvy. The butcher who provides you with meat and the baker who provides you with bread are praiseworthy, because they are making money; but when you enjoy the food they have provided, you are merely frivolous, unless you eat only to get strength for your work. Broadly speaking, it is held that getting money is good and spending money is bad. Seeing that they are two sides of one transaction, this is absurd; one might as well maintain that keys are good, but keyholes are bad. Whatever merit there may be in the production of goods must be entirely derivative from the advantage to be obtained by consuming them. The individual, in our society, works for profit; but the social purpose of his work lies in the consumption of what he produces. It is this divorce between the individual and the social purpose of production that makes it so difficult for men to think clearly in a world in which profit-making is the incentive to industry. We think too much of production, and too little of consumption. One result is that we attach too little importance to enjoyment and simple happiness, and that we do not judge production by the pleasure that it gives to the consumer. - -When I suggest that working hours should be reduced to four, I am not meaning to imply that all the remaining time should necessarily be spent in pure frivolity. I mean that four hours' work a day should entitle a man to the necessities and elementary comforts of life, and that the rest of his time should be his to use as he might see fit. It is an essential part of any such social system that education should be carried further than it usually is at present, and should aim, in part, at providing tastes which would enable a man to use leisure intelligently. I am not thinking mainly of the sort of things that would be considered 'highbrow'. Peasant dances have died out except in remote rural areas, but the impulses which caused them to be cultivated must still exist in human nature. The pleasures of urban populations have become mainly passive: seeing cinemas, watching football matches, listening to the radio, and so on. This results from the fact that their active energies are fully taken up with work; if they had more leisure, they would again enjoy pleasures in which they took an active part. - -In the past, there was a small leisure class and a larger working class. The leisure class enjoyed advantages for which there was no basis in social justice; this necessarily made it oppressive, limited its sympathies, and caused it to invent theories by which to justify its privileges. These facts greatly diminished its excellence, but in spite of this drawback it contributed nearly the whole of what we call civilization. It cultivated the arts and discovered the sciences; it wrote the books, invented the philosophies, and refined social relations. Even the liberation of the oppressed has usually been inaugurated from above. Without the leisure class, mankind would never have emerged from barbarism. - -The method of a leisure class without duties was, however, extraordinarily wasteful. None of the members of the class had to be taught to be industrious, and the class as a whole was not exceptionally intelligent. The class might produce one Darwin, but against him had to be set tens of thousands of country gentlemen who never thought of anything more intelligent than fox-hunting and punishing poachers. At present, the universities are supposed to provide, in a more systematic way, what the leisure class provided accidentally and as a by-product. This is a great improvement, but it has certain drawbacks. University life is so different from life in the world at large that men who live in academic milieu tend to be unaware of the preoccupations and problems of ordinary men and women; moreover their ways of expressing themselves are usually such as to rob their opinions of the influence that they ought to have upon the general public. Another disadvantage is that in universities studies are organized, and the man who thinks of some original line of research is likely to be discouraged. Academic institutions, therefore, useful as they are, are not adequate guardians of the interests of civilization in a world where everyone outside their walls is too busy for unutilitarian pursuits. - -In a world where no one is compelled to work more than four hours a day, every person possessed of scientific curiosity will be able to indulge it, and every painter will be able to paint without starving, however excellent his pictures may be. Young writers will not be obliged to draw attention to themselves by sensational pot-boilers, with a view to acquiring the economic independence needed for monumental works, for which, when the time at last comes, they will have lost the taste and capacity. Men who, in their professional work, have become interested in some phase of economics or government, will be able to develop their ideas without the academic detachment that makes the work of university economists often seem lacking in reality. Medical men will have the time to learn about the progress of medicine, teachers will not be exasperatedly struggling to teach by routine methods things which they learnt in their youth, which may, in the interval, have been proved to be untrue. - -Above all, there will be happiness and joy of life, instead of frayed nerves, weariness, and dyspepsia. The work exacted will be enough to make leisure delightful, but not enough to produce exhaustion. Since men will not be tired in their spare time, they will not demand only such amusements as are passive and vapid. At least one per cent will probably devote the time not spent in professional work to pursuits of some public importance, and, since they will not depend upon these pursuits for their livelihood, their originality will be unhampered, and there will be no need to conform to the standards set by elderly pundits. But it is not only in these exceptional cases that the advantages of leisure will appear. Ordinary men and women, having the opportunity of a happy life, will become more kindly and less persecuting and less inclined to view others with suspicion. The taste for war will die out, partly for this reason, and partly because it will involve long and severe work for all. Good nature is, of all moral qualities, the one that the world needs most, and good nature is the result of ease and security, not of a life of arduous struggle. Modern methods of production have given us the possibility of ease and security for all; we have chosen, instead, to have overwork for some and starvation for others. Hitherto we have continued to be as energetic as we were before there were machines; in this we have been foolish, but there is no reason to go on being foolish forever. - -[1] Since then, members of the Communist Party have succeeded to this privilege of the warriors and priests. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/wrap.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/wrap.js deleted file mode 100644 index 0cfb76d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/wrap.js +++ /dev/null @@ -1,31 +0,0 @@ -var assert = require('assert'); -var wordwrap = require('wordwrap'); - -var fs = require('fs'); -var idleness = fs.readFileSync(__dirname + '/idleness.txt', 'utf8'); - -exports.stop80 = function () { - var lines = wordwrap(80)(idleness).split(/\n/); - var words = idleness.split(/\s+/); - - lines.forEach(function (line) { - assert.ok(line.length <= 80, 'line > 80 columns'); - var chunks = line.match(/\S/) ? line.split(/\s+/) : []; - assert.deepEqual(chunks, words.splice(0, chunks.length)); - }); -}; - -exports.start20stop60 = function () { - var lines = wordwrap(20, 100)(idleness).split(/\n/); - var words = idleness.split(/\s+/); - - lines.forEach(function (line) { - assert.ok(line.length <= 100, 'line > 100 columns'); - var chunks = line - .split(/\s+/) - .filter(function (x) { return x.match(/\S/) }) - ; - assert.deepEqual(chunks, words.splice(0, chunks.length)); - assert.deepEqual(line.slice(0, 20), new Array(20 + 1).join(' ')); - }); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/package.json deleted file mode 100644 index 4b2334e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "optimist", - "version": "0.6.1", - "description": "Light-weight option parsing with an argv hash. No optstrings attached.", - "main": "./index.js", - "dependencies": { - "wordwrap": "~0.0.2", - "minimist": "~0.0.1" - }, - "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@substack.net", - "url": "http://substack.net" - }, - "license": "MIT/X11", - "engine": { - "node": ">=0.4" - }, - "bugs": { - "url": "https://github.com/substack/node-optimist/issues" - }, - "homepage": "https://github.com/substack/node-optimist", - "_id": "optimist@0.6.1", - "dist": { - "shasum": "da3ea74686fa21a19a111c326e90eb15a0196686", - "tarball": "http://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz" - }, - "_from": "optimist@>=0.6.1 <0.7.0", - "_npmVersion": "1.3.21", - "_npmUser": { - "name": "substack", - "email": "mail@substack.net" - }, - "maintainers": [ - { - "name": "substack", - "email": "mail@substack.net" - } - ], - "directories": {}, - "_shasum": "da3ea74686fa21a19a111c326e90eb15a0196686", - "_resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/readme.markdown b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/readme.markdown deleted file mode 100644 index b74b437..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/readme.markdown +++ /dev/null @@ -1,513 +0,0 @@ -# DEPRECATION NOTICE - -I don't want to maintain this module anymore since I just use -[minimist](https://npmjs.org/package/minimist), the argument parsing engine, -directly instead nowadays. - -See [yargs](https://github.com/chevex/yargs) for the modern, pirate-themed -successor to optimist. - -[![yarrrrrrrgs!](http://i.imgur.com/4WFGVJ9.png)](https://github.com/chevex/yargs) - -You should also consider [nomnom](https://github.com/harthur/nomnom). - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_.js deleted file mode 100644 index d9c58b3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_.js +++ /dev/null @@ -1,71 +0,0 @@ -var spawn = require('child_process').spawn; -var test = require('tap').test; - -test('dotSlashEmpty', testCmd('./bin.js', [])); - -test('dotSlashArgs', testCmd('./bin.js', [ 'a', 'b', 'c' ])); - -test('nodeEmpty', testCmd('node bin.js', [])); - -test('nodeArgs', testCmd('node bin.js', [ 'x', 'y', 'z' ])); - -test('whichNodeEmpty', function (t) { - var which = spawn('which', ['node']); - - which.stdout.on('data', function (buf) { - t.test( - testCmd(buf.toString().trim() + ' bin.js', []) - ); - t.end(); - }); - - which.stderr.on('data', function (err) { - assert.error(err); - t.end(); - }); -}); - -test('whichNodeArgs', function (t) { - var which = spawn('which', ['node']); - - which.stdout.on('data', function (buf) { - t.test( - testCmd(buf.toString().trim() + ' bin.js', [ 'q', 'r' ]) - ); - t.end(); - }); - - which.stderr.on('data', function (err) { - t.error(err); - t.end(); - }); -}); - -function testCmd (cmd, args) { - - return function (t) { - var to = setTimeout(function () { - assert.fail('Never got stdout data.') - }, 5000); - - var oldDir = process.cwd(); - process.chdir(__dirname + '/_'); - - var cmds = cmd.split(' '); - - var bin = spawn(cmds[0], cmds.slice(1).concat(args.map(String))); - process.chdir(oldDir); - - bin.stderr.on('data', function (err) { - t.error(err); - t.end(); - }); - - bin.stdout.on('data', function (buf) { - clearTimeout(to); - var _ = JSON.parse(buf.toString()); - t.same(_.map(String), args.map(String)); - t.end(); - }); - }; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/argv.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/argv.js deleted file mode 100644 index 3d09606..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/argv.js +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -console.log(JSON.stringify(process.argv)); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/bin.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/bin.js deleted file mode 100755 index 4a18d85..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/bin.js +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node -var argv = require('../../index').argv -console.log(JSON.stringify(argv._)); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/dash.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/dash.js deleted file mode 100644 index af8ed6f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/dash.js +++ /dev/null @@ -1,31 +0,0 @@ -var optimist = require('../index'); -var test = require('tap').test; - -test('-', function (t) { - t.plan(5); - t.deepEqual( - fix(optimist.parse([ '-n', '-' ])), - { n: '-', _: [] } - ); - t.deepEqual( - fix(optimist.parse([ '-' ])), - { _: [ '-' ] } - ); - t.deepEqual( - fix(optimist.parse([ '-f-' ])), - { f: '-', _: [] } - ); - t.deepEqual( - fix(optimist([ '-b', '-' ]).boolean('b').argv), - { b: true, _: [ '-' ] } - ); - t.deepEqual( - fix(optimist([ '-s', '-' ]).string('s').argv), - { s: '-', _: [] } - ); -}); - -function fix (obj) { - delete obj.$0; - return obj; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse.js deleted file mode 100644 index d320f43..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse.js +++ /dev/null @@ -1,446 +0,0 @@ -var optimist = require('../index'); -var path = require('path'); -var test = require('tap').test; - -var $0 = 'node ./' + path.relative(process.cwd(), __filename); - -test('short boolean', function (t) { - var parse = optimist.parse([ '-b' ]); - t.same(parse, { b : true, _ : [], $0 : $0 }); - t.same(typeof parse.b, 'boolean'); - t.end(); -}); - -test('long boolean', function (t) { - t.same( - optimist.parse([ '--bool' ]), - { bool : true, _ : [], $0 : $0 } - ); - t.end(); -}); - -test('bare', function (t) { - t.same( - optimist.parse([ 'foo', 'bar', 'baz' ]), - { _ : [ 'foo', 'bar', 'baz' ], $0 : $0 } - ); - t.end(); -}); - -test('short group', function (t) { - t.same( - optimist.parse([ '-cats' ]), - { c : true, a : true, t : true, s : true, _ : [], $0 : $0 } - ); - t.end(); -}); - -test('short group next', function (t) { - t.same( - optimist.parse([ '-cats', 'meow' ]), - { c : true, a : true, t : true, s : 'meow', _ : [], $0 : $0 } - ); - t.end(); -}); - -test('short capture', function (t) { - t.same( - optimist.parse([ '-h', 'localhost' ]), - { h : 'localhost', _ : [], $0 : $0 } - ); - t.end(); -}); - -test('short captures', function (t) { - t.same( - optimist.parse([ '-h', 'localhost', '-p', '555' ]), - { h : 'localhost', p : 555, _ : [], $0 : $0 } - ); - t.end(); -}); - -test('long capture sp', function (t) { - t.same( - optimist.parse([ '--pow', 'xixxle' ]), - { pow : 'xixxle', _ : [], $0 : $0 } - ); - t.end(); -}); - -test('long capture eq', function (t) { - t.same( - optimist.parse([ '--pow=xixxle' ]), - { pow : 'xixxle', _ : [], $0 : $0 } - ); - t.end() -}); - -test('long captures sp', function (t) { - t.same( - optimist.parse([ '--host', 'localhost', '--port', '555' ]), - { host : 'localhost', port : 555, _ : [], $0 : $0 } - ); - t.end(); -}); - -test('long captures eq', function (t) { - t.same( - optimist.parse([ '--host=localhost', '--port=555' ]), - { host : 'localhost', port : 555, _ : [], $0 : $0 } - ); - t.end(); -}); - -test('mixed short bool and capture', function (t) { - t.same( - optimist.parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), - { - f : true, p : 555, h : 'localhost', - _ : [ 'script.js' ], $0 : $0, - } - ); - t.end(); -}); - -test('short and long', function (t) { - t.same( - optimist.parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), - { - f : true, p : 555, h : 'localhost', - _ : [ 'script.js' ], $0 : $0, - } - ); - t.end(); -}); - -test('no', function (t) { - t.same( - optimist.parse([ '--no-moo' ]), - { moo : false, _ : [], $0 : $0 } - ); - t.end(); -}); - -test('multi', function (t) { - t.same( - optimist.parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]), - { v : ['a','b','c'], _ : [], $0 : $0 } - ); - t.end(); -}); - -test('comprehensive', function (t) { - t.same( - optimist.parse([ - '--name=meowmers', 'bare', '-cats', 'woo', - '-h', 'awesome', '--multi=quux', - '--key', 'value', - '-b', '--bool', '--no-meep', '--multi=baz', - '--', '--not-a-flag', 'eek' - ]), - { - c : true, - a : true, - t : true, - s : 'woo', - h : 'awesome', - b : true, - bool : true, - key : 'value', - multi : [ 'quux', 'baz' ], - meep : false, - name : 'meowmers', - _ : [ 'bare', '--not-a-flag', 'eek' ], - $0 : $0 - } - ); - t.end(); -}); - -test('nums', function (t) { - var argv = optimist.parse([ - '-x', '1234', - '-y', '5.67', - '-z', '1e7', - '-w', '10f', - '--hex', '0xdeadbeef', - '789', - ]); - t.same(argv, { - x : 1234, - y : 5.67, - z : 1e7, - w : '10f', - hex : 0xdeadbeef, - _ : [ 789 ], - $0 : $0 - }); - t.same(typeof argv.x, 'number'); - t.same(typeof argv.y, 'number'); - t.same(typeof argv.z, 'number'); - t.same(typeof argv.w, 'string'); - t.same(typeof argv.hex, 'number'); - t.same(typeof argv._[0], 'number'); - t.end(); -}); - -test('flag boolean', function (t) { - var parse = optimist([ '-t', 'moo' ]).boolean(['t']).argv; - t.same(parse, { t : true, _ : [ 'moo' ], $0 : $0 }); - t.same(typeof parse.t, 'boolean'); - t.end(); -}); - -test('flag boolean value', function (t) { - var parse = optimist(['--verbose', 'false', 'moo', '-t', 'true']) - .boolean(['t', 'verbose']).default('verbose', true).argv; - - t.same(parse, { - verbose: false, - t: true, - _: ['moo'], - $0 : $0 - }); - - t.same(typeof parse.verbose, 'boolean'); - t.same(typeof parse.t, 'boolean'); - t.end(); -}); - -test('flag boolean default false', function (t) { - var parse = optimist(['moo']) - .boolean(['t', 'verbose']) - .default('verbose', false) - .default('t', false).argv; - - t.same(parse, { - verbose: false, - t: false, - _: ['moo'], - $0 : $0 - }); - - t.same(typeof parse.verbose, 'boolean'); - t.same(typeof parse.t, 'boolean'); - t.end(); - -}); - -test('boolean groups', function (t) { - var parse = optimist([ '-x', '-z', 'one', 'two', 'three' ]) - .boolean(['x','y','z']).argv; - - t.same(parse, { - x : true, - y : false, - z : true, - _ : [ 'one', 'two', 'three' ], - $0 : $0 - }); - - t.same(typeof parse.x, 'boolean'); - t.same(typeof parse.y, 'boolean'); - t.same(typeof parse.z, 'boolean'); - t.end(); -}); - -test('newlines in params' , function (t) { - var args = optimist.parse([ '-s', "X\nX" ]) - t.same(args, { _ : [], s : "X\nX", $0 : $0 }); - - // reproduce in bash: - // VALUE="new - // line" - // node program.js --s="$VALUE" - args = optimist.parse([ "--s=X\nX" ]) - t.same(args, { _ : [], s : "X\nX", $0 : $0 }); - t.end(); -}); - -test('strings' , function (t) { - var s = optimist([ '-s', '0001234' ]).string('s').argv.s; - t.same(s, '0001234'); - t.same(typeof s, 'string'); - - var x = optimist([ '-x', '56' ]).string('x').argv.x; - t.same(x, '56'); - t.same(typeof x, 'string'); - t.end(); -}); - -test('stringArgs', function (t) { - var s = optimist([ ' ', ' ' ]).string('_').argv._; - t.same(s.length, 2); - t.same(typeof s[0], 'string'); - t.same(s[0], ' '); - t.same(typeof s[1], 'string'); - t.same(s[1], ' '); - t.end(); -}); - -test('slashBreak', function (t) { - t.same( - optimist.parse([ '-I/foo/bar/baz' ]), - { I : '/foo/bar/baz', _ : [], $0 : $0 } - ); - t.same( - optimist.parse([ '-xyz/foo/bar/baz' ]), - { x : true, y : true, z : '/foo/bar/baz', _ : [], $0 : $0 } - ); - t.end(); -}); - -test('alias', function (t) { - var argv = optimist([ '-f', '11', '--zoom', '55' ]) - .alias('z', 'zoom') - .argv - ; - t.equal(argv.zoom, 55); - t.equal(argv.z, argv.zoom); - t.equal(argv.f, 11); - t.end(); -}); - -test('multiAlias', function (t) { - var argv = optimist([ '-f', '11', '--zoom', '55' ]) - .alias('z', [ 'zm', 'zoom' ]) - .argv - ; - t.equal(argv.zoom, 55); - t.equal(argv.z, argv.zoom); - t.equal(argv.z, argv.zm); - t.equal(argv.f, 11); - t.end(); -}); - -test('boolean default true', function (t) { - var argv = optimist.options({ - sometrue: { - boolean: true, - default: true - } - }).argv; - - t.equal(argv.sometrue, true); - t.end(); -}); - -test('boolean default false', function (t) { - var argv = optimist.options({ - somefalse: { - boolean: true, - default: false - } - }).argv; - - t.equal(argv.somefalse, false); - t.end(); -}); - -test('nested dotted objects', function (t) { - var argv = optimist([ - '--foo.bar', '3', '--foo.baz', '4', - '--foo.quux.quibble', '5', '--foo.quux.o_O', - '--beep.boop' - ]).argv; - - t.same(argv.foo, { - bar : 3, - baz : 4, - quux : { - quibble : 5, - o_O : true - }, - }); - t.same(argv.beep, { boop : true }); - t.end(); -}); - -test('boolean and alias with chainable api', function (t) { - var aliased = [ '-h', 'derp' ]; - var regular = [ '--herp', 'derp' ]; - var opts = { - herp: { alias: 'h', boolean: true } - }; - var aliasedArgv = optimist(aliased) - .boolean('herp') - .alias('h', 'herp') - .argv; - var propertyArgv = optimist(regular) - .boolean('herp') - .alias('h', 'herp') - .argv; - var expected = { - herp: true, - h: true, - '_': [ 'derp' ], - '$0': $0, - }; - - t.same(aliasedArgv, expected); - t.same(propertyArgv, expected); - t.end(); -}); - -test('boolean and alias with options hash', function (t) { - var aliased = [ '-h', 'derp' ]; - var regular = [ '--herp', 'derp' ]; - var opts = { - herp: { alias: 'h', boolean: true } - }; - var aliasedArgv = optimist(aliased) - .options(opts) - .argv; - var propertyArgv = optimist(regular).options(opts).argv; - var expected = { - herp: true, - h: true, - '_': [ 'derp' ], - '$0': $0, - }; - - t.same(aliasedArgv, expected); - t.same(propertyArgv, expected); - - t.end(); -}); - -test('boolean and alias using explicit true', function (t) { - var aliased = [ '-h', 'true' ]; - var regular = [ '--herp', 'true' ]; - var opts = { - herp: { alias: 'h', boolean: true } - }; - var aliasedArgv = optimist(aliased) - .boolean('h') - .alias('h', 'herp') - .argv; - var propertyArgv = optimist(regular) - .boolean('h') - .alias('h', 'herp') - .argv; - var expected = { - herp: true, - h: true, - '_': [ ], - '$0': $0, - }; - - t.same(aliasedArgv, expected); - t.same(propertyArgv, expected); - t.end(); -}); - -// regression, see https://github.com/substack/node-optimist/issues/71 -test('boolean and --x=true', function(t) { - var parsed = optimist(['--boool', '--other=true']).boolean('boool').argv; - - t.same(parsed.boool, true); - t.same(parsed.other, 'true'); - - parsed = optimist(['--boool', '--other=false']).boolean('boool').argv; - - t.same(parsed.boool, true); - t.same(parsed.other, 'false'); - t.end(); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse_modified.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse_modified.js deleted file mode 100644 index a57dc84..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse_modified.js +++ /dev/null @@ -1,14 +0,0 @@ -var optimist = require('../'); -var test = require('tap').test; - -test('parse with modifier functions' , function (t) { - t.plan(1); - - var argv = optimist().boolean('b').parse([ '-b', '123' ]); - t.deepEqual(fix(argv), { b: true, _: ['123'] }); -}); - -function fix (obj) { - delete obj.$0; - return obj; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/short.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/short.js deleted file mode 100644 index b2c38ad..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/short.js +++ /dev/null @@ -1,16 +0,0 @@ -var optimist = require('../index'); -var test = require('tap').test; - -test('-n123', function (t) { - t.plan(1); - var parse = optimist.parse([ '-n123' ]); - t.equal(parse.n, 123); -}); - -test('-123', function (t) { - t.plan(3); - var parse = optimist.parse([ '-123', '456' ]); - t.equal(parse['1'], true); - t.equal(parse['2'], true); - t.equal(parse['3'], 456); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/usage.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/usage.js deleted file mode 100644 index 300454c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/usage.js +++ /dev/null @@ -1,292 +0,0 @@ -var Hash = require('hashish'); -var optimist = require('../index'); -var test = require('tap').test; - -test('usageFail', function (t) { - var r = checkUsage(function () { - return optimist('-x 10 -z 20'.split(' ')) - .usage('Usage: $0 -x NUM -y NUM') - .demand(['x','y']) - .argv; - }); - t.same( - r.result, - { x : 10, z : 20, _ : [], $0 : './usage' } - ); - - t.same( - r.errors.join('\n').split(/\n+/), - [ - 'Usage: ./usage -x NUM -y NUM', - 'Options:', - ' -x [required]', - ' -y [required]', - 'Missing required arguments: y', - ] - ); - t.same(r.logs, []); - t.ok(r.exit); - t.end(); -}); - - -test('usagePass', function (t) { - var r = checkUsage(function () { - return optimist('-x 10 -y 20'.split(' ')) - .usage('Usage: $0 -x NUM -y NUM') - .demand(['x','y']) - .argv; - }); - t.same(r, { - result : { x : 10, y : 20, _ : [], $0 : './usage' }, - errors : [], - logs : [], - exit : false, - }); - t.end(); -}); - -test('checkPass', function (t) { - var r = checkUsage(function () { - return optimist('-x 10 -y 20'.split(' ')) - .usage('Usage: $0 -x NUM -y NUM') - .check(function (argv) { - if (!('x' in argv)) throw 'You forgot about -x'; - if (!('y' in argv)) throw 'You forgot about -y'; - }) - .argv; - }); - t.same(r, { - result : { x : 10, y : 20, _ : [], $0 : './usage' }, - errors : [], - logs : [], - exit : false, - }); - t.end(); -}); - -test('checkFail', function (t) { - var r = checkUsage(function () { - return optimist('-x 10 -z 20'.split(' ')) - .usage('Usage: $0 -x NUM -y NUM') - .check(function (argv) { - if (!('x' in argv)) throw 'You forgot about -x'; - if (!('y' in argv)) throw 'You forgot about -y'; - }) - .argv; - }); - - t.same( - r.result, - { x : 10, z : 20, _ : [], $0 : './usage' } - ); - - t.same( - r.errors.join('\n').split(/\n+/), - [ - 'Usage: ./usage -x NUM -y NUM', - 'You forgot about -y' - ] - ); - - t.same(r.logs, []); - t.ok(r.exit); - t.end(); -}); - -test('checkCondPass', function (t) { - function checker (argv) { - return 'x' in argv && 'y' in argv; - } - - var r = checkUsage(function () { - return optimist('-x 10 -y 20'.split(' ')) - .usage('Usage: $0 -x NUM -y NUM') - .check(checker) - .argv; - }); - t.same(r, { - result : { x : 10, y : 20, _ : [], $0 : './usage' }, - errors : [], - logs : [], - exit : false, - }); - t.end(); -}); - -test('checkCondFail', function (t) { - function checker (argv) { - return 'x' in argv && 'y' in argv; - } - - var r = checkUsage(function () { - return optimist('-x 10 -z 20'.split(' ')) - .usage('Usage: $0 -x NUM -y NUM') - .check(checker) - .argv; - }); - - t.same( - r.result, - { x : 10, z : 20, _ : [], $0 : './usage' } - ); - - t.same( - r.errors.join('\n').split(/\n+/).join('\n'), - 'Usage: ./usage -x NUM -y NUM\n' - + 'Argument check failed: ' + checker.toString() - ); - - t.same(r.logs, []); - t.ok(r.exit); - t.end(); -}); - -test('countPass', function (t) { - var r = checkUsage(function () { - return optimist('1 2 3 --moo'.split(' ')) - .usage('Usage: $0 [x] [y] [z] {OPTIONS}') - .demand(3) - .argv; - }); - t.same(r, { - result : { _ : [ '1', '2', '3' ], moo : true, $0 : './usage' }, - errors : [], - logs : [], - exit : false, - }); - t.end(); -}); - -test('countFail', function (t) { - var r = checkUsage(function () { - return optimist('1 2 --moo'.split(' ')) - .usage('Usage: $0 [x] [y] [z] {OPTIONS}') - .demand(3) - .argv; - }); - t.same( - r.result, - { _ : [ '1', '2' ], moo : true, $0 : './usage' } - ); - - t.same( - r.errors.join('\n').split(/\n+/), - [ - 'Usage: ./usage [x] [y] [z] {OPTIONS}', - 'Not enough non-option arguments: got 2, need at least 3', - ] - ); - - t.same(r.logs, []); - t.ok(r.exit); - t.end(); -}); - -test('defaultSingles', function (t) { - var r = checkUsage(function () { - return optimist('--foo 50 --baz 70 --powsy'.split(' ')) - .default('foo', 5) - .default('bar', 6) - .default('baz', 7) - .argv - ; - }); - t.same(r.result, { - foo : '50', - bar : 6, - baz : '70', - powsy : true, - _ : [], - $0 : './usage', - }); - t.end(); -}); - -test('defaultAliases', function (t) { - var r = checkUsage(function () { - return optimist('') - .alias('f', 'foo') - .default('f', 5) - .argv - ; - }); - t.same(r.result, { - f : '5', - foo : '5', - _ : [], - $0 : './usage', - }); - t.end(); -}); - -test('defaultHash', function (t) { - var r = checkUsage(function () { - return optimist('--foo 50 --baz 70'.split(' ')) - .default({ foo : 10, bar : 20, quux : 30 }) - .argv - ; - }); - t.same(r.result, { - _ : [], - $0 : './usage', - foo : 50, - baz : 70, - bar : 20, - quux : 30, - }); - t.end(); -}); - -test('rebase', function (t) { - t.equal( - optimist.rebase('/home/substack', '/home/substack/foo/bar/baz'), - './foo/bar/baz' - ); - t.equal( - optimist.rebase('/home/substack/foo/bar/baz', '/home/substack'), - '../../..' - ); - t.equal( - optimist.rebase('/home/substack/foo', '/home/substack/pow/zoom.txt'), - '../pow/zoom.txt' - ); - t.end(); -}); - -function checkUsage (f) { - - var exit = false; - - process._exit = process.exit; - process._env = process.env; - process._argv = process.argv; - - process.exit = function (t) { exit = true }; - process.env = Hash.merge(process.env, { _ : 'node' }); - process.argv = [ './usage' ]; - - var errors = []; - var logs = []; - - console._error = console.error; - console.error = function (msg) { errors.push(msg) }; - console._log = console.log; - console.log = function (msg) { logs.push(msg) }; - - var result = f(); - - process.exit = process._exit; - process.env = process._env; - process.argv = process._argv; - - console.error = console._error; - console.log = console._log; - - return { - errors : errors, - logs : logs, - exit : exit, - result : result, - }; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/whitespace.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/whitespace.js deleted file mode 100644 index 90b9075..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/whitespace.js +++ /dev/null @@ -1,8 +0,0 @@ -var optimist = require('../'); -var test = require('tap').test; - -test('whitespace should be whitespace' , function (t) { - t.plan(1); - var x = optimist.parse([ '-x', '\t' ]).x; - t.equal(x, '\t'); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.npmignore deleted file mode 100644 index 3dddf3f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -dist/* -node_modules/* diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.travis.yml deleted file mode 100644 index ddc9c4f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.8 - - "0.10" \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/CHANGELOG.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/CHANGELOG.md deleted file mode 100644 index 2e7ca5d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/CHANGELOG.md +++ /dev/null @@ -1,194 +0,0 @@ -# Change Log - -## 0.1.43 - -* Performance improvements for `SourceMapGenerator` and `SourceNode`. See issue - #148 for some discussion and issues #150, #151, and #152 for implementations. - -## 0.1.42 - -* Fix an issue where `SourceNode`s from different versions of the source-map - library couldn't be used in conjunction with each other. See issue #142. - -## 0.1.41 - -* Fix a bug with getting the source content of relative sources with a "./" - prefix. See issue #145 and [Bug 1090768](bugzil.la/1090768). - -* Add the `SourceMapConsumer.prototype.computeColumnSpans` method to compute the - column span of each mapping. - -* Add the `SourceMapConsumer.prototype.allGeneratedPositionsFor` method to find - all generated positions associated with a given original source and line. - -## 0.1.40 - -* Performance improvements for parsing source maps in SourceMapConsumer. - -## 0.1.39 - -* Fix a bug where setting a source's contents to null before any source content - had been set before threw a TypeError. See issue #131. - -## 0.1.38 - -* Fix a bug where finding relative paths from an empty path were creating - absolute paths. See issue #129. - -## 0.1.37 - -* Fix a bug where if the source root was an empty string, relative source paths - would turn into absolute source paths. Issue #124. - -## 0.1.36 - -* Allow the `names` mapping property to be an empty string. Issue #121. - -## 0.1.35 - -* A third optional parameter was added to `SourceNode.fromStringWithSourceMap` - to specify a path that relative sources in the second parameter should be - relative to. Issue #105. - -* If no file property is given to a `SourceMapGenerator`, then the resulting - source map will no longer have a `null` file property. The property will - simply not exist. Issue #104. - -* Fixed a bug where consecutive newlines were ignored in `SourceNode`s. - Issue #116. - -## 0.1.34 - -* Make `SourceNode` work with windows style ("\r\n") newlines. Issue #103. - -* Fix bug involving source contents and the - `SourceMapGenerator.prototype.applySourceMap`. Issue #100. - -## 0.1.33 - -* Fix some edge cases surrounding path joining and URL resolution. - -* Add a third parameter for relative path to - `SourceMapGenerator.prototype.applySourceMap`. - -* Fix issues with mappings and EOLs. - -## 0.1.32 - -* Fixed a bug where SourceMapConsumer couldn't handle negative relative columns - (issue 92). - -* Fixed test runner to actually report number of failed tests as its process - exit code. - -* Fixed a typo when reporting bad mappings (issue 87). - -## 0.1.31 - -* Delay parsing the mappings in SourceMapConsumer until queried for a source - location. - -* Support Sass source maps (which at the time of writing deviate from the spec - in small ways) in SourceMapConsumer. - -## 0.1.30 - -* Do not join source root with a source, when the source is a data URI. - -* Extend the test runner to allow running single specific test files at a time. - -* Performance improvements in `SourceNode.prototype.walk` and - `SourceMapConsumer.prototype.eachMapping`. - -* Source map browser builds will now work inside Workers. - -* Better error messages when attempting to add an invalid mapping to a - `SourceMapGenerator`. - -## 0.1.29 - -* Allow duplicate entries in the `names` and `sources` arrays of source maps - (usually from TypeScript) we are parsing. Fixes github issue 72. - -## 0.1.28 - -* Skip duplicate mappings when creating source maps from SourceNode; github - issue 75. - -## 0.1.27 - -* Don't throw an error when the `file` property is missing in SourceMapConsumer, - we don't use it anyway. - -## 0.1.26 - -* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70. - -## 0.1.25 - -* Make compatible with browserify - -## 0.1.24 - -* Fix issue with absolute paths and `file://` URIs. See - https://bugzilla.mozilla.org/show_bug.cgi?id=885597 - -## 0.1.23 - -* Fix issue with absolute paths and sourcesContent, github issue 64. - -## 0.1.22 - -* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21. - -## 0.1.21 - -* Fixed handling of sources that start with a slash so that they are relative to - the source root's host. - -## 0.1.20 - -* Fixed github issue #43: absolute URLs aren't joined with the source root - anymore. - -## 0.1.19 - -* Using Travis CI to run tests. - -## 0.1.18 - -* Fixed a bug in the handling of sourceRoot. - -## 0.1.17 - -* Added SourceNode.fromStringWithSourceMap. - -## 0.1.16 - -* Added missing documentation. - -* Fixed the generating of empty mappings in SourceNode. - -## 0.1.15 - -* Added SourceMapGenerator.applySourceMap. - -## 0.1.14 - -* The sourceRoot is now handled consistently. - -## 0.1.13 - -* Added SourceMapGenerator.fromSourceMap. - -## 0.1.12 - -* SourceNode now generates empty mappings too. - -## 0.1.11 - -* Added name support to SourceNode. - -## 0.1.10 - -* Added sourcesContent support to the customer and generator. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/LICENSE deleted file mode 100644 index ed1b7cf..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ - -Copyright (c) 2009-2011, Mozilla Foundation and contributors -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 names of the Mozilla Foundation nor the names of project - 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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/Makefile.dryice.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/Makefile.dryice.js deleted file mode 100644 index d6fc26a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/Makefile.dryice.js +++ /dev/null @@ -1,166 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -var path = require('path'); -var fs = require('fs'); -var copy = require('dryice').copy; - -function removeAmdefine(src) { - src = String(src).replace( - /if\s*\(typeof\s*define\s*!==\s*'function'\)\s*{\s*var\s*define\s*=\s*require\('amdefine'\)\(module,\s*require\);\s*}\s*/g, - ''); - src = src.replace( - /\b(define\(.*)('amdefine',?)/gm, - '$1'); - return src; -} -removeAmdefine.onRead = true; - -function makeNonRelative(src) { - return src - .replace(/require\('.\//g, 'require(\'source-map/') - .replace(/\.\.\/\.\.\/lib\//g, ''); -} -makeNonRelative.onRead = true; - -function buildBrowser() { - console.log('\nCreating dist/source-map.js'); - - var project = copy.createCommonJsProject({ - roots: [ path.join(__dirname, 'lib') ] - }); - - copy({ - source: [ - 'build/mini-require.js', - { - project: project, - require: [ 'source-map/source-map-generator', - 'source-map/source-map-consumer', - 'source-map/source-node'] - }, - 'build/suffix-browser.js' - ], - filter: [ - copy.filter.moduleDefines, - removeAmdefine - ], - dest: 'dist/source-map.js' - }); -} - -function buildBrowserMin() { - console.log('\nCreating dist/source-map.min.js'); - - copy({ - source: 'dist/source-map.js', - filter: copy.filter.uglifyjs, - dest: 'dist/source-map.min.js' - }); -} - -function buildFirefox() { - console.log('\nCreating dist/SourceMap.jsm'); - - var project = copy.createCommonJsProject({ - roots: [ path.join(__dirname, 'lib') ] - }); - - copy({ - source: [ - 'build/prefix-source-map.jsm', - { - project: project, - require: [ 'source-map/source-map-consumer', - 'source-map/source-map-generator', - 'source-map/source-node' ] - }, - 'build/suffix-source-map.jsm' - ], - filter: [ - copy.filter.moduleDefines, - removeAmdefine, - makeNonRelative - ], - dest: 'dist/SourceMap.jsm' - }); - - // Create dist/test/Utils.jsm - console.log('\nCreating dist/test/Utils.jsm'); - - project = copy.createCommonJsProject({ - roots: [ __dirname, path.join(__dirname, 'lib') ] - }); - - copy({ - source: [ - 'build/prefix-utils.jsm', - 'build/assert-shim.js', - { - project: project, - require: [ 'test/source-map/util' ] - }, - 'build/suffix-utils.jsm' - ], - filter: [ - copy.filter.moduleDefines, - removeAmdefine, - makeNonRelative - ], - dest: 'dist/test/Utils.jsm' - }); - - function isTestFile(f) { - return /^test\-.*?\.js/.test(f); - } - - var testFiles = fs.readdirSync(path.join(__dirname, 'test', 'source-map')).filter(isTestFile); - - testFiles.forEach(function (testFile) { - console.log('\nCreating', path.join('dist', 'test', testFile.replace(/\-/g, '_'))); - - copy({ - source: [ - 'build/test-prefix.js', - path.join('test', 'source-map', testFile), - 'build/test-suffix.js' - ], - filter: [ - removeAmdefine, - makeNonRelative, - function (input, source) { - return input.replace('define(', - 'define("' - + path.join('test', 'source-map', testFile.replace(/\.js$/, '')) - + '", ["require", "exports", "module"], '); - }, - function (input, source) { - return input.replace('{THIS_MODULE}', function () { - return "test/source-map/" + testFile.replace(/\.js$/, ''); - }); - } - ], - dest: path.join('dist', 'test', testFile.replace(/\-/g, '_')) - }); - }); -} - -function ensureDir(name) { - var dirExists = false; - try { - dirExists = fs.statSync(name).isDirectory(); - } catch (err) {} - - if (!dirExists) { - fs.mkdirSync(name, 0777); - } -} - -ensureDir("dist"); -ensureDir("dist/test"); -buildFirefox(); -buildBrowser(); -buildBrowserMin(); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/README.md deleted file mode 100644 index 59767aa..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/README.md +++ /dev/null @@ -1,475 +0,0 @@ -# Source Map - -This is a library to generate and consume the source map format -[described here][format]. - -This library is written in the Asynchronous Module Definition format, and works -in the following environments: - -* Modern Browsers supporting ECMAScript 5 (either after the build, or with an - AMD loader such as RequireJS) - -* Inside Firefox (as a JSM file, after the build) - -* With NodeJS versions 0.8.X and higher - -## Node - - $ npm install source-map - -## Building from Source (for everywhere else) - -Install Node and then run - - $ git clone https://fitzgen@github.com/mozilla/source-map.git - $ cd source-map - $ npm link . - -Next, run - - $ node Makefile.dryice.js - -This should spew a bunch of stuff to stdout, and create the following files: - -* `dist/source-map.js` - The unminified browser version. - -* `dist/source-map.min.js` - The minified browser version. - -* `dist/SourceMap.jsm` - The JavaScript Module for inclusion in Firefox source. - -## Examples - -### Consuming a source map - - var rawSourceMap = { - version: 3, - file: 'min.js', - names: ['bar', 'baz', 'n'], - sources: ['one.js', 'two.js'], - sourceRoot: 'http://example.com/www/js/', - mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' - }; - - var smc = new SourceMapConsumer(rawSourceMap); - - console.log(smc.sources); - // [ 'http://example.com/www/js/one.js', - // 'http://example.com/www/js/two.js' ] - - console.log(smc.originalPositionFor({ - line: 2, - column: 28 - })); - // { source: 'http://example.com/www/js/two.js', - // line: 2, - // column: 10, - // name: 'n' } - - console.log(smc.generatedPositionFor({ - source: 'http://example.com/www/js/two.js', - line: 2, - column: 10 - })); - // { line: 2, column: 28 } - - smc.eachMapping(function (m) { - // ... - }); - -### Generating a source map - -In depth guide: -[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) - -#### With SourceNode (high level API) - - function compile(ast) { - switch (ast.type) { - case 'BinaryExpression': - return new SourceNode( - ast.location.line, - ast.location.column, - ast.location.source, - [compile(ast.left), " + ", compile(ast.right)] - ); - case 'Literal': - return new SourceNode( - ast.location.line, - ast.location.column, - ast.location.source, - String(ast.value) - ); - // ... - default: - throw new Error("Bad AST"); - } - } - - var ast = parse("40 + 2", "add.js"); - console.log(compile(ast).toStringWithSourceMap({ - file: 'add.js' - })); - // { code: '40 + 2', - // map: [object SourceMapGenerator] } - -#### With SourceMapGenerator (low level API) - - var map = new SourceMapGenerator({ - file: "source-mapped.js" - }); - - map.addMapping({ - generated: { - line: 10, - column: 35 - }, - source: "foo.js", - original: { - line: 33, - column: 2 - }, - name: "christopher" - }); - - console.log(map.toString()); - // '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' - -## API - -Get a reference to the module: - - // NodeJS - var sourceMap = require('source-map'); - - // Browser builds - var sourceMap = window.sourceMap; - - // Inside Firefox - let sourceMap = {}; - Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap); - -### SourceMapConsumer - -A SourceMapConsumer instance represents a parsed source map which we can query -for information about the original file positions by giving it a file position -in the generated source. - -#### new SourceMapConsumer(rawSourceMap) - -The only parameter is the raw source map (either as a string which can be -`JSON.parse`'d, or an object). According to the spec, source maps have the -following attributes: - -* `version`: Which version of the source map spec this map is following. - -* `sources`: An array of URLs to the original source files. - -* `names`: An array of identifiers which can be referrenced by individual - mappings. - -* `sourceRoot`: Optional. The URL root from which all sources are relative. - -* `sourcesContent`: Optional. An array of contents of the original source files. - -* `mappings`: A string of base64 VLQs which contain the actual mappings. - -* `file`: Optional. The generated filename this source map is associated with. - -#### SourceMapConsumer.prototype.computeColumnSpans() - -Compute the last column for each generated mapping. The last column is -inclusive. - -#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) - -Returns the original source, line, and column information for the generated -source's line and column positions provided. The only argument is an object with -the following properties: - -* `line`: The line number in the generated source. - -* `column`: The column number in the generated source. - -and an object is returned with the following properties: - -* `source`: The original source file, or null if this information is not - available. - -* `line`: The line number in the original source, or null if this information is - not available. - -* `column`: The column number in the original source, or null or null if this - information is not available. - -* `name`: The original identifier, or null if this information is not available. - -#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) - -Returns the generated line and column information for the original source, -line, and column positions provided. The only argument is an object with -the following properties: - -* `source`: The filename of the original source. - -* `line`: The line number in the original source. - -* `column`: The column number in the original source. - -and an object is returned with the following properties: - -* `line`: The line number in the generated source, or null. - -* `column`: The column number in the generated source, or null. - -#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition) - -Returns all generated line and column information for the original source -and line provided. The only argument is an object with the following -properties: - -* `source`: The filename of the original source. - -* `line`: The line number in the original source. - -and an array of objects is returned, each with the following properties: - -* `line`: The line number in the generated source, or null. - -* `column`: The column number in the generated source, or null. - -#### SourceMapConsumer.prototype.sourceContentFor(source) - -Returns the original source content for the source provided. The only -argument is the URL of the original source file. - -#### SourceMapConsumer.prototype.eachMapping(callback, context, order) - -Iterate over each mapping between an original source/line/column and a -generated line/column in this source map. - -* `callback`: The function that is called with each mapping. Mappings have the - form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, - name }` - -* `context`: Optional. If specified, this object will be the value of `this` - every time that `callback` is called. - -* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or - `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over - the mappings sorted by the generated file's line/column order or the - original's source/line/column order, respectively. Defaults to - `SourceMapConsumer.GENERATED_ORDER`. - -### SourceMapGenerator - -An instance of the SourceMapGenerator represents a source map which is being -built incrementally. - -#### new SourceMapGenerator([startOfSourceMap]) - -You may pass an object with the following properties: - -* `file`: The filename of the generated source that this source map is - associated with. - -* `sourceRoot`: A root for all relative URLs in this source map. - -* `skipValidation`: Optional. When `true`, disables validation of mappings as - they are added. This can improve performance but should be used with - discretion, as a last resort. Even then, one should avoid using this flag when - running tests, if possible. - -#### SourceMapGenerator.fromSourceMap(sourceMapConsumer) - -Creates a new SourceMapGenerator based on a SourceMapConsumer - -* `sourceMapConsumer` The SourceMap. - -#### SourceMapGenerator.prototype.addMapping(mapping) - -Add a single mapping from original source line and column to the generated -source's line and column for this source map being created. The mapping object -should have the following properties: - -* `generated`: An object with the generated line and column positions. - -* `original`: An object with the original line and column positions. - -* `source`: The original source file (relative to the sourceRoot). - -* `name`: An optional original token name for this mapping. - -#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) - -Set the source content for an original source file. - -* `sourceFile` the URL of the original source file. - -* `sourceContent` the content of the source file. - -#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]]) - -Applies a SourceMap for a source file to the SourceMap. -Each mapping to the supplied source file is rewritten using the -supplied SourceMap. Note: The resolution for the resulting mappings -is the minimium of this map and the supplied map. - -* `sourceMapConsumer`: The SourceMap to be applied. - -* `sourceFile`: Optional. The filename of the source file. - If omitted, sourceMapConsumer.file will be used, if it exists. - Otherwise an error will be thrown. - -* `sourceMapPath`: Optional. The dirname of the path to the SourceMap - to be applied. If relative, it is relative to the SourceMap. - - This parameter is needed when the two SourceMaps aren't in the same - directory, and the SourceMap to be applied contains relative source - paths. If so, those relative source paths need to be rewritten - relative to the SourceMap. - - If omitted, it is assumed that both SourceMaps are in the same directory, - thus not needing any rewriting. (Supplying `'.'` has the same effect.) - -#### SourceMapGenerator.prototype.toString() - -Renders the source map being generated to a string. - -### SourceNode - -SourceNodes provide a way to abstract over interpolating and/or concatenating -snippets of generated JavaScript source code, while maintaining the line and -column information associated between those snippets and the original source -code. This is useful as the final intermediate representation a compiler might -use before outputting the generated JS and source map. - -#### new SourceNode([line, column, source[, chunk[, name]]]) - -* `line`: The original line number associated with this source node, or null if - it isn't associated with an original line. - -* `column`: The original column number associated with this source node, or null - if it isn't associated with an original column. - -* `source`: The original source's filename; null if no filename is provided. - -* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see - below. - -* `name`: Optional. The original identifier. - -#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath]) - -Creates a SourceNode from generated code and a SourceMapConsumer. - -* `code`: The generated code - -* `sourceMapConsumer` The SourceMap for the generated code - -* `relativePath` The optional path that relative sources in `sourceMapConsumer` - should be relative to. - -#### SourceNode.prototype.add(chunk) - -Add a chunk of generated JS to this source node. - -* `chunk`: A string snippet of generated JS code, another instance of - `SourceNode`, or an array where each member is one of those things. - -#### SourceNode.prototype.prepend(chunk) - -Prepend a chunk of generated JS to this source node. - -* `chunk`: A string snippet of generated JS code, another instance of - `SourceNode`, or an array where each member is one of those things. - -#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) - -Set the source content for a source file. This will be added to the -`SourceMap` in the `sourcesContent` field. - -* `sourceFile`: The filename of the source file - -* `sourceContent`: The content of the source file - -#### SourceNode.prototype.walk(fn) - -Walk over the tree of JS snippets in this node and its children. The walking -function is called once for each snippet of JS and is passed that snippet and -the its original associated source's line/column location. - -* `fn`: The traversal function. - -#### SourceNode.prototype.walkSourceContents(fn) - -Walk over the tree of SourceNodes. The walking function is called for each -source file content and is passed the filename and source content. - -* `fn`: The traversal function. - -#### SourceNode.prototype.join(sep) - -Like `Array.prototype.join` except for SourceNodes. Inserts the separator -between each of this source node's children. - -* `sep`: The separator. - -#### SourceNode.prototype.replaceRight(pattern, replacement) - -Call `String.prototype.replace` on the very right-most source snippet. Useful -for trimming whitespace from the end of a source node, etc. - -* `pattern`: The pattern to replace. - -* `replacement`: The thing to replace the pattern with. - -#### SourceNode.prototype.toString() - -Return the string representation of this source node. Walks over the tree and -concatenates all the various snippets together to one string. - -#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap]) - -Returns the string representation of this tree of source nodes, plus a -SourceMapGenerator which contains all the mappings between the generated and -original sources. - -The arguments are the same as those to `new SourceMapGenerator`. - -## Tests - -[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map) - -Install NodeJS version 0.8.0 or greater, then run `node test/run-tests.js`. - -To add new tests, create a new file named `test/test-.js` -and export your test functions with names that start with "test", for example - - exports["test doing the foo bar"] = function (assert, util) { - ... - }; - -The new test will be located automatically when you run the suite. - -The `util` argument is the test utility module located at `test/source-map/util`. - -The `assert` argument is a cut down version of node's assert module. You have -access to the following assertion functions: - -* `doesNotThrow` - -* `equal` - -* `ok` - -* `strictEqual` - -* `throws` - -(The reason for the restricted set of test functions is because we need the -tests to run inside Firefox's test suite as well and so the assert module is -shimmed in that environment. See `build/assert-shim.js`.) - -[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit -[feature]: https://wiki.mozilla.org/DevTools/Features/SourceMap -[Dryice]: https://github.com/mozilla/dryice diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/assert-shim.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/assert-shim.js deleted file mode 100644 index daa1a62..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/assert-shim.js +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -define('test/source-map/assert', ['exports'], function (exports) { - - let do_throw = function (msg) { - throw new Error(msg); - }; - - exports.init = function (throw_fn) { - do_throw = throw_fn; - }; - - exports.doesNotThrow = function (fn) { - try { - fn(); - } - catch (e) { - do_throw(e.message); - } - }; - - exports.equal = function (actual, expected, msg) { - msg = msg || String(actual) + ' != ' + String(expected); - if (actual != expected) { - do_throw(msg); - } - }; - - exports.ok = function (val, msg) { - msg = msg || String(val) + ' is falsey'; - if (!Boolean(val)) { - do_throw(msg); - } - }; - - exports.strictEqual = function (actual, expected, msg) { - msg = msg || String(actual) + ' !== ' + String(expected); - if (actual !== expected) { - do_throw(msg); - } - }; - - exports.throws = function (fn) { - try { - fn(); - do_throw('Expected an error to be thrown, but it wasn\'t.'); - } - catch (e) { - } - }; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/mini-require.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/mini-require.js deleted file mode 100644 index 0daf453..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/mini-require.js +++ /dev/null @@ -1,152 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -/** - * Define a module along with a payload. - * @param {string} moduleName Name for the payload - * @param {ignored} deps Ignored. For compatibility with CommonJS AMD Spec - * @param {function} payload Function with (require, exports, module) params - */ -function define(moduleName, deps, payload) { - if (typeof moduleName != "string") { - throw new TypeError('Expected string, got: ' + moduleName); - } - - if (arguments.length == 2) { - payload = deps; - } - - if (moduleName in define.modules) { - throw new Error("Module already defined: " + moduleName); - } - define.modules[moduleName] = payload; -}; - -/** - * The global store of un-instantiated modules - */ -define.modules = {}; - - -/** - * We invoke require() in the context of a Domain so we can have multiple - * sets of modules running separate from each other. - * This contrasts with JSMs which are singletons, Domains allows us to - * optionally load a CommonJS module twice with separate data each time. - * Perhaps you want 2 command lines with a different set of commands in each, - * for example. - */ -function Domain() { - this.modules = {}; - this._currentModule = null; -} - -(function () { - - /** - * Lookup module names and resolve them by calling the definition function if - * needed. - * There are 2 ways to call this, either with an array of dependencies and a - * callback to call when the dependencies are found (which can happen - * asynchronously in an in-page context) or with a single string an no callback - * where the dependency is resolved synchronously and returned. - * The API is designed to be compatible with the CommonJS AMD spec and - * RequireJS. - * @param {string[]|string} deps A name, or names for the payload - * @param {function|undefined} callback Function to call when the dependencies - * are resolved - * @return {undefined|object} The module required or undefined for - * array/callback method - */ - Domain.prototype.require = function(deps, callback) { - if (Array.isArray(deps)) { - var params = deps.map(function(dep) { - return this.lookup(dep); - }, this); - if (callback) { - callback.apply(null, params); - } - return undefined; - } - else { - return this.lookup(deps); - } - }; - - function normalize(path) { - var bits = path.split('/'); - var i = 1; - while (i < bits.length) { - if (bits[i] === '..') { - bits.splice(i-1, 1); - } else if (bits[i] === '.') { - bits.splice(i, 1); - } else { - i++; - } - } - return bits.join('/'); - } - - function join(a, b) { - a = a.trim(); - b = b.trim(); - if (/^\//.test(b)) { - return b; - } else { - return a.replace(/\/*$/, '/') + b; - } - } - - function dirname(path) { - var bits = path.split('/'); - bits.pop(); - return bits.join('/'); - } - - /** - * Lookup module names and resolve them by calling the definition function if - * needed. - * @param {string} moduleName A name for the payload to lookup - * @return {object} The module specified by aModuleName or null if not found. - */ - Domain.prototype.lookup = function(moduleName) { - if (/^\./.test(moduleName)) { - moduleName = normalize(join(dirname(this._currentModule), moduleName)); - } - - if (moduleName in this.modules) { - var module = this.modules[moduleName]; - return module; - } - - if (!(moduleName in define.modules)) { - throw new Error("Module not defined: " + moduleName); - } - - var module = define.modules[moduleName]; - - if (typeof module == "function") { - var exports = {}; - var previousModule = this._currentModule; - this._currentModule = moduleName; - module(this.require.bind(this), exports, { id: moduleName, uri: "" }); - this._currentModule = previousModule; - module = exports; - } - - // cache the resulting module object for next time - this.modules[moduleName] = module; - - return module; - }; - -}()); - -define.Domain = Domain; -define.globalDomain = new Domain(); -var require = define.globalDomain.require.bind(define.globalDomain); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-source-map.jsm b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-source-map.jsm deleted file mode 100644 index ee2539d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-source-map.jsm +++ /dev/null @@ -1,20 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -/* - * WARNING! - * - * Do not edit this file directly, it is built from the sources at - * https://github.com/mozilla/source-map/ - */ - -/////////////////////////////////////////////////////////////////////////////// - - -this.EXPORTED_SYMBOLS = [ "SourceMapConsumer", "SourceMapGenerator", "SourceNode" ]; - -Components.utils.import('resource://gre/modules/devtools/Require.jsm'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-utils.jsm b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-utils.jsm deleted file mode 100644 index 80341d4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-utils.jsm +++ /dev/null @@ -1,18 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -/* - * WARNING! - * - * Do not edit this file directly, it is built from the sources at - * https://github.com/mozilla/source-map/ - */ - -Components.utils.import('resource://gre/modules/devtools/Require.jsm'); -Components.utils.import('resource://gre/modules/devtools/SourceMap.jsm'); - -this.EXPORTED_SYMBOLS = [ "define", "runSourceMapTests" ]; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-browser.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-browser.js deleted file mode 100644 index fb29ff5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-browser.js +++ /dev/null @@ -1,8 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/////////////////////////////////////////////////////////////////////////////// - -this.sourceMap = { - SourceMapConsumer: require('source-map/source-map-consumer').SourceMapConsumer, - SourceMapGenerator: require('source-map/source-map-generator').SourceMapGenerator, - SourceNode: require('source-map/source-node').SourceNode -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-source-map.jsm b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-source-map.jsm deleted file mode 100644 index cf3c2d8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-source-map.jsm +++ /dev/null @@ -1,6 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/////////////////////////////////////////////////////////////////////////////// - -this.SourceMapConsumer = require('source-map/source-map-consumer').SourceMapConsumer; -this.SourceMapGenerator = require('source-map/source-map-generator').SourceMapGenerator; -this.SourceNode = require('source-map/source-node').SourceNode; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-utils.jsm b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-utils.jsm deleted file mode 100644 index b31b84c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-utils.jsm +++ /dev/null @@ -1,21 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -function runSourceMapTests(modName, do_throw) { - let mod = require(modName); - let assert = require('test/source-map/assert'); - let util = require('test/source-map/util'); - - assert.init(do_throw); - - for (let k in mod) { - if (/^test/.test(k)) { - mod[k](assert, util); - } - } - -} -this.runSourceMapTests = runSourceMapTests; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-prefix.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-prefix.js deleted file mode 100644 index 1b13f30..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-prefix.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - * WARNING! - * - * Do not edit this file directly, it is built from the sources at - * https://github.com/mozilla/source-map/ - */ - -Components.utils.import('resource://test/Utils.jsm'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-suffix.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-suffix.js deleted file mode 100644 index bec2de3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-suffix.js +++ /dev/null @@ -1,3 +0,0 @@ -function run_test() { - runSourceMapTests('{THIS_MODULE}', do_throw); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map.js deleted file mode 100644 index 121ad24..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright 2009-2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE.txt or: - * http://opensource.org/licenses/BSD-3-Clause - */ -exports.SourceMapGenerator = require('./source-map/source-map-generator').SourceMapGenerator; -exports.SourceMapConsumer = require('./source-map/source-map-consumer').SourceMapConsumer; -exports.SourceNode = require('./source-map/source-node').SourceNode; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/array-set.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/array-set.js deleted file mode 100644 index 40f9a18..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/array-set.js +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var util = require('./util'); - - /** - * A data structure which is a combination of an array and a set. Adding a new - * member is O(1), testing for membership is O(1), and finding the index of an - * element is O(1). Removing elements from the set is not supported. Only - * strings are supported for membership. - */ - function ArraySet() { - this._array = []; - this._set = {}; - } - - /** - * Static method for creating ArraySet instances from an existing array. - */ - ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { - var set = new ArraySet(); - for (var i = 0, len = aArray.length; i < len; i++) { - set.add(aArray[i], aAllowDuplicates); - } - return set; - }; - - /** - * Add the given string to this set. - * - * @param String aStr - */ - ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { - var isDuplicate = this.has(aStr); - var idx = this._array.length; - if (!isDuplicate || aAllowDuplicates) { - this._array.push(aStr); - } - if (!isDuplicate) { - this._set[util.toSetString(aStr)] = idx; - } - }; - - /** - * Is the given string a member of this set? - * - * @param String aStr - */ - ArraySet.prototype.has = function ArraySet_has(aStr) { - return Object.prototype.hasOwnProperty.call(this._set, - util.toSetString(aStr)); - }; - - /** - * What is the index of the given string in the array? - * - * @param String aStr - */ - ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { - if (this.has(aStr)) { - return this._set[util.toSetString(aStr)]; - } - throw new Error('"' + aStr + '" is not in the set.'); - }; - - /** - * What is the element at the given index? - * - * @param Number aIdx - */ - ArraySet.prototype.at = function ArraySet_at(aIdx) { - if (aIdx >= 0 && aIdx < this._array.length) { - return this._array[aIdx]; - } - throw new Error('No element indexed by ' + aIdx); - }; - - /** - * Returns the array representation of this set (which has the proper indices - * indicated by indexOf). Note that this is a copy of the internal array used - * for storing the members so that no one can mess with internal state. - */ - ArraySet.prototype.toArray = function ArraySet_toArray() { - return this._array.slice(); - }; - - exports.ArraySet = ArraySet; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64-vlq.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64-vlq.js deleted file mode 100644 index e22dcae..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64-vlq.js +++ /dev/null @@ -1,142 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - * - * Based on the Base 64 VLQ implementation in Closure Compiler: - * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java - * - * Copyright 2011 The Closure Compiler Authors. All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var base64 = require('./base64'); - - // A single base 64 digit can contain 6 bits of data. For the base 64 variable - // length quantities we use in the source map spec, the first bit is the sign, - // the next four bits are the actual value, and the 6th bit is the - // continuation bit. The continuation bit tells us whether there are more - // digits in this value following this digit. - // - // Continuation - // | Sign - // | | - // V V - // 101011 - - var VLQ_BASE_SHIFT = 5; - - // binary: 100000 - var VLQ_BASE = 1 << VLQ_BASE_SHIFT; - - // binary: 011111 - var VLQ_BASE_MASK = VLQ_BASE - 1; - - // binary: 100000 - var VLQ_CONTINUATION_BIT = VLQ_BASE; - - /** - * Converts from a two-complement value to a value where the sign bit is - * placed in the least significant bit. For example, as decimals: - * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) - * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) - */ - function toVLQSigned(aValue) { - return aValue < 0 - ? ((-aValue) << 1) + 1 - : (aValue << 1) + 0; - } - - /** - * Converts to a two-complement value from a value where the sign bit is - * placed in the least significant bit. For example, as decimals: - * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 - * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 - */ - function fromVLQSigned(aValue) { - var isNegative = (aValue & 1) === 1; - var shifted = aValue >> 1; - return isNegative - ? -shifted - : shifted; - } - - /** - * Returns the base 64 VLQ encoded value. - */ - exports.encode = function base64VLQ_encode(aValue) { - var encoded = ""; - var digit; - - var vlq = toVLQSigned(aValue); - - do { - digit = vlq & VLQ_BASE_MASK; - vlq >>>= VLQ_BASE_SHIFT; - if (vlq > 0) { - // There are still more digits in this value, so we must make sure the - // continuation bit is marked. - digit |= VLQ_CONTINUATION_BIT; - } - encoded += base64.encode(digit); - } while (vlq > 0); - - return encoded; - }; - - /** - * Decodes the next base 64 VLQ value from the given string and returns the - * value and the rest of the string via the out parameter. - */ - exports.decode = function base64VLQ_decode(aStr, aOutParam) { - var i = 0; - var strLen = aStr.length; - var result = 0; - var shift = 0; - var continuation, digit; - - do { - if (i >= strLen) { - throw new Error("Expected more digits in base 64 VLQ value."); - } - digit = base64.decode(aStr.charAt(i++)); - continuation = !!(digit & VLQ_CONTINUATION_BIT); - digit &= VLQ_BASE_MASK; - result = result + (digit << shift); - shift += VLQ_BASE_SHIFT; - } while (continuation); - - aOutParam.value = fromVLQSigned(result); - aOutParam.rest = aStr.slice(i); - }; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64.js deleted file mode 100644 index 863cc46..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64.js +++ /dev/null @@ -1,42 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var charToIntMap = {}; - var intToCharMap = {}; - - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' - .split('') - .forEach(function (ch, index) { - charToIntMap[ch] = index; - intToCharMap[index] = ch; - }); - - /** - * Encode an integer in the range of 0 to 63 to a single base 64 digit. - */ - exports.encode = function base64_encode(aNumber) { - if (aNumber in intToCharMap) { - return intToCharMap[aNumber]; - } - throw new TypeError("Must be between 0 and 63: " + aNumber); - }; - - /** - * Decode a single base 64 digit to an integer. - */ - exports.decode = function base64_decode(aChar) { - if (aChar in charToIntMap) { - return charToIntMap[aChar]; - } - throw new TypeError("Not a valid base 64 digit: " + aChar); - }; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/binary-search.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/binary-search.js deleted file mode 100644 index e085f81..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/binary-search.js +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - /** - * Recursive implementation of binary search. - * - * @param aLow Indices here and lower do not contain the needle. - * @param aHigh Indices here and higher do not contain the needle. - * @param aNeedle The element being searched for. - * @param aHaystack The non-empty array being searched. - * @param aCompare Function which takes two elements and returns -1, 0, or 1. - */ - function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) { - // This function terminates when one of the following is true: - // - // 1. We find the exact element we are looking for. - // - // 2. We did not find the exact element, but we can return the index of - // the next closest element that is less than that element. - // - // 3. We did not find the exact element, and there is no next-closest - // element which is less than the one we are searching for, so we - // return -1. - var mid = Math.floor((aHigh - aLow) / 2) + aLow; - var cmp = aCompare(aNeedle, aHaystack[mid], true); - if (cmp === 0) { - // Found the element we are looking for. - return mid; - } - else if (cmp > 0) { - // aHaystack[mid] is greater than our needle. - if (aHigh - mid > 1) { - // The element is in the upper half. - return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare); - } - // We did not find an exact match, return the next closest one - // (termination case 2). - return mid; - } - else { - // aHaystack[mid] is less than our needle. - if (mid - aLow > 1) { - // The element is in the lower half. - return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare); - } - // The exact needle element was not found in this haystack. Determine if - // we are in termination case (2) or (3) and return the appropriate thing. - return aLow < 0 ? -1 : aLow; - } - } - - /** - * This is an implementation of binary search which will always try and return - * the index of next lowest value checked if there is no exact hit. This is - * because mappings between original and generated line/col pairs are single - * points, and there is an implicit region between each of them, so a miss - * just means that you aren't on the very start of a region. - * - * @param aNeedle The element you are looking for. - * @param aHaystack The array that is being searched. - * @param aCompare A function which takes the needle and an element in the - * array and returns -1, 0, or 1 depending on whether the needle is less - * than, equal to, or greater than the element, respectively. - */ - exports.search = function search(aNeedle, aHaystack, aCompare) { - if (aHaystack.length === 0) { - return -1; - } - return recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare) - }; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/mapping-list.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/mapping-list.js deleted file mode 100644 index 2a4eb61..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/mapping-list.js +++ /dev/null @@ -1,86 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2014 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var util = require('./util'); - - /** - * Determine whether mappingB is after mappingA with respect to generated - * position. - */ - function generatedPositionAfter(mappingA, mappingB) { - // Optimized for most common case - var lineA = mappingA.generatedLine; - var lineB = mappingB.generatedLine; - var columnA = mappingA.generatedColumn; - var columnB = mappingB.generatedColumn; - return lineB > lineA || lineB == lineA && columnB >= columnA || - util.compareByGeneratedPositions(mappingA, mappingB) <= 0; - } - - /** - * A data structure to provide a sorted view of accumulated mappings in a - * performance conscious manner. It trades a neglibable overhead in general - * case for a large speedup in case of mappings being added in order. - */ - function MappingList() { - this._array = []; - this._sorted = true; - // Serves as infimum - this._last = {generatedLine: -1, generatedColumn: 0}; - } - - /** - * Iterate through internal items. This method takes the same arguments that - * `Array.prototype.forEach` takes. - * - * NOTE: The order of the mappings is NOT guaranteed. - */ - MappingList.prototype.unsortedForEach = - function MappingList_forEach(aCallback, aThisArg) { - this._array.forEach(aCallback, aThisArg); - }; - - /** - * Add the given source mapping. - * - * @param Object aMapping - */ - MappingList.prototype.add = function MappingList_add(aMapping) { - var mapping; - if (generatedPositionAfter(this._last, aMapping)) { - this._last = aMapping; - this._array.push(aMapping); - } else { - this._sorted = false; - this._array.push(aMapping); - } - }; - - /** - * Returns the flat, sorted array of mappings. The mappings are sorted by - * generated position. - * - * WARNING: This method returns internal data without copying, for - * performance. The return value must NOT be mutated, and should be treated as - * an immutable borrow. If you want to take ownership, you must make your own - * copy. - */ - MappingList.prototype.toArray = function MappingList_toArray() { - if (!this._sorted) { - this._array.sort(util.compareByGeneratedPositions); - this._sorted = true; - } - return this._array; - }; - - exports.MappingList = MappingList; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-consumer.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-consumer.js deleted file mode 100644 index cfaa299..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-consumer.js +++ /dev/null @@ -1,575 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var util = require('./util'); - var binarySearch = require('./binary-search'); - var ArraySet = require('./array-set').ArraySet; - var base64VLQ = require('./base64-vlq'); - - /** - * A SourceMapConsumer instance represents a parsed source map which we can - * query for information about the original file positions by giving it a file - * position in the generated source. - * - * The only parameter is the raw source map (either as a JSON string, or - * already parsed to an object). According to the spec, source maps have the - * following attributes: - * - * - version: Which version of the source map spec this map is following. - * - sources: An array of URLs to the original source files. - * - names: An array of identifiers which can be referrenced by individual mappings. - * - sourceRoot: Optional. The URL root from which all sources are relative. - * - sourcesContent: Optional. An array of contents of the original source files. - * - mappings: A string of base64 VLQs which contain the actual mappings. - * - file: Optional. The generated file this source map is associated with. - * - * Here is an example source map, taken from the source map spec[0]: - * - * { - * version : 3, - * file: "out.js", - * sourceRoot : "", - * sources: ["foo.js", "bar.js"], - * names: ["src", "maps", "are", "fun"], - * mappings: "AA,AB;;ABCDE;" - * } - * - * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# - */ - function SourceMapConsumer(aSourceMap) { - var sourceMap = aSourceMap; - if (typeof aSourceMap === 'string') { - sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); - } - - var version = util.getArg(sourceMap, 'version'); - var sources = util.getArg(sourceMap, 'sources'); - // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which - // requires the array) to play nice here. - var names = util.getArg(sourceMap, 'names', []); - var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); - var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); - var mappings = util.getArg(sourceMap, 'mappings'); - var file = util.getArg(sourceMap, 'file', null); - - // Once again, Sass deviates from the spec and supplies the version as a - // string rather than a number, so we use loose equality checking here. - if (version != this._version) { - throw new Error('Unsupported version: ' + version); - } - - // Some source maps produce relative source paths like "./foo.js" instead of - // "foo.js". Normalize these first so that future comparisons will succeed. - // See bugzil.la/1090768. - sources = sources.map(util.normalize); - - // Pass `true` below to allow duplicate names and sources. While source maps - // are intended to be compressed and deduplicated, the TypeScript compiler - // sometimes generates source maps with duplicates in them. See Github issue - // #72 and bugzil.la/889492. - this._names = ArraySet.fromArray(names, true); - this._sources = ArraySet.fromArray(sources, true); - - this.sourceRoot = sourceRoot; - this.sourcesContent = sourcesContent; - this._mappings = mappings; - this.file = file; - } - - /** - * Create a SourceMapConsumer from a SourceMapGenerator. - * - * @param SourceMapGenerator aSourceMap - * The source map that will be consumed. - * @returns SourceMapConsumer - */ - SourceMapConsumer.fromSourceMap = - function SourceMapConsumer_fromSourceMap(aSourceMap) { - var smc = Object.create(SourceMapConsumer.prototype); - - smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); - smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); - smc.sourceRoot = aSourceMap._sourceRoot; - smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), - smc.sourceRoot); - smc.file = aSourceMap._file; - - smc.__generatedMappings = aSourceMap._mappings.toArray().slice(); - smc.__originalMappings = aSourceMap._mappings.toArray().slice() - .sort(util.compareByOriginalPositions); - - return smc; - }; - - /** - * The version of the source mapping spec that we are consuming. - */ - SourceMapConsumer.prototype._version = 3; - - /** - * The list of original sources. - */ - Object.defineProperty(SourceMapConsumer.prototype, 'sources', { - get: function () { - return this._sources.toArray().map(function (s) { - return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; - }, this); - } - }); - - // `__generatedMappings` and `__originalMappings` are arrays that hold the - // parsed mapping coordinates from the source map's "mappings" attribute. They - // are lazily instantiated, accessed via the `_generatedMappings` and - // `_originalMappings` getters respectively, and we only parse the mappings - // and create these arrays once queried for a source location. We jump through - // these hoops because there can be many thousands of mappings, and parsing - // them is expensive, so we only want to do it if we must. - // - // Each object in the arrays is of the form: - // - // { - // generatedLine: The line number in the generated code, - // generatedColumn: The column number in the generated code, - // source: The path to the original source file that generated this - // chunk of code, - // originalLine: The line number in the original source that - // corresponds to this chunk of generated code, - // originalColumn: The column number in the original source that - // corresponds to this chunk of generated code, - // name: The name of the original symbol which generated this chunk of - // code. - // } - // - // All properties except for `generatedLine` and `generatedColumn` can be - // `null`. - // - // `_generatedMappings` is ordered by the generated positions. - // - // `_originalMappings` is ordered by the original positions. - - SourceMapConsumer.prototype.__generatedMappings = null; - Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { - get: function () { - if (!this.__generatedMappings) { - this.__generatedMappings = []; - this.__originalMappings = []; - this._parseMappings(this._mappings, this.sourceRoot); - } - - return this.__generatedMappings; - } - }); - - SourceMapConsumer.prototype.__originalMappings = null; - Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { - get: function () { - if (!this.__originalMappings) { - this.__generatedMappings = []; - this.__originalMappings = []; - this._parseMappings(this._mappings, this.sourceRoot); - } - - return this.__originalMappings; - } - }); - - SourceMapConsumer.prototype._nextCharIsMappingSeparator = - function SourceMapConsumer_nextCharIsMappingSeparator(aStr) { - var c = aStr.charAt(0); - return c === ";" || c === ","; - }; - - /** - * Parse the mappings in a string in to a data structure which we can easily - * query (the ordered arrays in the `this.__generatedMappings` and - * `this.__originalMappings` properties). - */ - SourceMapConsumer.prototype._parseMappings = - function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { - var generatedLine = 1; - var previousGeneratedColumn = 0; - var previousOriginalLine = 0; - var previousOriginalColumn = 0; - var previousSource = 0; - var previousName = 0; - var str = aStr; - var temp = {}; - var mapping; - - while (str.length > 0) { - if (str.charAt(0) === ';') { - generatedLine++; - str = str.slice(1); - previousGeneratedColumn = 0; - } - else if (str.charAt(0) === ',') { - str = str.slice(1); - } - else { - mapping = {}; - mapping.generatedLine = generatedLine; - - // Generated column. - base64VLQ.decode(str, temp); - mapping.generatedColumn = previousGeneratedColumn + temp.value; - previousGeneratedColumn = mapping.generatedColumn; - str = temp.rest; - - if (str.length > 0 && !this._nextCharIsMappingSeparator(str)) { - // Original source. - base64VLQ.decode(str, temp); - mapping.source = this._sources.at(previousSource + temp.value); - previousSource += temp.value; - str = temp.rest; - if (str.length === 0 || this._nextCharIsMappingSeparator(str)) { - throw new Error('Found a source, but no line and column'); - } - - // Original line. - base64VLQ.decode(str, temp); - mapping.originalLine = previousOriginalLine + temp.value; - previousOriginalLine = mapping.originalLine; - // Lines are stored 0-based - mapping.originalLine += 1; - str = temp.rest; - if (str.length === 0 || this._nextCharIsMappingSeparator(str)) { - throw new Error('Found a source and line, but no column'); - } - - // Original column. - base64VLQ.decode(str, temp); - mapping.originalColumn = previousOriginalColumn + temp.value; - previousOriginalColumn = mapping.originalColumn; - str = temp.rest; - - if (str.length > 0 && !this._nextCharIsMappingSeparator(str)) { - // Original name. - base64VLQ.decode(str, temp); - mapping.name = this._names.at(previousName + temp.value); - previousName += temp.value; - str = temp.rest; - } - } - - this.__generatedMappings.push(mapping); - if (typeof mapping.originalLine === 'number') { - this.__originalMappings.push(mapping); - } - } - } - - this.__generatedMappings.sort(util.compareByGeneratedPositions); - this.__originalMappings.sort(util.compareByOriginalPositions); - }; - - /** - * Find the mapping that best matches the hypothetical "needle" mapping that - * we are searching for in the given "haystack" of mappings. - */ - SourceMapConsumer.prototype._findMapping = - function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, - aColumnName, aComparator) { - // To return the position we are searching for, we must first find the - // mapping for the given position and then return the opposite position it - // points to. Because the mappings are sorted, we can use binary search to - // find the best mapping. - - if (aNeedle[aLineName] <= 0) { - throw new TypeError('Line must be greater than or equal to 1, got ' - + aNeedle[aLineName]); - } - if (aNeedle[aColumnName] < 0) { - throw new TypeError('Column must be greater than or equal to 0, got ' - + aNeedle[aColumnName]); - } - - return binarySearch.search(aNeedle, aMappings, aComparator); - }; - - /** - * Compute the last column for each generated mapping. The last column is - * inclusive. - */ - SourceMapConsumer.prototype.computeColumnSpans = - function SourceMapConsumer_computeColumnSpans() { - for (var index = 0; index < this._generatedMappings.length; ++index) { - var mapping = this._generatedMappings[index]; - - // Mappings do not contain a field for the last generated columnt. We - // can come up with an optimistic estimate, however, by assuming that - // mappings are contiguous (i.e. given two consecutive mappings, the - // first mapping ends where the second one starts). - if (index + 1 < this._generatedMappings.length) { - var nextMapping = this._generatedMappings[index + 1]; - - if (mapping.generatedLine === nextMapping.generatedLine) { - mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; - continue; - } - } - - // The last mapping for each line spans the entire line. - mapping.lastGeneratedColumn = Infinity; - } - }; - - /** - * Returns the original source, line, and column information for the generated - * source's line and column positions provided. The only argument is an object - * with the following properties: - * - * - line: The line number in the generated source. - * - column: The column number in the generated source. - * - * and an object is returned with the following properties: - * - * - source: The original source file, or null. - * - line: The line number in the original source, or null. - * - column: The column number in the original source, or null. - * - name: The original identifier, or null. - */ - SourceMapConsumer.prototype.originalPositionFor = - function SourceMapConsumer_originalPositionFor(aArgs) { - var needle = { - generatedLine: util.getArg(aArgs, 'line'), - generatedColumn: util.getArg(aArgs, 'column') - }; - - var index = this._findMapping(needle, - this._generatedMappings, - "generatedLine", - "generatedColumn", - util.compareByGeneratedPositions); - - if (index >= 0) { - var mapping = this._generatedMappings[index]; - - if (mapping.generatedLine === needle.generatedLine) { - var source = util.getArg(mapping, 'source', null); - if (source != null && this.sourceRoot != null) { - source = util.join(this.sourceRoot, source); - } - return { - source: source, - line: util.getArg(mapping, 'originalLine', null), - column: util.getArg(mapping, 'originalColumn', null), - name: util.getArg(mapping, 'name', null) - }; - } - } - - return { - source: null, - line: null, - column: null, - name: null - }; - }; - - /** - * Returns the original source content. The only argument is the url of the - * original source file. Returns null if no original source content is - * availible. - */ - SourceMapConsumer.prototype.sourceContentFor = - function SourceMapConsumer_sourceContentFor(aSource) { - if (!this.sourcesContent) { - return null; - } - - if (this.sourceRoot != null) { - aSource = util.relative(this.sourceRoot, aSource); - } - - if (this._sources.has(aSource)) { - return this.sourcesContent[this._sources.indexOf(aSource)]; - } - - var url; - if (this.sourceRoot != null - && (url = util.urlParse(this.sourceRoot))) { - // XXX: file:// URIs and absolute paths lead to unexpected behavior for - // many users. We can help them out when they expect file:// URIs to - // behave like it would if they were running a local HTTP server. See - // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. - var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); - if (url.scheme == "file" - && this._sources.has(fileUriAbsPath)) { - return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] - } - - if ((!url.path || url.path == "/") - && this._sources.has("/" + aSource)) { - return this.sourcesContent[this._sources.indexOf("/" + aSource)]; - } - } - - throw new Error('"' + aSource + '" is not in the SourceMap.'); - }; - - /** - * Returns the generated line and column information for the original source, - * line, and column positions provided. The only argument is an object with - * the following properties: - * - * - source: The filename of the original source. - * - line: The line number in the original source. - * - column: The column number in the original source. - * - * and an object is returned with the following properties: - * - * - line: The line number in the generated source, or null. - * - column: The column number in the generated source, or null. - */ - SourceMapConsumer.prototype.generatedPositionFor = - function SourceMapConsumer_generatedPositionFor(aArgs) { - var needle = { - source: util.getArg(aArgs, 'source'), - originalLine: util.getArg(aArgs, 'line'), - originalColumn: util.getArg(aArgs, 'column') - }; - - if (this.sourceRoot != null) { - needle.source = util.relative(this.sourceRoot, needle.source); - } - - var index = this._findMapping(needle, - this._originalMappings, - "originalLine", - "originalColumn", - util.compareByOriginalPositions); - - if (index >= 0) { - var mapping = this._originalMappings[index]; - - return { - line: util.getArg(mapping, 'generatedLine', null), - column: util.getArg(mapping, 'generatedColumn', null), - lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) - }; - } - - return { - line: null, - column: null, - lastColumn: null - }; - }; - - /** - * Returns all generated line and column information for the original source - * and line provided. The only argument is an object with the following - * properties: - * - * - source: The filename of the original source. - * - line: The line number in the original source. - * - * and an array of objects is returned, each with the following properties: - * - * - line: The line number in the generated source, or null. - * - column: The column number in the generated source, or null. - */ - SourceMapConsumer.prototype.allGeneratedPositionsFor = - function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { - // When there is no exact match, SourceMapConsumer.prototype._findMapping - // returns the index of the closest mapping less than the needle. By - // setting needle.originalColumn to Infinity, we thus find the last - // mapping for the given line, provided such a mapping exists. - var needle = { - source: util.getArg(aArgs, 'source'), - originalLine: util.getArg(aArgs, 'line'), - originalColumn: Infinity - }; - - if (this.sourceRoot != null) { - needle.source = util.relative(this.sourceRoot, needle.source); - } - - var mappings = []; - - var index = this._findMapping(needle, - this._originalMappings, - "originalLine", - "originalColumn", - util.compareByOriginalPositions); - if (index >= 0) { - var mapping = this._originalMappings[index]; - - while (mapping && mapping.originalLine === needle.originalLine) { - mappings.push({ - line: util.getArg(mapping, 'generatedLine', null), - column: util.getArg(mapping, 'generatedColumn', null), - lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) - }); - - mapping = this._originalMappings[--index]; - } - } - - return mappings.reverse(); - }; - - SourceMapConsumer.GENERATED_ORDER = 1; - SourceMapConsumer.ORIGINAL_ORDER = 2; - - /** - * Iterate over each mapping between an original source/line/column and a - * generated line/column in this source map. - * - * @param Function aCallback - * The function that is called with each mapping. - * @param Object aContext - * Optional. If specified, this object will be the value of `this` every - * time that `aCallback` is called. - * @param aOrder - * Either `SourceMapConsumer.GENERATED_ORDER` or - * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to - * iterate over the mappings sorted by the generated file's line/column - * order or the original's source/line/column order, respectively. Defaults to - * `SourceMapConsumer.GENERATED_ORDER`. - */ - SourceMapConsumer.prototype.eachMapping = - function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { - var context = aContext || null; - var order = aOrder || SourceMapConsumer.GENERATED_ORDER; - - var mappings; - switch (order) { - case SourceMapConsumer.GENERATED_ORDER: - mappings = this._generatedMappings; - break; - case SourceMapConsumer.ORIGINAL_ORDER: - mappings = this._originalMappings; - break; - default: - throw new Error("Unknown order of iteration."); - } - - var sourceRoot = this.sourceRoot; - mappings.map(function (mapping) { - var source = mapping.source; - if (source != null && sourceRoot != null) { - source = util.join(sourceRoot, source); - } - return { - source: source, - generatedLine: mapping.generatedLine, - generatedColumn: mapping.generatedColumn, - originalLine: mapping.originalLine, - originalColumn: mapping.originalColumn, - name: mapping.name - }; - }).forEach(aCallback, context); - }; - - exports.SourceMapConsumer = SourceMapConsumer; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-generator.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-generator.js deleted file mode 100644 index 1ab7a47..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-generator.js +++ /dev/null @@ -1,400 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var base64VLQ = require('./base64-vlq'); - var util = require('./util'); - var ArraySet = require('./array-set').ArraySet; - var MappingList = require('./mapping-list').MappingList; - - /** - * An instance of the SourceMapGenerator represents a source map which is - * being built incrementally. You may pass an object with the following - * properties: - * - * - file: The filename of the generated source. - * - sourceRoot: A root for all relative URLs in this source map. - */ - function SourceMapGenerator(aArgs) { - if (!aArgs) { - aArgs = {}; - } - this._file = util.getArg(aArgs, 'file', null); - this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); - this._skipValidation = util.getArg(aArgs, 'skipValidation', false); - this._sources = new ArraySet(); - this._names = new ArraySet(); - this._mappings = new MappingList(); - this._sourcesContents = null; - } - - SourceMapGenerator.prototype._version = 3; - - /** - * Creates a new SourceMapGenerator based on a SourceMapConsumer - * - * @param aSourceMapConsumer The SourceMap. - */ - SourceMapGenerator.fromSourceMap = - function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { - var sourceRoot = aSourceMapConsumer.sourceRoot; - var generator = new SourceMapGenerator({ - file: aSourceMapConsumer.file, - sourceRoot: sourceRoot - }); - aSourceMapConsumer.eachMapping(function (mapping) { - var newMapping = { - generated: { - line: mapping.generatedLine, - column: mapping.generatedColumn - } - }; - - if (mapping.source != null) { - newMapping.source = mapping.source; - if (sourceRoot != null) { - newMapping.source = util.relative(sourceRoot, newMapping.source); - } - - newMapping.original = { - line: mapping.originalLine, - column: mapping.originalColumn - }; - - if (mapping.name != null) { - newMapping.name = mapping.name; - } - } - - generator.addMapping(newMapping); - }); - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content != null) { - generator.setSourceContent(sourceFile, content); - } - }); - return generator; - }; - - /** - * Add a single mapping from original source line and column to the generated - * source's line and column for this source map being created. The mapping - * object should have the following properties: - * - * - generated: An object with the generated line and column positions. - * - original: An object with the original line and column positions. - * - source: The original source file (relative to the sourceRoot). - * - name: An optional original token name for this mapping. - */ - SourceMapGenerator.prototype.addMapping = - function SourceMapGenerator_addMapping(aArgs) { - var generated = util.getArg(aArgs, 'generated'); - var original = util.getArg(aArgs, 'original', null); - var source = util.getArg(aArgs, 'source', null); - var name = util.getArg(aArgs, 'name', null); - - if (!this._skipValidation) { - this._validateMapping(generated, original, source, name); - } - - if (source != null && !this._sources.has(source)) { - this._sources.add(source); - } - - if (name != null && !this._names.has(name)) { - this._names.add(name); - } - - this._mappings.add({ - generatedLine: generated.line, - generatedColumn: generated.column, - originalLine: original != null && original.line, - originalColumn: original != null && original.column, - source: source, - name: name - }); - }; - - /** - * Set the source content for a source file. - */ - SourceMapGenerator.prototype.setSourceContent = - function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { - var source = aSourceFile; - if (this._sourceRoot != null) { - source = util.relative(this._sourceRoot, source); - } - - if (aSourceContent != null) { - // Add the source content to the _sourcesContents map. - // Create a new _sourcesContents map if the property is null. - if (!this._sourcesContents) { - this._sourcesContents = {}; - } - this._sourcesContents[util.toSetString(source)] = aSourceContent; - } else if (this._sourcesContents) { - // Remove the source file from the _sourcesContents map. - // If the _sourcesContents map is empty, set the property to null. - delete this._sourcesContents[util.toSetString(source)]; - if (Object.keys(this._sourcesContents).length === 0) { - this._sourcesContents = null; - } - } - }; - - /** - * Applies the mappings of a sub-source-map for a specific source file to the - * source map being generated. Each mapping to the supplied source file is - * rewritten using the supplied source map. Note: The resolution for the - * resulting mappings is the minimium of this map and the supplied map. - * - * @param aSourceMapConsumer The source map to be applied. - * @param aSourceFile Optional. The filename of the source file. - * If omitted, SourceMapConsumer's file property will be used. - * @param aSourceMapPath Optional. The dirname of the path to the source map - * to be applied. If relative, it is relative to the SourceMapConsumer. - * This parameter is needed when the two source maps aren't in the same - * directory, and the source map to be applied contains relative source - * paths. If so, those relative source paths need to be rewritten - * relative to the SourceMapGenerator. - */ - SourceMapGenerator.prototype.applySourceMap = - function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { - var sourceFile = aSourceFile; - // If aSourceFile is omitted, we will use the file property of the SourceMap - if (aSourceFile == null) { - if (aSourceMapConsumer.file == null) { - throw new Error( - 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + - 'or the source map\'s "file" property. Both were omitted.' - ); - } - sourceFile = aSourceMapConsumer.file; - } - var sourceRoot = this._sourceRoot; - // Make "sourceFile" relative if an absolute Url is passed. - if (sourceRoot != null) { - sourceFile = util.relative(sourceRoot, sourceFile); - } - // Applying the SourceMap can add and remove items from the sources and - // the names array. - var newSources = new ArraySet(); - var newNames = new ArraySet(); - - // Find mappings for the "sourceFile" - this._mappings.unsortedForEach(function (mapping) { - if (mapping.source === sourceFile && mapping.originalLine != null) { - // Check if it can be mapped by the source map, then update the mapping. - var original = aSourceMapConsumer.originalPositionFor({ - line: mapping.originalLine, - column: mapping.originalColumn - }); - if (original.source != null) { - // Copy mapping - mapping.source = original.source; - if (aSourceMapPath != null) { - mapping.source = util.join(aSourceMapPath, mapping.source) - } - if (sourceRoot != null) { - mapping.source = util.relative(sourceRoot, mapping.source); - } - mapping.originalLine = original.line; - mapping.originalColumn = original.column; - if (original.name != null) { - mapping.name = original.name; - } - } - } - - var source = mapping.source; - if (source != null && !newSources.has(source)) { - newSources.add(source); - } - - var name = mapping.name; - if (name != null && !newNames.has(name)) { - newNames.add(name); - } - - }, this); - this._sources = newSources; - this._names = newNames; - - // Copy sourcesContents of applied map. - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content != null) { - if (aSourceMapPath != null) { - sourceFile = util.join(aSourceMapPath, sourceFile); - } - if (sourceRoot != null) { - sourceFile = util.relative(sourceRoot, sourceFile); - } - this.setSourceContent(sourceFile, content); - } - }, this); - }; - - /** - * A mapping can have one of the three levels of data: - * - * 1. Just the generated position. - * 2. The Generated position, original position, and original source. - * 3. Generated and original position, original source, as well as a name - * token. - * - * To maintain consistency, we validate that any new mapping being added falls - * in to one of these categories. - */ - SourceMapGenerator.prototype._validateMapping = - function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, - aName) { - if (aGenerated && 'line' in aGenerated && 'column' in aGenerated - && aGenerated.line > 0 && aGenerated.column >= 0 - && !aOriginal && !aSource && !aName) { - // Case 1. - return; - } - else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated - && aOriginal && 'line' in aOriginal && 'column' in aOriginal - && aGenerated.line > 0 && aGenerated.column >= 0 - && aOriginal.line > 0 && aOriginal.column >= 0 - && aSource) { - // Cases 2 and 3. - return; - } - else { - throw new Error('Invalid mapping: ' + JSON.stringify({ - generated: aGenerated, - source: aSource, - original: aOriginal, - name: aName - })); - } - }; - - /** - * Serialize the accumulated mappings in to the stream of base 64 VLQs - * specified by the source map format. - */ - SourceMapGenerator.prototype._serializeMappings = - function SourceMapGenerator_serializeMappings() { - var previousGeneratedColumn = 0; - var previousGeneratedLine = 1; - var previousOriginalColumn = 0; - var previousOriginalLine = 0; - var previousName = 0; - var previousSource = 0; - var result = ''; - var mapping; - - var mappings = this._mappings.toArray(); - - for (var i = 0, len = mappings.length; i < len; i++) { - mapping = mappings[i]; - - if (mapping.generatedLine !== previousGeneratedLine) { - previousGeneratedColumn = 0; - while (mapping.generatedLine !== previousGeneratedLine) { - result += ';'; - previousGeneratedLine++; - } - } - else { - if (i > 0) { - if (!util.compareByGeneratedPositions(mapping, mappings[i - 1])) { - continue; - } - result += ','; - } - } - - result += base64VLQ.encode(mapping.generatedColumn - - previousGeneratedColumn); - previousGeneratedColumn = mapping.generatedColumn; - - if (mapping.source != null) { - result += base64VLQ.encode(this._sources.indexOf(mapping.source) - - previousSource); - previousSource = this._sources.indexOf(mapping.source); - - // lines are stored 0-based in SourceMap spec version 3 - result += base64VLQ.encode(mapping.originalLine - 1 - - previousOriginalLine); - previousOriginalLine = mapping.originalLine - 1; - - result += base64VLQ.encode(mapping.originalColumn - - previousOriginalColumn); - previousOriginalColumn = mapping.originalColumn; - - if (mapping.name != null) { - result += base64VLQ.encode(this._names.indexOf(mapping.name) - - previousName); - previousName = this._names.indexOf(mapping.name); - } - } - } - - return result; - }; - - SourceMapGenerator.prototype._generateSourcesContent = - function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { - return aSources.map(function (source) { - if (!this._sourcesContents) { - return null; - } - if (aSourceRoot != null) { - source = util.relative(aSourceRoot, source); - } - var key = util.toSetString(source); - return Object.prototype.hasOwnProperty.call(this._sourcesContents, - key) - ? this._sourcesContents[key] - : null; - }, this); - }; - - /** - * Externalize the source map. - */ - SourceMapGenerator.prototype.toJSON = - function SourceMapGenerator_toJSON() { - var map = { - version: this._version, - sources: this._sources.toArray(), - names: this._names.toArray(), - mappings: this._serializeMappings() - }; - if (this._file != null) { - map.file = this._file; - } - if (this._sourceRoot != null) { - map.sourceRoot = this._sourceRoot; - } - if (this._sourcesContents) { - map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); - } - - return map; - }; - - /** - * Render the source map being generated to a string. - */ - SourceMapGenerator.prototype.toString = - function SourceMapGenerator_toString() { - return JSON.stringify(this); - }; - - exports.SourceMapGenerator = SourceMapGenerator; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-node.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-node.js deleted file mode 100644 index 9ee90bd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-node.js +++ /dev/null @@ -1,414 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator; - var util = require('./util'); - - // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other - // operating systems these days (capturing the result). - var REGEX_NEWLINE = /(\r?\n)/; - - // Newline character code for charCodeAt() comparisons - var NEWLINE_CODE = 10; - - // Private symbol for identifying `SourceNode`s when multiple versions of - // the source-map library are loaded. This MUST NOT CHANGE across - // versions! - var isSourceNode = "$$$isSourceNode$$$"; - - /** - * SourceNodes provide a way to abstract over interpolating/concatenating - * snippets of generated JavaScript source code while maintaining the line and - * column information associated with the original source code. - * - * @param aLine The original line number. - * @param aColumn The original column number. - * @param aSource The original source's filename. - * @param aChunks Optional. An array of strings which are snippets of - * generated JS, or other SourceNodes. - * @param aName The original identifier. - */ - function SourceNode(aLine, aColumn, aSource, aChunks, aName) { - this.children = []; - this.sourceContents = {}; - this.line = aLine == null ? null : aLine; - this.column = aColumn == null ? null : aColumn; - this.source = aSource == null ? null : aSource; - this.name = aName == null ? null : aName; - this[isSourceNode] = true; - if (aChunks != null) this.add(aChunks); - } - - /** - * Creates a SourceNode from generated code and a SourceMapConsumer. - * - * @param aGeneratedCode The generated code - * @param aSourceMapConsumer The SourceMap for the generated code - * @param aRelativePath Optional. The path that relative sources in the - * SourceMapConsumer should be relative to. - */ - SourceNode.fromStringWithSourceMap = - function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { - // The SourceNode we want to fill with the generated code - // and the SourceMap - var node = new SourceNode(); - - // All even indices of this array are one line of the generated code, - // while all odd indices are the newlines between two adjacent lines - // (since `REGEX_NEWLINE` captures its match). - // Processed fragments are removed from this array, by calling `shiftNextLine`. - var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); - var shiftNextLine = function() { - var lineContents = remainingLines.shift(); - // The last line of a file might not have a newline. - var newLine = remainingLines.shift() || ""; - return lineContents + newLine; - }; - - // We need to remember the position of "remainingLines" - var lastGeneratedLine = 1, lastGeneratedColumn = 0; - - // The generate SourceNodes we need a code range. - // To extract it current and last mapping is used. - // Here we store the last mapping. - var lastMapping = null; - - aSourceMapConsumer.eachMapping(function (mapping) { - if (lastMapping !== null) { - // We add the code from "lastMapping" to "mapping": - // First check if there is a new line in between. - if (lastGeneratedLine < mapping.generatedLine) { - var code = ""; - // Associate first line with "lastMapping" - addMappingWithCode(lastMapping, shiftNextLine()); - lastGeneratedLine++; - lastGeneratedColumn = 0; - // The remaining code is added without mapping - } else { - // There is no new line in between. - // Associate the code between "lastGeneratedColumn" and - // "mapping.generatedColumn" with "lastMapping" - var nextLine = remainingLines[0]; - var code = nextLine.substr(0, mapping.generatedColumn - - lastGeneratedColumn); - remainingLines[0] = nextLine.substr(mapping.generatedColumn - - lastGeneratedColumn); - lastGeneratedColumn = mapping.generatedColumn; - addMappingWithCode(lastMapping, code); - // No more remaining code, continue - lastMapping = mapping; - return; - } - } - // We add the generated code until the first mapping - // to the SourceNode without any mapping. - // Each line is added as separate string. - while (lastGeneratedLine < mapping.generatedLine) { - node.add(shiftNextLine()); - lastGeneratedLine++; - } - if (lastGeneratedColumn < mapping.generatedColumn) { - var nextLine = remainingLines[0]; - node.add(nextLine.substr(0, mapping.generatedColumn)); - remainingLines[0] = nextLine.substr(mapping.generatedColumn); - lastGeneratedColumn = mapping.generatedColumn; - } - lastMapping = mapping; - }, this); - // We have processed all mappings. - if (remainingLines.length > 0) { - if (lastMapping) { - // Associate the remaining code in the current line with "lastMapping" - addMappingWithCode(lastMapping, shiftNextLine()); - } - // and add the remaining lines without any mapping - node.add(remainingLines.join("")); - } - - // Copy sourcesContent into SourceNode - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content != null) { - if (aRelativePath != null) { - sourceFile = util.join(aRelativePath, sourceFile); - } - node.setSourceContent(sourceFile, content); - } - }); - - return node; - - function addMappingWithCode(mapping, code) { - if (mapping === null || mapping.source === undefined) { - node.add(code); - } else { - var source = aRelativePath - ? util.join(aRelativePath, mapping.source) - : mapping.source; - node.add(new SourceNode(mapping.originalLine, - mapping.originalColumn, - source, - code, - mapping.name)); - } - } - }; - - /** - * Add a chunk of generated JS to this source node. - * - * @param aChunk A string snippet of generated JS code, another instance of - * SourceNode, or an array where each member is one of those things. - */ - SourceNode.prototype.add = function SourceNode_add(aChunk) { - if (Array.isArray(aChunk)) { - aChunk.forEach(function (chunk) { - this.add(chunk); - }, this); - } - else if (aChunk[isSourceNode] || typeof aChunk === "string") { - if (aChunk) { - this.children.push(aChunk); - } - } - else { - throw new TypeError( - "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk - ); - } - return this; - }; - - /** - * Add a chunk of generated JS to the beginning of this source node. - * - * @param aChunk A string snippet of generated JS code, another instance of - * SourceNode, or an array where each member is one of those things. - */ - SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { - if (Array.isArray(aChunk)) { - for (var i = aChunk.length-1; i >= 0; i--) { - this.prepend(aChunk[i]); - } - } - else if (aChunk[isSourceNode] || typeof aChunk === "string") { - this.children.unshift(aChunk); - } - else { - throw new TypeError( - "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk - ); - } - return this; - }; - - /** - * Walk over the tree of JS snippets in this node and its children. The - * walking function is called once for each snippet of JS and is passed that - * snippet and the its original associated source's line/column location. - * - * @param aFn The traversal function. - */ - SourceNode.prototype.walk = function SourceNode_walk(aFn) { - var chunk; - for (var i = 0, len = this.children.length; i < len; i++) { - chunk = this.children[i]; - if (chunk[isSourceNode]) { - chunk.walk(aFn); - } - else { - if (chunk !== '') { - aFn(chunk, { source: this.source, - line: this.line, - column: this.column, - name: this.name }); - } - } - } - }; - - /** - * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between - * each of `this.children`. - * - * @param aSep The separator. - */ - SourceNode.prototype.join = function SourceNode_join(aSep) { - var newChildren; - var i; - var len = this.children.length; - if (len > 0) { - newChildren = []; - for (i = 0; i < len-1; i++) { - newChildren.push(this.children[i]); - newChildren.push(aSep); - } - newChildren.push(this.children[i]); - this.children = newChildren; - } - return this; - }; - - /** - * Call String.prototype.replace on the very right-most source snippet. Useful - * for trimming whitespace from the end of a source node, etc. - * - * @param aPattern The pattern to replace. - * @param aReplacement The thing to replace the pattern with. - */ - SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { - var lastChild = this.children[this.children.length - 1]; - if (lastChild[isSourceNode]) { - lastChild.replaceRight(aPattern, aReplacement); - } - else if (typeof lastChild === 'string') { - this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); - } - else { - this.children.push(''.replace(aPattern, aReplacement)); - } - return this; - }; - - /** - * Set the source content for a source file. This will be added to the SourceMapGenerator - * in the sourcesContent field. - * - * @param aSourceFile The filename of the source file - * @param aSourceContent The content of the source file - */ - SourceNode.prototype.setSourceContent = - function SourceNode_setSourceContent(aSourceFile, aSourceContent) { - this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; - }; - - /** - * Walk over the tree of SourceNodes. The walking function is called for each - * source file content and is passed the filename and source content. - * - * @param aFn The traversal function. - */ - SourceNode.prototype.walkSourceContents = - function SourceNode_walkSourceContents(aFn) { - for (var i = 0, len = this.children.length; i < len; i++) { - if (this.children[i][isSourceNode]) { - this.children[i].walkSourceContents(aFn); - } - } - - var sources = Object.keys(this.sourceContents); - for (var i = 0, len = sources.length; i < len; i++) { - aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); - } - }; - - /** - * Return the string representation of this source node. Walks over the tree - * and concatenates all the various snippets together to one string. - */ - SourceNode.prototype.toString = function SourceNode_toString() { - var str = ""; - this.walk(function (chunk) { - str += chunk; - }); - return str; - }; - - /** - * Returns the string representation of this source node along with a source - * map. - */ - SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { - var generated = { - code: "", - line: 1, - column: 0 - }; - var map = new SourceMapGenerator(aArgs); - var sourceMappingActive = false; - var lastOriginalSource = null; - var lastOriginalLine = null; - var lastOriginalColumn = null; - var lastOriginalName = null; - this.walk(function (chunk, original) { - generated.code += chunk; - if (original.source !== null - && original.line !== null - && original.column !== null) { - if(lastOriginalSource !== original.source - || lastOriginalLine !== original.line - || lastOriginalColumn !== original.column - || lastOriginalName !== original.name) { - map.addMapping({ - source: original.source, - original: { - line: original.line, - column: original.column - }, - generated: { - line: generated.line, - column: generated.column - }, - name: original.name - }); - } - lastOriginalSource = original.source; - lastOriginalLine = original.line; - lastOriginalColumn = original.column; - lastOriginalName = original.name; - sourceMappingActive = true; - } else if (sourceMappingActive) { - map.addMapping({ - generated: { - line: generated.line, - column: generated.column - } - }); - lastOriginalSource = null; - sourceMappingActive = false; - } - for (var idx = 0, length = chunk.length; idx < length; idx++) { - if (chunk.charCodeAt(idx) === NEWLINE_CODE) { - generated.line++; - generated.column = 0; - // Mappings end at eol - if (idx + 1 === length) { - lastOriginalSource = null; - sourceMappingActive = false; - } else if (sourceMappingActive) { - map.addMapping({ - source: original.source, - original: { - line: original.line, - column: original.column - }, - generated: { - line: generated.line, - column: generated.column - }, - name: original.name - }); - } - } else { - generated.column++; - } - } - }); - this.walkSourceContents(function (sourceFile, sourceContent) { - map.setSourceContent(sourceFile, sourceContent); - }); - - return { code: generated.code, map: map }; - }; - - exports.SourceNode = SourceNode; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/util.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/util.js deleted file mode 100644 index 976f6ca..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/util.js +++ /dev/null @@ -1,319 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - /** - * This is a helper function for getting values from parameter/options - * objects. - * - * @param args The object we are extracting values from - * @param name The name of the property we are getting. - * @param defaultValue An optional value to return if the property is missing - * from the object. If this is not specified and the property is missing, an - * error will be thrown. - */ - function getArg(aArgs, aName, aDefaultValue) { - if (aName in aArgs) { - return aArgs[aName]; - } else if (arguments.length === 3) { - return aDefaultValue; - } else { - throw new Error('"' + aName + '" is a required argument.'); - } - } - exports.getArg = getArg; - - var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; - var dataUrlRegexp = /^data:.+\,.+$/; - - function urlParse(aUrl) { - var match = aUrl.match(urlRegexp); - if (!match) { - return null; - } - return { - scheme: match[1], - auth: match[2], - host: match[3], - port: match[4], - path: match[5] - }; - } - exports.urlParse = urlParse; - - function urlGenerate(aParsedUrl) { - var url = ''; - if (aParsedUrl.scheme) { - url += aParsedUrl.scheme + ':'; - } - url += '//'; - if (aParsedUrl.auth) { - url += aParsedUrl.auth + '@'; - } - if (aParsedUrl.host) { - url += aParsedUrl.host; - } - if (aParsedUrl.port) { - url += ":" + aParsedUrl.port - } - if (aParsedUrl.path) { - url += aParsedUrl.path; - } - return url; - } - exports.urlGenerate = urlGenerate; - - /** - * Normalizes a path, or the path portion of a URL: - * - * - Replaces consequtive slashes with one slash. - * - Removes unnecessary '.' parts. - * - Removes unnecessary '/..' parts. - * - * Based on code in the Node.js 'path' core module. - * - * @param aPath The path or url to normalize. - */ - function normalize(aPath) { - var path = aPath; - var url = urlParse(aPath); - if (url) { - if (!url.path) { - return aPath; - } - path = url.path; - } - var isAbsolute = (path.charAt(0) === '/'); - - var parts = path.split(/\/+/); - for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { - part = parts[i]; - if (part === '.') { - parts.splice(i, 1); - } else if (part === '..') { - up++; - } else if (up > 0) { - if (part === '') { - // The first part is blank if the path is absolute. Trying to go - // above the root is a no-op. Therefore we can remove all '..' parts - // directly after the root. - parts.splice(i + 1, up); - up = 0; - } else { - parts.splice(i, 2); - up--; - } - } - } - path = parts.join('/'); - - if (path === '') { - path = isAbsolute ? '/' : '.'; - } - - if (url) { - url.path = path; - return urlGenerate(url); - } - return path; - } - exports.normalize = normalize; - - /** - * Joins two paths/URLs. - * - * @param aRoot The root path or URL. - * @param aPath The path or URL to be joined with the root. - * - * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a - * scheme-relative URL: Then the scheme of aRoot, if any, is prepended - * first. - * - Otherwise aPath is a path. If aRoot is a URL, then its path portion - * is updated with the result and aRoot is returned. Otherwise the result - * is returned. - * - If aPath is absolute, the result is aPath. - * - Otherwise the two paths are joined with a slash. - * - Joining for example 'http://' and 'www.example.com' is also supported. - */ - function join(aRoot, aPath) { - if (aRoot === "") { - aRoot = "."; - } - if (aPath === "") { - aPath = "."; - } - var aPathUrl = urlParse(aPath); - var aRootUrl = urlParse(aRoot); - if (aRootUrl) { - aRoot = aRootUrl.path || '/'; - } - - // `join(foo, '//www.example.org')` - if (aPathUrl && !aPathUrl.scheme) { - if (aRootUrl) { - aPathUrl.scheme = aRootUrl.scheme; - } - return urlGenerate(aPathUrl); - } - - if (aPathUrl || aPath.match(dataUrlRegexp)) { - return aPath; - } - - // `join('http://', 'www.example.com')` - if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { - aRootUrl.host = aPath; - return urlGenerate(aRootUrl); - } - - var joined = aPath.charAt(0) === '/' - ? aPath - : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); - - if (aRootUrl) { - aRootUrl.path = joined; - return urlGenerate(aRootUrl); - } - return joined; - } - exports.join = join; - - /** - * Make a path relative to a URL or another path. - * - * @param aRoot The root path or URL. - * @param aPath The path or URL to be made relative to aRoot. - */ - function relative(aRoot, aPath) { - if (aRoot === "") { - aRoot = "."; - } - - aRoot = aRoot.replace(/\/$/, ''); - - // XXX: It is possible to remove this block, and the tests still pass! - var url = urlParse(aRoot); - if (aPath.charAt(0) == "/" && url && url.path == "/") { - return aPath.slice(1); - } - - return aPath.indexOf(aRoot + '/') === 0 - ? aPath.substr(aRoot.length + 1) - : aPath; - } - exports.relative = relative; - - /** - * Because behavior goes wacky when you set `__proto__` on objects, we - * have to prefix all the strings in our set with an arbitrary character. - * - * See https://github.com/mozilla/source-map/pull/31 and - * https://github.com/mozilla/source-map/issues/30 - * - * @param String aStr - */ - function toSetString(aStr) { - return '$' + aStr; - } - exports.toSetString = toSetString; - - function fromSetString(aStr) { - return aStr.substr(1); - } - exports.fromSetString = fromSetString; - - function strcmp(aStr1, aStr2) { - var s1 = aStr1 || ""; - var s2 = aStr2 || ""; - return (s1 > s2) - (s1 < s2); - } - - /** - * Comparator between two mappings where the original positions are compared. - * - * Optionally pass in `true` as `onlyCompareGenerated` to consider two - * mappings with the same original source/line/column, but different generated - * line and column the same. Useful when searching for a mapping with a - * stubbed out mapping. - */ - function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { - var cmp; - - cmp = strcmp(mappingA.source, mappingB.source); - if (cmp) { - return cmp; - } - - cmp = mappingA.originalLine - mappingB.originalLine; - if (cmp) { - return cmp; - } - - cmp = mappingA.originalColumn - mappingB.originalColumn; - if (cmp || onlyCompareOriginal) { - return cmp; - } - - cmp = strcmp(mappingA.name, mappingB.name); - if (cmp) { - return cmp; - } - - cmp = mappingA.generatedLine - mappingB.generatedLine; - if (cmp) { - return cmp; - } - - return mappingA.generatedColumn - mappingB.generatedColumn; - }; - exports.compareByOriginalPositions = compareByOriginalPositions; - - /** - * Comparator between two mappings where the generated positions are - * compared. - * - * Optionally pass in `true` as `onlyCompareGenerated` to consider two - * mappings with the same generated line and column, but different - * source/name/original line and column the same. Useful when searching for a - * mapping with a stubbed out mapping. - */ - function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) { - var cmp; - - cmp = mappingA.generatedLine - mappingB.generatedLine; - if (cmp) { - return cmp; - } - - cmp = mappingA.generatedColumn - mappingB.generatedColumn; - if (cmp || onlyCompareGenerated) { - return cmp; - } - - cmp = strcmp(mappingA.source, mappingB.source); - if (cmp) { - return cmp; - } - - cmp = mappingA.originalLine - mappingB.originalLine; - if (cmp) { - return cmp; - } - - cmp = mappingA.originalColumn - mappingB.originalColumn; - if (cmp) { - return cmp; - } - - return strcmp(mappingA.name, mappingB.name); - }; - exports.compareByGeneratedPositions = compareByGeneratedPositions; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/LICENSE deleted file mode 100644 index af46c6d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/LICENSE +++ /dev/null @@ -1,58 +0,0 @@ -amdefine is released under two licenses: new BSD, and MIT. You may pick the -license that best suits your development needs. The text of both licenses are -provided below. - - -The "New" BSD License: ----------------------- - -Copyright (c) 2011-2015, The Dojo Foundation -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the Dojo Foundation nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - -MIT License ------------ - -Copyright (c) 2011-2015, The Dojo Foundation - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/README.md deleted file mode 100644 index 037a6e8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/README.md +++ /dev/null @@ -1,171 +0,0 @@ -# amdefine - -A module that can be used to implement AMD's define() in Node. This allows you -to code to the AMD API and have the module work in node programs without -requiring those other programs to use AMD. - -## Usage - -**1)** Update your package.json to indicate amdefine as a dependency: - -```javascript - "dependencies": { - "amdefine": ">=0.1.0" - } -``` - -Then run `npm install` to get amdefine into your project. - -**2)** At the top of each module that uses define(), place this code: - -```javascript -if (typeof define !== 'function') { var define = require('amdefine')(module) } -``` - -**Only use these snippets** when loading amdefine. If you preserve the basic structure, -with the braces, it will be stripped out when using the [RequireJS optimizer](#optimizer). - -You can add spaces, line breaks and even require amdefine with a local path, but -keep the rest of the structure to get the stripping behavior. - -As you may know, because `if` statements in JavaScript don't have their own scope, the var -declaration in the above snippet is made whether the `if` expression is truthy or not. If -RequireJS is loaded then the declaration is superfluous because `define` is already already -declared in the same scope in RequireJS. Fortunately JavaScript handles multiple `var` -declarations of the same variable in the same scope gracefully. - -If you want to deliver amdefine.js with your code rather than specifying it as a dependency -with npm, then just download the latest release and refer to it using a relative path: - -[Latest Version](https://github.com/jrburke/amdefine/raw/latest/amdefine.js) - -### amdefine/intercept - -Consider this very experimental. - -Instead of pasting the piece of text for the amdefine setup of a `define` -variable in each module you create or consume, you can use `amdefine/intercept` -instead. It will automatically insert the above snippet in each .js file loaded -by Node. - -**Warning**: you should only use this if you are creating an application that -is consuming AMD style defined()'d modules that are distributed via npm and want -to run that code in Node. - -For library code where you are not sure if it will be used by others in Node or -in the browser, then explicitly depending on amdefine and placing the code -snippet above is suggested path, instead of using `amdefine/intercept`. The -intercept module affects all .js files loaded in the Node app, and it is -inconsiderate to modify global state like that unless you are also controlling -the top level app. - -#### Why distribute AMD-style modules via npm? - -npm has a lot of weaknesses for front-end use (installed layout is not great, -should have better support for the `baseUrl + moduleID + '.js' style of loading, -single file JS installs), but some people want a JS package manager and are -willing to live with those constraints. If that is you, but still want to author -in AMD style modules to get dynamic require([]), better direct source usage and -powerful loader plugin support in the browser, then this tool can help. - -#### amdefine/intercept usage - -Just require it in your top level app module (for example index.js, server.js): - -```javascript -require('amdefine/intercept'); -``` - -The module does not return a value, so no need to assign the result to a local -variable. - -Then just require() code as you normally would with Node's require(). Any .js -loaded after the intercept require will have the amdefine check injected in -the .js source as it is loaded. It does not modify the source on disk, just -prepends some content to the text of the module as it is loaded by Node. - -#### How amdefine/intercept works - -It overrides the `Module._extensions['.js']` in Node to automatically prepend -the amdefine snippet above. So, it will affect any .js file loaded by your -app. - -## define() usage - -It is best if you use the anonymous forms of define() in your module: - -```javascript -define(function (require) { - var dependency = require('dependency'); -}); -``` - -or - -```javascript -define(['dependency'], function (dependency) { - -}); -``` - -## RequireJS optimizer integration. - -Version 1.0.3 of the [RequireJS optimizer](http://requirejs.org/docs/optimization.html) -will have support for stripping the `if (typeof define !== 'function')` check -mentioned above, so you can include this snippet for code that runs in the -browser, but avoid taking the cost of the if() statement once the code is -optimized for deployment. - -## Node 0.4 Support - -If you want to support Node 0.4, then add `require` as the second parameter to amdefine: - -```javascript -//Only if you want Node 0.4. If using 0.5 or later, use the above snippet. -if (typeof define !== 'function') { var define = require('amdefine')(module, require) } -``` - -## Limitations - -### Synchronous vs Asynchronous - -amdefine creates a define() function that is callable by your code. It will -execute and trace dependencies and call the factory function *synchronously*, -to keep the behavior in line with Node's synchronous dependency tracing. - -The exception: calling AMD's callback-style require() from inside a factory -function. The require callback is called on process.nextTick(): - -```javascript -define(function (require) { - require(['a'], function(a) { - //'a' is loaded synchronously, but - //this callback is called on process.nextTick(). - }); -}); -``` - -### Loader Plugins - -Loader plugins are supported as long as they call their load() callbacks -synchronously. So ones that do network requests will not work. However plugins -like [text](http://requirejs.org/docs/api.html#text) can load text files locally. - -The plugin API's `load.fromText()` is **not supported** in amdefine, so this means -transpiler plugins like the [CoffeeScript loader plugin](https://github.com/jrburke/require-cs) -will not work. This may be fixable, but it is a bit complex, and I do not have -enough node-fu to figure it out yet. See the source for amdefine.js if you want -to get an idea of the issues involved. - -## Tests - -To run the tests, cd to **tests** and run: - -``` -node all.js -node all-intercept.js -``` - -## License - -New BSD and MIT. Check the LICENSE file for all the details. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/amdefine.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/amdefine.js deleted file mode 100644 index 0c4a954..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/amdefine.js +++ /dev/null @@ -1,301 +0,0 @@ -/** vim: et:ts=4:sw=4:sts=4 - * @license amdefine 1.0.0 Copyright (c) 2011-2015, The Dojo Foundation All Rights Reserved. - * Available via the MIT or new BSD license. - * see: http://github.com/jrburke/amdefine for details - */ - -/*jslint node: true */ -/*global module, process */ -'use strict'; - -/** - * Creates a define for node. - * @param {Object} module the "module" object that is defined by Node for the - * current module. - * @param {Function} [requireFn]. Node's require function for the current module. - * It only needs to be passed in Node versions before 0.5, when module.require - * did not exist. - * @returns {Function} a define function that is usable for the current node - * module. - */ -function amdefine(module, requireFn) { - 'use strict'; - var defineCache = {}, - loaderCache = {}, - alreadyCalled = false, - path = require('path'), - makeRequire, stringRequire; - - /** - * Trims the . and .. from an array of path segments. - * It will keep a leading path segment if a .. will become - * the first path segment, to help with module name lookups, - * which act like paths, but can be remapped. But the end result, - * all paths that use this function should look normalized. - * NOTE: this method MODIFIES the input array. - * @param {Array} ary the array of path segments. - */ - function trimDots(ary) { - var i, part; - for (i = 0; ary[i]; i+= 1) { - part = ary[i]; - if (part === '.') { - ary.splice(i, 1); - i -= 1; - } else if (part === '..') { - if (i === 1 && (ary[2] === '..' || ary[0] === '..')) { - //End of the line. Keep at least one non-dot - //path segment at the front so it can be mapped - //correctly to disk. Otherwise, there is likely - //no path mapping for a path starting with '..'. - //This can still fail, but catches the most reasonable - //uses of .. - break; - } else if (i > 0) { - ary.splice(i - 1, 2); - i -= 2; - } - } - } - } - - function normalize(name, baseName) { - var baseParts; - - //Adjust any relative paths. - if (name && name.charAt(0) === '.') { - //If have a base name, try to normalize against it, - //otherwise, assume it is a top-level require that will - //be relative to baseUrl in the end. - if (baseName) { - baseParts = baseName.split('/'); - baseParts = baseParts.slice(0, baseParts.length - 1); - baseParts = baseParts.concat(name.split('/')); - trimDots(baseParts); - name = baseParts.join('/'); - } - } - - return name; - } - - /** - * Create the normalize() function passed to a loader plugin's - * normalize method. - */ - function makeNormalize(relName) { - return function (name) { - return normalize(name, relName); - }; - } - - function makeLoad(id) { - function load(value) { - loaderCache[id] = value; - } - - load.fromText = function (id, text) { - //This one is difficult because the text can/probably uses - //define, and any relative paths and requires should be relative - //to that id was it would be found on disk. But this would require - //bootstrapping a module/require fairly deeply from node core. - //Not sure how best to go about that yet. - throw new Error('amdefine does not implement load.fromText'); - }; - - return load; - } - - makeRequire = function (systemRequire, exports, module, relId) { - function amdRequire(deps, callback) { - if (typeof deps === 'string') { - //Synchronous, single module require('') - return stringRequire(systemRequire, exports, module, deps, relId); - } else { - //Array of dependencies with a callback. - - //Convert the dependencies to modules. - deps = deps.map(function (depName) { - return stringRequire(systemRequire, exports, module, depName, relId); - }); - - //Wait for next tick to call back the require call. - if (callback) { - process.nextTick(function () { - callback.apply(null, deps); - }); - } - } - } - - amdRequire.toUrl = function (filePath) { - if (filePath.indexOf('.') === 0) { - return normalize(filePath, path.dirname(module.filename)); - } else { - return filePath; - } - }; - - return amdRequire; - }; - - //Favor explicit value, passed in if the module wants to support Node 0.4. - requireFn = requireFn || function req() { - return module.require.apply(module, arguments); - }; - - function runFactory(id, deps, factory) { - var r, e, m, result; - - if (id) { - e = loaderCache[id] = {}; - m = { - id: id, - uri: __filename, - exports: e - }; - r = makeRequire(requireFn, e, m, id); - } else { - //Only support one define call per file - if (alreadyCalled) { - throw new Error('amdefine with no module ID cannot be called more than once per file.'); - } - alreadyCalled = true; - - //Use the real variables from node - //Use module.exports for exports, since - //the exports in here is amdefine exports. - e = module.exports; - m = module; - r = makeRequire(requireFn, e, m, module.id); - } - - //If there are dependencies, they are strings, so need - //to convert them to dependency values. - if (deps) { - deps = deps.map(function (depName) { - return r(depName); - }); - } - - //Call the factory with the right dependencies. - if (typeof factory === 'function') { - result = factory.apply(m.exports, deps); - } else { - result = factory; - } - - if (result !== undefined) { - m.exports = result; - if (id) { - loaderCache[id] = m.exports; - } - } - } - - stringRequire = function (systemRequire, exports, module, id, relId) { - //Split the ID by a ! so that - var index = id.indexOf('!'), - originalId = id, - prefix, plugin; - - if (index === -1) { - id = normalize(id, relId); - - //Straight module lookup. If it is one of the special dependencies, - //deal with it, otherwise, delegate to node. - if (id === 'require') { - return makeRequire(systemRequire, exports, module, relId); - } else if (id === 'exports') { - return exports; - } else if (id === 'module') { - return module; - } else if (loaderCache.hasOwnProperty(id)) { - return loaderCache[id]; - } else if (defineCache[id]) { - runFactory.apply(null, defineCache[id]); - return loaderCache[id]; - } else { - if(systemRequire) { - return systemRequire(originalId); - } else { - throw new Error('No module with ID: ' + id); - } - } - } else { - //There is a plugin in play. - prefix = id.substring(0, index); - id = id.substring(index + 1, id.length); - - plugin = stringRequire(systemRequire, exports, module, prefix, relId); - - if (plugin.normalize) { - id = plugin.normalize(id, makeNormalize(relId)); - } else { - //Normalize the ID normally. - id = normalize(id, relId); - } - - if (loaderCache[id]) { - return loaderCache[id]; - } else { - plugin.load(id, makeRequire(systemRequire, exports, module, relId), makeLoad(id), {}); - - return loaderCache[id]; - } - } - }; - - //Create a define function specific to the module asking for amdefine. - function define(id, deps, factory) { - if (Array.isArray(id)) { - factory = deps; - deps = id; - id = undefined; - } else if (typeof id !== 'string') { - factory = id; - id = deps = undefined; - } - - if (deps && !Array.isArray(deps)) { - factory = deps; - deps = undefined; - } - - if (!deps) { - deps = ['require', 'exports', 'module']; - } - - //Set up properties for this module. If an ID, then use - //internal cache. If no ID, then use the external variables - //for this node module. - if (id) { - //Put the module in deep freeze until there is a - //require call for it. - defineCache[id] = [id, deps, factory]; - } else { - runFactory(id, deps, factory); - } - } - - //define.require, which has access to all the values in the - //cache. Useful for AMD modules that all have IDs in the file, - //but need to finally export a value to node based on one of those - //IDs. - define.require = function (id) { - if (loaderCache[id]) { - return loaderCache[id]; - } - - if (defineCache[id]) { - runFactory.apply(null, defineCache[id]); - return loaderCache[id]; - } - }; - - define.amd = {}; - - return define; -} - -module.exports = amdefine; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/intercept.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/intercept.js deleted file mode 100644 index 771a983..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/intercept.js +++ /dev/null @@ -1,36 +0,0 @@ -/*jshint node: true */ -var inserted, - Module = require('module'), - fs = require('fs'), - existingExtFn = Module._extensions['.js'], - amdefineRegExp = /amdefine\.js/; - -inserted = "if (typeof define !== 'function') {var define = require('amdefine')(module)}"; - -//From the node/lib/module.js source: -function stripBOM(content) { - // Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) - // because the buffer-to-string conversion in `fs.readFileSync()` - // translates it to FEFF, the UTF-16 BOM. - if (content.charCodeAt(0) === 0xFEFF) { - content = content.slice(1); - } - return content; -} - -//Also adapted from the node/lib/module.js source: -function intercept(module, filename) { - var content = stripBOM(fs.readFileSync(filename, 'utf8')); - - if (!amdefineRegExp.test(module.id)) { - content = inserted + content; - } - - module._compile(content, filename); -} - -intercept._id = 'amdefine/intercept'; - -if (!existingExtFn._id || existingExtFn._id !== intercept._id) { - Module._extensions['.js'] = intercept; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/package.json deleted file mode 100644 index 897ee44..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "amdefine", - "description": "Provide AMD's define() API for declaring modules in the AMD format", - "version": "1.0.0", - "homepage": "http://github.com/jrburke/amdefine", - "author": { - "name": "James Burke", - "email": "jrburke@gmail.com", - "url": "http://github.com/jrburke" - }, - "license": "BSD-3-Clause AND MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/jrburke/amdefine.git" - }, - "main": "./amdefine.js", - "engines": { - "node": ">=0.4.2" - }, - "gitHead": "578bc4a3f7dede33f3f3e10edde0c1607005d761", - "bugs": { - "url": "https://github.com/jrburke/amdefine/issues" - }, - "_id": "amdefine@1.0.0", - "scripts": {}, - "_shasum": "fd17474700cb5cc9c2b709f0be9d23ce3c198c33", - "_from": "amdefine@>=0.0.4", - "_npmVersion": "2.12.1", - "_nodeVersion": "0.10.36", - "_npmUser": { - "name": "jrburke", - "email": "jrburke@gmail.com" - }, - "maintainers": [ - { - "name": "jrburke", - "email": "jrburke@gmail.com" - } - ], - "dist": { - "shasum": "fd17474700cb5cc9c2b709f0be9d23ce3c198c33", - "tarball": "http://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/package.json deleted file mode 100644 index d1bfb73..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/package.json +++ /dev/null @@ -1,186 +0,0 @@ -{ - "name": "source-map", - "description": "Generates and consumes source maps", - "version": "0.1.43", - "homepage": "https://github.com/mozilla/source-map", - "author": { - "name": "Nick Fitzgerald", - "email": "nfitzgerald@mozilla.com" - }, - "contributors": [ - { - "name": "Tobias Koppers", - "email": "tobias.koppers@googlemail.com" - }, - { - "name": "Duncan Beevers", - "email": "duncan@dweebd.com" - }, - { - "name": "Stephen Crane", - "email": "scrane@mozilla.com" - }, - { - "name": "Ryan Seddon", - "email": "seddon.ryan@gmail.com" - }, - { - "name": "Miles Elam", - "email": "miles.elam@deem.com" - }, - { - "name": "Mihai Bazon", - "email": "mihai.bazon@gmail.com" - }, - { - "name": "Michael Ficarra", - "email": "github.public.email@michael.ficarra.me" - }, - { - "name": "Todd Wolfson", - "email": "todd@twolfson.com" - }, - { - "name": "Alexander Solovyov", - "email": "alexander@solovyov.net" - }, - { - "name": "Felix Gnass", - "email": "fgnass@gmail.com" - }, - { - "name": "Conrad Irwin", - "email": "conrad.irwin@gmail.com" - }, - { - "name": "usrbincc", - "email": "usrbincc@yahoo.com" - }, - { - "name": "David Glasser", - "email": "glasser@davidglasser.net" - }, - { - "name": "Chase Douglas", - "email": "chase@newrelic.com" - }, - { - "name": "Evan Wallace", - "email": "evan.exe@gmail.com" - }, - { - "name": "Heather Arthur", - "email": "fayearthur@gmail.com" - }, - { - "name": "Hugh Kennedy", - "email": "hughskennedy@gmail.com" - }, - { - "name": "David Glasser", - "email": "glasser@davidglasser.net" - }, - { - "name": "Simon Lydell", - "email": "simon.lydell@gmail.com" - }, - { - "name": "Jmeas Smith", - "email": "jellyes2@gmail.com" - }, - { - "name": "Michael Z Goddard", - "email": "mzgoddard@gmail.com" - }, - { - "name": "azu", - "email": "azu@users.noreply.github.com" - }, - { - "name": "John Gozde", - "email": "john@gozde.ca" - }, - { - "name": "Adam Kirkton", - "email": "akirkton@truefitinnovation.com" - }, - { - "name": "Chris Montgomery", - "email": "christopher.montgomery@dowjones.com" - }, - { - "name": "J. Ryan Stinnett", - "email": "jryans@gmail.com" - }, - { - "name": "Jack Herrington", - "email": "jherrington@walmartlabs.com" - }, - { - "name": "Chris Truter", - "email": "jeffpalentine@gmail.com" - }, - { - "name": "Daniel Espeset", - "email": "daniel@danielespeset.com" - } - ], - "repository": { - "type": "git", - "url": "http://github.com/mozilla/source-map.git" - }, - "directories": { - "lib": "./lib" - }, - "main": "./lib/source-map.js", - "engines": { - "node": ">=0.8.0" - }, - "licenses": [ - { - "type": "BSD", - "url": "http://opensource.org/licenses/BSD-3-Clause" - } - ], - "dependencies": { - "amdefine": ">=0.0.4" - }, - "devDependencies": { - "dryice": ">=0.4.8" - }, - "scripts": { - "test": "node test/run-tests.js", - "build": "node Makefile.dryice.js" - }, - "bugs": { - "url": "https://github.com/mozilla/source-map/issues" - }, - "_id": "source-map@0.1.43", - "_shasum": "c24bc146ca517c1471f5dacbe2571b2b7f9e3346", - "_from": "source-map@>=0.1.40 <0.2.0", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "nickfitzgerald", - "email": "fitzgen@gmail.com" - }, - "maintainers": [ - { - "name": "mozilla-devtools", - "email": "mozilla-developer-tools@googlegroups.com" - }, - { - "name": "mozilla", - "email": "dherman@mozilla.com" - }, - { - "name": "nickfitzgerald", - "email": "fitzgen@gmail.com" - } - ], - "dist": { - "shasum": "c24bc146ca517c1471f5dacbe2571b2b7f9e3346", - "tarball": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz" - }, - "_resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/run-tests.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/run-tests.js deleted file mode 100755 index 64a7c3a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/run-tests.js +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env node -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -var assert = require('assert'); -var fs = require('fs'); -var path = require('path'); -var util = require('./source-map/util'); - -function run(tests) { - var total = 0; - var passed = 0; - - for (var i = 0; i < tests.length; i++) { - for (var k in tests[i].testCase) { - if (/^test/.test(k)) { - total++; - try { - tests[i].testCase[k](assert, util); - passed++; - } - catch (e) { - console.log('FAILED ' + tests[i].name + ': ' + k + '!'); - console.log(e.stack); - } - } - } - } - - console.log(''); - console.log(passed + ' / ' + total + ' tests passed.'); - console.log(''); - - return total - passed; -} - -function isTestFile(f) { - var testToRun = process.argv[2]; - return testToRun - ? path.basename(testToRun) === f - : /^test\-.*?\.js/.test(f); -} - -function toModule(f) { - return './source-map/' + f.replace(/\.js$/, ''); -} - -var requires = fs.readdirSync(path.join(__dirname, 'source-map')) - .filter(isTestFile) - .map(toModule); - -var code = run(requires.map(require).map(function (mod, i) { - return { - name: requires[i], - testCase: mod - }; -})); - -process.exit(code); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-api.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-api.js deleted file mode 100644 index 3801233..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-api.js +++ /dev/null @@ -1,26 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2012 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var sourceMap; - try { - sourceMap = require('../../lib/source-map'); - } catch (e) { - sourceMap = {}; - Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap); - } - - exports['test that the api is properly exposed in the top level'] = function (assert, util) { - assert.equal(typeof sourceMap.SourceMapGenerator, "function"); - assert.equal(typeof sourceMap.SourceMapConsumer, "function"); - assert.equal(typeof sourceMap.SourceNode, "function"); - }; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-array-set.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-array-set.js deleted file mode 100644 index b5797ed..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-array-set.js +++ /dev/null @@ -1,104 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var ArraySet = require('../../lib/source-map/array-set').ArraySet; - - function makeTestSet() { - var set = new ArraySet(); - for (var i = 0; i < 100; i++) { - set.add(String(i)); - } - return set; - } - - exports['test .has() membership'] = function (assert, util) { - var set = makeTestSet(); - for (var i = 0; i < 100; i++) { - assert.ok(set.has(String(i))); - } - }; - - exports['test .indexOf() elements'] = function (assert, util) { - var set = makeTestSet(); - for (var i = 0; i < 100; i++) { - assert.strictEqual(set.indexOf(String(i)), i); - } - }; - - exports['test .at() indexing'] = function (assert, util) { - var set = makeTestSet(); - for (var i = 0; i < 100; i++) { - assert.strictEqual(set.at(i), String(i)); - } - }; - - exports['test creating from an array'] = function (assert, util) { - var set = ArraySet.fromArray(['foo', 'bar', 'baz', 'quux', 'hasOwnProperty']); - - assert.ok(set.has('foo')); - assert.ok(set.has('bar')); - assert.ok(set.has('baz')); - assert.ok(set.has('quux')); - assert.ok(set.has('hasOwnProperty')); - - assert.strictEqual(set.indexOf('foo'), 0); - assert.strictEqual(set.indexOf('bar'), 1); - assert.strictEqual(set.indexOf('baz'), 2); - assert.strictEqual(set.indexOf('quux'), 3); - - assert.strictEqual(set.at(0), 'foo'); - assert.strictEqual(set.at(1), 'bar'); - assert.strictEqual(set.at(2), 'baz'); - assert.strictEqual(set.at(3), 'quux'); - }; - - exports['test that you can add __proto__; see github issue #30'] = function (assert, util) { - var set = new ArraySet(); - set.add('__proto__'); - assert.ok(set.has('__proto__')); - assert.strictEqual(set.at(0), '__proto__'); - assert.strictEqual(set.indexOf('__proto__'), 0); - }; - - exports['test .fromArray() with duplicates'] = function (assert, util) { - var set = ArraySet.fromArray(['foo', 'foo']); - assert.ok(set.has('foo')); - assert.strictEqual(set.at(0), 'foo'); - assert.strictEqual(set.indexOf('foo'), 0); - assert.strictEqual(set.toArray().length, 1); - - set = ArraySet.fromArray(['foo', 'foo'], true); - assert.ok(set.has('foo')); - assert.strictEqual(set.at(0), 'foo'); - assert.strictEqual(set.at(1), 'foo'); - assert.strictEqual(set.indexOf('foo'), 0); - assert.strictEqual(set.toArray().length, 2); - }; - - exports['test .add() with duplicates'] = function (assert, util) { - var set = new ArraySet(); - set.add('foo'); - - set.add('foo'); - assert.ok(set.has('foo')); - assert.strictEqual(set.at(0), 'foo'); - assert.strictEqual(set.indexOf('foo'), 0); - assert.strictEqual(set.toArray().length, 1); - - set.add('foo', true); - assert.ok(set.has('foo')); - assert.strictEqual(set.at(0), 'foo'); - assert.strictEqual(set.at(1), 'foo'); - assert.strictEqual(set.indexOf('foo'), 0); - assert.strictEqual(set.toArray().length, 2); - }; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64-vlq.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64-vlq.js deleted file mode 100644 index 6fd0d99..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64-vlq.js +++ /dev/null @@ -1,23 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var base64VLQ = require('../../lib/source-map/base64-vlq'); - - exports['test normal encoding and decoding'] = function (assert, util) { - var result = {}; - for (var i = -255; i < 256; i++) { - base64VLQ.decode(base64VLQ.encode(i), result); - assert.equal(result.value, i); - assert.equal(result.rest, ""); - } - }; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64.js deleted file mode 100644 index ff3a244..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64.js +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var base64 = require('../../lib/source-map/base64'); - - exports['test out of range encoding'] = function (assert, util) { - assert.throws(function () { - base64.encode(-1); - }); - assert.throws(function () { - base64.encode(64); - }); - }; - - exports['test out of range decoding'] = function (assert, util) { - assert.throws(function () { - base64.decode('='); - }); - }; - - exports['test normal encoding and decoding'] = function (assert, util) { - for (var i = 0; i < 64; i++) { - assert.equal(base64.decode(base64.encode(i)), i); - } - }; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-binary-search.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-binary-search.js deleted file mode 100644 index f1c9e0f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-binary-search.js +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var binarySearch = require('../../lib/source-map/binary-search'); - - function numberCompare(a, b) { - return a - b; - } - - exports['test too high'] = function (assert, util) { - var needle = 30; - var haystack = [2,4,6,8,10,12,14,16,18,20]; - - assert.doesNotThrow(function () { - binarySearch.search(needle, haystack, numberCompare); - }); - - assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare)], 20); - }; - - exports['test too low'] = function (assert, util) { - var needle = 1; - var haystack = [2,4,6,8,10,12,14,16,18,20]; - - assert.doesNotThrow(function () { - binarySearch.search(needle, haystack, numberCompare); - }); - - assert.equal(binarySearch.search(needle, haystack, numberCompare), -1); - }; - - exports['test exact search'] = function (assert, util) { - var needle = 4; - var haystack = [2,4,6,8,10,12,14,16,18,20]; - - assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare)], 4); - }; - - exports['test fuzzy search'] = function (assert, util) { - var needle = 19; - var haystack = [2,4,6,8,10,12,14,16,18,20]; - - assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare)], 18); - }; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-dog-fooding.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-dog-fooding.js deleted file mode 100644 index 26757b2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-dog-fooding.js +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; - var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; - - exports['test eating our own dog food'] = function (assert, util) { - var smg = new SourceMapGenerator({ - file: 'testing.js', - sourceRoot: '/wu/tang' - }); - - smg.addMapping({ - source: 'gza.coffee', - original: { line: 1, column: 0 }, - generated: { line: 2, column: 2 } - }); - - smg.addMapping({ - source: 'gza.coffee', - original: { line: 2, column: 0 }, - generated: { line: 3, column: 2 } - }); - - smg.addMapping({ - source: 'gza.coffee', - original: { line: 3, column: 0 }, - generated: { line: 4, column: 2 } - }); - - smg.addMapping({ - source: 'gza.coffee', - original: { line: 4, column: 0 }, - generated: { line: 5, column: 2 } - }); - - smg.addMapping({ - source: 'gza.coffee', - original: { line: 5, column: 10 }, - generated: { line: 6, column: 12 } - }); - - var smc = new SourceMapConsumer(smg.toString()); - - // Exact - util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 0, null, smc, assert); - util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 0, null, smc, assert); - util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 0, null, smc, assert); - util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 0, null, smc, assert); - util.assertMapping(6, 12, '/wu/tang/gza.coffee', 5, 10, null, smc, assert); - - // Fuzzy - - // Generated to original - util.assertMapping(2, 0, null, null, null, null, smc, assert, true); - util.assertMapping(2, 9, '/wu/tang/gza.coffee', 1, 0, null, smc, assert, true); - util.assertMapping(3, 0, null, null, null, null, smc, assert, true); - util.assertMapping(3, 9, '/wu/tang/gza.coffee', 2, 0, null, smc, assert, true); - util.assertMapping(4, 0, null, null, null, null, smc, assert, true); - util.assertMapping(4, 9, '/wu/tang/gza.coffee', 3, 0, null, smc, assert, true); - util.assertMapping(5, 0, null, null, null, null, smc, assert, true); - util.assertMapping(5, 9, '/wu/tang/gza.coffee', 4, 0, null, smc, assert, true); - util.assertMapping(6, 0, null, null, null, null, smc, assert, true); - util.assertMapping(6, 9, null, null, null, null, smc, assert, true); - util.assertMapping(6, 13, '/wu/tang/gza.coffee', 5, 10, null, smc, assert, true); - - // Original to generated - util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 1, null, smc, assert, null, true); - util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 3, null, smc, assert, null, true); - util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 6, null, smc, assert, null, true); - util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 9, null, smc, assert, null, true); - util.assertMapping(5, 2, '/wu/tang/gza.coffee', 5, 9, null, smc, assert, null, true); - util.assertMapping(6, 12, '/wu/tang/gza.coffee', 6, 19, null, smc, assert, null, true); - }; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-consumer.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-consumer.js deleted file mode 100644 index c714943..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-consumer.js +++ /dev/null @@ -1,702 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; - var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; - - exports['test that we can instantiate with a string or an object'] = function (assert, util) { - assert.doesNotThrow(function () { - var map = new SourceMapConsumer(util.testMap); - }); - assert.doesNotThrow(function () { - var map = new SourceMapConsumer(JSON.stringify(util.testMap)); - }); - }; - - exports['test that the `sources` field has the original sources'] = function (assert, util) { - var map; - var sources; - - map = new SourceMapConsumer(util.testMap); - sources = map.sources; - assert.equal(sources[0], '/the/root/one.js'); - assert.equal(sources[1], '/the/root/two.js'); - assert.equal(sources.length, 2); - - map = new SourceMapConsumer(util.testMapNoSourceRoot); - sources = map.sources; - assert.equal(sources[0], 'one.js'); - assert.equal(sources[1], 'two.js'); - assert.equal(sources.length, 2); - - map = new SourceMapConsumer(util.testMapEmptySourceRoot); - sources = map.sources; - assert.equal(sources[0], 'one.js'); - assert.equal(sources[1], 'two.js'); - assert.equal(sources.length, 2); - }; - - exports['test that the source root is reflected in a mapping\'s source field'] = function (assert, util) { - var map; - var mapping; - - map = new SourceMapConsumer(util.testMap); - - mapping = map.originalPositionFor({ - line: 2, - column: 1 - }); - assert.equal(mapping.source, '/the/root/two.js'); - - mapping = map.originalPositionFor({ - line: 1, - column: 1 - }); - assert.equal(mapping.source, '/the/root/one.js'); - - - map = new SourceMapConsumer(util.testMapNoSourceRoot); - - mapping = map.originalPositionFor({ - line: 2, - column: 1 - }); - assert.equal(mapping.source, 'two.js'); - - mapping = map.originalPositionFor({ - line: 1, - column: 1 - }); - assert.equal(mapping.source, 'one.js'); - - - map = new SourceMapConsumer(util.testMapEmptySourceRoot); - - mapping = map.originalPositionFor({ - line: 2, - column: 1 - }); - assert.equal(mapping.source, 'two.js'); - - mapping = map.originalPositionFor({ - line: 1, - column: 1 - }); - assert.equal(mapping.source, 'one.js'); - }; - - exports['test mapping tokens back exactly'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMap); - - util.assertMapping(1, 1, '/the/root/one.js', 1, 1, null, map, assert); - util.assertMapping(1, 5, '/the/root/one.js', 1, 5, null, map, assert); - util.assertMapping(1, 9, '/the/root/one.js', 1, 11, null, map, assert); - util.assertMapping(1, 18, '/the/root/one.js', 1, 21, 'bar', map, assert); - util.assertMapping(1, 21, '/the/root/one.js', 2, 3, null, map, assert); - util.assertMapping(1, 28, '/the/root/one.js', 2, 10, 'baz', map, assert); - util.assertMapping(1, 32, '/the/root/one.js', 2, 14, 'bar', map, assert); - - util.assertMapping(2, 1, '/the/root/two.js', 1, 1, null, map, assert); - util.assertMapping(2, 5, '/the/root/two.js', 1, 5, null, map, assert); - util.assertMapping(2, 9, '/the/root/two.js', 1, 11, null, map, assert); - util.assertMapping(2, 18, '/the/root/two.js', 1, 21, 'n', map, assert); - util.assertMapping(2, 21, '/the/root/two.js', 2, 3, null, map, assert); - util.assertMapping(2, 28, '/the/root/two.js', 2, 10, 'n', map, assert); - }; - - exports['test mapping tokens fuzzy'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMap); - - // Finding original positions - util.assertMapping(1, 20, '/the/root/one.js', 1, 21, 'bar', map, assert, true); - util.assertMapping(1, 30, '/the/root/one.js', 2, 10, 'baz', map, assert, true); - util.assertMapping(2, 12, '/the/root/two.js', 1, 11, null, map, assert, true); - - // Finding generated positions - util.assertMapping(1, 18, '/the/root/one.js', 1, 22, 'bar', map, assert, null, true); - util.assertMapping(1, 28, '/the/root/one.js', 2, 13, 'baz', map, assert, null, true); - util.assertMapping(2, 9, '/the/root/two.js', 1, 16, null, map, assert, null, true); - }; - - exports['test mappings and end of lines'] = function (assert, util) { - var smg = new SourceMapGenerator({ - file: 'foo.js' - }); - smg.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 1, column: 1 }, - source: 'bar.js' - }); - smg.addMapping({ - original: { line: 2, column: 2 }, - generated: { line: 2, column: 2 }, - source: 'bar.js' - }); - - var map = SourceMapConsumer.fromSourceMap(smg); - - // When finding original positions, mappings end at the end of the line. - util.assertMapping(2, 1, null, null, null, null, map, assert, true) - - // When finding generated positions, mappings do not end at the end of the line. - util.assertMapping(1, 1, 'bar.js', 2, 1, null, map, assert, null, true); - }; - - exports['test creating source map consumers with )]}\' prefix'] = function (assert, util) { - assert.doesNotThrow(function () { - var map = new SourceMapConsumer(")]}'" + JSON.stringify(util.testMap)); - }); - }; - - exports['test eachMapping'] = function (assert, util) { - var map; - - map = new SourceMapConsumer(util.testMap); - var previousLine = -Infinity; - var previousColumn = -Infinity; - map.eachMapping(function (mapping) { - assert.ok(mapping.generatedLine >= previousLine); - - assert.ok(mapping.source === '/the/root/one.js' || mapping.source === '/the/root/two.js'); - - if (mapping.generatedLine === previousLine) { - assert.ok(mapping.generatedColumn >= previousColumn); - previousColumn = mapping.generatedColumn; - } - else { - previousLine = mapping.generatedLine; - previousColumn = -Infinity; - } - }); - - map = new SourceMapConsumer(util.testMapNoSourceRoot); - map.eachMapping(function (mapping) { - assert.ok(mapping.source === 'one.js' || mapping.source === 'two.js'); - }); - - map = new SourceMapConsumer(util.testMapEmptySourceRoot); - map.eachMapping(function (mapping) { - assert.ok(mapping.source === 'one.js' || mapping.source === 'two.js'); - }); - }; - - exports['test iterating over mappings in a different order'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMap); - var previousLine = -Infinity; - var previousColumn = -Infinity; - var previousSource = ""; - map.eachMapping(function (mapping) { - assert.ok(mapping.source >= previousSource); - - if (mapping.source === previousSource) { - assert.ok(mapping.originalLine >= previousLine); - - if (mapping.originalLine === previousLine) { - assert.ok(mapping.originalColumn >= previousColumn); - previousColumn = mapping.originalColumn; - } - else { - previousLine = mapping.originalLine; - previousColumn = -Infinity; - } - } - else { - previousSource = mapping.source; - previousLine = -Infinity; - previousColumn = -Infinity; - } - }, null, SourceMapConsumer.ORIGINAL_ORDER); - }; - - exports['test that we can set the context for `this` in eachMapping'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMap); - var context = {}; - map.eachMapping(function () { - assert.equal(this, context); - }, context); - }; - - exports['test that the `sourcesContent` field has the original sources'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMapWithSourcesContent); - var sourcesContent = map.sourcesContent; - - assert.equal(sourcesContent[0], ' ONE.foo = function (bar) {\n return baz(bar);\n };'); - assert.equal(sourcesContent[1], ' TWO.inc = function (n) {\n return n + 1;\n };'); - assert.equal(sourcesContent.length, 2); - }; - - exports['test that we can get the original sources for the sources'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMapWithSourcesContent); - var sources = map.sources; - - assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); - assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };'); - assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); - assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };'); - assert.throws(function () { - map.sourceContentFor(""); - }, Error); - assert.throws(function () { - map.sourceContentFor("/the/root/three.js"); - }, Error); - assert.throws(function () { - map.sourceContentFor("three.js"); - }, Error); - }; - - exports['test that we can get the original source content with relative source paths'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMapRelativeSources); - var sources = map.sources; - - assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); - assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };'); - assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); - assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };'); - assert.throws(function () { - map.sourceContentFor(""); - }, Error); - assert.throws(function () { - map.sourceContentFor("/the/root/three.js"); - }, Error); - assert.throws(function () { - map.sourceContentFor("three.js"); - }, Error); - }; - - exports['test sourceRoot + generatedPositionFor'] = function (assert, util) { - var map = new SourceMapGenerator({ - sourceRoot: 'foo/bar', - file: 'baz.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'bang.coffee' - }); - map.addMapping({ - original: { line: 5, column: 5 }, - generated: { line: 6, column: 6 }, - source: 'bang.coffee' - }); - map = new SourceMapConsumer(map.toString()); - - // Should handle without sourceRoot. - var pos = map.generatedPositionFor({ - line: 1, - column: 1, - source: 'bang.coffee' - }); - - assert.equal(pos.line, 2); - assert.equal(pos.column, 2); - - // Should handle with sourceRoot. - var pos = map.generatedPositionFor({ - line: 1, - column: 1, - source: 'foo/bar/bang.coffee' - }); - - assert.equal(pos.line, 2); - assert.equal(pos.column, 2); - }; - - exports['test allGeneratedPositionsFor'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'bar.coffee' - }); - map.addMapping({ - original: { line: 2, column: 1 }, - generated: { line: 3, column: 2 }, - source: 'bar.coffee' - }); - map.addMapping({ - original: { line: 2, column: 2 }, - generated: { line: 3, column: 3 }, - source: 'bar.coffee' - }); - map.addMapping({ - original: { line: 3, column: 1 }, - generated: { line: 4, column: 2 }, - source: 'bar.coffee' - }); - map = new SourceMapConsumer(map.toString()); - - var mappings = map.allGeneratedPositionsFor({ - line: 2, - source: 'bar.coffee' - }); - - assert.equal(mappings.length, 2); - assert.equal(mappings[0].line, 3); - assert.equal(mappings[0].column, 2); - assert.equal(mappings[1].line, 3); - assert.equal(mappings[1].column, 3); - }; - - exports['test allGeneratedPositionsFor for line with no mappings'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'bar.coffee' - }); - map.addMapping({ - original: { line: 3, column: 1 }, - generated: { line: 4, column: 2 }, - source: 'bar.coffee' - }); - map = new SourceMapConsumer(map.toString()); - - var mappings = map.allGeneratedPositionsFor({ - line: 2, - source: 'bar.coffee' - }); - - assert.equal(mappings.length, 0); - }; - - exports['test allGeneratedPositionsFor source map with no mappings'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated.js' - }); - map = new SourceMapConsumer(map.toString()); - - var mappings = map.allGeneratedPositionsFor({ - line: 2, - source: 'bar.coffee' - }); - - assert.equal(mappings.length, 0); - }; - - exports['test computeColumnSpans'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 1, column: 1 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 2, column: 1 }, - generated: { line: 2, column: 1 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 2, column: 2 }, - generated: { line: 2, column: 10 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 2, column: 3 }, - generated: { line: 2, column: 20 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 3, column: 1 }, - generated: { line: 3, column: 1 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 3, column: 2 }, - generated: { line: 3, column: 2 }, - source: 'foo.coffee' - }); - map = new SourceMapConsumer(map.toString()); - - map.computeColumnSpans(); - - var mappings = map.allGeneratedPositionsFor({ - line: 1, - source: 'foo.coffee' - }); - - assert.equal(mappings.length, 1); - assert.equal(mappings[0].lastColumn, Infinity); - - var mappings = map.allGeneratedPositionsFor({ - line: 2, - source: 'foo.coffee' - }); - - assert.equal(mappings.length, 3); - assert.equal(mappings[0].lastColumn, 9); - assert.equal(mappings[1].lastColumn, 19); - assert.equal(mappings[2].lastColumn, Infinity); - - var mappings = map.allGeneratedPositionsFor({ - line: 3, - source: 'foo.coffee' - }); - - assert.equal(mappings.length, 2); - assert.equal(mappings[0].lastColumn, 1); - assert.equal(mappings[1].lastColumn, Infinity); - }; - - exports['test sourceRoot + originalPositionFor'] = function (assert, util) { - var map = new SourceMapGenerator({ - sourceRoot: 'foo/bar', - file: 'baz.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'bang.coffee' - }); - map = new SourceMapConsumer(map.toString()); - - var pos = map.originalPositionFor({ - line: 2, - column: 2, - }); - - // Should always have the prepended source root - assert.equal(pos.source, 'foo/bar/bang.coffee'); - assert.equal(pos.line, 1); - assert.equal(pos.column, 1); - }; - - exports['test github issue #56'] = function (assert, util) { - var map = new SourceMapGenerator({ - sourceRoot: 'http://', - file: 'www.example.com/foo.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'www.example.com/original.js' - }); - map = new SourceMapConsumer(map.toString()); - - var sources = map.sources; - assert.equal(sources.length, 1); - assert.equal(sources[0], 'http://www.example.com/original.js'); - }; - - exports['test github issue #43'] = function (assert, util) { - var map = new SourceMapGenerator({ - sourceRoot: 'http://example.com', - file: 'foo.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'http://cdn.example.com/original.js' - }); - map = new SourceMapConsumer(map.toString()); - - var sources = map.sources; - assert.equal(sources.length, 1, - 'Should only be one source.'); - assert.equal(sources[0], 'http://cdn.example.com/original.js', - 'Should not be joined with the sourceRoot.'); - }; - - exports['test absolute path, but same host sources'] = function (assert, util) { - var map = new SourceMapGenerator({ - sourceRoot: 'http://example.com/foo/bar', - file: 'foo.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: '/original.js' - }); - map = new SourceMapConsumer(map.toString()); - - var sources = map.sources; - assert.equal(sources.length, 1, - 'Should only be one source.'); - assert.equal(sources[0], 'http://example.com/original.js', - 'Source should be relative the host of the source root.'); - }; - - exports['test github issue #64'] = function (assert, util) { - var map = new SourceMapConsumer({ - "version": 3, - "file": "foo.js", - "sourceRoot": "http://example.com/", - "sources": ["/a"], - "names": [], - "mappings": "AACA", - "sourcesContent": ["foo"] - }); - - assert.equal(map.sourceContentFor("a"), "foo"); - assert.equal(map.sourceContentFor("/a"), "foo"); - }; - - exports['test bug 885597'] = function (assert, util) { - var map = new SourceMapConsumer({ - "version": 3, - "file": "foo.js", - "sourceRoot": "file:///Users/AlGore/Invented/The/Internet/", - "sources": ["/a"], - "names": [], - "mappings": "AACA", - "sourcesContent": ["foo"] - }); - - var s = map.sources[0]; - assert.equal(map.sourceContentFor(s), "foo"); - }; - - exports['test github issue #72, duplicate sources'] = function (assert, util) { - var map = new SourceMapConsumer({ - "version": 3, - "file": "foo.js", - "sources": ["source1.js", "source1.js", "source3.js"], - "names": [], - "mappings": ";EAAC;;IAEE;;MEEE", - "sourceRoot": "http://example.com" - }); - - var pos = map.originalPositionFor({ - line: 2, - column: 2 - }); - assert.equal(pos.source, 'http://example.com/source1.js'); - assert.equal(pos.line, 1); - assert.equal(pos.column, 1); - - var pos = map.originalPositionFor({ - line: 4, - column: 4 - }); - assert.equal(pos.source, 'http://example.com/source1.js'); - assert.equal(pos.line, 3); - assert.equal(pos.column, 3); - - var pos = map.originalPositionFor({ - line: 6, - column: 6 - }); - assert.equal(pos.source, 'http://example.com/source3.js'); - assert.equal(pos.line, 5); - assert.equal(pos.column, 5); - }; - - exports['test github issue #72, duplicate names'] = function (assert, util) { - var map = new SourceMapConsumer({ - "version": 3, - "file": "foo.js", - "sources": ["source.js"], - "names": ["name1", "name1", "name3"], - "mappings": ";EAACA;;IAEEA;;MAEEE", - "sourceRoot": "http://example.com" - }); - - var pos = map.originalPositionFor({ - line: 2, - column: 2 - }); - assert.equal(pos.name, 'name1'); - assert.equal(pos.line, 1); - assert.equal(pos.column, 1); - - var pos = map.originalPositionFor({ - line: 4, - column: 4 - }); - assert.equal(pos.name, 'name1'); - assert.equal(pos.line, 3); - assert.equal(pos.column, 3); - - var pos = map.originalPositionFor({ - line: 6, - column: 6 - }); - assert.equal(pos.name, 'name3'); - assert.equal(pos.line, 5); - assert.equal(pos.column, 5); - }; - - exports['test SourceMapConsumer.fromSourceMap'] = function (assert, util) { - var smg = new SourceMapGenerator({ - sourceRoot: 'http://example.com/', - file: 'foo.js' - }); - smg.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'bar.js' - }); - smg.addMapping({ - original: { line: 2, column: 2 }, - generated: { line: 4, column: 4 }, - source: 'baz.js', - name: 'dirtMcGirt' - }); - smg.setSourceContent('baz.js', 'baz.js content'); - - var smc = SourceMapConsumer.fromSourceMap(smg); - assert.equal(smc.file, 'foo.js'); - assert.equal(smc.sourceRoot, 'http://example.com/'); - assert.equal(smc.sources.length, 2); - assert.equal(smc.sources[0], 'http://example.com/bar.js'); - assert.equal(smc.sources[1], 'http://example.com/baz.js'); - assert.equal(smc.sourceContentFor('baz.js'), 'baz.js content'); - - var pos = smc.originalPositionFor({ - line: 2, - column: 2 - }); - assert.equal(pos.line, 1); - assert.equal(pos.column, 1); - assert.equal(pos.source, 'http://example.com/bar.js'); - assert.equal(pos.name, null); - - pos = smc.generatedPositionFor({ - line: 1, - column: 1, - source: 'http://example.com/bar.js' - }); - assert.equal(pos.line, 2); - assert.equal(pos.column, 2); - - pos = smc.originalPositionFor({ - line: 4, - column: 4 - }); - assert.equal(pos.line, 2); - assert.equal(pos.column, 2); - assert.equal(pos.source, 'http://example.com/baz.js'); - assert.equal(pos.name, 'dirtMcGirt'); - - pos = smc.generatedPositionFor({ - line: 2, - column: 2, - source: 'http://example.com/baz.js' - }); - assert.equal(pos.line, 4); - assert.equal(pos.column, 4); - }; -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-generator.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-generator.js deleted file mode 100644 index d748bb1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-generator.js +++ /dev/null @@ -1,679 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; - var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; - var SourceNode = require('../../lib/source-map/source-node').SourceNode; - var util = require('./util'); - - exports['test some simple stuff'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'foo.js', - sourceRoot: '.' - }); - assert.ok(true); - - var map = new SourceMapGenerator().toJSON(); - assert.ok(!('file' in map)); - assert.ok(!('sourceRoot' in map)); - }; - - exports['test JSON serialization'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'foo.js', - sourceRoot: '.' - }); - assert.equal(map.toString(), JSON.stringify(map)); - }; - - exports['test adding mappings (case 1)'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated-foo.js', - sourceRoot: '.' - }); - - assert.doesNotThrow(function () { - map.addMapping({ - generated: { line: 1, column: 1 } - }); - }); - }; - - exports['test adding mappings (case 2)'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated-foo.js', - sourceRoot: '.' - }); - - assert.doesNotThrow(function () { - map.addMapping({ - generated: { line: 1, column: 1 }, - source: 'bar.js', - original: { line: 1, column: 1 } - }); - }); - }; - - exports['test adding mappings (case 3)'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated-foo.js', - sourceRoot: '.' - }); - - assert.doesNotThrow(function () { - map.addMapping({ - generated: { line: 1, column: 1 }, - source: 'bar.js', - original: { line: 1, column: 1 }, - name: 'someToken' - }); - }); - }; - - exports['test adding mappings (invalid)'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated-foo.js', - sourceRoot: '.' - }); - - // Not enough info. - assert.throws(function () { - map.addMapping({}); - }); - - // Original file position, but no source. - assert.throws(function () { - map.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 1, column: 1 } - }); - }); - }; - - exports['test adding mappings with skipValidation'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated-foo.js', - sourceRoot: '.', - skipValidation: true - }); - - // Not enough info, caught by `util.getArgs` - assert.throws(function () { - map.addMapping({}); - }); - - // Original file position, but no source. Not checked. - assert.doesNotThrow(function () { - map.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 1, column: 1 } - }); - }); - }; - - exports['test that the correct mappings are being generated'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'min.js', - sourceRoot: '/the/root' - }); - - map.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 1, column: 1 }, - source: 'one.js' - }); - map.addMapping({ - generated: { line: 1, column: 5 }, - original: { line: 1, column: 5 }, - source: 'one.js' - }); - map.addMapping({ - generated: { line: 1, column: 9 }, - original: { line: 1, column: 11 }, - source: 'one.js' - }); - map.addMapping({ - generated: { line: 1, column: 18 }, - original: { line: 1, column: 21 }, - source: 'one.js', - name: 'bar' - }); - map.addMapping({ - generated: { line: 1, column: 21 }, - original: { line: 2, column: 3 }, - source: 'one.js' - }); - map.addMapping({ - generated: { line: 1, column: 28 }, - original: { line: 2, column: 10 }, - source: 'one.js', - name: 'baz' - }); - map.addMapping({ - generated: { line: 1, column: 32 }, - original: { line: 2, column: 14 }, - source: 'one.js', - name: 'bar' - }); - - map.addMapping({ - generated: { line: 2, column: 1 }, - original: { line: 1, column: 1 }, - source: 'two.js' - }); - map.addMapping({ - generated: { line: 2, column: 5 }, - original: { line: 1, column: 5 }, - source: 'two.js' - }); - map.addMapping({ - generated: { line: 2, column: 9 }, - original: { line: 1, column: 11 }, - source: 'two.js' - }); - map.addMapping({ - generated: { line: 2, column: 18 }, - original: { line: 1, column: 21 }, - source: 'two.js', - name: 'n' - }); - map.addMapping({ - generated: { line: 2, column: 21 }, - original: { line: 2, column: 3 }, - source: 'two.js' - }); - map.addMapping({ - generated: { line: 2, column: 28 }, - original: { line: 2, column: 10 }, - source: 'two.js', - name: 'n' - }); - - map = JSON.parse(map.toString()); - - util.assertEqualMaps(assert, map, util.testMap); - }; - - exports['test that adding a mapping with an empty string name does not break generation'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated-foo.js', - sourceRoot: '.' - }); - - map.addMapping({ - generated: { line: 1, column: 1 }, - source: 'bar.js', - original: { line: 1, column: 1 }, - name: '' - }); - - assert.doesNotThrow(function () { - JSON.parse(map.toString()); - }); - }; - - exports['test that source content can be set'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'min.js', - sourceRoot: '/the/root' - }); - map.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 1, column: 1 }, - source: 'one.js' - }); - map.addMapping({ - generated: { line: 2, column: 1 }, - original: { line: 1, column: 1 }, - source: 'two.js' - }); - map.setSourceContent('one.js', 'one file content'); - - map = JSON.parse(map.toString()); - assert.equal(map.sources[0], 'one.js'); - assert.equal(map.sources[1], 'two.js'); - assert.equal(map.sourcesContent[0], 'one file content'); - assert.equal(map.sourcesContent[1], null); - }; - - exports['test .fromSourceMap'] = function (assert, util) { - var map = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(util.testMap)); - util.assertEqualMaps(assert, map.toJSON(), util.testMap); - }; - - exports['test .fromSourceMap with sourcesContent'] = function (assert, util) { - var map = SourceMapGenerator.fromSourceMap( - new SourceMapConsumer(util.testMapWithSourcesContent)); - util.assertEqualMaps(assert, map.toJSON(), util.testMapWithSourcesContent); - }; - - exports['test applySourceMap'] = function (assert, util) { - var node = new SourceNode(null, null, null, [ - new SourceNode(2, 0, 'fileX', 'lineX2\n'), - 'genA1\n', - new SourceNode(2, 0, 'fileY', 'lineY2\n'), - 'genA2\n', - new SourceNode(1, 0, 'fileX', 'lineX1\n'), - 'genA3\n', - new SourceNode(1, 0, 'fileY', 'lineY1\n') - ]); - var mapStep1 = node.toStringWithSourceMap({ - file: 'fileA' - }).map; - mapStep1.setSourceContent('fileX', 'lineX1\nlineX2\n'); - mapStep1 = mapStep1.toJSON(); - - node = new SourceNode(null, null, null, [ - 'gen1\n', - new SourceNode(1, 0, 'fileA', 'lineA1\n'), - new SourceNode(2, 0, 'fileA', 'lineA2\n'), - new SourceNode(3, 0, 'fileA', 'lineA3\n'), - new SourceNode(4, 0, 'fileA', 'lineA4\n'), - new SourceNode(1, 0, 'fileB', 'lineB1\n'), - new SourceNode(2, 0, 'fileB', 'lineB2\n'), - 'gen2\n' - ]); - var mapStep2 = node.toStringWithSourceMap({ - file: 'fileGen' - }).map; - mapStep2.setSourceContent('fileB', 'lineB1\nlineB2\n'); - mapStep2 = mapStep2.toJSON(); - - node = new SourceNode(null, null, null, [ - 'gen1\n', - new SourceNode(2, 0, 'fileX', 'lineA1\n'), - new SourceNode(2, 0, 'fileA', 'lineA2\n'), - new SourceNode(2, 0, 'fileY', 'lineA3\n'), - new SourceNode(4, 0, 'fileA', 'lineA4\n'), - new SourceNode(1, 0, 'fileB', 'lineB1\n'), - new SourceNode(2, 0, 'fileB', 'lineB2\n'), - 'gen2\n' - ]); - var expectedMap = node.toStringWithSourceMap({ - file: 'fileGen' - }).map; - expectedMap.setSourceContent('fileX', 'lineX1\nlineX2\n'); - expectedMap.setSourceContent('fileB', 'lineB1\nlineB2\n'); - expectedMap = expectedMap.toJSON(); - - // apply source map "mapStep1" to "mapStep2" - var generator = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(mapStep2)); - generator.applySourceMap(new SourceMapConsumer(mapStep1)); - var actualMap = generator.toJSON(); - - util.assertEqualMaps(assert, actualMap, expectedMap); - }; - - exports['test applySourceMap throws when file is missing'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'test.js' - }); - var map2 = new SourceMapGenerator(); - assert.throws(function() { - map.applySourceMap(new SourceMapConsumer(map2.toJSON())); - }); - }; - - exports['test the two additional parameters of applySourceMap'] = function (assert, util) { - // Assume the following directory structure: - // - // http://foo.org/ - // bar.coffee - // app/ - // coffee/ - // foo.coffee - // temp/ - // bundle.js - // temp_maps/ - // bundle.js.map - // public/ - // bundle.min.js - // bundle.min.js.map - // - // http://www.example.com/ - // baz.coffee - - var bundleMap = new SourceMapGenerator({ - file: 'bundle.js' - }); - bundleMap.addMapping({ - generated: { line: 3, column: 3 }, - original: { line: 2, column: 2 }, - source: '../../coffee/foo.coffee' - }); - bundleMap.setSourceContent('../../coffee/foo.coffee', 'foo coffee'); - bundleMap.addMapping({ - generated: { line: 13, column: 13 }, - original: { line: 12, column: 12 }, - source: '/bar.coffee' - }); - bundleMap.setSourceContent('/bar.coffee', 'bar coffee'); - bundleMap.addMapping({ - generated: { line: 23, column: 23 }, - original: { line: 22, column: 22 }, - source: 'http://www.example.com/baz.coffee' - }); - bundleMap.setSourceContent( - 'http://www.example.com/baz.coffee', - 'baz coffee' - ); - bundleMap = new SourceMapConsumer(bundleMap.toJSON()); - - var minifiedMap = new SourceMapGenerator({ - file: 'bundle.min.js', - sourceRoot: '..' - }); - minifiedMap.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 3, column: 3 }, - source: 'temp/bundle.js' - }); - minifiedMap.addMapping({ - generated: { line: 11, column: 11 }, - original: { line: 13, column: 13 }, - source: 'temp/bundle.js' - }); - minifiedMap.addMapping({ - generated: { line: 21, column: 21 }, - original: { line: 23, column: 23 }, - source: 'temp/bundle.js' - }); - minifiedMap = new SourceMapConsumer(minifiedMap.toJSON()); - - var expectedMap = function (sources) { - var map = new SourceMapGenerator({ - file: 'bundle.min.js', - sourceRoot: '..' - }); - map.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 2, column: 2 }, - source: sources[0] - }); - map.setSourceContent(sources[0], 'foo coffee'); - map.addMapping({ - generated: { line: 11, column: 11 }, - original: { line: 12, column: 12 }, - source: sources[1] - }); - map.setSourceContent(sources[1], 'bar coffee'); - map.addMapping({ - generated: { line: 21, column: 21 }, - original: { line: 22, column: 22 }, - source: sources[2] - }); - map.setSourceContent(sources[2], 'baz coffee'); - return map.toJSON(); - } - - var actualMap = function (aSourceMapPath) { - var map = SourceMapGenerator.fromSourceMap(minifiedMap); - // Note that relying on `bundleMap.file` (which is simply 'bundle.js') - // instead of supplying the second parameter wouldn't work here. - map.applySourceMap(bundleMap, '../temp/bundle.js', aSourceMapPath); - return map.toJSON(); - } - - util.assertEqualMaps(assert, actualMap('../temp/temp_maps'), expectedMap([ - 'coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - - util.assertEqualMaps(assert, actualMap('/app/temp/temp_maps'), expectedMap([ - '/app/coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - - util.assertEqualMaps(assert, actualMap('http://foo.org/app/temp/temp_maps'), expectedMap([ - 'http://foo.org/app/coffee/foo.coffee', - 'http://foo.org/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - - // If the third parameter is omitted or set to the current working - // directory we get incorrect source paths: - - util.assertEqualMaps(assert, actualMap(), expectedMap([ - '../coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - - util.assertEqualMaps(assert, actualMap(''), expectedMap([ - '../coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - - util.assertEqualMaps(assert, actualMap('.'), expectedMap([ - '../coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - - util.assertEqualMaps(assert, actualMap('./'), expectedMap([ - '../coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - }; - - exports['test applySourceMap name handling'] = function (assert, util) { - // Imagine some CoffeeScript code being compiled into JavaScript and then - // minified. - - var assertName = function(coffeeName, jsName, expectedName) { - var minifiedMap = new SourceMapGenerator({ - file: 'test.js.min' - }); - minifiedMap.addMapping({ - generated: { line: 1, column: 4 }, - original: { line: 1, column: 4 }, - source: 'test.js', - name: jsName - }); - - var coffeeMap = new SourceMapGenerator({ - file: 'test.js' - }); - coffeeMap.addMapping({ - generated: { line: 1, column: 4 }, - original: { line: 1, column: 0 }, - source: 'test.coffee', - name: coffeeName - }); - - minifiedMap.applySourceMap(new SourceMapConsumer(coffeeMap.toJSON())); - - new SourceMapConsumer(minifiedMap.toJSON()).eachMapping(function(mapping) { - assert.equal(mapping.name, expectedName); - }); - }; - - // `foo = 1` -> `var foo = 1;` -> `var a=1` - // CoffeeScript doesn’t rename variables, so there’s no need for it to - // provide names in its source maps. Minifiers do rename variables and - // therefore do provide names in their source maps. So that name should be - // retained if the original map lacks names. - assertName(null, 'foo', 'foo'); - - // `foo = 1` -> `var coffee$foo = 1;` -> `var a=1` - // Imagine that CoffeeScript prefixed all variables with `coffee$`. Even - // though the minifier then also provides a name, the original name is - // what corresponds to the source. - assertName('foo', 'coffee$foo', 'foo'); - - // `foo = 1` -> `var coffee$foo = 1;` -> `var coffee$foo=1` - // Minifiers can turn off variable mangling. Then there’s no need to - // provide names in the source map, but the names from the original map are - // still needed. - assertName('foo', null, 'foo'); - - // `foo = 1` -> `var foo = 1;` -> `var foo=1` - // No renaming at all. - assertName(null, null, null); - }; - - exports['test sorting with duplicate generated mappings'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'test.js' - }); - map.addMapping({ - generated: { line: 3, column: 0 }, - original: { line: 2, column: 0 }, - source: 'a.js' - }); - map.addMapping({ - generated: { line: 2, column: 0 } - }); - map.addMapping({ - generated: { line: 2, column: 0 } - }); - map.addMapping({ - generated: { line: 1, column: 0 }, - original: { line: 1, column: 0 }, - source: 'a.js' - }); - - util.assertEqualMaps(assert, map.toJSON(), { - version: 3, - file: 'test.js', - sources: ['a.js'], - names: [], - mappings: 'AAAA;A;AACA' - }); - }; - - exports['test ignore duplicate mappings.'] = function (assert, util) { - var init = { file: 'min.js', sourceRoot: '/the/root' }; - var map1, map2; - - // null original source location - var nullMapping1 = { - generated: { line: 1, column: 0 } - }; - var nullMapping2 = { - generated: { line: 2, column: 2 } - }; - - map1 = new SourceMapGenerator(init); - map2 = new SourceMapGenerator(init); - - map1.addMapping(nullMapping1); - map1.addMapping(nullMapping1); - - map2.addMapping(nullMapping1); - - util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); - - map1.addMapping(nullMapping2); - map1.addMapping(nullMapping1); - - map2.addMapping(nullMapping2); - - util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); - - // original source location - var srcMapping1 = { - generated: { line: 1, column: 0 }, - original: { line: 11, column: 0 }, - source: 'srcMapping1.js' - }; - var srcMapping2 = { - generated: { line: 2, column: 2 }, - original: { line: 11, column: 0 }, - source: 'srcMapping2.js' - }; - - map1 = new SourceMapGenerator(init); - map2 = new SourceMapGenerator(init); - - map1.addMapping(srcMapping1); - map1.addMapping(srcMapping1); - - map2.addMapping(srcMapping1); - - util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); - - map1.addMapping(srcMapping2); - map1.addMapping(srcMapping1); - - map2.addMapping(srcMapping2); - - util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); - - // full original source and name information - var fullMapping1 = { - generated: { line: 1, column: 0 }, - original: { line: 11, column: 0 }, - source: 'fullMapping1.js', - name: 'fullMapping1' - }; - var fullMapping2 = { - generated: { line: 2, column: 2 }, - original: { line: 11, column: 0 }, - source: 'fullMapping2.js', - name: 'fullMapping2' - }; - - map1 = new SourceMapGenerator(init); - map2 = new SourceMapGenerator(init); - - map1.addMapping(fullMapping1); - map1.addMapping(fullMapping1); - - map2.addMapping(fullMapping1); - - util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); - - map1.addMapping(fullMapping2); - map1.addMapping(fullMapping1); - - map2.addMapping(fullMapping2); - - util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); - }; - - exports['test github issue #72, check for duplicate names or sources'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'test.js' - }); - map.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 2, column: 2 }, - source: 'a.js', - name: 'foo' - }); - map.addMapping({ - generated: { line: 3, column: 3 }, - original: { line: 4, column: 4 }, - source: 'a.js', - name: 'foo' - }); - util.assertEqualMaps(assert, map.toJSON(), { - version: 3, - file: 'test.js', - sources: ['a.js'], - names: ['foo'], - mappings: 'CACEA;;GAEEA' - }); - }; - - exports['test setting sourcesContent to null when already null'] = function (assert, util) { - var smg = new SourceMapGenerator({ file: "foo.js" }); - assert.doesNotThrow(function() { - smg.setSourceContent("bar.js", null); - }); - }; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-node.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-node.js deleted file mode 100644 index 139af4e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-node.js +++ /dev/null @@ -1,612 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; - var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; - var SourceNode = require('../../lib/source-map/source-node').SourceNode; - - function forEachNewline(fn) { - return function (assert, util) { - ['\n', '\r\n'].forEach(fn.bind(null, assert, util)); - } - } - - exports['test .add()'] = function (assert, util) { - var node = new SourceNode(null, null, null); - - // Adding a string works. - node.add('function noop() {}'); - - // Adding another source node works. - node.add(new SourceNode(null, null, null)); - - // Adding an array works. - node.add(['function foo() {', - new SourceNode(null, null, null, - 'return 10;'), - '}']); - - // Adding other stuff doesn't. - assert.throws(function () { - node.add({}); - }); - assert.throws(function () { - node.add(function () {}); - }); - }; - - exports['test .prepend()'] = function (assert, util) { - var node = new SourceNode(null, null, null); - - // Prepending a string works. - node.prepend('function noop() {}'); - assert.equal(node.children[0], 'function noop() {}'); - assert.equal(node.children.length, 1); - - // Prepending another source node works. - node.prepend(new SourceNode(null, null, null)); - assert.equal(node.children[0], ''); - assert.equal(node.children[1], 'function noop() {}'); - assert.equal(node.children.length, 2); - - // Prepending an array works. - node.prepend(['function foo() {', - new SourceNode(null, null, null, - 'return 10;'), - '}']); - assert.equal(node.children[0], 'function foo() {'); - assert.equal(node.children[1], 'return 10;'); - assert.equal(node.children[2], '}'); - assert.equal(node.children[3], ''); - assert.equal(node.children[4], 'function noop() {}'); - assert.equal(node.children.length, 5); - - // Prepending other stuff doesn't. - assert.throws(function () { - node.prepend({}); - }); - assert.throws(function () { - node.prepend(function () {}); - }); - }; - - exports['test .toString()'] = function (assert, util) { - assert.equal((new SourceNode(null, null, null, - ['function foo() {', - new SourceNode(null, null, null, 'return 10;'), - '}'])).toString(), - 'function foo() {return 10;}'); - }; - - exports['test .join()'] = function (assert, util) { - assert.equal((new SourceNode(null, null, null, - ['a', 'b', 'c', 'd'])).join(', ').toString(), - 'a, b, c, d'); - }; - - exports['test .walk()'] = function (assert, util) { - var node = new SourceNode(null, null, null, - ['(function () {\n', - ' ', new SourceNode(1, 0, 'a.js', ['someCall()']), ';\n', - ' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';\n', - '}());']); - var expected = [ - { str: '(function () {\n', source: null, line: null, column: null }, - { str: ' ', source: null, line: null, column: null }, - { str: 'someCall()', source: 'a.js', line: 1, column: 0 }, - { str: ';\n', source: null, line: null, column: null }, - { str: ' ', source: null, line: null, column: null }, - { str: 'if (foo) bar()', source: 'b.js', line: 2, column: 0 }, - { str: ';\n', source: null, line: null, column: null }, - { str: '}());', source: null, line: null, column: null }, - ]; - var i = 0; - node.walk(function (chunk, loc) { - assert.equal(expected[i].str, chunk); - assert.equal(expected[i].source, loc.source); - assert.equal(expected[i].line, loc.line); - assert.equal(expected[i].column, loc.column); - i++; - }); - }; - - exports['test .replaceRight'] = function (assert, util) { - var node; - - // Not nested - node = new SourceNode(null, null, null, 'hello world'); - node.replaceRight(/world/, 'universe'); - assert.equal(node.toString(), 'hello universe'); - - // Nested - node = new SourceNode(null, null, null, - [new SourceNode(null, null, null, 'hey sexy mama, '), - new SourceNode(null, null, null, 'want to kill all humans?')]); - node.replaceRight(/kill all humans/, 'watch Futurama'); - assert.equal(node.toString(), 'hey sexy mama, want to watch Futurama?'); - }; - - exports['test .toStringWithSourceMap()'] = forEachNewline(function (assert, util, nl) { - var node = new SourceNode(null, null, null, - ['(function () {' + nl, - ' ', - new SourceNode(1, 0, 'a.js', 'someCall', 'originalCall'), - new SourceNode(1, 8, 'a.js', '()'), - ';' + nl, - ' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';' + nl, - '}());']); - var result = node.toStringWithSourceMap({ - file: 'foo.js' - }); - - assert.equal(result.code, [ - '(function () {', - ' someCall();', - ' if (foo) bar();', - '}());' - ].join(nl)); - - var map = result.map; - var mapWithoutOptions = node.toStringWithSourceMap().map; - - assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); - assert.ok(mapWithoutOptions instanceof SourceMapGenerator, 'mapWithoutOptions instanceof SourceMapGenerator'); - assert.ok(!('file' in mapWithoutOptions)); - mapWithoutOptions._file = 'foo.js'; - util.assertEqualMaps(assert, map.toJSON(), mapWithoutOptions.toJSON()); - - map = new SourceMapConsumer(map.toString()); - - var actual; - - actual = map.originalPositionFor({ - line: 1, - column: 4 - }); - assert.equal(actual.source, null); - assert.equal(actual.line, null); - assert.equal(actual.column, null); - - actual = map.originalPositionFor({ - line: 2, - column: 2 - }); - assert.equal(actual.source, 'a.js'); - assert.equal(actual.line, 1); - assert.equal(actual.column, 0); - assert.equal(actual.name, 'originalCall'); - - actual = map.originalPositionFor({ - line: 3, - column: 2 - }); - assert.equal(actual.source, 'b.js'); - assert.equal(actual.line, 2); - assert.equal(actual.column, 0); - - actual = map.originalPositionFor({ - line: 3, - column: 16 - }); - assert.equal(actual.source, null); - assert.equal(actual.line, null); - assert.equal(actual.column, null); - - actual = map.originalPositionFor({ - line: 4, - column: 2 - }); - assert.equal(actual.source, null); - assert.equal(actual.line, null); - assert.equal(actual.column, null); - }); - - exports['test .fromStringWithSourceMap()'] = forEachNewline(function (assert, util, nl) { - var testCode = util.testGeneratedCode.replace(/\n/g, nl); - var node = SourceNode.fromStringWithSourceMap( - testCode, - new SourceMapConsumer(util.testMap)); - - var result = node.toStringWithSourceMap({ - file: 'min.js' - }); - var map = result.map; - var code = result.code; - - assert.equal(code, testCode); - assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); - map = map.toJSON(); - assert.equal(map.version, util.testMap.version); - assert.equal(map.file, util.testMap.file); - assert.equal(map.mappings, util.testMap.mappings); - }); - - exports['test .fromStringWithSourceMap() empty map'] = forEachNewline(function (assert, util, nl) { - var node = SourceNode.fromStringWithSourceMap( - util.testGeneratedCode.replace(/\n/g, nl), - new SourceMapConsumer(util.emptyMap)); - var result = node.toStringWithSourceMap({ - file: 'min.js' - }); - var map = result.map; - var code = result.code; - - assert.equal(code, util.testGeneratedCode.replace(/\n/g, nl)); - assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); - map = map.toJSON(); - assert.equal(map.version, util.emptyMap.version); - assert.equal(map.file, util.emptyMap.file); - assert.equal(map.mappings.length, util.emptyMap.mappings.length); - assert.equal(map.mappings, util.emptyMap.mappings); - }); - - exports['test .fromStringWithSourceMap() complex version'] = forEachNewline(function (assert, util, nl) { - var input = new SourceNode(null, null, null, [ - "(function() {" + nl, - " var Test = {};" + nl, - " ", new SourceNode(1, 0, "a.js", "Test.A = { value: 1234 };" + nl), - " ", new SourceNode(2, 0, "a.js", "Test.A.x = 'xyz';"), nl, - "}());" + nl, - "/* Generated Source */"]); - input = input.toStringWithSourceMap({ - file: 'foo.js' - }); - - var node = SourceNode.fromStringWithSourceMap( - input.code, - new SourceMapConsumer(input.map.toString())); - - var result = node.toStringWithSourceMap({ - file: 'foo.js' - }); - var map = result.map; - var code = result.code; - - assert.equal(code, input.code); - assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); - map = map.toJSON(); - var inputMap = input.map.toJSON(); - util.assertEqualMaps(assert, map, inputMap); - }); - - exports['test .fromStringWithSourceMap() third argument'] = function (assert, util) { - // Assume the following directory structure: - // - // http://foo.org/ - // bar.coffee - // app/ - // coffee/ - // foo.coffee - // coffeeBundle.js # Made from {foo,bar,baz}.coffee - // maps/ - // coffeeBundle.js.map - // js/ - // foo.js - // public/ - // app.js # Made from {foo,coffeeBundle}.js - // app.js.map - // - // http://www.example.com/ - // baz.coffee - - var coffeeBundle = new SourceNode(1, 0, 'foo.coffee', 'foo(coffee);\n'); - coffeeBundle.setSourceContent('foo.coffee', 'foo coffee'); - coffeeBundle.add(new SourceNode(2, 0, '/bar.coffee', 'bar(coffee);\n')); - coffeeBundle.add(new SourceNode(3, 0, 'http://www.example.com/baz.coffee', 'baz(coffee);')); - coffeeBundle = coffeeBundle.toStringWithSourceMap({ - file: 'foo.js', - sourceRoot: '..' - }); - - var foo = new SourceNode(1, 0, 'foo.js', 'foo(js);'); - - var test = function(relativePath, expectedSources) { - var app = new SourceNode(); - app.add(SourceNode.fromStringWithSourceMap( - coffeeBundle.code, - new SourceMapConsumer(coffeeBundle.map.toString()), - relativePath)); - app.add(foo); - var i = 0; - app.walk(function (chunk, loc) { - assert.equal(loc.source, expectedSources[i]); - i++; - }); - app.walkSourceContents(function (sourceFile, sourceContent) { - assert.equal(sourceFile, expectedSources[0]); - assert.equal(sourceContent, 'foo coffee'); - }) - }; - - test('../coffee/maps', [ - '../coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee', - 'foo.js' - ]); - - // If the third parameter is omitted or set to the current working - // directory we get incorrect source paths: - - test(undefined, [ - '../foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee', - 'foo.js' - ]); - - test('', [ - '../foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee', - 'foo.js' - ]); - - test('.', [ - '../foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee', - 'foo.js' - ]); - - test('./', [ - '../foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee', - 'foo.js' - ]); - }; - - exports['test .toStringWithSourceMap() merging duplicate mappings'] = forEachNewline(function (assert, util, nl) { - var input = new SourceNode(null, null, null, [ - new SourceNode(1, 0, "a.js", "(function"), - new SourceNode(1, 0, "a.js", "() {" + nl), - " ", - new SourceNode(1, 0, "a.js", "var Test = "), - new SourceNode(1, 0, "b.js", "{};" + nl), - new SourceNode(2, 0, "b.js", "Test"), - new SourceNode(2, 0, "b.js", ".A", "A"), - new SourceNode(2, 20, "b.js", " = { value: ", "A"), - "1234", - new SourceNode(2, 40, "b.js", " };" + nl, "A"), - "}());" + nl, - "/* Generated Source */" - ]); - input = input.toStringWithSourceMap({ - file: 'foo.js' - }); - - assert.equal(input.code, [ - "(function() {", - " var Test = {};", - "Test.A = { value: 1234 };", - "}());", - "/* Generated Source */" - ].join(nl)) - - var correctMap = new SourceMapGenerator({ - file: 'foo.js' - }); - correctMap.addMapping({ - generated: { line: 1, column: 0 }, - source: 'a.js', - original: { line: 1, column: 0 } - }); - // Here is no need for a empty mapping, - // because mappings ends at eol - correctMap.addMapping({ - generated: { line: 2, column: 2 }, - source: 'a.js', - original: { line: 1, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 2, column: 13 }, - source: 'b.js', - original: { line: 1, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 3, column: 0 }, - source: 'b.js', - original: { line: 2, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 3, column: 4 }, - source: 'b.js', - name: 'A', - original: { line: 2, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 3, column: 6 }, - source: 'b.js', - name: 'A', - original: { line: 2, column: 20 } - }); - // This empty mapping is required, - // because there is a hole in the middle of the line - correctMap.addMapping({ - generated: { line: 3, column: 18 } - }); - correctMap.addMapping({ - generated: { line: 3, column: 22 }, - source: 'b.js', - name: 'A', - original: { line: 2, column: 40 } - }); - // Here is no need for a empty mapping, - // because mappings ends at eol - - var inputMap = input.map.toJSON(); - correctMap = correctMap.toJSON(); - util.assertEqualMaps(assert, inputMap, correctMap); - }); - - exports['test .toStringWithSourceMap() multi-line SourceNodes'] = forEachNewline(function (assert, util, nl) { - var input = new SourceNode(null, null, null, [ - new SourceNode(1, 0, "a.js", "(function() {" + nl + "var nextLine = 1;" + nl + "anotherLine();" + nl), - new SourceNode(2, 2, "b.js", "Test.call(this, 123);" + nl), - new SourceNode(2, 2, "b.js", "this['stuff'] = 'v';" + nl), - new SourceNode(2, 2, "b.js", "anotherLine();" + nl), - "/*" + nl + "Generated" + nl + "Source" + nl + "*/" + nl, - new SourceNode(3, 4, "c.js", "anotherLine();" + nl), - "/*" + nl + "Generated" + nl + "Source" + nl + "*/" - ]); - input = input.toStringWithSourceMap({ - file: 'foo.js' - }); - - assert.equal(input.code, [ - "(function() {", - "var nextLine = 1;", - "anotherLine();", - "Test.call(this, 123);", - "this['stuff'] = 'v';", - "anotherLine();", - "/*", - "Generated", - "Source", - "*/", - "anotherLine();", - "/*", - "Generated", - "Source", - "*/" - ].join(nl)); - - var correctMap = new SourceMapGenerator({ - file: 'foo.js' - }); - correctMap.addMapping({ - generated: { line: 1, column: 0 }, - source: 'a.js', - original: { line: 1, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 2, column: 0 }, - source: 'a.js', - original: { line: 1, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 3, column: 0 }, - source: 'a.js', - original: { line: 1, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 4, column: 0 }, - source: 'b.js', - original: { line: 2, column: 2 } - }); - correctMap.addMapping({ - generated: { line: 5, column: 0 }, - source: 'b.js', - original: { line: 2, column: 2 } - }); - correctMap.addMapping({ - generated: { line: 6, column: 0 }, - source: 'b.js', - original: { line: 2, column: 2 } - }); - correctMap.addMapping({ - generated: { line: 11, column: 0 }, - source: 'c.js', - original: { line: 3, column: 4 } - }); - - var inputMap = input.map.toJSON(); - correctMap = correctMap.toJSON(); - util.assertEqualMaps(assert, inputMap, correctMap); - }); - - exports['test .toStringWithSourceMap() with empty string'] = function (assert, util) { - var node = new SourceNode(1, 0, 'empty.js', ''); - var result = node.toStringWithSourceMap(); - assert.equal(result.code, ''); - }; - - exports['test .toStringWithSourceMap() with consecutive newlines'] = forEachNewline(function (assert, util, nl) { - var input = new SourceNode(null, null, null, [ - "/***/" + nl + nl, - new SourceNode(1, 0, "a.js", "'use strict';" + nl), - new SourceNode(2, 0, "a.js", "a();"), - ]); - input = input.toStringWithSourceMap({ - file: 'foo.js' - }); - - assert.equal(input.code, [ - "/***/", - "", - "'use strict';", - "a();", - ].join(nl)); - - var correctMap = new SourceMapGenerator({ - file: 'foo.js' - }); - correctMap.addMapping({ - generated: { line: 3, column: 0 }, - source: 'a.js', - original: { line: 1, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 4, column: 0 }, - source: 'a.js', - original: { line: 2, column: 0 } - }); - - var inputMap = input.map.toJSON(); - correctMap = correctMap.toJSON(); - util.assertEqualMaps(assert, inputMap, correctMap); - }); - - exports['test setSourceContent with toStringWithSourceMap'] = function (assert, util) { - var aNode = new SourceNode(1, 1, 'a.js', 'a'); - aNode.setSourceContent('a.js', 'someContent'); - var node = new SourceNode(null, null, null, - ['(function () {\n', - ' ', aNode, - ' ', new SourceNode(1, 1, 'b.js', 'b'), - '}());']); - node.setSourceContent('b.js', 'otherContent'); - var map = node.toStringWithSourceMap({ - file: 'foo.js' - }).map; - - assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); - map = new SourceMapConsumer(map.toString()); - - assert.equal(map.sources.length, 2); - assert.equal(map.sources[0], 'a.js'); - assert.equal(map.sources[1], 'b.js'); - assert.equal(map.sourcesContent.length, 2); - assert.equal(map.sourcesContent[0], 'someContent'); - assert.equal(map.sourcesContent[1], 'otherContent'); - }; - - exports['test walkSourceContents'] = function (assert, util) { - var aNode = new SourceNode(1, 1, 'a.js', 'a'); - aNode.setSourceContent('a.js', 'someContent'); - var node = new SourceNode(null, null, null, - ['(function () {\n', - ' ', aNode, - ' ', new SourceNode(1, 1, 'b.js', 'b'), - '}());']); - node.setSourceContent('b.js', 'otherContent'); - var results = []; - node.walkSourceContents(function (sourceFile, sourceContent) { - results.push([sourceFile, sourceContent]); - }); - assert.equal(results.length, 2); - assert.equal(results[0][0], 'a.js'); - assert.equal(results[0][1], 'someContent'); - assert.equal(results[1][0], 'b.js'); - assert.equal(results[1][1], 'otherContent'); - }; -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-util.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-util.js deleted file mode 100644 index 997d1a2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-util.js +++ /dev/null @@ -1,216 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2014 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var libUtil = require('../../lib/source-map/util'); - - exports['test urls'] = function (assert, util) { - var assertUrl = function (url) { - assert.equal(url, libUtil.urlGenerate(libUtil.urlParse(url))); - }; - assertUrl('http://'); - assertUrl('http://www.example.com'); - assertUrl('http://user:pass@www.example.com'); - assertUrl('http://www.example.com:80'); - assertUrl('http://www.example.com/'); - assertUrl('http://www.example.com/foo/bar'); - assertUrl('http://www.example.com/foo/bar/'); - assertUrl('http://user:pass@www.example.com:80/foo/bar/'); - - assertUrl('//'); - assertUrl('//www.example.com'); - assertUrl('file:///www.example.com'); - - assert.equal(libUtil.urlParse(''), null); - assert.equal(libUtil.urlParse('.'), null); - assert.equal(libUtil.urlParse('..'), null); - assert.equal(libUtil.urlParse('a'), null); - assert.equal(libUtil.urlParse('a/b'), null); - assert.equal(libUtil.urlParse('a//b'), null); - assert.equal(libUtil.urlParse('/a'), null); - assert.equal(libUtil.urlParse('data:foo,bar'), null); - }; - - exports['test normalize()'] = function (assert, util) { - assert.equal(libUtil.normalize('/..'), '/'); - assert.equal(libUtil.normalize('/../'), '/'); - assert.equal(libUtil.normalize('/../../../..'), '/'); - assert.equal(libUtil.normalize('/../../../../a/b/c'), '/a/b/c'); - assert.equal(libUtil.normalize('/a/b/c/../../../d/../../e'), '/e'); - - assert.equal(libUtil.normalize('..'), '..'); - assert.equal(libUtil.normalize('../'), '../'); - assert.equal(libUtil.normalize('../../a/'), '../../a/'); - assert.equal(libUtil.normalize('a/..'), '.'); - assert.equal(libUtil.normalize('a/../../..'), '../..'); - - assert.equal(libUtil.normalize('/.'), '/'); - assert.equal(libUtil.normalize('/./'), '/'); - assert.equal(libUtil.normalize('/./././.'), '/'); - assert.equal(libUtil.normalize('/././././a/b/c'), '/a/b/c'); - assert.equal(libUtil.normalize('/a/b/c/./././d/././e'), '/a/b/c/d/e'); - - assert.equal(libUtil.normalize(''), '.'); - assert.equal(libUtil.normalize('.'), '.'); - assert.equal(libUtil.normalize('./'), '.'); - assert.equal(libUtil.normalize('././a'), 'a'); - assert.equal(libUtil.normalize('a/./'), 'a/'); - assert.equal(libUtil.normalize('a/././.'), 'a'); - - assert.equal(libUtil.normalize('/a/b//c////d/////'), '/a/b/c/d/'); - assert.equal(libUtil.normalize('///a/b//c////d/////'), '///a/b/c/d/'); - assert.equal(libUtil.normalize('a/b//c////d'), 'a/b/c/d'); - - assert.equal(libUtil.normalize('.///.././../a/b//./..'), '../../a') - - assert.equal(libUtil.normalize('http://www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.normalize('http://www.example.com/'), 'http://www.example.com/'); - assert.equal(libUtil.normalize('http://www.example.com/./..//a/b/c/.././d//'), 'http://www.example.com/a/b/d/'); - }; - - exports['test join()'] = function (assert, util) { - assert.equal(libUtil.join('a', 'b'), 'a/b'); - assert.equal(libUtil.join('a/', 'b'), 'a/b'); - assert.equal(libUtil.join('a//', 'b'), 'a/b'); - assert.equal(libUtil.join('a', 'b/'), 'a/b/'); - assert.equal(libUtil.join('a', 'b//'), 'a/b/'); - assert.equal(libUtil.join('a/', '/b'), '/b'); - assert.equal(libUtil.join('a//', '//b'), '//b'); - - assert.equal(libUtil.join('a', '..'), '.'); - assert.equal(libUtil.join('a', '../b'), 'b'); - assert.equal(libUtil.join('a/b', '../c'), 'a/c'); - - assert.equal(libUtil.join('a', '.'), 'a'); - assert.equal(libUtil.join('a', './b'), 'a/b'); - assert.equal(libUtil.join('a/b', './c'), 'a/b/c'); - - assert.equal(libUtil.join('a', 'http://www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.join('a', 'data:foo,bar'), 'data:foo,bar'); - - - assert.equal(libUtil.join('', 'b'), 'b'); - assert.equal(libUtil.join('.', 'b'), 'b'); - assert.equal(libUtil.join('', 'b/'), 'b/'); - assert.equal(libUtil.join('.', 'b/'), 'b/'); - assert.equal(libUtil.join('', 'b//'), 'b/'); - assert.equal(libUtil.join('.', 'b//'), 'b/'); - - assert.equal(libUtil.join('', '..'), '..'); - assert.equal(libUtil.join('.', '..'), '..'); - assert.equal(libUtil.join('', '../b'), '../b'); - assert.equal(libUtil.join('.', '../b'), '../b'); - - assert.equal(libUtil.join('', '.'), '.'); - assert.equal(libUtil.join('.', '.'), '.'); - assert.equal(libUtil.join('', './b'), 'b'); - assert.equal(libUtil.join('.', './b'), 'b'); - - assert.equal(libUtil.join('', 'http://www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.join('.', 'http://www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.join('', 'data:foo,bar'), 'data:foo,bar'); - assert.equal(libUtil.join('.', 'data:foo,bar'), 'data:foo,bar'); - - - assert.equal(libUtil.join('..', 'b'), '../b'); - assert.equal(libUtil.join('..', 'b/'), '../b/'); - assert.equal(libUtil.join('..', 'b//'), '../b/'); - - assert.equal(libUtil.join('..', '..'), '../..'); - assert.equal(libUtil.join('..', '../b'), '../../b'); - - assert.equal(libUtil.join('..', '.'), '..'); - assert.equal(libUtil.join('..', './b'), '../b'); - - assert.equal(libUtil.join('..', 'http://www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.join('..', 'data:foo,bar'), 'data:foo,bar'); - - - assert.equal(libUtil.join('a', ''), 'a'); - assert.equal(libUtil.join('a', '.'), 'a'); - assert.equal(libUtil.join('a/', ''), 'a'); - assert.equal(libUtil.join('a/', '.'), 'a'); - assert.equal(libUtil.join('a//', ''), 'a'); - assert.equal(libUtil.join('a//', '.'), 'a'); - assert.equal(libUtil.join('/a', ''), '/a'); - assert.equal(libUtil.join('/a', '.'), '/a'); - assert.equal(libUtil.join('', ''), '.'); - assert.equal(libUtil.join('.', ''), '.'); - assert.equal(libUtil.join('.', ''), '.'); - assert.equal(libUtil.join('.', '.'), '.'); - assert.equal(libUtil.join('..', ''), '..'); - assert.equal(libUtil.join('..', '.'), '..'); - assert.equal(libUtil.join('http://foo.org/a', ''), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/a', '.'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/a/', ''), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/a/', '.'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/a//', ''), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/a//', '.'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org', ''), 'http://foo.org/'); - assert.equal(libUtil.join('http://foo.org', '.'), 'http://foo.org/'); - assert.equal(libUtil.join('http://foo.org/', ''), 'http://foo.org/'); - assert.equal(libUtil.join('http://foo.org/', '.'), 'http://foo.org/'); - assert.equal(libUtil.join('http://foo.org//', ''), 'http://foo.org/'); - assert.equal(libUtil.join('http://foo.org//', '.'), 'http://foo.org/'); - assert.equal(libUtil.join('//www.example.com', ''), '//www.example.com/'); - assert.equal(libUtil.join('//www.example.com', '.'), '//www.example.com/'); - - - assert.equal(libUtil.join('http://foo.org/a', 'b'), 'http://foo.org/a/b'); - assert.equal(libUtil.join('http://foo.org/a/', 'b'), 'http://foo.org/a/b'); - assert.equal(libUtil.join('http://foo.org/a//', 'b'), 'http://foo.org/a/b'); - assert.equal(libUtil.join('http://foo.org/a', 'b/'), 'http://foo.org/a/b/'); - assert.equal(libUtil.join('http://foo.org/a', 'b//'), 'http://foo.org/a/b/'); - assert.equal(libUtil.join('http://foo.org/a/', '/b'), 'http://foo.org/b'); - assert.equal(libUtil.join('http://foo.org/a//', '//b'), 'http://b'); - - assert.equal(libUtil.join('http://foo.org/a', '..'), 'http://foo.org/'); - assert.equal(libUtil.join('http://foo.org/a', '../b'), 'http://foo.org/b'); - assert.equal(libUtil.join('http://foo.org/a/b', '../c'), 'http://foo.org/a/c'); - - assert.equal(libUtil.join('http://foo.org/a', '.'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/a', './b'), 'http://foo.org/a/b'); - assert.equal(libUtil.join('http://foo.org/a/b', './c'), 'http://foo.org/a/b/c'); - - assert.equal(libUtil.join('http://foo.org/a', 'http://www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.join('http://foo.org/a', 'data:foo,bar'), 'data:foo,bar'); - - - assert.equal(libUtil.join('http://foo.org', 'a'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/', 'a'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org//', 'a'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org', '/a'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/', '/a'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org//', '/a'), 'http://foo.org/a'); - - - assert.equal(libUtil.join('http://', 'www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.join('file:///', 'www.example.com'), 'file:///www.example.com'); - assert.equal(libUtil.join('http://', 'ftp://example.com'), 'ftp://example.com'); - - assert.equal(libUtil.join('http://www.example.com', '//foo.org/bar'), 'http://foo.org/bar'); - assert.equal(libUtil.join('//www.example.com', '//foo.org/bar'), '//foo.org/bar'); - }; - - // TODO Issue #128: Define and test this function properly. - exports['test relative()'] = function (assert, util) { - assert.equal(libUtil.relative('/the/root', '/the/root/one.js'), 'one.js'); - assert.equal(libUtil.relative('/the/root', '/the/rootone.js'), '/the/rootone.js'); - - assert.equal(libUtil.relative('', '/the/root/one.js'), '/the/root/one.js'); - assert.equal(libUtil.relative('.', '/the/root/one.js'), '/the/root/one.js'); - assert.equal(libUtil.relative('', 'the/root/one.js'), 'the/root/one.js'); - assert.equal(libUtil.relative('.', 'the/root/one.js'), 'the/root/one.js'); - - assert.equal(libUtil.relative('/', '/the/root/one.js'), 'the/root/one.js'); - assert.equal(libUtil.relative('/', 'the/root/one.js'), 'the/root/one.js'); - }; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/util.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/util.js deleted file mode 100644 index 56bbe2c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/util.js +++ /dev/null @@ -1,192 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var util = require('../../lib/source-map/util'); - - // This is a test mapping which maps functions from two different files - // (one.js and two.js) to a minified generated source. - // - // Here is one.js: - // - // ONE.foo = function (bar) { - // return baz(bar); - // }; - // - // Here is two.js: - // - // TWO.inc = function (n) { - // return n + 1; - // }; - // - // And here is the generated code (min.js): - // - // ONE.foo=function(a){return baz(a);}; - // TWO.inc=function(a){return a+1;}; - exports.testGeneratedCode = " ONE.foo=function(a){return baz(a);};\n"+ - " TWO.inc=function(a){return a+1;};"; - exports.testMap = { - version: 3, - file: 'min.js', - names: ['bar', 'baz', 'n'], - sources: ['one.js', 'two.js'], - sourceRoot: '/the/root', - mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' - }; - exports.testMapNoSourceRoot = { - version: 3, - file: 'min.js', - names: ['bar', 'baz', 'n'], - sources: ['one.js', 'two.js'], - mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' - }; - exports.testMapEmptySourceRoot = { - version: 3, - file: 'min.js', - names: ['bar', 'baz', 'n'], - sources: ['one.js', 'two.js'], - sourceRoot: '', - mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' - }; - exports.testMapWithSourcesContent = { - version: 3, - file: 'min.js', - names: ['bar', 'baz', 'n'], - sources: ['one.js', 'two.js'], - sourcesContent: [ - ' ONE.foo = function (bar) {\n' + - ' return baz(bar);\n' + - ' };', - ' TWO.inc = function (n) {\n' + - ' return n + 1;\n' + - ' };' - ], - sourceRoot: '/the/root', - mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' - }; - exports.testMapRelativeSources = { - version: 3, - file: 'min.js', - names: ['bar', 'baz', 'n'], - sources: ['./one.js', './two.js'], - sourcesContent: [ - ' ONE.foo = function (bar) {\n' + - ' return baz(bar);\n' + - ' };', - ' TWO.inc = function (n) {\n' + - ' return n + 1;\n' + - ' };' - ], - sourceRoot: '/the/root', - mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' - }; - exports.emptyMap = { - version: 3, - file: 'min.js', - names: [], - sources: [], - mappings: '' - }; - - - function assertMapping(generatedLine, generatedColumn, originalSource, - originalLine, originalColumn, name, map, assert, - dontTestGenerated, dontTestOriginal) { - if (!dontTestOriginal) { - var origMapping = map.originalPositionFor({ - line: generatedLine, - column: generatedColumn - }); - assert.equal(origMapping.name, name, - 'Incorrect name, expected ' + JSON.stringify(name) - + ', got ' + JSON.stringify(origMapping.name)); - assert.equal(origMapping.line, originalLine, - 'Incorrect line, expected ' + JSON.stringify(originalLine) - + ', got ' + JSON.stringify(origMapping.line)); - assert.equal(origMapping.column, originalColumn, - 'Incorrect column, expected ' + JSON.stringify(originalColumn) - + ', got ' + JSON.stringify(origMapping.column)); - - var expectedSource; - - if (originalSource && map.sourceRoot && originalSource.indexOf(map.sourceRoot) === 0) { - expectedSource = originalSource; - } else if (originalSource) { - expectedSource = map.sourceRoot - ? util.join(map.sourceRoot, originalSource) - : originalSource; - } else { - expectedSource = null; - } - - assert.equal(origMapping.source, expectedSource, - 'Incorrect source, expected ' + JSON.stringify(expectedSource) - + ', got ' + JSON.stringify(origMapping.source)); - } - - if (!dontTestGenerated) { - var genMapping = map.generatedPositionFor({ - source: originalSource, - line: originalLine, - column: originalColumn - }); - assert.equal(genMapping.line, generatedLine, - 'Incorrect line, expected ' + JSON.stringify(generatedLine) - + ', got ' + JSON.stringify(genMapping.line)); - assert.equal(genMapping.column, generatedColumn, - 'Incorrect column, expected ' + JSON.stringify(generatedColumn) - + ', got ' + JSON.stringify(genMapping.column)); - } - } - exports.assertMapping = assertMapping; - - function assertEqualMaps(assert, actualMap, expectedMap) { - assert.equal(actualMap.version, expectedMap.version, "version mismatch"); - assert.equal(actualMap.file, expectedMap.file, "file mismatch"); - assert.equal(actualMap.names.length, - expectedMap.names.length, - "names length mismatch: " + - actualMap.names.join(", ") + " != " + expectedMap.names.join(", ")); - for (var i = 0; i < actualMap.names.length; i++) { - assert.equal(actualMap.names[i], - expectedMap.names[i], - "names[" + i + "] mismatch: " + - actualMap.names.join(", ") + " != " + expectedMap.names.join(", ")); - } - assert.equal(actualMap.sources.length, - expectedMap.sources.length, - "sources length mismatch: " + - actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", ")); - for (var i = 0; i < actualMap.sources.length; i++) { - assert.equal(actualMap.sources[i], - expectedMap.sources[i], - "sources[" + i + "] length mismatch: " + - actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", ")); - } - assert.equal(actualMap.sourceRoot, - expectedMap.sourceRoot, - "sourceRoot mismatch: " + - actualMap.sourceRoot + " != " + expectedMap.sourceRoot); - assert.equal(actualMap.mappings, expectedMap.mappings, - "mappings mismatch:\nActual: " + actualMap.mappings + "\nExpected: " + expectedMap.mappings); - if (actualMap.sourcesContent) { - assert.equal(actualMap.sourcesContent.length, - expectedMap.sourcesContent.length, - "sourcesContent length mismatch"); - for (var i = 0; i < actualMap.sourcesContent.length; i++) { - assert.equal(actualMap.sourcesContent[i], - expectedMap.sourcesContent[i], - "sourcesContent[" + i + "] mismatch"); - } - } - } - exports.assertEqualMaps = assertEqualMaps; - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.npmignore deleted file mode 100644 index 94fceeb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -tmp/ -node_modules/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.travis.yml deleted file mode 100644 index d959127..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: node_js -node_js: - - "0.4" - - "0.6" - - "0.8" - - "0.10" - - "0.11" diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/LICENSE deleted file mode 100644 index dd7706f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -UglifyJS is released under the BSD license: - -Copyright 2012-2013 (c) Mihai Bazon - -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. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/README.md deleted file mode 100644 index 749b8ce..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/README.md +++ /dev/null @@ -1,588 +0,0 @@ -UglifyJS 2 -========== -[![Build Status](https://travis-ci.org/mishoo/UglifyJS2.png)](https://travis-ci.org/mishoo/UglifyJS2) - -UglifyJS is a JavaScript parser, minifier, compressor or beautifier toolkit. - -This page documents the command line utility. For -[API and internals documentation see my website](http://lisperator.net/uglifyjs/). -There's also an -[in-browser online demo](http://lisperator.net/uglifyjs/#demo) (for Firefox, -Chrome and probably Safari). - -Install -------- - -First make sure you have installed the latest version of [node.js](http://nodejs.org/) -(You may need to restart your computer after this step). - -From NPM for use as a command line app: - - npm install uglify-js -g - -From NPM for programmatic use: - - npm install uglify-js - -From Git: - - git clone git://github.com/mishoo/UglifyJS2.git - cd UglifyJS2 - npm link . - -Usage ------ - - uglifyjs [input files] [options] - -UglifyJS2 can take multiple input files. It's recommended that you pass the -input files first, then pass the options. UglifyJS will parse input files -in sequence and apply any compression options. The files are parsed in the -same global scope, that is, a reference from a file to some -variable/function declared in another file will be matched properly. - -If you want to read from STDIN instead, pass a single dash instead of input -files. - -The available options are: - - --source-map Specify an output file where to generate source map. - [string] - --source-map-root The path to the original source to be included in the - source map. [string] - --source-map-url The path to the source map to be added in //@ - sourceMappingURL. Defaults to the value passed with - --source-map. [string] - --in-source-map Input source map, useful if you're compressing JS that was - generated from some other original code. - --screw-ie8 Pass this flag if you don't care about full compliance with - Internet Explorer 6-8 quirks (by default UglifyJS will try - to be IE-proof). - -p, --prefix Skip prefix for original filenames that appear in source - maps. For example -p 3 will drop 3 directories from file - names and ensure they are relative paths. - -o, --output Output file (default STDOUT). - -b, --beautify Beautify output/specify output options. [string] - -m, --mangle Mangle names/pass mangler options. [string] - -r, --reserved Reserved names to exclude from mangling. - -c, --compress Enable compressor/pass compressor options. Pass options - like -c hoist_vars=false,if_return=false. Use -c with no - argument to use the default compression options. [string] - -d, --define Global definitions [string] - --comments Preserve copyright comments in the output. By default this - works like Google Closure, keeping JSDoc-style comments - that contain "@license" or "@preserve". You can optionally - pass one of the following arguments to this flag: - - "all" to keep all comments - - a valid JS regexp (needs to start with a slash) to keep - only comments that match. - Note that currently not *all* comments can be kept when - compression is on, because of dead code removal or - cascading statements into sequences. [string] - --stats Display operations run time on STDERR. [boolean] - --acorn Use Acorn for parsing. [boolean] - --spidermonkey Assume input files are SpiderMonkey AST format (as JSON). - [boolean] - --self Build itself (UglifyJS2) as a library (implies - --wrap=UglifyJS --export-all) [boolean] - --wrap Embed everything in a big function, making the “exports” - and “global” variables available. You need to pass an - argument to this option to specify the name that your - module will take when included in, say, a browser. - [string] - --export-all Only used when --wrap, this tells UglifyJS to add code to - automatically export all globals. [boolean] - --lint Display some scope warnings [boolean] - -v, --verbose Verbose [boolean] - -V, --version Print version number and exit. [boolean] - -Specify `--output` (`-o`) to declare the output file. Otherwise the output -goes to STDOUT. - -## Source map options - -UglifyJS2 can generate a source map file, which is highly useful for -debugging your compressed JavaScript. To get a source map, pass -`--source-map output.js.map` (full path to the file where you want the -source map dumped). - -Additionally you might need `--source-map-root` to pass the URL where the -original files can be found. In case you are passing full paths to input -files to UglifyJS, you can use `--prefix` (`-p`) to specify the number of -directories to drop from the path prefix when declaring files in the source -map. - -For example: - - uglifyjs /home/doe/work/foo/src/js/file1.js \ - /home/doe/work/foo/src/js/file2.js \ - -o foo.min.js \ - --source-map foo.min.js.map \ - --source-map-root http://foo.com/src \ - -p 5 -c -m - -The above will compress and mangle `file1.js` and `file2.js`, will drop the -output in `foo.min.js` and the source map in `foo.min.js.map`. The source -mapping will refer to `http://foo.com/src/js/file1.js` and -`http://foo.com/src/js/file2.js` (in fact it will list `http://foo.com/src` -as the source map root, and the original files as `js/file1.js` and -`js/file2.js`). - -### Composed source map - -When you're compressing JS code that was output by a compiler such as -CoffeeScript, mapping to the JS code won't be too helpful. Instead, you'd -like to map back to the original code (i.e. CoffeeScript). UglifyJS has an -option to take an input source map. Assuming you have a mapping from -CoffeeScript → compiled JS, UglifyJS can generate a map from CoffeeScript → -compressed JS by mapping every token in the compiled JS to its original -location. - -To use this feature you need to pass `--in-source-map -/path/to/input/source.map`. Normally the input source map should also point -to the file containing the generated JS, so if that's correct you can omit -input files from the command line. - -## Mangler options - -To enable the mangler you need to pass `--mangle` (`-m`). The following -(comma-separated) options are supported: - -- `sort` — to assign shorter names to most frequently used variables. This - saves a few hundred bytes on jQuery before gzip, but the output is - _bigger_ after gzip (and seems to happen for other libraries I tried it - on) therefore it's not enabled by default. - -- `toplevel` — mangle names declared in the toplevel scope (disabled by - default). - -- `eval` — mangle names visible in scopes where `eval` or `when` are used - (disabled by default). - -When mangling is enabled but you want to prevent certain names from being -mangled, you can declare those names with `--reserved` (`-r`) — pass a -comma-separated list of names. For example: - - uglifyjs ... -m -r '$,require,exports' - -to prevent the `require`, `exports` and `$` names from being changed. - -## Compressor options - -You need to pass `--compress` (`-c`) to enable the compressor. Optionally -you can pass a comma-separated list of options. Options are in the form -`foo=bar`, or just `foo` (the latter implies a boolean option that you want -to set `true`; it's effectively a shortcut for `foo=true`). - -- `sequences` -- join consecutive simple statements using the comma operator -- `properties` -- rewrite property access using the dot notation, for - example `foo["bar"] → foo.bar` -- `dead_code` -- remove unreachable code -- `drop_debugger` -- remove `debugger;` statements -- `unsafe` (default: false) -- apply "unsafe" transformations (discussion below) -- `conditionals` -- apply optimizations for `if`-s and conditional - expressions -- `comparisons` -- apply certain optimizations to binary nodes, for example: - `!(a <= b) → a > b` (only when `unsafe`), attempts to negate binary nodes, - e.g. `a = !b && !c && !d && !e → a=!(b||c||d||e)` etc. -- `evaluate` -- attempt to evaluate constant expressions -- `booleans` -- various optimizations for boolean context, for example `!!a - ? b : c → a ? b : c` -- `loops` -- optimizations for `do`, `while` and `for` loops when we can - statically determine the condition -- `unused` -- drop unreferenced functions and variables -- `hoist_funs` -- hoist function declarations -- `hoist_vars` (default: false) -- hoist `var` declarations (this is `false` - by default because it seems to increase the size of the output in general) -- `if_return` -- optimizations for if/return and if/continue -- `join_vars` -- join consecutive `var` statements -- `cascade` -- small optimization for sequences, transform `x, x` into `x` - and `x = something(), x` into `x = something()` -- `warnings` -- display warnings when dropping unreachable code or unused - declarations etc. - -### The `unsafe` option - -It enables some transformations that *might* break code logic in certain -contrived cases, but should be fine for most code. You might want to try it -on your own code, it should reduce the minified size. Here's what happens -when this flag is on: - -- `new Array(1, 2, 3)` or `Array(1, 2, 3)` → `[1, 2, 3 ]` -- `new Object()` → `{}` -- `String(exp)` or `exp.toString()` → `"" + exp` -- `new Object/RegExp/Function/Error/Array (...)` → we discard the `new` -- `typeof foo == "undefined"` → `foo === void 0` -- `void 0` → `"undefined"` (if there is a variable named "undefined" in - scope; we do it because the variable name will be mangled, typically - reduced to a single character). - -### Conditional compilation - -You can use the `--define` (`-d`) switch in order to declare global -variables that UglifyJS will assume to be constants (unless defined in -scope). For example if you pass `--define DEBUG=false` then, coupled with -dead code removal UglifyJS will discard the following from the output: -```javascript -if (DEBUG) { - console.log("debug stuff"); -} -``` - -UglifyJS will warn about the condition being always false and about dropping -unreachable code; for now there is no option to turn off only this specific -warning, you can pass `warnings=false` to turn off *all* warnings. - -Another way of doing that is to declare your globals as constants in a -separate file and include it into the build. For example you can have a -`build/defines.js` file with the following: -```javascript -const DEBUG = false; -const PRODUCTION = true; -// etc. -``` - -and build your code like this: - - uglifyjs build/defines.js js/foo.js js/bar.js... -c - -UglifyJS will notice the constants and, since they cannot be altered, it -will evaluate references to them to the value itself and drop unreachable -code as usual. The possible downside of this approach is that the build -will contain the `const` declarations. - - -## Beautifier options - -The code generator tries to output shortest code possible by default. In -case you want beautified output, pass `--beautify` (`-b`). Optionally you -can pass additional arguments that control the code output: - -- `beautify` (default `true`) -- whether to actually beautify the output. - Passing `-b` will set this to true, but you might need to pass `-b` even - when you want to generate minified code, in order to specify additional - arguments, so you can use `-b beautify=false` to override it. -- `indent-level` (default 4) -- `indent-start` (default 0) -- prefix all lines by that many spaces -- `quote-keys` (default `false`) -- pass `true` to quote all keys in literal - objects -- `space-colon` (default `true`) -- insert a space after the colon signs -- `ascii-only` (default `false`) -- escape Unicode characters in strings and - regexps -- `inline-script` (default `false`) -- escape the slash in occurrences of - ` 0) { - sys.error("WARN: Ignoring input files since --self was passed"); - } - files = UglifyJS.FILES; - if (!ARGS.wrap) ARGS.wrap = "UglifyJS"; - ARGS.export_all = true; -} - -var ORIG_MAP = ARGS.in_source_map; - -if (ORIG_MAP) { - ORIG_MAP = JSON.parse(fs.readFileSync(ORIG_MAP)); - if (files.length == 0) { - sys.error("INFO: Using file from the input source map: " + ORIG_MAP.file); - files = [ ORIG_MAP.file ]; - } - if (ARGS.source_map_root == null) { - ARGS.source_map_root = ORIG_MAP.sourceRoot; - } -} - -if (files.length == 0) { - files = [ "-" ]; -} - -if (files.indexOf("-") >= 0 && ARGS.source_map) { - sys.error("ERROR: Source map doesn't work with input from STDIN"); - process.exit(1); -} - -if (files.filter(function(el){ return el == "-" }).length > 1) { - sys.error("ERROR: Can read a single file from STDIN (two or more dashes specified)"); - process.exit(1); -} - -var STATS = {}; -var OUTPUT_FILE = ARGS.o; -var TOPLEVEL = null; - -var SOURCE_MAP = ARGS.source_map ? UglifyJS.SourceMap({ - file: OUTPUT_FILE, - root: ARGS.source_map_root, - orig: ORIG_MAP, -}) : null; - -OUTPUT_OPTIONS.source_map = SOURCE_MAP; - -try { - var output = UglifyJS.OutputStream(OUTPUT_OPTIONS); - var compressor = COMPRESS && UglifyJS.Compressor(COMPRESS); -} catch(ex) { - if (ex instanceof UglifyJS.DefaultsError) { - sys.error(ex.msg); - sys.error("Supported options:"); - sys.error(sys.inspect(ex.defs)); - process.exit(1); - } -} - -async.eachLimit(files, 1, function (file, cb) { - read_whole_file(file, function (err, code) { - if (err) { - sys.error("ERROR: can't read file: " + filename); - process.exit(1); - } - if (ARGS.p != null) { - file = file.replace(/^\/+/, "").split(/\/+/).slice(ARGS.p).join("/"); - } - time_it("parse", function(){ - if (ARGS.spidermonkey) { - var program = JSON.parse(code); - if (!TOPLEVEL) TOPLEVEL = program; - else TOPLEVEL.body = TOPLEVEL.body.concat(program.body); - } - else if (ARGS.acorn) { - TOPLEVEL = acorn.parse(code, { - locations : true, - trackComments : true, - sourceFile : file, - program : TOPLEVEL - }); - } - else { - TOPLEVEL = UglifyJS.parse(code, { - filename : file, - toplevel : TOPLEVEL, - expression : ARGS.expr, - }); - }; - }); - cb(); - }); -}, function () { - if (ARGS.acorn || ARGS.spidermonkey) time_it("convert_ast", function(){ - TOPLEVEL = UglifyJS.AST_Node.from_mozilla_ast(TOPLEVEL); - }); - - if (ARGS.wrap) { - TOPLEVEL = TOPLEVEL.wrap_commonjs(ARGS.wrap, ARGS.export_all); - } - - if (ARGS.enclose) { - var arg_parameter_list = ARGS.enclose; - - if (!(arg_parameter_list instanceof Array)) { - arg_parameter_list = [arg_parameter_list]; - } - - TOPLEVEL = TOPLEVEL.wrap_enclose(arg_parameter_list); - } - - var SCOPE_IS_NEEDED = COMPRESS || MANGLE || ARGS.lint; - - if (SCOPE_IS_NEEDED) { - time_it("scope", function(){ - TOPLEVEL.figure_out_scope({ screw_ie8: ARGS.screw_ie8 }); - if (ARGS.lint) { - TOPLEVEL.scope_warnings(); - } - }); - } - - if (COMPRESS) { - time_it("squeeze", function(){ - TOPLEVEL = TOPLEVEL.transform(compressor); - }); - } - - if (SCOPE_IS_NEEDED) { - time_it("scope", function(){ - TOPLEVEL.figure_out_scope({ screw_ie8: ARGS.screw_ie8 }); - if (MANGLE) { - TOPLEVEL.compute_char_frequency(MANGLE); - } - }); - } - - if (MANGLE) time_it("mangle", function(){ - TOPLEVEL.mangle_names(MANGLE); - }); - time_it("generate", function(){ - TOPLEVEL.print(output); - }); - - output = output.get(); - - if (SOURCE_MAP) { - fs.writeFileSync(ARGS.source_map, SOURCE_MAP, "utf8"); - output += "\n//# sourceMappingURL=" + (ARGS.source_map_url || ARGS.source_map); - } - - if (OUTPUT_FILE) { - fs.writeFileSync(OUTPUT_FILE, output, "utf8"); - } else { - sys.print(output); - sys.error("\n"); - } - - if (ARGS.stats) { - sys.error(UglifyJS.string_template("Timing information (compressed {count} files):", { - count: files.length - })); - for (var i in STATS) if (STATS.hasOwnProperty(i)) { - sys.error(UglifyJS.string_template("- {name}: {time}s", { - name: i, - time: (STATS[i] / 1000).toFixed(3) - })); - } - } -}); - -/* -----[ functions ]----- */ - -function normalize(o) { - for (var i in o) if (o.hasOwnProperty(i) && /-/.test(i)) { - o[i.replace(/-/g, "_")] = o[i]; - delete o[i]; - } -} - -function getOptions(x, constants) { - x = ARGS[x]; - if (!x) return null; - var ret = {}; - if (x !== true) { - var ast; - try { - ast = UglifyJS.parse(x); - } catch(ex) { - if (ex instanceof UglifyJS.JS_Parse_Error) { - sys.error("Error parsing arguments in: " + x); - process.exit(1); - } - } - ast.walk(new UglifyJS.TreeWalker(function(node){ - if (node instanceof UglifyJS.AST_Toplevel) return; // descend - if (node instanceof UglifyJS.AST_SimpleStatement) return; // descend - if (node instanceof UglifyJS.AST_Seq) return; // descend - if (node instanceof UglifyJS.AST_Assign) { - var name = node.left.print_to_string({ beautify: false }).replace(/-/g, "_"); - var value = node.right; - if (constants) - value = new Function("return (" + value.print_to_string() + ")")(); - ret[name] = value; - return true; // no descend - } - sys.error(node.TYPE) - sys.error("Error parsing arguments in: " + x); - process.exit(1); - })); - } - return ret; -} - -function read_whole_file(filename, cb) { - if (filename == "-") { - var chunks = []; - process.stdin.setEncoding('utf-8'); - process.stdin.on('data', function (chunk) { - chunks.push(chunk); - }).on('end', function () { - cb(null, chunks.join("")); - }); - process.openStdin(); - } else { - fs.readFile(filename, "utf-8", cb); - } -} - -function time_it(name, cont) { - var t1 = new Date().getTime(); - var ret = cont(); - if (ARGS.stats) { - var spent = new Date().getTime() - t1; - if (STATS[name]) STATS[name] += spent; - else STATS[name] = spent; - } - return ret; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/ast.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/ast.js deleted file mode 100644 index a1301da..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/ast.js +++ /dev/null @@ -1,985 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -function DEFNODE(type, props, methods, base) { - if (arguments.length < 4) base = AST_Node; - if (!props) props = []; - else props = props.split(/\s+/); - var self_props = props; - if (base && base.PROPS) - props = props.concat(base.PROPS); - var code = "return function AST_" + type + "(props){ if (props) { "; - for (var i = props.length; --i >= 0;) { - code += "this." + props[i] + " = props." + props[i] + ";"; - } - var proto = base && new base; - if (proto && proto.initialize || (methods && methods.initialize)) - code += "this.initialize();"; - code += "}}"; - var ctor = new Function(code)(); - if (proto) { - ctor.prototype = proto; - ctor.BASE = base; - } - if (base) base.SUBCLASSES.push(ctor); - ctor.prototype.CTOR = ctor; - ctor.PROPS = props || null; - ctor.SELF_PROPS = self_props; - ctor.SUBCLASSES = []; - if (type) { - ctor.prototype.TYPE = ctor.TYPE = type; - } - if (methods) for (i in methods) if (methods.hasOwnProperty(i)) { - if (/^\$/.test(i)) { - ctor[i.substr(1)] = methods[i]; - } else { - ctor.prototype[i] = methods[i]; - } - } - ctor.DEFMETHOD = function(name, method) { - this.prototype[name] = method; - }; - return ctor; -}; - -var AST_Token = DEFNODE("Token", "type value line col pos endpos nlb comments_before file", { -}, null); - -var AST_Node = DEFNODE("Node", "start end", { - clone: function() { - return new this.CTOR(this); - }, - $documentation: "Base class of all AST nodes", - $propdoc: { - start: "[AST_Token] The first token of this node", - end: "[AST_Token] The last token of this node" - }, - _walk: function(visitor) { - return visitor._visit(this); - }, - walk: function(visitor) { - return this._walk(visitor); // not sure the indirection will be any help - } -}, null); - -AST_Node.warn_function = null; -AST_Node.warn = function(txt, props) { - if (AST_Node.warn_function) - AST_Node.warn_function(string_template(txt, props)); -}; - -/* -----[ statements ]----- */ - -var AST_Statement = DEFNODE("Statement", null, { - $documentation: "Base class of all statements", -}); - -var AST_Debugger = DEFNODE("Debugger", null, { - $documentation: "Represents a debugger statement", -}, AST_Statement); - -var AST_Directive = DEFNODE("Directive", "value scope", { - $documentation: "Represents a directive, like \"use strict\";", - $propdoc: { - value: "[string] The value of this directive as a plain string (it's not an AST_String!)", - scope: "[AST_Scope/S] The scope that this directive affects" - }, -}, AST_Statement); - -var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", { - $documentation: "A statement consisting of an expression, i.e. a = 1 + 2", - $propdoc: { - body: "[AST_Node] an expression node (should not be instanceof AST_Statement)" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.body._walk(visitor); - }); - } -}, AST_Statement); - -function walk_body(node, visitor) { - if (node.body instanceof AST_Statement) { - node.body._walk(visitor); - } - else node.body.forEach(function(stat){ - stat._walk(visitor); - }); -}; - -var AST_Block = DEFNODE("Block", "body", { - $documentation: "A body of statements (usually bracketed)", - $propdoc: { - body: "[AST_Statement*] an array of statements" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - walk_body(this, visitor); - }); - } -}, AST_Statement); - -var AST_BlockStatement = DEFNODE("BlockStatement", null, { - $documentation: "A block statement", -}, AST_Block); - -var AST_EmptyStatement = DEFNODE("EmptyStatement", null, { - $documentation: "The empty statement (empty block or simply a semicolon)", - _walk: function(visitor) { - return visitor._visit(this); - } -}, AST_Statement); - -var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", { - $documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`", - $propdoc: { - body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.body._walk(visitor); - }); - } -}, AST_Statement); - -var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", { - $documentation: "Statement with a label", - $propdoc: { - label: "[AST_Label] a label definition" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.label._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_StatementWithBody); - -var AST_DWLoop = DEFNODE("DWLoop", "condition", { - $documentation: "Base class for do/while statements", - $propdoc: { - condition: "[AST_Node] the loop condition. Should not be instanceof AST_Statement" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.condition._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_StatementWithBody); - -var AST_Do = DEFNODE("Do", null, { - $documentation: "A `do` statement", -}, AST_DWLoop); - -var AST_While = DEFNODE("While", null, { - $documentation: "A `while` statement", -}, AST_DWLoop); - -var AST_For = DEFNODE("For", "init condition step", { - $documentation: "A `for` statement", - $propdoc: { - init: "[AST_Node?] the `for` initialization code, or null if empty", - condition: "[AST_Node?] the `for` termination clause, or null if empty", - step: "[AST_Node?] the `for` update clause, or null if empty" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - if (this.init) this.init._walk(visitor); - if (this.condition) this.condition._walk(visitor); - if (this.step) this.step._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_StatementWithBody); - -var AST_ForIn = DEFNODE("ForIn", "init name object", { - $documentation: "A `for ... in` statement", - $propdoc: { - init: "[AST_Node] the `for/in` initialization code", - name: "[AST_SymbolRef?] the loop variable, only if `init` is AST_Var", - object: "[AST_Node] the object that we're looping through" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.init._walk(visitor); - this.object._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_StatementWithBody); - -var AST_With = DEFNODE("With", "expression", { - $documentation: "A `with` statement", - $propdoc: { - expression: "[AST_Node] the `with` expression" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_StatementWithBody); - -/* -----[ scope and functions ]----- */ - -var AST_Scope = DEFNODE("Scope", "directives variables functions uses_with uses_eval parent_scope enclosed cname", { - $documentation: "Base class for all statements introducing a lexical scope", - $propdoc: { - directives: "[string*/S] an array of directives declared in this scope", - variables: "[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope", - functions: "[Object/S] like `variables`, but only lists function declarations", - uses_with: "[boolean/S] tells whether this scope uses the `with` statement", - uses_eval: "[boolean/S] tells whether this scope contains a direct call to the global `eval`", - parent_scope: "[AST_Scope?/S] link to the parent scope", - enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes", - cname: "[integer/S] current index for mangling variables (used internally by the mangler)", - }, -}, AST_Block); - -var AST_Toplevel = DEFNODE("Toplevel", "globals", { - $documentation: "The toplevel scope", - $propdoc: { - globals: "[Object/S] a map of name -> SymbolDef for all undeclared names", - }, - wrap_enclose: function(arg_parameter_pairs) { - var self = this; - var args = []; - var parameters = []; - - arg_parameter_pairs.forEach(function(pair) { - var split = pair.split(":"); - - args.push(split[0]); - parameters.push(split[1]); - }); - - var wrapped_tl = "(function(" + parameters.join(",") + "){ '$ORIG'; })(" + args.join(",") + ")"; - wrapped_tl = parse(wrapped_tl); - wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){ - if (node instanceof AST_Directive && node.value == "$ORIG") { - return MAP.splice(self.body); - } - })); - return wrapped_tl; - }, - wrap_commonjs: function(name, export_all) { - var self = this; - var to_export = []; - if (export_all) { - self.figure_out_scope(); - self.walk(new TreeWalker(function(node){ - if (node instanceof AST_SymbolDeclaration && node.definition().global) { - if (!find_if(function(n){ return n.name == node.name }, to_export)) - to_export.push(node); - } - })); - } - var wrapped_tl = "(function(exports, global){ global['" + name + "'] = exports; '$ORIG'; '$EXPORTS'; }({}, (function(){return this}())))"; - wrapped_tl = parse(wrapped_tl); - wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){ - if (node instanceof AST_SimpleStatement) { - node = node.body; - if (node instanceof AST_String) switch (node.getValue()) { - case "$ORIG": - return MAP.splice(self.body); - case "$EXPORTS": - var body = []; - to_export.forEach(function(sym){ - body.push(new AST_SimpleStatement({ - body: new AST_Assign({ - left: new AST_Sub({ - expression: new AST_SymbolRef({ name: "exports" }), - property: new AST_String({ value: sym.name }), - }), - operator: "=", - right: new AST_SymbolRef(sym), - }), - })); - }); - return MAP.splice(body); - } - } - })); - return wrapped_tl; - } -}, AST_Scope); - -var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments", { - $documentation: "Base class for functions", - $propdoc: { - name: "[AST_SymbolDeclaration?] the name of this function", - argnames: "[AST_SymbolFunarg*] array of function arguments", - uses_arguments: "[boolean/S] tells whether this function accesses the arguments array" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - if (this.name) this.name._walk(visitor); - this.argnames.forEach(function(arg){ - arg._walk(visitor); - }); - walk_body(this, visitor); - }); - } -}, AST_Scope); - -var AST_Accessor = DEFNODE("Accessor", null, { - $documentation: "A setter/getter function" -}, AST_Lambda); - -var AST_Function = DEFNODE("Function", null, { - $documentation: "A function expression" -}, AST_Lambda); - -var AST_Defun = DEFNODE("Defun", null, { - $documentation: "A function definition" -}, AST_Lambda); - -/* -----[ JUMPS ]----- */ - -var AST_Jump = DEFNODE("Jump", null, { - $documentation: "Base class for “jumps” (for now that's `return`, `throw`, `break` and `continue`)" -}, AST_Statement); - -var AST_Exit = DEFNODE("Exit", "value", { - $documentation: "Base class for “exits” (`return` and `throw`)", - $propdoc: { - value: "[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return" - }, - _walk: function(visitor) { - return visitor._visit(this, this.value && function(){ - this.value._walk(visitor); - }); - } -}, AST_Jump); - -var AST_Return = DEFNODE("Return", null, { - $documentation: "A `return` statement" -}, AST_Exit); - -var AST_Throw = DEFNODE("Throw", null, { - $documentation: "A `throw` statement" -}, AST_Exit); - -var AST_LoopControl = DEFNODE("LoopControl", "label", { - $documentation: "Base class for loop control statements (`break` and `continue`)", - $propdoc: { - label: "[AST_LabelRef?] the label, or null if none", - }, - _walk: function(visitor) { - return visitor._visit(this, this.label && function(){ - this.label._walk(visitor); - }); - } -}, AST_Jump); - -var AST_Break = DEFNODE("Break", null, { - $documentation: "A `break` statement" -}, AST_LoopControl); - -var AST_Continue = DEFNODE("Continue", null, { - $documentation: "A `continue` statement" -}, AST_LoopControl); - -/* -----[ IF ]----- */ - -var AST_If = DEFNODE("If", "condition alternative", { - $documentation: "A `if` statement", - $propdoc: { - condition: "[AST_Node] the `if` condition", - alternative: "[AST_Statement?] the `else` part, or null if not present" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.condition._walk(visitor); - this.body._walk(visitor); - if (this.alternative) this.alternative._walk(visitor); - }); - } -}, AST_StatementWithBody); - -/* -----[ SWITCH ]----- */ - -var AST_Switch = DEFNODE("Switch", "expression", { - $documentation: "A `switch` statement", - $propdoc: { - expression: "[AST_Node] the `switch` “discriminant”" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - walk_body(this, visitor); - }); - } -}, AST_Block); - -var AST_SwitchBranch = DEFNODE("SwitchBranch", null, { - $documentation: "Base class for `switch` branches", -}, AST_Block); - -var AST_Default = DEFNODE("Default", null, { - $documentation: "A `default` switch branch", -}, AST_SwitchBranch); - -var AST_Case = DEFNODE("Case", "expression", { - $documentation: "A `case` switch branch", - $propdoc: { - expression: "[AST_Node] the `case` expression" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - walk_body(this, visitor); - }); - } -}, AST_SwitchBranch); - -/* -----[ EXCEPTIONS ]----- */ - -var AST_Try = DEFNODE("Try", "bcatch bfinally", { - $documentation: "A `try` statement", - $propdoc: { - bcatch: "[AST_Catch?] the catch block, or null if not present", - bfinally: "[AST_Finally?] the finally block, or null if not present" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - walk_body(this, visitor); - if (this.bcatch) this.bcatch._walk(visitor); - if (this.bfinally) this.bfinally._walk(visitor); - }); - } -}, AST_Block); - -// XXX: this is wrong according to ECMA-262 (12.4). the catch block -// should introduce another scope, as the argname should be visible -// only inside the catch block. However, doing it this way because of -// IE which simply introduces the name in the surrounding scope. If -// we ever want to fix this then AST_Catch should inherit from -// AST_Scope. -var AST_Catch = DEFNODE("Catch", "argname", { - $documentation: "A `catch` node; only makes sense as part of a `try` statement", - $propdoc: { - argname: "[AST_SymbolCatch] symbol for the exception" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.argname._walk(visitor); - walk_body(this, visitor); - }); - } -}, AST_Block); - -var AST_Finally = DEFNODE("Finally", null, { - $documentation: "A `finally` node; only makes sense as part of a `try` statement" -}, AST_Block); - -/* -----[ VAR/CONST ]----- */ - -var AST_Definitions = DEFNODE("Definitions", "definitions", { - $documentation: "Base class for `var` or `const` nodes (variable declarations/initializations)", - $propdoc: { - definitions: "[AST_VarDef*] array of variable definitions" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.definitions.forEach(function(def){ - def._walk(visitor); - }); - }); - } -}, AST_Statement); - -var AST_Var = DEFNODE("Var", null, { - $documentation: "A `var` statement" -}, AST_Definitions); - -var AST_Const = DEFNODE("Const", null, { - $documentation: "A `const` statement" -}, AST_Definitions); - -var AST_VarDef = DEFNODE("VarDef", "name value", { - $documentation: "A variable declaration; only appears in a AST_Definitions node", - $propdoc: { - name: "[AST_SymbolVar|AST_SymbolConst] name of the variable", - value: "[AST_Node?] initializer, or null of there's no initializer" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.name._walk(visitor); - if (this.value) this.value._walk(visitor); - }); - } -}); - -/* -----[ OTHER ]----- */ - -var AST_Call = DEFNODE("Call", "expression args", { - $documentation: "A function call expression", - $propdoc: { - expression: "[AST_Node] expression to invoke as function", - args: "[AST_Node*] array of arguments" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - this.args.forEach(function(arg){ - arg._walk(visitor); - }); - }); - } -}); - -var AST_New = DEFNODE("New", null, { - $documentation: "An object instantiation. Derives from a function call since it has exactly the same properties" -}, AST_Call); - -var AST_Seq = DEFNODE("Seq", "car cdr", { - $documentation: "A sequence expression (two comma-separated expressions)", - $propdoc: { - car: "[AST_Node] first element in sequence", - cdr: "[AST_Node] second element in sequence" - }, - $cons: function(x, y) { - var seq = new AST_Seq(x); - seq.car = x; - seq.cdr = y; - return seq; - }, - $from_array: function(array) { - if (array.length == 0) return null; - if (array.length == 1) return array[0].clone(); - var list = null; - for (var i = array.length; --i >= 0;) { - list = AST_Seq.cons(array[i], list); - } - var p = list; - while (p) { - if (p.cdr && !p.cdr.cdr) { - p.cdr = p.cdr.car; - break; - } - p = p.cdr; - } - return list; - }, - to_array: function() { - var p = this, a = []; - while (p) { - a.push(p.car); - if (p.cdr && !(p.cdr instanceof AST_Seq)) { - a.push(p.cdr); - break; - } - p = p.cdr; - } - return a; - }, - add: function(node) { - var p = this; - while (p) { - if (!(p.cdr instanceof AST_Seq)) { - var cell = AST_Seq.cons(p.cdr, node); - return p.cdr = cell; - } - p = p.cdr; - } - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.car._walk(visitor); - if (this.cdr) this.cdr._walk(visitor); - }); - } -}); - -var AST_PropAccess = DEFNODE("PropAccess", "expression property", { - $documentation: "Base class for property access expressions, i.e. `a.foo` or `a[\"foo\"]`", - $propdoc: { - expression: "[AST_Node] the “container” expression", - property: "[AST_Node|string] the property to access. For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node" - } -}); - -var AST_Dot = DEFNODE("Dot", null, { - $documentation: "A dotted property access expression", - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - }); - } -}, AST_PropAccess); - -var AST_Sub = DEFNODE("Sub", null, { - $documentation: "Index-style property access, i.e. `a[\"foo\"]`", - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - this.property._walk(visitor); - }); - } -}, AST_PropAccess); - -var AST_Unary = DEFNODE("Unary", "operator expression", { - $documentation: "Base class for unary expressions", - $propdoc: { - operator: "[string] the operator", - expression: "[AST_Node] expression that this unary operator applies to" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - }); - } -}); - -var AST_UnaryPrefix = DEFNODE("UnaryPrefix", null, { - $documentation: "Unary prefix expression, i.e. `typeof i` or `++i`" -}, AST_Unary); - -var AST_UnaryPostfix = DEFNODE("UnaryPostfix", null, { - $documentation: "Unary postfix expression, i.e. `i++`" -}, AST_Unary); - -var AST_Binary = DEFNODE("Binary", "left operator right", { - $documentation: "Binary expression, i.e. `a + b`", - $propdoc: { - left: "[AST_Node] left-hand side expression", - operator: "[string] the operator", - right: "[AST_Node] right-hand side expression" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.left._walk(visitor); - this.right._walk(visitor); - }); - } -}); - -var AST_Conditional = DEFNODE("Conditional", "condition consequent alternative", { - $documentation: "Conditional expression using the ternary operator, i.e. `a ? b : c`", - $propdoc: { - condition: "[AST_Node]", - consequent: "[AST_Node]", - alternative: "[AST_Node]" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.condition._walk(visitor); - this.consequent._walk(visitor); - this.alternative._walk(visitor); - }); - } -}); - -var AST_Assign = DEFNODE("Assign", null, { - $documentation: "An assignment expression — `a = b + 5`", -}, AST_Binary); - -/* -----[ LITERALS ]----- */ - -var AST_Array = DEFNODE("Array", "elements", { - $documentation: "An array literal", - $propdoc: { - elements: "[AST_Node*] array of elements" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.elements.forEach(function(el){ - el._walk(visitor); - }); - }); - } -}); - -var AST_Object = DEFNODE("Object", "properties", { - $documentation: "An object literal", - $propdoc: { - properties: "[AST_ObjectProperty*] array of properties" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.properties.forEach(function(prop){ - prop._walk(visitor); - }); - }); - } -}); - -var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", { - $documentation: "Base class for literal object properties", - $propdoc: { - key: "[string] the property name; it's always a plain string in our AST, no matter if it was a string, number or identifier in original code", - value: "[AST_Node] property value. For setters and getters this is an AST_Function." - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.value._walk(visitor); - }); - } -}); - -var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", null, { - $documentation: "A key: value object property", -}, AST_ObjectProperty); - -var AST_ObjectSetter = DEFNODE("ObjectSetter", null, { - $documentation: "An object setter property", -}, AST_ObjectProperty); - -var AST_ObjectGetter = DEFNODE("ObjectGetter", null, { - $documentation: "An object getter property", -}, AST_ObjectProperty); - -var AST_Symbol = DEFNODE("Symbol", "scope name thedef", { - $propdoc: { - name: "[string] name of this symbol", - scope: "[AST_Scope/S] the current scope (not necessarily the definition scope)", - thedef: "[SymbolDef/S] the definition of this symbol" - }, - $documentation: "Base class for all symbols", -}); - -var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, { - $documentation: "The name of a property accessor (setter/getter function)" -}, AST_Symbol); - -var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", { - $documentation: "A declaration symbol (symbol in var/const, function name or argument, symbol in catch)", - $propdoc: { - init: "[AST_Node*/S] array of initializers for this declaration." - } -}, AST_Symbol); - -var AST_SymbolVar = DEFNODE("SymbolVar", null, { - $documentation: "Symbol defining a variable", -}, AST_SymbolDeclaration); - -var AST_SymbolConst = DEFNODE("SymbolConst", null, { - $documentation: "A constant declaration" -}, AST_SymbolDeclaration); - -var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, { - $documentation: "Symbol naming a function argument", -}, AST_SymbolVar); - -var AST_SymbolDefun = DEFNODE("SymbolDefun", null, { - $documentation: "Symbol defining a function", -}, AST_SymbolDeclaration); - -var AST_SymbolLambda = DEFNODE("SymbolLambda", null, { - $documentation: "Symbol naming a function expression", -}, AST_SymbolDeclaration); - -var AST_SymbolCatch = DEFNODE("SymbolCatch", null, { - $documentation: "Symbol naming the exception in catch", -}, AST_SymbolDeclaration); - -var AST_Label = DEFNODE("Label", "references", { - $documentation: "Symbol naming a label (declaration)", - $propdoc: { - references: "[AST_LabelRef*] a list of nodes referring to this label" - } -}, AST_Symbol); - -var AST_SymbolRef = DEFNODE("SymbolRef", null, { - $documentation: "Reference to some symbol (not definition/declaration)", -}, AST_Symbol); - -var AST_LabelRef = DEFNODE("LabelRef", null, { - $documentation: "Reference to a label symbol", -}, AST_Symbol); - -var AST_This = DEFNODE("This", null, { - $documentation: "The `this` symbol", -}, AST_Symbol); - -var AST_Constant = DEFNODE("Constant", null, { - $documentation: "Base class for all constants", - getValue: function() { - return this.value; - } -}); - -var AST_String = DEFNODE("String", "value", { - $documentation: "A string literal", - $propdoc: { - value: "[string] the contents of this string" - } -}, AST_Constant); - -var AST_Number = DEFNODE("Number", "value", { - $documentation: "A number literal", - $propdoc: { - value: "[number] the numeric value" - } -}, AST_Constant); - -var AST_RegExp = DEFNODE("RegExp", "value", { - $documentation: "A regexp literal", - $propdoc: { - value: "[RegExp] the actual regexp" - } -}, AST_Constant); - -var AST_Atom = DEFNODE("Atom", null, { - $documentation: "Base class for atoms", -}, AST_Constant); - -var AST_Null = DEFNODE("Null", null, { - $documentation: "The `null` atom", - value: null -}, AST_Atom); - -var AST_NaN = DEFNODE("NaN", null, { - $documentation: "The impossible value", - value: 0/0 -}, AST_Atom); - -var AST_Undefined = DEFNODE("Undefined", null, { - $documentation: "The `undefined` value", - value: (function(){}()) -}, AST_Atom); - -var AST_Hole = DEFNODE("Hole", null, { - $documentation: "A hole in an array", - value: (function(){}()) -}, AST_Atom); - -var AST_Infinity = DEFNODE("Infinity", null, { - $documentation: "The `Infinity` value", - value: 1/0 -}, AST_Atom); - -var AST_Boolean = DEFNODE("Boolean", null, { - $documentation: "Base class for booleans", -}, AST_Atom); - -var AST_False = DEFNODE("False", null, { - $documentation: "The `false` atom", - value: false -}, AST_Boolean); - -var AST_True = DEFNODE("True", null, { - $documentation: "The `true` atom", - value: true -}, AST_Boolean); - -/* -----[ TreeWalker ]----- */ - -function TreeWalker(callback) { - this.visit = callback; - this.stack = []; -}; -TreeWalker.prototype = { - _visit: function(node, descend) { - this.stack.push(node); - var ret = this.visit(node, descend ? function(){ - descend.call(node); - } : noop); - if (!ret && descend) { - descend.call(node); - } - this.stack.pop(); - return ret; - }, - parent: function(n) { - return this.stack[this.stack.length - 2 - (n || 0)]; - }, - push: function (node) { - this.stack.push(node); - }, - pop: function() { - return this.stack.pop(); - }, - self: function() { - return this.stack[this.stack.length - 1]; - }, - find_parent: function(type) { - var stack = this.stack; - for (var i = stack.length; --i >= 0;) { - var x = stack[i]; - if (x instanceof type) return x; - } - }, - in_boolean_context: function() { - var stack = this.stack; - var i = stack.length, self = stack[--i]; - while (i > 0) { - var p = stack[--i]; - if ((p instanceof AST_If && p.condition === self) || - (p instanceof AST_Conditional && p.condition === self) || - (p instanceof AST_DWLoop && p.condition === self) || - (p instanceof AST_For && p.condition === self) || - (p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self)) - { - return true; - } - if (!(p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||"))) - return false; - self = p; - } - }, - loopcontrol_target: function(label) { - var stack = this.stack; - if (label) { - for (var i = stack.length; --i >= 0;) { - var x = stack[i]; - if (x instanceof AST_LabeledStatement && x.label.name == label.name) { - return x.body; - } - } - } else { - for (var i = stack.length; --i >= 0;) { - var x = stack[i]; - if (x instanceof AST_Switch - || x instanceof AST_For - || x instanceof AST_ForIn - || x instanceof AST_DWLoop) return x; - } - } - } -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/compress.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/compress.js deleted file mode 100644 index 57554fa..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/compress.js +++ /dev/null @@ -1,2028 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -function Compressor(options, false_by_default) { - if (!(this instanceof Compressor)) - return new Compressor(options, false_by_default); - TreeTransformer.call(this, this.before, this.after); - this.options = defaults(options, { - sequences : !false_by_default, - properties : !false_by_default, - dead_code : !false_by_default, - drop_debugger : !false_by_default, - unsafe : false, - unsafe_comps : false, - conditionals : !false_by_default, - comparisons : !false_by_default, - evaluate : !false_by_default, - booleans : !false_by_default, - loops : !false_by_default, - unused : !false_by_default, - hoist_funs : !false_by_default, - hoist_vars : false, - if_return : !false_by_default, - join_vars : !false_by_default, - cascade : !false_by_default, - side_effects : !false_by_default, - screw_ie8 : false, - - warnings : true, - global_defs : {} - }, true); -}; - -Compressor.prototype = new TreeTransformer; -merge(Compressor.prototype, { - option: function(key) { return this.options[key] }, - warn: function() { - if (this.options.warnings) - AST_Node.warn.apply(AST_Node, arguments); - }, - before: function(node, descend, in_list) { - if (node._squeezed) return node; - if (node instanceof AST_Scope) { - node.drop_unused(this); - node = node.hoist_declarations(this); - } - descend(node, this); - node = node.optimize(this); - if (node instanceof AST_Scope) { - // dead code removal might leave further unused declarations. - // this'll usually save very few bytes, but the performance - // hit seems negligible so I'll just drop it here. - - // no point to repeat warnings. - var save_warnings = this.options.warnings; - this.options.warnings = false; - node.drop_unused(this); - this.options.warnings = save_warnings; - } - node._squeezed = true; - return node; - } -}); - -(function(){ - - function OPT(node, optimizer) { - node.DEFMETHOD("optimize", function(compressor){ - var self = this; - if (self._optimized) return self; - var opt = optimizer(self, compressor); - opt._optimized = true; - if (opt === self) return opt; - return opt.transform(compressor); - }); - }; - - OPT(AST_Node, function(self, compressor){ - return self; - }); - - AST_Node.DEFMETHOD("equivalent_to", function(node){ - // XXX: this is a rather expensive way to test two node's equivalence: - return this.print_to_string() == node.print_to_string(); - }); - - function make_node(ctor, orig, props) { - if (!props) props = {}; - if (orig) { - if (!props.start) props.start = orig.start; - if (!props.end) props.end = orig.end; - } - return new ctor(props); - }; - - function make_node_from_constant(compressor, val, orig) { - // XXX: WIP. - // if (val instanceof AST_Node) return val.transform(new TreeTransformer(null, function(node){ - // if (node instanceof AST_SymbolRef) { - // var scope = compressor.find_parent(AST_Scope); - // var def = scope.find_variable(node); - // node.thedef = def; - // return node; - // } - // })).transform(compressor); - - if (val instanceof AST_Node) return val.transform(compressor); - switch (typeof val) { - case "string": - return make_node(AST_String, orig, { - value: val - }).optimize(compressor); - case "number": - return make_node(isNaN(val) ? AST_NaN : AST_Number, orig, { - value: val - }).optimize(compressor); - case "boolean": - return make_node(val ? AST_True : AST_False, orig).optimize(compressor); - case "undefined": - return make_node(AST_Undefined, orig).optimize(compressor); - default: - if (val === null) { - return make_node(AST_Null, orig).optimize(compressor); - } - if (val instanceof RegExp) { - return make_node(AST_RegExp, orig).optimize(compressor); - } - throw new Error(string_template("Can't handle constant of type: {type}", { - type: typeof val - })); - } - }; - - function as_statement_array(thing) { - if (thing === null) return []; - if (thing instanceof AST_BlockStatement) return thing.body; - if (thing instanceof AST_EmptyStatement) return []; - if (thing instanceof AST_Statement) return [ thing ]; - throw new Error("Can't convert thing to statement array"); - }; - - function is_empty(thing) { - if (thing === null) return true; - if (thing instanceof AST_EmptyStatement) return true; - if (thing instanceof AST_BlockStatement) return thing.body.length == 0; - return false; - }; - - function loop_body(x) { - if (x instanceof AST_Switch) return x; - if (x instanceof AST_For || x instanceof AST_ForIn || x instanceof AST_DWLoop) { - return (x.body instanceof AST_BlockStatement ? x.body : x); - } - return x; - }; - - function tighten_body(statements, compressor) { - var CHANGED; - do { - CHANGED = false; - statements = eliminate_spurious_blocks(statements); - if (compressor.option("dead_code")) { - statements = eliminate_dead_code(statements, compressor); - } - if (compressor.option("if_return")) { - statements = handle_if_return(statements, compressor); - } - if (compressor.option("sequences")) { - statements = sequencesize(statements, compressor); - } - if (compressor.option("join_vars")) { - statements = join_consecutive_vars(statements, compressor); - } - } while (CHANGED); - return statements; - - function eliminate_spurious_blocks(statements) { - var seen_dirs = []; - return statements.reduce(function(a, stat){ - if (stat instanceof AST_BlockStatement) { - CHANGED = true; - a.push.apply(a, eliminate_spurious_blocks(stat.body)); - } else if (stat instanceof AST_EmptyStatement) { - CHANGED = true; - } else if (stat instanceof AST_Directive) { - if (seen_dirs.indexOf(stat.value) < 0) { - a.push(stat); - seen_dirs.push(stat.value); - } else { - CHANGED = true; - } - } else { - a.push(stat); - } - return a; - }, []); - }; - - function handle_if_return(statements, compressor) { - var self = compressor.self(); - var in_lambda = self instanceof AST_Lambda; - var ret = []; - loop: for (var i = statements.length; --i >= 0;) { - var stat = statements[i]; - switch (true) { - case (in_lambda && stat instanceof AST_Return && !stat.value && ret.length == 0): - CHANGED = true; - // note, ret.length is probably always zero - // because we drop unreachable code before this - // step. nevertheless, it's good to check. - continue loop; - case stat instanceof AST_If: - if (stat.body instanceof AST_Return) { - //--- - // pretty silly case, but: - // if (foo()) return; return; ==> foo(); return; - if (((in_lambda && ret.length == 0) - || (ret[0] instanceof AST_Return && !ret[0].value)) - && !stat.body.value && !stat.alternative) { - CHANGED = true; - var cond = make_node(AST_SimpleStatement, stat.condition, { - body: stat.condition - }); - ret.unshift(cond); - continue loop; - } - //--- - // if (foo()) return x; return y; ==> return foo() ? x : y; - if (ret[0] instanceof AST_Return && stat.body.value && ret[0].value && !stat.alternative) { - CHANGED = true; - stat = stat.clone(); - stat.alternative = ret[0]; - ret[0] = stat.transform(compressor); - continue loop; - } - //--- - // if (foo()) return x; [ return ; ] ==> return foo() ? x : undefined; - if ((ret.length == 0 || ret[0] instanceof AST_Return) && stat.body.value && !stat.alternative && in_lambda) { - CHANGED = true; - stat = stat.clone(); - stat.alternative = ret[0] || make_node(AST_Return, stat, { - value: make_node(AST_Undefined, stat) - }); - ret[0] = stat.transform(compressor); - continue loop; - } - //--- - // if (foo()) return; [ else x... ]; y... ==> if (!foo()) { x...; y... } - if (!stat.body.value && in_lambda) { - CHANGED = true; - stat = stat.clone(); - stat.condition = stat.condition.negate(compressor); - stat.body = make_node(AST_BlockStatement, stat, { - body: as_statement_array(stat.alternative).concat(ret) - }); - stat.alternative = null; - ret = [ stat.transform(compressor) ]; - continue loop; - } - //--- - if (ret.length == 1 && in_lambda && ret[0] instanceof AST_SimpleStatement - && (!stat.alternative || stat.alternative instanceof AST_SimpleStatement)) { - CHANGED = true; - ret.push(make_node(AST_Return, ret[0], { - value: make_node(AST_Undefined, ret[0]) - }).transform(compressor)); - ret = as_statement_array(stat.alternative).concat(ret); - ret.unshift(stat); - continue loop; - } - } - - var ab = aborts(stat.body); - var lct = ab instanceof AST_LoopControl ? compressor.loopcontrol_target(ab.label) : null; - if (ab && ((ab instanceof AST_Return && !ab.value && in_lambda) - || (ab instanceof AST_Continue && self === loop_body(lct)) - || (ab instanceof AST_Break && lct instanceof AST_BlockStatement && self === lct))) { - if (ab.label) { - remove(ab.label.thedef.references, ab.label); - } - CHANGED = true; - var body = as_statement_array(stat.body).slice(0, -1); - stat = stat.clone(); - stat.condition = stat.condition.negate(compressor); - stat.body = make_node(AST_BlockStatement, stat, { - body: ret - }); - stat.alternative = make_node(AST_BlockStatement, stat, { - body: body - }); - ret = [ stat.transform(compressor) ]; - continue loop; - } - - var ab = aborts(stat.alternative); - var lct = ab instanceof AST_LoopControl ? compressor.loopcontrol_target(ab.label) : null; - if (ab && ((ab instanceof AST_Return && !ab.value && in_lambda) - || (ab instanceof AST_Continue && self === loop_body(lct)) - || (ab instanceof AST_Break && lct instanceof AST_BlockStatement && self === lct))) { - if (ab.label) { - remove(ab.label.thedef.references, ab.label); - } - CHANGED = true; - stat = stat.clone(); - stat.body = make_node(AST_BlockStatement, stat.body, { - body: as_statement_array(stat.body).concat(ret) - }); - stat.alternative = make_node(AST_BlockStatement, stat.alternative, { - body: as_statement_array(stat.alternative).slice(0, -1) - }); - ret = [ stat.transform(compressor) ]; - continue loop; - } - - ret.unshift(stat); - break; - default: - ret.unshift(stat); - break; - } - } - return ret; - }; - - function eliminate_dead_code(statements, compressor) { - var has_quit = false; - var orig = statements.length; - var self = compressor.self(); - statements = statements.reduce(function(a, stat){ - if (has_quit) { - extract_declarations_from_unreachable_code(compressor, stat, a); - } else { - if (stat instanceof AST_LoopControl) { - var lct = compressor.loopcontrol_target(stat.label); - if ((stat instanceof AST_Break - && lct instanceof AST_BlockStatement - && loop_body(lct) === self) || (stat instanceof AST_Continue - && loop_body(lct) === self)) { - if (stat.label) { - remove(stat.label.thedef.references, stat.label); - } - } else { - a.push(stat); - } - } else { - a.push(stat); - } - if (aborts(stat)) has_quit = true; - } - return a; - }, []); - CHANGED = statements.length != orig; - return statements; - }; - - function sequencesize(statements, compressor) { - if (statements.length < 2) return statements; - var seq = [], ret = []; - function push_seq() { - seq = AST_Seq.from_array(seq); - if (seq) ret.push(make_node(AST_SimpleStatement, seq, { - body: seq - })); - seq = []; - }; - statements.forEach(function(stat){ - if (stat instanceof AST_SimpleStatement) seq.push(stat.body); - else push_seq(), ret.push(stat); - }); - push_seq(); - ret = sequencesize_2(ret, compressor); - CHANGED = ret.length != statements.length; - return ret; - }; - - function sequencesize_2(statements, compressor) { - function cons_seq(right) { - ret.pop(); - var left = prev.body; - if (left instanceof AST_Seq) { - left.add(right); - } else { - left = AST_Seq.cons(left, right); - } - return left.transform(compressor); - }; - var ret = [], prev = null; - statements.forEach(function(stat){ - if (prev) { - if (stat instanceof AST_For) { - var opera = {}; - try { - prev.body.walk(new TreeWalker(function(node){ - if (node instanceof AST_Binary && node.operator == "in") - throw opera; - })); - if (stat.init && !(stat.init instanceof AST_Definitions)) { - stat.init = cons_seq(stat.init); - } - else if (!stat.init) { - stat.init = prev.body; - ret.pop(); - } - } catch(ex) { - if (ex !== opera) throw ex; - } - } - else if (stat instanceof AST_If) { - stat.condition = cons_seq(stat.condition); - } - else if (stat instanceof AST_With) { - stat.expression = cons_seq(stat.expression); - } - else if (stat instanceof AST_Exit && stat.value) { - stat.value = cons_seq(stat.value); - } - else if (stat instanceof AST_Exit) { - stat.value = cons_seq(make_node(AST_Undefined, stat)); - } - else if (stat instanceof AST_Switch) { - stat.expression = cons_seq(stat.expression); - } - } - ret.push(stat); - prev = stat instanceof AST_SimpleStatement ? stat : null; - }); - return ret; - }; - - function join_consecutive_vars(statements, compressor) { - var prev = null; - return statements.reduce(function(a, stat){ - if (stat instanceof AST_Definitions && prev && prev.TYPE == stat.TYPE) { - prev.definitions = prev.definitions.concat(stat.definitions); - CHANGED = true; - } - else if (stat instanceof AST_For - && prev instanceof AST_Definitions - && (!stat.init || stat.init.TYPE == prev.TYPE)) { - CHANGED = true; - a.pop(); - if (stat.init) { - stat.init.definitions = prev.definitions.concat(stat.init.definitions); - } else { - stat.init = prev; - } - a.push(stat); - prev = stat; - } - else { - prev = stat; - a.push(stat); - } - return a; - }, []); - }; - - }; - - function extract_declarations_from_unreachable_code(compressor, stat, target) { - compressor.warn("Dropping unreachable code [{file}:{line},{col}]", stat.start); - stat.walk(new TreeWalker(function(node){ - if (node instanceof AST_Definitions) { - compressor.warn("Declarations in unreachable code! [{file}:{line},{col}]", node.start); - node.remove_initializers(); - target.push(node); - return true; - } - if (node instanceof AST_Defun) { - target.push(node); - return true; - } - if (node instanceof AST_Scope) { - return true; - } - })); - }; - - /* -----[ boolean/negation helpers ]----- */ - - // methods to determine whether an expression has a boolean result type - (function (def){ - var unary_bool = [ "!", "delete" ]; - var binary_bool = [ "in", "instanceof", "==", "!=", "===", "!==", "<", "<=", ">=", ">" ]; - def(AST_Node, function(){ return false }); - def(AST_UnaryPrefix, function(){ - return member(this.operator, unary_bool); - }); - def(AST_Binary, function(){ - return member(this.operator, binary_bool) || - ( (this.operator == "&&" || this.operator == "||") && - this.left.is_boolean() && this.right.is_boolean() ); - }); - def(AST_Conditional, function(){ - return this.consequent.is_boolean() && this.alternative.is_boolean(); - }); - def(AST_Assign, function(){ - return this.operator == "=" && this.right.is_boolean(); - }); - def(AST_Seq, function(){ - return this.cdr.is_boolean(); - }); - def(AST_True, function(){ return true }); - def(AST_False, function(){ return true }); - })(function(node, func){ - node.DEFMETHOD("is_boolean", func); - }); - - // methods to determine if an expression has a string result type - (function (def){ - def(AST_Node, function(){ return false }); - def(AST_String, function(){ return true }); - def(AST_UnaryPrefix, function(){ - return this.operator == "typeof"; - }); - def(AST_Binary, function(compressor){ - return this.operator == "+" && - (this.left.is_string(compressor) || this.right.is_string(compressor)); - }); - def(AST_Assign, function(compressor){ - return (this.operator == "=" || this.operator == "+=") && this.right.is_string(compressor); - }); - def(AST_Seq, function(compressor){ - return this.cdr.is_string(compressor); - }); - def(AST_Conditional, function(compressor){ - return this.consequent.is_string(compressor) && this.alternative.is_string(compressor); - }); - def(AST_Call, function(compressor){ - return compressor.option("unsafe") - && this.expression instanceof AST_SymbolRef - && this.expression.name == "String" - && this.expression.undeclared(); - }); - })(function(node, func){ - node.DEFMETHOD("is_string", func); - }); - - function best_of(ast1, ast2) { - return ast1.print_to_string().length > - ast2.print_to_string().length - ? ast2 : ast1; - }; - - // methods to evaluate a constant expression - (function (def){ - // The evaluate method returns an array with one or two - // elements. If the node has been successfully reduced to a - // constant, then the second element tells us the value; - // otherwise the second element is missing. The first element - // of the array is always an AST_Node descendant; when - // evaluation was successful it's a node that represents the - // constant; otherwise it's the original node. - AST_Node.DEFMETHOD("evaluate", function(compressor){ - if (!compressor.option("evaluate")) return [ this ]; - try { - var val = this._eval(), ast = make_node_from_constant(compressor, val, this); - return [ best_of(ast, this), val ]; - } catch(ex) { - if (ex !== def) throw ex; - return [ this ]; - } - }); - def(AST_Statement, function(){ - throw new Error(string_template("Cannot evaluate a statement [{file}:{line},{col}]", this.start)); - }); - def(AST_Function, function(){ - // XXX: AST_Function inherits from AST_Scope, which itself - // inherits from AST_Statement; however, an AST_Function - // isn't really a statement. This could byte in other - // places too. :-( Wish JS had multiple inheritance. - return [ this ]; - }); - function ev(node) { - return node._eval(); - }; - def(AST_Node, function(){ - throw def; // not constant - }); - def(AST_Constant, function(){ - return this.getValue(); - }); - def(AST_UnaryPrefix, function(){ - var e = this.expression; - switch (this.operator) { - case "!": return !ev(e); - case "typeof": - // Function would be evaluated to an array and so typeof would - // incorrectly return 'object'. Hence making is a special case. - if (e instanceof AST_Function) return typeof function(){}; - - e = ev(e); - - // typeof returns "object" or "function" on different platforms - // so cannot evaluate reliably - if (e instanceof RegExp) throw def; - - return typeof e; - case "void": return void ev(e); - case "~": return ~ev(e); - case "-": - e = ev(e); - if (e === 0) throw def; - return -e; - case "+": return +ev(e); - } - throw def; - }); - def(AST_Binary, function(){ - var left = this.left, right = this.right; - switch (this.operator) { - case "&&" : return ev(left) && ev(right); - case "||" : return ev(left) || ev(right); - case "|" : return ev(left) | ev(right); - case "&" : return ev(left) & ev(right); - case "^" : return ev(left) ^ ev(right); - case "+" : return ev(left) + ev(right); - case "*" : return ev(left) * ev(right); - case "/" : return ev(left) / ev(right); - case "%" : return ev(left) % ev(right); - case "-" : return ev(left) - ev(right); - case "<<" : return ev(left) << ev(right); - case ">>" : return ev(left) >> ev(right); - case ">>>" : return ev(left) >>> ev(right); - case "==" : return ev(left) == ev(right); - case "===" : return ev(left) === ev(right); - case "!=" : return ev(left) != ev(right); - case "!==" : return ev(left) !== ev(right); - case "<" : return ev(left) < ev(right); - case "<=" : return ev(left) <= ev(right); - case ">" : return ev(left) > ev(right); - case ">=" : return ev(left) >= ev(right); - case "in" : return ev(left) in ev(right); - case "instanceof" : return ev(left) instanceof ev(right); - } - throw def; - }); - def(AST_Conditional, function(){ - return ev(this.condition) - ? ev(this.consequent) - : ev(this.alternative); - }); - def(AST_SymbolRef, function(){ - var d = this.definition(); - if (d && d.constant && d.init) return ev(d.init); - throw def; - }); - })(function(node, func){ - node.DEFMETHOD("_eval", func); - }); - - // method to negate an expression - (function(def){ - function basic_negation(exp) { - return make_node(AST_UnaryPrefix, exp, { - operator: "!", - expression: exp - }); - }; - def(AST_Node, function(){ - return basic_negation(this); - }); - def(AST_Statement, function(){ - throw new Error("Cannot negate a statement"); - }); - def(AST_Function, function(){ - return basic_negation(this); - }); - def(AST_UnaryPrefix, function(){ - if (this.operator == "!") - return this.expression; - return basic_negation(this); - }); - def(AST_Seq, function(compressor){ - var self = this.clone(); - self.cdr = self.cdr.negate(compressor); - return self; - }); - def(AST_Conditional, function(compressor){ - var self = this.clone(); - self.consequent = self.consequent.negate(compressor); - self.alternative = self.alternative.negate(compressor); - return best_of(basic_negation(this), self); - }); - def(AST_Binary, function(compressor){ - var self = this.clone(), op = this.operator; - if (compressor.option("unsafe_comps")) { - switch (op) { - case "<=" : self.operator = ">" ; return self; - case "<" : self.operator = ">=" ; return self; - case ">=" : self.operator = "<" ; return self; - case ">" : self.operator = "<=" ; return self; - } - } - switch (op) { - case "==" : self.operator = "!="; return self; - case "!=" : self.operator = "=="; return self; - case "===": self.operator = "!=="; return self; - case "!==": self.operator = "==="; return self; - case "&&": - self.operator = "||"; - self.left = self.left.negate(compressor); - self.right = self.right.negate(compressor); - return best_of(basic_negation(this), self); - case "||": - self.operator = "&&"; - self.left = self.left.negate(compressor); - self.right = self.right.negate(compressor); - return best_of(basic_negation(this), self); - } - return basic_negation(this); - }); - })(function(node, func){ - node.DEFMETHOD("negate", function(compressor){ - return func.call(this, compressor); - }); - }); - - // determine if expression has side effects - (function(def){ - def(AST_Node, function(){ return true }); - - def(AST_EmptyStatement, function(){ return false }); - def(AST_Constant, function(){ return false }); - def(AST_This, function(){ return false }); - - def(AST_Block, function(){ - for (var i = this.body.length; --i >= 0;) { - if (this.body[i].has_side_effects()) - return true; - } - return false; - }); - - def(AST_SimpleStatement, function(){ - return this.body.has_side_effects(); - }); - def(AST_Defun, function(){ return true }); - def(AST_Function, function(){ return false }); - def(AST_Binary, function(){ - return this.left.has_side_effects() - || this.right.has_side_effects(); - }); - def(AST_Assign, function(){ return true }); - def(AST_Conditional, function(){ - return this.condition.has_side_effects() - || this.consequent.has_side_effects() - || this.alternative.has_side_effects(); - }); - def(AST_Unary, function(){ - return this.operator == "delete" - || this.operator == "++" - || this.operator == "--" - || this.expression.has_side_effects(); - }); - def(AST_SymbolRef, function(){ return false }); - def(AST_Object, function(){ - for (var i = this.properties.length; --i >= 0;) - if (this.properties[i].has_side_effects()) - return true; - return false; - }); - def(AST_ObjectProperty, function(){ - return this.value.has_side_effects(); - }); - def(AST_Array, function(){ - for (var i = this.elements.length; --i >= 0;) - if (this.elements[i].has_side_effects()) - return true; - return false; - }); - // def(AST_Dot, function(){ - // return this.expression.has_side_effects(); - // }); - // def(AST_Sub, function(){ - // return this.expression.has_side_effects() - // || this.property.has_side_effects(); - // }); - def(AST_PropAccess, function(){ - return true; - }); - def(AST_Seq, function(){ - return this.car.has_side_effects() - || this.cdr.has_side_effects(); - }); - })(function(node, func){ - node.DEFMETHOD("has_side_effects", func); - }); - - // tell me if a statement aborts - function aborts(thing) { - return thing && thing.aborts(); - }; - (function(def){ - def(AST_Statement, function(){ return null }); - def(AST_Jump, function(){ return this }); - function block_aborts(){ - var n = this.body.length; - return n > 0 && aborts(this.body[n - 1]); - }; - def(AST_BlockStatement, block_aborts); - def(AST_SwitchBranch, block_aborts); - def(AST_If, function(){ - return this.alternative && aborts(this.body) && aborts(this.alternative); - }); - })(function(node, func){ - node.DEFMETHOD("aborts", func); - }); - - /* -----[ optimizers ]----- */ - - OPT(AST_Directive, function(self, compressor){ - if (self.scope.has_directive(self.value) !== self.scope) { - return make_node(AST_EmptyStatement, self); - } - return self; - }); - - OPT(AST_Debugger, function(self, compressor){ - if (compressor.option("drop_debugger")) - return make_node(AST_EmptyStatement, self); - return self; - }); - - OPT(AST_LabeledStatement, function(self, compressor){ - if (self.body instanceof AST_Break - && compressor.loopcontrol_target(self.body.label) === self.body) { - return make_node(AST_EmptyStatement, self); - } - return self.label.references.length == 0 ? self.body : self; - }); - - OPT(AST_Block, function(self, compressor){ - self.body = tighten_body(self.body, compressor); - return self; - }); - - OPT(AST_BlockStatement, function(self, compressor){ - self.body = tighten_body(self.body, compressor); - switch (self.body.length) { - case 1: return self.body[0]; - case 0: return make_node(AST_EmptyStatement, self); - } - return self; - }); - - AST_Scope.DEFMETHOD("drop_unused", function(compressor){ - var self = this; - if (compressor.option("unused") - && !(self instanceof AST_Toplevel) - && !self.uses_eval - ) { - var in_use = []; - var initializations = new Dictionary(); - // pass 1: find out which symbols are directly used in - // this scope (not in nested scopes). - var scope = this; - var tw = new TreeWalker(function(node, descend){ - if (node !== self) { - if (node instanceof AST_Defun) { - initializations.add(node.name.name, node); - return true; // don't go in nested scopes - } - if (node instanceof AST_Definitions && scope === self) { - node.definitions.forEach(function(def){ - if (def.value) { - initializations.add(def.name.name, def.value); - if (def.value.has_side_effects()) { - def.value.walk(tw); - } - } - }); - return true; - } - if (node instanceof AST_SymbolRef) { - push_uniq(in_use, node.definition()); - return true; - } - if (node instanceof AST_Scope) { - var save_scope = scope; - scope = node; - descend(); - scope = save_scope; - return true; - } - } - }); - self.walk(tw); - // pass 2: for every used symbol we need to walk its - // initialization code to figure out if it uses other - // symbols (that may not be in_use). - for (var i = 0; i < in_use.length; ++i) { - in_use[i].orig.forEach(function(decl){ - // undeclared globals will be instanceof AST_SymbolRef - var init = initializations.get(decl.name); - if (init) init.forEach(function(init){ - var tw = new TreeWalker(function(node){ - if (node instanceof AST_SymbolRef) { - push_uniq(in_use, node.definition()); - } - }); - init.walk(tw); - }); - }); - } - // pass 3: we should drop declarations not in_use - var tt = new TreeTransformer( - function before(node, descend, in_list) { - if (node instanceof AST_Lambda) { - for (var a = node.argnames, i = a.length; --i >= 0;) { - var sym = a[i]; - if (sym.unreferenced()) { - a.pop(); - compressor.warn("Dropping unused function argument {name} [{file}:{line},{col}]", { - name : sym.name, - file : sym.start.file, - line : sym.start.line, - col : sym.start.col - }); - } - else break; - } - } - if (node instanceof AST_Defun && node !== self) { - if (!member(node.name.definition(), in_use)) { - compressor.warn("Dropping unused function {name} [{file}:{line},{col}]", { - name : node.name.name, - file : node.name.start.file, - line : node.name.start.line, - col : node.name.start.col - }); - return make_node(AST_EmptyStatement, node); - } - return node; - } - if (node instanceof AST_Definitions && !(tt.parent() instanceof AST_ForIn)) { - var def = node.definitions.filter(function(def){ - if (member(def.name.definition(), in_use)) return true; - var w = { - name : def.name.name, - file : def.name.start.file, - line : def.name.start.line, - col : def.name.start.col - }; - if (def.value && def.value.has_side_effects()) { - def._unused_side_effects = true; - compressor.warn("Side effects in initialization of unused variable {name} [{file}:{line},{col}]", w); - return true; - } - compressor.warn("Dropping unused variable {name} [{file}:{line},{col}]", w); - return false; - }); - // place uninitialized names at the start - def = mergeSort(def, function(a, b){ - if (!a.value && b.value) return -1; - if (!b.value && a.value) return 1; - return 0; - }); - // for unused names whose initialization has - // side effects, we can cascade the init. code - // into the next one, or next statement. - var side_effects = []; - for (var i = 0; i < def.length;) { - var x = def[i]; - if (x._unused_side_effects) { - side_effects.push(x.value); - def.splice(i, 1); - } else { - if (side_effects.length > 0) { - side_effects.push(x.value); - x.value = AST_Seq.from_array(side_effects); - side_effects = []; - } - ++i; - } - } - if (side_effects.length > 0) { - side_effects = make_node(AST_BlockStatement, node, { - body: [ make_node(AST_SimpleStatement, node, { - body: AST_Seq.from_array(side_effects) - }) ] - }); - } else { - side_effects = null; - } - if (def.length == 0 && !side_effects) { - return make_node(AST_EmptyStatement, node); - } - if (def.length == 0) { - return side_effects; - } - node.definitions = def; - if (side_effects) { - side_effects.body.unshift(node); - node = side_effects; - } - return node; - } - if (node instanceof AST_For && node.init instanceof AST_BlockStatement) { - descend(node, this); - // certain combination of unused name + side effect leads to: - // https://github.com/mishoo/UglifyJS2/issues/44 - // that's an invalid AST. - // We fix it at this stage by moving the `var` outside the `for`. - var body = node.init.body.slice(0, -1); - node.init = node.init.body.slice(-1)[0].body; - body.push(node); - return in_list ? MAP.splice(body) : make_node(AST_BlockStatement, node, { - body: body - }); - } - if (node instanceof AST_Scope && node !== self) - return node; - } - ); - self.transform(tt); - } - }); - - AST_Scope.DEFMETHOD("hoist_declarations", function(compressor){ - var hoist_funs = compressor.option("hoist_funs"); - var hoist_vars = compressor.option("hoist_vars"); - var self = this; - if (hoist_funs || hoist_vars) { - var dirs = []; - var hoisted = []; - var vars = new Dictionary(), vars_found = 0, var_decl = 0; - // let's count var_decl first, we seem to waste a lot of - // space if we hoist `var` when there's only one. - self.walk(new TreeWalker(function(node){ - if (node instanceof AST_Scope && node !== self) - return true; - if (node instanceof AST_Var) { - ++var_decl; - return true; - } - })); - hoist_vars = hoist_vars && var_decl > 1; - var tt = new TreeTransformer( - function before(node) { - if (node !== self) { - if (node instanceof AST_Directive) { - dirs.push(node); - return make_node(AST_EmptyStatement, node); - } - if (node instanceof AST_Defun && hoist_funs) { - hoisted.push(node); - return make_node(AST_EmptyStatement, node); - } - if (node instanceof AST_Var && hoist_vars) { - node.definitions.forEach(function(def){ - vars.set(def.name.name, def); - ++vars_found; - }); - var seq = node.to_assignments(); - var p = tt.parent(); - if (p instanceof AST_ForIn && p.init === node) { - if (seq == null) return node.definitions[0].name; - return seq; - } - if (p instanceof AST_For && p.init === node) { - return seq; - } - if (!seq) return make_node(AST_EmptyStatement, node); - return make_node(AST_SimpleStatement, node, { - body: seq - }); - } - if (node instanceof AST_Scope) - return node; // to avoid descending in nested scopes - } - } - ); - self = self.transform(tt); - if (vars_found > 0) { - // collect only vars which don't show up in self's arguments list - var defs = []; - vars.each(function(def, name){ - if (self instanceof AST_Lambda - && find_if(function(x){ return x.name == def.name.name }, - self.argnames)) { - vars.del(name); - } else { - def = def.clone(); - def.value = null; - defs.push(def); - vars.set(name, def); - } - }); - if (defs.length > 0) { - // try to merge in assignments - for (var i = 0; i < self.body.length;) { - if (self.body[i] instanceof AST_SimpleStatement) { - var expr = self.body[i].body, sym, assign; - if (expr instanceof AST_Assign - && expr.operator == "=" - && (sym = expr.left) instanceof AST_Symbol - && vars.has(sym.name)) - { - var def = vars.get(sym.name); - if (def.value) break; - def.value = expr.right; - remove(defs, def); - defs.push(def); - self.body.splice(i, 1); - continue; - } - if (expr instanceof AST_Seq - && (assign = expr.car) instanceof AST_Assign - && assign.operator == "=" - && (sym = assign.left) instanceof AST_Symbol - && vars.has(sym.name)) - { - var def = vars.get(sym.name); - if (def.value) break; - def.value = assign.right; - remove(defs, def); - defs.push(def); - self.body[i].body = expr.cdr; - continue; - } - } - if (self.body[i] instanceof AST_EmptyStatement) { - self.body.splice(i, 1); - continue; - } - if (self.body[i] instanceof AST_BlockStatement) { - var tmp = [ i, 1 ].concat(self.body[i].body); - self.body.splice.apply(self.body, tmp); - continue; - } - break; - } - defs = make_node(AST_Var, self, { - definitions: defs - }); - hoisted.push(defs); - }; - } - self.body = dirs.concat(hoisted, self.body); - } - return self; - }); - - OPT(AST_SimpleStatement, function(self, compressor){ - if (compressor.option("side_effects")) { - if (!self.body.has_side_effects()) { - compressor.warn("Dropping side-effect-free statement [{file}:{line},{col}]", self.start); - return make_node(AST_EmptyStatement, self); - } - } - return self; - }); - - OPT(AST_DWLoop, function(self, compressor){ - var cond = self.condition.evaluate(compressor); - self.condition = cond[0]; - if (!compressor.option("loops")) return self; - if (cond.length > 1) { - if (cond[1]) { - return make_node(AST_For, self, { - body: self.body - }); - } else if (self instanceof AST_While) { - if (compressor.option("dead_code")) { - var a = []; - extract_declarations_from_unreachable_code(compressor, self.body, a); - return make_node(AST_BlockStatement, self, { body: a }); - } - } - } - return self; - }); - - function if_break_in_loop(self, compressor) { - function drop_it(rest) { - rest = as_statement_array(rest); - if (self.body instanceof AST_BlockStatement) { - self.body = self.body.clone(); - self.body.body = rest.concat(self.body.body.slice(1)); - self.body = self.body.transform(compressor); - } else { - self.body = make_node(AST_BlockStatement, self.body, { - body: rest - }).transform(compressor); - } - if_break_in_loop(self, compressor); - } - var first = self.body instanceof AST_BlockStatement ? self.body.body[0] : self.body; - if (first instanceof AST_If) { - if (first.body instanceof AST_Break - && compressor.loopcontrol_target(first.body.label) === self) { - if (self.condition) { - self.condition = make_node(AST_Binary, self.condition, { - left: self.condition, - operator: "&&", - right: first.condition.negate(compressor), - }); - } else { - self.condition = first.condition.negate(compressor); - } - drop_it(first.alternative); - } - else if (first.alternative instanceof AST_Break - && compressor.loopcontrol_target(first.alternative.label) === self) { - if (self.condition) { - self.condition = make_node(AST_Binary, self.condition, { - left: self.condition, - operator: "&&", - right: first.condition, - }); - } else { - self.condition = first.condition; - } - drop_it(first.body); - } - } - }; - - OPT(AST_While, function(self, compressor) { - if (!compressor.option("loops")) return self; - self = AST_DWLoop.prototype.optimize.call(self, compressor); - if (self instanceof AST_While) { - if_break_in_loop(self, compressor); - self = make_node(AST_For, self, self).transform(compressor); - } - return self; - }); - - OPT(AST_For, function(self, compressor){ - var cond = self.condition; - if (cond) { - cond = cond.evaluate(compressor); - self.condition = cond[0]; - } - if (!compressor.option("loops")) return self; - if (cond) { - if (cond.length > 1 && !cond[1]) { - if (compressor.option("dead_code")) { - var a = []; - if (self.init instanceof AST_Statement) { - a.push(self.init); - } - else if (self.init) { - a.push(make_node(AST_SimpleStatement, self.init, { - body: self.init - })); - } - extract_declarations_from_unreachable_code(compressor, self.body, a); - return make_node(AST_BlockStatement, self, { body: a }); - } - } - } - if_break_in_loop(self, compressor); - return self; - }); - - OPT(AST_If, function(self, compressor){ - if (!compressor.option("conditionals")) return self; - // if condition can be statically determined, warn and drop - // one of the blocks. note, statically determined implies - // “has no side effects”; also it doesn't work for cases like - // `x && true`, though it probably should. - var cond = self.condition.evaluate(compressor); - self.condition = cond[0]; - if (cond.length > 1) { - if (cond[1]) { - compressor.warn("Condition always true [{file}:{line},{col}]", self.condition.start); - if (compressor.option("dead_code")) { - var a = []; - if (self.alternative) { - extract_declarations_from_unreachable_code(compressor, self.alternative, a); - } - a.push(self.body); - return make_node(AST_BlockStatement, self, { body: a }).transform(compressor); - } - } else { - compressor.warn("Condition always false [{file}:{line},{col}]", self.condition.start); - if (compressor.option("dead_code")) { - var a = []; - extract_declarations_from_unreachable_code(compressor, self.body, a); - if (self.alternative) a.push(self.alternative); - return make_node(AST_BlockStatement, self, { body: a }).transform(compressor); - } - } - } - if (is_empty(self.alternative)) self.alternative = null; - var negated = self.condition.negate(compressor); - var negated_is_best = best_of(self.condition, negated) === negated; - if (self.alternative && negated_is_best) { - negated_is_best = false; // because we already do the switch here. - self.condition = negated; - var tmp = self.body; - self.body = self.alternative || make_node(AST_EmptyStatement); - self.alternative = tmp; - } - if (is_empty(self.body) && is_empty(self.alternative)) { - return make_node(AST_SimpleStatement, self.condition, { - body: self.condition - }).transform(compressor); - } - if (self.body instanceof AST_SimpleStatement - && self.alternative instanceof AST_SimpleStatement) { - return make_node(AST_SimpleStatement, self, { - body: make_node(AST_Conditional, self, { - condition : self.condition, - consequent : self.body.body, - alternative : self.alternative.body - }) - }).transform(compressor); - } - if (is_empty(self.alternative) && self.body instanceof AST_SimpleStatement) { - if (negated_is_best) return make_node(AST_SimpleStatement, self, { - body: make_node(AST_Binary, self, { - operator : "||", - left : negated, - right : self.body.body - }) - }).transform(compressor); - return make_node(AST_SimpleStatement, self, { - body: make_node(AST_Binary, self, { - operator : "&&", - left : self.condition, - right : self.body.body - }) - }).transform(compressor); - } - if (self.body instanceof AST_EmptyStatement - && self.alternative - && self.alternative instanceof AST_SimpleStatement) { - return make_node(AST_SimpleStatement, self, { - body: make_node(AST_Binary, self, { - operator : "||", - left : self.condition, - right : self.alternative.body - }) - }).transform(compressor); - } - if (self.body instanceof AST_Exit - && self.alternative instanceof AST_Exit - && self.body.TYPE == self.alternative.TYPE) { - return make_node(self.body.CTOR, self, { - value: make_node(AST_Conditional, self, { - condition : self.condition, - consequent : self.body.value || make_node(AST_Undefined, self.body).optimize(compressor), - alternative : self.alternative.value || make_node(AST_Undefined, self.alternative).optimize(compressor) - }) - }).transform(compressor); - } - if (self.body instanceof AST_If - && !self.body.alternative - && !self.alternative) { - self.condition = make_node(AST_Binary, self.condition, { - operator: "&&", - left: self.condition, - right: self.body.condition - }).transform(compressor); - self.body = self.body.body; - } - if (aborts(self.body)) { - if (self.alternative) { - var alt = self.alternative; - self.alternative = null; - return make_node(AST_BlockStatement, self, { - body: [ self, alt ] - }).transform(compressor); - } - } - if (aborts(self.alternative)) { - var body = self.body; - self.body = self.alternative; - self.condition = negated_is_best ? negated : self.condition.negate(compressor); - self.alternative = null; - return make_node(AST_BlockStatement, self, { - body: [ self, body ] - }).transform(compressor); - } - return self; - }); - - OPT(AST_Switch, function(self, compressor){ - if (self.body.length == 0 && compressor.option("conditionals")) { - return make_node(AST_SimpleStatement, self, { - body: self.expression - }).transform(compressor); - } - for(;;) { - var last_branch = self.body[self.body.length - 1]; - if (last_branch) { - var stat = last_branch.body[last_branch.body.length - 1]; // last statement - if (stat instanceof AST_Break && loop_body(compressor.loopcontrol_target(stat.label)) === self) - last_branch.body.pop(); - if (last_branch instanceof AST_Default && last_branch.body.length == 0) { - self.body.pop(); - continue; - } - } - break; - } - var exp = self.expression.evaluate(compressor); - out: if (exp.length == 2) try { - // constant expression - self.expression = exp[0]; - if (!compressor.option("dead_code")) break out; - var value = exp[1]; - var in_if = false; - var in_block = false; - var started = false; - var stopped = false; - var ruined = false; - var tt = new TreeTransformer(function(node, descend, in_list){ - if (node instanceof AST_Lambda || node instanceof AST_SimpleStatement) { - // no need to descend these node types - return node; - } - else if (node instanceof AST_Switch && node === self) { - node = node.clone(); - descend(node, this); - return ruined ? node : make_node(AST_BlockStatement, node, { - body: node.body.reduce(function(a, branch){ - return a.concat(branch.body); - }, []) - }).transform(compressor); - } - else if (node instanceof AST_If || node instanceof AST_Try) { - var save = in_if; - in_if = !in_block; - descend(node, this); - in_if = save; - return node; - } - else if (node instanceof AST_StatementWithBody || node instanceof AST_Switch) { - var save = in_block; - in_block = true; - descend(node, this); - in_block = save; - return node; - } - else if (node instanceof AST_Break && this.loopcontrol_target(node.label) === self) { - if (in_if) { - ruined = true; - return node; - } - if (in_block) return node; - stopped = true; - return in_list ? MAP.skip : make_node(AST_EmptyStatement, node); - } - else if (node instanceof AST_SwitchBranch && this.parent() === self) { - if (stopped) return MAP.skip; - if (node instanceof AST_Case) { - var exp = node.expression.evaluate(compressor); - if (exp.length < 2) { - // got a case with non-constant expression, baling out - throw self; - } - if (exp[1] === value || started) { - started = true; - if (aborts(node)) stopped = true; - descend(node, this); - return node; - } - return MAP.skip; - } - descend(node, this); - return node; - } - }); - tt.stack = compressor.stack.slice(); // so that's able to see parent nodes - self = self.transform(tt); - } catch(ex) { - if (ex !== self) throw ex; - } - return self; - }); - - OPT(AST_Case, function(self, compressor){ - self.body = tighten_body(self.body, compressor); - return self; - }); - - OPT(AST_Try, function(self, compressor){ - self.body = tighten_body(self.body, compressor); - return self; - }); - - AST_Definitions.DEFMETHOD("remove_initializers", function(){ - this.definitions.forEach(function(def){ def.value = null }); - }); - - AST_Definitions.DEFMETHOD("to_assignments", function(){ - var assignments = this.definitions.reduce(function(a, def){ - if (def.value) { - var name = make_node(AST_SymbolRef, def.name, def.name); - a.push(make_node(AST_Assign, def, { - operator : "=", - left : name, - right : def.value - })); - } - return a; - }, []); - if (assignments.length == 0) return null; - return AST_Seq.from_array(assignments); - }); - - OPT(AST_Definitions, function(self, compressor){ - if (self.definitions.length == 0) - return make_node(AST_EmptyStatement, self); - return self; - }); - - OPT(AST_Function, function(self, compressor){ - self = AST_Lambda.prototype.optimize.call(self, compressor); - if (compressor.option("unused")) { - if (self.name && self.name.unreferenced()) { - self.name = null; - } - } - return self; - }); - - OPT(AST_Call, function(self, compressor){ - if (compressor.option("unsafe")) { - var exp = self.expression; - if (exp instanceof AST_SymbolRef && exp.undeclared()) { - switch (exp.name) { - case "Array": - if (self.args.length != 1) { - return make_node(AST_Array, self, { - elements: self.args - }); - } - break; - case "Object": - if (self.args.length == 0) { - return make_node(AST_Object, self, { - properties: [] - }); - } - break; - case "String": - if (self.args.length == 0) return make_node(AST_String, self, { - value: "" - }); - return make_node(AST_Binary, self, { - left: self.args[0], - operator: "+", - right: make_node(AST_String, self, { value: "" }) - }); - case "Function": - if (all(self.args, function(x){ return x instanceof AST_String })) { - // quite a corner-case, but we can handle it: - // https://github.com/mishoo/UglifyJS2/issues/203 - // if the code argument is a constant, then we can minify it. - try { - var code = "(function(" + self.args.slice(0, -1).map(function(arg){ - return arg.value; - }).join(",") + "){" + self.args[self.args.length - 1].value + "})()"; - var ast = parse(code); - ast.figure_out_scope(); - var comp = new Compressor(compressor.options); - ast = ast.transform(comp); - ast.figure_out_scope(); - ast.mangle_names(); - var fun = ast.body[0].body.expression; - var args = fun.argnames.map(function(arg, i){ - return make_node(AST_String, self.args[i], { - value: arg.print_to_string() - }); - }); - var code = OutputStream(); - AST_BlockStatement.prototype._codegen.call(fun, fun, code); - code = code.toString().replace(/^\{|\}$/g, ""); - args.push(make_node(AST_String, self.args[self.args.length - 1], { - value: code - })); - self.args = args; - return self; - } catch(ex) { - if (ex instanceof JS_Parse_Error) { - compressor.warn("Error parsing code passed to new Function [{file}:{line},{col}]", self.args[self.args.length - 1].start); - compressor.warn(ex.toString()); - } else { - console.log(ex); - } - } - } - break; - } - } - else if (exp instanceof AST_Dot && exp.property == "toString" && self.args.length == 0) { - return make_node(AST_Binary, self, { - left: make_node(AST_String, self, { value: "" }), - operator: "+", - right: exp.expression - }).transform(compressor); - } - } - if (compressor.option("side_effects")) { - if (self.expression instanceof AST_Function - && self.args.length == 0 - && !AST_Block.prototype.has_side_effects.call(self.expression)) { - return make_node(AST_Undefined, self).transform(compressor); - } - } - return self; - }); - - OPT(AST_New, function(self, compressor){ - if (compressor.option("unsafe")) { - var exp = self.expression; - if (exp instanceof AST_SymbolRef && exp.undeclared()) { - switch (exp.name) { - case "Object": - case "RegExp": - case "Function": - case "Error": - case "Array": - return make_node(AST_Call, self, self).transform(compressor); - } - } - } - return self; - }); - - OPT(AST_Seq, function(self, compressor){ - if (!compressor.option("side_effects")) - return self; - if (!self.car.has_side_effects()) { - // we shouldn't compress (1,eval)(something) to - // eval(something) because that changes the meaning of - // eval (becomes lexical instead of global). - var p; - if (!(self.cdr instanceof AST_SymbolRef - && self.cdr.name == "eval" - && self.cdr.undeclared() - && (p = compressor.parent()) instanceof AST_Call - && p.expression === self)) { - return self.cdr; - } - } - if (compressor.option("cascade")) { - if (self.car instanceof AST_Assign - && !self.car.left.has_side_effects() - && self.car.left.equivalent_to(self.cdr)) { - return self.car; - } - if (!self.car.has_side_effects() - && !self.cdr.has_side_effects() - && self.car.equivalent_to(self.cdr)) { - return self.car; - } - } - return self; - }); - - AST_Unary.DEFMETHOD("lift_sequences", function(compressor){ - if (compressor.option("sequences")) { - if (this.expression instanceof AST_Seq) { - var seq = this.expression; - var x = seq.to_array(); - this.expression = x.pop(); - x.push(this); - seq = AST_Seq.from_array(x).transform(compressor); - return seq; - } - } - return this; - }); - - OPT(AST_UnaryPostfix, function(self, compressor){ - return self.lift_sequences(compressor); - }); - - OPT(AST_UnaryPrefix, function(self, compressor){ - self = self.lift_sequences(compressor); - var e = self.expression; - if (compressor.option("booleans") && compressor.in_boolean_context()) { - switch (self.operator) { - case "!": - if (e instanceof AST_UnaryPrefix && e.operator == "!") { - // !!foo ==> foo, if we're in boolean context - return e.expression; - } - break; - case "typeof": - // typeof always returns a non-empty string, thus it's - // always true in booleans - compressor.warn("Boolean expression always true [{file}:{line},{col}]", self.start); - return make_node(AST_True, self); - } - if (e instanceof AST_Binary && self.operator == "!") { - self = best_of(self, e.negate(compressor)); - } - } - return self.evaluate(compressor)[0]; - }); - - AST_Binary.DEFMETHOD("lift_sequences", function(compressor){ - if (compressor.option("sequences")) { - if (this.left instanceof AST_Seq) { - var seq = this.left; - var x = seq.to_array(); - this.left = x.pop(); - x.push(this); - seq = AST_Seq.from_array(x).transform(compressor); - return seq; - } - if (this.right instanceof AST_Seq - && !(this.operator == "||" || this.operator == "&&") - && !this.left.has_side_effects()) { - var seq = this.right; - var x = seq.to_array(); - this.right = x.pop(); - x.push(this); - seq = AST_Seq.from_array(x).transform(compressor); - return seq; - } - } - return this; - }); - - var commutativeOperators = makePredicate("== === != !== * & | ^"); - - OPT(AST_Binary, function(self, compressor){ - function reverse(op, force) { - if (force || !(self.left.has_side_effects() || self.right.has_side_effects())) { - if (op) self.operator = op; - var tmp = self.left; - self.left = self.right; - self.right = tmp; - } - }; - if (commutativeOperators(self.operator)) { - if (self.right instanceof AST_Constant - && !(self.left instanceof AST_Constant)) { - // if right is a constant, whatever side effects the - // left side might have could not influence the - // result. hence, force switch. - reverse(null, true); - } - } - self = self.lift_sequences(compressor); - if (compressor.option("comparisons")) switch (self.operator) { - case "===": - case "!==": - if ((self.left.is_string(compressor) && self.right.is_string(compressor)) || - (self.left.is_boolean() && self.right.is_boolean())) { - self.operator = self.operator.substr(0, 2); - } - // XXX: intentionally falling down to the next case - case "==": - case "!=": - if (self.left instanceof AST_String - && self.left.value == "undefined" - && self.right instanceof AST_UnaryPrefix - && self.right.operator == "typeof" - && compressor.option("unsafe")) { - if (!(self.right.expression instanceof AST_SymbolRef) - || !self.right.expression.undeclared()) { - self.right = self.right.expression; - self.left = make_node(AST_Undefined, self.left).optimize(compressor); - if (self.operator.length == 2) self.operator += "="; - } - } - break; - } - if (compressor.option("booleans") && compressor.in_boolean_context()) switch (self.operator) { - case "&&": - var ll = self.left.evaluate(compressor); - var rr = self.right.evaluate(compressor); - if ((ll.length > 1 && !ll[1]) || (rr.length > 1 && !rr[1])) { - compressor.warn("Boolean && always false [{file}:{line},{col}]", self.start); - return make_node(AST_False, self); - } - if (ll.length > 1 && ll[1]) { - return rr[0]; - } - if (rr.length > 1 && rr[1]) { - return ll[0]; - } - break; - case "||": - var ll = self.left.evaluate(compressor); - var rr = self.right.evaluate(compressor); - if ((ll.length > 1 && ll[1]) || (rr.length > 1 && rr[1])) { - compressor.warn("Boolean || always true [{file}:{line},{col}]", self.start); - return make_node(AST_True, self); - } - if (ll.length > 1 && !ll[1]) { - return rr[0]; - } - if (rr.length > 1 && !rr[1]) { - return ll[0]; - } - break; - case "+": - var ll = self.left.evaluate(compressor); - var rr = self.right.evaluate(compressor); - if ((ll.length > 1 && ll[0] instanceof AST_String && ll[1]) || - (rr.length > 1 && rr[0] instanceof AST_String && rr[1])) { - compressor.warn("+ in boolean context always true [{file}:{line},{col}]", self.start); - return make_node(AST_True, self); - } - break; - } - var exp = self.evaluate(compressor); - if (exp.length > 1) { - if (best_of(exp[0], self) !== self) - return exp[0]; - } - if (compressor.option("comparisons")) { - if (!(compressor.parent() instanceof AST_Binary) - || compressor.parent() instanceof AST_Assign) { - var negated = make_node(AST_UnaryPrefix, self, { - operator: "!", - expression: self.negate(compressor) - }); - self = best_of(self, negated); - } - switch (self.operator) { - case "<": reverse(">"); break; - case "<=": reverse(">="); break; - } - } - if (self.operator == "+" && self.right instanceof AST_String - && self.right.getValue() === "" && self.left instanceof AST_Binary - && self.left.operator == "+" && self.left.is_string(compressor)) { - return self.left; - } - return self; - }); - - OPT(AST_SymbolRef, function(self, compressor){ - if (self.undeclared()) { - var defines = compressor.option("global_defs"); - if (defines && defines.hasOwnProperty(self.name)) { - return make_node_from_constant(compressor, defines[self.name], self); - } - switch (self.name) { - case "undefined": - return make_node(AST_Undefined, self); - case "NaN": - return make_node(AST_NaN, self); - case "Infinity": - return make_node(AST_Infinity, self); - } - } - return self; - }); - - OPT(AST_Undefined, function(self, compressor){ - if (compressor.option("unsafe")) { - var scope = compressor.find_parent(AST_Scope); - var undef = scope.find_variable("undefined"); - if (undef) { - var ref = make_node(AST_SymbolRef, self, { - name : "undefined", - scope : scope, - thedef : undef - }); - ref.reference(); - return ref; - } - } - return self; - }); - - var ASSIGN_OPS = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ]; - OPT(AST_Assign, function(self, compressor){ - self = self.lift_sequences(compressor); - if (self.operator == "=" - && self.left instanceof AST_SymbolRef - && self.right instanceof AST_Binary - && self.right.left instanceof AST_SymbolRef - && self.right.left.name == self.left.name - && member(self.right.operator, ASSIGN_OPS)) { - self.operator = self.right.operator + "="; - self.right = self.right.right; - } - return self; - }); - - OPT(AST_Conditional, function(self, compressor){ - if (!compressor.option("conditionals")) return self; - if (self.condition instanceof AST_Seq) { - var car = self.condition.car; - self.condition = self.condition.cdr; - return AST_Seq.cons(car, self); - } - var cond = self.condition.evaluate(compressor); - if (cond.length > 1) { - if (cond[1]) { - compressor.warn("Condition always true [{file}:{line},{col}]", self.start); - return self.consequent; - } else { - compressor.warn("Condition always false [{file}:{line},{col}]", self.start); - return self.alternative; - } - } - var negated = cond[0].negate(compressor); - if (best_of(cond[0], negated) === negated) { - self = make_node(AST_Conditional, self, { - condition: negated, - consequent: self.alternative, - alternative: self.consequent - }); - } - var consequent = self.consequent; - var alternative = self.alternative; - if (consequent instanceof AST_Assign - && alternative instanceof AST_Assign - && consequent.operator == alternative.operator - && consequent.left.equivalent_to(alternative.left) - ) { - /* - * Stuff like this: - * if (foo) exp = something; else exp = something_else; - * ==> - * exp = foo ? something : something_else; - */ - self = make_node(AST_Assign, self, { - operator: consequent.operator, - left: consequent.left, - right: make_node(AST_Conditional, self, { - condition: self.condition, - consequent: consequent.right, - alternative: alternative.right - }) - }); - } - return self; - }); - - OPT(AST_Boolean, function(self, compressor){ - if (compressor.option("booleans")) { - var p = compressor.parent(); - if (p instanceof AST_Binary && (p.operator == "==" - || p.operator == "!=")) { - compressor.warn("Non-strict equality against boolean: {operator} {value} [{file}:{line},{col}]", { - operator : p.operator, - value : self.value, - file : p.start.file, - line : p.start.line, - col : p.start.col, - }); - return make_node(AST_Number, self, { - value: +self.value - }); - } - return make_node(AST_UnaryPrefix, self, { - operator: "!", - expression: make_node(AST_Number, self, { - value: 1 - self.value - }) - }); - } - return self; - }); - - OPT(AST_Sub, function(self, compressor){ - var prop = self.property; - if (prop instanceof AST_String && compressor.option("properties")) { - prop = prop.getValue(); - if ((compressor.option("screw_ie8") && RESERVED_WORDS(prop)) - || (!(RESERVED_WORDS(prop)) && is_identifier_string(prop))) { - return make_node(AST_Dot, self, { - expression : self.expression, - property : prop - }); - } - } - return self; - }); - - function literals_in_boolean_context(self, compressor) { - if (compressor.option("booleans") && compressor.in_boolean_context()) { - return make_node(AST_True, self); - } - return self; - }; - OPT(AST_Array, literals_in_boolean_context); - OPT(AST_Object, literals_in_boolean_context); - OPT(AST_RegExp, literals_in_boolean_context); - -})(); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/mozilla-ast.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/mozilla-ast.js deleted file mode 100644 index d795094..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/mozilla-ast.js +++ /dev/null @@ -1,267 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -(function(){ - - var MOZ_TO_ME = { - TryStatement : function(M) { - return new AST_Try({ - start : my_start_token(M), - end : my_end_token(M), - body : from_moz(M.block).body, - bcatch : from_moz(M.handlers[0]), - bfinally : M.finalizer ? new AST_Finally(from_moz(M.finalizer)) : null - }); - }, - CatchClause : function(M) { - return new AST_Catch({ - start : my_start_token(M), - end : my_end_token(M), - argname : from_moz(M.param), - body : from_moz(M.body).body - }); - }, - ObjectExpression : function(M) { - return new AST_Object({ - start : my_start_token(M), - end : my_end_token(M), - properties : M.properties.map(function(prop){ - var key = prop.key; - var name = key.type == "Identifier" ? key.name : key.value; - var args = { - start : my_start_token(key), - end : my_end_token(prop.value), - key : name, - value : from_moz(prop.value) - }; - switch (prop.kind) { - case "init": - return new AST_ObjectKeyVal(args); - case "set": - args.value.name = from_moz(key); - return new AST_ObjectSetter(args); - case "get": - args.value.name = from_moz(key); - return new AST_ObjectGetter(args); - } - }) - }); - }, - SequenceExpression : function(M) { - return AST_Seq.from_array(M.expressions.map(from_moz)); - }, - MemberExpression : function(M) { - return new (M.computed ? AST_Sub : AST_Dot)({ - start : my_start_token(M), - end : my_end_token(M), - property : M.computed ? from_moz(M.property) : M.property.name, - expression : from_moz(M.object) - }); - }, - SwitchCase : function(M) { - return new (M.test ? AST_Case : AST_Default)({ - start : my_start_token(M), - end : my_end_token(M), - expression : from_moz(M.test), - body : M.consequent.map(from_moz) - }); - }, - Literal : function(M) { - var val = M.value, args = { - start : my_start_token(M), - end : my_end_token(M) - }; - if (val === null) return new AST_Null(args); - switch (typeof val) { - case "string": - args.value = val; - return new AST_String(args); - case "number": - args.value = val; - return new AST_Number(args); - case "boolean": - return new (val ? AST_True : AST_False)(args); - default: - args.value = val; - return new AST_RegExp(args); - } - }, - UnaryExpression: From_Moz_Unary, - UpdateExpression: From_Moz_Unary, - Identifier: function(M) { - var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2]; - return new (M.name == "this" ? AST_This - : p.type == "LabeledStatement" ? AST_Label - : p.type == "VariableDeclarator" && p.id === M ? (p.kind == "const" ? AST_SymbolConst : AST_SymbolVar) - : p.type == "FunctionExpression" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg) - : p.type == "FunctionDeclaration" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg) - : p.type == "CatchClause" ? AST_SymbolCatch - : p.type == "BreakStatement" || p.type == "ContinueStatement" ? AST_LabelRef - : AST_SymbolRef)({ - start : my_start_token(M), - end : my_end_token(M), - name : M.name - }); - } - }; - - function From_Moz_Unary(M) { - var prefix = "prefix" in M ? M.prefix - : M.type == "UnaryExpression" ? true : false; - return new (prefix ? AST_UnaryPrefix : AST_UnaryPostfix)({ - start : my_start_token(M), - end : my_end_token(M), - operator : M.operator, - expression : from_moz(M.argument) - }); - }; - - var ME_TO_MOZ = {}; - - map("Node", AST_Node); - map("Program", AST_Toplevel, "body@body"); - map("Function", AST_Function, "id>name, params@argnames, body%body"); - map("EmptyStatement", AST_EmptyStatement); - map("BlockStatement", AST_BlockStatement, "body@body"); - map("ExpressionStatement", AST_SimpleStatement, "expression>body"); - map("IfStatement", AST_If, "test>condition, consequent>body, alternate>alternative"); - map("LabeledStatement", AST_LabeledStatement, "label>label, body>body"); - map("BreakStatement", AST_Break, "label>label"); - map("ContinueStatement", AST_Continue, "label>label"); - map("WithStatement", AST_With, "object>expression, body>body"); - map("SwitchStatement", AST_Switch, "discriminant>expression, cases@body"); - map("ReturnStatement", AST_Return, "argument>value"); - map("ThrowStatement", AST_Throw, "argument>value"); - map("WhileStatement", AST_While, "test>condition, body>body"); - map("DoWhileStatement", AST_Do, "test>condition, body>body"); - map("ForStatement", AST_For, "init>init, test>condition, update>step, body>body"); - map("ForInStatement", AST_ForIn, "left>init, right>object, body>body"); - map("DebuggerStatement", AST_Debugger); - map("FunctionDeclaration", AST_Defun, "id>name, params@argnames, body%body"); - map("VariableDeclaration", AST_Var, "declarations@definitions"); - map("VariableDeclarator", AST_VarDef, "id>name, init>value"); - - map("ThisExpression", AST_This); - map("ArrayExpression", AST_Array, "elements@elements"); - map("FunctionExpression", AST_Function, "id>name, params@argnames, body%body"); - map("BinaryExpression", AST_Binary, "operator=operator, left>left, right>right"); - map("AssignmentExpression", AST_Assign, "operator=operator, left>left, right>right"); - map("LogicalExpression", AST_Binary, "operator=operator, left>left, right>right"); - map("ConditionalExpression", AST_Conditional, "test>condition, consequent>consequent, alternate>alternative"); - map("NewExpression", AST_New, "callee>expression, arguments@args"); - map("CallExpression", AST_Call, "callee>expression, arguments@args"); - - /* -----[ tools ]----- */ - - function my_start_token(moznode) { - return new AST_Token({ - file : moznode.loc && moznode.loc.source, - line : moznode.loc && moznode.loc.start.line, - col : moznode.loc && moznode.loc.start.column, - pos : moznode.start, - endpos : moznode.start - }); - }; - - function my_end_token(moznode) { - return new AST_Token({ - file : moznode.loc && moznode.loc.source, - line : moznode.loc && moznode.loc.end.line, - col : moznode.loc && moznode.loc.end.column, - pos : moznode.end, - endpos : moznode.end - }); - }; - - function map(moztype, mytype, propmap) { - var moz_to_me = "function From_Moz_" + moztype + "(M){\n"; - moz_to_me += "return new mytype({\n" + - "start: my_start_token(M),\n" + - "end: my_end_token(M)"; - - if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop){ - var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop); - if (!m) throw new Error("Can't understand property map: " + prop); - var moz = "M." + m[1], how = m[2], my = m[3]; - moz_to_me += ",\n" + my + ": "; - if (how == "@") { - moz_to_me += moz + ".map(from_moz)"; - } else if (how == ">") { - moz_to_me += "from_moz(" + moz + ")"; - } else if (how == "=") { - moz_to_me += moz; - } else if (how == "%") { - moz_to_me += "from_moz(" + moz + ").body"; - } else throw new Error("Can't understand operator in propmap: " + prop); - }); - moz_to_me += "\n})}"; - - // moz_to_me = parse(moz_to_me).print_to_string({ beautify: true }); - // console.log(moz_to_me); - - moz_to_me = new Function("mytype", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")( - mytype, my_start_token, my_end_token, from_moz - ); - return MOZ_TO_ME[moztype] = moz_to_me; - }; - - var FROM_MOZ_STACK = null; - - function from_moz(node) { - FROM_MOZ_STACK.push(node); - var ret = node != null ? MOZ_TO_ME[node.type](node) : null; - FROM_MOZ_STACK.pop(); - return ret; - }; - - AST_Node.from_mozilla_ast = function(node){ - var save_stack = FROM_MOZ_STACK; - FROM_MOZ_STACK = []; - var ast = from_moz(node); - FROM_MOZ_STACK = save_stack; - return ast; - }; - -})(); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/output.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/output.js deleted file mode 100644 index 60a4a26..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/output.js +++ /dev/null @@ -1,1229 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -function OutputStream(options) { - - options = defaults(options, { - indent_start : 0, - indent_level : 4, - quote_keys : false, - space_colon : true, - ascii_only : false, - inline_script : false, - width : 80, - max_line_len : 32000, - ie_proof : true, - beautify : false, - source_map : null, - bracketize : false, - semicolons : true, - comments : false, - preserve_line : false, - negate_iife : !(options && options.beautify), - }, true); - - var indentation = 0; - var current_col = 0; - var current_line = 1; - var current_pos = 0; - var OUTPUT = ""; - - function to_ascii(str, identifier) { - return str.replace(/[\u0080-\uffff]/g, function(ch) { - var code = ch.charCodeAt(0).toString(16); - if (code.length <= 2 && !identifier) { - while (code.length < 2) code = "0" + code; - return "\\x" + code; - } else { - while (code.length < 4) code = "0" + code; - return "\\u" + code; - } - }); - }; - - function make_string(str) { - var dq = 0, sq = 0; - str = str.replace(/[\\\b\f\n\r\t\x22\x27\u2028\u2029\0]/g, function(s){ - switch (s) { - case "\\": return "\\\\"; - case "\b": return "\\b"; - case "\f": return "\\f"; - case "\n": return "\\n"; - case "\r": return "\\r"; - case "\u2028": return "\\u2028"; - case "\u2029": return "\\u2029"; - case '"': ++dq; return '"'; - case "'": ++sq; return "'"; - case "\0": return "\\0"; - } - return s; - }); - if (options.ascii_only) str = to_ascii(str); - if (dq > sq) return "'" + str.replace(/\x27/g, "\\'") + "'"; - else return '"' + str.replace(/\x22/g, '\\"') + '"'; - }; - - function encode_string(str) { - var ret = make_string(str); - if (options.inline_script) - ret = ret.replace(/<\x2fscript([>\/\t\n\f\r ])/gi, "<\\/script$1"); - return ret; - }; - - function make_name(name) { - name = name.toString(); - if (options.ascii_only) - name = to_ascii(name, true); - return name; - }; - - function make_indent(back) { - return repeat_string(" ", options.indent_start + indentation - back * options.indent_level); - }; - - /* -----[ beautification/minification ]----- */ - - var might_need_space = false; - var might_need_semicolon = false; - var last = null; - - function last_char() { - return last.charAt(last.length - 1); - }; - - function maybe_newline() { - if (options.max_line_len && current_col > options.max_line_len) - print("\n"); - }; - - var requireSemicolonChars = makePredicate("( [ + * / - , ."); - - function print(str) { - str = String(str); - var ch = str.charAt(0); - if (might_need_semicolon) { - if ((!ch || ";}".indexOf(ch) < 0) && !/[;]$/.test(last)) { - if (options.semicolons || requireSemicolonChars(ch)) { - OUTPUT += ";"; - current_col++; - current_pos++; - } else { - OUTPUT += "\n"; - current_pos++; - current_line++; - current_col = 0; - } - if (!options.beautify) - might_need_space = false; - } - might_need_semicolon = false; - maybe_newline(); - } - - if (!options.beautify && options.preserve_line && stack[stack.length - 1]) { - var target_line = stack[stack.length - 1].start.line; - while (current_line < target_line) { - OUTPUT += "\n"; - current_pos++; - current_line++; - current_col = 0; - might_need_space = false; - } - } - - if (might_need_space) { - var prev = last_char(); - if ((is_identifier_char(prev) - && (is_identifier_char(ch) || ch == "\\")) - || (/^[\+\-\/]$/.test(ch) && ch == prev)) - { - OUTPUT += " "; - current_col++; - current_pos++; - } - might_need_space = false; - } - var a = str.split(/\r?\n/), n = a.length - 1; - current_line += n; - if (n == 0) { - current_col += a[n].length; - } else { - current_col = a[n].length; - } - current_pos += str.length; - last = str; - OUTPUT += str; - }; - - var space = options.beautify ? function() { - print(" "); - } : function() { - might_need_space = true; - }; - - var indent = options.beautify ? function(half) { - if (options.beautify) { - print(make_indent(half ? 0.5 : 0)); - } - } : noop; - - var with_indent = options.beautify ? function(col, cont) { - if (col === true) col = next_indent(); - var save_indentation = indentation; - indentation = col; - var ret = cont(); - indentation = save_indentation; - return ret; - } : function(col, cont) { return cont() }; - - var newline = options.beautify ? function() { - print("\n"); - } : noop; - - var semicolon = options.beautify ? function() { - print(";"); - } : function() { - might_need_semicolon = true; - }; - - function force_semicolon() { - might_need_semicolon = false; - print(";"); - }; - - function next_indent() { - return indentation + options.indent_level; - }; - - function with_block(cont) { - var ret; - print("{"); - newline(); - with_indent(next_indent(), function(){ - ret = cont(); - }); - indent(); - print("}"); - return ret; - }; - - function with_parens(cont) { - print("("); - //XXX: still nice to have that for argument lists - //var ret = with_indent(current_col, cont); - var ret = cont(); - print(")"); - return ret; - }; - - function with_square(cont) { - print("["); - //var ret = with_indent(current_col, cont); - var ret = cont(); - print("]"); - return ret; - }; - - function comma() { - print(","); - space(); - }; - - function colon() { - print(":"); - if (options.space_colon) space(); - }; - - var add_mapping = options.source_map ? function(token, name) { - try { - if (token) options.source_map.add( - token.file || "?", - current_line, current_col, - token.line, token.col, - (!name && token.type == "name") ? token.value : name - ); - } catch(ex) { - AST_Node.warn("Couldn't figure out mapping for {file}:{line},{col} → {cline},{ccol} [{name}]", { - file: token.file, - line: token.line, - col: token.col, - cline: current_line, - ccol: current_col, - name: name || "" - }) - } - } : noop; - - function get() { - return OUTPUT; - }; - - var stack = []; - return { - get : get, - toString : get, - indent : indent, - indentation : function() { return indentation }, - current_width : function() { return current_col - indentation }, - should_break : function() { return options.width && this.current_width() >= options.width }, - newline : newline, - print : print, - space : space, - comma : comma, - colon : colon, - last : function() { return last }, - semicolon : semicolon, - force_semicolon : force_semicolon, - to_ascii : to_ascii, - print_name : function(name) { print(make_name(name)) }, - print_string : function(str) { print(encode_string(str)) }, - next_indent : next_indent, - with_indent : with_indent, - with_block : with_block, - with_parens : with_parens, - with_square : with_square, - add_mapping : add_mapping, - option : function(opt) { return options[opt] }, - line : function() { return current_line }, - col : function() { return current_col }, - pos : function() { return current_pos }, - push_node : function(node) { stack.push(node) }, - pop_node : function() { return stack.pop() }, - stack : function() { return stack }, - parent : function(n) { - return stack[stack.length - 2 - (n || 0)]; - } - }; - -}; - -/* -----[ code generators ]----- */ - -(function(){ - - /* -----[ utils ]----- */ - - function DEFPRINT(nodetype, generator) { - nodetype.DEFMETHOD("_codegen", generator); - }; - - AST_Node.DEFMETHOD("print", function(stream, force_parens){ - var self = this, generator = self._codegen; - stream.push_node(self); - var needs_parens = self.needs_parens(stream); - var fc = self instanceof AST_Function && stream.option("negate_iife"); - if (force_parens || (needs_parens && !fc)) { - stream.with_parens(function(){ - self.add_comments(stream); - self.add_source_map(stream); - generator(self, stream); - }); - } else { - self.add_comments(stream); - if (needs_parens && fc) stream.print("!"); - self.add_source_map(stream); - generator(self, stream); - } - stream.pop_node(); - }); - - AST_Node.DEFMETHOD("print_to_string", function(options){ - var s = OutputStream(options); - this.print(s); - return s.get(); - }); - - /* -----[ comments ]----- */ - - AST_Node.DEFMETHOD("add_comments", function(output){ - var c = output.option("comments"), self = this; - if (c) { - var start = self.start; - if (start && !start._comments_dumped) { - start._comments_dumped = true; - var comments = start.comments_before; - - // XXX: ugly fix for https://github.com/mishoo/UglifyJS2/issues/112 - // if this node is `return` or `throw`, we cannot allow comments before - // the returned or thrown value. - if (self instanceof AST_Exit && - self.value && self.value.start.comments_before.length > 0) { - comments = (comments || []).concat(self.value.start.comments_before); - self.value.start.comments_before = []; - } - - if (c.test) { - comments = comments.filter(function(comment){ - return c.test(comment.value); - }); - } else if (typeof c == "function") { - comments = comments.filter(function(comment){ - return c(self, comment); - }); - } - comments.forEach(function(c){ - if (c.type == "comment1") { - output.print("//" + c.value + "\n"); - output.indent(); - } - else if (c.type == "comment2") { - output.print("/*" + c.value + "*/"); - if (start.nlb) { - output.print("\n"); - output.indent(); - } else { - output.space(); - } - } - }); - } - } - }); - - /* -----[ PARENTHESES ]----- */ - - function PARENS(nodetype, func) { - nodetype.DEFMETHOD("needs_parens", func); - }; - - PARENS(AST_Node, function(){ - return false; - }); - - // a function expression needs parens around it when it's provably - // the first token to appear in a statement. - PARENS(AST_Function, function(output){ - return first_in_statement(output); - }); - - // same goes for an object literal, because otherwise it would be - // interpreted as a block of code. - PARENS(AST_Object, function(output){ - return first_in_statement(output); - }); - - PARENS(AST_Unary, function(output){ - var p = output.parent(); - return p instanceof AST_PropAccess && p.expression === this; - }); - - PARENS(AST_Seq, function(output){ - var p = output.parent(); - return p instanceof AST_Call // (foo, bar)() or foo(1, (2, 3), 4) - || p instanceof AST_Unary // !(foo, bar, baz) - || p instanceof AST_Binary // 1 + (2, 3) + 4 ==> 8 - || p instanceof AST_VarDef // var a = (1, 2), b = a + a; ==> b == 4 - || p instanceof AST_Dot // (1, {foo:2}).foo ==> 2 - || p instanceof AST_Array // [ 1, (2, 3), 4 ] ==> [ 1, 3, 4 ] - || p instanceof AST_ObjectProperty // { foo: (1, 2) }.foo ==> 2 - || p instanceof AST_Conditional /* (false, true) ? (a = 10, b = 20) : (c = 30) - * ==> 20 (side effect, set a := 10 and b := 20) */ - ; - }); - - PARENS(AST_Binary, function(output){ - var p = output.parent(); - // (foo && bar)() - if (p instanceof AST_Call && p.expression === this) - return true; - // typeof (foo && bar) - if (p instanceof AST_Unary) - return true; - // (foo && bar)["prop"], (foo && bar).prop - if (p instanceof AST_PropAccess && p.expression === this) - return true; - // this deals with precedence: 3 * (2 + 1) - if (p instanceof AST_Binary) { - var po = p.operator, pp = PRECEDENCE[po]; - var so = this.operator, sp = PRECEDENCE[so]; - if (pp > sp - || (pp == sp - && this === p.right - && !(so == po && - (so == "*" || - so == "&&" || - so == "||")))) { - return true; - } - } - }); - - PARENS(AST_PropAccess, function(output){ - var p = output.parent(); - if (p instanceof AST_New && p.expression === this) { - // i.e. new (foo.bar().baz) - // - // if there's one call into this subtree, then we need - // parens around it too, otherwise the call will be - // interpreted as passing the arguments to the upper New - // expression. - try { - this.walk(new TreeWalker(function(node){ - if (node instanceof AST_Call) throw p; - })); - } catch(ex) { - if (ex !== p) throw ex; - return true; - } - } - }); - - PARENS(AST_Call, function(output){ - var p = output.parent(); - return p instanceof AST_New && p.expression === this; - }); - - PARENS(AST_New, function(output){ - var p = output.parent(); - if (no_constructor_parens(this, output) - && (p instanceof AST_PropAccess // (new Date).getTime(), (new Date)["getTime"]() - || p instanceof AST_Call && p.expression === this)) // (new foo)(bar) - return true; - }); - - PARENS(AST_Number, function(output){ - var p = output.parent(); - if (this.getValue() < 0 && p instanceof AST_PropAccess && p.expression === this) - return true; - }); - - PARENS(AST_NaN, function(output){ - var p = output.parent(); - if (p instanceof AST_PropAccess && p.expression === this) - return true; - }); - - function assign_and_conditional_paren_rules(output) { - var p = output.parent(); - // !(a = false) → true - if (p instanceof AST_Unary) - return true; - // 1 + (a = 2) + 3 → 6, side effect setting a = 2 - if (p instanceof AST_Binary && !(p instanceof AST_Assign)) - return true; - // (a = func)() —or— new (a = Object)() - if (p instanceof AST_Call && p.expression === this) - return true; - // (a = foo) ? bar : baz - if (p instanceof AST_Conditional && p.condition === this) - return true; - // (a = foo)["prop"] —or— (a = foo).prop - if (p instanceof AST_PropAccess && p.expression === this) - return true; - }; - - PARENS(AST_Assign, assign_and_conditional_paren_rules); - PARENS(AST_Conditional, assign_and_conditional_paren_rules); - - /* -----[ PRINTERS ]----- */ - - DEFPRINT(AST_Directive, function(self, output){ - output.print_string(self.value); - output.semicolon(); - }); - DEFPRINT(AST_Debugger, function(self, output){ - output.print("debugger"); - output.semicolon(); - }); - - /* -----[ statements ]----- */ - - function display_body(body, is_toplevel, output) { - var last = body.length - 1; - body.forEach(function(stmt, i){ - if (!(stmt instanceof AST_EmptyStatement)) { - output.indent(); - stmt.print(output); - if (!(i == last && is_toplevel)) { - output.newline(); - if (is_toplevel) output.newline(); - } - } - }); - }; - - AST_StatementWithBody.DEFMETHOD("_do_print_body", function(output){ - force_statement(this.body, output); - }); - - DEFPRINT(AST_Statement, function(self, output){ - self.body.print(output); - output.semicolon(); - }); - DEFPRINT(AST_Toplevel, function(self, output){ - display_body(self.body, true, output); - output.print(""); - }); - DEFPRINT(AST_LabeledStatement, function(self, output){ - self.label.print(output); - output.colon(); - self.body.print(output); - }); - DEFPRINT(AST_SimpleStatement, function(self, output){ - self.body.print(output); - output.semicolon(); - }); - function print_bracketed(body, output) { - if (body.length > 0) output.with_block(function(){ - display_body(body, false, output); - }); - else output.print("{}"); - }; - DEFPRINT(AST_BlockStatement, function(self, output){ - print_bracketed(self.body, output); - }); - DEFPRINT(AST_EmptyStatement, function(self, output){ - output.semicolon(); - }); - DEFPRINT(AST_Do, function(self, output){ - output.print("do"); - output.space(); - self._do_print_body(output); - output.space(); - output.print("while"); - output.space(); - output.with_parens(function(){ - self.condition.print(output); - }); - output.semicolon(); - }); - DEFPRINT(AST_While, function(self, output){ - output.print("while"); - output.space(); - output.with_parens(function(){ - self.condition.print(output); - }); - output.space(); - self._do_print_body(output); - }); - DEFPRINT(AST_For, function(self, output){ - output.print("for"); - output.space(); - output.with_parens(function(){ - if (self.init) { - if (self.init instanceof AST_Definitions) { - self.init.print(output); - } else { - parenthesize_for_noin(self.init, output, true); - } - output.print(";"); - output.space(); - } else { - output.print(";"); - } - if (self.condition) { - self.condition.print(output); - output.print(";"); - output.space(); - } else { - output.print(";"); - } - if (self.step) { - self.step.print(output); - } - }); - output.space(); - self._do_print_body(output); - }); - DEFPRINT(AST_ForIn, function(self, output){ - output.print("for"); - output.space(); - output.with_parens(function(){ - self.init.print(output); - output.space(); - output.print("in"); - output.space(); - self.object.print(output); - }); - output.space(); - self._do_print_body(output); - }); - DEFPRINT(AST_With, function(self, output){ - output.print("with"); - output.space(); - output.with_parens(function(){ - self.expression.print(output); - }); - output.space(); - self._do_print_body(output); - }); - - /* -----[ functions ]----- */ - AST_Lambda.DEFMETHOD("_do_print", function(output, nokeyword){ - var self = this; - if (!nokeyword) { - output.print("function"); - } - if (self.name) { - output.space(); - self.name.print(output); - } - output.with_parens(function(){ - self.argnames.forEach(function(arg, i){ - if (i) output.comma(); - arg.print(output); - }); - }); - output.space(); - print_bracketed(self.body, output); - }); - DEFPRINT(AST_Lambda, function(self, output){ - self._do_print(output); - }); - - /* -----[ exits ]----- */ - AST_Exit.DEFMETHOD("_do_print", function(output, kind){ - output.print(kind); - if (this.value) { - output.space(); - this.value.print(output); - } - output.semicolon(); - }); - DEFPRINT(AST_Return, function(self, output){ - self._do_print(output, "return"); - }); - DEFPRINT(AST_Throw, function(self, output){ - self._do_print(output, "throw"); - }); - - /* -----[ loop control ]----- */ - AST_LoopControl.DEFMETHOD("_do_print", function(output, kind){ - output.print(kind); - if (this.label) { - output.space(); - this.label.print(output); - } - output.semicolon(); - }); - DEFPRINT(AST_Break, function(self, output){ - self._do_print(output, "break"); - }); - DEFPRINT(AST_Continue, function(self, output){ - self._do_print(output, "continue"); - }); - - /* -----[ if ]----- */ - function make_then(self, output) { - if (output.option("bracketize")) { - make_block(self.body, output); - return; - } - // 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. - if (!self.body) - return output.force_semicolon(); - if (self.body instanceof AST_Do - && output.option("ie_proof")) { - // 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 - make_block(self.body, output); - return; - } - var b = self.body; - while (true) { - if (b instanceof AST_If) { - if (!b.alternative) { - make_block(self.body, output); - return; - } - b = b.alternative; - } - else if (b instanceof AST_StatementWithBody) { - b = b.body; - } - else break; - } - force_statement(self.body, output); - }; - DEFPRINT(AST_If, function(self, output){ - output.print("if"); - output.space(); - output.with_parens(function(){ - self.condition.print(output); - }); - output.space(); - if (self.alternative) { - make_then(self, output); - output.space(); - output.print("else"); - output.space(); - force_statement(self.alternative, output); - } else { - self._do_print_body(output); - } - }); - - /* -----[ switch ]----- */ - DEFPRINT(AST_Switch, function(self, output){ - output.print("switch"); - output.space(); - output.with_parens(function(){ - self.expression.print(output); - }); - output.space(); - if (self.body.length > 0) output.with_block(function(){ - self.body.forEach(function(stmt, i){ - if (i) output.newline(); - output.indent(true); - stmt.print(output); - }); - }); - else output.print("{}"); - }); - AST_SwitchBranch.DEFMETHOD("_do_print_body", function(output){ - if (this.body.length > 0) { - output.newline(); - this.body.forEach(function(stmt){ - output.indent(); - stmt.print(output); - output.newline(); - }); - } - }); - DEFPRINT(AST_Default, function(self, output){ - output.print("default:"); - self._do_print_body(output); - }); - DEFPRINT(AST_Case, function(self, output){ - output.print("case"); - output.space(); - self.expression.print(output); - output.print(":"); - self._do_print_body(output); - }); - - /* -----[ exceptions ]----- */ - DEFPRINT(AST_Try, function(self, output){ - output.print("try"); - output.space(); - print_bracketed(self.body, output); - if (self.bcatch) { - output.space(); - self.bcatch.print(output); - } - if (self.bfinally) { - output.space(); - self.bfinally.print(output); - } - }); - DEFPRINT(AST_Catch, function(self, output){ - output.print("catch"); - output.space(); - output.with_parens(function(){ - self.argname.print(output); - }); - output.space(); - print_bracketed(self.body, output); - }); - DEFPRINT(AST_Finally, function(self, output){ - output.print("finally"); - output.space(); - print_bracketed(self.body, output); - }); - - /* -----[ var/const ]----- */ - AST_Definitions.DEFMETHOD("_do_print", function(output, kind){ - output.print(kind); - output.space(); - this.definitions.forEach(function(def, i){ - if (i) output.comma(); - def.print(output); - }); - var p = output.parent(); - var in_for = p instanceof AST_For || p instanceof AST_ForIn; - var avoid_semicolon = in_for && p.init === this; - if (!avoid_semicolon) - output.semicolon(); - }); - DEFPRINT(AST_Var, function(self, output){ - self._do_print(output, "var"); - }); - DEFPRINT(AST_Const, function(self, output){ - self._do_print(output, "const"); - }); - - function parenthesize_for_noin(node, output, noin) { - if (!noin) node.print(output); - else try { - // need to take some precautions here: - // https://github.com/mishoo/UglifyJS2/issues/60 - node.walk(new TreeWalker(function(node){ - if (node instanceof AST_Binary && node.operator == "in") - throw output; - })); - node.print(output); - } catch(ex) { - if (ex !== output) throw ex; - node.print(output, true); - } - }; - - DEFPRINT(AST_VarDef, function(self, output){ - self.name.print(output); - if (self.value) { - output.space(); - output.print("="); - output.space(); - var p = output.parent(1); - var noin = p instanceof AST_For || p instanceof AST_ForIn; - parenthesize_for_noin(self.value, output, noin); - } - }); - - /* -----[ other expressions ]----- */ - DEFPRINT(AST_Call, function(self, output){ - self.expression.print(output); - if (self instanceof AST_New && no_constructor_parens(self, output)) - return; - output.with_parens(function(){ - self.args.forEach(function(expr, i){ - if (i) output.comma(); - expr.print(output); - }); - }); - }); - DEFPRINT(AST_New, function(self, output){ - output.print("new"); - output.space(); - AST_Call.prototype._codegen(self, output); - }); - - AST_Seq.DEFMETHOD("_do_print", function(output){ - this.car.print(output); - if (this.cdr) { - output.comma(); - if (output.should_break()) { - output.newline(); - output.indent(); - } - this.cdr.print(output); - } - }); - DEFPRINT(AST_Seq, function(self, output){ - self._do_print(output); - // var p = output.parent(); - // if (p instanceof AST_Statement) { - // output.with_indent(output.next_indent(), function(){ - // self._do_print(output); - // }); - // } else { - // self._do_print(output); - // } - }); - DEFPRINT(AST_Dot, function(self, output){ - var expr = self.expression; - expr.print(output); - if (expr instanceof AST_Number && expr.getValue() >= 0) { - if (!/[xa-f.]/i.test(output.last())) { - output.print("."); - } - } - output.print("."); - // the name after dot would be mapped about here. - output.add_mapping(self.end); - output.print_name(self.property); - }); - DEFPRINT(AST_Sub, function(self, output){ - self.expression.print(output); - output.print("["); - self.property.print(output); - output.print("]"); - }); - DEFPRINT(AST_UnaryPrefix, function(self, output){ - var op = self.operator; - output.print(op); - if (/^[a-z]/i.test(op)) - output.space(); - self.expression.print(output); - }); - DEFPRINT(AST_UnaryPostfix, function(self, output){ - self.expression.print(output); - output.print(self.operator); - }); - DEFPRINT(AST_Binary, function(self, output){ - self.left.print(output); - output.space(); - output.print(self.operator); - output.space(); - self.right.print(output); - }); - DEFPRINT(AST_Conditional, function(self, output){ - self.condition.print(output); - output.space(); - output.print("?"); - output.space(); - self.consequent.print(output); - output.space(); - output.colon(); - self.alternative.print(output); - }); - - /* -----[ literals ]----- */ - DEFPRINT(AST_Array, function(self, output){ - output.with_square(function(){ - var a = self.elements, len = a.length; - if (len > 0) output.space(); - a.forEach(function(exp, i){ - if (i) output.comma(); - exp.print(output); - }); - if (len > 0) output.space(); - }); - }); - DEFPRINT(AST_Object, function(self, output){ - if (self.properties.length > 0) output.with_block(function(){ - self.properties.forEach(function(prop, i){ - if (i) { - output.print(","); - output.newline(); - } - output.indent(); - prop.print(output); - }); - output.newline(); - }); - else output.print("{}"); - }); - DEFPRINT(AST_ObjectKeyVal, function(self, output){ - var key = self.key; - if (output.option("quote_keys")) { - output.print_string(key + ""); - } else if ((typeof key == "number" - || !output.option("beautify") - && +key + "" == key) - && parseFloat(key) >= 0) { - output.print(make_num(key)); - } else if (!is_identifier(key)) { - output.print_string(key); - } else { - output.print_name(key); - } - output.colon(); - self.value.print(output); - }); - DEFPRINT(AST_ObjectSetter, function(self, output){ - output.print("set"); - self.value._do_print(output, true); - }); - DEFPRINT(AST_ObjectGetter, function(self, output){ - output.print("get"); - self.value._do_print(output, true); - }); - DEFPRINT(AST_Symbol, function(self, output){ - var def = self.definition(); - output.print_name(def ? def.mangled_name || def.name : self.name); - }); - DEFPRINT(AST_Undefined, function(self, output){ - output.print("void 0"); - }); - DEFPRINT(AST_Hole, noop); - DEFPRINT(AST_Infinity, function(self, output){ - output.print("1/0"); - }); - DEFPRINT(AST_NaN, function(self, output){ - output.print("0/0"); - }); - DEFPRINT(AST_This, function(self, output){ - output.print("this"); - }); - DEFPRINT(AST_Constant, function(self, output){ - output.print(self.getValue()); - }); - DEFPRINT(AST_String, function(self, output){ - output.print_string(self.getValue()); - }); - DEFPRINT(AST_Number, function(self, output){ - output.print(make_num(self.getValue())); - }); - DEFPRINT(AST_RegExp, function(self, output){ - var str = self.getValue().toString(); - if (output.option("ascii_only")) - str = output.to_ascii(str); - output.print(str); - var p = output.parent(); - if (p instanceof AST_Binary && /^in/.test(p.operator) && p.left === self) - output.print(" "); - }); - - function force_statement(stat, output) { - if (output.option("bracketize")) { - if (!stat || stat instanceof AST_EmptyStatement) - output.print("{}"); - else if (stat instanceof AST_BlockStatement) - stat.print(output); - else output.with_block(function(){ - output.indent(); - stat.print(output); - output.newline(); - }); - } else { - if (!stat || stat instanceof AST_EmptyStatement) - output.force_semicolon(); - else - stat.print(output); - } - }; - - // return true if the node at the top of the stack (that means the - // innermost node in the current output) is lexically the first in - // a statement. - function first_in_statement(output) { - var a = output.stack(), i = a.length, node = a[--i], p = a[--i]; - while (i > 0) { - if (p instanceof AST_Statement && p.body === node) - return true; - if ((p instanceof AST_Seq && p.car === node ) || - (p instanceof AST_Call && p.expression === node && !(p instanceof AST_New) ) || - (p instanceof AST_Dot && p.expression === node ) || - (p instanceof AST_Sub && p.expression === node ) || - (p instanceof AST_Conditional && p.condition === node ) || - (p instanceof AST_Binary && p.left === node ) || - (p instanceof AST_UnaryPostfix && p.expression === node )) - { - node = p; - p = a[--i]; - } else { - return false; - } - } - }; - - // self should be AST_New. decide if we want to show parens or not. - function no_constructor_parens(self, output) { - return self.args.length == 0 && !output.option("beautify"); - }; - - function best_of(a) { - var best = a[0], len = best.length; - for (var i = 1; i < a.length; ++i) { - if (a[i].length < len) { - best = a[i]; - len = best.length; - } - } - return best; - }; - - function make_num(num) { - var str = num.toString(10), a = [ str.replace(/^0\./, ".").replace('e+', 'e') ], m; - if (Math.floor(num) === num) { - if (num >= 0) { - a.push("0x" + num.toString(16).toLowerCase(), // probably pointless - "0" + num.toString(8)); // same. - } else { - 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); - }; - - function make_block(stmt, output) { - if (stmt instanceof AST_BlockStatement) { - stmt.print(output); - return; - } - output.with_block(function(){ - output.indent(); - stmt.print(output); - output.newline(); - }); - }; - - /* -----[ source map generators ]----- */ - - function DEFMAP(nodetype, generator) { - nodetype.DEFMETHOD("add_source_map", function(stream){ - generator(this, stream); - }); - }; - - // We could easily add info for ALL nodes, but it seems to me that - // would be quite wasteful, hence this noop in the base class. - DEFMAP(AST_Node, noop); - - function basic_sourcemap_gen(self, output) { - output.add_mapping(self.start); - }; - - // XXX: I'm not exactly sure if we need it for all of these nodes, - // or if we should add even more. - - DEFMAP(AST_Directive, basic_sourcemap_gen); - DEFMAP(AST_Debugger, basic_sourcemap_gen); - DEFMAP(AST_Symbol, basic_sourcemap_gen); - DEFMAP(AST_Jump, basic_sourcemap_gen); - DEFMAP(AST_StatementWithBody, basic_sourcemap_gen); - DEFMAP(AST_LabeledStatement, noop); // since the label symbol will mark it - DEFMAP(AST_Lambda, basic_sourcemap_gen); - DEFMAP(AST_Switch, basic_sourcemap_gen); - DEFMAP(AST_SwitchBranch, basic_sourcemap_gen); - DEFMAP(AST_BlockStatement, basic_sourcemap_gen); - DEFMAP(AST_Toplevel, noop); - DEFMAP(AST_New, basic_sourcemap_gen); - DEFMAP(AST_Try, basic_sourcemap_gen); - DEFMAP(AST_Catch, basic_sourcemap_gen); - DEFMAP(AST_Finally, basic_sourcemap_gen); - DEFMAP(AST_Definitions, basic_sourcemap_gen); - DEFMAP(AST_Constant, basic_sourcemap_gen); - DEFMAP(AST_ObjectProperty, function(self, output){ - output.add_mapping(self.start, self.key); - }); - -})(); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/parse.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/parse.js deleted file mode 100644 index e561ab6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/parse.js +++ /dev/null @@ -1,1410 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - Parser 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. - - ***********************************************************************/ - -"use strict"; - -var KEYWORDS = 'break case catch const continue debugger default delete do else finally for function if in instanceof new return switch throw try typeof var void while with'; -var KEYWORDS_ATOM = 'false null true'; -var RESERVED_WORDS = 'abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized this throws transient volatile' - + " " + KEYWORDS_ATOM + " " + KEYWORDS; -var KEYWORDS_BEFORE_EXPRESSION = 'return new delete throw else case'; - -KEYWORDS = makePredicate(KEYWORDS); -RESERVED_WORDS = makePredicate(RESERVED_WORDS); -KEYWORDS_BEFORE_EXPRESSION = makePredicate(KEYWORDS_BEFORE_EXPRESSION); -KEYWORDS_ATOM = makePredicate(KEYWORDS_ATOM); - -var OPERATOR_CHARS = makePredicate(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 = makePredicate([ - "in", - "instanceof", - "typeof", - "new", - "void", - "delete", - "++", - "--", - "+", - "-", - "!", - "~", - "&", - "|", - "^", - "*", - "/", - "%", - ">>", - "<<", - ">>>", - "<", - ">", - "<=", - ">=", - "==", - "===", - "!=", - "!==", - "?", - "=", - "+=", - "-=", - "/=", - "*=", - "%=", - ">>=", - "<<=", - ">>>=", - "|=", - "^=", - "&=", - "&&", - "||" -]); - -var WHITESPACE_CHARS = makePredicate(characters(" \u00a0\n\r\t\f\u000b\u200b\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000")); - -var PUNC_BEFORE_EXPRESSION = makePredicate(characters("[{(,.;:")); - -var PUNC_CHARS = makePredicate(characters("[]{}(),;:")); - -var REGEXP_MODIFIERS = makePredicate(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\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971\\u0972\\u097B-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8B\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10D0-\\u10FA\\u10FC\\u1100-\\u1159\\u115F-\\u11A2\\u11A8-\\u11F9\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u2094\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2C6F\\u2C71-\\u2C7D\\u2C80-\\u2CE4\\u2D00-\\u2D25\\u2D30-\\u2D65\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000-\\uA48C\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA65F\\uA662-\\uA66E\\uA67F-\\uA697\\uA717-\\uA71F\\uA722-\\uA788\\uA78B\\uA78C\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA90A-\\uA925\\uA930-\\uA946\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAC00\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"), - 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\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"), - 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-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"), - connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]") -}; - -function is_letter(code) { - return (code >= 97 && code <= 122) - || (code >= 65 && code <= 90) - || (code >= 0xaa && UNICODE.letter.test(String.fromCharCode(code))); -}; - -function is_digit(code) { - return code >= 48 && code <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9 -}; - -function is_alphanumeric_char(code) { - return is_digit(code) || is_letter(code); -}; - -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(name) { - return !RESERVED_WORDS(name) && /^[a-z_$][a-z0-9_$]*$/i.test(name); -}; - -function is_identifier_start(code) { - return code == 36 || code == 95 || is_letter(code); -}; - -function is_identifier_char(ch) { - var code = ch.charCodeAt(0); - return is_identifier_start(code) - || is_digit(code) - || code == 8204 // \u200c: zero-width non-joiner - || code == 8205 // \u200d: zero-width joiner (in my ECMA-262 PDF, this is also 200c) - || is_unicode_combining_mark(ch) - || is_unicode_connector_punctuation(ch) - ; -}; - -function is_identifier_string(str){ - var i = str.length; - if (i == 0) return false; - if (is_digit(str.charCodeAt(0))) return false; - while (--i >= 0) { - if (!is_identifier_char(str.charAt(i))) - return false; - } - return true; -}; - -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; - this.stack = new Error().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, filename, 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, filename) { - - var S = { - text : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/\uFEFF/g, ''), - filename : filename, - pos : 0, - tokpos : 0, - line : 1, - 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, in_string) { - var ch = S.text.charAt(S.pos++); - if (signal_eof && !ch) - throw EX_EOF; - if (ch == "\n") { - S.newline_before = S.newline_before || !in_string; - ++S.line; - S.col = 0; - } else { - ++S.col; - } - return ch; - }; - - 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" && !UNARY_POSTFIX[value]) || - (type == "keyword" && KEYWORDS_BEFORE_EXPRESSION(value)) || - (type == "punc" && PUNC_BEFORE_EXPRESSION(value))); - var ret = { - type : type, - value : value, - line : S.tokline, - col : S.tokcol, - pos : S.tokpos, - endpos : S.pos, - nlb : S.newline_before, - file : filename - }; - if (!is_comment) { - ret.comments_before = S.comments_before; - S.comments_before = []; - // make note of any newlines in the comments that came before - for (var i = 0, len = ret.comments_before.length; i < len; i++) { - ret.nlb = ret.nlb || ret.comments_before[i].nlb; - } - } - S.newline_before = false; - return new AST_Token(ret); - }; - - function skip_whitespace() { - while (WHITESPACE_CHARS(peek())) - next(); - }; - - function read_while(pred) { - var ret = "", ch, i = 0; - while ((ch = peek()) && pred(ch, i++)) - ret += next(); - return ret; - }; - - function parse_error(err) { - js_error(err, filename, 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){ - var code = ch.charCodeAt(0); - switch (code) { - case 120: case 88: // xX - return has_x ? false : (has_x = true); - case 101: case 69: // eE - return has_x ? true : has_e ? false : (has_e = after_e = true); - case 45: // - - return after_e || (i == 0 && !prefix); - case 43: // + - return after_e; - case (after_e = false, 46): // . - return (!has_dot && !has_x && !has_e) ? (has_dot = true) : false; - } - return is_alphanumeric_char(code); - }); - 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(in_string) { - var ch = next(true, in_string); - switch (ch.charCodeAt(0)) { - case 110 : return "\n"; - case 114 : return "\r"; - case 116 : return "\t"; - case 98 : return "\b"; - case 118 : return "\u000b"; // \v - case 102 : return "\f"; - case 48 : return "\0"; - case 120 : return String.fromCharCode(hex_bytes(2)); // \x - case 117 : return String.fromCharCode(hex_bytes(4)); // \u - case 10 : return ""; // newline - 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; - }; - - var read_string = with_eof_error("Unterminated string constant", function(){ - var quote = next(), ret = ""; - for (;;) { - var ch = next(true); - if (ch == "\\") { - // read OctalEscapeSequence (XXX: deprecated if "strict mode") - // https://github.com/mishoo/UglifyJS/issues/178 - var octal_len = 0, first = null; - ch = read_while(function(ch){ - if (ch >= "0" && ch <= "7") { - if (!first) { - first = ch; - return ++octal_len; - } - else if (first <= "3" && octal_len <= 2) return ++octal_len; - else if (first >= "4" && octal_len <= 1) return ++octal_len; - } - return false; - }); - if (octal_len > 0) ch = String.fromCharCode(parseInt(ch, 8)); - else ch = read_escaped_char(true); - } - 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); - }; - - var read_multiline_comment = with_eof_error("Unterminated multiline comment", function(){ - next(); - var i = find("*/", true); - var text = S.text.substring(S.pos, i); - var a = text.split("\n"), n = a.length; - // update stream position - S.pos = i + 2; - S.line += n - 1; - if (n > 1) S.col = a[n - 1].length; - else S.col += a[n - 1].length; - S.col += 2; - S.newline_before = S.newline_before || text.indexOf("\n") >= 0; - return token("comment2", text, true); - }); - - function read_name() { - var backslash = false, name = "", ch, escaped = false, hex; - while ((ch = peek()) != null) { - if (!backslash) { - if (ch == "\\") escaped = 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; - } - } - if (KEYWORDS(name) && escaped) { - hex = name.charCodeAt(0).toString(16).toUpperCase(); - name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1); - } - return name; - }; - - var read_regexp = with_eof_error("Unterminated regular expression", function(regexp){ - var prev_backslash = false, 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", new RegExp(regexp, mods)); - }); - - function read_operator(prefix) { - function grow(op) { - if (!peek()) return op; - var bigger = op + peek(); - if (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().charCodeAt(0)) - ? read_num(".") - : token("punc", "."); - }; - - function read_word() { - var word = read_name(); - return KEYWORDS_ATOM(word) ? token("atom", word) - : !KEYWORDS(word) ? token("name", word) - : OPERATORS(word) ? token("operator", word) - : token("keyword", word); - }; - - function with_eof_error(eof_error, cont) { - return function(x) { - try { - return cont(x); - } catch(ex) { - if (ex === EX_EOF) parse_error(eof_error); - else throw ex; - } - }; - }; - - function next_token(force_regexp) { - if (force_regexp != null) - return read_regexp(force_regexp); - skip_whitespace(); - start_token(); - var ch = peek(); - if (!ch) return token("eof"); - var code = ch.charCodeAt(0); - switch (code) { - case 34: case 39: return read_string(); - case 46: return handle_dot(); - case 47: return handle_slash(); - } - if (is_digit(code)) return read_num(); - if (PUNC_CHARS(ch)) return token("punc", next()); - if (OPERATOR_CHARS(ch)) return read_operator(); - if (code == 92 || is_identifier_start(code)) 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 = makePredicate([ - "typeof", - "void", - "delete", - "--", - "++", - "!", - "~", - "-", - "+" -]); - -var UNARY_POSTFIX = makePredicate([ "--", "++" ]); - -var ASSIGNMENT = makePredicate([ "=", "+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&=" ]); - -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 parse($TEXT, options) { - - options = defaults(options, { - strict : false, - filename : null, - toplevel : null, - expression : false - }); - - var S = { - input : typeof $TEXT == "string" ? tokenizer($TEXT, options.filename) : $TEXT, - token : null, - prev : null, - peeked : null, - in_function : 0, - in_directives : true, - 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(); - } - S.in_directives = S.in_directives && ( - S.token.type == "string" || is("punc", ";") - ); - return S.token; - }; - - function prev() { - return S.prev; - }; - - function croak(msg, line, col, pos) { - var ctx = S.input.context(); - js_error(msg, - ctx.filename, - 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 + " «" + S.token.value + "»" + ", expected " + type + " «" + val + "»"); - }; - - function expect(punc) { return expect_token("punc", punc); }; - - function can_insert_semicolon() { - return !options.strict && ( - S.token.nlb || is("eof") || is("punc", "}") - ); - }; - - function semicolon() { - if (is("punc", ";")) next(); - else if (!can_insert_semicolon()) unexpected(); - }; - - function parenthesised() { - expect("("); - var exp = expression(true); - expect(")"); - return exp; - }; - - function embed_tokens(parser) { - return function() { - var start = S.token; - var expr = parser(); - var end = prev(); - expr.start = start; - expr.end = end; - return expr; - }; - }; - - var statement = embed_tokens(function() { - var tmp; - if (is("operator", "/") || is("operator", "/=")) { - S.peeked = null; - S.token = S.input(S.token.value.substr(1)); // force regexp - } - switch (S.token.type) { - case "string": - var dir = S.in_directives, stat = simple_statement(); - // XXXv2: decide how to fix directives - if (dir && stat.body instanceof AST_String && !is("punc", ",")) - return new AST_Directive({ value: stat.body.value }); - return stat; - case "num": - case "regexp": - case "operator": - case "atom": - return simple_statement(); - - case "name": - return is_token(peek(), "punc", ":") - ? labeled_statement() - : simple_statement(); - - case "punc": - switch (S.token.value) { - case "{": - return new AST_BlockStatement({ - start : S.token, - body : block_(), - end : prev() - }); - case "[": - case "(": - return simple_statement(); - case ";": - next(); - return new AST_EmptyStatement(); - default: - unexpected(); - } - - case "keyword": - switch (tmp = S.token.value, next(), tmp) { - case "break": - return break_cont(AST_Break); - - case "continue": - return break_cont(AST_Continue); - - case "debugger": - semicolon(); - return new AST_Debugger(); - - case "do": - return new AST_Do({ - body : in_loop(statement), - condition : (expect_token("keyword", "while"), tmp = parenthesised(), semicolon(), tmp) - }); - - case "while": - return new AST_While({ - condition : parenthesised(), - 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 new AST_Return({ - value: ( is("punc", ";") - ? (next(), null) - : can_insert_semicolon() - ? null - : (tmp = expression(true), semicolon(), tmp) ) - }); - - case "switch": - return new AST_Switch({ - expression : parenthesised(), - body : in_loop(switch_body_) - }); - - case "throw": - if (S.token.nlb) - croak("Illegal newline after 'throw'"); - return new AST_Throw({ - value: (tmp = expression(true), semicolon(), tmp) - }); - - case "try": - return try_(); - - case "var": - return tmp = var_(), semicolon(), tmp; - - case "const": - return tmp = const_(), semicolon(), tmp; - - case "with": - return new AST_With({ - expression : parenthesised(), - body : statement() - }); - - default: - unexpected(); - } - } - }); - - function labeled_statement() { - var label = as_symbol(AST_Label); - if (find_if(function(l){ return l.name == label.name }, S.labels)) { - // ECMA-262, 12.12: An ECMAScript program is considered - // syntactically incorrect if it contains a - // LabelledStatement that is enclosed by a - // LabelledStatement with the same Identifier as label. - croak("Label " + label.name + " defined twice"); - } - expect(":"); - S.labels.push(label); - var stat = statement(); - S.labels.pop(); - return new AST_LabeledStatement({ body: stat, label: label }); - }; - - function simple_statement(tmp) { - return new AST_SimpleStatement({ body: (tmp = expression(true), semicolon(), tmp) }); - }; - - function break_cont(type) { - var label = null; - if (!can_insert_semicolon()) { - label = as_symbol(AST_LabelRef, true); - } - if (label != null) { - if (!find_if(function(l){ return l.name == label.name }, S.labels)) - croak("Undefined label " + label.name); - } - else if (S.in_loop == 0) - croak(type.TYPE + " not inside a loop or switch"); - semicolon(); - return new type({ label: label }); - }; - - function for_() { - expect("("); - var init = null; - if (!is("punc", ";")) { - init = is("keyword", "var") - ? (next(), var_(true)) - : expression(true, true); - if (is("operator", "in")) { - if (init instanceof AST_Var && init.definitions.length > 1) - croak("Only one variable declaration allowed in for..in loop"); - next(); - return for_in(init); - } - } - return regular_for(init); - }; - - function regular_for(init) { - expect(";"); - var test = is("punc", ";") ? null : expression(true); - expect(";"); - var step = is("punc", ")") ? null : expression(true); - expect(")"); - return new AST_For({ - init : init, - condition : test, - step : step, - body : in_loop(statement) - }); - }; - - function for_in(init) { - var lhs = init instanceof AST_Var ? init.definitions[0].name : null; - var obj = expression(true); - expect(")"); - return new AST_ForIn({ - init : init, - name : lhs, - object : obj, - body : in_loop(statement) - }); - }; - - var function_ = function(in_statement, ctor) { - var is_accessor = ctor === AST_Accessor; - var name = (is("name") ? as_symbol(in_statement - ? AST_SymbolDefun - : is_accessor - ? AST_SymbolAccessor - : AST_SymbolLambda) - : is_accessor && (is("string") || is("num")) ? as_atom_node() - : null); - if (in_statement && !name) - unexpected(); - expect("("); - if (!ctor) ctor = in_statement ? AST_Defun : AST_Function; - return new ctor({ - name: name, - argnames: (function(first, a){ - while (!is("punc", ")")) { - if (first) first = false; else expect(","); - a.push(as_symbol(AST_SymbolFunarg)); - } - next(); - return a; - })(true, []), - body: (function(loop, labels){ - ++S.in_function; - S.in_directives = true; - S.in_loop = 0; - S.labels = []; - var a = block_(); - --S.in_function; - S.in_loop = loop; - S.labels = labels; - return a; - })(S.in_loop, S.labels) - }); - }; - - function if_() { - var cond = parenthesised(), body = statement(), belse = null; - if (is("keyword", "else")) { - next(); - belse = statement(); - } - return new AST_If({ - condition : cond, - body : body, - alternative : belse - }); - }; - - function block_() { - expect("{"); - var a = []; - while (!is("punc", "}")) { - if (is("eof")) unexpected(); - a.push(statement()); - } - next(); - return a; - }; - - function switch_body_() { - expect("{"); - var a = [], cur = null, branch = null, tmp; - while (!is("punc", "}")) { - if (is("eof")) unexpected(); - if (is("keyword", "case")) { - if (branch) branch.end = prev(); - cur = []; - branch = new AST_Case({ - start : (tmp = S.token, next(), tmp), - expression : expression(true), - body : cur - }); - a.push(branch); - expect(":"); - } - else if (is("keyword", "default")) { - if (branch) branch.end = prev(); - cur = []; - branch = new AST_Default({ - start : (tmp = S.token, next(), expect(":"), tmp), - body : cur - }); - a.push(branch); - } - else { - if (!cur) unexpected(); - cur.push(statement()); - } - } - if (branch) branch.end = prev(); - next(); - return a; - }; - - function try_() { - var body = block_(), bcatch = null, bfinally = null; - if (is("keyword", "catch")) { - var start = S.token; - next(); - expect("("); - var name = as_symbol(AST_SymbolCatch); - expect(")"); - bcatch = new AST_Catch({ - start : start, - argname : name, - body : block_(), - end : prev() - }); - } - if (is("keyword", "finally")) { - var start = S.token; - next(); - bfinally = new AST_Finally({ - start : start, - body : block_(), - end : prev() - }); - } - if (!bcatch && !bfinally) - croak("Missing catch/finally blocks"); - return new AST_Try({ - body : body, - bcatch : bcatch, - bfinally : bfinally - }); - }; - - function vardefs(no_in, in_const) { - var a = []; - for (;;) { - a.push(new AST_VarDef({ - start : S.token, - name : as_symbol(in_const ? AST_SymbolConst : AST_SymbolVar), - value : is("operator", "=") ? (next(), expression(false, no_in)) : null, - end : prev() - })); - if (!is("punc", ",")) - break; - next(); - } - return a; - }; - - var var_ = function(no_in) { - return new AST_Var({ - start : prev(), - definitions : vardefs(no_in, false), - end : prev() - }); - }; - - var const_ = function() { - return new AST_Const({ - start : prev(), - definitions : vardefs(false, true), - end : prev() - }); - }; - - var new_ = function() { - var start = S.token; - expect_token("operator", "new"); - var newexp = expr_atom(false), args; - if (is("punc", "(")) { - next(); - args = expr_list(")"); - } else { - args = []; - } - return subscripts(new AST_New({ - start : start, - expression : newexp, - args : args, - end : prev() - }), true); - }; - - function as_atom_node() { - var tok = S.token, ret; - switch (tok.type) { - case "name": - return as_symbol(AST_SymbolRef); - case "num": - ret = new AST_Number({ start: tok, end: tok, value: tok.value }); - break; - case "string": - ret = new AST_String({ start: tok, end: tok, value: tok.value }); - break; - case "regexp": - ret = new AST_RegExp({ start: tok, end: tok, value: tok.value }); - break; - case "atom": - switch (tok.value) { - case "false": - ret = new AST_False({ start: tok, end: tok }); - break; - case "true": - ret = new AST_True({ start: tok, end: tok }); - break; - case "null": - ret = new AST_Null({ start: tok, end: tok }); - break; - } - break; - } - next(); - return ret; - }; - - var expr_atom = function(allow_calls) { - if (is("operator", "new")) { - return new_(); - } - var start = S.token; - if (is("punc")) { - switch (start.value) { - case "(": - next(); - var ex = expression(true); - ex.start = start; - ex.end = S.token; - expect(")"); - return subscripts(ex, allow_calls); - case "[": - return subscripts(array_(), allow_calls); - case "{": - return subscripts(object_(), allow_calls); - } - unexpected(); - } - if (is("keyword", "function")) { - next(); - var func = function_(false); - func.start = start; - func.end = prev(); - return subscripts(func, allow_calls); - } - if (ATOMIC_START_TOKEN[S.token.type]) { - return subscripts(as_atom_node(), 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(new AST_Hole({ start: S.token, end: S.token })); - } else { - a.push(expression(false)); - } - } - next(); - return a; - }; - - var array_ = embed_tokens(function() { - expect("["); - return new AST_Array({ - elements: expr_list("]", !options.strict, true) - }); - }); - - var object_ = embed_tokens(function() { - expect("{"); - var first = true, a = []; - while (!is("punc", "}")) { - if (first) first = false; else expect(","); - if (!options.strict && is("punc", "}")) - // allow trailing comma - break; - var start = S.token; - var type = start.type; - var name = as_property_name(); - if (type == "name" && !is("punc", ":")) { - if (name == "get") { - a.push(new AST_ObjectGetter({ - start : start, - key : name, - value : function_(false, AST_Accessor), - end : prev() - })); - continue; - } - if (name == "set") { - a.push(new AST_ObjectSetter({ - start : start, - key : name, - value : function_(false, AST_Accessor), - end : prev() - })); - continue; - } - } - expect(":"); - a.push(new AST_ObjectKeyVal({ - start : start, - key : name, - value : expression(false), - end : prev() - })); - } - next(); - return new AST_Object({ properties: a }); - }); - - function as_property_name() { - var tmp = S.token; - next(); - switch (tmp.type) { - case "num": - case "string": - case "name": - case "operator": - case "keyword": - case "atom": - return tmp.value; - default: - unexpected(); - } - }; - - function as_name() { - var tmp = S.token; - next(); - switch (tmp.type) { - case "name": - case "operator": - case "keyword": - case "atom": - return tmp.value; - default: - unexpected(); - } - }; - - function as_symbol(type, noerror) { - if (!is("name")) { - if (!noerror) croak("Name expected"); - return null; - } - var name = S.token.value; - var sym = new (name == "this" ? AST_This : type)({ - name : String(S.token.value), - start : S.token, - end : S.token - }); - next(); - return sym; - }; - - var subscripts = function(expr, allow_calls) { - var start = expr.start; - if (is("punc", ".")) { - next(); - return subscripts(new AST_Dot({ - start : start, - expression : expr, - property : as_name(), - end : prev() - }), allow_calls); - } - if (is("punc", "[")) { - next(); - var prop = expression(true); - expect("]"); - return subscripts(new AST_Sub({ - start : start, - expression : expr, - property : prop, - end : prev() - }), allow_calls); - } - if (allow_calls && is("punc", "(")) { - next(); - return subscripts(new AST_Call({ - start : start, - expression : expr, - args : expr_list(")"), - end : prev() - }), true); - } - return expr; - }; - - var maybe_unary = function(allow_calls) { - var start = S.token; - if (is("operator") && UNARY_PREFIX(start.value)) { - next(); - var ex = make_unary(AST_UnaryPrefix, start.value, maybe_unary(allow_calls)); - ex.start = start; - ex.end = prev(); - return ex; - } - var val = expr_atom(allow_calls); - while (is("operator") && UNARY_POSTFIX(S.token.value) && !S.token.nlb) { - val = make_unary(AST_UnaryPostfix, S.token.value, val); - val.start = start; - val.end = S.token; - next(); - } - return val; - }; - - function make_unary(ctor, op, expr) { - if ((op == "++" || op == "--") && !is_assignable(expr)) - croak("Invalid use of " + op + " operator"); - return new ctor({ operator: op, expression: expr }); - }; - - var expr_op = function(left, min_prec, no_in) { - var op = is("operator") ? S.token.value : null; - if (op == "in" && no_in) op = null; - var prec = op != null ? PRECEDENCE[op] : null; - if (prec != null && prec > min_prec) { - next(); - var right = expr_op(maybe_unary(true), prec, no_in); - return expr_op(new AST_Binary({ - start : left.start, - left : left, - operator : op, - right : right, - end : right.end - }), min_prec, no_in); - } - return left; - }; - - function expr_ops(no_in) { - return expr_op(maybe_unary(true), 0, no_in); - }; - - var maybe_conditional = function(no_in) { - var start = S.token; - var expr = expr_ops(no_in); - if (is("operator", "?")) { - next(); - var yes = expression(false); - expect(":"); - return new AST_Conditional({ - start : start, - condition : expr, - consequent : yes, - alternative : expression(false, no_in), - end : peek() - }); - } - return expr; - }; - - function is_assignable(expr) { - if (!options.strict) return true; - if (expr instanceof AST_This) return false; - return (expr instanceof AST_PropAccess || expr instanceof AST_Symbol); - }; - - var maybe_assign = function(no_in) { - var start = S.token; - var left = maybe_conditional(no_in), val = S.token.value; - if (is("operator") && ASSIGNMENT(val)) { - if (is_assignable(left)) { - next(); - return new AST_Assign({ - start : start, - left : left, - operator : val, - right : maybe_assign(no_in), - end : prev() - }); - } - croak("Invalid assignment"); - } - return left; - }; - - var expression = function(commas, no_in) { - var start = S.token; - var expr = maybe_assign(no_in); - if (commas && is("punc", ",")) { - next(); - return new AST_Seq({ - start : start, - car : expr, - cdr : expression(true, no_in), - end : peek() - }); - } - return expr; - }; - - function in_loop(cont) { - ++S.in_loop; - var ret = cont(); - --S.in_loop; - return ret; - }; - - if (options.expression) { - return expression(true); - } - - return (function(){ - var start = S.token; - var body = []; - while (!is("eof")) - body.push(statement()); - var end = prev(); - var toplevel = options.toplevel; - if (toplevel) { - toplevel.body = toplevel.body.concat(body); - toplevel.end = end; - } else { - toplevel = new AST_Toplevel({ start: start, body: body, end: end }); - } - return toplevel; - })(); - -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/scope.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/scope.js deleted file mode 100644 index d15cec7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/scope.js +++ /dev/null @@ -1,581 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -function SymbolDef(scope, index, orig) { - this.name = orig.name; - this.orig = [ orig ]; - this.scope = scope; - this.references = []; - this.global = false; - this.mangled_name = null; - this.undeclared = false; - this.constant = false; - this.index = index; -}; - -SymbolDef.prototype = { - unmangleable: function(options) { - return (this.global && !(options && options.toplevel)) - || this.undeclared - || (!(options && options.eval) && (this.scope.uses_eval || this.scope.uses_with)); - }, - mangle: function(options) { - if (!this.mangled_name && !this.unmangleable(options)) { - var s = this.scope; - if (this.orig[0] instanceof AST_SymbolLambda && !options.screw_ie8) - s = s.parent_scope; - this.mangled_name = s.next_mangled(options); - } - } -}; - -AST_Toplevel.DEFMETHOD("figure_out_scope", function(){ - // This does what ast_add_scope did in UglifyJS v1. - // - // Part of it could be done at parse time, but it would complicate - // the parser (and it's already kinda complex). It's also worth - // having it separated because we might need to call it multiple - // times on the same tree. - - // pass 1: setup scope chaining and handle definitions - var self = this; - var scope = self.parent_scope = null; - var labels = new Dictionary(); - var nesting = 0; - var tw = new TreeWalker(function(node, descend){ - if (node instanceof AST_Scope) { - node.init_scope_vars(nesting); - var save_scope = node.parent_scope = scope; - var save_labels = labels; - ++nesting; - scope = node; - labels = new Dictionary(); - descend(); - labels = save_labels; - scope = save_scope; - --nesting; - return true; // don't descend again in TreeWalker - } - if (node instanceof AST_Directive) { - node.scope = scope; - push_uniq(scope.directives, node.value); - return true; - } - if (node instanceof AST_With) { - for (var s = scope; s; s = s.parent_scope) - s.uses_with = true; - return; - } - if (node instanceof AST_LabeledStatement) { - var l = node.label; - if (labels.has(l.name)) - throw new Error(string_template("Label {name} defined twice", l)); - labels.set(l.name, l); - descend(); - labels.del(l.name); - return true; // no descend again - } - if (node instanceof AST_Symbol) { - node.scope = scope; - } - if (node instanceof AST_Label) { - node.thedef = node; - node.init_scope_vars(); - } - if (node instanceof AST_SymbolLambda) { - scope.def_function(node); - } - else if (node instanceof AST_SymbolDefun) { - // Careful here, the scope where this should be defined is - // the parent scope. The reason is that we enter a new - // scope when we encounter the AST_Defun node (which is - // instanceof AST_Scope) but we get to the symbol a bit - // later. - (node.scope = scope.parent_scope).def_function(node); - } - else if (node instanceof AST_SymbolVar - || node instanceof AST_SymbolConst) { - var def = scope.def_variable(node); - def.constant = node instanceof AST_SymbolConst; - def.init = tw.parent().value; - } - else if (node instanceof AST_SymbolCatch) { - // XXX: this is wrong according to ECMA-262 (12.4). the - // `catch` argument name should be visible only inside the - // catch block. For a quick fix AST_Catch should inherit - // from AST_Scope. Keeping it this way because of IE, - // which doesn't obey the standard. (it introduces the - // identifier in the enclosing scope) - scope.def_variable(node); - } - if (node instanceof AST_LabelRef) { - var sym = labels.get(node.name); - if (!sym) throw new Error(string_template("Undefined label {name} [{line},{col}]", { - name: node.name, - line: node.start.line, - col: node.start.col - })); - node.thedef = sym; - } - }); - self.walk(tw); - - // pass 2: find back references and eval - var func = null; - var globals = self.globals = new Dictionary(); - var tw = new TreeWalker(function(node, descend){ - if (node instanceof AST_Lambda) { - var prev_func = func; - func = node; - descend(); - func = prev_func; - return true; - } - if (node instanceof AST_LabelRef) { - node.reference(); - return true; - } - if (node instanceof AST_SymbolRef) { - var name = node.name; - var sym = node.scope.find_variable(name); - if (!sym) { - var g; - if (globals.has(name)) { - g = globals.get(name); - } else { - g = new SymbolDef(self, globals.size(), node); - g.undeclared = true; - g.global = true; - globals.set(name, g); - } - node.thedef = g; - if (name == "eval" && tw.parent() instanceof AST_Call) { - for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) - s.uses_eval = true; - } - if (name == "arguments") { - func.uses_arguments = true; - } - } else { - node.thedef = sym; - } - node.reference(); - return true; - } - }); - self.walk(tw); -}); - -AST_Scope.DEFMETHOD("init_scope_vars", function(nesting){ - this.directives = []; // contains the directives defined in this scope, i.e. "use strict" - this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions) - this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope) - this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement - this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval` - this.parent_scope = null; // the parent scope - this.enclosed = []; // a list of variables from this or outer scope(s) that are referenced from this or inner scopes - this.cname = -1; // the current index for mangling functions/variables - this.nesting = nesting; // the nesting level of this scope (0 means toplevel) -}); - -AST_Scope.DEFMETHOD("strict", function(){ - return this.has_directive("use strict"); -}); - -AST_Lambda.DEFMETHOD("init_scope_vars", function(){ - AST_Scope.prototype.init_scope_vars.apply(this, arguments); - this.uses_arguments = false; -}); - -AST_SymbolRef.DEFMETHOD("reference", function() { - var def = this.definition(); - def.references.push(this); - var s = this.scope; - while (s) { - push_uniq(s.enclosed, def); - if (s === def.scope) break; - s = s.parent_scope; - } - this.frame = this.scope.nesting - def.scope.nesting; -}); - -AST_Label.DEFMETHOD("init_scope_vars", function(){ - this.references = []; -}); - -AST_LabelRef.DEFMETHOD("reference", function(){ - this.thedef.references.push(this); -}); - -AST_Scope.DEFMETHOD("find_variable", function(name){ - if (name instanceof AST_Symbol) name = name.name; - return this.variables.get(name) - || (this.parent_scope && this.parent_scope.find_variable(name)); -}); - -AST_Scope.DEFMETHOD("has_directive", function(value){ - return this.parent_scope && this.parent_scope.has_directive(value) - || (this.directives.indexOf(value) >= 0 ? this : null); -}); - -AST_Scope.DEFMETHOD("def_function", function(symbol){ - this.functions.set(symbol.name, this.def_variable(symbol)); -}); - -AST_Scope.DEFMETHOD("def_variable", function(symbol){ - var def; - if (!this.variables.has(symbol.name)) { - def = new SymbolDef(this, this.variables.size(), symbol); - this.variables.set(symbol.name, def); - def.global = !this.parent_scope; - } else { - def = this.variables.get(symbol.name); - def.orig.push(symbol); - } - return symbol.thedef = def; -}); - -AST_Scope.DEFMETHOD("next_mangled", function(options){ - var ext = this.enclosed; - out: while (true) { - var m = base54(++this.cname); - if (!is_identifier(m)) continue; // skip over "do" - // we must ensure that the mangled name does not shadow a name - // from some parent scope that is referenced in this or in - // inner scopes. - for (var i = ext.length; --i >= 0;) { - var sym = ext[i]; - var name = sym.mangled_name || (sym.unmangleable(options) && sym.name); - if (m == name) continue out; - } - return m; - } -}); - -AST_Scope.DEFMETHOD("references", function(sym){ - if (sym instanceof AST_Symbol) sym = sym.definition(); - return this.enclosed.indexOf(sym) < 0 ? null : sym; -}); - -AST_Symbol.DEFMETHOD("unmangleable", function(options){ - return this.definition().unmangleable(options); -}); - -// property accessors are not mangleable -AST_SymbolAccessor.DEFMETHOD("unmangleable", function(){ - return true; -}); - -// labels are always mangleable -AST_Label.DEFMETHOD("unmangleable", function(){ - return false; -}); - -AST_Symbol.DEFMETHOD("unreferenced", function(){ - return this.definition().references.length == 0 - && !(this.scope.uses_eval || this.scope.uses_with); -}); - -AST_Symbol.DEFMETHOD("undeclared", function(){ - return this.definition().undeclared; -}); - -AST_LabelRef.DEFMETHOD("undeclared", function(){ - return false; -}); - -AST_Label.DEFMETHOD("undeclared", function(){ - return false; -}); - -AST_Symbol.DEFMETHOD("definition", function(){ - return this.thedef; -}); - -AST_Symbol.DEFMETHOD("global", function(){ - return this.definition().global; -}); - -AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){ - return defaults(options, { - except : [], - eval : false, - sort : false, - toplevel : false, - screw_ie8 : false - }); -}); - -AST_Toplevel.DEFMETHOD("mangle_names", function(options){ - options = this._default_mangler_options(options); - // We only need to mangle declaration nodes. Special logic wired - // into the code generator will display the mangled name if it's - // present (and for AST_SymbolRef-s it'll use the mangled name of - // the AST_SymbolDeclaration that it points to). - var lname = -1; - var to_mangle = []; - var tw = new TreeWalker(function(node, descend){ - if (node instanceof AST_LabeledStatement) { - // lname is incremented when we get to the AST_Label - var save_nesting = lname; - descend(); - lname = save_nesting; - return true; // don't descend again in TreeWalker - } - if (node instanceof AST_Scope) { - var p = tw.parent(), a = []; - node.variables.each(function(symbol){ - if (options.except.indexOf(symbol.name) < 0) { - a.push(symbol); - } - }); - if (options.sort) a.sort(function(a, b){ - return b.references.length - a.references.length; - }); - to_mangle.push.apply(to_mangle, a); - return; - } - if (node instanceof AST_Label) { - var name; - do name = base54(++lname); while (!is_identifier(name)); - node.mangled_name = name; - return true; - } - }); - this.walk(tw); - to_mangle.forEach(function(def){ def.mangle(options) }); -}); - -AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){ - options = this._default_mangler_options(options); - var tw = new TreeWalker(function(node){ - if (node instanceof AST_Constant) - base54.consider(node.print_to_string()); - else if (node instanceof AST_Return) - base54.consider("return"); - else if (node instanceof AST_Throw) - base54.consider("throw"); - else if (node instanceof AST_Continue) - base54.consider("continue"); - else if (node instanceof AST_Break) - base54.consider("break"); - else if (node instanceof AST_Debugger) - base54.consider("debugger"); - else if (node instanceof AST_Directive) - base54.consider(node.value); - else if (node instanceof AST_While) - base54.consider("while"); - else if (node instanceof AST_Do) - base54.consider("do while"); - else if (node instanceof AST_If) { - base54.consider("if"); - if (node.alternative) base54.consider("else"); - } - else if (node instanceof AST_Var) - base54.consider("var"); - else if (node instanceof AST_Const) - base54.consider("const"); - else if (node instanceof AST_Lambda) - base54.consider("function"); - else if (node instanceof AST_For) - base54.consider("for"); - else if (node instanceof AST_ForIn) - base54.consider("for in"); - else if (node instanceof AST_Switch) - base54.consider("switch"); - else if (node instanceof AST_Case) - base54.consider("case"); - else if (node instanceof AST_Default) - base54.consider("default"); - else if (node instanceof AST_With) - base54.consider("with"); - else if (node instanceof AST_ObjectSetter) - base54.consider("set" + node.key); - else if (node instanceof AST_ObjectGetter) - base54.consider("get" + node.key); - else if (node instanceof AST_ObjectKeyVal) - base54.consider(node.key); - else if (node instanceof AST_New) - base54.consider("new"); - else if (node instanceof AST_This) - base54.consider("this"); - else if (node instanceof AST_Try) - base54.consider("try"); - else if (node instanceof AST_Catch) - base54.consider("catch"); - else if (node instanceof AST_Finally) - base54.consider("finally"); - else if (node instanceof AST_Symbol && node.unmangleable(options)) - base54.consider(node.name); - else if (node instanceof AST_Unary || node instanceof AST_Binary) - base54.consider(node.operator); - else if (node instanceof AST_Dot) - base54.consider(node.property); - }); - this.walk(tw); - base54.sort(); -}); - -var base54 = (function() { - var string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_0123456789"; - var chars, frequency; - function reset() { - frequency = Object.create(null); - chars = string.split("").map(function(ch){ return ch.charCodeAt(0) }); - chars.forEach(function(ch){ frequency[ch] = 0 }); - } - base54.consider = function(str){ - for (var i = str.length; --i >= 0;) { - var code = str.charCodeAt(i); - if (code in frequency) ++frequency[code]; - } - }; - base54.sort = function() { - chars = mergeSort(chars, function(a, b){ - if (is_digit(a) && !is_digit(b)) return 1; - if (is_digit(b) && !is_digit(a)) return -1; - return frequency[b] - frequency[a]; - }); - }; - base54.reset = reset; - reset(); - base54.get = function(){ return chars }; - base54.freq = function(){ return frequency }; - function base54(num) { - var ret = "", base = 54; - do { - ret += String.fromCharCode(chars[num % base]); - num = Math.floor(num / base); - base = 64; - } while (num > 0); - return ret; - }; - return base54; -})(); - -AST_Toplevel.DEFMETHOD("scope_warnings", function(options){ - options = defaults(options, { - undeclared : false, // this makes a lot of noise - unreferenced : true, - assign_to_global : true, - func_arguments : true, - nested_defuns : true, - eval : true - }); - var tw = new TreeWalker(function(node){ - if (options.undeclared - && node instanceof AST_SymbolRef - && node.undeclared()) - { - // XXX: this also warns about JS standard names, - // i.e. Object, Array, parseInt etc. Should add a list of - // exceptions. - AST_Node.warn("Undeclared symbol: {name} [{file}:{line},{col}]", { - name: node.name, - file: node.start.file, - line: node.start.line, - col: node.start.col - }); - } - if (options.assign_to_global) - { - var sym = null; - if (node instanceof AST_Assign && node.left instanceof AST_SymbolRef) - sym = node.left; - else if (node instanceof AST_ForIn && node.init instanceof AST_SymbolRef) - sym = node.init; - if (sym - && (sym.undeclared() - || (sym.global() && sym.scope !== sym.definition().scope))) { - AST_Node.warn("{msg}: {name} [{file}:{line},{col}]", { - msg: sym.undeclared() ? "Accidental global?" : "Assignment to global", - name: sym.name, - file: sym.start.file, - line: sym.start.line, - col: sym.start.col - }); - } - } - if (options.eval - && node instanceof AST_SymbolRef - && node.undeclared() - && node.name == "eval") { - AST_Node.warn("Eval is used [{file}:{line},{col}]", node.start); - } - if (options.unreferenced - && (node instanceof AST_SymbolDeclaration || node instanceof AST_Label) - && node.unreferenced()) { - AST_Node.warn("{type} {name} is declared but not referenced [{file}:{line},{col}]", { - type: node instanceof AST_Label ? "Label" : "Symbol", - name: node.name, - file: node.start.file, - line: node.start.line, - col: node.start.col - }); - } - if (options.func_arguments - && node instanceof AST_Lambda - && node.uses_arguments) { - AST_Node.warn("arguments used in function {name} [{file}:{line},{col}]", { - name: node.name ? node.name.name : "anonymous", - file: node.start.file, - line: node.start.line, - col: node.start.col - }); - } - if (options.nested_defuns - && node instanceof AST_Defun - && !(tw.parent() instanceof AST_Scope)) { - AST_Node.warn("Function {name} declared in nested statement \"{type}\" [{file}:{line},{col}]", { - name: node.name.name, - type: tw.parent().TYPE, - file: node.start.file, - line: node.start.line, - col: node.start.col - }); - } - }); - this.walk(tw); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/sourcemap.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/sourcemap.js deleted file mode 100644 index 3429908..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/sourcemap.js +++ /dev/null @@ -1,81 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -// a small wrapper around fitzgen's source-map library -function SourceMap(options) { - options = defaults(options, { - file : null, - root : null, - orig : null, - }); - var generator = new MOZ_SourceMap.SourceMapGenerator({ - file : options.file, - sourceRoot : options.root - }); - var orig_map = options.orig && new MOZ_SourceMap.SourceMapConsumer(options.orig); - function add(source, gen_line, gen_col, orig_line, orig_col, name) { - if (orig_map) { - var info = orig_map.originalPositionFor({ - line: orig_line, - column: orig_col - }); - source = info.source; - orig_line = info.line; - orig_col = info.column; - name = info.name; - } - generator.addMapping({ - generated : { line: gen_line, column: gen_col }, - original : { line: orig_line, column: orig_col }, - source : source, - name : name - }); - }; - return { - add : add, - get : function() { return generator }, - toString : function() { return generator.toString() } - }; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/transform.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/transform.js deleted file mode 100644 index 7a61e5f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/transform.js +++ /dev/null @@ -1,217 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -// Tree transformer helpers. - -function TreeTransformer(before, after) { - TreeWalker.call(this); - this.before = before; - this.after = after; -} -TreeTransformer.prototype = new TreeWalker; - -(function(undefined){ - - function _(node, descend) { - node.DEFMETHOD("transform", function(tw, in_list){ - var x, y; - tw.push(this); - if (tw.before) x = tw.before(this, descend, in_list); - if (x === undefined) { - if (!tw.after) { - x = this; - descend(x, tw); - } else { - tw.stack[tw.stack.length - 1] = x = this.clone(); - descend(x, tw); - y = tw.after(x, in_list); - if (y !== undefined) x = y; - } - } - tw.pop(); - return x; - }); - }; - - function do_list(list, tw) { - return MAP(list, function(node){ - return node.transform(tw, true); - }); - }; - - _(AST_Node, noop); - - _(AST_LabeledStatement, function(self, tw){ - self.label = self.label.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_SimpleStatement, function(self, tw){ - self.body = self.body.transform(tw); - }); - - _(AST_Block, function(self, tw){ - self.body = do_list(self.body, tw); - }); - - _(AST_DWLoop, function(self, tw){ - self.condition = self.condition.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_For, function(self, tw){ - if (self.init) self.init = self.init.transform(tw); - if (self.condition) self.condition = self.condition.transform(tw); - if (self.step) self.step = self.step.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_ForIn, function(self, tw){ - self.init = self.init.transform(tw); - self.object = self.object.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_With, function(self, tw){ - self.expression = self.expression.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_Exit, function(self, tw){ - if (self.value) self.value = self.value.transform(tw); - }); - - _(AST_LoopControl, function(self, tw){ - if (self.label) self.label = self.label.transform(tw); - }); - - _(AST_If, function(self, tw){ - self.condition = self.condition.transform(tw); - self.body = self.body.transform(tw); - if (self.alternative) self.alternative = self.alternative.transform(tw); - }); - - _(AST_Switch, function(self, tw){ - self.expression = self.expression.transform(tw); - self.body = do_list(self.body, tw); - }); - - _(AST_Case, function(self, tw){ - self.expression = self.expression.transform(tw); - self.body = do_list(self.body, tw); - }); - - _(AST_Try, function(self, tw){ - self.body = do_list(self.body, tw); - if (self.bcatch) self.bcatch = self.bcatch.transform(tw); - if (self.bfinally) self.bfinally = self.bfinally.transform(tw); - }); - - _(AST_Catch, function(self, tw){ - self.argname = self.argname.transform(tw); - self.body = do_list(self.body, tw); - }); - - _(AST_Definitions, function(self, tw){ - self.definitions = do_list(self.definitions, tw); - }); - - _(AST_VarDef, function(self, tw){ - if (self.value) self.value = self.value.transform(tw); - }); - - _(AST_Lambda, function(self, tw){ - if (self.name) self.name = self.name.transform(tw); - self.argnames = do_list(self.argnames, tw); - self.body = do_list(self.body, tw); - }); - - _(AST_Call, function(self, tw){ - self.expression = self.expression.transform(tw); - self.args = do_list(self.args, tw); - }); - - _(AST_Seq, function(self, tw){ - self.car = self.car.transform(tw); - self.cdr = self.cdr.transform(tw); - }); - - _(AST_Dot, function(self, tw){ - self.expression = self.expression.transform(tw); - }); - - _(AST_Sub, function(self, tw){ - self.expression = self.expression.transform(tw); - self.property = self.property.transform(tw); - }); - - _(AST_Unary, function(self, tw){ - self.expression = self.expression.transform(tw); - }); - - _(AST_Binary, function(self, tw){ - self.left = self.left.transform(tw); - self.right = self.right.transform(tw); - }); - - _(AST_Conditional, function(self, tw){ - self.condition = self.condition.transform(tw); - self.consequent = self.consequent.transform(tw); - self.alternative = self.alternative.transform(tw); - }); - - _(AST_Array, function(self, tw){ - self.elements = do_list(self.elements, tw); - }); - - _(AST_Object, function(self, tw){ - self.properties = do_list(self.properties, tw); - }); - - _(AST_ObjectProperty, function(self, tw){ - self.value = self.value.transform(tw); - }); - -})(); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/utils.js deleted file mode 100644 index 73964a0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/utils.js +++ /dev/null @@ -1,295 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -function array_to_hash(a) { - var ret = Object.create(null); - 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 || 0); -}; - -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 find_if(func, array) { - for (var i = 0, n = array.length; i < n; ++i) { - if (func(array[i])) - return array[i]; - } -}; - -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 DefaultsError(msg, defs) { - this.msg = msg; - this.defs = defs; -}; - -function defaults(args, defs, croak) { - if (args === true) - args = {}; - var ret = args || {}; - if (croak) for (var i in ret) if (ret.hasOwnProperty(i) && !defs.hasOwnProperty(i)) - throw new DefaultsError("`" + i + "` is not a supported option", defs); - for (var i in defs) if (defs.hasOwnProperty(i)) { - ret[i] = (args && args.hasOwnProperty(i)) ? args[i] : defs[i]; - } - return ret; -}; - -function merge(obj, ext) { - for (var i in ext) if (ext.hasOwnProperty(i)) { - obj[i] = ext[i]; - } - return obj; -}; - -function noop() {}; - -var MAP = (function(){ - function MAP(a, f, backwards) { - var ret = [], top = [], i; - function doit() { - var val = f(a[i], i); - var is_last = val instanceof Last; - if (is_last) val = val.v; - if (val instanceof AtTop) { - val = val.v; - if (val instanceof Splice) { - top.push.apply(top, backwards ? val.v.slice().reverse() : val.v); - } else { - top.push(val); - } - } - else if (val !== skip) { - if (val instanceof Splice) { - ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v); - } else { - ret.push(val); - } - } - return is_last; - }; - if (a instanceof Array) { - if (backwards) { - for (i = a.length; --i >= 0;) if (doit()) break; - ret.reverse(); - top.reverse(); - } else { - for (i = 0; i < a.length; ++i) if (doit()) break; - } - } - else { - for (i in a) if (a.hasOwnProperty(i)) if (doit()) break; - } - return top.concat(ret); - }; - MAP.at_top = function(val) { return new AtTop(val) }; - MAP.splice = function(val) { return new Splice(val) }; - MAP.last = function(val) { return new Last(val) }; - var skip = MAP.skip = {}; - function AtTop(val) { this.v = val }; - function Splice(val) { this.v = val }; - function Last(val) { this.v = val }; - return MAP; -})(); - -function push_uniq(array, el) { - if (array.indexOf(el) < 0) - array.push(el); -}; - -function string_template(text, props) { - return text.replace(/\{(.+?)\}/g, function(str, p){ - return props[p]; - }); -}; - -function remove(array, el) { - for (var i = array.length; --i >= 0;) { - if (array[i] === el) array.splice(i, 1); - } -}; - -function mergeSort(array, cmp) { - if (array.length < 2) return array.slice(); - function merge(a, b) { - var r = [], ai = 0, bi = 0, i = 0; - while (ai < a.length && bi < b.length) { - cmp(a[ai], b[bi]) <= 0 - ? r[i++] = a[ai++] - : r[i++] = b[bi++]; - } - if (ai < a.length) r.push.apply(r, a.slice(ai)); - if (bi < b.length) r.push.apply(r, b.slice(bi)); - return r; - }; - function _ms(a) { - if (a.length <= 1) - return a; - var m = Math.floor(a.length / 2), left = a.slice(0, m), right = a.slice(m); - left = _ms(left); - right = _ms(right); - return merge(left, right); - }; - return _ms(array); -}; - -function set_difference(a, b) { - return a.filter(function(el){ - return b.indexOf(el) < 0; - }); -}; - -function set_intersection(a, b) { - return a.filter(function(el){ - return b.indexOf(el) >= 0; - }); -}; - -// this function is taken from Acorn [1], written by Marijn Haverbeke -// [1] https://github.com/marijnh/acorn -function makePredicate(words) { - if (!(words instanceof Array)) words = words.split(" "); - var f = "", cats = []; - out: for (var i = 0; i < words.length; ++i) { - for (var j = 0; j < cats.length; ++j) - if (cats[j][0].length == words[i].length) { - cats[j].push(words[i]); - continue out; - } - cats.push([words[i]]); - } - function compareTo(arr) { - if (arr.length == 1) return f += "return str === " + JSON.stringify(arr[0]) + ";"; - f += "switch(str){"; - for (var i = 0; i < arr.length; ++i) f += "case " + JSON.stringify(arr[i]) + ":"; - f += "return true}return false;"; - } - // When there are more than three length categories, an outer - // switch first dispatches on the lengths, to save on comparisons. - if (cats.length > 3) { - cats.sort(function(a, b) {return b.length - a.length;}); - f += "switch(str.length){"; - for (var i = 0; i < cats.length; ++i) { - var cat = cats[i]; - f += "case " + cat[0].length + ":"; - compareTo(cat); - } - f += "}"; - // Otherwise, simply generate a flat `switch` statement. - } else { - compareTo(words); - } - return new Function("str", f); -}; - -function all(array, predicate) { - for (var i = array.length; --i >= 0;) - if (!predicate(array[i])) - return false; - return true; -}; - -function Dictionary() { - this._values = Object.create(null); - this._size = 0; -}; -Dictionary.prototype = { - set: function(key, val) { - if (!this.has(key)) ++this._size; - this._values["$" + key] = val; - return this; - }, - add: function(key, val) { - if (this.has(key)) { - this.get(key).push(val); - } else { - this.set(key, [ val ]); - } - return this; - }, - get: function(key) { return this._values["$" + key] }, - del: function(key) { - if (this.has(key)) { - --this._size; - delete this._values["$" + key]; - } - return this; - }, - has: function(key) { return ("$" + key) in this._values }, - each: function(f) { - for (var i in this._values) - f(this._values[i], i.substr(1)); - }, - size: function() { - return this._size; - }, - map: function(f) { - var ret = []; - for (var i in this._values) - ret.push(f(this._values[i], i.substr(1))); - return ret; - } -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/LICENSE deleted file mode 100644 index b7f9d50..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Caolan McMahon - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/README.md deleted file mode 100644 index 951f76e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/README.md +++ /dev/null @@ -1,1425 +0,0 @@ -# Async.js - -Async is a utility module which provides straight-forward, powerful functions -for working with asynchronous JavaScript. Although originally designed for -use with [node.js](http://nodejs.org), it can also be used directly in the -browser. Also supports [component](https://github.com/component/component). - -Async provides around 20 functions that include the usual 'functional' -suspects (map, reduce, filter, each…) as well as some common patterns -for asynchronous control flow (parallel, series, waterfall…). All these -functions assume you follow the node.js convention of providing a single -callback as the last argument of your async function. - - -## Quick Examples - -```javascript -async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file -}); - -async.filter(['file1','file2','file3'], fs.exists, function(results){ - // results now equals an array of the existing files -}); - -async.parallel([ - function(){ ... }, - function(){ ... } -], callback); - -async.series([ - function(){ ... }, - function(){ ... } -]); -``` - -There are many more functions available so take a look at the docs below for a -full list. This module aims to be comprehensive, so if you feel anything is -missing please create a GitHub issue for it. - -## Common Pitfalls - -### Binding a context to an iterator - -This section is really about bind, not about async. If you are wondering how to -make async execute your iterators in a given context, or are confused as to why -a method of another library isn't working as an iterator, study this example: - -```js -// Here is a simple object with an (unnecessarily roundabout) squaring method -var AsyncSquaringLibrary = { - squareExponent: 2, - square: function(number, callback){ - var result = Math.pow(number, this.squareExponent); - setTimeout(function(){ - callback(null, result); - }, 200); - } -}; - -async.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){ - // result is [NaN, NaN, NaN] - // This fails because the `this.squareExponent` expression in the square - // function is not evaluated in the context of AsyncSquaringLibrary, and is - // therefore undefined. -}); - -async.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){ - // result is [1, 4, 9] - // With the help of bind we can attach a context to the iterator before - // passing it to async. Now the square function will be executed in its - // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent` - // will be as expected. -}); -``` - -## Download - -The source is available for download from -[GitHub](http://github.com/caolan/async). -Alternatively, you can install using Node Package Manager (npm): - - npm install async - -__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed - -## In the Browser - -So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage: - -```html - - -``` - -## Documentation - -### Collections - -* [each](#each) -* [eachSeries](#eachSeries) -* [eachLimit](#eachLimit) -* [map](#map) -* [mapSeries](#mapSeries) -* [mapLimit](#mapLimit) -* [filter](#filter) -* [filterSeries](#filterSeries) -* [reject](#reject) -* [rejectSeries](#rejectSeries) -* [reduce](#reduce) -* [reduceRight](#reduceRight) -* [detect](#detect) -* [detectSeries](#detectSeries) -* [sortBy](#sortBy) -* [some](#some) -* [every](#every) -* [concat](#concat) -* [concatSeries](#concatSeries) - -### Control Flow - -* [series](#series) -* [parallel](#parallel) -* [parallelLimit](#parallellimittasks-limit-callback) -* [whilst](#whilst) -* [doWhilst](#doWhilst) -* [until](#until) -* [doUntil](#doUntil) -* [forever](#forever) -* [waterfall](#waterfall) -* [compose](#compose) -* [applyEach](#applyEach) -* [applyEachSeries](#applyEachSeries) -* [queue](#queue) -* [cargo](#cargo) -* [auto](#auto) -* [iterator](#iterator) -* [apply](#apply) -* [nextTick](#nextTick) -* [times](#times) -* [timesSeries](#timesSeries) - -### Utils - -* [memoize](#memoize) -* [unmemoize](#unmemoize) -* [log](#log) -* [dir](#dir) -* [noConflict](#noConflict) - - -## Collections - - - -### each(arr, iterator, callback) - -Applies an iterator function to each item in an array, in parallel. -The iterator is called with an item from the list and a callback for when it -has finished. If the iterator passes an error to this callback, the main -callback for the each function is immediately called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err) which must be called once it has - completed. If no error has occured, the callback should be run without - arguments or with an explicit null argument. -* callback(err) - A callback which is called after all the iterator functions - have finished, or an error has occurred. - -__Example__ - -```js -// assuming openFiles is an array of file names and saveFile is a function -// to save the modified contents of that file: - -async.each(openFiles, saveFile, function(err){ - // if any of the saves produced an error, err would equal that error -}); -``` - ---------------------------------------- - - - -### eachSeries(arr, iterator, callback) - -The same as each only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. This means the iterator functions will complete in order. - - ---------------------------------------- - - - -### eachLimit(arr, limit, iterator, callback) - -The same as each only no more than "limit" iterators will be simultaneously -running at any time. - -Note that the items are not processed in batches, so there is no guarantee that - the first "limit" iterator functions will complete before any others are -started. - -__Arguments__ - -* arr - An array to iterate over. -* limit - The maximum number of iterators to run at any time. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err) which must be called once it has - completed. If no error has occured, the callback should be run without - arguments or with an explicit null argument. -* callback(err) - A callback which is called after all the iterator functions - have finished, or an error has occurred. - -__Example__ - -```js -// Assume documents is an array of JSON objects and requestApi is a -// function that interacts with a rate-limited REST api. - -async.eachLimit(documents, 20, requestApi, function(err){ - // if any of the saves produced an error, err would equal that error -}); -``` - ---------------------------------------- - - -### map(arr, iterator, callback) - -Produces a new array of values by mapping each value in the given array through -the iterator function. The iterator is called with an item from the array and a -callback for when it has finished processing. The callback takes 2 arguments, -an error and the transformed item from the array. If the iterator passes an -error to this callback, the main callback for the map function is immediately -called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order, however -the results array will be in the same order as the original array. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, transformed) which must be called once - it has completed with an error (which can be null) and a transformed item. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array of the - transformed items from the original array. - -__Example__ - -```js -async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file -}); -``` - ---------------------------------------- - - -### mapSeries(arr, iterator, callback) - -The same as map only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - - ---------------------------------------- - - -### mapLimit(arr, limit, iterator, callback) - -The same as map only no more than "limit" iterators will be simultaneously -running at any time. - -Note that the items are not processed in batches, so there is no guarantee that - the first "limit" iterator functions will complete before any others are -started. - -__Arguments__ - -* arr - An array to iterate over. -* limit - The maximum number of iterators to run at any time. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, transformed) which must be called once - it has completed with an error (which can be null) and a transformed item. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array of the - transformed items from the original array. - -__Example__ - -```js -async.mapLimit(['file1','file2','file3'], 1, fs.stat, function(err, results){ - // results is now an array of stats for each file -}); -``` - ---------------------------------------- - - -### filter(arr, iterator, callback) - -__Alias:__ select - -Returns a new array of all the values which pass an async truth test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like fs.exists. This operation is -performed in parallel, but the results array will be in the same order as the -original. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(results) - A callback which is called after all the iterator - functions have finished. - -__Example__ - -```js -async.filter(['file1','file2','file3'], fs.exists, function(results){ - // results now equals an array of the existing files -}); -``` - ---------------------------------------- - - -### filterSeries(arr, iterator, callback) - -__alias:__ selectSeries - -The same as filter only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - ---------------------------------------- - - -### reject(arr, iterator, callback) - -The opposite of filter. Removes values that pass an async truth test. - ---------------------------------------- - - -### rejectSeries(arr, iterator, callback) - -The same as reject, only the iterator is applied to each item in the array -in series. - - ---------------------------------------- - - -### reduce(arr, memo, iterator, callback) - -__aliases:__ inject, foldl - -Reduces a list of values into a single value using an async iterator to return -each successive step. Memo is the initial state of the reduction. This -function only operates in series. For performance reasons, it may make sense to -split a call to this function into a parallel map, then use the normal -Array.prototype.reduce on the results. This function is for situations where -each step in the reduction needs to be async, if you can get the data before -reducing it then it's probably a good idea to do so. - -__Arguments__ - -* arr - An array to iterate over. -* memo - The initial state of the reduction. -* iterator(memo, item, callback) - A function applied to each item in the - array to produce the next step in the reduction. The iterator is passed a - callback(err, reduction) which accepts an optional error as its first - argument, and the state of the reduction as the second. If an error is - passed to the callback, the reduction is stopped and the main callback is - immediately called with the error. -* callback(err, result) - A callback which is called after all the iterator - functions have finished. Result is the reduced value. - -__Example__ - -```js -async.reduce([1,2,3], 0, function(memo, item, callback){ - // pointless async: - process.nextTick(function(){ - callback(null, memo + item) - }); -}, function(err, result){ - // result is now equal to the last value of memo, which is 6 -}); -``` - ---------------------------------------- - - -### reduceRight(arr, memo, iterator, callback) - -__Alias:__ foldr - -Same as reduce, only operates on the items in the array in reverse order. - - ---------------------------------------- - - -### detect(arr, iterator, callback) - -Returns the first value in a list that passes an async truth test. The -iterator is applied in parallel, meaning the first iterator to return true will -fire the detect callback with that result. That means the result might not be -the first item in the original array (in terms of order) that passes the test. - -If order within the original array is important then look at detectSeries. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - the first item in the array that passes the truth test (iterator) or the - value undefined if none passed. - -__Example__ - -```js -async.detect(['file1','file2','file3'], fs.exists, function(result){ - // result now equals the first file in the list that exists -}); -``` - ---------------------------------------- - - -### detectSeries(arr, iterator, callback) - -The same as detect, only the iterator is applied to each item in the array -in series. This means the result is always the first in the original array (in -terms of array order) that passes the truth test. - - ---------------------------------------- - - -### sortBy(arr, iterator, callback) - -Sorts a list by the results of running each value through an async iterator. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, sortValue) which must be called once it - has completed with an error (which can be null) and a value to use as the sort - criteria. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is the items from - the original array sorted by the values returned by the iterator calls. - -__Example__ - -```js -async.sortBy(['file1','file2','file3'], function(file, callback){ - fs.stat(file, function(err, stats){ - callback(err, stats.mtime); - }); -}, function(err, results){ - // results is now the original array of files sorted by - // modified date -}); -``` - ---------------------------------------- - - -### some(arr, iterator, callback) - -__Alias:__ any - -Returns true if at least one element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like fs.exists. Once any iterator -call returns true, the main callback is immediately called. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - either true or false depending on the values of the async tests. - -__Example__ - -```js -async.some(['file1','file2','file3'], fs.exists, function(result){ - // if result is true then at least one of the files exists -}); -``` - ---------------------------------------- - - -### every(arr, iterator, callback) - -__Alias:__ all - -Returns true if every element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like fs.exists. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(result) - A callback which is called after all the iterator - functions have finished. Result will be either true or false depending on - the values of the async tests. - -__Example__ - -```js -async.every(['file1','file2','file3'], fs.exists, function(result){ - // if result is true then every file exists -}); -``` - ---------------------------------------- - - -### concat(arr, iterator, callback) - -Applies an iterator to each item in a list, concatenating the results. Returns the -concatenated list. The iterators are called in parallel, and the results are -concatenated as they return. There is no guarantee that the results array will -be returned in the original order of the arguments passed to the iterator function. - -__Arguments__ - -* arr - An array to iterate over -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, results) which must be called once it - has completed with an error (which can be null) and an array of results. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array containing - the concatenated results of the iterator function. - -__Example__ - -```js -async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){ - // files is now a list of filenames that exist in the 3 directories -}); -``` - ---------------------------------------- - - -### concatSeries(arr, iterator, callback) - -Same as async.concat, but executes in series instead of parallel. - - -## Control Flow - - -### series(tasks, [callback]) - -Run an array of functions in series, each one running once the previous -function has completed. If any functions in the series pass an error to its -callback, no more functions are run and the callback for the series is -immediately called with the value of the error. Once the tasks have completed, -the results are passed to the final callback as an array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.series. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback(err, result) it must call on completion with an error (which can - be null) and an optional result value. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - -__Example__ - -```js -async.series([ - function(callback){ - // do some stuff ... - callback(null, 'one'); - }, - function(callback){ - // do some more stuff ... - callback(null, 'two'); - } -], -// optional callback -function(err, results){ - // results is now equal to ['one', 'two'] -}); - - -// an example using an object instead of an array -async.series({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - } -}, -function(err, results) { - // results is now equal to: {one: 1, two: 2} -}); -``` - ---------------------------------------- - - -### parallel(tasks, [callback]) - -Run an array of functions in parallel, without waiting until the previous -function has completed. If any of the functions pass an error to its -callback, the main callback is immediately called with the value of the error. -Once the tasks have completed, the results are passed to the final callback as an -array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.parallel. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback(err, result) it must call on completion with an error (which can - be null) and an optional result value. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - -__Example__ - -```js -async.parallel([ - function(callback){ - setTimeout(function(){ - callback(null, 'one'); - }, 200); - }, - function(callback){ - setTimeout(function(){ - callback(null, 'two'); - }, 100); - } -], -// optional callback -function(err, results){ - // the results array will equal ['one','two'] even though - // the second function had a shorter timeout. -}); - - -// an example using an object instead of an array -async.parallel({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - } -}, -function(err, results) { - // results is now equals to: {one: 1, two: 2} -}); -``` - ---------------------------------------- - - -### parallelLimit(tasks, limit, [callback]) - -The same as parallel only the tasks are executed in parallel with a maximum of "limit" -tasks executing at any time. - -Note that the tasks are not executed in batches, so there is no guarantee that -the first "limit" tasks will complete before any others are started. - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback(err, result) it must call on completion with an error (which can - be null) and an optional result value. -* limit - The maximum number of tasks to run at any time. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - ---------------------------------------- - - -### whilst(test, fn, callback) - -Repeatedly call fn, while test returns true. Calls the callback when stopped, -or an error occurs. - -__Arguments__ - -* test() - synchronous truth test to perform before each execution of fn. -* fn(callback) - A function to call each time the test passes. The function is - passed a callback(err) which must be called once it has completed with an - optional error argument. -* callback(err) - A callback which is called after the test fails and repeated - execution of fn has stopped. - -__Example__ - -```js -var count = 0; - -async.whilst( - function () { return count < 5; }, - function (callback) { - count++; - setTimeout(callback, 1000); - }, - function (err) { - // 5 seconds have passed - } -); -``` - ---------------------------------------- - - -### doWhilst(fn, test, callback) - -The post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. - ---------------------------------------- - - -### until(test, fn, callback) - -Repeatedly call fn, until test returns true. Calls the callback when stopped, -or an error occurs. - -The inverse of async.whilst. - ---------------------------------------- - - -### doUntil(fn, test, callback) - -Like doWhilst except the test is inverted. Note the argument ordering differs from `until`. - ---------------------------------------- - - -### forever(fn, callback) - -Calls the asynchronous function 'fn' repeatedly, in series, indefinitely. -If an error is passed to fn's callback then 'callback' is called with the -error, otherwise it will never be called. - ---------------------------------------- - - -### waterfall(tasks, [callback]) - -Runs an array of functions in series, each passing their results to the next in -the array. However, if any of the functions pass an error to the callback, the -next function is not executed and the main callback is immediately called with -the error. - -__Arguments__ - -* tasks - An array of functions to run, each function is passed a - callback(err, result1, result2, ...) it must call on completion. The first - argument is an error (which can be null) and any further arguments will be - passed as arguments in order to the next task. -* callback(err, [results]) - An optional callback to run once all the functions - have completed. This will be passed the results of the last task's callback. - - - -__Example__ - -```js -async.waterfall([ - function(callback){ - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - callback(null, 'three'); - }, - function(arg1, callback){ - // arg1 now equals 'three' - callback(null, 'done'); - } -], function (err, result) { - // result now equals 'done' -}); -``` - ---------------------------------------- - -### compose(fn1, fn2...) - -Creates a function which is a composition of the passed asynchronous -functions. Each function consumes the return value of the function that -follows. Composing functions f(), g() and h() would produce the result of -f(g(h())), only this version uses callbacks to obtain the return values. - -Each function is executed with the `this` binding of the composed function. - -__Arguments__ - -* functions... - the asynchronous functions to compose - - -__Example__ - -```js -function add1(n, callback) { - setTimeout(function () { - callback(null, n + 1); - }, 10); -} - -function mul3(n, callback) { - setTimeout(function () { - callback(null, n * 3); - }, 10); -} - -var add1mul3 = async.compose(mul3, add1); - -add1mul3(4, function (err, result) { - // result now equals 15 -}); -``` - ---------------------------------------- - -### applyEach(fns, args..., callback) - -Applies the provided arguments to each function in the array, calling the -callback after all functions have completed. If you only provide the first -argument then it will return a function which lets you pass in the -arguments as if it were a single function call. - -__Arguments__ - -* fns - the asynchronous functions to all call with the same arguments -* args... - any number of separate arguments to pass to the function -* callback - the final argument should be the callback, called when all - functions have completed processing - - -__Example__ - -```js -async.applyEach([enableSearch, updateSchema], 'bucket', callback); - -// partial application example: -async.each( - buckets, - async.applyEach([enableSearch, updateSchema]), - callback -); -``` - ---------------------------------------- - - -### applyEachSeries(arr, iterator, callback) - -The same as applyEach only the functions are applied in series. - ---------------------------------------- - - -### queue(worker, concurrency) - -Creates a queue object with the specified concurrency. Tasks added to the -queue will be processed in parallel (up to the concurrency limit). If all -workers are in progress, the task is queued until one is available. Once -a worker has completed a task, the task's callback is called. - -__Arguments__ - -* worker(task, callback) - An asynchronous function for processing a queued - task, which must call its callback(err) argument when finished, with an - optional error as an argument. -* concurrency - An integer for determining how many worker functions should be - run in parallel. - -__Queue objects__ - -The queue object returned by this function has the following properties and -methods: - -* length() - a function returning the number of items waiting to be processed. -* concurrency - an integer for determining how many worker functions should be - run in parallel. This property can be changed after a queue is created to - alter the concurrency on-the-fly. -* push(task, [callback]) - add a new task to the queue, the callback is called - once the worker has finished processing the task. - instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list. -* unshift(task, [callback]) - add a new task to the front of the queue. -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued -* empty - a callback that is called when the last item from the queue is given to a worker -* drain - a callback that is called when the last item from the queue has returned from the worker - -__Example__ - -```js -// create a queue object with concurrency 2 - -var q = async.queue(function (task, callback) { - console.log('hello ' + task.name); - callback(); -}, 2); - - -// assign a callback -q.drain = function() { - console.log('all items have been processed'); -} - -// add some items to the queue - -q.push({name: 'foo'}, function (err) { - console.log('finished processing foo'); -}); -q.push({name: 'bar'}, function (err) { - console.log('finished processing bar'); -}); - -// add some items to the queue (batch-wise) - -q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) { - console.log('finished processing bar'); -}); - -// add some items to the front of the queue - -q.unshift({name: 'bar'}, function (err) { - console.log('finished processing bar'); -}); -``` - ---------------------------------------- - - -### cargo(worker, [payload]) - -Creates a cargo object with the specified payload. Tasks added to the -cargo will be processed altogether (up to the payload limit). If the -worker is in progress, the task is queued until it is available. Once -the worker has completed some tasks, each callback of those tasks is called. - -__Arguments__ - -* worker(tasks, callback) - An asynchronous function for processing an array of - queued tasks, which must call its callback(err) argument when finished, with - an optional error as an argument. -* payload - An optional integer for determining how many tasks should be - processed per round; if omitted, the default is unlimited. - -__Cargo objects__ - -The cargo object returned by this function has the following properties and -methods: - -* length() - a function returning the number of items waiting to be processed. -* payload - an integer for determining how many tasks should be - process per round. This property can be changed after a cargo is created to - alter the payload on-the-fly. -* push(task, [callback]) - add a new task to the queue, the callback is called - once the worker has finished processing the task. - instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list. -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued -* empty - a callback that is called when the last item from the queue is given to a worker -* drain - a callback that is called when the last item from the queue has returned from the worker - -__Example__ - -```js -// create a cargo object with payload 2 - -var cargo = async.cargo(function (tasks, callback) { - for(var i=0; i -### auto(tasks, [callback]) - -Determines the best order for running functions based on their requirements. -Each function can optionally depend on other functions being completed first, -and each function is run as soon as its requirements are satisfied. If any of -the functions pass an error to their callback, that function will not complete -(so any other functions depending on it will not run) and the main callback -will be called immediately with the error. Functions also receive an object -containing the results of functions which have completed so far. - -Note, all functions are called with a results object as a second argument, -so it is unsafe to pass functions in the tasks object which cannot handle the -extra argument. For example, this snippet of code: - -```js -async.auto({ - readData: async.apply(fs.readFile, 'data.txt', 'utf-8') -}, callback); -``` - -will have the effect of calling readFile with the results object as the last -argument, which will fail: - -```js -fs.readFile('data.txt', 'utf-8', cb, {}); -``` - -Instead, wrap the call to readFile in a function which does not forward the -results object: - -```js -async.auto({ - readData: function(cb, results){ - fs.readFile('data.txt', 'utf-8', cb); - } -}, callback); -``` - -__Arguments__ - -* tasks - An object literal containing named functions or an array of - requirements, with the function itself the last item in the array. The key - used for each function or array is used when specifying requirements. The - function receives two arguments: (1) a callback(err, result) which must be - called when finished, passing an error (which can be null) and the result of - the function's execution, and (2) a results object, containing the results of - the previously executed functions. -* callback(err, results) - An optional callback which is called when all the - tasks have been completed. The callback will receive an error as an argument - if any tasks pass an error to their callback. Results will always be passed - but if an error occurred, no other tasks will be performed, and the results - object will only contain partial results. - - -__Example__ - -```js -async.auto({ - get_data: function(callback){ - // async code to get some data - }, - make_folder: function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - }, - write_file: ['get_data', 'make_folder', function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - callback(null, filename); - }], - email_link: ['write_file', function(callback, results){ - // once the file is written let's email a link to it... - // results.write_file contains the filename returned by write_file. - }] -}); -``` - -This is a fairly trivial example, but to do this using the basic parallel and -series functions would look like this: - -```js -async.parallel([ - function(callback){ - // async code to get some data - }, - function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - } -], -function(err, results){ - async.series([ - function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - }, - function(callback){ - // once the file is written let's email a link to it... - } - ]); -}); -``` - -For a complicated series of async tasks using the auto function makes adding -new tasks much easier and makes the code more readable. - - ---------------------------------------- - - -### iterator(tasks) - -Creates an iterator function which calls the next function in the array, -returning a continuation to call the next one after that. It's also possible to -'peek' the next iterator by doing iterator.next(). - -This function is used internally by the async module but can be useful when -you want to manually control the flow of functions in series. - -__Arguments__ - -* tasks - An array of functions to run. - -__Example__ - -```js -var iterator = async.iterator([ - function(){ sys.p('one'); }, - function(){ sys.p('two'); }, - function(){ sys.p('three'); } -]); - -node> var iterator2 = iterator(); -'one' -node> var iterator3 = iterator2(); -'two' -node> iterator3(); -'three' -node> var nextfn = iterator2.next(); -node> nextfn(); -'three' -``` - ---------------------------------------- - - -### apply(function, arguments..) - -Creates a continuation function with some arguments already applied, a useful -shorthand when combined with other control flow functions. Any arguments -passed to the returned function are added to the arguments originally passed -to apply. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to automatically apply when the - continuation is called. - -__Example__ - -```js -// using apply - -async.parallel([ - async.apply(fs.writeFile, 'testfile1', 'test1'), - async.apply(fs.writeFile, 'testfile2', 'test2'), -]); - - -// the same process without using apply - -async.parallel([ - function(callback){ - fs.writeFile('testfile1', 'test1', callback); - }, - function(callback){ - fs.writeFile('testfile2', 'test2', callback); - } -]); -``` - -It's possible to pass any number of additional arguments when calling the -continuation: - -```js -node> var fn = async.apply(sys.puts, 'one'); -node> fn('two', 'three'); -one -two -three -``` - ---------------------------------------- - - -### nextTick(callback) - -Calls the callback on a later loop around the event loop. In node.js this just -calls process.nextTick, in the browser it falls back to setImmediate(callback) -if available, otherwise setTimeout(callback, 0), which means other higher priority -events may precede the execution of the callback. - -This is used internally for browser-compatibility purposes. - -__Arguments__ - -* callback - The function to call on a later loop around the event loop. - -__Example__ - -```js -var call_order = []; -async.nextTick(function(){ - call_order.push('two'); - // call_order now equals ['one','two'] -}); -call_order.push('one') -``` - - -### times(n, callback) - -Calls the callback n times and accumulates results in the same manner -you would use with async.map. - -__Arguments__ - -* n - The number of times to run the function. -* callback - The function to call n times. - -__Example__ - -```js -// Pretend this is some complicated async factory -var createUser = function(id, callback) { - callback(null, { - id: 'user' + id - }) -} -// generate 5 users -async.times(5, function(n, next){ - createUser(n, function(err, user) { - next(err, user) - }) -}, function(err, users) { - // we should now have 5 users -}); -``` - - -### timesSeries(n, callback) - -The same as times only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - - -## Utils - - -### memoize(fn, [hasher]) - -Caches the results of an async function. When creating a hash to store function -results against, the callback is omitted from the hash and an optional hash -function can be used. - -The cache of results is exposed as the `memo` property of the function returned -by `memoize`. - -__Arguments__ - -* fn - the function you to proxy and cache results from. -* hasher - an optional function for generating a custom hash for storing - results, it has all the arguments applied to it apart from the callback, and - must be synchronous. - -__Example__ - -```js -var slow_fn = function (name, callback) { - // do something - callback(null, result); -}; -var fn = async.memoize(slow_fn); - -// fn can now be used as if it were slow_fn -fn('some name', function () { - // callback -}); -``` - - -### unmemoize(fn) - -Undoes a memoized function, reverting it to the original, unmemoized -form. Comes handy in tests. - -__Arguments__ - -* fn - the memoized function - - -### log(function, arguments) - -Logs the result of an async function to the console. Only works in node.js or -in browsers that support console.log and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.log is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - -```js -var hello = function(name, callback){ - setTimeout(function(){ - callback(null, 'hello ' + name); - }, 1000); -}; -``` -```js -node> async.log(hello, 'world'); -'hello world' -``` - ---------------------------------------- - - -### dir(function, arguments) - -Logs the result of an async function to the console using console.dir to -display the properties of the resulting object. Only works in node.js or -in browsers that support console.dir and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.dir is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - -```js -var hello = function(name, callback){ - setTimeout(function(){ - callback(null, {hello: name}); - }, 1000); -}; -``` -```js -node> async.dir(hello, 'world'); -{hello: 'world'} -``` - ---------------------------------------- - - -### noConflict() - -Changes the value of async back to its original value, returning a reference to the -async object. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/component.json deleted file mode 100644 index bbb0115..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/component.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "async", - "repo": "caolan/async", - "description": "Higher-order functions and common patterns for asynchronous code", - "version": "0.1.23", - "keywords": [], - "dependencies": {}, - "development": {}, - "main": "lib/async.js", - "scripts": [ "lib/async.js" ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/lib/async.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/lib/async.js deleted file mode 100755 index 1eebb15..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/lib/async.js +++ /dev/null @@ -1,958 +0,0 @@ -/*global setImmediate: false, setTimeout: false, console: false */ -(function () { - - var async = {}; - - // global on the server, window in the browser - var root, previous_async; - - root = this; - if (root != null) { - previous_async = root.async; - } - - async.noConflict = function () { - root.async = previous_async; - return async; - }; - - function only_once(fn) { - var called = false; - return function() { - if (called) throw new Error("Callback was already called."); - called = true; - fn.apply(root, arguments); - } - } - - //// cross-browser compatiblity functions //// - - var _each = function (arr, iterator) { - if (arr.forEach) { - return arr.forEach(iterator); - } - for (var i = 0; i < arr.length; i += 1) { - iterator(arr[i], i, arr); - } - }; - - var _map = function (arr, iterator) { - if (arr.map) { - return arr.map(iterator); - } - var results = []; - _each(arr, function (x, i, a) { - results.push(iterator(x, i, a)); - }); - return results; - }; - - var _reduce = function (arr, iterator, memo) { - if (arr.reduce) { - return arr.reduce(iterator, memo); - } - _each(arr, function (x, i, a) { - memo = iterator(memo, x, i, a); - }); - return memo; - }; - - var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; - }; - - //// exported async module functions //// - - //// nextTick implementation with browser-compatible fallback //// - if (typeof process === 'undefined' || !(process.nextTick)) { - if (typeof setImmediate === 'function') { - async.nextTick = function (fn) { - // not a direct alias for IE10 compatibility - setImmediate(fn); - }; - async.setImmediate = async.nextTick; - } - else { - async.nextTick = function (fn) { - setTimeout(fn, 0); - }; - async.setImmediate = async.nextTick; - } - } - else { - async.nextTick = process.nextTick; - if (typeof setImmediate !== 'undefined') { - async.setImmediate = function (fn) { - // not a direct alias for IE10 compatibility - setImmediate(fn); - }; - } - else { - async.setImmediate = async.nextTick; - } - } - - async.each = function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length) { - return callback(); - } - var completed = 0; - _each(arr, function (x) { - iterator(x, only_once(function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed >= arr.length) { - callback(null); - } - } - })); - }); - }; - async.forEach = async.each; - - async.eachSeries = function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length) { - return callback(); - } - var completed = 0; - var iterate = function () { - iterator(arr[completed], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed >= arr.length) { - callback(null); - } - else { - iterate(); - } - } - }); - }; - iterate(); - }; - async.forEachSeries = async.eachSeries; - - async.eachLimit = function (arr, limit, iterator, callback) { - var fn = _eachLimit(limit); - fn.apply(null, [arr, iterator, callback]); - }; - async.forEachLimit = async.eachLimit; - - var _eachLimit = function (limit) { - - return function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length || limit <= 0) { - return callback(); - } - var completed = 0; - var started = 0; - var running = 0; - - (function replenish () { - if (completed >= arr.length) { - return callback(); - } - - while (running < limit && started < arr.length) { - started += 1; - running += 1; - iterator(arr[started - 1], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - running -= 1; - if (completed >= arr.length) { - callback(); - } - else { - replenish(); - } - } - }); - } - })(); - }; - }; - - - var doParallel = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.each].concat(args)); - }; - }; - var doParallelLimit = function(limit, fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [_eachLimit(limit)].concat(args)); - }; - }; - var doSeries = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.eachSeries].concat(args)); - }; - }; - - - var _asyncMap = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (err, v) { - results[x.index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - }; - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - async.mapLimit = function (arr, limit, iterator, callback) { - return _mapLimit(limit)(arr, iterator, callback); - }; - - var _mapLimit = function(limit) { - return doParallelLimit(limit, _asyncMap); - }; - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.reduce = function (arr, memo, iterator, callback) { - async.eachSeries(arr, function (x, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - // inject alias - async.inject = async.reduce; - // foldl alias - async.foldl = async.reduce; - - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, function (x) { - return x; - }).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - // foldr alias - async.foldr = async.reduceRight; - - var _filter = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.filter = doParallel(_filter); - async.filterSeries = doSeries(_filter); - // select alias - async.select = async.filter; - async.selectSeries = async.filterSeries; - - var _reject = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (!v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.reject = doParallel(_reject); - async.rejectSeries = doSeries(_reject); - - var _detect = function (eachfn, arr, iterator, main_callback) { - eachfn(arr, function (x, callback) { - iterator(x, function (result) { - if (result) { - main_callback(x); - main_callback = function () {}; - } - else { - callback(); - } - }); - }, function (err) { - main_callback(); - }); - }; - async.detect = doParallel(_detect); - async.detectSeries = doSeries(_detect); - - async.some = function (arr, iterator, main_callback) { - async.each(arr, function (x, callback) { - iterator(x, function (v) { - if (v) { - main_callback(true); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(false); - }); - }; - // any alias - async.any = async.some; - - async.every = function (arr, iterator, main_callback) { - async.each(arr, function (x, callback) { - iterator(x, function (v) { - if (!v) { - main_callback(false); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(true); - }); - }; - // all alias - async.all = async.every; - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - var fn = function (left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var results = {}; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _each(listeners.slice(0), function (fn) { - fn(); - }); - }; - - addListener(function () { - if (_keys(results).length === keys.length) { - callback(null, results); - callback = function () {}; - } - }); - - _each(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - if (err) { - var safeResults = {}; - _each(_keys(results), function(rkey) { - safeResults[rkey] = results[rkey]; - }); - safeResults[k] = args; - callback(err, safeResults); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - results[k] = args; - async.setImmediate(taskComplete); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && results.hasOwnProperty(x)); - }, true) && !results.hasOwnProperty(k); - }; - if (ready()) { - task[task.length - 1](taskCallback, results); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback, results); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor !== Array) { - var err = new Error('First argument to waterfall must be an array of functions'); - return callback(err); - } - if (!tasks.length) { - return callback(); - } - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback.apply(null, arguments); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.setImmediate(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - var _parallel = function(eachfn, tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - eachfn.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - eachfn.each(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.parallel = function (tasks, callback) { - _parallel({ map: async.map, each: async.each }, tasks, callback); - }; - - async.parallelLimit = function(tasks, limit, callback) { - _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback); - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.eachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.doWhilst = function (iterator, test, callback) { - iterator(function (err) { - if (err) { - return callback(err); - } - if (test()) { - async.doWhilst(iterator, test, callback); - } - else { - callback(); - } - }); - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.doUntil = function (iterator, test, callback) { - iterator(function (err) { - if (err) { - return callback(err); - } - if (!test()) { - async.doUntil(iterator, test, callback); - } - else { - callback(); - } - }); - }; - - async.queue = function (worker, concurrency) { - if (concurrency === undefined) { - concurrency = 1; - } - function _insert(q, data, pos, callback) { - if(data.constructor !== Array) { - data = [data]; - } - _each(data, function(task) { - var item = { - data: task, - callback: typeof callback === 'function' ? callback : null - }; - - if (pos) { - q.tasks.unshift(item); - } else { - q.tasks.push(item); - } - - if (q.saturated && q.tasks.length === concurrency) { - q.saturated(); - } - async.setImmediate(q.process); - }); - } - - var workers = 0; - var q = { - tasks: [], - concurrency: concurrency, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - _insert(q, data, false, callback); - }, - unshift: function (data, callback) { - _insert(q, data, true, callback); - }, - process: function () { - if (workers < q.concurrency && q.tasks.length) { - var task = q.tasks.shift(); - if (q.empty && q.tasks.length === 0) { - q.empty(); - } - workers += 1; - var next = function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - if (q.drain && q.tasks.length + workers === 0) { - q.drain(); - } - q.process(); - }; - var cb = only_once(next); - worker(task.data, cb); - } - }, - length: function () { - return q.tasks.length; - }, - running: function () { - return workers; - } - }; - return q; - }; - - async.cargo = function (worker, payload) { - var working = false, - tasks = []; - - var cargo = { - tasks: tasks, - payload: payload, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - if(data.constructor !== Array) { - data = [data]; - } - _each(data, function(task) { - tasks.push({ - data: task, - callback: typeof callback === 'function' ? callback : null - }); - if (cargo.saturated && tasks.length === payload) { - cargo.saturated(); - } - }); - async.setImmediate(cargo.process); - }, - process: function process() { - if (working) return; - if (tasks.length === 0) { - if(cargo.drain) cargo.drain(); - return; - } - - var ts = typeof payload === 'number' - ? tasks.splice(0, payload) - : tasks.splice(0); - - var ds = _map(ts, function (task) { - return task.data; - }); - - if(cargo.empty) cargo.empty(); - working = true; - worker(ds, function () { - working = false; - - var args = arguments; - _each(ts, function (data) { - if (data.callback) { - data.callback.apply(null, args); - } - }); - - process(); - }); - }, - length: function () { - return tasks.length; - }, - running: function () { - return working; - } - }; - return cargo; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _each(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - var queues = {}; - hasher = hasher || function (x) { - return x; - }; - var memoized = function () { - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - var key = hasher.apply(null, args); - if (key in memo) { - callback.apply(null, memo[key]); - } - else if (key in queues) { - queues[key].push(callback); - } - else { - queues[key] = [callback]; - fn.apply(null, args.concat([function () { - memo[key] = arguments; - var q = queues[key]; - delete queues[key]; - for (var i = 0, l = q.length; i < l; i++) { - q[i].apply(null, arguments); - } - }])); - } - }; - memoized.memo = memo; - memoized.unmemoized = fn; - return memoized; - }; - - async.unmemoize = function (fn) { - return function () { - return (fn.unmemoized || fn).apply(null, arguments); - }; - }; - - async.times = function (count, iterator, callback) { - var counter = []; - for (var i = 0; i < count; i++) { - counter.push(i); - } - return async.map(counter, iterator, callback); - }; - - async.timesSeries = function (count, iterator, callback) { - var counter = []; - for (var i = 0; i < count; i++) { - counter.push(i); - } - return async.mapSeries(counter, iterator, callback); - }; - - async.compose = function (/* functions... */) { - var fns = Array.prototype.reverse.call(arguments); - return function () { - var that = this; - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - async.reduce(fns, args, function (newargs, fn, cb) { - fn.apply(that, newargs.concat([function () { - var err = arguments[0]; - var nextargs = Array.prototype.slice.call(arguments, 1); - cb(err, nextargs); - }])) - }, - function (err, results) { - callback.apply(that, [err].concat(results)); - }); - }; - }; - - var _applyEach = function (eachfn, fns /*args...*/) { - var go = function () { - var that = this; - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - return eachfn(fns, function (fn, cb) { - fn.apply(that, args.concat([cb])); - }, - callback); - }; - if (arguments.length > 2) { - var args = Array.prototype.slice.call(arguments, 2); - return go.apply(this, args); - } - else { - return go; - } - }; - async.applyEach = doParallel(_applyEach); - async.applyEachSeries = doSeries(_applyEach); - - async.forever = function (fn, callback) { - function next(err) { - if (err) { - if (callback) { - return callback(err); - } - throw err; - } - fn(next); - } - next(); - }; - - // AMD / RequireJS - if (typeof define !== 'undefined' && define.amd) { - define([], function () { - return async; - }); - } - // Node.js - else if (typeof module !== 'undefined' && module.exports) { - module.exports = async; - } - // included directly via -``` - -Note that the [es5-shim](https://github.com/es-shims/es5-shim) must be loaded before this library to support browsers pre IE9. - -```html - -``` - -## Usage - -The example below shows how you can load the promise library (in a way that works on both client and server). It then demonstrates creating a promise from scratch. You simply call `new Promise(fn)`. There is a complete specification for what is returned by this method in [Promises/A+](http://promises-aplus.github.com/promises-spec/). - -```javascript -var Promise = require('promise'); - -var promise = new Promise(function (resolve, reject) { - get('http://www.google.com', function (err, res) { - if (err) reject(err); - else resolve(res); - }); -}); -``` - -## API - -Before all examples, you will need: - -```js -var Promise = require('promise'); -``` - -### new Promise(resolver) - -This creates and returns a new promise. `resolver` must be a function. The `resolver` function is passed two arguments: - - 1. `resolve` should be called with a single argument. If it is called with a non-promise value then the promise is fulfilled with that value. If it is called with a promise (A) then the returned promise takes on the state of that new promise (A). - 2. `reject` should be called with a single argument. The returned promise will be rejected with that argument. - -### Static Functions - - These methods are invoked by calling `Promise.methodName`. - -#### Promise.resolve(value) - -(deprecated aliases: `Promise.from(value)`, `Promise.cast(value)`) - -Converts values and foreign promises into Promises/A+ promises. If you pass it a value then it returns a Promise for that value. If you pass it something that is close to a promise (such as a jQuery attempt at a promise) it returns a Promise that takes on the state of `value` (rejected or fulfilled). - -#### Promise.all(array) - -Returns a promise for an array. If it is called with a single argument that `Array.isArray` then this returns a promise for a copy of that array with any promises replaced by their fulfilled values. Otherwise it returns a promise for an array that conatins its arguments, except with promises replaced by their resolution values. e.g. - -```js -Promise.all([Promise.resolve('a'), 'b', Promise.resolve('c')]) - .then(function (res) { - assert(res[0] === 'a') - assert(res[1] === 'b') - assert(res[2] === 'c') - }) - -Promise.all(Promise.resolve('a'), 'b', Promise.resolve('c')) - .then(function (res) { - assert(res[0] === 'a') - assert(res[1] === 'b') - assert(res[2] === 'c') - }) -``` - -#### Promise.denodeify(fn) - -_Non Standard_ - -Takes a function which accepts a node style callback and returns a new function that returns a promise instead. - -e.g. - -```javascript -var fs = require('fs') - -var read = Promise.denodeify(fs.readFile) -var write = Promise.denodeify(fs.writeFile) - -var p = read('foo.json', 'utf8') - .then(function (str) { - return write('foo.json', JSON.stringify(JSON.parse(str), null, ' '), 'utf8') - }) -``` - -#### Promise.nodeify(fn) - -_Non Standard_ - -The twin to `denodeify` is useful when you want to export an API that can be used by people who haven't learnt about the brilliance of promises yet. - -```javascript -module.exports = Promise.nodeify(awesomeAPI) -function awesomeAPI(a, b) { - return download(a, b) -} -``` - -If the last argument passed to `module.exports` is a function, then it will be treated like a node.js callback and not parsed on to the child function, otherwise the API will just return a promise. - -### Prototype Methods - -These methods are invoked on a promise instance by calling `myPromise.methodName` - -### Promise#then(onFulfilled, onRejected) - -This method follows the [Promises/A+ spec](http://promises-aplus.github.io/promises-spec/). It explains things very clearly so I recommend you read it. - -Either `onFulfilled` or `onRejected` will be called and they will not be called more than once. They will be passed a single argument and will always be called asynchronously (in the next turn of the event loop). - -If the promise is fulfilled then `onFulfilled` is called. If the promise is rejected then `onRejected` is called. - -The call to `.then` also returns a promise. If the handler that is called returns a promise, the promise returned by `.then` takes on the state of that returned promise. If the handler that is called returns a value that is not a promise, the promise returned by `.then` will be fulfilled with that value. If the handler that is called throws an exception then the promise returned by `.then` is rejected with that exception. - -#### Promise#catch(onRejected) - -Sugar for `Promise#then(null, onRejected)`, to mirror `catch` in synchronous code. - -#### Promise#done(onFulfilled, onRejected) - -_Non Standard_ - -The same semantics as `.then` except that it does not return a promise and any exceptions are re-thrown so that they can be logged (crashing the application in non-browser environments) - -#### Promise#nodeify(callback) - -_Non Standard_ - -If `callback` is `null` or `undefined` it just returns `this`. If `callback` is a function it is called with rejection reason as the first argument and result as the second argument (as per the node.js convention). - -This lets you write API functions that look like: - -```javascript -function awesomeAPI(foo, bar, callback) { - return internalAPI(foo, bar) - .then(parseResult) - .then(null, retryErrors) - .nodeify(callback) -} -``` - -People who use typical node.js style callbacks will be able to just pass a callback and get the expected behavior. The enlightened people can not pass a callback and will get awesome promises. - -## Extending Promises - - There are three options for extending the promises created by this library. - -### Inheritance - - You can use inheritance if you want to create your own complete promise library with this as your basic starting point, perfect if you have lots of cool features you want to add. Here is an example of a promise library called `Awesome`, which is built on top of `Promise` correctly. - -```javascript -var Promise = require('promise'); -function Awesome(fn) { - if (!(this instanceof Awesome)) return new Awesome(fn); - Promise.call(this, fn); -} -Awesome.prototype = Object.create(Promise.prototype); -Awesome.prototype.constructor = Awesome; - -//Awesome extension -Awesome.prototype.spread = function (cb) { - return this.then(function (arr) { - return cb.apply(this, arr); - }) -}; -``` - - N.B. if you fail to set the prototype and constructor properly or fail to do Promise.call, things can fail in really subtle ways. - -### Wrap - - This is the nuclear option, for when you want to start from scratch. It ensures you won't be impacted by anyone who is extending the prototype (see below). - -```javascript -function Uber(fn) { - if (!(this instanceof Uber)) return new Uber(fn); - var _prom = new Promise(fn); - this.then = _prom.then; -} - -Uber.prototype.spread = function (cb) { - return this.then(function (arr) { - return cb.apply(this, arr); - }) -}; -``` - -### Extending the Prototype - - In general, you should never extend the prototype of this promise implimenation because your extensions could easily conflict with someone elses extensions. However, this organisation will host a library of extensions which do not conflict with each other, so you can safely enable any of those. If you think of an extension that we don't provide and you want to write it, submit an issue on this repository and (if I agree) I'll set you up with a repository and give you permission to commit to it. - -## License - - MIT diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/core.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/core.js deleted file mode 100644 index 5f332a2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/core.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -module.exports = require('./lib/core.js'); - -console.error('require("promise/core") is deprecated, use require("promise/lib/core") instead.'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/index.js deleted file mode 100644 index 17d5ed1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -module.exports = require('./lib/core.js') -require('./lib/done.js') -require('./lib/es6-extensions.js') -require('./lib/node-extensions.js') \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/core.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/core.js deleted file mode 100644 index 05a4313..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/core.js +++ /dev/null @@ -1,105 +0,0 @@ -'use strict'; - -var asap = require('asap') - -module.exports = Promise; -function Promise(fn) { - if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new') - if (typeof fn !== 'function') throw new TypeError('not a function') - var state = null - var value = null - var deferreds = [] - var self = this - - this.then = function(onFulfilled, onRejected) { - return new self.constructor(function(resolve, reject) { - handle(new Handler(onFulfilled, onRejected, resolve, reject)) - }) - } - - function handle(deferred) { - if (state === null) { - deferreds.push(deferred) - return - } - asap(function() { - var cb = state ? deferred.onFulfilled : deferred.onRejected - if (cb === null) { - (state ? deferred.resolve : deferred.reject)(value) - return - } - var ret - try { - ret = cb(value) - } - catch (e) { - deferred.reject(e) - return - } - deferred.resolve(ret) - }) - } - - function resolve(newValue) { - try { //Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure - if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.') - if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { - var then = newValue.then - if (typeof then === 'function') { - doResolve(then.bind(newValue), resolve, reject) - return - } - } - state = true - value = newValue - finale() - } catch (e) { reject(e) } - } - - function reject(newValue) { - state = false - value = newValue - finale() - } - - function finale() { - for (var i = 0, len = deferreds.length; i < len; i++) - handle(deferreds[i]) - deferreds = null - } - - doResolve(fn, resolve, reject) -} - - -function Handler(onFulfilled, onRejected, resolve, reject){ - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null - this.onRejected = typeof onRejected === 'function' ? onRejected : null - this.resolve = resolve - this.reject = reject -} - -/** - * Take a potentially misbehaving resolver function and make sure - * onFulfilled and onRejected are only called once. - * - * Makes no guarantees about asynchrony. - */ -function doResolve(fn, onFulfilled, onRejected) { - var done = false; - try { - fn(function (value) { - if (done) return - done = true - onFulfilled(value) - }, function (reason) { - if (done) return - done = true - onRejected(reason) - }) - } catch (ex) { - if (done) return - done = true - onRejected(ex) - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/done.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/done.js deleted file mode 100644 index 2da6208..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/done.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -var Promise = require('./core.js') -var asap = require('asap') - -module.exports = Promise -Promise.prototype.done = function (onFulfilled, onRejected) { - var self = arguments.length ? this.then.apply(this, arguments) : this - self.then(null, function (err) { - asap(function () { - throw err - }) - }) -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/es6-extensions.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/es6-extensions.js deleted file mode 100644 index 084c1cd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/es6-extensions.js +++ /dev/null @@ -1,108 +0,0 @@ -'use strict'; - -//This file contains the ES6 extensions to the core Promises/A+ API - -var Promise = require('./core.js') -var asap = require('asap') - -module.exports = Promise - -/* Static Functions */ - -function ValuePromise(value) { - this.then = function (onFulfilled) { - if (typeof onFulfilled !== 'function') return this - return new Promise(function (resolve, reject) { - asap(function () { - try { - resolve(onFulfilled(value)) - } catch (ex) { - reject(ex); - } - }) - }) - } -} -ValuePromise.prototype = Promise.prototype - -var TRUE = new ValuePromise(true) -var FALSE = new ValuePromise(false) -var NULL = new ValuePromise(null) -var UNDEFINED = new ValuePromise(undefined) -var ZERO = new ValuePromise(0) -var EMPTYSTRING = new ValuePromise('') - -Promise.resolve = function (value) { - if (value instanceof Promise) return value - - if (value === null) return NULL - if (value === undefined) return UNDEFINED - if (value === true) return TRUE - if (value === false) return FALSE - if (value === 0) return ZERO - if (value === '') return EMPTYSTRING - - if (typeof value === 'object' || typeof value === 'function') { - try { - var then = value.then - if (typeof then === 'function') { - return new Promise(then.bind(value)) - } - } catch (ex) { - return new Promise(function (resolve, reject) { - reject(ex) - }) - } - } - - return new ValuePromise(value) -} - -Promise.all = function (arr) { - var args = Array.prototype.slice.call(arr) - - return new Promise(function (resolve, reject) { - if (args.length === 0) return resolve([]) - var remaining = args.length - function res(i, val) { - try { - if (val && (typeof val === 'object' || typeof val === 'function')) { - var then = val.then - if (typeof then === 'function') { - then.call(val, function (val) { res(i, val) }, reject) - return - } - } - args[i] = val - if (--remaining === 0) { - resolve(args); - } - } catch (ex) { - reject(ex) - } - } - for (var i = 0; i < args.length; i++) { - res(i, args[i]) - } - }) -} - -Promise.reject = function (value) { - return new Promise(function (resolve, reject) { - reject(value); - }); -} - -Promise.race = function (values) { - return new Promise(function (resolve, reject) { - values.forEach(function(value){ - Promise.resolve(value).then(resolve, reject); - }) - }); -} - -/* Prototype Methods */ - -Promise.prototype['catch'] = function (onRejected) { - return this.then(null, onRejected); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/node-extensions.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/node-extensions.js deleted file mode 100644 index 5e60f9e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/lib/node-extensions.js +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - -//This file contains then/promise specific extensions that are only useful for node.js interop - -var Promise = require('./core.js') -var asap = require('asap') - -module.exports = Promise - -/* Static Functions */ - -Promise.denodeify = function (fn, argumentCount) { - argumentCount = argumentCount || Infinity - return function () { - var self = this - var args = Array.prototype.slice.call(arguments) - return new Promise(function (resolve, reject) { - while (args.length && args.length > argumentCount) { - args.pop() - } - args.push(function (err, res) { - if (err) reject(err) - else resolve(res) - }) - var res = fn.apply(self, args) - if (res && (typeof res === 'object' || typeof res === 'function') && typeof res.then === 'function') { - resolve(res) - } - }) - } -} -Promise.nodeify = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments) - var callback = typeof args[args.length - 1] === 'function' ? args.pop() : null - var ctx = this - try { - return fn.apply(this, arguments).nodeify(callback, ctx) - } catch (ex) { - if (callback === null || typeof callback == 'undefined') { - return new Promise(function (resolve, reject) { reject(ex) }) - } else { - asap(function () { - callback.call(ctx, ex) - }) - } - } - } -} - -Promise.prototype.nodeify = function (callback, ctx) { - if (typeof callback != 'function') return this - - this.then(function (value) { - asap(function () { - callback.call(ctx, null, value) - }) - }, function (err) { - asap(function () { - callback.call(ctx, err) - }) - }) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/LICENSE.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/LICENSE.md deleted file mode 100644 index 5d98ad8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ - -Copyright 2009–2013 Contributors. 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. - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/README.md deleted file mode 100644 index 9a42759..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/README.md +++ /dev/null @@ -1,81 +0,0 @@ - -# ASAP - -This `asap` CommonJS package contains a single `asap` module that -exports a single `asap` function that executes a function **as soon as -possible**. - -```javascript -asap(function () { - // ... -}); -``` - -More formally, ASAP provides a fast event queue that will execute tasks -until it is empty before yielding to the JavaScript engine's underlying -event-loop. When the event queue becomes non-empty, ASAP schedules a -flush event, preferring for that event to occur before the JavaScript -engine has an opportunity to perform IO tasks or rendering, thus making -the first task and subsequent tasks semantically indistinguishable. -ASAP uses a variety of techniques to preserve this invariant on -different versions of browsers and NodeJS. - -By design, ASAP can starve the event loop on the theory that, if there -is enough work to be done synchronously, albeit in separate events, long -enough to starve input or output, it is a strong indicator that the -program needs to push back on scheduling more work. - -Take care. ASAP can sustain infinite recursive calls indefinitely -without warning. This is behaviorally equivalent to an infinite loop. -It will not halt from a stack overflow, but it *will* chew through -memory (which is an oddity I cannot explain at this time). Just as with -infinite loops, you can monitor a Node process for this behavior with a -heart-beat signal. As with infinite loops, a very small amount of -caution goes a long way to avoiding problems. - -```javascript -function loop() { - asap(loop); -} -loop(); -``` - -ASAP is distinct from `setImmediate` in that it does not suffer the -overhead of returning a handle and being possible to cancel. For a -`setImmediate` shim, consider [setImmediate][]. - -[setImmediate]: https://github.com/noblejs/setimmediate - -If a task throws an exception, it will not interrupt the flushing of -high-priority tasks. The exception will be postponed to a later, -low-priority event to avoid slow-downs, when the underlying JavaScript -engine will treat it as it does any unhandled exception. - -## Heritage - -ASAP has been factored out of the [Q][] asynchronous promise library. -It originally had a naïve implementation in terms of `setTimeout`, but -[Malte Ubl][NonBlocking] provided an insight that `postMessage` might be -useful for creating a high-priority, no-delay event dispatch hack. -Since then, Internet Explorer proposed and implemented `setImmediate`. -Robert Kratić began contributing to Q by measuring the performance of -the internal implementation of `asap`, paying particular attention to -error recovery. Domenic, Robert, and I collectively settled on the -current strategy of unrolling the high-priority event queue internally -regardless of what strategy we used to dispatch the potentially -lower-priority flush event. Domenic went on to make ASAP cooperate with -NodeJS domains. - -[Q]: https://github.com/kriskowal/q -[NonBlocking]: http://www.nonblocking.io/2011/06/windownexttick.html - -For further reading, Nicholas Zakas provided a thorough article on [The -Case for setImmediate][NCZ]. - -[NCZ]: http://www.nczonline.net/blog/2013/07/09/the-case-for-setimmediate/ - -## License - -Copyright 2009-2013 by Contributors -MIT License (enclosed) - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/asap.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/asap.js deleted file mode 100644 index 2f85516..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/asap.js +++ /dev/null @@ -1,113 +0,0 @@ - -// Use the fastest possible means to execute a task in a future turn -// of the event loop. - -// linked list of tasks (single, with head node) -var head = {task: void 0, next: null}; -var tail = head; -var flushing = false; -var requestFlush = void 0; -var isNodeJS = false; - -function flush() { - /* jshint loopfunc: true */ - - while (head.next) { - head = head.next; - var task = head.task; - head.task = void 0; - var domain = head.domain; - - if (domain) { - head.domain = void 0; - domain.enter(); - } - - try { - task(); - - } catch (e) { - if (isNodeJS) { - // In node, uncaught exceptions are considered fatal errors. - // Re-throw them synchronously to interrupt flushing! - - // Ensure continuation if the uncaught exception is suppressed - // listening "uncaughtException" events (as domains does). - // Continue in next event to avoid tick recursion. - if (domain) { - domain.exit(); - } - setTimeout(flush, 0); - if (domain) { - domain.enter(); - } - - throw e; - - } else { - // In browsers, uncaught exceptions are not fatal. - // Re-throw them asynchronously to avoid slow-downs. - setTimeout(function() { - throw e; - }, 0); - } - } - - if (domain) { - domain.exit(); - } - } - - flushing = false; -} - -if (typeof process !== "undefined" && process.nextTick) { - // Node.js before 0.9. Note that some fake-Node environments, like the - // Mocha test runner, introduce a `process` global without a `nextTick`. - isNodeJS = true; - - requestFlush = function () { - process.nextTick(flush); - }; - -} else if (typeof setImmediate === "function") { - // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate - if (typeof window !== "undefined") { - requestFlush = setImmediate.bind(window, flush); - } else { - requestFlush = function () { - setImmediate(flush); - }; - } - -} else if (typeof MessageChannel !== "undefined") { - // modern browsers - // http://www.nonblocking.io/2011/06/windownexttick.html - var channel = new MessageChannel(); - channel.port1.onmessage = flush; - requestFlush = function () { - channel.port2.postMessage(0); - }; - -} else { - // old browsers - requestFlush = function () { - setTimeout(flush, 0); - }; -} - -function asap(task) { - tail = tail.next = { - task: task, - domain: isNodeJS && process.domain, - next: null - }; - - if (!flushing) { - flushing = true; - requestFlush(); - } -}; - -module.exports = asap; - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/package.json deleted file mode 100644 index 9e55036..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/node_modules/asap/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "asap", - "version": "1.0.0", - "description": "High-priority task queue for Node.js and browsers", - "keywords": [ - "event", - "task", - "queue" - ], - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/kriskowal/asap/raw/master/LICENSE.md" - } - ], - "main": "asap", - "_id": "asap@1.0.0", - "dist": { - "shasum": "b2a45da5fdfa20b0496fc3768cc27c12fa916a7d", - "tarball": "http://registry.npmjs.org/asap/-/asap-1.0.0.tgz" - }, - "_from": "asap@>=1.0.0 <1.1.0", - "_npmVersion": "1.2.15", - "_npmUser": { - "name": "kriskowal", - "email": "kris.kowal@cixar.com" - }, - "maintainers": [ - { - "name": "kriskowal", - "email": "kris.kowal@cixar.com" - } - ], - "directories": {}, - "_shasum": "b2a45da5fdfa20b0496fc3768cc27c12fa916a7d", - "_resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/package.json deleted file mode 100644 index 0cdfea5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "promise", - "version": "6.1.0", - "description": "Bare bones Promises/A+ implementation", - "main": "index.js", - "scripts": { - "test": "mocha --timeout 200 --slow 99999", - "test-resolve": "mocha test/resolver-tests.js -R spec --timeout 200 --slow 999999", - "test-extensions": "mocha test/extensions-tests.js -R spec --timeout 200 --slow 999999" - }, - "repository": { - "type": "git", - "url": "https://github.com/then/promise.git" - }, - "author": { - "name": "ForbesLindesay" - }, - "license": "MIT", - "devDependencies": { - "promises-aplus-tests": "*", - "better-assert": "*", - "mocha": "*" - }, - "dependencies": { - "asap": "~1.0.0" - }, - "gitHead": "c627c0cc1f886ed3aa26edec97838ec9e7dd858b", - "bugs": { - "url": "https://github.com/then/promise/issues" - }, - "homepage": "https://github.com/then/promise", - "_id": "promise@6.1.0", - "_shasum": "2ce729f6b94b45c26891ad0602c5c90e04c6eef6", - "_from": "promise@>=6.0.0 <7.0.0", - "_npmVersion": "1.5.0-alpha-4", - "_npmUser": { - "name": "forbeslindesay", - "email": "forbes@lindesay.co.uk" - }, - "maintainers": [ - { - "name": "forbeslindesay", - "email": "forbes@lindesay.co.uk" - }, - { - "name": "nathan7", - "email": "nathan@nathan7.eu" - } - ], - "dist": { - "shasum": "2ce729f6b94b45c26891ad0602c5c90e04c6eef6", - "tarball": "http://registry.npmjs.org/promise/-/promise-6.1.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/polyfill-done.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/polyfill-done.js deleted file mode 100644 index e50b4c0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/polyfill-done.js +++ /dev/null @@ -1,12 +0,0 @@ -// should work in any browser without browserify - -if (typeof Promise.prototype.done !== 'function') { - Promise.prototype.done = function (onFulfilled, onRejected) { - var self = arguments.length ? this.then.apply(this, arguments) : this - self.then(null, function (err) { - setTimeout(function () { - throw err - }, 0) - }) - } -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/polyfill.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/polyfill.js deleted file mode 100644 index db099f8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/node_modules/promise/polyfill.js +++ /dev/null @@ -1,10 +0,0 @@ -// not "use strict" so we can declare global "Promise" - -var asap = require('asap'); - -if (typeof Promise === 'undefined') { - Promise = require('./lib/core.js') - require('./lib/es6-extensions.js') -} - -require('./polyfill-done.js'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/package.json deleted file mode 100644 index a634bcb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express-handlebars/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "express-handlebars", - "description": "A Handlebars view engine for Express which doesn't suck.", - "version": "2.0.1", - "homepage": "https://github.com/ericf/express-handlebars", - "keywords": [ - "express", - "express3", - "handlebars", - "view", - "layout", - "partials", - "templates" - ], - "author": { - "name": "Eric Ferraiuolo", - "email": "eferraiuolo@gmail.com", - "url": "http://ericf.me/" - }, - "repository": { - "type": "git", - "url": "git://github.com/ericf/express-handlebars.git" - }, - "bugs": { - "url": "https://github.com/ericf/express-handlebars/issues" - }, - "engines": { - "node": ">=0.10" - }, - "dependencies": { - "glob": "^5.0.0", - "graceful-fs": "^3.0.2", - "handlebars": "^3.0.0", - "object.assign": "^1.1.1", - "promise": "^6.0.0" - }, - "main": "index.js", - "directories": { - "example": "examples" - }, - "devDependencies": {}, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "license": "BSD-3-Clause", - "gitHead": "bdb5c32cffb58b806770918870f5d9e156e6d0dc", - "_id": "express-handlebars@2.0.1", - "_shasum": "975661ffebd6e79463230ba4c8e0ca5cd0522fb1", - "_from": "express-handlebars@*", - "_npmVersion": "2.7.4", - "_nodeVersion": "0.12.2", - "_npmUser": { - "name": "ericf", - "email": "eferraiuolo@gmail.com" - }, - "dist": { - "shasum": "975661ffebd6e79463230ba4c8e0ca5cd0522fb1", - "tarball": "http://registry.npmjs.org/express-handlebars/-/express-handlebars-2.0.1.tgz" - }, - "maintainers": [ - { - "name": "ericf", - "email": "eferraiuolo@gmail.com" - } - ], - "_resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-2.0.1.tgz" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/History.md deleted file mode 100644 index be89c8e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/History.md +++ /dev/null @@ -1,3025 +0,0 @@ -4.13.3 / 2015-08-02 -=================== - - * Fix infinite loop condition using `mergeParams: true` - * Fix inner numeric indices incorrectly altering parent `req.params` - -4.13.2 / 2015-07-31 -=================== - - * deps: accepts@~1.2.12 - - deps: mime-types@~2.1.4 - * deps: array-flatten@1.1.1 - - perf: enable strict mode - * deps: path-to-regexp@0.1.7 - - Fix regression with escaped round brackets and matching groups - * deps: type-is@~1.6.6 - - deps: mime-types@~2.1.4 - -4.13.1 / 2015-07-05 -=================== - - * deps: accepts@~1.2.10 - - deps: mime-types@~2.1.2 - * deps: qs@4.0.0 - - Fix dropping parameters like `hasOwnProperty` - - Fix various parsing edge cases - * deps: type-is@~1.6.4 - - deps: mime-types@~2.1.2 - - perf: enable strict mode - - perf: remove argument reassignment - -4.13.0 / 2015-06-20 -=================== - - * Add settings to debug output - * Fix `res.format` error when only `default` provided - * Fix issue where `next('route')` in `app.param` would incorrectly skip values - * Fix hiding platform issues with `decodeURIComponent` - - Only `URIError`s are a 400 - * Fix using `*` before params in routes - * Fix using capture groups before params in routes - * Simplify `res.cookie` to call `res.append` - * Use `array-flatten` module for flattening arrays - * deps: accepts@~1.2.9 - - deps: mime-types@~2.1.1 - - perf: avoid argument reassignment & argument slice - - perf: avoid negotiator recursive construction - - perf: enable strict mode - - perf: remove unnecessary bitwise operator - * deps: cookie@0.1.3 - - perf: deduce the scope of try-catch deopt - - perf: remove argument reassignments - * deps: escape-html@1.0.2 - * deps: etag@~1.7.0 - - Always include entity length in ETags for hash length extensions - - Generate non-Stats ETags using MD5 only (no longer CRC32) - - Improve stat performance by removing hashing - - Improve support for JXcore - - Remove base64 padding in ETags to shorten - - Support "fake" stats objects in environments without fs - - Use MD5 instead of MD4 in weak ETags over 1KB - * deps: finalhandler@0.4.0 - - Fix a false-positive when unpiping in Node.js 0.8 - - Support `statusCode` property on `Error` objects - - Use `unpipe` module for unpiping requests - - deps: escape-html@1.0.2 - - deps: on-finished@~2.3.0 - - perf: enable strict mode - - perf: remove argument reassignment - * deps: fresh@0.3.0 - - Add weak `ETag` matching support - * deps: on-finished@~2.3.0 - - Add defined behavior for HTTP `CONNECT` requests - - Add defined behavior for HTTP `Upgrade` requests - - deps: ee-first@1.1.1 - * deps: path-to-regexp@0.1.6 - * deps: send@0.13.0 - - Allow Node.js HTTP server to set `Date` response header - - Fix incorrectly removing `Content-Location` on 304 response - - Improve the default redirect response headers - - Send appropriate headers on default error response - - Use `http-errors` for standard emitted errors - - Use `statuses` instead of `http` module for status messages - - deps: escape-html@1.0.2 - - deps: etag@~1.7.0 - - deps: fresh@0.3.0 - - deps: on-finished@~2.3.0 - - perf: enable strict mode - - perf: remove unnecessary array allocations - * deps: serve-static@~1.10.0 - - Add `fallthrough` option - - Fix reading options from options prototype - - Improve the default redirect response headers - - Malformed URLs now `next()` instead of 400 - - deps: escape-html@1.0.2 - - deps: send@0.13.0 - - perf: enable strict mode - - perf: remove argument reassignment - * deps: type-is@~1.6.3 - - deps: mime-types@~2.1.1 - - perf: reduce try block size - - perf: remove bitwise operations - * perf: enable strict mode - * perf: isolate `app.render` try block - * perf: remove argument reassignments in application - * perf: remove argument reassignments in request prototype - * perf: remove argument reassignments in response prototype - * perf: remove argument reassignments in routing - * perf: remove argument reassignments in `View` - * perf: skip attempting to decode zero length string - * perf: use saved reference to `http.STATUS_CODES` - -4.12.4 / 2015-05-17 -=================== - - * deps: accepts@~1.2.7 - - deps: mime-types@~2.0.11 - - deps: negotiator@0.5.3 - * deps: debug@~2.2.0 - - deps: ms@0.7.1 - * deps: depd@~1.0.1 - * deps: etag@~1.6.0 - - Improve support for JXcore - - Support "fake" stats objects in environments without `fs` - * deps: finalhandler@0.3.6 - - deps: debug@~2.2.0 - - deps: on-finished@~2.2.1 - * deps: on-finished@~2.2.1 - - Fix `isFinished(req)` when data buffered - * deps: proxy-addr@~1.0.8 - - deps: ipaddr.js@1.0.1 - * deps: qs@2.4.2 - - Fix allowing parameters like `constructor` - * deps: send@0.12.3 - - deps: debug@~2.2.0 - - deps: depd@~1.0.1 - - deps: etag@~1.6.0 - - deps: ms@0.7.1 - - deps: on-finished@~2.2.1 - * deps: serve-static@~1.9.3 - - deps: send@0.12.3 - * deps: type-is@~1.6.2 - - deps: mime-types@~2.0.11 - -4.12.3 / 2015-03-17 -=================== - - * deps: accepts@~1.2.5 - - deps: mime-types@~2.0.10 - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - * deps: finalhandler@0.3.4 - - deps: debug@~2.1.3 - * deps: proxy-addr@~1.0.7 - - deps: ipaddr.js@0.1.9 - * deps: qs@2.4.1 - - Fix error when parameter `hasOwnProperty` is present - * deps: send@0.12.2 - - Throw errors early for invalid `extensions` or `index` options - - deps: debug@~2.1.3 - * deps: serve-static@~1.9.2 - - deps: send@0.12.2 - * deps: type-is@~1.6.1 - - deps: mime-types@~2.0.10 - -4.12.2 / 2015-03-02 -=================== - - * Fix regression where `"Request aborted"` is logged using `res.sendFile` - -4.12.1 / 2015-03-01 -=================== - - * Fix constructing application with non-configurable prototype properties - * Fix `ECONNRESET` errors from `res.sendFile` usage - * Fix `req.host` when using "trust proxy" hops count - * Fix `req.protocol`/`req.secure` when using "trust proxy" hops count - * Fix wrong `code` on aborted connections from `res.sendFile` - * deps: merge-descriptors@1.0.0 - -4.12.0 / 2015-02-23 -=================== - - * Fix `"trust proxy"` setting to inherit when app is mounted - * Generate `ETag`s for all request responses - - No longer restricted to only responses for `GET` and `HEAD` requests - * Use `content-type` to parse `Content-Type` headers - * deps: accepts@~1.2.4 - - Fix preference sorting to be stable for long acceptable lists - - deps: mime-types@~2.0.9 - - deps: negotiator@0.5.1 - * deps: cookie-signature@1.0.6 - * deps: send@0.12.1 - - Always read the stat size from the file - - Fix mutating passed-in `options` - - deps: mime@1.3.4 - * deps: serve-static@~1.9.1 - - deps: send@0.12.1 - * deps: type-is@~1.6.0 - - fix argument reassignment - - fix false-positives in `hasBody` `Transfer-Encoding` check - - support wildcard for both type and subtype (`*/*`) - - deps: mime-types@~2.0.9 - -4.11.2 / 2015-02-01 -=================== - - * Fix `res.redirect` double-calling `res.end` for `HEAD` requests - * deps: accepts@~1.2.3 - - deps: mime-types@~2.0.8 - * deps: proxy-addr@~1.0.6 - - deps: ipaddr.js@0.1.8 - * deps: type-is@~1.5.6 - - deps: mime-types@~2.0.8 - -4.11.1 / 2015-01-20 -=================== - - * deps: send@0.11.1 - - Fix root path disclosure - * deps: serve-static@~1.8.1 - - Fix redirect loop in Node.js 0.11.14 - - Fix root path disclosure - - deps: send@0.11.1 - -4.11.0 / 2015-01-13 -=================== - - * Add `res.append(field, val)` to append headers - * Deprecate leading `:` in `name` for `app.param(name, fn)` - * Deprecate `req.param()` -- use `req.params`, `req.body`, or `req.query` instead - * Deprecate `app.param(fn)` - * Fix `OPTIONS` responses to include the `HEAD` method properly - * Fix `res.sendFile` not always detecting aborted connection - * Match routes iteratively to prevent stack overflows - * deps: accepts@~1.2.2 - - deps: mime-types@~2.0.7 - - deps: negotiator@0.5.0 - * deps: send@0.11.0 - - deps: debug@~2.1.1 - - deps: etag@~1.5.1 - - deps: ms@0.7.0 - - deps: on-finished@~2.2.0 - * deps: serve-static@~1.8.0 - - deps: send@0.11.0 - -4.10.8 / 2015-01-13 -=================== - - * Fix crash from error within `OPTIONS` response handler - * deps: proxy-addr@~1.0.5 - - deps: ipaddr.js@0.1.6 - -4.10.7 / 2015-01-04 -=================== - - * Fix `Allow` header for `OPTIONS` to not contain duplicate methods - * Fix incorrect "Request aborted" for `res.sendFile` when `HEAD` or 304 - * deps: debug@~2.1.1 - * deps: finalhandler@0.3.3 - - deps: debug@~2.1.1 - - deps: on-finished@~2.2.0 - * deps: methods@~1.1.1 - * deps: on-finished@~2.2.0 - * deps: serve-static@~1.7.2 - - Fix potential open redirect when mounted at root - * deps: type-is@~1.5.5 - - deps: mime-types@~2.0.7 - -4.10.6 / 2014-12-12 -=================== - - * Fix exception in `req.fresh`/`req.stale` without response headers - -4.10.5 / 2014-12-10 -=================== - - * Fix `res.send` double-calling `res.end` for `HEAD` requests - * deps: accepts@~1.1.4 - - deps: mime-types@~2.0.4 - * deps: type-is@~1.5.4 - - deps: mime-types@~2.0.4 - -4.10.4 / 2014-11-24 -=================== - - * Fix `res.sendfile` logging standard write errors - -4.10.3 / 2014-11-23 -=================== - - * Fix `res.sendFile` logging standard write errors - * deps: etag@~1.5.1 - * deps: proxy-addr@~1.0.4 - - deps: ipaddr.js@0.1.5 - * deps: qs@2.3.3 - - Fix `arrayLimit` behavior - -4.10.2 / 2014-11-09 -=================== - - * Correctly invoke async router callback asynchronously - * deps: accepts@~1.1.3 - - deps: mime-types@~2.0.3 - * deps: type-is@~1.5.3 - - deps: mime-types@~2.0.3 - -4.10.1 / 2014-10-28 -=================== - - * Fix handling of URLs containing `://` in the path - * deps: qs@2.3.2 - - Fix parsing of mixed objects and values - -4.10.0 / 2014-10-23 -=================== - - * Add support for `app.set('views', array)` - - Views are looked up in sequence in array of directories - * Fix `res.send(status)` to mention `res.sendStatus(status)` - * Fix handling of invalid empty URLs - * Use `content-disposition` module for `res.attachment`/`res.download` - - Sends standards-compliant `Content-Disposition` header - - Full Unicode support - * Use `path.resolve` in view lookup - * deps: debug@~2.1.0 - - Implement `DEBUG_FD` env variable support - * deps: depd@~1.0.0 - * deps: etag@~1.5.0 - - Improve string performance - - Slightly improve speed for weak ETags over 1KB - * deps: finalhandler@0.3.2 - - Terminate in progress response only on error - - Use `on-finished` to determine request status - - deps: debug@~2.1.0 - - deps: on-finished@~2.1.1 - * deps: on-finished@~2.1.1 - - Fix handling of pipelined requests - * deps: qs@2.3.0 - - Fix parsing of mixed implicit and explicit arrays - * deps: send@0.10.1 - - deps: debug@~2.1.0 - - deps: depd@~1.0.0 - - deps: etag@~1.5.0 - - deps: on-finished@~2.1.1 - * deps: serve-static@~1.7.1 - - deps: send@0.10.1 - -4.9.8 / 2014-10-17 -================== - - * Fix `res.redirect` body when redirect status specified - * deps: accepts@~1.1.2 - - Fix error when media type has invalid parameter - - deps: negotiator@0.4.9 - -4.9.7 / 2014-10-10 -================== - - * Fix using same param name in array of paths - -4.9.6 / 2014-10-08 -================== - - * deps: accepts@~1.1.1 - - deps: mime-types@~2.0.2 - - deps: negotiator@0.4.8 - * deps: serve-static@~1.6.4 - - Fix redirect loop when index file serving disabled - * deps: type-is@~1.5.2 - - deps: mime-types@~2.0.2 - -4.9.5 / 2014-09-24 -================== - - * deps: etag@~1.4.0 - * deps: proxy-addr@~1.0.3 - - Use `forwarded` npm module - * deps: send@0.9.3 - - deps: etag@~1.4.0 - * deps: serve-static@~1.6.3 - - deps: send@0.9.3 - -4.9.4 / 2014-09-19 -================== - - * deps: qs@2.2.4 - - Fix issue with object keys starting with numbers truncated - -4.9.3 / 2014-09-18 -================== - - * deps: proxy-addr@~1.0.2 - - Fix a global leak when multiple subnets are trusted - - deps: ipaddr.js@0.1.3 - -4.9.2 / 2014-09-17 -================== - - * Fix regression for empty string `path` in `app.use` - * Fix `router.use` to accept array of middleware without path - * Improve error message for bad `app.use` arguments - -4.9.1 / 2014-09-16 -================== - - * Fix `app.use` to accept array of middleware without path - * deps: depd@0.4.5 - * deps: etag@~1.3.1 - * deps: send@0.9.2 - - deps: depd@0.4.5 - - deps: etag@~1.3.1 - - deps: range-parser@~1.0.2 - * deps: serve-static@~1.6.2 - - deps: send@0.9.2 - -4.9.0 / 2014-09-08 -================== - - * Add `res.sendStatus` - * Invoke callback for sendfile when client aborts - - Applies to `res.sendFile`, `res.sendfile`, and `res.download` - - `err` will be populated with request aborted error - * Support IP address host in `req.subdomains` - * Use `etag` to generate `ETag` headers - * deps: accepts@~1.1.0 - - update `mime-types` - * deps: cookie-signature@1.0.5 - * deps: debug@~2.0.0 - * deps: finalhandler@0.2.0 - - Set `X-Content-Type-Options: nosniff` header - - deps: debug@~2.0.0 - * deps: fresh@0.2.4 - * deps: media-typer@0.3.0 - - Throw error when parameter format invalid on parse - * deps: qs@2.2.3 - - Fix issue where first empty value in array is discarded - * deps: range-parser@~1.0.2 - * deps: send@0.9.1 - - Add `lastModified` option - - Use `etag` to generate `ETag` header - - deps: debug@~2.0.0 - - deps: fresh@0.2.4 - * deps: serve-static@~1.6.1 - - Add `lastModified` option - - deps: send@0.9.1 - * deps: type-is@~1.5.1 - - fix `hasbody` to be true for `content-length: 0` - - deps: media-typer@0.3.0 - - deps: mime-types@~2.0.1 - * deps: vary@~1.0.0 - - Accept valid `Vary` header string as `field` - -4.8.8 / 2014-09-04 -================== - - * deps: send@0.8.5 - - Fix a path traversal issue when using `root` - - Fix malicious path detection for empty string path - * deps: serve-static@~1.5.4 - - deps: send@0.8.5 - -4.8.7 / 2014-08-29 -================== - - * deps: qs@2.2.2 - - Remove unnecessary cloning - -4.8.6 / 2014-08-27 -================== - - * deps: qs@2.2.0 - - Array parsing fix - - Performance improvements - -4.8.5 / 2014-08-18 -================== - - * deps: send@0.8.3 - - deps: destroy@1.0.3 - - deps: on-finished@2.1.0 - * deps: serve-static@~1.5.3 - - deps: send@0.8.3 - -4.8.4 / 2014-08-14 -================== - - * deps: qs@1.2.2 - * deps: send@0.8.2 - - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` - * deps: serve-static@~1.5.2 - - deps: send@0.8.2 - -4.8.3 / 2014-08-10 -================== - - * deps: parseurl@~1.3.0 - * deps: qs@1.2.1 - * deps: serve-static@~1.5.1 - - Fix parsing of weird `req.originalUrl` values - - deps: parseurl@~1.3.0 - - deps: utils-merge@1.0.0 - -4.8.2 / 2014-08-07 -================== - - * deps: qs@1.2.0 - - Fix parsing array of objects - -4.8.1 / 2014-08-06 -================== - - * fix incorrect deprecation warnings on `res.download` - * deps: qs@1.1.0 - - Accept urlencoded square brackets - - Accept empty values in implicit array notation - -4.8.0 / 2014-08-05 -================== - - * add `res.sendFile` - - accepts a file system path instead of a URL - - requires an absolute path or `root` option specified - * deprecate `res.sendfile` -- use `res.sendFile` instead - * support mounted app as any argument to `app.use()` - * deps: qs@1.0.2 - - Complete rewrite - - Limits array length to 20 - - Limits object depth to 5 - - Limits parameters to 1,000 - * deps: send@0.8.1 - - Add `extensions` option - * deps: serve-static@~1.5.0 - - Add `extensions` option - - deps: send@0.8.1 - -4.7.4 / 2014-08-04 -================== - - * fix `res.sendfile` regression for serving directory index files - * deps: send@0.7.4 - - Fix incorrect 403 on Windows and Node.js 0.11 - - Fix serving index files without root dir - * deps: serve-static@~1.4.4 - - deps: send@0.7.4 - -4.7.3 / 2014-08-04 -================== - - * deps: send@0.7.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - * deps: serve-static@~1.4.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - - deps: send@0.7.3 - -4.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - * deps: serve-static@~1.4.2 - -4.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - * deps: serve-static@~1.4.1 - -4.7.0 / 2014-07-25 -================== - - * fix `req.protocol` for proxy-direct connections - * configurable query parser with `app.set('query parser', parser)` - - `app.set('query parser', 'extended')` parse with "qs" module - - `app.set('query parser', 'simple')` parse with "querystring" core module - - `app.set('query parser', false)` disable query string parsing - - `app.set('query parser', true)` enable simple parsing - * deprecate `res.json(status, obj)` -- use `res.status(status).json(obj)` instead - * deprecate `res.jsonp(status, obj)` -- use `res.status(status).jsonp(obj)` instead - * deprecate `res.send(status, body)` -- use `res.status(status).send(body)` instead - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: finalhandler@0.1.0 - - Respond after request fully read - - deps: debug@1.0.4 - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - * deps: serve-static@~1.4.0 - - deps: parseurl@~1.2.0 - - deps: send@0.7.0 - * perf: prevent multiple `Buffer` creation in `res.send` - -4.6.1 / 2014-07-12 -================== - - * fix `subapp.mountpath` regression for `app.use(subapp)` - -4.6.0 / 2014-07-11 -================== - - * accept multiple callbacks to `app.use()` - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * catch errors in multiple `req.param(name, fn)` handlers - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * support non-string `path` in `app.use(path, fn)` - - supports array of paths - - supports `RegExp` - * router: fix optimization on router exit - * router: refactor location of `try` blocks - * router: speed up standard `app.use(fn)` - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: finalhandler@0.0.3 - - deps: debug@1.0.3 - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - * deps: path-to-regexp@0.1.3 - * deps: send@0.6.0 - - deps: debug@1.0.3 - * deps: serve-static@~1.3.2 - - deps: parseurl@~1.1.3 - - deps: send@0.6.0 - * perf: fix arguments reassign deopt in some `res` methods - -4.5.1 / 2014-07-06 -================== - - * fix routing regression when altering `req.method` - -4.5.0 / 2014-07-04 -================== - - * add deprecation message to non-plural `req.accepts*` - * add deprecation message to `res.send(body, status)` - * add deprecation message to `res.vary()` - * add `headers` option to `res.sendfile` - - use to set headers on successful file transfer - * add `mergeParams` option to `Router` - - merges `req.params` from parent routes - * add `req.hostname` -- correct name for what `req.host` returns - * deprecate things with `depd` module - * deprecate `req.host` -- use `req.hostname` instead - * fix behavior when handling request without routes - * fix handling when `route.all` is only route - * invoke `router.param()` only when route matches - * restore `req.params` after invoking router - * use `finalhandler` for final response handling - * use `media-typer` to alter content-type charset - * deps: accepts@~1.0.7 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - * deps: serve-static@~1.3.0 - - Accept string for `maxAge` (converted by `ms`) - - Add `setHeaders` option - - Include HTML link in redirect response - - deps: send@0.5.0 - * deps: type-is@~1.3.2 - -4.4.5 / 2014-06-26 -================== - - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -4.4.4 / 2014-06-20 -================== - - * fix `res.attachment` Unicode filenames in Safari - * fix "trim prefix" debug message in `express:router` - * deps: accepts@~1.0.5 - * deps: buffer-crc32@0.2.3 - -4.4.3 / 2014-06-11 -================== - - * fix persistence of modified `req.params[name]` from `app.param()` - * deps: accepts@1.0.3 - - deps: negotiator@0.4.6 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - * deps: serve-static@1.2.3 - - Do not throw un-catchable error on file open race condition - - deps: send@0.4.3 - -4.4.2 / 2014-06-09 -================== - - * fix catching errors from top-level handlers - * use `vary` module for `res.vary` - * deps: debug@1.0.1 - * deps: proxy-addr@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - * deps: serve-static@1.2.2 - - fix "event emitter leak" warnings - - deps: send@0.4.2 - * deps: type-is@1.2.1 - -4.4.1 / 2014-06-02 -================== - - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - * deps: serve-static@1.2.1 - - use `escape-html` for escaping - - deps: send@0.4.1 - -4.4.0 / 2014-05-30 -================== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * mark `res.send` ETag as weak and reduce collisions - * update accepts to 1.0.2 - - Fix interpretation when header not in request - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - * update serve-static to 1.2.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: send@0.4.0 - -4.3.2 / 2014-05-28 -================== - - * fix handling of errors from `router.param()` callbacks - -4.3.1 / 2014-05-23 -================== - - * revert "fix behavior of multiple `app.VERB` for the same path" - - this caused a regression in the order of route execution - -4.3.0 / 2014-05-21 -================== - - * add `req.baseUrl` to access the path stripped from `req.url` in routes - * fix behavior of multiple `app.VERB` for the same path - * fix issue routing requests among sub routers - * invoke `router.param()` only when necessary instead of every match - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * set proper `charset` in `Content-Type` for `res.send` - * update type-is to 1.2.0 - - support suffix matching - -4.2.0 / 2014-05-11 -================== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * fix `req.next` when inside router instance - * include `ETag` header in `HEAD` requests - * keep previous `Content-Type` for `res.jsonp` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update debug to 0.8.0 - - add `enable()` method - - change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - -4.1.2 / 2014-05-08 -================== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -4.1.1 / 2014-04-27 -================== - - * fix package.json to reflect supported node version - -4.1.0 / 2014-04-24 -================== - - * pass options from `res.sendfile` to `send` - * preserve casing of headers in `res.header` and `res.set` - * support unicode file names in `res.attachment` and `res.download` - * update accepts to 1.0.1 - - deps: negotiator@0.4.0 - * update cookie to 0.1.2 - - Fix for maxAge == 0 - - made compat with expires field - * update send to 0.3.0 - - Accept API options in options object - - Coerce option types - - Control whether to generate etags - - Default directory access to 403 when index disabled - - Fix sending files with dots without root set - - Include file path in etag - - Make "Can't set headers after they are sent." catchable - - Send full entity-body for multi range requests - - Set etags to "weak" - - Support "If-Range" header - - Support multiple index paths - - deps: mime@1.2.11 - * update serve-static to 1.1.0 - - Accept options directly to `send` module - - Resolve relative paths at middleware setup - - Use parseurl to parse the URL from request - - deps: send@0.3.0 - * update type-is to 1.1.0 - - add non-array values support - - add `multipart` as a shorthand - -4.0.0 / 2014-04-09 -================== - - * remove: - - node 0.8 support - - connect and connect's patches except for charset handling - - express(1) - moved to [express-generator](https://github.com/expressjs/generator) - - `express.createServer()` - it has been deprecated for a long time. Use `express()` - - `app.configure` - use logic in your own app code - - `app.router` - is removed - - `req.auth` - use `basic-auth` instead - - `req.accepted*` - use `req.accepts*()` instead - - `res.location` - relative URL resolution is removed - - `res.charset` - include the charset in the content type when using `res.set()` - - all bundled middleware except `static` - * change: - - `app.route` -> `app.mountpath` when mounting an express app in another express app - - `json spaces` no longer enabled by default in development - - `req.accepts*` -> `req.accepts*s` - i.e. `req.acceptsEncoding` -> `req.acceptsEncodings` - - `req.params` is now an object instead of an array - - `res.locals` is no longer a function. It is a plain js object. Treat it as such. - - `res.headerSent` -> `res.headersSent` to match node.js ServerResponse object - * refactor: - - `req.accepts*` with [accepts](https://github.com/expressjs/accepts) - - `req.is` with [type-is](https://github.com/expressjs/type-is) - - [path-to-regexp](https://github.com/component/path-to-regexp) - * add: - - `app.router()` - returns the app Router instance - - `app.route()` - Proxy to the app's `Router#route()` method to create a new route - - Router & Route - public API - -3.21.2 / 2015-07-31 -=================== - - * deps: connect@2.30.2 - - deps: body-parser@~1.13.3 - - deps: compression@~1.5.2 - - deps: errorhandler@~1.4.2 - - deps: method-override@~2.3.5 - - deps: serve-index@~1.7.2 - - deps: type-is@~1.6.6 - - deps: vhost@~3.0.1 - * deps: vary@~1.0.1 - - Fix setting empty header from empty `field` - - perf: enable strict mode - - perf: remove argument reassignments - -3.21.1 / 2015-07-05 -=================== - - * deps: basic-auth@~1.0.3 - * deps: connect@2.30.1 - - deps: body-parser@~1.13.2 - - deps: compression@~1.5.1 - - deps: errorhandler@~1.4.1 - - deps: morgan@~1.6.1 - - deps: pause@0.1.0 - - deps: qs@4.0.0 - - deps: serve-index@~1.7.1 - - deps: type-is@~1.6.4 - -3.21.0 / 2015-06-18 -=================== - - * deps: basic-auth@1.0.2 - - perf: enable strict mode - - perf: hoist regular expression - - perf: parse with regular expressions - - perf: remove argument reassignment - * deps: connect@2.30.0 - - deps: body-parser@~1.13.1 - - deps: bytes@2.1.0 - - deps: compression@~1.5.0 - - deps: cookie@0.1.3 - - deps: cookie-parser@~1.3.5 - - deps: csurf@~1.8.3 - - deps: errorhandler@~1.4.0 - - deps: express-session@~1.11.3 - - deps: finalhandler@0.4.0 - - deps: fresh@0.3.0 - - deps: morgan@~1.6.0 - - deps: serve-favicon@~2.3.0 - - deps: serve-index@~1.7.0 - - deps: serve-static@~1.10.0 - - deps: type-is@~1.6.3 - * deps: cookie@0.1.3 - - perf: deduce the scope of try-catch deopt - - perf: remove argument reassignments - * deps: escape-html@1.0.2 - * deps: etag@~1.7.0 - - Always include entity length in ETags for hash length extensions - - Generate non-Stats ETags using MD5 only (no longer CRC32) - - Improve stat performance by removing hashing - - Improve support for JXcore - - Remove base64 padding in ETags to shorten - - Support "fake" stats objects in environments without fs - - Use MD5 instead of MD4 in weak ETags over 1KB - * deps: fresh@0.3.0 - - Add weak `ETag` matching support - * deps: mkdirp@0.5.1 - - Work in global strict mode - * deps: send@0.13.0 - - Allow Node.js HTTP server to set `Date` response header - - Fix incorrectly removing `Content-Location` on 304 response - - Improve the default redirect response headers - - Send appropriate headers on default error response - - Use `http-errors` for standard emitted errors - - Use `statuses` instead of `http` module for status messages - - deps: escape-html@1.0.2 - - deps: etag@~1.7.0 - - deps: fresh@0.3.0 - - deps: on-finished@~2.3.0 - - perf: enable strict mode - - perf: remove unnecessary array allocations - -3.20.3 / 2015-05-17 -=================== - - * deps: connect@2.29.2 - - deps: body-parser@~1.12.4 - - deps: compression@~1.4.4 - - deps: connect-timeout@~1.6.2 - - deps: debug@~2.2.0 - - deps: depd@~1.0.1 - - deps: errorhandler@~1.3.6 - - deps: finalhandler@0.3.6 - - deps: method-override@~2.3.3 - - deps: morgan@~1.5.3 - - deps: qs@2.4.2 - - deps: response-time@~2.3.1 - - deps: serve-favicon@~2.2.1 - - deps: serve-index@~1.6.4 - - deps: serve-static@~1.9.3 - - deps: type-is@~1.6.2 - * deps: debug@~2.2.0 - - deps: ms@0.7.1 - * deps: depd@~1.0.1 - * deps: proxy-addr@~1.0.8 - - deps: ipaddr.js@1.0.1 - * deps: send@0.12.3 - - deps: debug@~2.2.0 - - deps: depd@~1.0.1 - - deps: etag@~1.6.0 - - deps: ms@0.7.1 - - deps: on-finished@~2.2.1 - -3.20.2 / 2015-03-16 -=================== - - * deps: connect@2.29.1 - - deps: body-parser@~1.12.2 - - deps: compression@~1.4.3 - - deps: connect-timeout@~1.6.1 - - deps: debug@~2.1.3 - - deps: errorhandler@~1.3.5 - - deps: express-session@~1.10.4 - - deps: finalhandler@0.3.4 - - deps: method-override@~2.3.2 - - deps: morgan@~1.5.2 - - deps: qs@2.4.1 - - deps: serve-index@~1.6.3 - - deps: serve-static@~1.9.2 - - deps: type-is@~1.6.1 - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - * deps: merge-descriptors@1.0.0 - * deps: proxy-addr@~1.0.7 - - deps: ipaddr.js@0.1.9 - * deps: send@0.12.2 - - Throw errors early for invalid `extensions` or `index` options - - deps: debug@~2.1.3 - -3.20.1 / 2015-02-28 -=================== - - * Fix `req.host` when using "trust proxy" hops count - * Fix `req.protocol`/`req.secure` when using "trust proxy" hops count - -3.20.0 / 2015-02-18 -=================== - - * Fix `"trust proxy"` setting to inherit when app is mounted - * Generate `ETag`s for all request responses - - No longer restricted to only responses for `GET` and `HEAD` requests - * Use `content-type` to parse `Content-Type` headers - * deps: connect@2.29.0 - - Use `content-type` to parse `Content-Type` headers - - deps: body-parser@~1.12.0 - - deps: compression@~1.4.1 - - deps: connect-timeout@~1.6.0 - - deps: cookie-parser@~1.3.4 - - deps: cookie-signature@1.0.6 - - deps: csurf@~1.7.0 - - deps: errorhandler@~1.3.4 - - deps: express-session@~1.10.3 - - deps: http-errors@~1.3.1 - - deps: response-time@~2.3.0 - - deps: serve-index@~1.6.2 - - deps: serve-static@~1.9.1 - - deps: type-is@~1.6.0 - * deps: cookie-signature@1.0.6 - * deps: send@0.12.1 - - Always read the stat size from the file - - Fix mutating passed-in `options` - - deps: mime@1.3.4 - -3.19.2 / 2015-02-01 -=================== - - * deps: connect@2.28.3 - - deps: compression@~1.3.1 - - deps: csurf@~1.6.6 - - deps: errorhandler@~1.3.3 - - deps: express-session@~1.10.2 - - deps: serve-index@~1.6.1 - - deps: type-is@~1.5.6 - * deps: proxy-addr@~1.0.6 - - deps: ipaddr.js@0.1.8 - -3.19.1 / 2015-01-20 -=================== - - * deps: connect@2.28.2 - - deps: body-parser@~1.10.2 - - deps: serve-static@~1.8.1 - * deps: send@0.11.1 - - Fix root path disclosure - -3.19.0 / 2015-01-09 -=================== - - * Fix `OPTIONS` responses to include the `HEAD` method property - * Use `readline` for prompt in `express(1)` - * deps: commander@2.6.0 - * deps: connect@2.28.1 - - deps: body-parser@~1.10.1 - - deps: compression@~1.3.0 - - deps: connect-timeout@~1.5.0 - - deps: csurf@~1.6.4 - - deps: debug@~2.1.1 - - deps: errorhandler@~1.3.2 - - deps: express-session@~1.10.1 - - deps: finalhandler@0.3.3 - - deps: method-override@~2.3.1 - - deps: morgan@~1.5.1 - - deps: serve-favicon@~2.2.0 - - deps: serve-index@~1.6.0 - - deps: serve-static@~1.8.0 - - deps: type-is@~1.5.5 - * deps: debug@~2.1.1 - * deps: methods@~1.1.1 - * deps: proxy-addr@~1.0.5 - - deps: ipaddr.js@0.1.6 - * deps: send@0.11.0 - - deps: debug@~2.1.1 - - deps: etag@~1.5.1 - - deps: ms@0.7.0 - - deps: on-finished@~2.2.0 - -3.18.6 / 2014-12-12 -=================== - - * Fix exception in `req.fresh`/`req.stale` without response headers - -3.18.5 / 2014-12-11 -=================== - - * deps: connect@2.27.6 - - deps: compression@~1.2.2 - - deps: express-session@~1.9.3 - - deps: http-errors@~1.2.8 - - deps: serve-index@~1.5.3 - - deps: type-is@~1.5.4 - -3.18.4 / 2014-11-23 -=================== - - * deps: connect@2.27.4 - - deps: body-parser@~1.9.3 - - deps: compression@~1.2.1 - - deps: errorhandler@~1.2.3 - - deps: express-session@~1.9.2 - - deps: qs@2.3.3 - - deps: serve-favicon@~2.1.7 - - deps: serve-static@~1.5.1 - - deps: type-is@~1.5.3 - * deps: etag@~1.5.1 - * deps: proxy-addr@~1.0.4 - - deps: ipaddr.js@0.1.5 - -3.18.3 / 2014-11-09 -=================== - - * deps: connect@2.27.3 - - Correctly invoke async callback asynchronously - - deps: csurf@~1.6.3 - -3.18.2 / 2014-10-28 -=================== - - * deps: connect@2.27.2 - - Fix handling of URLs containing `://` in the path - - deps: body-parser@~1.9.2 - - deps: qs@2.3.2 - -3.18.1 / 2014-10-22 -=================== - - * Fix internal `utils.merge` deprecation warnings - * deps: connect@2.27.1 - - deps: body-parser@~1.9.1 - - deps: express-session@~1.9.1 - - deps: finalhandler@0.3.2 - - deps: morgan@~1.4.1 - - deps: qs@2.3.0 - - deps: serve-static@~1.7.1 - * deps: send@0.10.1 - - deps: on-finished@~2.1.1 - -3.18.0 / 2014-10-17 -=================== - - * Use `content-disposition` module for `res.attachment`/`res.download` - - Sends standards-compliant `Content-Disposition` header - - Full Unicode support - * Use `etag` module to generate `ETag` headers - * deps: connect@2.27.0 - - Use `http-errors` module for creating errors - - Use `utils-merge` module for merging objects - - deps: body-parser@~1.9.0 - - deps: compression@~1.2.0 - - deps: connect-timeout@~1.4.0 - - deps: debug@~2.1.0 - - deps: depd@~1.0.0 - - deps: express-session@~1.9.0 - - deps: finalhandler@0.3.1 - - deps: method-override@~2.3.0 - - deps: morgan@~1.4.0 - - deps: response-time@~2.2.0 - - deps: serve-favicon@~2.1.6 - - deps: serve-index@~1.5.0 - - deps: serve-static@~1.7.0 - * deps: debug@~2.1.0 - - Implement `DEBUG_FD` env variable support - * deps: depd@~1.0.0 - * deps: send@0.10.0 - - deps: debug@~2.1.0 - - deps: depd@~1.0.0 - - deps: etag@~1.5.0 - -3.17.8 / 2014-10-15 -=================== - - * deps: connect@2.26.6 - - deps: compression@~1.1.2 - - deps: csurf@~1.6.2 - - deps: errorhandler@~1.2.2 - -3.17.7 / 2014-10-08 -=================== - - * deps: connect@2.26.5 - - Fix accepting non-object arguments to `logger` - - deps: serve-static@~1.6.4 - -3.17.6 / 2014-10-02 -=================== - - * deps: connect@2.26.4 - - deps: morgan@~1.3.2 - - deps: type-is@~1.5.2 - -3.17.5 / 2014-09-24 -=================== - - * deps: connect@2.26.3 - - deps: body-parser@~1.8.4 - - deps: serve-favicon@~2.1.5 - - deps: serve-static@~1.6.3 - * deps: proxy-addr@~1.0.3 - - Use `forwarded` npm module - * deps: send@0.9.3 - - deps: etag@~1.4.0 - -3.17.4 / 2014-09-19 -=================== - - * deps: connect@2.26.2 - - deps: body-parser@~1.8.3 - - deps: qs@2.2.4 - -3.17.3 / 2014-09-18 -=================== - - * deps: proxy-addr@~1.0.2 - - Fix a global leak when multiple subnets are trusted - - deps: ipaddr.js@0.1.3 - -3.17.2 / 2014-09-15 -=================== - - * Use `crc` instead of `buffer-crc32` for speed - * deps: connect@2.26.1 - - deps: body-parser@~1.8.2 - - deps: depd@0.4.5 - - deps: express-session@~1.8.2 - - deps: morgan@~1.3.1 - - deps: serve-favicon@~2.1.3 - - deps: serve-static@~1.6.2 - * deps: depd@0.4.5 - * deps: send@0.9.2 - - deps: depd@0.4.5 - - deps: etag@~1.3.1 - - deps: range-parser@~1.0.2 - -3.17.1 / 2014-09-08 -=================== - - * Fix error in `req.subdomains` on empty host - -3.17.0 / 2014-09-08 -=================== - - * Support `X-Forwarded-Host` in `req.subdomains` - * Support IP address host in `req.subdomains` - * deps: connect@2.26.0 - - deps: body-parser@~1.8.1 - - deps: compression@~1.1.0 - - deps: connect-timeout@~1.3.0 - - deps: cookie-parser@~1.3.3 - - deps: cookie-signature@1.0.5 - - deps: csurf@~1.6.1 - - deps: debug@~2.0.0 - - deps: errorhandler@~1.2.0 - - deps: express-session@~1.8.1 - - deps: finalhandler@0.2.0 - - deps: fresh@0.2.4 - - deps: media-typer@0.3.0 - - deps: method-override@~2.2.0 - - deps: morgan@~1.3.0 - - deps: qs@2.2.3 - - deps: serve-favicon@~2.1.3 - - deps: serve-index@~1.2.1 - - deps: serve-static@~1.6.1 - - deps: type-is@~1.5.1 - - deps: vhost@~3.0.0 - * deps: cookie-signature@1.0.5 - * deps: debug@~2.0.0 - * deps: fresh@0.2.4 - * deps: media-typer@0.3.0 - - Throw error when parameter format invalid on parse - * deps: range-parser@~1.0.2 - * deps: send@0.9.1 - - Add `lastModified` option - - Use `etag` to generate `ETag` header - - deps: debug@~2.0.0 - - deps: fresh@0.2.4 - * deps: vary@~1.0.0 - - Accept valid `Vary` header string as `field` - -3.16.10 / 2014-09-04 -==================== - - * deps: connect@2.25.10 - - deps: serve-static@~1.5.4 - * deps: send@0.8.5 - - Fix a path traversal issue when using `root` - - Fix malicious path detection for empty string path - -3.16.9 / 2014-08-29 -=================== - - * deps: connect@2.25.9 - - deps: body-parser@~1.6.7 - - deps: qs@2.2.2 - -3.16.8 / 2014-08-27 -=================== - - * deps: connect@2.25.8 - - deps: body-parser@~1.6.6 - - deps: csurf@~1.4.1 - - deps: qs@2.2.0 - -3.16.7 / 2014-08-18 -=================== - - * deps: connect@2.25.7 - - deps: body-parser@~1.6.5 - - deps: express-session@~1.7.6 - - deps: morgan@~1.2.3 - - deps: serve-static@~1.5.3 - * deps: send@0.8.3 - - deps: destroy@1.0.3 - - deps: on-finished@2.1.0 - -3.16.6 / 2014-08-14 -=================== - - * deps: connect@2.25.6 - - deps: body-parser@~1.6.4 - - deps: qs@1.2.2 - - deps: serve-static@~1.5.2 - * deps: send@0.8.2 - - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` - -3.16.5 / 2014-08-11 -=================== - - * deps: connect@2.25.5 - - Fix backwards compatibility in `logger` - -3.16.4 / 2014-08-10 -=================== - - * Fix original URL parsing in `res.location` - * deps: connect@2.25.4 - - Fix `query` middleware breaking with argument - - deps: body-parser@~1.6.3 - - deps: compression@~1.0.11 - - deps: connect-timeout@~1.2.2 - - deps: express-session@~1.7.5 - - deps: method-override@~2.1.3 - - deps: on-headers@~1.0.0 - - deps: parseurl@~1.3.0 - - deps: qs@1.2.1 - - deps: response-time@~2.0.1 - - deps: serve-index@~1.1.6 - - deps: serve-static@~1.5.1 - * deps: parseurl@~1.3.0 - -3.16.3 / 2014-08-07 -=================== - - * deps: connect@2.25.3 - - deps: multiparty@3.3.2 - -3.16.2 / 2014-08-07 -=================== - - * deps: connect@2.25.2 - - deps: body-parser@~1.6.2 - - deps: qs@1.2.0 - -3.16.1 / 2014-08-06 -=================== - - * deps: connect@2.25.1 - - deps: body-parser@~1.6.1 - - deps: qs@1.1.0 - -3.16.0 / 2014-08-05 -=================== - - * deps: connect@2.25.0 - - deps: body-parser@~1.6.0 - - deps: compression@~1.0.10 - - deps: csurf@~1.4.0 - - deps: express-session@~1.7.4 - - deps: qs@1.0.2 - - deps: serve-static@~1.5.0 - * deps: send@0.8.1 - - Add `extensions` option - -3.15.3 / 2014-08-04 -=================== - - * fix `res.sendfile` regression for serving directory index files - * deps: connect@2.24.3 - - deps: serve-index@~1.1.5 - - deps: serve-static@~1.4.4 - * deps: send@0.7.4 - - Fix incorrect 403 on Windows and Node.js 0.11 - - Fix serving index files without root dir - -3.15.2 / 2014-07-27 -=================== - - * deps: connect@2.24.2 - - deps: body-parser@~1.5.2 - - deps: depd@0.4.4 - - deps: express-session@~1.7.2 - - deps: morgan@~1.2.2 - - deps: serve-static@~1.4.2 - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - -3.15.1 / 2014-07-26 -=================== - - * deps: connect@2.24.1 - - deps: body-parser@~1.5.1 - - deps: depd@0.4.3 - - deps: express-session@~1.7.1 - - deps: morgan@~1.2.1 - - deps: serve-index@~1.1.4 - - deps: serve-static@~1.4.1 - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - -3.15.0 / 2014-07-22 -=================== - - * Fix `req.protocol` for proxy-direct connections - * Pass options from `res.sendfile` to `send` - * deps: connect@2.24.0 - - deps: body-parser@~1.5.0 - - deps: compression@~1.0.9 - - deps: connect-timeout@~1.2.1 - - deps: debug@1.0.4 - - deps: depd@0.4.2 - - deps: express-session@~1.7.0 - - deps: finalhandler@0.1.0 - - deps: method-override@~2.1.2 - - deps: morgan@~1.2.0 - - deps: multiparty@3.3.1 - - deps: parseurl@~1.2.0 - - deps: serve-static@~1.4.0 - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -3.14.0 / 2014-07-11 -=================== - - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * deps: basic-auth@1.0.0 - - support empty password - - support empty username - * deps: connect@2.23.0 - - deps: debug@1.0.3 - - deps: express-session@~1.6.4 - - deps: method-override@~2.1.0 - - deps: parseurl@~1.1.3 - - deps: serve-static@~1.3.1 - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -3.13.0 / 2014-07-03 -=================== - - * add deprecation message to `app.configure` - * add deprecation message to `req.auth` - * use `basic-auth` to parse `Authorization` header - * deps: connect@2.22.0 - - deps: csurf@~1.3.0 - - deps: express-session@~1.6.1 - - deps: multiparty@3.3.0 - - deps: serve-static@~1.3.0 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - -3.12.1 / 2014-06-26 -=================== - - * deps: connect@2.21.1 - - deps: cookie-parser@1.3.2 - - deps: cookie-signature@1.0.4 - - deps: express-session@~1.5.2 - - deps: type-is@~1.3.2 - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -3.12.0 / 2014-06-21 -=================== - - * use `media-typer` to alter content-type charset - * deps: connect@2.21.0 - - deprecate `connect(middleware)` -- use `app.use(middleware)` instead - - deprecate `connect.createServer()` -- use `connect()` instead - - fix `res.setHeader()` patch to work with with get -> append -> set pattern - - deps: compression@~1.0.8 - - deps: errorhandler@~1.1.1 - - deps: express-session@~1.5.0 - - deps: serve-index@~1.1.3 - -3.11.0 / 2014-06-19 -=================== - - * deprecate things with `depd` module - * deps: buffer-crc32@0.2.3 - * deps: connect@2.20.2 - - deprecate `verify` option to `json` -- use `body-parser` npm module instead - - deprecate `verify` option to `urlencoded` -- use `body-parser` npm module instead - - deprecate things with `depd` module - - use `finalhandler` for final response handling - - use `media-typer` to parse `content-type` for charset - - deps: body-parser@1.4.3 - - deps: connect-timeout@1.1.1 - - deps: cookie-parser@1.3.1 - - deps: csurf@1.2.2 - - deps: errorhandler@1.1.0 - - deps: express-session@1.4.0 - - deps: multiparty@3.2.9 - - deps: serve-index@1.1.2 - - deps: type-is@1.3.1 - - deps: vhost@2.0.0 - -3.10.5 / 2014-06-11 -=================== - - * deps: connect@2.19.6 - - deps: body-parser@1.3.1 - - deps: compression@1.0.7 - - deps: debug@1.0.2 - - deps: serve-index@1.1.1 - - deps: serve-static@1.2.3 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -3.10.4 / 2014-06-09 -=================== - - * deps: connect@2.19.5 - - fix "event emitter leak" warnings - - deps: csurf@1.2.1 - - deps: debug@1.0.1 - - deps: serve-static@1.2.2 - - deps: type-is@1.2.1 - * deps: debug@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: finished@1.2.1 - - deps: debug@1.0.1 - -3.10.3 / 2014-06-05 -=================== - - * use `vary` module for `res.vary` - * deps: connect@2.19.4 - - deps: errorhandler@1.0.2 - - deps: method-override@2.0.2 - - deps: serve-favicon@2.0.1 - * deps: debug@1.0.0 - -3.10.2 / 2014-06-03 -=================== - - * deps: connect@2.19.3 - - deps: compression@1.0.6 - -3.10.1 / 2014-06-03 -=================== - - * deps: connect@2.19.2 - - deps: compression@1.0.4 - * deps: proxy-addr@1.0.1 - -3.10.0 / 2014-06-02 -=================== - - * deps: connect@2.19.1 - - deprecate `methodOverride()` -- use `method-override` npm module instead - - deps: body-parser@1.3.0 - - deps: method-override@2.0.1 - - deps: multiparty@3.2.8 - - deps: response-time@2.0.0 - - deps: serve-static@1.2.1 - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -3.9.0 / 2014-05-30 -================== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * Include ETag in HEAD requests - * mark `res.send` ETag as weak and reduce collisions - * update connect to 2.18.0 - - deps: compression@1.0.3 - - deps: serve-index@1.1.0 - - deps: serve-static@1.2.0 - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - -3.8.1 / 2014-05-27 -================== - - * update connect to 2.17.3 - - deps: body-parser@1.2.2 - - deps: express-session@1.2.1 - - deps: method-override@1.0.2 - -3.8.0 / 2014-05-21 -================== - - * keep previous `Content-Type` for `res.jsonp` - * set proper `charset` in `Content-Type` for `res.send` - * update connect to 2.17.1 - - fix `res.charset` appending charset when `content-type` has one - - deps: express-session@1.2.0 - - deps: morgan@1.1.1 - - deps: serve-index@1.0.3 - -3.7.0 / 2014-05-18 -================== - - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * update connect to 2.16.2 - - deprecate `res.headerSent` -- use `res.headersSent` - - deprecate `res.on("header")` -- use on-headers module instead - - fix edge-case in `res.appendHeader` that would append in wrong order - - json: use body-parser - - urlencoded: use body-parser - - dep: bytes@1.0.0 - - dep: cookie-parser@1.1.0 - - dep: csurf@1.2.0 - - dep: express-session@1.1.0 - - dep: method-override@1.0.1 - -3.6.0 / 2014-05-09 -================== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update connect to 2.15.0 - * Add `res.appendHeader` - * Call error stack even when response has been sent - * Patch `res.headerSent` to return Boolean - * Patch `res.headersSent` for node.js 0.8 - * Prevent default 404 handler after response sent - * dep: compression@1.0.2 - * dep: connect-timeout@1.1.0 - * dep: debug@^0.8.0 - * dep: errorhandler@1.0.1 - * dep: express-session@1.0.4 - * dep: morgan@1.0.1 - * dep: serve-favicon@2.0.0 - * dep: serve-index@1.0.2 - * update debug to 0.8.0 - * add `enable()` method - * change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - * update mkdirp to 0.5.0 - -3.5.3 / 2014-05-08 -================== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -3.5.2 / 2014-04-24 -================== - - * update connect to 2.14.5 - * update cookie to 0.1.2 - * update mkdirp to 0.4.0 - * update send to 0.3.0 - -3.5.1 / 2014-03-25 -================== - - * pin less-middleware in generated app - -3.5.0 / 2014-03-06 -================== - - * bump deps - -3.4.8 / 2014-01-13 -================== - - * prevent incorrect automatic OPTIONS responses #1868 @dpatti - * update binary and examples for jade 1.0 #1876 @yossi, #1877 @reqshark, #1892 @matheusazzi - * throw 400 in case of malformed paths @rlidwka - -3.4.7 / 2013-12-10 -================== - - * update connect - -3.4.6 / 2013-12-01 -================== - - * update connect (raw-body) - -3.4.5 / 2013-11-27 -================== - - * update connect - * res.location: remove leading ./ #1802 @kapouer - * res.redirect: fix `res.redirect('toString') #1829 @michaelficarra - * res.send: always send ETag when content-length > 0 - * router: add Router.all() method - -3.4.4 / 2013-10-29 -================== - - * update connect - * update supertest - * update methods - * express(1): replace bodyParser() with urlencoded() and json() #1795 @chirag04 - -3.4.3 / 2013-10-23 -================== - - * update connect - -3.4.2 / 2013-10-18 -================== - - * update connect - * downgrade commander - -3.4.1 / 2013-10-15 -================== - - * update connect - * update commander - * jsonp: check if callback is a function - * router: wrap encodeURIComponent in a try/catch #1735 (@lxe) - * res.format: now includes charset @1747 (@sorribas) - * res.links: allow multiple calls @1746 (@sorribas) - -3.4.0 / 2013-09-07 -================== - - * add res.vary(). Closes #1682 - * update connect - -3.3.8 / 2013-09-02 -================== - - * update connect - -3.3.7 / 2013-08-28 -================== - - * update connect - -3.3.6 / 2013-08-27 -================== - - * Revert "remove charset from json responses. Closes #1631" (causes issues in some clients) - * add: req.accepts take an argument list - -3.3.4 / 2013-07-08 -================== - - * update send and connect - -3.3.3 / 2013-07-04 -================== - - * update connect - -3.3.2 / 2013-07-03 -================== - - * update connect - * update send - * remove .version export - -3.3.1 / 2013-06-27 -================== - - * update connect - -3.3.0 / 2013-06-26 -================== - - * update connect - * add support for multiple X-Forwarded-Proto values. Closes #1646 - * change: remove charset from json responses. Closes #1631 - * change: return actual booleans from req.accept* functions - * fix jsonp callback array throw - -3.2.6 / 2013-06-02 -================== - - * update connect - -3.2.5 / 2013-05-21 -================== - - * update connect - * update node-cookie - * add: throw a meaningful error when there is no default engine - * change generation of ETags with res.send() to GET requests only. Closes #1619 - -3.2.4 / 2013-05-09 -================== - - * fix `req.subdomains` when no Host is present - * fix `req.host` when no Host is present, return undefined - -3.2.3 / 2013-05-07 -================== - - * update connect / qs - -3.2.2 / 2013-05-03 -================== - - * update qs - -3.2.1 / 2013-04-29 -================== - - * add app.VERB() paths array deprecation warning - * update connect - * update qs and remove all ~ semver crap - * fix: accept number as value of Signed Cookie - -3.2.0 / 2013-04-15 -================== - - * add "view" constructor setting to override view behaviour - * add req.acceptsEncoding(name) - * add req.acceptedEncodings - * revert cookie signature change causing session race conditions - * fix sorting of Accept values of the same quality - -3.1.2 / 2013-04-12 -================== - - * add support for custom Accept parameters - * update cookie-signature - -3.1.1 / 2013-04-01 -================== - - * add X-Forwarded-Host support to `req.host` - * fix relative redirects - * update mkdirp - * update buffer-crc32 - * remove legacy app.configure() method from app template. - -3.1.0 / 2013-01-25 -================== - - * add support for leading "." in "view engine" setting - * add array support to `res.set()` - * add node 0.8.x to travis.yml - * add "subdomain offset" setting for tweaking `req.subdomains` - * add `res.location(url)` implementing `res.redirect()`-like setting of Location - * use app.get() for x-powered-by setting for inheritance - * fix colons in passwords for `req.auth` - -3.0.6 / 2013-01-04 -================== - - * add http verb methods to Router - * update connect - * fix mangling of the `res.cookie()` options object - * fix jsonp whitespace escape. Closes #1132 - -3.0.5 / 2012-12-19 -================== - - * add throwing when a non-function is passed to a route - * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses - * revert "add 'etag' option" - -3.0.4 / 2012-12-05 -================== - - * add 'etag' option to disable `res.send()` Etags - * add escaping of urls in text/plain in `res.redirect()` - for old browsers interpreting as html - * change crc32 module for a more liberal license - * update connect - -3.0.3 / 2012-11-13 -================== - - * update connect - * update cookie module - * fix cookie max-age - -3.0.2 / 2012-11-08 -================== - - * add OPTIONS to cors example. Closes #1398 - * fix route chaining regression. Closes #1397 - -3.0.1 / 2012-11-01 -================== - - * update connect - -3.0.0 / 2012-10-23 -================== - - * add `make clean` - * add "Basic" check to req.auth - * add `req.auth` test coverage - * add cb && cb(payload) to `res.jsonp()`. Closes #1374 - * add backwards compat for `res.redirect()` status. Closes #1336 - * add support for `res.json()` to retain previously defined Content-Types. Closes #1349 - * update connect - * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382 - * remove non-primitive string support for `res.send()` - * fix view-locals example. Closes #1370 - * fix route-separation example - -3.0.0rc5 / 2012-09-18 -================== - - * update connect - * add redis search example - * add static-files example - * add "x-powered-by" setting (`app.disable('x-powered-by')`) - * add "application/octet-stream" redirect Accept test case. Closes #1317 - -3.0.0rc4 / 2012-08-30 -================== - - * add `res.jsonp()`. Closes #1307 - * add "verbose errors" option to error-pages example - * add another route example to express(1) so people are not so confused - * add redis online user activity tracking example - * update connect dep - * fix etag quoting. Closes #1310 - * fix error-pages 404 status - * fix jsonp callback char restrictions - * remove old OPTIONS default response - -3.0.0rc3 / 2012-08-13 -================== - - * update connect dep - * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds] - * fix `res.render()` clobbering of "locals" - -3.0.0rc2 / 2012-08-03 -================== - - * add CORS example - * update connect dep - * deprecate `.createServer()` & remove old stale examples - * fix: escape `res.redirect()` link - * fix vhost example - -3.0.0rc1 / 2012-07-24 -================== - - * add more examples to view-locals - * add scheme-relative redirects (`res.redirect("//foo.com")`) support - * update cookie dep - * update connect dep - * update send dep - * fix `express(1)` -h flag, use -H for hogan. Closes #1245 - * fix `res.sendfile()` socket error handling regression - -3.0.0beta7 / 2012-07-16 -================== - - * update connect dep for `send()` root normalization regression - -3.0.0beta6 / 2012-07-13 -================== - - * add `err.view` property for view errors. Closes #1226 - * add "jsonp callback name" setting - * add support for "/foo/:bar*" non-greedy matches - * change `res.sendfile()` to use `send()` module - * change `res.send` to use "response-send" module - * remove `app.locals.use` and `res.locals.use`, use regular middleware - -3.0.0beta5 / 2012-07-03 -================== - - * add "make check" support - * add route-map example - * add `res.json(obj, status)` support back for BC - * add "methods" dep, remove internal methods module - * update connect dep - * update auth example to utilize cores pbkdf2 - * updated tests to use "supertest" - -3.0.0beta4 / 2012-06-25 -================== - - * Added `req.auth` - * Added `req.range(size)` - * Added `res.links(obj)` - * Added `res.send(body, status)` support back for backwards compat - * Added `.default()` support to `res.format()` - * Added 2xx / 304 check to `req.fresh` - * Revert "Added + support to the router" - * Fixed `res.send()` freshness check, respect res.statusCode - -3.0.0beta3 / 2012-06-15 -================== - - * Added hogan `--hjs` to express(1) [nullfirm] - * Added another example to content-negotiation - * Added `fresh` dep - * Changed: `res.send()` always checks freshness - * Fixed: expose connects mime module. Closes #1165 - -3.0.0beta2 / 2012-06-06 -================== - - * Added `+` support to the router - * Added `req.host` - * Changed `req.param()` to check route first - * Update connect dep - -3.0.0beta1 / 2012-06-01 -================== - - * Added `res.format()` callback to override default 406 behaviour - * Fixed `res.redirect()` 406. Closes #1154 - -3.0.0alpha5 / 2012-05-30 -================== - - * Added `req.ip` - * Added `{ signed: true }` option to `res.cookie()` - * Removed `res.signedCookie()` - * Changed: dont reverse `req.ips` - * Fixed "trust proxy" setting check for `req.ips` - -3.0.0alpha4 / 2012-05-09 -================== - - * Added: allow `[]` in jsonp callback. Closes #1128 - * Added `PORT` env var support in generated template. Closes #1118 [benatkin] - * Updated: connect 2.2.2 - -3.0.0alpha3 / 2012-05-04 -================== - - * Added public `app.routes`. Closes #887 - * Added _view-locals_ example - * Added _mvc_ example - * Added `res.locals.use()`. Closes #1120 - * Added conditional-GET support to `res.send()` - * Added: coerce `res.set()` values to strings - * Changed: moved `static()` in generated apps below router - * Changed: `res.send()` only set ETag when not previously set - * Changed connect 2.2.1 dep - * Changed: `make test` now runs unit / acceptance tests - * Fixed req/res proto inheritance - -3.0.0alpha2 / 2012-04-26 -================== - - * Added `make benchmark` back - * Added `res.send()` support for `String` objects - * Added client-side data exposing example - * Added `res.header()` and `req.header()` aliases for BC - * Added `express.createServer()` for BC - * Perf: memoize parsed urls - * Perf: connect 2.2.0 dep - * Changed: make `expressInit()` middleware self-aware - * Fixed: use app.get() for all core settings - * Fixed redis session example - * Fixed session example. Closes #1105 - * Fixed generated express dep. Closes #1078 - -3.0.0alpha1 / 2012-04-15 -================== - - * Added `app.locals.use(callback)` - * Added `app.locals` object - * Added `app.locals(obj)` - * Added `res.locals` object - * Added `res.locals(obj)` - * Added `res.format()` for content-negotiation - * Added `app.engine()` - * Added `res.cookie()` JSON cookie support - * Added "trust proxy" setting - * Added `req.subdomains` - * Added `req.protocol` - * Added `req.secure` - * Added `req.path` - * Added `req.ips` - * Added `req.fresh` - * Added `req.stale` - * Added comma-delimited / array support for `req.accepts()` - * Added debug instrumentation - * Added `res.set(obj)` - * Added `res.set(field, value)` - * Added `res.get(field)` - * Added `app.get(setting)`. Closes #842 - * Added `req.acceptsLanguage()` - * Added `req.acceptsCharset()` - * Added `req.accepted` - * Added `req.acceptedLanguages` - * Added `req.acceptedCharsets` - * Added "json replacer" setting - * Added "json spaces" setting - * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92 - * Added `--less` support to express(1) - * Added `express.response` prototype - * Added `express.request` prototype - * Added `express.application` prototype - * Added `app.path()` - * Added `app.render()` - * Added `res.type()` to replace `res.contentType()` - * Changed: `res.redirect()` to add relative support - * Changed: enable "jsonp callback" by default - * Changed: renamed "case sensitive routes" to "case sensitive routing" - * Rewrite of all tests with mocha - * Removed "root" setting - * Removed `res.redirect('home')` support - * Removed `req.notify()` - * Removed `app.register()` - * Removed `app.redirect()` - * Removed `app.is()` - * Removed `app.helpers()` - * Removed `app.dynamicHelpers()` - * Fixed `res.sendfile()` with non-GET. Closes #723 - * Fixed express(1) public dir for windows. Closes #866 - -2.5.9/ 2012-04-02 -================== - - * Added support for PURGE request method [pbuyle] - * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki] - -2.5.8 / 2012-02-08 -================== - - * Update mkdirp dep. Closes #991 - -2.5.7 / 2012-02-06 -================== - - * Fixed `app.all` duplicate DELETE requests [mscdex] - -2.5.6 / 2012-01-13 -================== - - * Updated hamljs dev dep. Closes #953 - -2.5.5 / 2012-01-08 -================== - - * Fixed: set `filename` on cached templates [matthewleon] - -2.5.4 / 2012-01-02 -================== - - * Fixed `express(1)` eol on 0.4.x. Closes #947 - -2.5.3 / 2011-12-30 -================== - - * Fixed `req.is()` when a charset is present - -2.5.2 / 2011-12-10 -================== - - * Fixed: express(1) LF -> CRLF for windows - -2.5.1 / 2011-11-17 -================== - - * Changed: updated connect to 1.8.x - * Removed sass.js support from express(1) - -2.5.0 / 2011-10-24 -================== - - * Added ./routes dir for generated app by default - * Added npm install reminder to express(1) app gen - * Added 0.5.x support - * Removed `make test-cov` since it wont work with node 0.5.x - * Fixed express(1) public dir for windows. Closes #866 - -2.4.7 / 2011-10-05 -================== - - * Added mkdirp to express(1). Closes #795 - * Added simple _json-config_ example - * Added shorthand for the parsed request's pathname via `req.path` - * Changed connect dep to 1.7.x to fix npm issue... - * Fixed `res.redirect()` __HEAD__ support. [reported by xerox] - * Fixed `req.flash()`, only escape args - * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie] - -2.4.6 / 2011-08-22 -================== - - * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode] - -2.4.5 / 2011-08-19 -================== - - * Added support for routes to handle errors. Closes #809 - * Added `app.routes.all()`. Closes #803 - * Added "basepath" setting to work in conjunction with reverse proxies etc. - * Refactored `Route` to use a single array of callbacks - * Added support for multiple callbacks for `app.param()`. Closes #801 -Closes #805 - * Changed: removed .call(self) for route callbacks - * Dependency: `qs >= 0.3.1` - * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808 - -2.4.4 / 2011-08-05 -================== - - * Fixed `res.header()` intention of a set, even when `undefined` - * Fixed `*`, value no longer required - * Fixed `res.send(204)` support. Closes #771 - -2.4.3 / 2011-07-14 -================== - - * Added docs for `status` option special-case. Closes #739 - * Fixed `options.filename`, exposing the view path to template engines - -2.4.2. / 2011-07-06 -================== - - * Revert "removed jsonp stripping" for XSS - -2.4.1 / 2011-07-06 -================== - - * Added `res.json()` JSONP support. Closes #737 - * Added _extending-templates_ example. Closes #730 - * Added "strict routing" setting for trailing slashes - * Added support for multiple envs in `app.configure()` calls. Closes #735 - * Changed: `res.send()` using `res.json()` - * Changed: when cookie `path === null` don't default it - * Changed; default cookie path to "home" setting. Closes #731 - * Removed _pids/logs_ creation from express(1) - -2.4.0 / 2011-06-28 -================== - - * Added chainable `res.status(code)` - * Added `res.json()`, an explicit version of `res.send(obj)` - * Added simple web-service example - -2.3.12 / 2011-06-22 -================== - - * \#express is now on freenode! come join! - * Added `req.get(field, param)` - * Added links to Japanese documentation, thanks @hideyukisaito! - * Added; the `express(1)` generated app outputs the env - * Added `content-negotiation` example - * Dependency: connect >= 1.5.1 < 2.0.0 - * Fixed view layout bug. Closes #720 - * Fixed; ignore body on 304. Closes #701 - -2.3.11 / 2011-06-04 -================== - - * Added `npm test` - * Removed generation of dummy test file from `express(1)` - * Fixed; `express(1)` adds express as a dep - * Fixed; prune on `prepublish` - -2.3.10 / 2011-05-27 -================== - - * Added `req.route`, exposing the current route - * Added _package.json_ generation support to `express(1)` - * Fixed call to `app.param()` function for optional params. Closes #682 - -2.3.9 / 2011-05-25 -================== - - * Fixed bug-ish with `../' in `res.partial()` calls - -2.3.8 / 2011-05-24 -================== - - * Fixed `app.options()` - -2.3.7 / 2011-05-23 -================== - - * Added route `Collection`, ex: `app.get('/user/:id').remove();` - * Added support for `app.param(fn)` to define param logic - * Removed `app.param()` support for callback with return value - * Removed module.parent check from express(1) generated app. Closes #670 - * Refactored router. Closes #639 - -2.3.6 / 2011-05-20 -================== - - * Changed; using devDependencies instead of git submodules - * Fixed redis session example - * Fixed markdown example - * Fixed view caching, should not be enabled in development - -2.3.5 / 2011-05-20 -================== - - * Added export `.view` as alias for `.View` - -2.3.4 / 2011-05-08 -================== - - * Added `./examples/say` - * Fixed `res.sendfile()` bug preventing the transfer of files with spaces - -2.3.3 / 2011-05-03 -================== - - * Added "case sensitive routes" option. - * Changed; split methods supported per rfc [slaskis] - * Fixed route-specific middleware when using the same callback function several times - -2.3.2 / 2011-04-27 -================== - - * Fixed view hints - -2.3.1 / 2011-04-26 -================== - - * Added `app.match()` as `app.match.all()` - * Added `app.lookup()` as `app.lookup.all()` - * Added `app.remove()` for `app.remove.all()` - * Added `app.remove.VERB()` - * Fixed template caching collision issue. Closes #644 - * Moved router over from connect and started refactor - -2.3.0 / 2011-04-25 -================== - - * Added options support to `res.clearCookie()` - * Added `res.helpers()` as alias of `res.locals()` - * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0` - * Changed; auto set Content-Type in res.attachement [Aaron Heckmann] - * Renamed "cache views" to "view cache". Closes #628 - * Fixed caching of views when using several apps. Closes #637 - * Fixed gotcha invoking `app.param()` callbacks once per route middleware. -Closes #638 - * Fixed partial lookup precedence. Closes #631 -Shaw] - -2.2.2 / 2011-04-12 -================== - - * Added second callback support for `res.download()` connection errors - * Fixed `filename` option passing to template engine - -2.2.1 / 2011-04-04 -================== - - * Added `layout(path)` helper to change the layout within a view. Closes #610 - * Fixed `partial()` collection object support. - Previously only anything with `.length` would work. - When `.length` is present one must still be aware of holes, - however now `{ collection: {foo: 'bar'}}` is valid, exposes - `keyInCollection` and `keysInCollection`. - - * Performance improved with better view caching - * Removed `request` and `response` locals - * Changed; errorHandler page title is now `Express` instead of `Connect` - -2.2.0 / 2011-03-30 -================== - - * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606 - * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606 - * Added `app.VERB(path)` as alias of `app.lookup.VERB()`. - * Dependency `connect >= 1.2.0` - -2.1.1 / 2011-03-29 -================== - - * Added; expose `err.view` object when failing to locate a view - * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann] - * Fixed; `res.send(undefined)` responds with 204 [aheckmann] - -2.1.0 / 2011-03-24 -================== - - * Added `/_?` partial lookup support. Closes #447 - * Added `request`, `response`, and `app` local variables - * Added `settings` local variable, containing the app's settings - * Added `req.flash()` exception if `req.session` is not available - * Added `res.send(bool)` support (json response) - * Fixed stylus example for latest version - * Fixed; wrap try/catch around `res.render()` - -2.0.0 / 2011-03-17 -================== - - * Fixed up index view path alternative. - * Changed; `res.locals()` without object returns the locals - -2.0.0rc3 / 2011-03-17 -================== - - * Added `res.locals(obj)` to compliment `res.local(key, val)` - * Added `res.partial()` callback support - * Fixed recursive error reporting issue in `res.render()` - -2.0.0rc2 / 2011-03-17 -================== - - * Changed; `partial()` "locals" are now optional - * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01] - * Fixed .filename view engine option [reported by drudge] - * Fixed blog example - * Fixed `{req,res}.app` reference when mounting [Ben Weaver] - -2.0.0rc / 2011-03-14 -================== - - * Fixed; expose `HTTPSServer` constructor - * Fixed express(1) default test charset. Closes #579 [reported by secoif] - * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP] - -2.0.0beta3 / 2011-03-09 -================== - - * Added support for `res.contentType()` literal - The original `res.contentType('.json')`, - `res.contentType('application/json')`, and `res.contentType('json')` - will work now. - * Added `res.render()` status option support back - * Added charset option for `res.render()` - * Added `.charset` support (via connect 1.0.4) - * Added view resolution hints when in development and a lookup fails - * Added layout lookup support relative to the page view. - For example while rendering `./views/user/index.jade` if you create - `./views/user/layout.jade` it will be used in favour of the root layout. - * Fixed `res.redirect()`. RFC states absolute url [reported by unlink] - * Fixed; default `res.send()` string charset to utf8 - * Removed `Partial` constructor (not currently used) - -2.0.0beta2 / 2011-03-07 -================== - - * Added res.render() `.locals` support back to aid in migration process - * Fixed flash example - -2.0.0beta / 2011-03-03 -================== - - * Added HTTPS support - * Added `res.cookie()` maxAge support - * Added `req.header()` _Referrer_ / _Referer_ special-case, either works - * Added mount support for `res.redirect()`, now respects the mount-point - * Added `union()` util, taking place of `merge(clone())` combo - * Added stylus support to express(1) generated app - * Added secret to session middleware used in examples and generated app - * Added `res.local(name, val)` for progressive view locals - * Added default param support to `req.param(name, default)` - * Added `app.disabled()` and `app.enabled()` - * Added `app.register()` support for omitting leading ".", either works - * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539 - * Added `app.param()` to map route params to async/sync logic - * Added; aliased `app.helpers()` as `app.locals()`. Closes #481 - * Added extname with no leading "." support to `res.contentType()` - * Added `cache views` setting, defaulting to enabled in "production" env - * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_. - * Added `req.accepts()` support for extensions - * Changed; `res.download()` and `res.sendfile()` now utilize Connect's - static file server `connect.static.send()`. - * Changed; replaced `connect.utils.mime()` with npm _mime_ module - * Changed; allow `req.query` to be pre-defined (via middleware or other parent - * Changed view partial resolution, now relative to parent view - * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`. - * Fixed `req.param()` bug returning Array.prototype methods. Closes #552 - * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()` - * Fixed; using _qs_ module instead of _querystring_ - * Fixed; strip unsafe chars from jsonp callbacks - * Removed "stream threshold" setting - -1.0.8 / 2011-03-01 -================== - - * Allow `req.query` to be pre-defined (via middleware or other parent app) - * "connect": ">= 0.5.0 < 1.0.0". Closes #547 - * Removed the long deprecated __EXPRESS_ENV__ support - -1.0.7 / 2011-02-07 -================== - - * Fixed `render()` setting inheritance. - Mounted apps would not inherit "view engine" - -1.0.6 / 2011-02-07 -================== - - * Fixed `view engine` setting bug when period is in dirname - -1.0.5 / 2011-02-05 -================== - - * Added secret to generated app `session()` call - -1.0.4 / 2011-02-05 -================== - - * Added `qs` dependency to _package.json_ - * Fixed namespaced `require()`s for latest connect support - -1.0.3 / 2011-01-13 -================== - - * Remove unsafe characters from JSONP callback names [Ryan Grove] - -1.0.2 / 2011-01-10 -================== - - * Removed nested require, using `connect.router` - -1.0.1 / 2010-12-29 -================== - - * Fixed for middleware stacked via `createServer()` - previously the `foo` middleware passed to `createServer(foo)` - would not have access to Express methods such as `res.send()` - or props like `req.query` etc. - -1.0.0 / 2010-11-16 -================== - - * Added; deduce partial object names from the last segment. - For example by default `partial('forum/post', postObject)` will - give you the _post_ object, providing a meaningful default. - * Added http status code string representation to `res.redirect()` body - * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__. - * Added `req.is()` to aid in content negotiation - * Added partial local inheritance [suggested by masylum]. Closes #102 - providing access to parent template locals. - * Added _-s, --session[s]_ flag to express(1) to add session related middleware - * Added _--template_ flag to express(1) to specify the - template engine to use. - * Added _--css_ flag to express(1) to specify the - stylesheet engine to use (or just plain css by default). - * Added `app.all()` support [thanks aheckmann] - * Added partial direct object support. - You may now `partial('user', user)` providing the "user" local, - vs previously `partial('user', { object: user })`. - * Added _route-separation_ example since many people question ways - to do this with CommonJS modules. Also view the _blog_ example for - an alternative. - * Performance; caching view path derived partial object names - * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454 - * Fixed jsonp support; _text/javascript_ as per mailinglist discussion - -1.0.0rc4 / 2010-10-14 -================== - - * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0 - * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware)) - * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass] - * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass] - * Added `partial()` support for array-like collections. Closes #434 - * Added support for swappable querystring parsers - * Added session usage docs. Closes #443 - * Added dynamic helper caching. Closes #439 [suggested by maritz] - * Added authentication example - * Added basic Range support to `res.sendfile()` (and `res.download()` etc) - * Changed; `express(1)` generated app using 2 spaces instead of 4 - * Default env to "development" again [aheckmann] - * Removed _context_ option is no more, use "scope" - * Fixed; exposing _./support_ libs to examples so they can run without installs - * Fixed mvc example - -1.0.0rc3 / 2010-09-20 -================== - - * Added confirmation for `express(1)` app generation. Closes #391 - * Added extending of flash formatters via `app.flashFormatters` - * Added flash formatter support. Closes #411 - * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold" - * Added _stream threshold_ setting for `res.sendfile()` - * Added `res.send()` __HEAD__ support - * Added `res.clearCookie()` - * Added `res.cookie()` - * Added `res.render()` headers option - * Added `res.redirect()` response bodies - * Added `res.render()` status option support. Closes #425 [thanks aheckmann] - * Fixed `res.sendfile()` responding with 403 on malicious path - * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_ - * Fixed; mounted apps settings now inherit from parent app [aheckmann] - * Fixed; stripping Content-Length / Content-Type when 204 - * Fixed `res.send()` 204. Closes #419 - * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402 - * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo] - - -1.0.0rc2 / 2010-08-17 -================== - - * Added `app.register()` for template engine mapping. Closes #390 - * Added `res.render()` callback support as second argument (no options) - * Added callback support to `res.download()` - * Added callback support for `res.sendfile()` - * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()` - * Added "partials" setting to docs - * Added default expresso tests to `express(1)` generated app. Closes #384 - * Fixed `res.sendfile()` error handling, defer via `next()` - * Fixed `res.render()` callback when a layout is used [thanks guillermo] - * Fixed; `make install` creating ~/.node_libraries when not present - * Fixed issue preventing error handlers from being defined anywhere. Closes #387 - -1.0.0rc / 2010-07-28 -================== - - * Added mounted hook. Closes #369 - * Added connect dependency to _package.json_ - - * Removed "reload views" setting and support code - development env never caches, production always caches. - - * Removed _param_ in route callbacks, signature is now - simply (req, res, next), previously (req, res, params, next). - Use _req.params_ for path captures, _req.query_ for GET params. - - * Fixed "home" setting - * Fixed middleware/router precedence issue. Closes #366 - * Fixed; _configure()_ callbacks called immediately. Closes #368 - -1.0.0beta2 / 2010-07-23 -================== - - * Added more examples - * Added; exporting `Server` constructor - * Added `Server#helpers()` for view locals - * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349 - * Added support for absolute view paths - * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363 - * Added Guillermo Rauch to the contributor list - * Added support for "as" for non-collection partials. Closes #341 - * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf] - * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo] - * Fixed instanceof `Array` checks, now `Array.isArray()` - * Fixed express(1) expansion of public dirs. Closes #348 - * Fixed middleware precedence. Closes #345 - * Fixed view watcher, now async [thanks aheckmann] - -1.0.0beta / 2010-07-15 -================== - - * Re-write - - much faster - - much lighter - - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs - -0.14.0 / 2010-06-15 -================== - - * Utilize relative requires - * Added Static bufferSize option [aheckmann] - * Fixed caching of view and partial subdirectories [aheckmann] - * Fixed mime.type() comments now that ".ext" is not supported - * Updated haml submodule - * Updated class submodule - * Removed bin/express - -0.13.0 / 2010-06-01 -================== - - * Added node v0.1.97 compatibility - * Added support for deleting cookies via Request#cookie('key', null) - * Updated haml submodule - * Fixed not-found page, now using using charset utf-8 - * Fixed show-exceptions page, now using using charset utf-8 - * Fixed view support due to fs.readFile Buffers - * Changed; mime.type() no longer accepts ".type" due to node extname() changes - -0.12.0 / 2010-05-22 -================== - - * Added node v0.1.96 compatibility - * Added view `helpers` export which act as additional local variables - * Updated haml submodule - * Changed ETag; removed inode, modified time only - * Fixed LF to CRLF for setting multiple cookies - * Fixed cookie complation; values are now urlencoded - * Fixed cookies parsing; accepts quoted values and url escaped cookies - -0.11.0 / 2010-05-06 -================== - - * Added support for layouts using different engines - - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' }) - - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml' - - this.render('page.html.haml', { layout: false }) // no layout - * Updated ext submodule - * Updated haml submodule - * Fixed EJS partial support by passing along the context. Issue #307 - -0.10.1 / 2010-05-03 -================== - - * Fixed binary uploads. - -0.10.0 / 2010-04-30 -================== - - * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s - encoding is set to 'utf8' or 'utf-8'. - * Added "encoding" option to Request#render(). Closes #299 - * Added "dump exceptions" setting, which is enabled by default. - * Added simple ejs template engine support - * Added error response support for text/plain, application/json. Closes #297 - * Added callback function param to Request#error() - * Added Request#sendHead() - * Added Request#stream() - * Added support for Request#respond(304, null) for empty response bodies - * Added ETag support to Request#sendfile() - * Added options to Request#sendfile(), passed to fs.createReadStream() - * Added filename arg to Request#download() - * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request - * Performance enhanced by preventing several calls to toLowerCase() in Router#match() - * Changed; Request#sendfile() now streams - * Changed; Renamed Request#halt() to Request#respond(). Closes #289 - * Changed; Using sys.inspect() instead of JSON.encode() for error output - * Changed; run() returns the http.Server instance. Closes #298 - * Changed; Defaulting Server#host to null (INADDR_ANY) - * Changed; Logger "common" format scale of 0.4f - * Removed Logger "request" format - * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found - * Fixed several issues with http client - * Fixed Logger Content-Length output - * Fixed bug preventing Opera from retaining the generated session id. Closes #292 - -0.9.0 / 2010-04-14 -================== - - * Added DSL level error() route support - * Added DSL level notFound() route support - * Added Request#error() - * Added Request#notFound() - * Added Request#render() callback function. Closes #258 - * Added "max upload size" setting - * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254 - * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js - * Added callback function support to Request#halt() as 3rd/4th arg - * Added preprocessing of route param wildcards using param(). Closes #251 - * Added view partial support (with collections etc) - * Fixed bug preventing falsey params (such as ?page=0). Closes #286 - * Fixed setting of multiple cookies. Closes #199 - * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml) - * Changed; session cookie is now httpOnly - * Changed; Request is no longer global - * Changed; Event is no longer global - * Changed; "sys" module is no longer global - * Changed; moved Request#download to Static plugin where it belongs - * Changed; Request instance created before body parsing. Closes #262 - * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253 - * Changed; Pre-caching view partials in memory when "cache view partials" is enabled - * Updated support to node --version 0.1.90 - * Updated dependencies - * Removed set("session cookie") in favour of use(Session, { cookie: { ... }}) - * Removed utils.mixin(); use Object#mergeDeep() - -0.8.0 / 2010-03-19 -================== - - * Added coffeescript example app. Closes #242 - * Changed; cache api now async friendly. Closes #240 - * Removed deprecated 'express/static' support. Use 'express/plugins/static' - -0.7.6 / 2010-03-19 -================== - - * Added Request#isXHR. Closes #229 - * Added `make install` (for the executable) - * Added `express` executable for setting up simple app templates - * Added "GET /public/*" to Static plugin, defaulting to /public - * Added Static plugin - * Fixed; Request#render() only calls cache.get() once - * Fixed; Namespacing View caches with "view:" - * Fixed; Namespacing Static caches with "static:" - * Fixed; Both example apps now use the Static plugin - * Fixed set("views"). Closes #239 - * Fixed missing space for combined log format - * Deprecated Request#sendfile() and 'express/static' - * Removed Server#running - -0.7.5 / 2010-03-16 -================== - - * Added Request#flash() support without args, now returns all flashes - * Updated ext submodule - -0.7.4 / 2010-03-16 -================== - - * Fixed session reaper - * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft) - -0.7.3 / 2010-03-16 -================== - - * Added package.json - * Fixed requiring of haml / sass due to kiwi removal - -0.7.2 / 2010-03-16 -================== - - * Fixed GIT submodules (HAH!) - -0.7.1 / 2010-03-16 -================== - - * Changed; Express now using submodules again until a PM is adopted - * Changed; chat example using millisecond conversions from ext - -0.7.0 / 2010-03-15 -================== - - * Added Request#pass() support (finds the next matching route, or the given path) - * Added Logger plugin (default "common" format replaces CommonLogger) - * Removed Profiler plugin - * Removed CommonLogger plugin - -0.6.0 / 2010-03-11 -================== - - * Added seed.yml for kiwi package management support - * Added HTTP client query string support when method is GET. Closes #205 - - * Added support for arbitrary view engines. - For example "foo.engine.html" will now require('engine'), - the exports from this module are cached after the first require(). - - * Added async plugin support - - * Removed usage of RESTful route funcs as http client - get() etc, use http.get() and friends - - * Removed custom exceptions - -0.5.0 / 2010-03-10 -================== - - * Added ext dependency (library of js extensions) - * Removed extname() / basename() utils. Use path module - * Removed toArray() util. Use arguments.values - * Removed escapeRegexp() util. Use RegExp.escape() - * Removed process.mixin() dependency. Use utils.mixin() - * Removed Collection - * Removed ElementCollection - * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com) ;) - -0.4.0 / 2010-02-11 -================== - - * Added flash() example to sample upload app - * Added high level restful http client module (express/http) - * Changed; RESTful route functions double as HTTP clients. Closes #69 - * Changed; throwing error when routes are added at runtime - * Changed; defaulting render() context to the current Request. Closes #197 - * Updated haml submodule - -0.3.0 / 2010-02-11 -================== - - * Updated haml / sass submodules. Closes #200 - * Added flash message support. Closes #64 - * Added accepts() now allows multiple args. fixes #117 - * Added support for plugins to halt. Closes #189 - * Added alternate layout support. Closes #119 - * Removed Route#run(). Closes #188 - * Fixed broken specs due to use(Cookie) missing - -0.2.1 / 2010-02-05 -================== - - * Added "plot" format option for Profiler (for gnuplot processing) - * Added request number to Profiler plugin - * Fixed binary encoding for multi-part file uploads, was previously defaulting to UTF8 - * Fixed issue with routes not firing when not files are present. Closes #184 - * Fixed process.Promise -> events.Promise - -0.2.0 / 2010-02-03 -================== - - * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180 - * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174 - * Added expiration support to cache api with reaper. Closes #133 - * Added cache Store.Memory#reap() - * Added Cache; cache api now uses first class Cache instances - * Added abstract session Store. Closes #172 - * Changed; cache Memory.Store#get() utilizing Collection - * Renamed MemoryStore -> Store.Memory - * Fixed use() of the same plugin several time will always use latest options. Closes #176 - -0.1.0 / 2010-02-03 -================== - - * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context - * Updated node support to 0.1.27 Closes #169 - * Updated dirname(__filename) -> __dirname - * Updated libxmljs support to v0.2.0 - * Added session support with memory store / reaping - * Added quick uid() helper - * Added multi-part upload support - * Added Sass.js support / submodule - * Added production env caching view contents and static files - * Added static file caching. Closes #136 - * Added cache plugin with memory stores - * Added support to StaticFile so that it works with non-textual files. - * Removed dirname() helper - * Removed several globals (now their modules must be required) - -0.0.2 / 2010-01-10 -================== - - * Added view benchmarks; currently haml vs ejs - * Added Request#attachment() specs. Closes #116 - * Added use of node's parseQuery() util. Closes #123 - * Added `make init` for submodules - * Updated Haml - * Updated sample chat app to show messages on load - * Updated libxmljs parseString -> parseHtmlString - * Fixed `make init` to work with older versions of git - * Fixed specs can now run independent 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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/LICENSE deleted file mode 100644 index aa927e4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -(The MIT License) - -Copyright (c) 2009-2014 TJ Holowaychuk -Copyright (c) 2013-2014 Roman Shtylman -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/Readme.md deleted file mode 100644 index 8da83a5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/Readme.md +++ /dev/null @@ -1,138 +0,0 @@ -[![Express Logo](https://i.cloudup.com/zfY6lL7eFa-3000x3000.png)](http://expressjs.com/) - - Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). - - [![NPM Version][npm-image]][npm-url] - [![NPM Downloads][downloads-image]][downloads-url] - [![Linux Build][travis-image]][travis-url] - [![Windows Build][appveyor-image]][appveyor-url] - [![Test Coverage][coveralls-image]][coveralls-url] - -```js -var express = require('express') -var app = express() - -app.get('/', function (req, res) { - res.send('Hello World') -}) - -app.listen(3000) -``` - -## Installation - -```bash -$ npm install express -``` - -## Features - - * Robust routing - * Focus on high performance - * Super-high test coverage - * HTTP helpers (redirection, caching, etc) - * View system supporting 14+ template engines - * Content negotiation - * Executable for generating applications quickly - -## Docs & Community - - * [Website and Documentation](http://expressjs.com/) - [[website repo](https://github.com/strongloop/expressjs.com)] - * [#express](https://webchat.freenode.net/?channels=express) on freenode IRC - * [Github Organization](https://github.com/expressjs) for Official Middleware & Modules - * Visit the [Wiki](https://github.com/strongloop/express/wiki) - * [Google Group](https://groups.google.com/group/express-js) for discussion - * [Русскоязычная документация](http://jsman.ru/express/) - * [한국어 문서](http://expressjs.kr) - [[website repo](https://github.com/Hanul/expressjs.kr)] - -**PROTIP** Be sure to read [Migrating from 3.x to 4.x](https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x) as well as [New features in 4.x](https://github.com/strongloop/express/wiki/New-features-in-4.x). - -## Quick Start - - The quickest way to get started with express is to utilize the executable [`express(1)`](https://github.com/expressjs/generator) to generate an application as shown below: - - Install the executable. The executable's major version will match Express's: - -```bash -$ npm install -g express-generator@4 -``` - - Create the app: - -```bash -$ express /tmp/foo && cd /tmp/foo -``` - - Install dependencies: - -```bash -$ npm install -``` - - Start the server: - -```bash -$ npm start -``` - -## Philosophy - - The Express philosophy is to provide small, robust tooling for HTTP servers, making - it a great solution for single page applications, web sites, hybrids, or public - HTTP APIs. - - Express does not force you to use any specific ORM or template engine. With support for over - 14 template engines via [Consolidate.js](https://github.com/tj/consolidate.js), - you can quickly craft your perfect framework. - -## Examples - - To view the examples, clone the Express repo and install the dependencies: - -```bash -$ git clone git://github.com/strongloop/express.git --depth 1 -$ cd express -$ npm install -``` - - Then run whichever example you want: - -```bash -$ node examples/content-negotiation -``` - -## Tests - - To run the test suite, first install the dependencies, then run `npm test`: - -```bash -$ npm install -$ npm test -``` - -## People - -The original author of Express is [TJ Holowaychuk](https://github.com/tj) [![TJ's Gratipay][gratipay-image-visionmedia]][gratipay-url-visionmedia] - -The current lead maintainer is [Douglas Christopher Wilson](https://github.com/dougwilson) [![Doug's Gratipay][gratipay-image-dougwilson]][gratipay-url-dougwilson] - -[List of all contributors](https://github.com/strongloop/express/graphs/contributors) - -## License - - [MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/express.svg -[npm-url]: https://npmjs.org/package/express -[downloads-image]: https://img.shields.io/npm/dm/express.svg -[downloads-url]: https://npmjs.org/package/express -[travis-image]: https://img.shields.io/travis/strongloop/express/master.svg?label=linux -[travis-url]: https://travis-ci.org/strongloop/express -[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/express/master.svg?label=windows -[appveyor-url]: https://ci.appveyor.com/project/dougwilson/express -[coveralls-image]: https://img.shields.io/coveralls/strongloop/express/master.svg -[coveralls-url]: https://coveralls.io/r/strongloop/express?branch=master -[gratipay-image-visionmedia]: https://img.shields.io/gratipay/visionmedia.svg -[gratipay-url-visionmedia]: https://gratipay.com/visionmedia/ -[gratipay-image-dougwilson]: https://img.shields.io/gratipay/dougwilson.svg -[gratipay-url-dougwilson]: https://gratipay.com/dougwilson/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/index.js deleted file mode 100644 index d219b0c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -module.exports = require('./lib/express'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/application.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/application.js deleted file mode 100644 index a9df910..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/application.js +++ /dev/null @@ -1,643 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var finalhandler = require('finalhandler'); -var Router = require('./router'); -var methods = require('methods'); -var middleware = require('./middleware/init'); -var query = require('./middleware/query'); -var debug = require('debug')('express:application'); -var View = require('./view'); -var http = require('http'); -var compileETag = require('./utils').compileETag; -var compileQueryParser = require('./utils').compileQueryParser; -var compileTrust = require('./utils').compileTrust; -var deprecate = require('depd')('express'); -var flatten = require('array-flatten'); -var merge = require('utils-merge'); -var resolve = require('path').resolve; -var slice = Array.prototype.slice; - -/** - * Application prototype. - */ - -var app = exports = module.exports = {}; - -/** - * Variable for trust proxy inheritance back-compat - * @private - */ - -var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default'; - -/** - * Initialize the server. - * - * - setup default configuration - * - setup default middleware - * - setup route reflection methods - * - * @private - */ - -app.init = function init() { - this.cache = {}; - this.engines = {}; - this.settings = {}; - - this.defaultConfiguration(); -}; - -/** - * Initialize application configuration. - * @private - */ - -app.defaultConfiguration = function defaultConfiguration() { - var env = process.env.NODE_ENV || 'development'; - - // default settings - this.enable('x-powered-by'); - this.set('etag', 'weak'); - this.set('env', env); - this.set('query parser', 'extended'); - this.set('subdomain offset', 2); - this.set('trust proxy', false); - - // trust proxy inherit back-compat - Object.defineProperty(this.settings, trustProxyDefaultSymbol, { - configurable: true, - value: true - }); - - debug('booting in %s mode', env); - - this.on('mount', function onmount(parent) { - // inherit trust proxy - if (this.settings[trustProxyDefaultSymbol] === true - && typeof parent.settings['trust proxy fn'] === 'function') { - delete this.settings['trust proxy']; - delete this.settings['trust proxy fn']; - } - - // inherit protos - this.request.__proto__ = parent.request; - this.response.__proto__ = parent.response; - this.engines.__proto__ = parent.engines; - this.settings.__proto__ = parent.settings; - }); - - // setup locals - this.locals = Object.create(null); - - // top-most app is mounted at / - this.mountpath = '/'; - - // default locals - this.locals.settings = this.settings; - - // default configuration - this.set('view', View); - this.set('views', resolve('views')); - this.set('jsonp callback name', 'callback'); - - if (env === 'production') { - this.enable('view cache'); - } - - Object.defineProperty(this, 'router', { - get: function() { - throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.'); - } - }); -}; - -/** - * lazily adds the base router if it has not yet been added. - * - * We cannot add the base router in the defaultConfiguration because - * it reads app settings which might be set after that has run. - * - * @private - */ -app.lazyrouter = function lazyrouter() { - if (!this._router) { - this._router = new Router({ - caseSensitive: this.enabled('case sensitive routing'), - strict: this.enabled('strict routing') - }); - - this._router.use(query(this.get('query parser fn'))); - this._router.use(middleware.init(this)); - } -}; - -/** - * Dispatch a req, res pair into the application. Starts pipeline processing. - * - * If no callback is provided, then default error handlers will respond - * in the event of an error bubbling through the stack. - * - * @private - */ - -app.handle = function handle(req, res, callback) { - var router = this._router; - - // final handler - var done = callback || finalhandler(req, res, { - env: this.get('env'), - onerror: logerror.bind(this) - }); - - // no routes - if (!router) { - debug('no routes defined on app'); - done(); - return; - } - - router.handle(req, res, done); -}; - -/** - * Proxy `Router#use()` to add middleware to the app router. - * See Router#use() documentation for details. - * - * If the _fn_ parameter is an express app, then it will be - * mounted at the _route_ specified. - * - * @public - */ - -app.use = function use(fn) { - var offset = 0; - var path = '/'; - - // default path to '/' - // disambiguate app.use([fn]) - if (typeof fn !== 'function') { - var arg = fn; - - while (Array.isArray(arg) && arg.length !== 0) { - arg = arg[0]; - } - - // first arg is the path - if (typeof arg !== 'function') { - offset = 1; - path = fn; - } - } - - var fns = flatten(slice.call(arguments, offset)); - - if (fns.length === 0) { - throw new TypeError('app.use() requires middleware functions'); - } - - // setup router - this.lazyrouter(); - var router = this._router; - - fns.forEach(function (fn) { - // non-express app - if (!fn || !fn.handle || !fn.set) { - return router.use(path, fn); - } - - debug('.use app under %s', path); - fn.mountpath = path; - fn.parent = this; - - // restore .app property on req and res - router.use(path, function mounted_app(req, res, next) { - var orig = req.app; - fn.handle(req, res, function (err) { - req.__proto__ = orig.request; - res.__proto__ = orig.response; - next(err); - }); - }); - - // mounted an app - fn.emit('mount', this); - }, this); - - return this; -}; - -/** - * Proxy to the app `Router#route()` - * Returns a new `Route` instance for the _path_. - * - * Routes are isolated middleware stacks for specific paths. - * See the Route api docs for details. - * - * @public - */ - -app.route = function route(path) { - this.lazyrouter(); - return this._router.route(path); -}; - -/** - * Register the given template engine callback `fn` - * as `ext`. - * - * By default will `require()` the engine based on the - * file extension. For example if you try to render - * a "foo.jade" file Express will invoke the following internally: - * - * app.engine('jade', require('jade').__express); - * - * For engines that do not provide `.__express` out of the box, - * or if you wish to "map" a different extension to the template engine - * you may use this method. For example mapping the EJS template engine to - * ".html" files: - * - * app.engine('html', require('ejs').renderFile); - * - * In this case EJS provides a `.renderFile()` method with - * the same signature that Express expects: `(path, options, callback)`, - * though note that it aliases this method as `ejs.__express` internally - * so if you're using ".ejs" extensions you dont need to do anything. - * - * Some template engines do not follow this convention, the - * [Consolidate.js](https://github.com/tj/consolidate.js) - * library was created to map all of node's popular template - * engines to follow this convention, thus allowing them to - * work seamlessly within Express. - * - * @param {String} ext - * @param {Function} fn - * @return {app} for chaining - * @public - */ - -app.engine = function engine(ext, fn) { - if (typeof fn !== 'function') { - throw new Error('callback function required'); - } - - // get file extension - var extension = ext[0] !== '.' - ? '.' + ext - : ext; - - // store engine - this.engines[extension] = fn; - - return this; -}; - -/** - * Proxy to `Router#param()` with one added api feature. The _name_ parameter - * can be an array of names. - * - * See the Router#param() docs for more details. - * - * @param {String|Array} name - * @param {Function} fn - * @return {app} for chaining - * @public - */ - -app.param = function param(name, fn) { - this.lazyrouter(); - - if (Array.isArray(name)) { - for (var i = 0; i < name.length; i++) { - this.param(name[i], fn); - } - - return this; - } - - this._router.param(name, fn); - - return this; -}; - -/** - * Assign `setting` to `val`, or return `setting`'s value. - * - * app.set('foo', 'bar'); - * app.get('foo'); - * // => "bar" - * - * Mounted servers inherit their parent server's settings. - * - * @param {String} setting - * @param {*} [val] - * @return {Server} for chaining - * @public - */ - -app.set = function set(setting, val) { - if (arguments.length === 1) { - // app.get(setting) - return this.settings[setting]; - } - - debug('set "%s" to %o', setting, val); - - // set value - this.settings[setting] = val; - - // trigger matched settings - switch (setting) { - case 'etag': - this.set('etag fn', compileETag(val)); - break; - case 'query parser': - this.set('query parser fn', compileQueryParser(val)); - break; - case 'trust proxy': - this.set('trust proxy fn', compileTrust(val)); - - // trust proxy inherit back-compat - Object.defineProperty(this.settings, trustProxyDefaultSymbol, { - configurable: true, - value: false - }); - - break; - } - - return this; -}; - -/** - * Return the app's absolute pathname - * based on the parent(s) that have - * mounted it. - * - * For example if the application was - * mounted as "/admin", which itself - * was mounted as "/blog" then the - * return value would be "/blog/admin". - * - * @return {String} - * @private - */ - -app.path = function path() { - return this.parent - ? this.parent.path() + this.mountpath - : ''; -}; - -/** - * Check if `setting` is enabled (truthy). - * - * app.enabled('foo') - * // => false - * - * app.enable('foo') - * app.enabled('foo') - * // => true - * - * @param {String} setting - * @return {Boolean} - * @public - */ - -app.enabled = function enabled(setting) { - return Boolean(this.set(setting)); -}; - -/** - * Check if `setting` is disabled. - * - * app.disabled('foo') - * // => true - * - * app.enable('foo') - * app.disabled('foo') - * // => false - * - * @param {String} setting - * @return {Boolean} - * @public - */ - -app.disabled = function disabled(setting) { - return !this.set(setting); -}; - -/** - * Enable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @public - */ - -app.enable = function enable(setting) { - return this.set(setting, true); -}; - -/** - * Disable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @public - */ - -app.disable = function disable(setting) { - return this.set(setting, false); -}; - -/** - * Delegate `.VERB(...)` calls to `router.VERB(...)`. - */ - -methods.forEach(function(method){ - app[method] = function(path){ - if (method === 'get' && arguments.length === 1) { - // app.get(setting) - return this.set(path); - } - - this.lazyrouter(); - - var route = this._router.route(path); - route[method].apply(route, slice.call(arguments, 1)); - return this; - }; -}); - -/** - * Special-cased "all" method, applying the given route `path`, - * middleware, and callback to _every_ HTTP method. - * - * @param {String} path - * @param {Function} ... - * @return {app} for chaining - * @public - */ - -app.all = function all(path) { - this.lazyrouter(); - - var route = this._router.route(path); - var args = slice.call(arguments, 1); - - for (var i = 0; i < methods.length; i++) { - route[methods[i]].apply(route, args); - } - - return this; -}; - -// del -> delete alias - -app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead'); - -/** - * Render the given view `name` name with `options` - * and a callback accepting an error and the - * rendered template string. - * - * Example: - * - * app.render('email', { name: 'Tobi' }, function(err, html){ - * // ... - * }) - * - * @param {String} name - * @param {String|Function} options or fn - * @param {Function} callback - * @public - */ - -app.render = function render(name, options, callback) { - var cache = this.cache; - var done = callback; - var engines = this.engines; - var opts = options; - var renderOptions = {}; - var view; - - // support callback function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - // merge app.locals - merge(renderOptions, this.locals); - - // merge options._locals - if (opts._locals) { - merge(renderOptions, opts._locals); - } - - // merge options - merge(renderOptions, opts); - - // set .cache unless explicitly provided - if (renderOptions.cache == null) { - renderOptions.cache = this.enabled('view cache'); - } - - // primed cache - if (renderOptions.cache) { - view = cache[name]; - } - - // view - if (!view) { - var View = this.get('view'); - - view = new View(name, { - defaultEngine: this.get('view engine'), - root: this.get('views'), - engines: engines - }); - - if (!view.path) { - var dirs = Array.isArray(view.root) && view.root.length > 1 - ? 'directories "' + view.root.slice(0, -1).join('", "') + '" or "' + view.root[view.root.length - 1] + '"' - : 'directory "' + view.root + '"' - var err = new Error('Failed to lookup view "' + name + '" in views ' + dirs); - err.view = view; - return done(err); - } - - // prime the cache - if (renderOptions.cache) { - cache[name] = view; - } - } - - // render - tryRender(view, renderOptions, done); -}; - -/** - * Listen for connections. - * - * A node `http.Server` is returned, with this - * application (which is a `Function`) as its - * callback. If you wish to create both an HTTP - * and HTTPS server you may do so with the "http" - * and "https" modules as shown here: - * - * var http = require('http') - * , https = require('https') - * , express = require('express') - * , app = express(); - * - * http.createServer(app).listen(80); - * https.createServer({ ... }, app).listen(443); - * - * @return {http.Server} - * @public - */ - -app.listen = function listen() { - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; - -/** - * Log error using console.error. - * - * @param {Error} err - * @private - */ - -function logerror(err) { - /* istanbul ignore next */ - if (this.get('env') !== 'test') console.error(err.stack || err.toString()); -} - -/** - * Try rendering a view. - * @private - */ - -function tryRender(view, options, callback) { - try { - view.render(options, callback); - } catch (err) { - callback(err); - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/express.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/express.js deleted file mode 100644 index 540c8be..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/express.js +++ /dev/null @@ -1,103 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter; -var mixin = require('merge-descriptors'); -var proto = require('./application'); -var Route = require('./router/route'); -var Router = require('./router'); -var req = require('./request'); -var res = require('./response'); - -/** - * Expose `createApplication()`. - */ - -exports = module.exports = createApplication; - -/** - * Create an express application. - * - * @return {Function} - * @api public - */ - -function createApplication() { - var app = function(req, res, next) { - app.handle(req, res, next); - }; - - mixin(app, EventEmitter.prototype, false); - mixin(app, proto, false); - - app.request = { __proto__: req, app: app }; - app.response = { __proto__: res, app: app }; - app.init(); - return app; -} - -/** - * Expose the prototypes. - */ - -exports.application = proto; -exports.request = req; -exports.response = res; - -/** - * Expose constructors. - */ - -exports.Route = Route; -exports.Router = Router; - -/** - * Expose middleware - */ - -exports.query = require('./middleware/query'); -exports.static = require('serve-static'); - -/** - * Replace removed middleware with an appropriate error message. - */ - -[ - 'json', - 'urlencoded', - 'bodyParser', - 'compress', - 'cookieSession', - 'session', - 'logger', - 'cookieParser', - 'favicon', - 'responseTime', - 'errorHandler', - 'timeout', - 'methodOverride', - 'vhost', - 'csrf', - 'directory', - 'limit', - 'multipart', - 'staticCache', -].forEach(function (name) { - Object.defineProperty(exports, name, { - get: function () { - throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.'); - }, - configurable: true - }); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/middleware/init.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/middleware/init.js deleted file mode 100644 index f3119ed..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/middleware/init.js +++ /dev/null @@ -1,36 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Initialization middleware, exposing the - * request and response to each other, as well - * as defaulting the X-Powered-By header field. - * - * @param {Function} app - * @return {Function} - * @api private - */ - -exports.init = function(app){ - return function expressInit(req, res, next){ - if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); - req.res = res; - res.req = req; - req.next = next; - - req.__proto__ = app.request; - res.__proto__ = app.response; - - res.locals = res.locals || Object.create(null); - - next(); - }; -}; - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/middleware/query.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/middleware/query.js deleted file mode 100644 index a665f3f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/middleware/query.js +++ /dev/null @@ -1,51 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - */ - -var parseUrl = require('parseurl'); -var qs = require('qs'); - -/** - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function query(options) { - var opts = Object.create(options || null); - var queryparse = qs.parse; - - if (typeof options === 'function') { - queryparse = options; - opts = undefined; - } - - if (opts !== undefined) { - if (opts.allowDots === undefined) { - opts.allowDots = false; - } - - if (opts.allowPrototypes === undefined) { - opts.allowPrototypes = true; - } - } - - return function query(req, res, next){ - if (!req.query) { - var val = parseUrl(req).query; - req.query = queryparse(val, opts); - } - - next(); - }; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/request.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/request.js deleted file mode 100644 index 33cac18..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/request.js +++ /dev/null @@ -1,489 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var accepts = require('accepts'); -var deprecate = require('depd')('express'); -var isIP = require('net').isIP; -var typeis = require('type-is'); -var http = require('http'); -var fresh = require('fresh'); -var parseRange = require('range-parser'); -var parse = require('parseurl'); -var proxyaddr = require('proxy-addr'); - -/** - * Request prototype. - */ - -var req = exports = module.exports = { - __proto__: http.IncomingMessage.prototype -}; - -/** - * Return request header. - * - * The `Referrer` header field is special-cased, - * both `Referrer` and `Referer` are interchangeable. - * - * Examples: - * - * req.get('Content-Type'); - * // => "text/plain" - * - * req.get('content-type'); - * // => "text/plain" - * - * req.get('Something'); - * // => undefined - * - * Aliased as `req.header()`. - * - * @param {String} name - * @return {String} - * @public - */ - -req.get = -req.header = function header(name) { - var lc = name.toLowerCase(); - - switch (lc) { - case 'referer': - case 'referrer': - return this.headers.referrer - || this.headers.referer; - default: - return this.headers[lc]; - } -}; - -/** - * To do: update docs. - * - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single MIME type string - * such as "application/json", an extension name - * such as "json", a comma-delimited list such as "json, html, text/plain", - * an argument list such as `"json", "html", "text/plain"`, - * or an array `["json", "html", "text/plain"]`. When a list - * or array is given, the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * req.accepts('html'); - * // => "html" - * - * // Accept: text/*, application/json - * req.accepts('html'); - * // => "html" - * req.accepts('text/html'); - * // => "text/html" - * req.accepts('json, text'); - * // => "json" - * req.accepts('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * req.accepts('image/png'); - * req.accepts('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * req.accepts(['html', 'json']); - * req.accepts('html', 'json'); - * req.accepts('html, json'); - * // => "json" - * - * @param {String|Array} type(s) - * @return {String|Array|Boolean} - * @public - */ - -req.accepts = function(){ - var accept = accepts(this); - return accept.types.apply(accept, arguments); -}; - -/** - * Check if the given `encoding`s are accepted. - * - * @param {String} ...encoding - * @return {String|Array} - * @public - */ - -req.acceptsEncodings = function(){ - var accept = accepts(this); - return accept.encodings.apply(accept, arguments); -}; - -req.acceptsEncoding = deprecate.function(req.acceptsEncodings, - 'req.acceptsEncoding: Use acceptsEncodings instead'); - -/** - * Check if the given `charset`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...charset - * @return {String|Array} - * @public - */ - -req.acceptsCharsets = function(){ - var accept = accepts(this); - return accept.charsets.apply(accept, arguments); -}; - -req.acceptsCharset = deprecate.function(req.acceptsCharsets, - 'req.acceptsCharset: Use acceptsCharsets instead'); - -/** - * Check if the given `lang`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...lang - * @return {String|Array} - * @public - */ - -req.acceptsLanguages = function(){ - var accept = accepts(this); - return accept.languages.apply(accept, arguments); -}; - -req.acceptsLanguage = deprecate.function(req.acceptsLanguages, - 'req.acceptsLanguage: Use acceptsLanguages instead'); - -/** - * Parse Range header field, - * capping to the given `size`. - * - * Unspecified ranges such as "0-" require - * knowledge of your resource length. In - * the case of a byte range this is of course - * the total number of bytes. If the Range - * header field is not given `null` is returned, - * `-1` when unsatisfiable, `-2` when syntactically invalid. - * - * NOTE: remember that ranges are inclusive, so - * for example "Range: users=0-3" should respond - * with 4 users when available, not 3. - * - * @param {Number} size - * @return {Array} - * @public - */ - -req.range = function(size){ - var range = this.get('Range'); - if (!range) return; - return parseRange(size, range); -}; - -/** - * Return the value of param `name` when present or `defaultValue`. - * - * - Checks route placeholders, ex: _/user/:id_ - * - Checks body params, ex: id=12, {"id":12} - * - Checks query string params, ex: ?id=12 - * - * To utilize request bodies, `req.body` - * should be an object. This can be done by using - * the `bodyParser()` middleware. - * - * @param {String} name - * @param {Mixed} [defaultValue] - * @return {String} - * @public - */ - -req.param = function param(name, defaultValue) { - var params = this.params || {}; - var body = this.body || {}; - var query = this.query || {}; - - var args = arguments.length === 1 - ? 'name' - : 'name, default'; - deprecate('req.param(' + args + '): Use req.params, req.body, or req.query instead'); - - if (null != params[name] && params.hasOwnProperty(name)) return params[name]; - if (null != body[name]) return body[name]; - if (null != query[name]) return query[name]; - - return defaultValue; -}; - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains the give mime `type`. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * req.is('html'); - * req.is('text/html'); - * req.is('text/*'); - * // => true - * - * // When Content-Type is application/json - * req.is('json'); - * req.is('application/json'); - * req.is('application/*'); - * // => true - * - * req.is('html'); - * // => false - * - * @param {String|Array} types... - * @return {String|false|null} - * @public - */ - -req.is = function is(types) { - var arr = types; - - // support flattened arguments - if (!Array.isArray(types)) { - arr = new Array(arguments.length); - for (var i = 0; i < arr.length; i++) { - arr[i] = arguments[i]; - } - } - - return typeis(this, arr); -}; - -/** - * Return the protocol string "http" or "https" - * when requested with TLS. When the "trust proxy" - * setting trusts the socket address, the - * "X-Forwarded-Proto" header field will be trusted - * and used if present. - * - * If you're running behind a reverse proxy that - * supplies https for you this may be enabled. - * - * @return {String} - * @public - */ - -defineGetter(req, 'protocol', function protocol(){ - var proto = this.connection.encrypted - ? 'https' - : 'http'; - var trust = this.app.get('trust proxy fn'); - - if (!trust(this.connection.remoteAddress, 0)) { - return proto; - } - - // Note: X-Forwarded-Proto is normally only ever a - // single value, but this is to be safe. - proto = this.get('X-Forwarded-Proto') || proto; - return proto.split(/\s*,\s*/)[0]; -}); - -/** - * Short-hand for: - * - * req.protocol == 'https' - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'secure', function secure(){ - return this.protocol === 'https'; -}); - -/** - * Return the remote address from the trusted proxy. - * - * The is the remote address on the socket unless - * "trust proxy" is set. - * - * @return {String} - * @public - */ - -defineGetter(req, 'ip', function ip(){ - var trust = this.app.get('trust proxy fn'); - return proxyaddr(this, trust); -}); - -/** - * When "trust proxy" is set, trusted proxy addresses + client. - * - * For example if the value were "client, proxy1, proxy2" - * you would receive the array `["client", "proxy1", "proxy2"]` - * where "proxy2" is the furthest down-stream and "proxy1" and - * "proxy2" were trusted. - * - * @return {Array} - * @public - */ - -defineGetter(req, 'ips', function ips() { - var trust = this.app.get('trust proxy fn'); - var addrs = proxyaddr.all(this, trust); - return addrs.slice(1).reverse(); -}); - -/** - * Return subdomains as an array. - * - * Subdomains are the dot-separated parts of the host before the main domain of - * the app. By default, the domain of the app is assumed to be the last two - * parts of the host. This can be changed by setting "subdomain offset". - * - * For example, if the domain is "tobi.ferrets.example.com": - * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. - * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. - * - * @return {Array} - * @public - */ - -defineGetter(req, 'subdomains', function subdomains() { - var hostname = this.hostname; - - if (!hostname) return []; - - var offset = this.app.get('subdomain offset'); - var subdomains = !isIP(hostname) - ? hostname.split('.').reverse() - : [hostname]; - - return subdomains.slice(offset); -}); - -/** - * Short-hand for `url.parse(req.url).pathname`. - * - * @return {String} - * @public - */ - -defineGetter(req, 'path', function path() { - return parse(this).pathname; -}); - -/** - * Parse the "Host" header field to a hostname. - * - * When the "trust proxy" setting trusts the socket - * address, the "X-Forwarded-Host" header field will - * be trusted. - * - * @return {String} - * @public - */ - -defineGetter(req, 'hostname', function hostname(){ - var trust = this.app.get('trust proxy fn'); - var host = this.get('X-Forwarded-Host'); - - if (!host || !trust(this.connection.remoteAddress, 0)) { - host = this.get('Host'); - } - - if (!host) return; - - // IPv6 literal support - var offset = host[0] === '[' - ? host.indexOf(']') + 1 - : 0; - var index = host.indexOf(':', offset); - - return index !== -1 - ? host.substring(0, index) - : host; -}); - -// TODO: change req.host to return host in next major - -defineGetter(req, 'host', deprecate.function(function host(){ - return this.hostname; -}, 'req.host: Use req.hostname instead')); - -/** - * Check if the request is fresh, aka - * Last-Modified and/or the ETag - * still match. - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'fresh', function(){ - var method = this.method; - var s = this.res.statusCode; - - // GET or HEAD for weak freshness validation only - if ('GET' != method && 'HEAD' != method) return false; - - // 2xx or 304 as per rfc2616 14.26 - if ((s >= 200 && s < 300) || 304 == s) { - return fresh(this.headers, (this.res._headers || {})); - } - - return false; -}); - -/** - * Check if the request is stale, aka - * "Last-Modified" and / or the "ETag" for the - * resource has changed. - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'stale', function stale(){ - return !this.fresh; -}); - -/** - * Check if the request was an _XMLHttpRequest_. - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'xhr', function xhr(){ - var val = this.get('X-Requested-With') || ''; - return val.toLowerCase() === 'xmlhttprequest'; -}); - -/** - * Helper function for creating a getter on an object. - * - * @param {Object} obj - * @param {String} name - * @param {Function} getter - * @private - */ -function defineGetter(obj, name, getter) { - Object.defineProperty(obj, name, { - configurable: true, - enumerable: true, - get: getter - }); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/response.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/response.js deleted file mode 100644 index 641704b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/response.js +++ /dev/null @@ -1,1053 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var contentDisposition = require('content-disposition'); -var deprecate = require('depd')('express'); -var escapeHtml = require('escape-html'); -var http = require('http'); -var isAbsolute = require('./utils').isAbsolute; -var onFinished = require('on-finished'); -var path = require('path'); -var merge = require('utils-merge'); -var sign = require('cookie-signature').sign; -var normalizeType = require('./utils').normalizeType; -var normalizeTypes = require('./utils').normalizeTypes; -var setCharset = require('./utils').setCharset; -var statusCodes = http.STATUS_CODES; -var cookie = require('cookie'); -var send = require('send'); -var extname = path.extname; -var mime = send.mime; -var resolve = path.resolve; -var vary = require('vary'); - -/** - * Response prototype. - */ - -var res = module.exports = { - __proto__: http.ServerResponse.prototype -}; - -/** - * Module variables. - * @private - */ - -var charsetRegExp = /;\s*charset\s*=/; - -/** - * Set status `code`. - * - * @param {Number} code - * @return {ServerResponse} - * @public - */ - -res.status = function status(code) { - this.statusCode = code; - return this; -}; - -/** - * Set Link header field with the given `links`. - * - * Examples: - * - * res.links({ - * next: 'http://api.example.com/users?page=2', - * last: 'http://api.example.com/users?page=5' - * }); - * - * @param {Object} links - * @return {ServerResponse} - * @public - */ - -res.links = function(links){ - var link = this.get('Link') || ''; - if (link) link += ', '; - return this.set('Link', link + Object.keys(links).map(function(rel){ - return '<' + links[rel] + '>; rel="' + rel + '"'; - }).join(', ')); -}; - -/** - * Send a response. - * - * Examples: - * - * res.send(new Buffer('wahoo')); - * res.send({ some: 'json' }); - * res.send('

some html

'); - * - * @param {string|number|boolean|object|Buffer} body - * @public - */ - -res.send = function send(body) { - var chunk = body; - var encoding; - var len; - var req = this.req; - var type; - - // settings - var app = this.app; - - // allow status / body - if (arguments.length === 2) { - // res.send(body, status) backwards compat - if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') { - deprecate('res.send(body, status): Use res.status(status).send(body) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.send(status, body): Use res.status(status).send(body) instead'); - this.statusCode = arguments[0]; - chunk = arguments[1]; - } - } - - // disambiguate res.send(status) and res.send(status, num) - if (typeof chunk === 'number' && arguments.length === 1) { - // res.send(status) will set status message as text string - if (!this.get('Content-Type')) { - this.type('txt'); - } - - deprecate('res.send(status): Use res.sendStatus(status) instead'); - this.statusCode = chunk; - chunk = statusCodes[chunk]; - } - - switch (typeof chunk) { - // string defaulting to html - case 'string': - if (!this.get('Content-Type')) { - this.type('html'); - } - break; - case 'boolean': - case 'number': - case 'object': - if (chunk === null) { - chunk = ''; - } else if (Buffer.isBuffer(chunk)) { - if (!this.get('Content-Type')) { - this.type('bin'); - } - } else { - return this.json(chunk); - } - break; - } - - // write strings in utf-8 - if (typeof chunk === 'string') { - encoding = 'utf8'; - type = this.get('Content-Type'); - - // reflect this in content-type - if (typeof type === 'string') { - this.set('Content-Type', setCharset(type, 'utf-8')); - } - } - - // populate Content-Length - if (chunk !== undefined) { - if (!Buffer.isBuffer(chunk)) { - // convert chunk to Buffer; saves later double conversions - chunk = new Buffer(chunk, encoding); - encoding = undefined; - } - - len = chunk.length; - this.set('Content-Length', len); - } - - // populate ETag - var etag; - var generateETag = len !== undefined && app.get('etag fn'); - if (typeof generateETag === 'function' && !this.get('ETag')) { - if ((etag = generateETag(chunk, encoding))) { - this.set('ETag', etag); - } - } - - // freshness - if (req.fresh) this.statusCode = 304; - - // strip irrelevant headers - if (204 == this.statusCode || 304 == this.statusCode) { - this.removeHeader('Content-Type'); - this.removeHeader('Content-Length'); - this.removeHeader('Transfer-Encoding'); - chunk = ''; - } - - if (req.method === 'HEAD') { - // skip body for HEAD - this.end(); - } else { - // respond - this.end(chunk, encoding); - } - - return this; -}; - -/** - * Send JSON response. - * - * Examples: - * - * res.json(null); - * res.json({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @public - */ - -res.json = function json(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.json(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.json(status, obj): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(val, replacer, spaces); - - // content-type - if (!this.get('Content-Type')) { - this.set('Content-Type', 'application/json'); - } - - return this.send(body); -}; - -/** - * Send JSON response with JSONP callback support. - * - * Examples: - * - * res.jsonp(null); - * res.jsonp({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @public - */ - -res.jsonp = function jsonp(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.jsonp(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(val, replacer, spaces); - var callback = this.req.query[app.get('jsonp callback name')]; - - // content-type - if (!this.get('Content-Type')) { - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'application/json'); - } - - // fixup callback - if (Array.isArray(callback)) { - callback = callback[0]; - } - - // jsonp - if (typeof callback === 'string' && callback.length !== 0) { - this.charset = 'utf-8'; - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'text/javascript'); - - // restrict callback charset - callback = callback.replace(/[^\[\]\w$.]/g, ''); - - // replace chars not allowed in JavaScript that are in JSON - body = body - .replace(/\u2028/g, '\\u2028') - .replace(/\u2029/g, '\\u2029'); - - // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse" - // the typeof check is just to reduce client error noise - body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');'; - } - - return this.send(body); -}; - -/** - * Send given HTTP status code. - * - * Sets the response status to `statusCode` and the body of the - * response to the standard description from node's http.STATUS_CODES - * or the statusCode number if no description. - * - * Examples: - * - * res.sendStatus(200); - * - * @param {number} statusCode - * @public - */ - -res.sendStatus = function sendStatus(statusCode) { - var body = statusCodes[statusCode] || String(statusCode); - - this.statusCode = statusCode; - this.type('txt'); - - return this.send(body); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `callback(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.sentHeader` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 (can be string converted by `ms`) - * - `root` root directory for relative filenames - * - `headers` object of headers to serve with file - * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them - * - * Other options are passed along to `send`. - * - * Examples: - * - * The following example illustrates how `res.sendFile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendFile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendFile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @public - */ - -res.sendFile = function sendFile(path, options, callback) { - var done = callback; - var req = this.req; - var res = this; - var next = req.next; - var opts = options || {}; - - if (!path) { - throw new TypeError('path argument is required to res.sendFile'); - } - - // support function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - if (!opts.root && !isAbsolute(path)) { - throw new TypeError('path must be absolute or specify root to res.sendFile'); - } - - // create file stream - var pathname = encodeURI(path); - var file = send(req, pathname, opts); - - // transfer - sendfile(res, file, opts, function (err) { - if (done) return done(err); - if (err && err.code === 'EISDIR') return next(); - - // next() all but write errors - if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') { - next(err); - } - }); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `callback(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.sentHeader` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 (can be string converted by `ms`) - * - `root` root directory for relative filenames - * - `headers` object of headers to serve with file - * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them - * - * Other options are passed along to `send`. - * - * Examples: - * - * The following example illustrates how `res.sendfile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendfile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendfile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @public - */ - -res.sendfile = function (path, options, callback) { - var done = callback; - var req = this.req; - var res = this; - var next = req.next; - var opts = options || {}; - - // support function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - // create file stream - var file = send(req, path, opts); - - // transfer - sendfile(res, file, opts, function (err) { - if (done) return done(err); - if (err && err.code === 'EISDIR') return next(); - - // next() all but write errors - if (err && err.code !== 'ECONNABORT' && err.syscall !== 'write') { - next(err); - } - }); -}; - -res.sendfile = deprecate.function(res.sendfile, - 'res.sendfile: Use res.sendFile instead'); - -/** - * Transfer the file at the given `path` as an attachment. - * - * Optionally providing an alternate attachment `filename`, - * and optional callback `callback(err)`. The callback is invoked - * when the data transfer is complete, or when an error has - * ocurred. Be sure to check `res.headersSent` if you plan to respond. - * - * This method uses `res.sendfile()`. - * - * @public - */ - -res.download = function download(path, filename, callback) { - var done = callback; - var name = filename; - - // support function as second arg - if (typeof filename === 'function') { - done = filename; - name = null; - } - - // set Content-Disposition when file is sent - var headers = { - 'Content-Disposition': contentDisposition(name || path) - }; - - // Resolve the full path for sendFile - var fullPath = resolve(path); - - return this.sendFile(fullPath, { headers: headers }, done); -}; - -/** - * Set _Content-Type_ response header with `type` through `mime.lookup()` - * when it does not contain "/", or set the Content-Type to `type` otherwise. - * - * Examples: - * - * res.type('.html'); - * res.type('html'); - * res.type('json'); - * res.type('application/json'); - * res.type('png'); - * - * @param {String} type - * @return {ServerResponse} for chaining - * @public - */ - -res.contentType = -res.type = function contentType(type) { - var ct = type.indexOf('/') === -1 - ? mime.lookup(type) - : type; - - return this.set('Content-Type', ct); -}; - -/** - * Respond to the Acceptable formats using an `obj` - * of mime-type callbacks. - * - * This method uses `req.accepted`, an array of - * acceptable types ordered by their quality values. - * When "Accept" is not present the _first_ callback - * is invoked, otherwise the first match is used. When - * no match is performed the server responds with - * 406 "Not Acceptable". - * - * Content-Type is set for you, however if you choose - * you may alter this within the callback using `res.type()` - * or `res.set('Content-Type', ...)`. - * - * res.format({ - * 'text/plain': function(){ - * res.send('hey'); - * }, - * - * 'text/html': function(){ - * res.send('

hey

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

hey

'); - * }, - * - * json: function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * By default Express passes an `Error` - * with a `.status` of 406 to `next(err)` - * if a match is not made. If you provide - * a `.default` callback it will be invoked - * instead. - * - * @param {Object} obj - * @return {ServerResponse} for chaining - * @public - */ - -res.format = function(obj){ - var req = this.req; - var next = req.next; - - var fn = obj.default; - if (fn) delete obj.default; - var keys = Object.keys(obj); - - var key = keys.length > 0 - ? req.accepts(keys) - : false; - - this.vary("Accept"); - - if (key) { - this.set('Content-Type', normalizeType(key).value); - obj[key](req, this, next); - } else if (fn) { - fn(); - } else { - var err = new Error('Not Acceptable'); - err.status = err.statusCode = 406; - err.types = normalizeTypes(keys).map(function(o){ return o.value }); - next(err); - } - - return this; -}; - -/** - * Set _Content-Disposition_ header to _attachment_ with optional `filename`. - * - * @param {String} filename - * @return {ServerResponse} - * @public - */ - -res.attachment = function attachment(filename) { - if (filename) { - this.type(extname(filename)); - } - - this.set('Content-Disposition', contentDisposition(filename)); - - return this; -}; - -/** - * Append additional header `field` with value `val`. - * - * Example: - * - * res.append('Link', ['', '']); - * res.append('Set-Cookie', 'foo=bar; Path=/; HttpOnly'); - * res.append('Warning', '199 Miscellaneous warning'); - * - * @param {String} field - * @param {String|Array} val - * @return {ServerResponse} for chaining - * @public - */ - -res.append = function append(field, val) { - var prev = this.get(field); - var value = val; - - if (prev) { - // concat the new and prev vals - value = Array.isArray(prev) ? prev.concat(val) - : Array.isArray(val) ? [prev].concat(val) - : [prev, val]; - } - - return this.set(field, value); -}; - -/** - * Set header `field` to `val`, or pass - * an object of header fields. - * - * Examples: - * - * res.set('Foo', ['bar', 'baz']); - * res.set('Accept', 'application/json'); - * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); - * - * Aliased as `res.header()`. - * - * @param {String|Object} field - * @param {String|Array} val - * @return {ServerResponse} for chaining - * @public - */ - -res.set = -res.header = function header(field, val) { - if (arguments.length === 2) { - var value = Array.isArray(val) - ? val.map(String) - : String(val); - - // add charset to content-type - if (field.toLowerCase() === 'content-type' && !charsetRegExp.test(value)) { - var charset = mime.charsets.lookup(value.split(';')[0]); - if (charset) value += '; charset=' + charset.toLowerCase(); - } - - this.setHeader(field, value); - } else { - for (var key in field) { - this.set(key, field[key]); - } - } - return this; -}; - -/** - * Get value for header `field`. - * - * @param {String} field - * @return {String} - * @public - */ - -res.get = function(field){ - return this.getHeader(field); -}; - -/** - * Clear cookie `name`. - * - * @param {String} name - * @param {Object} options - * @return {ServerResponse} for chaining - * @public - */ - -res.clearCookie = function clearCookie(name, options) { - var opts = merge({ expires: new Date(1), path: '/' }, options); - - return this.cookie(name, '', opts); -}; - -/** - * Set cookie `name` to `value`, with the given `options`. - * - * Options: - * - * - `maxAge` max-age in milliseconds, converted to `expires` - * - `signed` sign the cookie - * - `path` defaults to "/" - * - * Examples: - * - * // "Remember Me" for 15 minutes - * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); - * - * // save as above - * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) - * - * @param {String} name - * @param {String|Object} value - * @param {Options} options - * @return {ServerResponse} for chaining - * @public - */ - -res.cookie = function (name, value, options) { - var opts = merge({}, options); - var secret = this.req.secret; - var signed = opts.signed; - - if (signed && !secret) { - throw new Error('cookieParser("secret") required for signed cookies'); - } - - var val = typeof value === 'object' - ? 'j:' + JSON.stringify(value) - : String(value); - - if (signed) { - val = 's:' + sign(val, secret); - } - - if ('maxAge' in opts) { - opts.expires = new Date(Date.now() + opts.maxAge); - opts.maxAge /= 1000; - } - - if (opts.path == null) { - opts.path = '/'; - } - - this.append('Set-Cookie', cookie.serialize(name, String(val), opts)); - - return this; -}; - -/** - * Set the location header to `url`. - * - * The given `url` can also be "back", which redirects - * to the _Referrer_ or _Referer_ headers or "/". - * - * Examples: - * - * res.location('/foo/bar').; - * res.location('http://example.com'); - * res.location('../login'); - * - * @param {String} url - * @return {ServerResponse} for chaining - * @public - */ - -res.location = function location(url) { - var loc = url; - - // "back" is an alias for the referrer - if (url === 'back') { - loc = this.req.get('Referrer') || '/'; - } - - // set location - this.set('Location', loc); - return this; -}; - -/** - * Redirect to the given `url` with optional response `status` - * defaulting to 302. - * - * The resulting `url` is determined by `res.location()`, so - * it will play nicely with mounted apps, relative paths, - * `"back"` etc. - * - * Examples: - * - * res.redirect('/foo/bar'); - * res.redirect('http://example.com'); - * res.redirect(301, 'http://example.com'); - * res.redirect('../login'); // /blog/post/1 -> /blog/login - * - * @public - */ - -res.redirect = function redirect(url) { - var address = url; - var body; - var status = 302; - - // allow status / url - if (arguments.length === 2) { - if (typeof arguments[0] === 'number') { - status = arguments[0]; - address = arguments[1]; - } else { - deprecate('res.redirect(url, status): Use res.redirect(status, url) instead'); - status = arguments[1]; - } - } - - // Set location header - this.location(address); - address = this.get('Location'); - - // Support text/{plain,html} by default - this.format({ - text: function(){ - body = statusCodes[status] + '. Redirecting to ' + encodeURI(address); - }, - - html: function(){ - var u = escapeHtml(address); - body = '

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

'; - }, - - default: function(){ - body = ''; - } - }); - - // Respond - this.statusCode = status; - this.set('Content-Length', Buffer.byteLength(body)); - - if (this.req.method === 'HEAD') { - this.end(); - } else { - this.end(body); - } -}; - -/** - * Add `field` to Vary. If already present in the Vary set, then - * this call is simply ignored. - * - * @param {Array|String} field - * @return {ServerResponse} for chaining - * @public - */ - -res.vary = function(field){ - // checks for back-compat - if (!field || (Array.isArray(field) && !field.length)) { - deprecate('res.vary(): Provide a field name'); - return this; - } - - vary(this, field); - - return this; -}; - -/** - * Render `view` with the given `options` and optional callback `fn`. - * When a callback function is given a response will _not_ be made - * automatically, otherwise a response of _200_ and _text/html_ is given. - * - * Options: - * - * - `cache` boolean hinting to the engine it should cache - * - `filename` filename of the view being rendered - * - * @public - */ - -res.render = function render(view, options, callback) { - var app = this.req.app; - var done = callback; - var opts = options || {}; - var req = this.req; - var self = this; - - // support callback function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - // merge res.locals - opts._locals = self.locals; - - // default callback to respond - done = done || function (err, str) { - if (err) return req.next(err); - self.send(str); - }; - - // render - app.render(view, opts, done); -}; - -// pipe the send file stream -function sendfile(res, file, options, callback) { - var done = false; - var streaming; - - // request aborted - function onaborted() { - if (done) return; - done = true; - - var err = new Error('Request aborted'); - err.code = 'ECONNABORTED'; - callback(err); - } - - // directory - function ondirectory() { - if (done) return; - done = true; - - var err = new Error('EISDIR, read'); - err.code = 'EISDIR'; - callback(err); - } - - // errors - function onerror(err) { - if (done) return; - done = true; - callback(err); - } - - // ended - function onend() { - if (done) return; - done = true; - callback(); - } - - // file - function onfile() { - streaming = false; - } - - // finished - function onfinish(err) { - if (err && err.code === 'ECONNRESET') return onaborted(); - if (err) return onerror(err); - if (done) return; - - setImmediate(function () { - if (streaming !== false && !done) { - onaborted(); - return; - } - - if (done) return; - done = true; - callback(); - }); - } - - // streaming - function onstream() { - streaming = true; - } - - file.on('directory', ondirectory); - file.on('end', onend); - file.on('error', onerror); - file.on('file', onfile); - file.on('stream', onstream); - onFinished(res, onfinish); - - if (options.headers) { - // set headers on successful transfer - file.on('headers', function headers(res) { - var obj = options.headers; - var keys = Object.keys(obj); - - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - res.setHeader(k, obj[k]); - } - }); - } - - // pipe - file.pipe(res); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/router/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/router/index.js deleted file mode 100644 index 504ed9c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/router/index.js +++ /dev/null @@ -1,645 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var Route = require('./route'); -var Layer = require('./layer'); -var methods = require('methods'); -var mixin = require('utils-merge'); -var debug = require('debug')('express:router'); -var deprecate = require('depd')('express'); -var flatten = require('array-flatten'); -var parseUrl = require('parseurl'); - -/** - * Module variables. - * @private - */ - -var objectRegExp = /^\[object (\S+)\]$/; -var slice = Array.prototype.slice; -var toString = Object.prototype.toString; - -/** - * Initialize a new `Router` with the given `options`. - * - * @param {Object} options - * @return {Router} which is an callable function - * @public - */ - -var proto = module.exports = function(options) { - var opts = options || {}; - - function router(req, res, next) { - router.handle(req, res, next); - } - - // mixin Router class functions - router.__proto__ = proto; - - router.params = {}; - router._params = []; - router.caseSensitive = opts.caseSensitive; - router.mergeParams = opts.mergeParams; - router.strict = opts.strict; - router.stack = []; - - return router; -}; - -/** - * Map the given param placeholder `name`(s) to the given callback. - * - * Parameter mapping is used to provide pre-conditions to routes - * which use normalized placeholders. For example a _:user_id_ parameter - * could automatically load a user's information from the database without - * any additional code, - * - * The callback uses the same signature as middleware, the only difference - * being that the value of the placeholder is passed, in this case the _id_ - * of the user. Once the `next()` function is invoked, just like middleware - * it will continue on to execute the route, or subsequent parameter functions. - * - * Just like in middleware, you must either respond to the request or call next - * to avoid stalling the request. - * - * app.param('user_id', function(req, res, next, id){ - * User.find(id, function(err, user){ - * if (err) { - * return next(err); - * } else if (!user) { - * return next(new Error('failed to load user')); - * } - * req.user = user; - * next(); - * }); - * }); - * - * @param {String} name - * @param {Function} fn - * @return {app} for chaining - * @public - */ - -proto.param = function param(name, fn) { - // param logic - if (typeof name === 'function') { - deprecate('router.param(fn): Refactor to use path params'); - this._params.push(name); - return; - } - - // apply param functions - var params = this._params; - var len = params.length; - var ret; - - if (name[0] === ':') { - deprecate('router.param(' + JSON.stringify(name) + ', fn): Use router.param(' + JSON.stringify(name.substr(1)) + ', fn) instead'); - name = name.substr(1); - } - - 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; -}; - -/** - * Dispatch a req, res into the router. - * @private - */ - -proto.handle = function handle(req, res, out) { - var self = this; - - debug('dispatching %s %s', req.method, req.url); - - var search = 1 + req.url.indexOf('?'); - var pathlength = search ? search - 1 : req.url.length; - var fqdn = req.url[0] !== '/' && 1 + req.url.substr(0, pathlength).indexOf('://'); - var protohost = fqdn ? req.url.substr(0, req.url.indexOf('/', 2 + fqdn)) : ''; - var idx = 0; - var removed = ''; - var slashAdded = false; - var paramcalled = {}; - - // store options for OPTIONS request - // only used if OPTIONS request - var options = []; - - // middleware and routes - var stack = self.stack; - - // manage inter-router variables - var parentParams = req.params; - var parentUrl = req.baseUrl || ''; - var done = restore(out, req, 'baseUrl', 'next', 'params'); - - // setup next layer - req.next = next; - - // for options requests, respond with a default if nothing else responds - if (req.method === 'OPTIONS') { - done = wrap(done, function(old, err) { - if (err || options.length === 0) return old(err); - sendOptionsResponse(res, options, old); - }); - } - - // setup basic req values - req.baseUrl = parentUrl; - req.originalUrl = req.originalUrl || req.url; - - next(); - - function next(err) { - var layerError = err === 'route' - ? null - : err; - - // remove added slash - if (slashAdded) { - req.url = req.url.substr(1); - slashAdded = false; - } - - // restore altered req.url - if (removed.length !== 0) { - req.baseUrl = parentUrl; - req.url = protohost + removed + req.url.substr(protohost.length); - removed = ''; - } - - // no more matching layers - if (idx >= stack.length) { - setImmediate(done, layerError); - return; - } - - // get pathname of request - var path = getPathname(req); - - if (path == null) { - return done(layerError); - } - - // find next matching layer - var layer; - var match; - var route; - - while (match !== true && idx < stack.length) { - layer = stack[idx++]; - match = matchLayer(layer, path); - route = layer.route; - - if (typeof match !== 'boolean') { - // hold on to layerError - layerError = layerError || match; - } - - if (match !== true) { - continue; - } - - if (!route) { - // process non-route handlers normally - continue; - } - - if (layerError) { - // routes do not match with a pending error - match = false; - continue; - } - - var method = req.method; - var has_method = route._handles_method(method); - - // build up automatic options response - if (!has_method && method === 'OPTIONS') { - appendMethods(options, route._options()); - } - - // don't even bother matching route - if (!has_method && method !== 'HEAD') { - match = false; - continue; - } - } - - // no match - if (match !== true) { - return done(layerError); - } - - // store route for dispatch on change - if (route) { - req.route = route; - } - - // Capture one-time layer values - req.params = self.mergeParams - ? mergeParams(layer.params, parentParams) - : layer.params; - var layerPath = layer.path; - - // this should be done for the layer - self.process_params(layer, paramcalled, req, res, function (err) { - if (err) { - return next(layerError || err); - } - - if (route) { - return layer.handle_request(req, res, next); - } - - trim_prefix(layer, layerError, layerPath, path); - }); - } - - function trim_prefix(layer, layerError, layerPath, path) { - var c = path[layerPath.length]; - if (c && '/' !== c && '.' !== c) return next(layerError); - - // Trim off the part of the url that matches the route - // middleware (.use stuff) needs to have the path stripped - if (layerPath.length !== 0) { - debug('trim prefix (%s) from url %s', layerPath, req.url); - removed = layerPath; - req.url = protohost + req.url.substr(protohost.length + removed.length); - - // Ensure leading slash - if (!fqdn && req.url[0] !== '/') { - req.url = '/' + req.url; - slashAdded = true; - } - - // Setup base URL (no trailing slash) - req.baseUrl = parentUrl + (removed[removed.length - 1] === '/' - ? removed.substring(0, removed.length - 1) - : removed); - } - - debug('%s %s : %s', layer.name, layerPath, req.originalUrl); - - if (layerError) { - layer.handle_error(layerError, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Process any parameters for the layer. - * @private - */ - -proto.process_params = function process_params(layer, called, req, res, done) { - var params = this.params; - - // captured parameters from the layer, keys and values - var keys = layer.keys; - - // fast track - if (!keys || keys.length === 0) { - return done(); - } - - var i = 0; - var name; - var paramIndex = 0; - var key; - var paramVal; - var paramCallbacks; - var paramCalled; - - // process params in order - // param callbacks can be async - function param(err) { - if (err) { - return done(err); - } - - if (i >= keys.length ) { - return done(); - } - - paramIndex = 0; - key = keys[i++]; - - if (!key) { - return done(); - } - - name = key.name; - paramVal = req.params[name]; - paramCallbacks = params[name]; - paramCalled = called[name]; - - if (paramVal === undefined || !paramCallbacks) { - return param(); - } - - // param previously called with same value or error occurred - if (paramCalled && (paramCalled.match === paramVal - || (paramCalled.error && paramCalled.error !== 'route'))) { - // restore value - req.params[name] = paramCalled.value; - - // next param - return param(paramCalled.error); - } - - called[name] = paramCalled = { - error: null, - match: paramVal, - value: paramVal - }; - - paramCallback(); - } - - // single param callbacks - function paramCallback(err) { - var fn = paramCallbacks[paramIndex++]; - - // store updated value - paramCalled.value = req.params[key.name]; - - if (err) { - // store error - paramCalled.error = err; - param(err); - return; - } - - if (!fn) return param(); - - try { - fn(req, res, paramCallback, paramVal, key.name); - } catch (e) { - paramCallback(e); - } - } - - param(); -}; - -/** - * Use the given middleware function, with optional path, defaulting to "/". - * - * Use (like `.all`) will run for any http METHOD, but it will not add - * handlers for those methods so OPTIONS requests will not consider `.use` - * functions even if they could respond. - * - * The other difference is that _route_ path is stripped and not visible - * to the handler function. The main effect of this feature is that mounted - * handlers can operate without any code changes regardless of the "prefix" - * pathname. - * - * @public - */ - -proto.use = function use(fn) { - var offset = 0; - var path = '/'; - - // default path to '/' - // disambiguate router.use([fn]) - if (typeof fn !== 'function') { - var arg = fn; - - while (Array.isArray(arg) && arg.length !== 0) { - arg = arg[0]; - } - - // first arg is the path - if (typeof arg !== 'function') { - offset = 1; - path = fn; - } - } - - var callbacks = flatten(slice.call(arguments, offset)); - - if (callbacks.length === 0) { - throw new TypeError('Router.use() requires middleware functions'); - } - - for (var i = 0; i < callbacks.length; i++) { - var fn = callbacks[i]; - - if (typeof fn !== 'function') { - throw new TypeError('Router.use() requires middleware function but got a ' + gettype(fn)); - } - - // add the middleware - debug('use %s %s', path, fn.name || ''); - - var layer = new Layer(path, { - sensitive: this.caseSensitive, - strict: false, - end: false - }, fn); - - layer.route = undefined; - - this.stack.push(layer); - } - - return this; -}; - -/** - * Create a new Route for the given path. - * - * Each route contains a separate middleware stack and VERB handlers. - * - * See the Route api documentation for details on adding handlers - * and middleware to routes. - * - * @param {String} path - * @return {Route} - * @public - */ - -proto.route = function route(path) { - var route = new Route(path); - - var layer = new Layer(path, { - sensitive: this.caseSensitive, - strict: this.strict, - end: true - }, route.dispatch.bind(route)); - - layer.route = route; - - this.stack.push(layer); - return route; -}; - -// create Router#VERB functions -methods.concat('all').forEach(function(method){ - proto[method] = function(path){ - var route = this.route(path) - route[method].apply(route, slice.call(arguments, 1)); - return this; - }; -}); - -// append methods to a list of methods -function appendMethods(list, addition) { - for (var i = 0; i < addition.length; i++) { - var method = addition[i]; - if (list.indexOf(method) === -1) { - list.push(method); - } - } -} - -// get pathname of request -function getPathname(req) { - try { - return parseUrl(req).pathname; - } catch (err) { - return undefined; - } -} - -// get type for error message -function gettype(obj) { - var type = typeof obj; - - if (type !== 'object') { - return type; - } - - // inspect [[Class]] for objects - return toString.call(obj) - .replace(objectRegExp, '$1'); -} - -/** - * Match path to a layer. - * - * @param {Layer} layer - * @param {string} path - * @private - */ - -function matchLayer(layer, path) { - try { - return layer.match(path); - } catch (err) { - return err; - } -} - -// merge params with parent params -function mergeParams(params, parent) { - if (typeof parent !== 'object' || !parent) { - return params; - } - - // make copy of parent for base - var obj = mixin({}, parent); - - // simple non-numeric merging - if (!(0 in params) || !(0 in parent)) { - return mixin(obj, params); - } - - var i = 0; - var o = 0; - - // determine numeric gaps - while (i in params) { - i++; - } - - while (o in parent) { - o++; - } - - // offset numeric indices in params before merge - for (i--; i >= 0; i--) { - params[i + o] = params[i]; - - // create holes for the merge when necessary - if (i < o) { - delete params[i]; - } - } - - return mixin(obj, params); -} - -// restore obj props after function -function restore(fn, obj) { - var props = new Array(arguments.length - 2); - var vals = new Array(arguments.length - 2); - - for (var i = 0; i < props.length; i++) { - props[i] = arguments[i + 2]; - vals[i] = obj[props[i]]; - } - - return function(err){ - // restore vals - for (var i = 0; i < props.length; i++) { - obj[props[i]] = vals[i]; - } - - return fn.apply(this, arguments); - }; -} - -// send an OPTIONS response -function sendOptionsResponse(res, options, next) { - try { - var body = options.join(','); - res.set('Allow', body); - res.send(body); - } catch (err) { - next(err); - } -} - -// wrap a function -function wrap(old, fn) { - return function proxy() { - var args = new Array(arguments.length + 1); - - args[0] = old; - for (var i = 0, len = arguments.length; i < len; i++) { - args[i + 1] = arguments[i]; - } - - fn.apply(this, args); - }; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/router/layer.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/router/layer.js deleted file mode 100644 index fe9210c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/router/layer.js +++ /dev/null @@ -1,176 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var pathRegexp = require('path-to-regexp'); -var debug = require('debug')('express:router:layer'); - -/** - * Module variables. - * @private - */ - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -/** - * Module exports. - * @public - */ - -module.exports = Layer; - -function Layer(path, options, fn) { - if (!(this instanceof Layer)) { - return new Layer(path, options, fn); - } - - debug('new %s', path); - var opts = options || {}; - - this.handle = fn; - this.name = fn.name || ''; - this.params = undefined; - this.path = undefined; - this.regexp = pathRegexp(path, this.keys = [], opts); - - if (path === '/' && opts.end === false) { - this.regexp.fast_slash = true; - } -} - -/** - * Handle the error for the layer. - * - * @param {Error} error - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_error = function handle_error(error, req, res, next) { - var fn = this.handle; - - if (fn.length !== 4) { - // not a standard error handler - return next(error); - } - - try { - fn(error, req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Handle the request for the layer. - * - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_request = function handle(req, res, next) { - var fn = this.handle; - - if (fn.length > 3) { - // not a standard request handler - return next(); - } - - try { - fn(req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Check if this route matches `path`, if so - * populate `.params`. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -Layer.prototype.match = function match(path) { - if (path == null) { - // no path, nothing matches - this.params = undefined; - this.path = undefined; - return false; - } - - if (this.regexp.fast_slash) { - // fast path non-ending match for / (everything matches) - this.params = {}; - this.path = ''; - return true; - } - - var m = this.regexp.exec(path); - - if (!m) { - this.params = undefined; - this.path = undefined; - return false; - } - - // store values - this.params = {}; - this.path = m[0]; - - var keys = this.keys; - var params = this.params; - - for (var i = 1; i < m.length; i++) { - var key = keys[i - 1]; - var prop = key.name; - var val = decode_param(m[i]); - - if (val !== undefined || !(hasOwnProperty.call(params, prop))) { - params[prop] = val; - } - } - - return true; -}; - -/** - * Decode param value. - * - * @param {string} val - * @return {string} - * @private - */ - -function decode_param(val) { - if (typeof val !== 'string' || val.length === 0) { - return val; - } - - try { - return decodeURIComponent(val); - } catch (err) { - if (err instanceof URIError) { - err.message = 'Failed to decode param \'' + val + '\''; - err.status = err.statusCode = 400; - } - - throw err; - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/router/route.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/router/route.js deleted file mode 100644 index 2788d7b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/router/route.js +++ /dev/null @@ -1,210 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var debug = require('debug')('express:router:route'); -var flatten = require('array-flatten'); -var Layer = require('./layer'); -var methods = require('methods'); - -/** - * Module variables. - * @private - */ - -var slice = Array.prototype.slice; -var toString = Object.prototype.toString; - -/** - * Module exports. - * @public - */ - -module.exports = Route; - -/** - * Initialize `Route` with the given `path`, - * - * @param {String} path - * @public - */ - -function Route(path) { - this.path = path; - this.stack = []; - - debug('new %s', path); - - // route handlers for various http methods - this.methods = {}; -} - -/** - * Determine if the route handles a given method. - * @private - */ - -Route.prototype._handles_method = function _handles_method(method) { - if (this.methods._all) { - return true; - } - - var name = method.toLowerCase(); - - if (name === 'head' && !this.methods['head']) { - name = 'get'; - } - - return Boolean(this.methods[name]); -}; - -/** - * @return {Array} supported HTTP methods - * @private - */ - -Route.prototype._options = function _options() { - var methods = Object.keys(this.methods); - - // append automatic head - if (this.methods.get && !this.methods.head) { - methods.push('head'); - } - - for (var i = 0; i < methods.length; i++) { - // make upper case - methods[i] = methods[i].toUpperCase(); - } - - return methods; -}; - -/** - * dispatch req, res into this route - * @private - */ - -Route.prototype.dispatch = function dispatch(req, res, done) { - var idx = 0; - var stack = this.stack; - if (stack.length === 0) { - return done(); - } - - var method = req.method.toLowerCase(); - if (method === 'head' && !this.methods['head']) { - method = 'get'; - } - - req.route = this; - - next(); - - function next(err) { - if (err && err === 'route') { - return done(); - } - - var layer = stack[idx++]; - if (!layer) { - return done(err); - } - - if (layer.method && layer.method !== method) { - return next(err); - } - - if (err) { - layer.handle_error(err, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Add a handler for all HTTP verbs to this route. - * - * Behaves just like middleware and can respond or call `next` - * to continue processing. - * - * You can use multiple `.all` call to add multiple handlers. - * - * function check_something(req, res, next){ - * next(); - * }; - * - * function validate_user(req, res, next){ - * next(); - * }; - * - * route - * .all(validate_user) - * .all(check_something) - * .get(function(req, res, next){ - * res.send('hello world'); - * }); - * - * @param {function} handler - * @return {Route} for chaining - * @api public - */ - -Route.prototype.all = function all() { - var handles = flatten(slice.call(arguments)); - - for (var i = 0; i < handles.length; i++) { - var handle = handles[i]; - - if (typeof handle !== 'function') { - var type = toString.call(handle); - var msg = 'Route.all() requires callback functions but got a ' + type; - throw new TypeError(msg); - } - - var layer = Layer('/', {}, handle); - layer.method = undefined; - - this.methods._all = true; - this.stack.push(layer); - } - - return this; -}; - -methods.forEach(function(method){ - Route.prototype[method] = function(){ - var handles = flatten(slice.call(arguments)); - - for (var i = 0; i < handles.length; i++) { - var handle = handles[i]; - - if (typeof handle !== 'function') { - var type = toString.call(handle); - var msg = 'Route.' + method + '() requires callback functions but got a ' + type; - throw new Error(msg); - } - - debug('%s %s', method, this.path); - - var layer = Layer('/', {}, handle); - layer.method = method; - - this.methods[method] = true; - this.stack.push(layer); - } - - return this; - }; -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/utils.js deleted file mode 100644 index 3d54247..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/utils.js +++ /dev/null @@ -1,300 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @api private - */ - -var contentDisposition = require('content-disposition'); -var contentType = require('content-type'); -var deprecate = require('depd')('express'); -var flatten = require('array-flatten'); -var mime = require('send').mime; -var basename = require('path').basename; -var etag = require('etag'); -var proxyaddr = require('proxy-addr'); -var qs = require('qs'); -var querystring = require('querystring'); - -/** - * Return strong ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.etag = function (body, encoding) { - var buf = !Buffer.isBuffer(body) - ? new Buffer(body, encoding) - : body; - - return etag(buf, {weak: false}); -}; - -/** - * Return weak ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.wetag = function wetag(body, encoding){ - var buf = !Buffer.isBuffer(body) - ? new Buffer(body, encoding) - : body; - - return etag(buf, {weak: true}); -}; - -/** - * 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; - if ('\\\\' == path.substring(0, 2)) return true; // Microsoft Azure absolute path -}; - -/** - * Flatten the given `arr`. - * - * @param {Array} arr - * @return {Array} - * @api private - */ - -exports.flatten = deprecate.function(flatten, - 'utils.flatten: use array-flatten npm module instead'); - -/** - * Normalize the given `type`, for example "html" becomes "text/html". - * - * @param {String} type - * @return {Object} - * @api private - */ - -exports.normalizeType = function(type){ - return ~type.indexOf('/') - ? acceptParams(type) - : { value: mime.lookup(type), params: {} }; -}; - -/** - * Normalize `types`, for example "html" becomes "text/html". - * - * @param {Array} types - * @return {Array} - * @api private - */ - -exports.normalizeTypes = function(types){ - var ret = []; - - for (var i = 0; i < types.length; ++i) { - ret.push(exports.normalizeType(types[i])); - } - - return ret; -}; - -/** - * Generate Content-Disposition header appropriate for the filename. - * non-ascii filenames are urlencoded and a filename* parameter is added - * - * @param {String} filename - * @return {String} - * @api private - */ - -exports.contentDisposition = deprecate.function(contentDisposition, - 'utils.contentDisposition: use content-disposition npm module instead'); - -/** - * Parse accept params `str` returning an - * object with `.value`, `.quality` and `.params`. - * also includes `.originalIndex` for stable sorting - * - * @param {String} str - * @return {Object} - * @api private - */ - -function acceptParams(str, index) { - var parts = str.split(/ *; */); - var ret = { value: parts[0], quality: 1, params: {}, originalIndex: index }; - - for (var i = 1; i < parts.length; ++i) { - var pms = parts[i].split(/ *= */); - if ('q' == pms[0]) { - ret.quality = parseFloat(pms[1]); - } else { - ret.params[pms[0]] = pms[1]; - } - } - - return ret; -} - -/** - * Compile "etag" value to function. - * - * @param {Boolean|String|Function} val - * @return {Function} - * @api private - */ - -exports.compileETag = function(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = exports.wetag; - break; - case false: - break; - case 'strong': - fn = exports.etag; - break; - case 'weak': - fn = exports.wetag; - break; - default: - throw new TypeError('unknown value for etag function: ' + val); - } - - return fn; -} - -/** - * Compile "query parser" value to function. - * - * @param {String|Function} val - * @return {Function} - * @api private - */ - -exports.compileQueryParser = function compileQueryParser(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = querystring.parse; - break; - case false: - fn = newObject; - break; - case 'extended': - fn = parseExtendedQueryString; - break; - case 'simple': - fn = querystring.parse; - break; - default: - throw new TypeError('unknown value for query parser function: ' + val); - } - - return fn; -} - -/** - * Compile "proxy trust" value to function. - * - * @param {Boolean|String|Number|Array|Function} val - * @return {Function} - * @api private - */ - -exports.compileTrust = function(val) { - if (typeof val === 'function') return val; - - if (val === true) { - // Support plain true/false - return function(){ return true }; - } - - if (typeof val === 'number') { - // Support trusting hop count - return function(a, i){ return i < val }; - } - - if (typeof val === 'string') { - // Support comma-separated values - val = val.split(/ *, */); - } - - return proxyaddr.compile(val || []); -} - -/** - * Set the charset in a given Content-Type string. - * - * @param {String} type - * @param {String} charset - * @return {String} - * @api private - */ - -exports.setCharset = function setCharset(type, charset) { - if (!type || !charset) { - return type; - } - - // parse type - var parsed = contentType.parse(type); - - // set charset - parsed.parameters.charset = charset; - - // format type - return contentType.format(parsed); -}; - -/** - * Parse an extended query string with qs. - * - * @return {Object} - * @private - */ - -function parseExtendedQueryString(str) { - return qs.parse(str, { - allowDots: false, - allowPrototypes: true - }); -} - -/** - * Return new empty object. - * - * @return {Object} - * @api private - */ - -function newObject() { - return {}; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/view.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/view.js deleted file mode 100644 index 52415d4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/lib/view.js +++ /dev/null @@ -1,173 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var debug = require('debug')('express:view'); -var path = require('path'); -var fs = require('fs'); -var utils = require('./utils'); - -/** - * Module variables. - * @private - */ - -var dirname = path.dirname; -var basename = path.basename; -var extname = path.extname; -var join = path.join; -var resolve = path.resolve; - -/** - * Module exports. - * @public - */ - -module.exports = View; - -/** - * Initialize a new `View` with the given `name`. - * - * Options: - * - * - `defaultEngine` the default template engine name - * - `engines` template engine require() cache - * - `root` root path for view lookup - * - * @param {string} name - * @param {object} options - * @public - */ - -function View(name, options) { - var opts = options || {}; - - this.defaultEngine = opts.defaultEngine; - this.ext = extname(name); - this.name = name; - this.root = opts.root; - - if (!this.ext && !this.defaultEngine) { - throw new Error('No default engine was specified and no extension was provided.'); - } - - var fileName = name; - - if (!this.ext) { - // get extension from default engine name - this.ext = this.defaultEngine[0] !== '.' - ? '.' + this.defaultEngine - : this.defaultEngine; - - fileName += this.ext; - } - - if (!opts.engines[this.ext]) { - // load engine - opts.engines[this.ext] = require(this.ext.substr(1)).__express; - } - - // store loaded engine - this.engine = opts.engines[this.ext]; - - // lookup path - this.path = this.lookup(fileName); -} - -/** - * Lookup view by the given `name` - * - * @param {string} name - * @private - */ - -View.prototype.lookup = function lookup(name) { - var path; - var roots = [].concat(this.root); - - debug('lookup "%s"', name); - - for (var i = 0; i < roots.length && !path; i++) { - var root = roots[i]; - - // resolve the path - var loc = resolve(root, name); - var dir = dirname(loc); - var file = basename(loc); - - // resolve the file - path = this.resolve(dir, file); - } - - return path; -}; - -/** - * Render with the given options. - * - * @param {object} options - * @param {function} callback - * @private - */ - -View.prototype.render = function render(options, callback) { - debug('render "%s"', this.path); - this.engine(this.path, options, callback); -}; - -/** - * Resolve the file within the given directory. - * - * @param {string} dir - * @param {string} file - * @private - */ - -View.prototype.resolve = function resolve(dir, file) { - var ext = this.ext; - - // . - var path = join(dir, file); - var stat = tryStat(path); - - if (stat && stat.isFile()) { - return path; - } - - // /index. - path = join(dir, basename(file, ext), 'index' + ext); - stat = tryStat(path); - - if (stat && stat.isFile()) { - return path; - } -}; - -/** - * Return a stat, maybe. - * - * @param {string} path - * @return {fs.Stats} - * @private - */ - -function tryStat(path) { - debug('stat "%s"', path); - - try { - return fs.statSync(path); - } catch (e) { - return undefined; - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/HISTORY.md deleted file mode 100644 index 53df699..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/HISTORY.md +++ /dev/null @@ -1,164 +0,0 @@ -1.2.12 / 2015-07-30 -=================== - - * deps: mime-types@~2.1.4 - - deps: mime-db@~1.16.0 - -1.2.11 / 2015-07-16 -=================== - - * deps: mime-types@~2.1.3 - - deps: mime-db@~1.15.0 - -1.2.10 / 2015-07-01 -=================== - - * deps: mime-types@~2.1.2 - - deps: mime-db@~1.14.0 - -1.2.9 / 2015-06-08 -================== - - * deps: mime-types@~2.1.1 - - perf: fix deopt during mapping - -1.2.8 / 2015-06-07 -================== - - * deps: mime-types@~2.1.0 - - deps: mime-db@~1.13.0 - * perf: avoid argument reassignment & argument slice - * perf: avoid negotiator recursive construction - * perf: enable strict mode - * perf: remove unnecessary bitwise operator - -1.2.7 / 2015-05-10 -================== - - * deps: negotiator@0.5.3 - - Fix media type parameter matching to be case-insensitive - -1.2.6 / 2015-05-07 -================== - - * deps: mime-types@~2.0.11 - - deps: mime-db@~1.9.1 - * deps: negotiator@0.5.2 - - Fix comparing media types with quoted values - - Fix splitting media types with quoted commas - -1.2.5 / 2015-03-13 -================== - - * deps: mime-types@~2.0.10 - - deps: mime-db@~1.8.0 - -1.2.4 / 2015-02-14 -================== - - * Support Node.js 0.6 - * deps: mime-types@~2.0.9 - - deps: mime-db@~1.7.0 - * deps: negotiator@0.5.1 - - Fix preference sorting to be stable for long acceptable lists - -1.2.3 / 2015-01-31 -================== - - * deps: mime-types@~2.0.8 - - deps: mime-db@~1.6.0 - -1.2.2 / 2014-12-30 -================== - - * deps: mime-types@~2.0.7 - - deps: mime-db@~1.5.0 - -1.2.1 / 2014-12-30 -================== - - * deps: mime-types@~2.0.5 - - deps: mime-db@~1.3.1 - -1.2.0 / 2014-12-19 -================== - - * deps: negotiator@0.5.0 - - Fix list return order when large accepted list - - Fix missing identity encoding when q=0 exists - - Remove dynamic building of Negotiator class - -1.1.4 / 2014-12-10 -================== - - * deps: mime-types@~2.0.4 - - deps: mime-db@~1.3.0 - -1.1.3 / 2014-11-09 -================== - - * deps: mime-types@~2.0.3 - - deps: mime-db@~1.2.0 - -1.1.2 / 2014-10-14 -================== - - * deps: negotiator@0.4.9 - - Fix error when media type has invalid parameter - -1.1.1 / 2014-09-28 -================== - - * deps: mime-types@~2.0.2 - - deps: mime-db@~1.1.0 - * deps: negotiator@0.4.8 - - Fix all negotiations to be case-insensitive - - Stable sort preferences of same quality according to client order - -1.1.0 / 2014-09-02 -================== - - * update `mime-types` - -1.0.7 / 2014-07-04 -================== - - * Fix wrong type returned from `type` when match after unknown extension - -1.0.6 / 2014-06-24 -================== - - * deps: negotiator@0.4.7 - -1.0.5 / 2014-06-20 -================== - - * fix crash when unknown extension given - -1.0.4 / 2014-06-19 -================== - - * use `mime-types` - -1.0.3 / 2014-06-11 -================== - - * deps: negotiator@0.4.6 - - Order by specificity when quality is the same - -1.0.2 / 2014-05-29 -================== - - * Fix interpretation when header not in request - * deps: pin negotiator@0.4.5 - -1.0.1 / 2014-01-18 -================== - - * Identity encoding isn't always acceptable - * deps: negotiator@~0.4.0 - -1.0.0 / 2013-12-27 -================== - - * Genesis diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/LICENSE deleted file mode 100644 index 0616607..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/README.md deleted file mode 100644 index ae36676..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/README.md +++ /dev/null @@ -1,135 +0,0 @@ -# accepts - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator). Extracted from [koa](https://www.npmjs.com/package/koa) for general use. - -In addition to negotiator, it allows: - -- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` as well as `('text/html', 'application/json')`. -- Allows type shorthands such as `json`. -- Returns `false` when no types match -- Treats non-existent headers as `*` - -## Installation - -```sh -npm install accepts -``` - -## API - -```js -var accepts = require('accepts') -``` - -### accepts(req) - -Create a new `Accepts` object for the given `req`. - -#### .charset(charsets) - -Return the first accepted charset. If nothing in `charsets` is accepted, -then `false` is returned. - -#### .charsets() - -Return the charsets that the request accepts, in the order of the client's -preference (most preferred first). - -#### .encoding(encodings) - -Return the first accepted encoding. If nothing in `encodings` is accepted, -then `false` is returned. - -#### .encodings() - -Return the encodings that the request accepts, in the order of the client's -preference (most preferred first). - -#### .language(languages) - -Return the first accepted language. If nothing in `languages` is accepted, -then `false` is returned. - -#### .languages() - -Return the languages that the request accepts, in the order of the client's -preference (most preferred first). - -#### .type(types) - -Return the first accepted type (and it is returned as the same text as what -appears in the `types` array). If nothing in `types` is accepted, then `false` -is returned. - -The `types` array can contain full MIME types or file extensions. Any value -that is not a full MIME types is passed to `require('mime-types').lookup`. - -#### .types() - -Return the types that the request accepts, in the order of the client's -preference (most preferred first). - -## Examples - -### Simple type negotiation - -This simple example shows how to use `accepts` to return a different typed -respond body based on what the client wants to accept. The server lists it's -preferences in order and will get back the best match between the client and -server. - -```js -var accepts = require('accepts') -var http = require('http') - -function app(req, res) { - var accept = accepts(req) - - // the order of this list is significant; should be server preferred order - switch(accept.type(['json', 'html'])) { - case 'json': - res.setHeader('Content-Type', 'application/json') - res.write('{"hello":"world!"}') - break - case 'html': - res.setHeader('Content-Type', 'text/html') - res.write('hello, world!') - break - default: - // the fallback is text/plain, so no need to specify it above - res.setHeader('Content-Type', 'text/plain') - res.write('hello, world!') - break - } - - res.end() -} - -http.createServer(app).listen(3000) -``` - -You can test this out with the cURL program: -```sh -curl -I -H'Accept: text/html' http://localhost:3000/ -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/accepts.svg -[npm-url]: https://npmjs.org/package/accepts -[node-version-image]: https://img.shields.io/node/v/accepts.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/accepts/master.svg -[travis-url]: https://travis-ci.org/jshttp/accepts -[coveralls-image]: https://img.shields.io/coveralls/jshttp/accepts/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/accepts -[downloads-image]: https://img.shields.io/npm/dm/accepts.svg -[downloads-url]: https://npmjs.org/package/accepts diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/index.js deleted file mode 100644 index e80192a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/index.js +++ /dev/null @@ -1,231 +0,0 @@ -/*! - * accepts - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var Negotiator = require('negotiator') -var mime = require('mime-types') - -/** - * Module exports. - * @public - */ - -module.exports = Accepts - -/** - * Create a new Accepts object for the given req. - * - * @param {object} req - * @public - */ - -function Accepts(req) { - if (!(this instanceof Accepts)) - return new Accepts(req) - - this.headers = req.headers - this.negotiator = new Negotiator(req) -} - -/** - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json" or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * this.types('html'); - * // => "html" - * - * // Accept: text/*, application/json - * this.types('html'); - * // => "html" - * this.types('text/html'); - * // => "text/html" - * this.types('json', 'text'); - * // => "json" - * this.types('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * this.types('image/png'); - * this.types('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * this.types(['html', 'json']); - * this.types('html', 'json'); - * // => "json" - * - * @param {String|Array} types... - * @return {String|Array|Boolean} - * @public - */ - -Accepts.prototype.type = -Accepts.prototype.types = function (types_) { - var types = types_ - - // support flattened arguments - if (types && !Array.isArray(types)) { - types = new Array(arguments.length) - for (var i = 0; i < types.length; i++) { - types[i] = arguments[i] - } - } - - // no types, return all requested types - if (!types || types.length === 0) { - return this.negotiator.mediaTypes() - } - - if (!this.headers.accept) return types[0]; - var mimes = types.map(extToMime); - var accepts = this.negotiator.mediaTypes(mimes.filter(validMime)); - var first = accepts[0]; - if (!first) return false; - return types[mimes.indexOf(first)]; -} - -/** - * Return accepted encodings or best fit based on `encodings`. - * - * Given `Accept-Encoding: gzip, deflate` - * an array sorted by quality is returned: - * - * ['gzip', 'deflate'] - * - * @param {String|Array} encodings... - * @return {String|Array} - * @public - */ - -Accepts.prototype.encoding = -Accepts.prototype.encodings = function (encodings_) { - var encodings = encodings_ - - // support flattened arguments - if (encodings && !Array.isArray(encodings)) { - encodings = new Array(arguments.length) - for (var i = 0; i < encodings.length; i++) { - encodings[i] = arguments[i] - } - } - - // no encodings, return all requested encodings - if (!encodings || encodings.length === 0) { - return this.negotiator.encodings() - } - - return this.negotiator.encodings(encodings)[0] || false -} - -/** - * Return accepted charsets or best fit based on `charsets`. - * - * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` - * an array sorted by quality is returned: - * - * ['utf-8', 'utf-7', 'iso-8859-1'] - * - * @param {String|Array} charsets... - * @return {String|Array} - * @public - */ - -Accepts.prototype.charset = -Accepts.prototype.charsets = function (charsets_) { - var charsets = charsets_ - - // support flattened arguments - if (charsets && !Array.isArray(charsets)) { - charsets = new Array(arguments.length) - for (var i = 0; i < charsets.length; i++) { - charsets[i] = arguments[i] - } - } - - // no charsets, return all requested charsets - if (!charsets || charsets.length === 0) { - return this.negotiator.charsets() - } - - return this.negotiator.charsets(charsets)[0] || false -} - -/** - * Return accepted languages or best fit based on `langs`. - * - * Given `Accept-Language: en;q=0.8, es, pt` - * an array sorted by quality is returned: - * - * ['es', 'pt', 'en'] - * - * @param {String|Array} langs... - * @return {Array|String} - * @public - */ - -Accepts.prototype.lang = -Accepts.prototype.langs = -Accepts.prototype.language = -Accepts.prototype.languages = function (languages_) { - var languages = languages_ - - // support flattened arguments - if (languages && !Array.isArray(languages)) { - languages = new Array(arguments.length) - for (var i = 0; i < languages.length; i++) { - languages[i] = arguments[i] - } - } - - // no languages, return all requested languages - if (!languages || languages.length === 0) { - return this.negotiator.languages() - } - - return this.negotiator.languages(languages)[0] || false -} - -/** - * Convert extnames to mime. - * - * @param {String} type - * @return {String} - * @private - */ - -function extToMime(type) { - return type.indexOf('/') === -1 - ? mime.lookup(type) - : type -} - -/** - * Check if mime is valid. - * - * @param {String} type - * @return {String} - * @private - */ - -function validMime(type) { - return typeof type === 'string'; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/HISTORY.md deleted file mode 100644 index e7bed42..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/HISTORY.md +++ /dev/null @@ -1,165 +0,0 @@ -2.1.6 / 2015-09--03 -================== - - * deps: mime-db@~1.18.0 - - Add new mime types - -2.1.5 / 2015-08-20 -================== - - * deps: mime-db@~1.17.0 - - Add new mime types - -2.1.4 / 2015-07-30 -================== - - * deps: mime-db@~1.16.0 - - Add new mime types - -2.1.3 / 2015-07-13 -================== - - * deps: mime-db@~1.15.0 - - Add new mime types - -2.1.2 / 2015-06-25 -================== - - * deps: mime-db@~1.14.0 - - Add new mime types - -2.1.1 / 2015-06-08 -================== - - * perf: fix deopt during mapping - -2.1.0 / 2015-06-07 -================== - - * Fix incorrectly treating extension-less file name as extension - - i.e. `'path/to/json'` will no longer return `application/json` - * Fix `.charset(type)` to accept parameters - * Fix `.charset(type)` to match case-insensitive - * Improve generation of extension to MIME mapping - * Refactor internals for readability and no argument reassignment - * Prefer `application/*` MIME types from the same source - * Prefer any type over `application/octet-stream` - * deps: mime-db@~1.13.0 - - Add nginx as a source - - Add new mime types - -2.0.14 / 2015-06-06 -=================== - - * deps: mime-db@~1.12.0 - - Add new mime types - -2.0.13 / 2015-05-31 -=================== - - * deps: mime-db@~1.11.0 - - Add new mime types - -2.0.12 / 2015-05-19 -=================== - - * deps: mime-db@~1.10.0 - - Add new mime types - -2.0.11 / 2015-05-05 -=================== - - * deps: mime-db@~1.9.1 - - Add new mime types - -2.0.10 / 2015-03-13 -=================== - - * deps: mime-db@~1.8.0 - - Add new mime types - -2.0.9 / 2015-02-09 -================== - - * deps: mime-db@~1.7.0 - - Add new mime types - - Community extensions ownership transferred from `node-mime` - -2.0.8 / 2015-01-29 -================== - - * deps: mime-db@~1.6.0 - - Add new mime types - -2.0.7 / 2014-12-30 -================== - - * deps: mime-db@~1.5.0 - - Add new mime types - - Fix various invalid MIME type entries - -2.0.6 / 2014-12-30 -================== - - * deps: mime-db@~1.4.0 - - Add new mime types - - Fix various invalid MIME type entries - - Remove example template MIME types - -2.0.5 / 2014-12-29 -================== - - * deps: mime-db@~1.3.1 - - Fix missing extensions - -2.0.4 / 2014-12-10 -================== - - * deps: mime-db@~1.3.0 - - Add new mime types - -2.0.3 / 2014-11-09 -================== - - * deps: mime-db@~1.2.0 - - Add new mime types - -2.0.2 / 2014-09-28 -================== - - * deps: mime-db@~1.1.0 - - Add new mime types - - Add additional compressible - - Update charsets - -2.0.1 / 2014-09-07 -================== - - * Support Node.js 0.6 - -2.0.0 / 2014-09-02 -================== - - * Use `mime-db` - * Remove `.define()` - -1.0.2 / 2014-08-04 -================== - - * Set charset=utf-8 for `text/javascript` - -1.0.1 / 2014-06-24 -================== - - * Add `text/jsx` type - -1.0.0 / 2014-05-12 -================== - - * Return `false` for unknown types - * Set charset=utf-8 for `application/json` - -0.1.0 / 2014-05-02 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE deleted file mode 100644 index 0616607..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/README.md deleted file mode 100644 index e26295d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/README.md +++ /dev/null @@ -1,103 +0,0 @@ -# mime-types - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -The ultimate javascript content-type utility. - -Similar to [node-mime](https://github.com/broofa/node-mime), except: - -- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, - so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. -- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. -- Additional mime types are added such as jade and stylus via [mime-db](https://github.com/jshttp/mime-db) -- No `.define()` functionality - -Otherwise, the API is compatible. - -## Install - -```sh -$ npm install mime-types -``` - -## Adding Types - -All mime types are based on [mime-db](https://github.com/jshttp/mime-db), -so open a PR there if you'd like to add mime types. - -## API - -```js -var mime = require('mime-types') -``` - -All functions return `false` if input is invalid or not found. - -### mime.lookup(path) - -Lookup the content-type associated with a file. - -```js -mime.lookup('json') // 'application/json' -mime.lookup('.md') // 'text/x-markdown' -mime.lookup('file.html') // 'text/html' -mime.lookup('folder/file.js') // 'application/javascript' -mime.lookup('folder/.htaccess') // false - -mime.lookup('cats') // false -``` - -### mime.contentType(type) - -Create a full content-type header given a content-type or extension. - -```js -mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' -mime.contentType('file.json') // 'application/json; charset=utf-8' - -// from a full path -mime.contentType(path.extname('/path/to/file.json')) // 'application/json; charset=utf-8' -``` - -### mime.extension(type) - -Get the default extension for a content-type. - -```js -mime.extension('application/octet-stream') // 'bin' -``` - -### mime.charset(type) - -Lookup the implied default charset of a content-type. - -```js -mime.charset('text/x-markdown') // 'UTF-8' -``` - -### var type = mime.types[extension] - -A map of content-types by extension. - -### [extensions...] = mime.extensions[type] - -A map of extensions by content-type. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/mime-types.svg -[npm-url]: https://npmjs.org/package/mime-types -[node-version-image]: https://img.shields.io/node/v/mime-types.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/mime-types/master.svg -[travis-url]: https://travis-ci.org/jshttp/mime-types -[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-types/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/mime-types -[downloads-image]: https://img.shields.io/npm/dm/mime-types.svg -[downloads-url]: https://npmjs.org/package/mime-types diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/index.js deleted file mode 100644 index f7008b2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/index.js +++ /dev/null @@ -1,188 +0,0 @@ -/*! - * mime-types - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var db = require('mime-db') -var extname = require('path').extname - -/** - * Module variables. - * @private - */ - -var extractTypeRegExp = /^\s*([^;\s]*)(?:;|\s|$)/ -var textTypeRegExp = /^text\//i - -/** - * Module exports. - * @public - */ - -exports.charset = charset -exports.charsets = { lookup: charset } -exports.contentType = contentType -exports.extension = extension -exports.extensions = Object.create(null) -exports.lookup = lookup -exports.types = Object.create(null) - -// Populate the extensions/types maps -populateMaps(exports.extensions, exports.types) - -/** - * Get the default charset for a MIME type. - * - * @param {string} type - * @return {boolean|string} - */ - -function charset(type) { - if (!type || typeof type !== 'string') { - return false - } - - // TODO: use media-typer - var match = extractTypeRegExp.exec(type) - var mime = match && db[match[1].toLowerCase()] - - if (mime && mime.charset) { - return mime.charset - } - - // default text/* to utf-8 - if (match && textTypeRegExp.test(match[1])) { - return 'UTF-8' - } - - return false -} - -/** - * Create a full Content-Type header given a MIME type or extension. - * - * @param {string} str - * @return {boolean|string} - */ - -function contentType(str) { - // TODO: should this even be in this module? - if (!str || typeof str !== 'string') { - return false - } - - var mime = str.indexOf('/') === -1 - ? exports.lookup(str) - : str - - if (!mime) { - return false - } - - // TODO: use content-type or other module - if (mime.indexOf('charset') === -1) { - var charset = exports.charset(mime) - if (charset) mime += '; charset=' + charset.toLowerCase() - } - - return mime -} - -/** - * Get the default extension for a MIME type. - * - * @param {string} type - * @return {boolean|string} - */ - -function extension(type) { - if (!type || typeof type !== 'string') { - return false - } - - // TODO: use media-typer - var match = extractTypeRegExp.exec(type) - - // get extensions - var exts = match && exports.extensions[match[1].toLowerCase()] - - if (!exts || !exts.length) { - return false - } - - return exts[0] -} - -/** - * Lookup the MIME type for a file path/extension. - * - * @param {string} path - * @return {boolean|string} - */ - -function lookup(path) { - if (!path || typeof path !== 'string') { - return false - } - - // get the extension ("ext" or ".ext" or full path) - var extension = extname('x.' + path) - .toLowerCase() - .substr(1) - - if (!extension) { - return false - } - - return exports.types[extension] || false -} - -/** - * Populate the extensions and types maps. - * @private - */ - -function populateMaps(extensions, types) { - // source preference (least -> most) - var preference = ['nginx', 'apache', undefined, 'iana'] - - Object.keys(db).forEach(function forEachMimeType(type) { - var mime = db[type] - var exts = mime.extensions - - if (!exts || !exts.length) { - return - } - - // mime -> extensions - extensions[type] = exts - - // extension -> mime - for (var i = 0; i < exts.length; i++) { - var extension = exts[i] - - if (types[extension]) { - var from = preference.indexOf(db[types[extension]].source) - var to = preference.indexOf(mime.source) - - if (types[extension] !== 'application/octet-stream' - && from > to || (from === to && types[extension].substr(0, 12) === 'application/')) { - // skip the remapping - continue - } - } - - // set the extension -> mime - types[extension] = type - } - }) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/HISTORY.md deleted file mode 100644 index 87ab929..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/HISTORY.md +++ /dev/null @@ -1,266 +0,0 @@ -1.18.0 / 2015-09-03 -=================== - - * Add `application/pkcs12` - * Add `application/vnd.3gpp-prose+xml` - * Add `application/vnd.3gpp.mid-call+xml` - * Add `application/vnd.3gpp.state-and-event-info+xml` - * Add `application/vnd.anki` - * Add `application/vnd.firemonkeys.cloudcell` - * Add `application/vnd.openblox.game+xml` - * Add `application/vnd.openblox.game-binary` - -1.17.0 / 2015-08-13 -=================== - - * Add `application/x-msdos-program` - * Add `audio/g711-0` - * Add `image/vnd.mozilla.apng` - * Add extension `.exe` to `application/x-msdos-program` - -1.16.0 / 2015-07-29 -=================== - - * Add `application/vnd.uri-map` - -1.15.0 / 2015-07-13 -=================== - - * Add `application/x-httpd-php` - -1.14.0 / 2015-06-25 -=================== - - * Add `application/scim+json` - * Add `application/vnd.3gpp.ussd+xml` - * Add `application/vnd.biopax.rdf+xml` - * Add `text/x-processing` - -1.13.0 / 2015-06-07 -=================== - - * Add nginx as a source - * Add `application/x-cocoa` - * Add `application/x-java-archive-diff` - * Add `application/x-makeself` - * Add `application/x-perl` - * Add `application/x-pilot` - * Add `application/x-redhat-package-manager` - * Add `application/x-sea` - * Add `audio/x-m4a` - * Add `audio/x-realaudio` - * Add `image/x-jng` - * Add `text/mathml` - -1.12.0 / 2015-06-05 -=================== - - * Add `application/bdoc` - * Add `application/vnd.hyperdrive+json` - * Add `application/x-bdoc` - * Add extension `.rtf` to `text/rtf` - -1.11.0 / 2015-05-31 -=================== - - * Add `audio/wav` - * Add `audio/wave` - * Add extension `.litcoffee` to `text/coffeescript` - * Add extension `.sfd-hdstx` to `application/vnd.hydrostatix.sof-data` - * Add extension `.n-gage` to `application/vnd.nokia.n-gage.symbian.install` - -1.10.0 / 2015-05-19 -=================== - - * Add `application/vnd.balsamiq.bmpr` - * Add `application/vnd.microsoft.portable-executable` - * Add `application/x-ns-proxy-autoconfig` - -1.9.1 / 2015-04-19 -================== - - * Remove `.json` extension from `application/manifest+json` - - This is causing bugs downstream - -1.9.0 / 2015-04-19 -================== - - * Add `application/manifest+json` - * Add `application/vnd.micro+json` - * Add `image/vnd.zbrush.pcx` - * Add `image/x-ms-bmp` - -1.8.0 / 2015-03-13 -================== - - * Add `application/vnd.citationstyles.style+xml` - * Add `application/vnd.fastcopy-disk-image` - * Add `application/vnd.gov.sk.xmldatacontainer+xml` - * Add extension `.jsonld` to `application/ld+json` - -1.7.0 / 2015-02-08 -================== - - * Add `application/vnd.gerber` - * Add `application/vnd.msa-disk-image` - -1.6.1 / 2015-02-05 -================== - - * Community extensions ownership transferred from `node-mime` - -1.6.0 / 2015-01-29 -================== - - * Add `application/jose` - * Add `application/jose+json` - * Add `application/json-seq` - * Add `application/jwk+json` - * Add `application/jwk-set+json` - * Add `application/jwt` - * Add `application/rdap+json` - * Add `application/vnd.gov.sk.e-form+xml` - * Add `application/vnd.ims.imsccv1p3` - -1.5.0 / 2014-12-30 -================== - - * Add `application/vnd.oracle.resource+json` - * Fix various invalid MIME type entries - - `application/mbox+xml` - - `application/oscp-response` - - `application/vwg-multiplexed` - - `audio/g721` - -1.4.0 / 2014-12-21 -================== - - * Add `application/vnd.ims.imsccv1p2` - * Fix various invalid MIME type entries - - `application/vnd-acucobol` - - `application/vnd-curl` - - `application/vnd-dart` - - `application/vnd-dxr` - - `application/vnd-fdf` - - `application/vnd-mif` - - `application/vnd-sema` - - `application/vnd-wap-wmlc` - - `application/vnd.adobe.flash-movie` - - `application/vnd.dece-zip` - - `application/vnd.dvb_service` - - `application/vnd.micrografx-igx` - - `application/vnd.sealed-doc` - - `application/vnd.sealed-eml` - - `application/vnd.sealed-mht` - - `application/vnd.sealed-ppt` - - `application/vnd.sealed-tiff` - - `application/vnd.sealed-xls` - - `application/vnd.sealedmedia.softseal-html` - - `application/vnd.sealedmedia.softseal-pdf` - - `application/vnd.wap-slc` - - `application/vnd.wap-wbxml` - - `audio/vnd.sealedmedia.softseal-mpeg` - - `image/vnd-djvu` - - `image/vnd-svf` - - `image/vnd-wap-wbmp` - - `image/vnd.sealed-png` - - `image/vnd.sealedmedia.softseal-gif` - - `image/vnd.sealedmedia.softseal-jpg` - - `model/vnd-dwf` - - `model/vnd.parasolid.transmit-binary` - - `model/vnd.parasolid.transmit-text` - - `text/vnd-a` - - `text/vnd-curl` - - `text/vnd.wap-wml` - * Remove example template MIME types - - `application/example` - - `audio/example` - - `image/example` - - `message/example` - - `model/example` - - `multipart/example` - - `text/example` - - `video/example` - -1.3.1 / 2014-12-16 -================== - - * Fix missing extensions - - `application/json5` - - `text/hjson` - -1.3.0 / 2014-12-07 -================== - - * Add `application/a2l` - * Add `application/aml` - * Add `application/atfx` - * Add `application/atxml` - * Add `application/cdfx+xml` - * Add `application/dii` - * Add `application/json5` - * Add `application/lxf` - * Add `application/mf4` - * Add `application/vnd.apache.thrift.compact` - * Add `application/vnd.apache.thrift.json` - * Add `application/vnd.coffeescript` - * Add `application/vnd.enphase.envoy` - * Add `application/vnd.ims.imsccv1p1` - * Add `text/csv-schema` - * Add `text/hjson` - * Add `text/markdown` - * Add `text/yaml` - -1.2.0 / 2014-11-09 -================== - - * Add `application/cea` - * Add `application/dit` - * Add `application/vnd.gov.sk.e-form+zip` - * Add `application/vnd.tmd.mediaflex.api+xml` - * Type `application/epub+zip` is now IANA-registered - -1.1.2 / 2014-10-23 -================== - - * Rebuild database for `application/x-www-form-urlencoded` change - -1.1.1 / 2014-10-20 -================== - - * Mark `application/x-www-form-urlencoded` as compressible. - -1.1.0 / 2014-09-28 -================== - - * Add `application/font-woff2` - -1.0.3 / 2014-09-25 -================== - - * Fix engine requirement in package - -1.0.2 / 2014-09-25 -================== - - * Add `application/coap-group+json` - * Add `application/dcd` - * Add `application/vnd.apache.thrift.binary` - * Add `image/vnd.tencent.tap` - * Mark all JSON-derived types as compressible - * Update `text/vtt` data - -1.0.1 / 2014-08-30 -================== - - * Fix extension ordering - -1.0.0 / 2014-08-30 -================== - - * Add `application/atf` - * Add `application/merge-patch+json` - * Add `multipart/x-mixed-replace` - * Add `source: 'apache'` metadata - * Add `source: 'iana'` metadata - * Remove badly-assumed charset data diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/README.md deleted file mode 100644 index 164cca0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# mime-db - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Downloads][npm-downloads-image]][npm-url] -[![Node.js Version][node-image]][node-url] -[![Build Status][travis-image]][travis-url] -[![Coverage Status][coveralls-image]][coveralls-url] - -This is a database of all mime types. -It consists of a single, public JSON file and does not include any logic, -allowing it to remain as un-opinionated as possible with an API. -It aggregates data from the following sources: - -- http://www.iana.org/assignments/media-types/media-types.xhtml -- http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -- http://hg.nginx.org/nginx/raw-file/default/conf/mime.types - -## Installation - -```bash -npm install mime-db -``` - -### Database Download - -If you're crazy enough to use this in the browser, you can just grab the -JSON file using [RawGit](https://rawgit.com/). It is recommended to replace -`master` with [a release tag](https://github.com/jshttp/mime-db/tags) as the -JSON format may change in the future. - -``` -https://cdn.rawgit.com/jshttp/mime-db/master/db.json -``` - -## Usage - -```js -var db = require('mime-db'); - -// grab data on .js files -var data = db['application/javascript']; -``` - -## Data Structure - -The JSON file is a map lookup for lowercased mime types. -Each mime type has the following properties: - -- `.source` - where the mime type is defined. - If not set, it's probably a custom media type. - - `apache` - [Apache common media types](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types) - - `iana` - [IANA-defined media types](http://www.iana.org/assignments/media-types/media-types.xhtml) - - `nginx` - [nginx media types](http://hg.nginx.org/nginx/raw-file/default/conf/mime.types) -- `.extensions[]` - known extensions associated with this mime type. -- `.compressible` - whether a file of this type is can be gzipped. -- `.charset` - the default charset associated with this type, if any. - -If unknown, every property could be `undefined`. - -## Contributing - -To edit the database, only make PRs against `src/custom.json` or -`src/custom-suffix.json`. - -To update the build, run `npm run build`. - -## Adding Custom Media Types - -The best way to get new media types included in this library is to register -them with the IANA. The community registration procedure is outlined in -[RFC 6838 section 5](http://tools.ietf.org/html/rfc6838#section-5). Types -registered with the IANA are automatically pulled into this library. - -[npm-version-image]: https://img.shields.io/npm/v/mime-db.svg -[npm-downloads-image]: https://img.shields.io/npm/dm/mime-db.svg -[npm-url]: https://npmjs.org/package/mime-db -[travis-image]: https://img.shields.io/travis/jshttp/mime-db/master.svg -[travis-url]: https://travis-ci.org/jshttp/mime-db -[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-db/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/mime-db?branch=master -[node-image]: https://img.shields.io/node/v/mime-db.svg -[node-url]: http://nodejs.org/download/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/db.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/db.json deleted file mode 100644 index 96aae45..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/db.json +++ /dev/null @@ -1,6460 +0,0 @@ -{ - "application/1d-interleaved-parityfec": { - "source": "iana" - }, - "application/3gpdash-qoe-report+xml": { - "source": "iana" - }, - "application/3gpp-ims+xml": { - "source": "iana" - }, - "application/a2l": { - "source": "iana" - }, - "application/activemessage": { - "source": "iana" - }, - "application/alto-costmap+json": { - "source": "iana", - "compressible": true - }, - "application/alto-costmapfilter+json": { - "source": "iana", - "compressible": true - }, - "application/alto-directory+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointcost+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointcostparams+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointprop+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointpropparams+json": { - "source": "iana", - "compressible": true - }, - "application/alto-error+json": { - "source": "iana", - "compressible": true - }, - "application/alto-networkmap+json": { - "source": "iana", - "compressible": true - }, - "application/alto-networkmapfilter+json": { - "source": "iana", - "compressible": true - }, - "application/aml": { - "source": "iana" - }, - "application/andrew-inset": { - "source": "iana", - "extensions": ["ez"] - }, - "application/applefile": { - "source": "iana" - }, - "application/applixware": { - "source": "apache", - "extensions": ["aw"] - }, - "application/atf": { - "source": "iana" - }, - "application/atfx": { - "source": "iana" - }, - "application/atom+xml": { - "source": "iana", - "compressible": true, - "extensions": ["atom"] - }, - "application/atomcat+xml": { - "source": "iana", - "extensions": ["atomcat"] - }, - "application/atomdeleted+xml": { - "source": "iana" - }, - "application/atomicmail": { - "source": "iana" - }, - "application/atomsvc+xml": { - "source": "iana", - "extensions": ["atomsvc"] - }, - "application/atxml": { - "source": "iana" - }, - "application/auth-policy+xml": { - "source": "iana" - }, - "application/bacnet-xdd+zip": { - "source": "iana" - }, - "application/batch-smtp": { - "source": "iana" - }, - "application/bdoc": { - "compressible": false, - "extensions": ["bdoc"] - }, - "application/beep+xml": { - "source": "iana" - }, - "application/calendar+json": { - "source": "iana", - "compressible": true - }, - "application/calendar+xml": { - "source": "iana" - }, - "application/call-completion": { - "source": "iana" - }, - "application/cals-1840": { - "source": "iana" - }, - "application/cbor": { - "source": "iana" - }, - "application/ccmp+xml": { - "source": "iana" - }, - "application/ccxml+xml": { - "source": "iana", - "extensions": ["ccxml"] - }, - "application/cdfx+xml": { - "source": "iana" - }, - "application/cdmi-capability": { - "source": "iana", - "extensions": ["cdmia"] - }, - "application/cdmi-container": { - "source": "iana", - "extensions": ["cdmic"] - }, - "application/cdmi-domain": { - "source": "iana", - "extensions": ["cdmid"] - }, - "application/cdmi-object": { - "source": "iana", - "extensions": ["cdmio"] - }, - "application/cdmi-queue": { - "source": "iana", - "extensions": ["cdmiq"] - }, - "application/cea": { - "source": "iana" - }, - "application/cea-2018+xml": { - "source": "iana" - }, - "application/cellml+xml": { - "source": "iana" - }, - "application/cfw": { - "source": "iana" - }, - "application/cms": { - "source": "iana" - }, - "application/cnrp+xml": { - "source": "iana" - }, - "application/coap-group+json": { - "source": "iana", - "compressible": true - }, - "application/commonground": { - "source": "iana" - }, - "application/conference-info+xml": { - "source": "iana" - }, - "application/cpl+xml": { - "source": "iana" - }, - "application/csrattrs": { - "source": "iana" - }, - "application/csta+xml": { - "source": "iana" - }, - "application/cstadata+xml": { - "source": "iana" - }, - "application/cu-seeme": { - "source": "apache", - "extensions": ["cu"] - }, - "application/cybercash": { - "source": "iana" - }, - "application/dart": { - "compressible": true - }, - "application/dash+xml": { - "source": "iana", - "extensions": ["mdp"] - }, - "application/dashdelta": { - "source": "iana" - }, - "application/davmount+xml": { - "source": "iana", - "extensions": ["davmount"] - }, - "application/dca-rft": { - "source": "iana" - }, - "application/dcd": { - "source": "iana" - }, - "application/dec-dx": { - "source": "iana" - }, - "application/dialog-info+xml": { - "source": "iana" - }, - "application/dicom": { - "source": "iana" - }, - "application/dii": { - "source": "iana" - }, - "application/dit": { - "source": "iana" - }, - "application/dns": { - "source": "iana" - }, - "application/docbook+xml": { - "source": "apache", - "extensions": ["dbk"] - }, - "application/dskpp+xml": { - "source": "iana" - }, - "application/dssc+der": { - "source": "iana", - "extensions": ["dssc"] - }, - "application/dssc+xml": { - "source": "iana", - "extensions": ["xdssc"] - }, - "application/dvcs": { - "source": "iana" - }, - "application/ecmascript": { - "source": "iana", - "compressible": true, - "extensions": ["ecma"] - }, - "application/edi-consent": { - "source": "iana" - }, - "application/edi-x12": { - "source": "iana", - "compressible": false - }, - "application/edifact": { - "source": "iana", - "compressible": false - }, - "application/emma+xml": { - "source": "iana", - "extensions": ["emma"] - }, - "application/emotionml+xml": { - "source": "iana" - }, - "application/encaprtp": { - "source": "iana" - }, - "application/epp+xml": { - "source": "iana" - }, - "application/epub+zip": { - "source": "iana", - "extensions": ["epub"] - }, - "application/eshop": { - "source": "iana" - }, - "application/exi": { - "source": "iana", - "extensions": ["exi"] - }, - "application/fastinfoset": { - "source": "iana" - }, - "application/fastsoap": { - "source": "iana" - }, - "application/fdt+xml": { - "source": "iana" - }, - "application/fits": { - "source": "iana" - }, - "application/font-sfnt": { - "source": "iana" - }, - "application/font-tdpfr": { - "source": "iana", - "extensions": ["pfr"] - }, - "application/font-woff": { - "source": "iana", - "compressible": false, - "extensions": ["woff"] - }, - "application/font-woff2": { - "compressible": false, - "extensions": ["woff2"] - }, - "application/framework-attributes+xml": { - "source": "iana" - }, - "application/gml+xml": { - "source": "apache", - "extensions": ["gml"] - }, - "application/gpx+xml": { - "source": "apache", - "extensions": ["gpx"] - }, - "application/gxf": { - "source": "apache", - "extensions": ["gxf"] - }, - "application/gzip": { - "source": "iana", - "compressible": false - }, - "application/h224": { - "source": "iana" - }, - "application/held+xml": { - "source": "iana" - }, - "application/http": { - "source": "iana" - }, - "application/hyperstudio": { - "source": "iana", - "extensions": ["stk"] - }, - "application/ibe-key-request+xml": { - "source": "iana" - }, - "application/ibe-pkg-reply+xml": { - "source": "iana" - }, - "application/ibe-pp-data": { - "source": "iana" - }, - "application/iges": { - "source": "iana" - }, - "application/im-iscomposing+xml": { - "source": "iana" - }, - "application/index": { - "source": "iana" - }, - "application/index.cmd": { - "source": "iana" - }, - "application/index.obj": { - "source": "iana" - }, - "application/index.response": { - "source": "iana" - }, - "application/index.vnd": { - "source": "iana" - }, - "application/inkml+xml": { - "source": "iana", - "extensions": ["ink","inkml"] - }, - "application/iotp": { - "source": "iana" - }, - "application/ipfix": { - "source": "iana", - "extensions": ["ipfix"] - }, - "application/ipp": { - "source": "iana" - }, - "application/isup": { - "source": "iana" - }, - "application/its+xml": { - "source": "iana" - }, - "application/java-archive": { - "source": "apache", - "compressible": false, - "extensions": ["jar","war","ear"] - }, - "application/java-serialized-object": { - "source": "apache", - "compressible": false, - "extensions": ["ser"] - }, - "application/java-vm": { - "source": "apache", - "compressible": false, - "extensions": ["class"] - }, - "application/javascript": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["js"] - }, - "application/jose": { - "source": "iana" - }, - "application/jose+json": { - "source": "iana", - "compressible": true - }, - "application/jrd+json": { - "source": "iana", - "compressible": true - }, - "application/json": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["json","map"] - }, - "application/json-patch+json": { - "source": "iana", - "compressible": true - }, - "application/json-seq": { - "source": "iana" - }, - "application/json5": { - "extensions": ["json5"] - }, - "application/jsonml+json": { - "source": "apache", - "compressible": true, - "extensions": ["jsonml"] - }, - "application/jwk+json": { - "source": "iana", - "compressible": true - }, - "application/jwk-set+json": { - "source": "iana", - "compressible": true - }, - "application/jwt": { - "source": "iana" - }, - "application/kpml-request+xml": { - "source": "iana" - }, - "application/kpml-response+xml": { - "source": "iana" - }, - "application/ld+json": { - "source": "iana", - "compressible": true, - "extensions": ["jsonld"] - }, - "application/link-format": { - "source": "iana" - }, - "application/load-control+xml": { - "source": "iana" - }, - "application/lost+xml": { - "source": "iana", - "extensions": ["lostxml"] - }, - "application/lostsync+xml": { - "source": "iana" - }, - "application/lxf": { - "source": "iana" - }, - "application/mac-binhex40": { - "source": "iana", - "extensions": ["hqx"] - }, - "application/mac-compactpro": { - "source": "apache", - "extensions": ["cpt"] - }, - "application/macwriteii": { - "source": "iana" - }, - "application/mads+xml": { - "source": "iana", - "extensions": ["mads"] - }, - "application/manifest+json": { - "charset": "UTF-8", - "compressible": true, - "extensions": ["webmanifest"] - }, - "application/marc": { - "source": "iana", - "extensions": ["mrc"] - }, - "application/marcxml+xml": { - "source": "iana", - "extensions": ["mrcx"] - }, - "application/mathematica": { - "source": "iana", - "extensions": ["ma","nb","mb"] - }, - "application/mathml+xml": { - "source": "iana", - "extensions": ["mathml"] - }, - "application/mathml-content+xml": { - "source": "iana" - }, - "application/mathml-presentation+xml": { - "source": "iana" - }, - "application/mbms-associated-procedure-description+xml": { - "source": "iana" - }, - "application/mbms-deregister+xml": { - "source": "iana" - }, - "application/mbms-envelope+xml": { - "source": "iana" - }, - "application/mbms-msk+xml": { - "source": "iana" - }, - "application/mbms-msk-response+xml": { - "source": "iana" - }, - "application/mbms-protection-description+xml": { - "source": "iana" - }, - "application/mbms-reception-report+xml": { - "source": "iana" - }, - "application/mbms-register+xml": { - "source": "iana" - }, - "application/mbms-register-response+xml": { - "source": "iana" - }, - "application/mbms-schedule+xml": { - "source": "iana" - }, - "application/mbms-user-service-description+xml": { - "source": "iana" - }, - "application/mbox": { - "source": "iana", - "extensions": ["mbox"] - }, - "application/media-policy-dataset+xml": { - "source": "iana" - }, - "application/media_control+xml": { - "source": "iana" - }, - "application/mediaservercontrol+xml": { - "source": "iana", - "extensions": ["mscml"] - }, - "application/merge-patch+json": { - "source": "iana", - "compressible": true - }, - "application/metalink+xml": { - "source": "apache", - "extensions": ["metalink"] - }, - "application/metalink4+xml": { - "source": "iana", - "extensions": ["meta4"] - }, - "application/mets+xml": { - "source": "iana", - "extensions": ["mets"] - }, - "application/mf4": { - "source": "iana" - }, - "application/mikey": { - "source": "iana" - }, - "application/mods+xml": { - "source": "iana", - "extensions": ["mods"] - }, - "application/moss-keys": { - "source": "iana" - }, - "application/moss-signature": { - "source": "iana" - }, - "application/mosskey-data": { - "source": "iana" - }, - "application/mosskey-request": { - "source": "iana" - }, - "application/mp21": { - "source": "iana", - "extensions": ["m21","mp21"] - }, - "application/mp4": { - "source": "iana", - "extensions": ["mp4s","m4p"] - }, - "application/mpeg4-generic": { - "source": "iana" - }, - "application/mpeg4-iod": { - "source": "iana" - }, - "application/mpeg4-iod-xmt": { - "source": "iana" - }, - "application/mrb-consumer+xml": { - "source": "iana" - }, - "application/mrb-publish+xml": { - "source": "iana" - }, - "application/msc-ivr+xml": { - "source": "iana" - }, - "application/msc-mixer+xml": { - "source": "iana" - }, - "application/msword": { - "source": "iana", - "compressible": false, - "extensions": ["doc","dot"] - }, - "application/mxf": { - "source": "iana", - "extensions": ["mxf"] - }, - "application/nasdata": { - "source": "iana" - }, - "application/news-checkgroups": { - "source": "iana" - }, - "application/news-groupinfo": { - "source": "iana" - }, - "application/news-transmission": { - "source": "iana" - }, - "application/nlsml+xml": { - "source": "iana" - }, - "application/nss": { - "source": "iana" - }, - "application/ocsp-request": { - "source": "iana" - }, - "application/ocsp-response": { - "source": "iana" - }, - "application/octet-stream": { - "source": "iana", - "compressible": false, - "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"] - }, - "application/oda": { - "source": "iana", - "extensions": ["oda"] - }, - "application/odx": { - "source": "iana" - }, - "application/oebps-package+xml": { - "source": "iana", - "extensions": ["opf"] - }, - "application/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["ogx"] - }, - "application/omdoc+xml": { - "source": "apache", - "extensions": ["omdoc"] - }, - "application/onenote": { - "source": "apache", - "extensions": ["onetoc","onetoc2","onetmp","onepkg"] - }, - "application/oxps": { - "source": "iana", - "extensions": ["oxps"] - }, - "application/p2p-overlay+xml": { - "source": "iana" - }, - "application/parityfec": { - "source": "iana" - }, - "application/patch-ops-error+xml": { - "source": "iana", - "extensions": ["xer"] - }, - "application/pdf": { - "source": "iana", - "compressible": false, - "extensions": ["pdf"] - }, - "application/pdx": { - "source": "iana" - }, - "application/pgp-encrypted": { - "source": "iana", - "compressible": false, - "extensions": ["pgp"] - }, - "application/pgp-keys": { - "source": "iana" - }, - "application/pgp-signature": { - "source": "iana", - "extensions": ["asc","sig"] - }, - "application/pics-rules": { - "source": "apache", - "extensions": ["prf"] - }, - "application/pidf+xml": { - "source": "iana" - }, - "application/pidf-diff+xml": { - "source": "iana" - }, - "application/pkcs10": { - "source": "iana", - "extensions": ["p10"] - }, - "application/pkcs12": { - "source": "iana" - }, - "application/pkcs7-mime": { - "source": "iana", - "extensions": ["p7m","p7c"] - }, - "application/pkcs7-signature": { - "source": "iana", - "extensions": ["p7s"] - }, - "application/pkcs8": { - "source": "iana", - "extensions": ["p8"] - }, - "application/pkix-attr-cert": { - "source": "iana", - "extensions": ["ac"] - }, - "application/pkix-cert": { - "source": "iana", - "extensions": ["cer"] - }, - "application/pkix-crl": { - "source": "iana", - "extensions": ["crl"] - }, - "application/pkix-pkipath": { - "source": "iana", - "extensions": ["pkipath"] - }, - "application/pkixcmp": { - "source": "iana", - "extensions": ["pki"] - }, - "application/pls+xml": { - "source": "iana", - "extensions": ["pls"] - }, - "application/poc-settings+xml": { - "source": "iana" - }, - "application/postscript": { - "source": "iana", - "compressible": true, - "extensions": ["ai","eps","ps"] - }, - "application/provenance+xml": { - "source": "iana" - }, - "application/prs.alvestrand.titrax-sheet": { - "source": "iana" - }, - "application/prs.cww": { - "source": "iana", - "extensions": ["cww"] - }, - "application/prs.hpub+zip": { - "source": "iana" - }, - "application/prs.nprend": { - "source": "iana" - }, - "application/prs.plucker": { - "source": "iana" - }, - "application/prs.rdf-xml-crypt": { - "source": "iana" - }, - "application/prs.xsf+xml": { - "source": "iana" - }, - "application/pskc+xml": { - "source": "iana", - "extensions": ["pskcxml"] - }, - "application/qsig": { - "source": "iana" - }, - "application/raptorfec": { - "source": "iana" - }, - "application/rdap+json": { - "source": "iana", - "compressible": true - }, - "application/rdf+xml": { - "source": "iana", - "compressible": true, - "extensions": ["rdf"] - }, - "application/reginfo+xml": { - "source": "iana", - "extensions": ["rif"] - }, - "application/relax-ng-compact-syntax": { - "source": "iana", - "extensions": ["rnc"] - }, - "application/remote-printing": { - "source": "iana" - }, - "application/reputon+json": { - "source": "iana", - "compressible": true - }, - "application/resource-lists+xml": { - "source": "iana", - "extensions": ["rl"] - }, - "application/resource-lists-diff+xml": { - "source": "iana", - "extensions": ["rld"] - }, - "application/riscos": { - "source": "iana" - }, - "application/rlmi+xml": { - "source": "iana" - }, - "application/rls-services+xml": { - "source": "iana", - "extensions": ["rs"] - }, - "application/rpki-ghostbusters": { - "source": "iana", - "extensions": ["gbr"] - }, - "application/rpki-manifest": { - "source": "iana", - "extensions": ["mft"] - }, - "application/rpki-roa": { - "source": "iana", - "extensions": ["roa"] - }, - "application/rpki-updown": { - "source": "iana" - }, - "application/rsd+xml": { - "source": "apache", - "extensions": ["rsd"] - }, - "application/rss+xml": { - "source": "apache", - "compressible": true, - "extensions": ["rss"] - }, - "application/rtf": { - "source": "iana", - "compressible": true, - "extensions": ["rtf"] - }, - "application/rtploopback": { - "source": "iana" - }, - "application/rtx": { - "source": "iana" - }, - "application/samlassertion+xml": { - "source": "iana" - }, - "application/samlmetadata+xml": { - "source": "iana" - }, - "application/sbml+xml": { - "source": "iana", - "extensions": ["sbml"] - }, - "application/scaip+xml": { - "source": "iana" - }, - "application/scim+json": { - "source": "iana", - "compressible": true - }, - "application/scvp-cv-request": { - "source": "iana", - "extensions": ["scq"] - }, - "application/scvp-cv-response": { - "source": "iana", - "extensions": ["scs"] - }, - "application/scvp-vp-request": { - "source": "iana", - "extensions": ["spq"] - }, - "application/scvp-vp-response": { - "source": "iana", - "extensions": ["spp"] - }, - "application/sdp": { - "source": "iana", - "extensions": ["sdp"] - }, - "application/sep+xml": { - "source": "iana" - }, - "application/sep-exi": { - "source": "iana" - }, - "application/session-info": { - "source": "iana" - }, - "application/set-payment": { - "source": "iana" - }, - "application/set-payment-initiation": { - "source": "iana", - "extensions": ["setpay"] - }, - "application/set-registration": { - "source": "iana" - }, - "application/set-registration-initiation": { - "source": "iana", - "extensions": ["setreg"] - }, - "application/sgml": { - "source": "iana" - }, - "application/sgml-open-catalog": { - "source": "iana" - }, - "application/shf+xml": { - "source": "iana", - "extensions": ["shf"] - }, - "application/sieve": { - "source": "iana" - }, - "application/simple-filter+xml": { - "source": "iana" - }, - "application/simple-message-summary": { - "source": "iana" - }, - "application/simplesymbolcontainer": { - "source": "iana" - }, - "application/slate": { - "source": "iana" - }, - "application/smil": { - "source": "iana" - }, - "application/smil+xml": { - "source": "iana", - "extensions": ["smi","smil"] - }, - "application/smpte336m": { - "source": "iana" - }, - "application/soap+fastinfoset": { - "source": "iana" - }, - "application/soap+xml": { - "source": "iana", - "compressible": true - }, - "application/sparql-query": { - "source": "iana", - "extensions": ["rq"] - }, - "application/sparql-results+xml": { - "source": "iana", - "extensions": ["srx"] - }, - "application/spirits-event+xml": { - "source": "iana" - }, - "application/sql": { - "source": "iana" - }, - "application/srgs": { - "source": "iana", - "extensions": ["gram"] - }, - "application/srgs+xml": { - "source": "iana", - "extensions": ["grxml"] - }, - "application/sru+xml": { - "source": "iana", - "extensions": ["sru"] - }, - "application/ssdl+xml": { - "source": "apache", - "extensions": ["ssdl"] - }, - "application/ssml+xml": { - "source": "iana", - "extensions": ["ssml"] - }, - "application/tamp-apex-update": { - "source": "iana" - }, - "application/tamp-apex-update-confirm": { - "source": "iana" - }, - "application/tamp-community-update": { - "source": "iana" - }, - "application/tamp-community-update-confirm": { - "source": "iana" - }, - "application/tamp-error": { - "source": "iana" - }, - "application/tamp-sequence-adjust": { - "source": "iana" - }, - "application/tamp-sequence-adjust-confirm": { - "source": "iana" - }, - "application/tamp-status-query": { - "source": "iana" - }, - "application/tamp-status-response": { - "source": "iana" - }, - "application/tamp-update": { - "source": "iana" - }, - "application/tamp-update-confirm": { - "source": "iana" - }, - "application/tar": { - "compressible": true - }, - "application/tei+xml": { - "source": "iana", - "extensions": ["tei","teicorpus"] - }, - "application/thraud+xml": { - "source": "iana", - "extensions": ["tfi"] - }, - "application/timestamp-query": { - "source": "iana" - }, - "application/timestamp-reply": { - "source": "iana" - }, - "application/timestamped-data": { - "source": "iana", - "extensions": ["tsd"] - }, - "application/ttml+xml": { - "source": "iana" - }, - "application/tve-trigger": { - "source": "iana" - }, - "application/ulpfec": { - "source": "iana" - }, - "application/urc-grpsheet+xml": { - "source": "iana" - }, - "application/urc-ressheet+xml": { - "source": "iana" - }, - "application/urc-targetdesc+xml": { - "source": "iana" - }, - "application/urc-uisocketdesc+xml": { - "source": "iana" - }, - "application/vcard+json": { - "source": "iana", - "compressible": true - }, - "application/vcard+xml": { - "source": "iana" - }, - "application/vemmi": { - "source": "iana" - }, - "application/vividence.scriptfile": { - "source": "apache" - }, - "application/vnd.3gpp-prose+xml": { - "source": "iana" - }, - "application/vnd.3gpp.bsf+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mid-call+xml": { - "source": "iana" - }, - "application/vnd.3gpp.pic-bw-large": { - "source": "iana", - "extensions": ["plb"] - }, - "application/vnd.3gpp.pic-bw-small": { - "source": "iana", - "extensions": ["psb"] - }, - "application/vnd.3gpp.pic-bw-var": { - "source": "iana", - "extensions": ["pvb"] - }, - "application/vnd.3gpp.sms": { - "source": "iana" - }, - "application/vnd.3gpp.state-and-event-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.ussd+xml": { - "source": "iana" - }, - "application/vnd.3gpp2.bcmcsinfo+xml": { - "source": "iana" - }, - "application/vnd.3gpp2.sms": { - "source": "iana" - }, - "application/vnd.3gpp2.tcap": { - "source": "iana", - "extensions": ["tcap"] - }, - "application/vnd.3m.post-it-notes": { - "source": "iana", - "extensions": ["pwn"] - }, - "application/vnd.accpac.simply.aso": { - "source": "iana", - "extensions": ["aso"] - }, - "application/vnd.accpac.simply.imp": { - "source": "iana", - "extensions": ["imp"] - }, - "application/vnd.acucobol": { - "source": "iana", - "extensions": ["acu"] - }, - "application/vnd.acucorp": { - "source": "iana", - "extensions": ["atc","acutc"] - }, - "application/vnd.adobe.air-application-installer-package+zip": { - "source": "apache", - "extensions": ["air"] - }, - "application/vnd.adobe.flash.movie": { - "source": "iana" - }, - "application/vnd.adobe.formscentral.fcdt": { - "source": "iana", - "extensions": ["fcdt"] - }, - "application/vnd.adobe.fxp": { - "source": "iana", - "extensions": ["fxp","fxpl"] - }, - "application/vnd.adobe.partial-upload": { - "source": "iana" - }, - "application/vnd.adobe.xdp+xml": { - "source": "iana", - "extensions": ["xdp"] - }, - "application/vnd.adobe.xfdf": { - "source": "iana", - "extensions": ["xfdf"] - }, - "application/vnd.aether.imp": { - "source": "iana" - }, - "application/vnd.ah-barcode": { - "source": "iana" - }, - "application/vnd.ahead.space": { - "source": "iana", - "extensions": ["ahead"] - }, - "application/vnd.airzip.filesecure.azf": { - "source": "iana", - "extensions": ["azf"] - }, - "application/vnd.airzip.filesecure.azs": { - "source": "iana", - "extensions": ["azs"] - }, - "application/vnd.amazon.ebook": { - "source": "apache", - "extensions": ["azw"] - }, - "application/vnd.americandynamics.acc": { - "source": "iana", - "extensions": ["acc"] - }, - "application/vnd.amiga.ami": { - "source": "iana", - "extensions": ["ami"] - }, - "application/vnd.amundsen.maze+xml": { - "source": "iana" - }, - "application/vnd.android.package-archive": { - "source": "apache", - "compressible": false, - "extensions": ["apk"] - }, - "application/vnd.anki": { - "source": "iana" - }, - "application/vnd.anser-web-certificate-issue-initiation": { - "source": "iana", - "extensions": ["cii"] - }, - "application/vnd.anser-web-funds-transfer-initiation": { - "source": "apache", - "extensions": ["fti"] - }, - "application/vnd.antix.game-component": { - "source": "iana", - "extensions": ["atx"] - }, - "application/vnd.apache.thrift.binary": { - "source": "iana" - }, - "application/vnd.apache.thrift.compact": { - "source": "iana" - }, - "application/vnd.apache.thrift.json": { - "source": "iana" - }, - "application/vnd.api+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.apple.installer+xml": { - "source": "iana", - "extensions": ["mpkg"] - }, - "application/vnd.apple.mpegurl": { - "source": "iana", - "extensions": ["m3u8"] - }, - "application/vnd.arastra.swi": { - "source": "iana" - }, - "application/vnd.aristanetworks.swi": { - "source": "iana", - "extensions": ["swi"] - }, - "application/vnd.artsquare": { - "source": "iana" - }, - "application/vnd.astraea-software.iota": { - "source": "iana", - "extensions": ["iota"] - }, - "application/vnd.audiograph": { - "source": "iana", - "extensions": ["aep"] - }, - "application/vnd.autopackage": { - "source": "iana" - }, - "application/vnd.avistar+xml": { - "source": "iana" - }, - "application/vnd.balsamiq.bmml+xml": { - "source": "iana" - }, - "application/vnd.balsamiq.bmpr": { - "source": "iana" - }, - "application/vnd.bekitzur-stech+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.biopax.rdf+xml": { - "source": "iana" - }, - "application/vnd.blueice.multipass": { - "source": "iana", - "extensions": ["mpm"] - }, - "application/vnd.bluetooth.ep.oob": { - "source": "iana" - }, - "application/vnd.bluetooth.le.oob": { - "source": "iana" - }, - "application/vnd.bmi": { - "source": "iana", - "extensions": ["bmi"] - }, - "application/vnd.businessobjects": { - "source": "iana", - "extensions": ["rep"] - }, - "application/vnd.cab-jscript": { - "source": "iana" - }, - "application/vnd.canon-cpdl": { - "source": "iana" - }, - "application/vnd.canon-lips": { - "source": "iana" - }, - "application/vnd.cendio.thinlinc.clientconf": { - "source": "iana" - }, - "application/vnd.century-systems.tcp_stream": { - "source": "iana" - }, - "application/vnd.chemdraw+xml": { - "source": "iana", - "extensions": ["cdxml"] - }, - "application/vnd.chipnuts.karaoke-mmd": { - "source": "iana", - "extensions": ["mmd"] - }, - "application/vnd.cinderella": { - "source": "iana", - "extensions": ["cdy"] - }, - "application/vnd.cirpack.isdn-ext": { - "source": "iana" - }, - "application/vnd.citationstyles.style+xml": { - "source": "iana" - }, - "application/vnd.claymore": { - "source": "iana", - "extensions": ["cla"] - }, - "application/vnd.cloanto.rp9": { - "source": "iana", - "extensions": ["rp9"] - }, - "application/vnd.clonk.c4group": { - "source": "iana", - "extensions": ["c4g","c4d","c4f","c4p","c4u"] - }, - "application/vnd.cluetrust.cartomobile-config": { - "source": "iana", - "extensions": ["c11amc"] - }, - "application/vnd.cluetrust.cartomobile-config-pkg": { - "source": "iana", - "extensions": ["c11amz"] - }, - "application/vnd.coffeescript": { - "source": "iana" - }, - "application/vnd.collection+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.collection.doc+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.collection.next+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.commerce-battelle": { - "source": "iana" - }, - "application/vnd.commonspace": { - "source": "iana", - "extensions": ["csp"] - }, - "application/vnd.contact.cmsg": { - "source": "iana", - "extensions": ["cdbcmsg"] - }, - "application/vnd.cosmocaller": { - "source": "iana", - "extensions": ["cmc"] - }, - "application/vnd.crick.clicker": { - "source": "iana", - "extensions": ["clkx"] - }, - "application/vnd.crick.clicker.keyboard": { - "source": "iana", - "extensions": ["clkk"] - }, - "application/vnd.crick.clicker.palette": { - "source": "iana", - "extensions": ["clkp"] - }, - "application/vnd.crick.clicker.template": { - "source": "iana", - "extensions": ["clkt"] - }, - "application/vnd.crick.clicker.wordbank": { - "source": "iana", - "extensions": ["clkw"] - }, - "application/vnd.criticaltools.wbs+xml": { - "source": "iana", - "extensions": ["wbs"] - }, - "application/vnd.ctc-posml": { - "source": "iana", - "extensions": ["pml"] - }, - "application/vnd.ctct.ws+xml": { - "source": "iana" - }, - "application/vnd.cups-pdf": { - "source": "iana" - }, - "application/vnd.cups-postscript": { - "source": "iana" - }, - "application/vnd.cups-ppd": { - "source": "iana", - "extensions": ["ppd"] - }, - "application/vnd.cups-raster": { - "source": "iana" - }, - "application/vnd.cups-raw": { - "source": "iana" - }, - "application/vnd.curl": { - "source": "iana" - }, - "application/vnd.curl.car": { - "source": "apache", - "extensions": ["car"] - }, - "application/vnd.curl.pcurl": { - "source": "apache", - "extensions": ["pcurl"] - }, - "application/vnd.cyan.dean.root+xml": { - "source": "iana" - }, - "application/vnd.cybank": { - "source": "iana" - }, - "application/vnd.dart": { - "source": "iana", - "compressible": true, - "extensions": ["dart"] - }, - "application/vnd.data-vision.rdz": { - "source": "iana", - "extensions": ["rdz"] - }, - "application/vnd.debian.binary-package": { - "source": "iana" - }, - "application/vnd.dece.data": { - "source": "iana", - "extensions": ["uvf","uvvf","uvd","uvvd"] - }, - "application/vnd.dece.ttml+xml": { - "source": "iana", - "extensions": ["uvt","uvvt"] - }, - "application/vnd.dece.unspecified": { - "source": "iana", - "extensions": ["uvx","uvvx"] - }, - "application/vnd.dece.zip": { - "source": "iana", - "extensions": ["uvz","uvvz"] - }, - "application/vnd.denovo.fcselayout-link": { - "source": "iana", - "extensions": ["fe_launch"] - }, - "application/vnd.desmume-movie": { - "source": "iana" - }, - "application/vnd.dir-bi.plate-dl-nosuffix": { - "source": "iana" - }, - "application/vnd.dm.delegation+xml": { - "source": "iana" - }, - "application/vnd.dna": { - "source": "iana", - "extensions": ["dna"] - }, - "application/vnd.document+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.dolby.mlp": { - "source": "apache", - "extensions": ["mlp"] - }, - "application/vnd.dolby.mobile.1": { - "source": "iana" - }, - "application/vnd.dolby.mobile.2": { - "source": "iana" - }, - "application/vnd.doremir.scorecloud-binary-document": { - "source": "iana" - }, - "application/vnd.dpgraph": { - "source": "iana", - "extensions": ["dpg"] - }, - "application/vnd.dreamfactory": { - "source": "iana", - "extensions": ["dfac"] - }, - "application/vnd.ds-keypoint": { - "source": "apache", - "extensions": ["kpxx"] - }, - "application/vnd.dtg.local": { - "source": "iana" - }, - "application/vnd.dtg.local.flash": { - "source": "iana" - }, - "application/vnd.dtg.local.html": { - "source": "iana" - }, - "application/vnd.dvb.ait": { - "source": "iana", - "extensions": ["ait"] - }, - "application/vnd.dvb.dvbj": { - "source": "iana" - }, - "application/vnd.dvb.esgcontainer": { - "source": "iana" - }, - "application/vnd.dvb.ipdcdftnotifaccess": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgaccess": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgaccess2": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgpdd": { - "source": "iana" - }, - "application/vnd.dvb.ipdcroaming": { - "source": "iana" - }, - "application/vnd.dvb.iptv.alfec-base": { - "source": "iana" - }, - "application/vnd.dvb.iptv.alfec-enhancement": { - "source": "iana" - }, - "application/vnd.dvb.notif-aggregate-root+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-container+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-generic+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-msglist+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-registration-request+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-registration-response+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-init+xml": { - "source": "iana" - }, - "application/vnd.dvb.pfr": { - "source": "iana" - }, - "application/vnd.dvb.service": { - "source": "iana", - "extensions": ["svc"] - }, - "application/vnd.dxr": { - "source": "iana" - }, - "application/vnd.dynageo": { - "source": "iana", - "extensions": ["geo"] - }, - "application/vnd.dzr": { - "source": "iana" - }, - "application/vnd.easykaraoke.cdgdownload": { - "source": "iana" - }, - "application/vnd.ecdis-update": { - "source": "iana" - }, - "application/vnd.ecowin.chart": { - "source": "iana", - "extensions": ["mag"] - }, - "application/vnd.ecowin.filerequest": { - "source": "iana" - }, - "application/vnd.ecowin.fileupdate": { - "source": "iana" - }, - "application/vnd.ecowin.series": { - "source": "iana" - }, - "application/vnd.ecowin.seriesrequest": { - "source": "iana" - }, - "application/vnd.ecowin.seriesupdate": { - "source": "iana" - }, - "application/vnd.emclient.accessrequest+xml": { - "source": "iana" - }, - "application/vnd.enliven": { - "source": "iana", - "extensions": ["nml"] - }, - "application/vnd.enphase.envoy": { - "source": "iana" - }, - "application/vnd.eprints.data+xml": { - "source": "iana" - }, - "application/vnd.epson.esf": { - "source": "iana", - "extensions": ["esf"] - }, - "application/vnd.epson.msf": { - "source": "iana", - "extensions": ["msf"] - }, - "application/vnd.epson.quickanime": { - "source": "iana", - "extensions": ["qam"] - }, - "application/vnd.epson.salt": { - "source": "iana", - "extensions": ["slt"] - }, - "application/vnd.epson.ssf": { - "source": "iana", - "extensions": ["ssf"] - }, - "application/vnd.ericsson.quickcall": { - "source": "iana" - }, - "application/vnd.eszigno3+xml": { - "source": "iana", - "extensions": ["es3","et3"] - }, - "application/vnd.etsi.aoc+xml": { - "source": "iana" - }, - "application/vnd.etsi.asic-e+zip": { - "source": "iana" - }, - "application/vnd.etsi.asic-s+zip": { - "source": "iana" - }, - "application/vnd.etsi.cug+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvcommand+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvdiscovery+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvprofile+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-bc+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-cod+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-npvr+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvservice+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsync+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvueprofile+xml": { - "source": "iana" - }, - "application/vnd.etsi.mcid+xml": { - "source": "iana" - }, - "application/vnd.etsi.mheg5": { - "source": "iana" - }, - "application/vnd.etsi.overload-control-policy-dataset+xml": { - "source": "iana" - }, - "application/vnd.etsi.pstn+xml": { - "source": "iana" - }, - "application/vnd.etsi.sci+xml": { - "source": "iana" - }, - "application/vnd.etsi.simservs+xml": { - "source": "iana" - }, - "application/vnd.etsi.timestamp-token": { - "source": "iana" - }, - "application/vnd.etsi.tsl+xml": { - "source": "iana" - }, - "application/vnd.etsi.tsl.der": { - "source": "iana" - }, - "application/vnd.eudora.data": { - "source": "iana" - }, - "application/vnd.ezpix-album": { - "source": "iana", - "extensions": ["ez2"] - }, - "application/vnd.ezpix-package": { - "source": "iana", - "extensions": ["ez3"] - }, - "application/vnd.f-secure.mobile": { - "source": "iana" - }, - "application/vnd.fastcopy-disk-image": { - "source": "iana" - }, - "application/vnd.fdf": { - "source": "iana", - "extensions": ["fdf"] - }, - "application/vnd.fdsn.mseed": { - "source": "iana", - "extensions": ["mseed"] - }, - "application/vnd.fdsn.seed": { - "source": "iana", - "extensions": ["seed","dataless"] - }, - "application/vnd.ffsns": { - "source": "iana" - }, - "application/vnd.fints": { - "source": "iana" - }, - "application/vnd.firemonkeys.cloudcell": { - "source": "iana" - }, - "application/vnd.flographit": { - "source": "iana", - "extensions": ["gph"] - }, - "application/vnd.fluxtime.clip": { - "source": "iana", - "extensions": ["ftc"] - }, - "application/vnd.font-fontforge-sfd": { - "source": "iana" - }, - "application/vnd.framemaker": { - "source": "iana", - "extensions": ["fm","frame","maker","book"] - }, - "application/vnd.frogans.fnc": { - "source": "iana", - "extensions": ["fnc"] - }, - "application/vnd.frogans.ltf": { - "source": "iana", - "extensions": ["ltf"] - }, - "application/vnd.fsc.weblaunch": { - "source": "iana", - "extensions": ["fsc"] - }, - "application/vnd.fujitsu.oasys": { - "source": "iana", - "extensions": ["oas"] - }, - "application/vnd.fujitsu.oasys2": { - "source": "iana", - "extensions": ["oa2"] - }, - "application/vnd.fujitsu.oasys3": { - "source": "iana", - "extensions": ["oa3"] - }, - "application/vnd.fujitsu.oasysgp": { - "source": "iana", - "extensions": ["fg5"] - }, - "application/vnd.fujitsu.oasysprs": { - "source": "iana", - "extensions": ["bh2"] - }, - "application/vnd.fujixerox.art-ex": { - "source": "iana" - }, - "application/vnd.fujixerox.art4": { - "source": "iana" - }, - "application/vnd.fujixerox.ddd": { - "source": "iana", - "extensions": ["ddd"] - }, - "application/vnd.fujixerox.docuworks": { - "source": "iana", - "extensions": ["xdw"] - }, - "application/vnd.fujixerox.docuworks.binder": { - "source": "iana", - "extensions": ["xbd"] - }, - "application/vnd.fujixerox.docuworks.container": { - "source": "iana" - }, - "application/vnd.fujixerox.hbpl": { - "source": "iana" - }, - "application/vnd.fut-misnet": { - "source": "iana" - }, - "application/vnd.fuzzysheet": { - "source": "iana", - "extensions": ["fzs"] - }, - "application/vnd.genomatix.tuxedo": { - "source": "iana", - "extensions": ["txd"] - }, - "application/vnd.geo+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.geocube+xml": { - "source": "iana" - }, - "application/vnd.geogebra.file": { - "source": "iana", - "extensions": ["ggb"] - }, - "application/vnd.geogebra.tool": { - "source": "iana", - "extensions": ["ggt"] - }, - "application/vnd.geometry-explorer": { - "source": "iana", - "extensions": ["gex","gre"] - }, - "application/vnd.geonext": { - "source": "iana", - "extensions": ["gxt"] - }, - "application/vnd.geoplan": { - "source": "iana", - "extensions": ["g2w"] - }, - "application/vnd.geospace": { - "source": "iana", - "extensions": ["g3w"] - }, - "application/vnd.gerber": { - "source": "iana" - }, - "application/vnd.globalplatform.card-content-mgt": { - "source": "iana" - }, - "application/vnd.globalplatform.card-content-mgt-response": { - "source": "iana" - }, - "application/vnd.gmx": { - "source": "iana", - "extensions": ["gmx"] - }, - "application/vnd.google-earth.kml+xml": { - "source": "iana", - "compressible": true, - "extensions": ["kml"] - }, - "application/vnd.google-earth.kmz": { - "source": "iana", - "compressible": false, - "extensions": ["kmz"] - }, - "application/vnd.gov.sk.e-form+xml": { - "source": "iana" - }, - "application/vnd.gov.sk.e-form+zip": { - "source": "iana" - }, - "application/vnd.gov.sk.xmldatacontainer+xml": { - "source": "iana" - }, - "application/vnd.grafeq": { - "source": "iana", - "extensions": ["gqf","gqs"] - }, - "application/vnd.gridmp": { - "source": "iana" - }, - "application/vnd.groove-account": { - "source": "iana", - "extensions": ["gac"] - }, - "application/vnd.groove-help": { - "source": "iana", - "extensions": ["ghf"] - }, - "application/vnd.groove-identity-message": { - "source": "iana", - "extensions": ["gim"] - }, - "application/vnd.groove-injector": { - "source": "iana", - "extensions": ["grv"] - }, - "application/vnd.groove-tool-message": { - "source": "iana", - "extensions": ["gtm"] - }, - "application/vnd.groove-tool-template": { - "source": "iana", - "extensions": ["tpl"] - }, - "application/vnd.groove-vcard": { - "source": "iana", - "extensions": ["vcg"] - }, - "application/vnd.hal+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hal+xml": { - "source": "iana", - "extensions": ["hal"] - }, - "application/vnd.handheld-entertainment+xml": { - "source": "iana", - "extensions": ["zmm"] - }, - "application/vnd.hbci": { - "source": "iana", - "extensions": ["hbci"] - }, - "application/vnd.hcl-bireports": { - "source": "iana" - }, - "application/vnd.heroku+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hhe.lesson-player": { - "source": "iana", - "extensions": ["les"] - }, - "application/vnd.hp-hpgl": { - "source": "iana", - "extensions": ["hpgl"] - }, - "application/vnd.hp-hpid": { - "source": "iana", - "extensions": ["hpid"] - }, - "application/vnd.hp-hps": { - "source": "iana", - "extensions": ["hps"] - }, - "application/vnd.hp-jlyt": { - "source": "iana", - "extensions": ["jlt"] - }, - "application/vnd.hp-pcl": { - "source": "iana", - "extensions": ["pcl"] - }, - "application/vnd.hp-pclxl": { - "source": "iana", - "extensions": ["pclxl"] - }, - "application/vnd.httphone": { - "source": "iana" - }, - "application/vnd.hydrostatix.sof-data": { - "source": "iana", - "extensions": ["sfd-hdstx"] - }, - "application/vnd.hyperdrive+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hzn-3d-crossword": { - "source": "iana" - }, - "application/vnd.ibm.afplinedata": { - "source": "iana" - }, - "application/vnd.ibm.electronic-media": { - "source": "iana" - }, - "application/vnd.ibm.minipay": { - "source": "iana", - "extensions": ["mpy"] - }, - "application/vnd.ibm.modcap": { - "source": "iana", - "extensions": ["afp","listafp","list3820"] - }, - "application/vnd.ibm.rights-management": { - "source": "iana", - "extensions": ["irm"] - }, - "application/vnd.ibm.secure-container": { - "source": "iana", - "extensions": ["sc"] - }, - "application/vnd.iccprofile": { - "source": "iana", - "extensions": ["icc","icm"] - }, - "application/vnd.ieee.1905": { - "source": "iana" - }, - "application/vnd.igloader": { - "source": "iana", - "extensions": ["igl"] - }, - "application/vnd.immervision-ivp": { - "source": "iana", - "extensions": ["ivp"] - }, - "application/vnd.immervision-ivu": { - "source": "iana", - "extensions": ["ivu"] - }, - "application/vnd.ims.imsccv1p1": { - "source": "iana" - }, - "application/vnd.ims.imsccv1p2": { - "source": "iana" - }, - "application/vnd.ims.imsccv1p3": { - "source": "iana" - }, - "application/vnd.ims.lis.v2.result+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolconsumerprofile+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolproxy+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolproxy.id+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolsettings+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolsettings.simple+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.informedcontrol.rms+xml": { - "source": "iana" - }, - "application/vnd.informix-visionary": { - "source": "iana" - }, - "application/vnd.infotech.project": { - "source": "iana" - }, - "application/vnd.infotech.project+xml": { - "source": "iana" - }, - "application/vnd.innopath.wamp.notification": { - "source": "iana" - }, - "application/vnd.insors.igm": { - "source": "iana", - "extensions": ["igm"] - }, - "application/vnd.intercon.formnet": { - "source": "iana", - "extensions": ["xpw","xpx"] - }, - "application/vnd.intergeo": { - "source": "iana", - "extensions": ["i2g"] - }, - "application/vnd.intertrust.digibox": { - "source": "iana" - }, - "application/vnd.intertrust.nncp": { - "source": "iana" - }, - "application/vnd.intu.qbo": { - "source": "iana", - "extensions": ["qbo"] - }, - "application/vnd.intu.qfx": { - "source": "iana", - "extensions": ["qfx"] - }, - "application/vnd.iptc.g2.catalogitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.conceptitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.knowledgeitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.newsitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.newsmessage+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.packageitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.planningitem+xml": { - "source": "iana" - }, - "application/vnd.ipunplugged.rcprofile": { - "source": "iana", - "extensions": ["rcprofile"] - }, - "application/vnd.irepository.package+xml": { - "source": "iana", - "extensions": ["irp"] - }, - "application/vnd.is-xpr": { - "source": "iana", - "extensions": ["xpr"] - }, - "application/vnd.isac.fcs": { - "source": "iana", - "extensions": ["fcs"] - }, - "application/vnd.jam": { - "source": "iana", - "extensions": ["jam"] - }, - "application/vnd.japannet-directory-service": { - "source": "iana" - }, - "application/vnd.japannet-jpnstore-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-payment-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-registration": { - "source": "iana" - }, - "application/vnd.japannet-registration-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-setstore-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-verification": { - "source": "iana" - }, - "application/vnd.japannet-verification-wakeup": { - "source": "iana" - }, - "application/vnd.jcp.javame.midlet-rms": { - "source": "iana", - "extensions": ["rms"] - }, - "application/vnd.jisp": { - "source": "iana", - "extensions": ["jisp"] - }, - "application/vnd.joost.joda-archive": { - "source": "iana", - "extensions": ["joda"] - }, - "application/vnd.jsk.isdn-ngn": { - "source": "iana" - }, - "application/vnd.kahootz": { - "source": "iana", - "extensions": ["ktz","ktr"] - }, - "application/vnd.kde.karbon": { - "source": "iana", - "extensions": ["karbon"] - }, - "application/vnd.kde.kchart": { - "source": "iana", - "extensions": ["chrt"] - }, - "application/vnd.kde.kformula": { - "source": "iana", - "extensions": ["kfo"] - }, - "application/vnd.kde.kivio": { - "source": "iana", - "extensions": ["flw"] - }, - "application/vnd.kde.kontour": { - "source": "iana", - "extensions": ["kon"] - }, - "application/vnd.kde.kpresenter": { - "source": "iana", - "extensions": ["kpr","kpt"] - }, - "application/vnd.kde.kspread": { - "source": "iana", - "extensions": ["ksp"] - }, - "application/vnd.kde.kword": { - "source": "iana", - "extensions": ["kwd","kwt"] - }, - "application/vnd.kenameaapp": { - "source": "iana", - "extensions": ["htke"] - }, - "application/vnd.kidspiration": { - "source": "iana", - "extensions": ["kia"] - }, - "application/vnd.kinar": { - "source": "iana", - "extensions": ["kne","knp"] - }, - "application/vnd.koan": { - "source": "iana", - "extensions": ["skp","skd","skt","skm"] - }, - "application/vnd.kodak-descriptor": { - "source": "iana", - "extensions": ["sse"] - }, - "application/vnd.las.las+xml": { - "source": "iana", - "extensions": ["lasxml"] - }, - "application/vnd.liberty-request+xml": { - "source": "iana" - }, - "application/vnd.llamagraphics.life-balance.desktop": { - "source": "iana", - "extensions": ["lbd"] - }, - "application/vnd.llamagraphics.life-balance.exchange+xml": { - "source": "iana", - "extensions": ["lbe"] - }, - "application/vnd.lotus-1-2-3": { - "source": "iana", - "extensions": ["123"] - }, - "application/vnd.lotus-approach": { - "source": "iana", - "extensions": ["apr"] - }, - "application/vnd.lotus-freelance": { - "source": "iana", - "extensions": ["pre"] - }, - "application/vnd.lotus-notes": { - "source": "iana", - "extensions": ["nsf"] - }, - "application/vnd.lotus-organizer": { - "source": "iana", - "extensions": ["org"] - }, - "application/vnd.lotus-screencam": { - "source": "iana", - "extensions": ["scm"] - }, - "application/vnd.lotus-wordpro": { - "source": "iana", - "extensions": ["lwp"] - }, - "application/vnd.macports.portpkg": { - "source": "iana", - "extensions": ["portpkg"] - }, - "application/vnd.marlin.drm.actiontoken+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.conftoken+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.license+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.mdcf": { - "source": "iana" - }, - "application/vnd.mason+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.maxmind.maxmind-db": { - "source": "iana" - }, - "application/vnd.mcd": { - "source": "iana", - "extensions": ["mcd"] - }, - "application/vnd.medcalcdata": { - "source": "iana", - "extensions": ["mc1"] - }, - "application/vnd.mediastation.cdkey": { - "source": "iana", - "extensions": ["cdkey"] - }, - "application/vnd.meridian-slingshot": { - "source": "iana" - }, - "application/vnd.mfer": { - "source": "iana", - "extensions": ["mwf"] - }, - "application/vnd.mfmp": { - "source": "iana", - "extensions": ["mfm"] - }, - "application/vnd.micro+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.micrografx.flo": { - "source": "iana", - "extensions": ["flo"] - }, - "application/vnd.micrografx.igx": { - "source": "iana", - "extensions": ["igx"] - }, - "application/vnd.microsoft.portable-executable": { - "source": "iana" - }, - "application/vnd.miele+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.mif": { - "source": "iana", - "extensions": ["mif"] - }, - "application/vnd.minisoft-hp3000-save": { - "source": "iana" - }, - "application/vnd.mitsubishi.misty-guard.trustweb": { - "source": "iana" - }, - "application/vnd.mobius.daf": { - "source": "iana", - "extensions": ["daf"] - }, - "application/vnd.mobius.dis": { - "source": "iana", - "extensions": ["dis"] - }, - "application/vnd.mobius.mbk": { - "source": "iana", - "extensions": ["mbk"] - }, - "application/vnd.mobius.mqy": { - "source": "iana", - "extensions": ["mqy"] - }, - "application/vnd.mobius.msl": { - "source": "iana", - "extensions": ["msl"] - }, - "application/vnd.mobius.plc": { - "source": "iana", - "extensions": ["plc"] - }, - "application/vnd.mobius.txf": { - "source": "iana", - "extensions": ["txf"] - }, - "application/vnd.mophun.application": { - "source": "iana", - "extensions": ["mpn"] - }, - "application/vnd.mophun.certificate": { - "source": "iana", - "extensions": ["mpc"] - }, - "application/vnd.motorola.flexsuite": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.adsi": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.fis": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.gotap": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.kmr": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.ttc": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.wem": { - "source": "iana" - }, - "application/vnd.motorola.iprm": { - "source": "iana" - }, - "application/vnd.mozilla.xul+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xul"] - }, - "application/vnd.ms-3mfdocument": { - "source": "iana" - }, - "application/vnd.ms-artgalry": { - "source": "iana", - "extensions": ["cil"] - }, - "application/vnd.ms-asf": { - "source": "iana" - }, - "application/vnd.ms-cab-compressed": { - "source": "iana", - "extensions": ["cab"] - }, - "application/vnd.ms-color.iccprofile": { - "source": "apache" - }, - "application/vnd.ms-excel": { - "source": "iana", - "compressible": false, - "extensions": ["xls","xlm","xla","xlc","xlt","xlw"] - }, - "application/vnd.ms-excel.addin.macroenabled.12": { - "source": "iana", - "extensions": ["xlam"] - }, - "application/vnd.ms-excel.sheet.binary.macroenabled.12": { - "source": "iana", - "extensions": ["xlsb"] - }, - "application/vnd.ms-excel.sheet.macroenabled.12": { - "source": "iana", - "extensions": ["xlsm"] - }, - "application/vnd.ms-excel.template.macroenabled.12": { - "source": "iana", - "extensions": ["xltm"] - }, - "application/vnd.ms-fontobject": { - "source": "iana", - "compressible": true, - "extensions": ["eot"] - }, - "application/vnd.ms-htmlhelp": { - "source": "iana", - "extensions": ["chm"] - }, - "application/vnd.ms-ims": { - "source": "iana", - "extensions": ["ims"] - }, - "application/vnd.ms-lrm": { - "source": "iana", - "extensions": ["lrm"] - }, - "application/vnd.ms-office.activex+xml": { - "source": "iana" - }, - "application/vnd.ms-officetheme": { - "source": "iana", - "extensions": ["thmx"] - }, - "application/vnd.ms-opentype": { - "source": "apache", - "compressible": true - }, - "application/vnd.ms-package.obfuscated-opentype": { - "source": "apache" - }, - "application/vnd.ms-pki.seccat": { - "source": "apache", - "extensions": ["cat"] - }, - "application/vnd.ms-pki.stl": { - "source": "apache", - "extensions": ["stl"] - }, - "application/vnd.ms-playready.initiator+xml": { - "source": "iana" - }, - "application/vnd.ms-powerpoint": { - "source": "iana", - "compressible": false, - "extensions": ["ppt","pps","pot"] - }, - "application/vnd.ms-powerpoint.addin.macroenabled.12": { - "source": "iana", - "extensions": ["ppam"] - }, - "application/vnd.ms-powerpoint.presentation.macroenabled.12": { - "source": "iana", - "extensions": ["pptm"] - }, - "application/vnd.ms-powerpoint.slide.macroenabled.12": { - "source": "iana", - "extensions": ["sldm"] - }, - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": { - "source": "iana", - "extensions": ["ppsm"] - }, - "application/vnd.ms-powerpoint.template.macroenabled.12": { - "source": "iana", - "extensions": ["potm"] - }, - "application/vnd.ms-printing.printticket+xml": { - "source": "apache" - }, - "application/vnd.ms-project": { - "source": "iana", - "extensions": ["mpp","mpt"] - }, - "application/vnd.ms-tnef": { - "source": "iana" - }, - "application/vnd.ms-windows.printerpairing": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.lic-chlg-req": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.lic-resp": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.meter-chlg-req": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.meter-resp": { - "source": "iana" - }, - "application/vnd.ms-word.document.macroenabled.12": { - "source": "iana", - "extensions": ["docm"] - }, - "application/vnd.ms-word.template.macroenabled.12": { - "source": "iana", - "extensions": ["dotm"] - }, - "application/vnd.ms-works": { - "source": "iana", - "extensions": ["wps","wks","wcm","wdb"] - }, - "application/vnd.ms-wpl": { - "source": "iana", - "extensions": ["wpl"] - }, - "application/vnd.ms-xpsdocument": { - "source": "iana", - "compressible": false, - "extensions": ["xps"] - }, - "application/vnd.msa-disk-image": { - "source": "iana" - }, - "application/vnd.mseq": { - "source": "iana", - "extensions": ["mseq"] - }, - "application/vnd.msign": { - "source": "iana" - }, - "application/vnd.multiad.creator": { - "source": "iana" - }, - "application/vnd.multiad.creator.cif": { - "source": "iana" - }, - "application/vnd.music-niff": { - "source": "iana" - }, - "application/vnd.musician": { - "source": "iana", - "extensions": ["mus"] - }, - "application/vnd.muvee.style": { - "source": "iana", - "extensions": ["msty"] - }, - "application/vnd.mynfc": { - "source": "iana", - "extensions": ["taglet"] - }, - "application/vnd.ncd.control": { - "source": "iana" - }, - "application/vnd.ncd.reference": { - "source": "iana" - }, - "application/vnd.nervana": { - "source": "iana" - }, - "application/vnd.netfpx": { - "source": "iana" - }, - "application/vnd.neurolanguage.nlu": { - "source": "iana", - "extensions": ["nlu"] - }, - "application/vnd.nintendo.nitro.rom": { - "source": "iana" - }, - "application/vnd.nintendo.snes.rom": { - "source": "iana" - }, - "application/vnd.nitf": { - "source": "iana", - "extensions": ["ntf","nitf"] - }, - "application/vnd.noblenet-directory": { - "source": "iana", - "extensions": ["nnd"] - }, - "application/vnd.noblenet-sealer": { - "source": "iana", - "extensions": ["nns"] - }, - "application/vnd.noblenet-web": { - "source": "iana", - "extensions": ["nnw"] - }, - "application/vnd.nokia.catalogs": { - "source": "iana" - }, - "application/vnd.nokia.conml+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.conml+xml": { - "source": "iana" - }, - "application/vnd.nokia.iptv.config+xml": { - "source": "iana" - }, - "application/vnd.nokia.isds-radio-presets": { - "source": "iana" - }, - "application/vnd.nokia.landmark+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.landmark+xml": { - "source": "iana" - }, - "application/vnd.nokia.landmarkcollection+xml": { - "source": "iana" - }, - "application/vnd.nokia.n-gage.ac+xml": { - "source": "iana" - }, - "application/vnd.nokia.n-gage.data": { - "source": "iana", - "extensions": ["ngdat"] - }, - "application/vnd.nokia.n-gage.symbian.install": { - "source": "iana", - "extensions": ["n-gage"] - }, - "application/vnd.nokia.ncd": { - "source": "iana" - }, - "application/vnd.nokia.pcd+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.pcd+xml": { - "source": "iana" - }, - "application/vnd.nokia.radio-preset": { - "source": "iana", - "extensions": ["rpst"] - }, - "application/vnd.nokia.radio-presets": { - "source": "iana", - "extensions": ["rpss"] - }, - "application/vnd.novadigm.edm": { - "source": "iana", - "extensions": ["edm"] - }, - "application/vnd.novadigm.edx": { - "source": "iana", - "extensions": ["edx"] - }, - "application/vnd.novadigm.ext": { - "source": "iana", - "extensions": ["ext"] - }, - "application/vnd.ntt-local.content-share": { - "source": "iana" - }, - "application/vnd.ntt-local.file-transfer": { - "source": "iana" - }, - "application/vnd.ntt-local.ogw_remote-access": { - "source": "iana" - }, - "application/vnd.ntt-local.sip-ta_remote": { - "source": "iana" - }, - "application/vnd.ntt-local.sip-ta_tcp_stream": { - "source": "iana" - }, - "application/vnd.oasis.opendocument.chart": { - "source": "iana", - "extensions": ["odc"] - }, - "application/vnd.oasis.opendocument.chart-template": { - "source": "iana", - "extensions": ["otc"] - }, - "application/vnd.oasis.opendocument.database": { - "source": "iana", - "extensions": ["odb"] - }, - "application/vnd.oasis.opendocument.formula": { - "source": "iana", - "extensions": ["odf"] - }, - "application/vnd.oasis.opendocument.formula-template": { - "source": "iana", - "extensions": ["odft"] - }, - "application/vnd.oasis.opendocument.graphics": { - "source": "iana", - "compressible": false, - "extensions": ["odg"] - }, - "application/vnd.oasis.opendocument.graphics-template": { - "source": "iana", - "extensions": ["otg"] - }, - "application/vnd.oasis.opendocument.image": { - "source": "iana", - "extensions": ["odi"] - }, - "application/vnd.oasis.opendocument.image-template": { - "source": "iana", - "extensions": ["oti"] - }, - "application/vnd.oasis.opendocument.presentation": { - "source": "iana", - "compressible": false, - "extensions": ["odp"] - }, - "application/vnd.oasis.opendocument.presentation-template": { - "source": "iana", - "extensions": ["otp"] - }, - "application/vnd.oasis.opendocument.spreadsheet": { - "source": "iana", - "compressible": false, - "extensions": ["ods"] - }, - "application/vnd.oasis.opendocument.spreadsheet-template": { - "source": "iana", - "extensions": ["ots"] - }, - "application/vnd.oasis.opendocument.text": { - "source": "iana", - "compressible": false, - "extensions": ["odt"] - }, - "application/vnd.oasis.opendocument.text-master": { - "source": "iana", - "extensions": ["odm"] - }, - "application/vnd.oasis.opendocument.text-template": { - "source": "iana", - "extensions": ["ott"] - }, - "application/vnd.oasis.opendocument.text-web": { - "source": "iana", - "extensions": ["oth"] - }, - "application/vnd.obn": { - "source": "iana" - }, - "application/vnd.oftn.l10n+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.oipf.contentaccessdownload+xml": { - "source": "iana" - }, - "application/vnd.oipf.contentaccessstreaming+xml": { - "source": "iana" - }, - "application/vnd.oipf.cspg-hexbinary": { - "source": "iana" - }, - "application/vnd.oipf.dae.svg+xml": { - "source": "iana" - }, - "application/vnd.oipf.dae.xhtml+xml": { - "source": "iana" - }, - "application/vnd.oipf.mippvcontrolmessage+xml": { - "source": "iana" - }, - "application/vnd.oipf.pae.gem": { - "source": "iana" - }, - "application/vnd.oipf.spdiscovery+xml": { - "source": "iana" - }, - "application/vnd.oipf.spdlist+xml": { - "source": "iana" - }, - "application/vnd.oipf.ueprofile+xml": { - "source": "iana" - }, - "application/vnd.oipf.userprofile+xml": { - "source": "iana" - }, - "application/vnd.olpc-sugar": { - "source": "iana", - "extensions": ["xo"] - }, - "application/vnd.oma-scws-config": { - "source": "iana" - }, - "application/vnd.oma-scws-http-request": { - "source": "iana" - }, - "application/vnd.oma-scws-http-response": { - "source": "iana" - }, - "application/vnd.oma.bcast.associated-procedure-parameter+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.drm-trigger+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.imd+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.ltkm": { - "source": "iana" - }, - "application/vnd.oma.bcast.notification+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.provisioningtrigger": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgboot": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgdd+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgdu": { - "source": "iana" - }, - "application/vnd.oma.bcast.simple-symbol-container": { - "source": "iana" - }, - "application/vnd.oma.bcast.smartcard-trigger+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.sprov+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.stkm": { - "source": "iana" - }, - "application/vnd.oma.cab-address-book+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-feature-handler+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-pcc+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-subs-invite+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-user-prefs+xml": { - "source": "iana" - }, - "application/vnd.oma.dcd": { - "source": "iana" - }, - "application/vnd.oma.dcdc": { - "source": "iana" - }, - "application/vnd.oma.dd2+xml": { - "source": "iana", - "extensions": ["dd2"] - }, - "application/vnd.oma.drm.risd+xml": { - "source": "iana" - }, - "application/vnd.oma.group-usage-list+xml": { - "source": "iana" - }, - "application/vnd.oma.pal+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.detailed-progress-report+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.final-report+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.groups+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.invocation-descriptor+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.optimized-progress-report+xml": { - "source": "iana" - }, - "application/vnd.oma.push": { - "source": "iana" - }, - "application/vnd.oma.scidm.messages+xml": { - "source": "iana" - }, - "application/vnd.oma.xcap-directory+xml": { - "source": "iana" - }, - "application/vnd.omads-email+xml": { - "source": "iana" - }, - "application/vnd.omads-file+xml": { - "source": "iana" - }, - "application/vnd.omads-folder+xml": { - "source": "iana" - }, - "application/vnd.omaloc-supl-init": { - "source": "iana" - }, - "application/vnd.openblox.game+xml": { - "source": "iana" - }, - "application/vnd.openblox.game-binary": { - "source": "iana" - }, - "application/vnd.openeye.oeb": { - "source": "iana" - }, - "application/vnd.openofficeorg.extension": { - "source": "apache", - "extensions": ["oxt"] - }, - "application/vnd.openxmlformats-officedocument.custom-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawing+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.extended-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation": { - "source": "iana", - "compressible": false, - "extensions": ["pptx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slide": { - "source": "iana", - "extensions": ["sldx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": { - "source": "iana", - "extensions": ["ppsx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.template": { - "source": "apache", - "extensions": ["potx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { - "source": "iana", - "compressible": false, - "extensions": ["xlsx"] - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": { - "source": "apache", - "extensions": ["xltx"] - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.theme+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.themeoverride+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.vmldrawing": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { - "source": "iana", - "compressible": false, - "extensions": ["docx"] - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": { - "source": "apache", - "extensions": ["dotx"] - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.core-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.relationships+xml": { - "source": "iana" - }, - "application/vnd.oracle.resource+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.orange.indata": { - "source": "iana" - }, - "application/vnd.osa.netdeploy": { - "source": "iana" - }, - "application/vnd.osgeo.mapguide.package": { - "source": "iana", - "extensions": ["mgp"] - }, - "application/vnd.osgi.bundle": { - "source": "iana" - }, - "application/vnd.osgi.dp": { - "source": "iana", - "extensions": ["dp"] - }, - "application/vnd.osgi.subsystem": { - "source": "iana", - "extensions": ["esa"] - }, - "application/vnd.otps.ct-kip+xml": { - "source": "iana" - }, - "application/vnd.palm": { - "source": "iana", - "extensions": ["pdb","pqa","oprc"] - }, - "application/vnd.panoply": { - "source": "iana" - }, - "application/vnd.paos+xml": { - "source": "iana" - }, - "application/vnd.paos.xml": { - "source": "apache" - }, - "application/vnd.pawaafile": { - "source": "iana", - "extensions": ["paw"] - }, - "application/vnd.pcos": { - "source": "iana" - }, - "application/vnd.pg.format": { - "source": "iana", - "extensions": ["str"] - }, - "application/vnd.pg.osasli": { - "source": "iana", - "extensions": ["ei6"] - }, - "application/vnd.piaccess.application-licence": { - "source": "iana" - }, - "application/vnd.picsel": { - "source": "iana", - "extensions": ["efif"] - }, - "application/vnd.pmi.widget": { - "source": "iana", - "extensions": ["wg"] - }, - "application/vnd.poc.group-advertisement+xml": { - "source": "iana" - }, - "application/vnd.pocketlearn": { - "source": "iana", - "extensions": ["plf"] - }, - "application/vnd.powerbuilder6": { - "source": "iana", - "extensions": ["pbd"] - }, - "application/vnd.powerbuilder6-s": { - "source": "iana" - }, - "application/vnd.powerbuilder7": { - "source": "iana" - }, - "application/vnd.powerbuilder7-s": { - "source": "iana" - }, - "application/vnd.powerbuilder75": { - "source": "iana" - }, - "application/vnd.powerbuilder75-s": { - "source": "iana" - }, - "application/vnd.preminet": { - "source": "iana" - }, - "application/vnd.previewsystems.box": { - "source": "iana", - "extensions": ["box"] - }, - "application/vnd.proteus.magazine": { - "source": "iana", - "extensions": ["mgz"] - }, - "application/vnd.publishare-delta-tree": { - "source": "iana", - "extensions": ["qps"] - }, - "application/vnd.pvi.ptid1": { - "source": "iana", - "extensions": ["ptid"] - }, - "application/vnd.pwg-multiplexed": { - "source": "iana" - }, - "application/vnd.pwg-xhtml-print+xml": { - "source": "iana" - }, - "application/vnd.qualcomm.brew-app-res": { - "source": "iana" - }, - "application/vnd.quark.quarkxpress": { - "source": "iana", - "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"] - }, - "application/vnd.quobject-quoxdocument": { - "source": "iana" - }, - "application/vnd.radisys.moml+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-conf+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-conn+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-dialog+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-stream+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-conf+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-base+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-fax-detect+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-group+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-speech+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-transform+xml": { - "source": "iana" - }, - "application/vnd.rainstor.data": { - "source": "iana" - }, - "application/vnd.rapid": { - "source": "iana" - }, - "application/vnd.realvnc.bed": { - "source": "iana", - "extensions": ["bed"] - }, - "application/vnd.recordare.musicxml": { - "source": "iana", - "extensions": ["mxl"] - }, - "application/vnd.recordare.musicxml+xml": { - "source": "iana", - "extensions": ["musicxml"] - }, - "application/vnd.renlearn.rlprint": { - "source": "iana" - }, - "application/vnd.rig.cryptonote": { - "source": "iana", - "extensions": ["cryptonote"] - }, - "application/vnd.rim.cod": { - "source": "apache", - "extensions": ["cod"] - }, - "application/vnd.rn-realmedia": { - "source": "apache", - "extensions": ["rm"] - }, - "application/vnd.rn-realmedia-vbr": { - "source": "apache", - "extensions": ["rmvb"] - }, - "application/vnd.route66.link66+xml": { - "source": "iana", - "extensions": ["link66"] - }, - "application/vnd.rs-274x": { - "source": "iana" - }, - "application/vnd.ruckus.download": { - "source": "iana" - }, - "application/vnd.s3sms": { - "source": "iana" - }, - "application/vnd.sailingtracker.track": { - "source": "iana", - "extensions": ["st"] - }, - "application/vnd.sbm.cid": { - "source": "iana" - }, - "application/vnd.sbm.mid2": { - "source": "iana" - }, - "application/vnd.scribus": { - "source": "iana" - }, - "application/vnd.sealed.3df": { - "source": "iana" - }, - "application/vnd.sealed.csf": { - "source": "iana" - }, - "application/vnd.sealed.doc": { - "source": "iana" - }, - "application/vnd.sealed.eml": { - "source": "iana" - }, - "application/vnd.sealed.mht": { - "source": "iana" - }, - "application/vnd.sealed.net": { - "source": "iana" - }, - "application/vnd.sealed.ppt": { - "source": "iana" - }, - "application/vnd.sealed.tiff": { - "source": "iana" - }, - "application/vnd.sealed.xls": { - "source": "iana" - }, - "application/vnd.sealedmedia.softseal.html": { - "source": "iana" - }, - "application/vnd.sealedmedia.softseal.pdf": { - "source": "iana" - }, - "application/vnd.seemail": { - "source": "iana", - "extensions": ["see"] - }, - "application/vnd.sema": { - "source": "iana", - "extensions": ["sema"] - }, - "application/vnd.semd": { - "source": "iana", - "extensions": ["semd"] - }, - "application/vnd.semf": { - "source": "iana", - "extensions": ["semf"] - }, - "application/vnd.shana.informed.formdata": { - "source": "iana", - "extensions": ["ifm"] - }, - "application/vnd.shana.informed.formtemplate": { - "source": "iana", - "extensions": ["itp"] - }, - "application/vnd.shana.informed.interchange": { - "source": "iana", - "extensions": ["iif"] - }, - "application/vnd.shana.informed.package": { - "source": "iana", - "extensions": ["ipk"] - }, - "application/vnd.simtech-mindmapper": { - "source": "iana", - "extensions": ["twd","twds"] - }, - "application/vnd.siren+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.smaf": { - "source": "iana", - "extensions": ["mmf"] - }, - "application/vnd.smart.notebook": { - "source": "iana" - }, - "application/vnd.smart.teacher": { - "source": "iana", - "extensions": ["teacher"] - }, - "application/vnd.software602.filler.form+xml": { - "source": "iana" - }, - "application/vnd.software602.filler.form-xml-zip": { - "source": "iana" - }, - "application/vnd.solent.sdkm+xml": { - "source": "iana", - "extensions": ["sdkm","sdkd"] - }, - "application/vnd.spotfire.dxp": { - "source": "iana", - "extensions": ["dxp"] - }, - "application/vnd.spotfire.sfs": { - "source": "iana", - "extensions": ["sfs"] - }, - "application/vnd.sss-cod": { - "source": "iana" - }, - "application/vnd.sss-dtf": { - "source": "iana" - }, - "application/vnd.sss-ntf": { - "source": "iana" - }, - "application/vnd.stardivision.calc": { - "source": "apache", - "extensions": ["sdc"] - }, - "application/vnd.stardivision.draw": { - "source": "apache", - "extensions": ["sda"] - }, - "application/vnd.stardivision.impress": { - "source": "apache", - "extensions": ["sdd"] - }, - "application/vnd.stardivision.math": { - "source": "apache", - "extensions": ["smf"] - }, - "application/vnd.stardivision.writer": { - "source": "apache", - "extensions": ["sdw","vor"] - }, - "application/vnd.stardivision.writer-global": { - "source": "apache", - "extensions": ["sgl"] - }, - "application/vnd.stepmania.package": { - "source": "iana", - "extensions": ["smzip"] - }, - "application/vnd.stepmania.stepchart": { - "source": "iana", - "extensions": ["sm"] - }, - "application/vnd.street-stream": { - "source": "iana" - }, - "application/vnd.sun.wadl+xml": { - "source": "iana" - }, - "application/vnd.sun.xml.calc": { - "source": "apache", - "extensions": ["sxc"] - }, - "application/vnd.sun.xml.calc.template": { - "source": "apache", - "extensions": ["stc"] - }, - "application/vnd.sun.xml.draw": { - "source": "apache", - "extensions": ["sxd"] - }, - "application/vnd.sun.xml.draw.template": { - "source": "apache", - "extensions": ["std"] - }, - "application/vnd.sun.xml.impress": { - "source": "apache", - "extensions": ["sxi"] - }, - "application/vnd.sun.xml.impress.template": { - "source": "apache", - "extensions": ["sti"] - }, - "application/vnd.sun.xml.math": { - "source": "apache", - "extensions": ["sxm"] - }, - "application/vnd.sun.xml.writer": { - "source": "apache", - "extensions": ["sxw"] - }, - "application/vnd.sun.xml.writer.global": { - "source": "apache", - "extensions": ["sxg"] - }, - "application/vnd.sun.xml.writer.template": { - "source": "apache", - "extensions": ["stw"] - }, - "application/vnd.sus-calendar": { - "source": "iana", - "extensions": ["sus","susp"] - }, - "application/vnd.svd": { - "source": "iana", - "extensions": ["svd"] - }, - "application/vnd.swiftview-ics": { - "source": "iana" - }, - "application/vnd.symbian.install": { - "source": "apache", - "extensions": ["sis","sisx"] - }, - "application/vnd.syncml+xml": { - "source": "iana", - "extensions": ["xsm"] - }, - "application/vnd.syncml.dm+wbxml": { - "source": "iana", - "extensions": ["bdm"] - }, - "application/vnd.syncml.dm+xml": { - "source": "iana", - "extensions": ["xdm"] - }, - "application/vnd.syncml.dm.notification": { - "source": "iana" - }, - "application/vnd.syncml.dmddf+wbxml": { - "source": "iana" - }, - "application/vnd.syncml.dmddf+xml": { - "source": "iana" - }, - "application/vnd.syncml.dmtnds+wbxml": { - "source": "iana" - }, - "application/vnd.syncml.dmtnds+xml": { - "source": "iana" - }, - "application/vnd.syncml.ds.notification": { - "source": "iana" - }, - "application/vnd.tao.intent-module-archive": { - "source": "iana", - "extensions": ["tao"] - }, - "application/vnd.tcpdump.pcap": { - "source": "iana", - "extensions": ["pcap","cap","dmp"] - }, - "application/vnd.tmd.mediaflex.api+xml": { - "source": "iana" - }, - "application/vnd.tmobile-livetv": { - "source": "iana", - "extensions": ["tmo"] - }, - "application/vnd.trid.tpt": { - "source": "iana", - "extensions": ["tpt"] - }, - "application/vnd.triscape.mxs": { - "source": "iana", - "extensions": ["mxs"] - }, - "application/vnd.trueapp": { - "source": "iana", - "extensions": ["tra"] - }, - "application/vnd.truedoc": { - "source": "iana" - }, - "application/vnd.ubisoft.webplayer": { - "source": "iana" - }, - "application/vnd.ufdl": { - "source": "iana", - "extensions": ["ufd","ufdl"] - }, - "application/vnd.uiq.theme": { - "source": "iana", - "extensions": ["utz"] - }, - "application/vnd.umajin": { - "source": "iana", - "extensions": ["umj"] - }, - "application/vnd.unity": { - "source": "iana", - "extensions": ["unityweb"] - }, - "application/vnd.uoml+xml": { - "source": "iana", - "extensions": ["uoml"] - }, - "application/vnd.uplanet.alert": { - "source": "iana" - }, - "application/vnd.uplanet.alert-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.bearer-choice": { - "source": "iana" - }, - "application/vnd.uplanet.bearer-choice-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.cacheop": { - "source": "iana" - }, - "application/vnd.uplanet.cacheop-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.channel": { - "source": "iana" - }, - "application/vnd.uplanet.channel-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.list": { - "source": "iana" - }, - "application/vnd.uplanet.list-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.listcmd": { - "source": "iana" - }, - "application/vnd.uplanet.listcmd-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.signal": { - "source": "iana" - }, - "application/vnd.uri-map": { - "source": "iana" - }, - "application/vnd.valve.source.material": { - "source": "iana" - }, - "application/vnd.vcx": { - "source": "iana", - "extensions": ["vcx"] - }, - "application/vnd.vd-study": { - "source": "iana" - }, - "application/vnd.vectorworks": { - "source": "iana" - }, - "application/vnd.verimatrix.vcas": { - "source": "iana" - }, - "application/vnd.vidsoft.vidconference": { - "source": "iana" - }, - "application/vnd.visio": { - "source": "iana", - "extensions": ["vsd","vst","vss","vsw"] - }, - "application/vnd.visionary": { - "source": "iana", - "extensions": ["vis"] - }, - "application/vnd.vividence.scriptfile": { - "source": "iana" - }, - "application/vnd.vsf": { - "source": "iana", - "extensions": ["vsf"] - }, - "application/vnd.wap.sic": { - "source": "iana" - }, - "application/vnd.wap.slc": { - "source": "iana" - }, - "application/vnd.wap.wbxml": { - "source": "iana", - "extensions": ["wbxml"] - }, - "application/vnd.wap.wmlc": { - "source": "iana", - "extensions": ["wmlc"] - }, - "application/vnd.wap.wmlscriptc": { - "source": "iana", - "extensions": ["wmlsc"] - }, - "application/vnd.webturbo": { - "source": "iana", - "extensions": ["wtb"] - }, - "application/vnd.wfa.p2p": { - "source": "iana" - }, - "application/vnd.wfa.wsc": { - "source": "iana" - }, - "application/vnd.windows.devicepairing": { - "source": "iana" - }, - "application/vnd.wmc": { - "source": "iana" - }, - "application/vnd.wmf.bootstrap": { - "source": "iana" - }, - "application/vnd.wolfram.mathematica": { - "source": "iana" - }, - "application/vnd.wolfram.mathematica.package": { - "source": "iana" - }, - "application/vnd.wolfram.player": { - "source": "iana", - "extensions": ["nbp"] - }, - "application/vnd.wordperfect": { - "source": "iana", - "extensions": ["wpd"] - }, - "application/vnd.wqd": { - "source": "iana", - "extensions": ["wqd"] - }, - "application/vnd.wrq-hp3000-labelled": { - "source": "iana" - }, - "application/vnd.wt.stf": { - "source": "iana", - "extensions": ["stf"] - }, - "application/vnd.wv.csp+wbxml": { - "source": "iana" - }, - "application/vnd.wv.csp+xml": { - "source": "iana" - }, - "application/vnd.wv.ssp+xml": { - "source": "iana" - }, - "application/vnd.xacml+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.xara": { - "source": "iana", - "extensions": ["xar"] - }, - "application/vnd.xfdl": { - "source": "iana", - "extensions": ["xfdl"] - }, - "application/vnd.xfdl.webform": { - "source": "iana" - }, - "application/vnd.xmi+xml": { - "source": "iana" - }, - "application/vnd.xmpie.cpkg": { - "source": "iana" - }, - "application/vnd.xmpie.dpkg": { - "source": "iana" - }, - "application/vnd.xmpie.plan": { - "source": "iana" - }, - "application/vnd.xmpie.ppkg": { - "source": "iana" - }, - "application/vnd.xmpie.xlim": { - "source": "iana" - }, - "application/vnd.yamaha.hv-dic": { - "source": "iana", - "extensions": ["hvd"] - }, - "application/vnd.yamaha.hv-script": { - "source": "iana", - "extensions": ["hvs"] - }, - "application/vnd.yamaha.hv-voice": { - "source": "iana", - "extensions": ["hvp"] - }, - "application/vnd.yamaha.openscoreformat": { - "source": "iana", - "extensions": ["osf"] - }, - "application/vnd.yamaha.openscoreformat.osfpvg+xml": { - "source": "iana", - "extensions": ["osfpvg"] - }, - "application/vnd.yamaha.remote-setup": { - "source": "iana" - }, - "application/vnd.yamaha.smaf-audio": { - "source": "iana", - "extensions": ["saf"] - }, - "application/vnd.yamaha.smaf-phrase": { - "source": "iana", - "extensions": ["spf"] - }, - "application/vnd.yamaha.through-ngn": { - "source": "iana" - }, - "application/vnd.yamaha.tunnel-udpencap": { - "source": "iana" - }, - "application/vnd.yaoweme": { - "source": "iana" - }, - "application/vnd.yellowriver-custom-menu": { - "source": "iana", - "extensions": ["cmp"] - }, - "application/vnd.zul": { - "source": "iana", - "extensions": ["zir","zirz"] - }, - "application/vnd.zzazz.deck+xml": { - "source": "iana", - "extensions": ["zaz"] - }, - "application/voicexml+xml": { - "source": "iana", - "extensions": ["vxml"] - }, - "application/vq-rtcpxr": { - "source": "iana" - }, - "application/watcherinfo+xml": { - "source": "iana" - }, - "application/whoispp-query": { - "source": "iana" - }, - "application/whoispp-response": { - "source": "iana" - }, - "application/widget": { - "source": "iana", - "extensions": ["wgt"] - }, - "application/winhlp": { - "source": "apache", - "extensions": ["hlp"] - }, - "application/wita": { - "source": "iana" - }, - "application/wordperfect5.1": { - "source": "iana" - }, - "application/wsdl+xml": { - "source": "iana", - "extensions": ["wsdl"] - }, - "application/wspolicy+xml": { - "source": "iana", - "extensions": ["wspolicy"] - }, - "application/x-7z-compressed": { - "source": "apache", - "compressible": false, - "extensions": ["7z"] - }, - "application/x-abiword": { - "source": "apache", - "extensions": ["abw"] - }, - "application/x-ace-compressed": { - "source": "apache", - "extensions": ["ace"] - }, - "application/x-amf": { - "source": "apache" - }, - "application/x-apple-diskimage": { - "source": "apache", - "extensions": ["dmg"] - }, - "application/x-authorware-bin": { - "source": "apache", - "extensions": ["aab","x32","u32","vox"] - }, - "application/x-authorware-map": { - "source": "apache", - "extensions": ["aam"] - }, - "application/x-authorware-seg": { - "source": "apache", - "extensions": ["aas"] - }, - "application/x-bcpio": { - "source": "apache", - "extensions": ["bcpio"] - }, - "application/x-bdoc": { - "compressible": false, - "extensions": ["bdoc"] - }, - "application/x-bittorrent": { - "source": "apache", - "extensions": ["torrent"] - }, - "application/x-blorb": { - "source": "apache", - "extensions": ["blb","blorb"] - }, - "application/x-bzip": { - "source": "apache", - "compressible": false, - "extensions": ["bz"] - }, - "application/x-bzip2": { - "source": "apache", - "compressible": false, - "extensions": ["bz2","boz"] - }, - "application/x-cbr": { - "source": "apache", - "extensions": ["cbr","cba","cbt","cbz","cb7"] - }, - "application/x-cdlink": { - "source": "apache", - "extensions": ["vcd"] - }, - "application/x-cfs-compressed": { - "source": "apache", - "extensions": ["cfs"] - }, - "application/x-chat": { - "source": "apache", - "extensions": ["chat"] - }, - "application/x-chess-pgn": { - "source": "apache", - "extensions": ["pgn"] - }, - "application/x-chrome-extension": { - "extensions": ["crx"] - }, - "application/x-cocoa": { - "source": "nginx", - "extensions": ["cco"] - }, - "application/x-compress": { - "source": "apache" - }, - "application/x-conference": { - "source": "apache", - "extensions": ["nsc"] - }, - "application/x-cpio": { - "source": "apache", - "extensions": ["cpio"] - }, - "application/x-csh": { - "source": "apache", - "extensions": ["csh"] - }, - "application/x-deb": { - "compressible": false - }, - "application/x-debian-package": { - "source": "apache", - "extensions": ["deb","udeb"] - }, - "application/x-dgc-compressed": { - "source": "apache", - "extensions": ["dgc"] - }, - "application/x-director": { - "source": "apache", - "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"] - }, - "application/x-doom": { - "source": "apache", - "extensions": ["wad"] - }, - "application/x-dtbncx+xml": { - "source": "apache", - "extensions": ["ncx"] - }, - "application/x-dtbook+xml": { - "source": "apache", - "extensions": ["dtb"] - }, - "application/x-dtbresource+xml": { - "source": "apache", - "extensions": ["res"] - }, - "application/x-dvi": { - "source": "apache", - "compressible": false, - "extensions": ["dvi"] - }, - "application/x-envoy": { - "source": "apache", - "extensions": ["evy"] - }, - "application/x-eva": { - "source": "apache", - "extensions": ["eva"] - }, - "application/x-font-bdf": { - "source": "apache", - "extensions": ["bdf"] - }, - "application/x-font-dos": { - "source": "apache" - }, - "application/x-font-framemaker": { - "source": "apache" - }, - "application/x-font-ghostscript": { - "source": "apache", - "extensions": ["gsf"] - }, - "application/x-font-libgrx": { - "source": "apache" - }, - "application/x-font-linux-psf": { - "source": "apache", - "extensions": ["psf"] - }, - "application/x-font-otf": { - "source": "apache", - "compressible": true, - "extensions": ["otf"] - }, - "application/x-font-pcf": { - "source": "apache", - "extensions": ["pcf"] - }, - "application/x-font-snf": { - "source": "apache", - "extensions": ["snf"] - }, - "application/x-font-speedo": { - "source": "apache" - }, - "application/x-font-sunos-news": { - "source": "apache" - }, - "application/x-font-ttf": { - "source": "apache", - "compressible": true, - "extensions": ["ttf","ttc"] - }, - "application/x-font-type1": { - "source": "apache", - "extensions": ["pfa","pfb","pfm","afm"] - }, - "application/x-font-vfont": { - "source": "apache" - }, - "application/x-freearc": { - "source": "apache", - "extensions": ["arc"] - }, - "application/x-futuresplash": { - "source": "apache", - "extensions": ["spl"] - }, - "application/x-gca-compressed": { - "source": "apache", - "extensions": ["gca"] - }, - "application/x-glulx": { - "source": "apache", - "extensions": ["ulx"] - }, - "application/x-gnumeric": { - "source": "apache", - "extensions": ["gnumeric"] - }, - "application/x-gramps-xml": { - "source": "apache", - "extensions": ["gramps"] - }, - "application/x-gtar": { - "source": "apache", - "extensions": ["gtar"] - }, - "application/x-gzip": { - "source": "apache" - }, - "application/x-hdf": { - "source": "apache", - "extensions": ["hdf"] - }, - "application/x-httpd-php": { - "compressible": true, - "extensions": ["php"] - }, - "application/x-install-instructions": { - "source": "apache", - "extensions": ["install"] - }, - "application/x-iso9660-image": { - "source": "apache", - "extensions": ["iso"] - }, - "application/x-java-archive-diff": { - "source": "nginx", - "extensions": ["jardiff"] - }, - "application/x-java-jnlp-file": { - "source": "apache", - "compressible": false, - "extensions": ["jnlp"] - }, - "application/x-javascript": { - "compressible": true - }, - "application/x-latex": { - "source": "apache", - "compressible": false, - "extensions": ["latex"] - }, - "application/x-lua-bytecode": { - "extensions": ["luac"] - }, - "application/x-lzh-compressed": { - "source": "apache", - "extensions": ["lzh","lha"] - }, - "application/x-makeself": { - "source": "nginx", - "extensions": ["run"] - }, - "application/x-mie": { - "source": "apache", - "extensions": ["mie"] - }, - "application/x-mobipocket-ebook": { - "source": "apache", - "extensions": ["prc","mobi"] - }, - "application/x-mpegurl": { - "compressible": false - }, - "application/x-ms-application": { - "source": "apache", - "extensions": ["application"] - }, - "application/x-ms-shortcut": { - "source": "apache", - "extensions": ["lnk"] - }, - "application/x-ms-wmd": { - "source": "apache", - "extensions": ["wmd"] - }, - "application/x-ms-wmz": { - "source": "apache", - "extensions": ["wmz"] - }, - "application/x-ms-xbap": { - "source": "apache", - "extensions": ["xbap"] - }, - "application/x-msaccess": { - "source": "apache", - "extensions": ["mdb"] - }, - "application/x-msbinder": { - "source": "apache", - "extensions": ["obd"] - }, - "application/x-mscardfile": { - "source": "apache", - "extensions": ["crd"] - }, - "application/x-msclip": { - "source": "apache", - "extensions": ["clp"] - }, - "application/x-msdos-program": { - "extensions": ["exe"] - }, - "application/x-msdownload": { - "source": "apache", - "extensions": ["exe","dll","com","bat","msi"] - }, - "application/x-msmediaview": { - "source": "apache", - "extensions": ["mvb","m13","m14"] - }, - "application/x-msmetafile": { - "source": "apache", - "extensions": ["wmf","wmz","emf","emz"] - }, - "application/x-msmoney": { - "source": "apache", - "extensions": ["mny"] - }, - "application/x-mspublisher": { - "source": "apache", - "extensions": ["pub"] - }, - "application/x-msschedule": { - "source": "apache", - "extensions": ["scd"] - }, - "application/x-msterminal": { - "source": "apache", - "extensions": ["trm"] - }, - "application/x-mswrite": { - "source": "apache", - "extensions": ["wri"] - }, - "application/x-netcdf": { - "source": "apache", - "extensions": ["nc","cdf"] - }, - "application/x-ns-proxy-autoconfig": { - "compressible": true, - "extensions": ["pac"] - }, - "application/x-nzb": { - "source": "apache", - "extensions": ["nzb"] - }, - "application/x-perl": { - "source": "nginx", - "extensions": ["pl","pm"] - }, - "application/x-pilot": { - "source": "nginx", - "extensions": ["prc","pdb"] - }, - "application/x-pkcs12": { - "source": "apache", - "compressible": false, - "extensions": ["p12","pfx"] - }, - "application/x-pkcs7-certificates": { - "source": "apache", - "extensions": ["p7b","spc"] - }, - "application/x-pkcs7-certreqresp": { - "source": "apache", - "extensions": ["p7r"] - }, - "application/x-rar-compressed": { - "source": "apache", - "compressible": false, - "extensions": ["rar"] - }, - "application/x-redhat-package-manager": { - "source": "nginx", - "extensions": ["rpm"] - }, - "application/x-research-info-systems": { - "source": "apache", - "extensions": ["ris"] - }, - "application/x-sea": { - "source": "nginx", - "extensions": ["sea"] - }, - "application/x-sh": { - "source": "apache", - "compressible": true, - "extensions": ["sh"] - }, - "application/x-shar": { - "source": "apache", - "extensions": ["shar"] - }, - "application/x-shockwave-flash": { - "source": "apache", - "compressible": false, - "extensions": ["swf"] - }, - "application/x-silverlight-app": { - "source": "apache", - "extensions": ["xap"] - }, - "application/x-sql": { - "source": "apache", - "extensions": ["sql"] - }, - "application/x-stuffit": { - "source": "apache", - "compressible": false, - "extensions": ["sit"] - }, - "application/x-stuffitx": { - "source": "apache", - "extensions": ["sitx"] - }, - "application/x-subrip": { - "source": "apache", - "extensions": ["srt"] - }, - "application/x-sv4cpio": { - "source": "apache", - "extensions": ["sv4cpio"] - }, - "application/x-sv4crc": { - "source": "apache", - "extensions": ["sv4crc"] - }, - "application/x-t3vm-image": { - "source": "apache", - "extensions": ["t3"] - }, - "application/x-tads": { - "source": "apache", - "extensions": ["gam"] - }, - "application/x-tar": { - "source": "apache", - "compressible": true, - "extensions": ["tar"] - }, - "application/x-tcl": { - "source": "apache", - "extensions": ["tcl","tk"] - }, - "application/x-tex": { - "source": "apache", - "extensions": ["tex"] - }, - "application/x-tex-tfm": { - "source": "apache", - "extensions": ["tfm"] - }, - "application/x-texinfo": { - "source": "apache", - "extensions": ["texinfo","texi"] - }, - "application/x-tgif": { - "source": "apache", - "extensions": ["obj"] - }, - "application/x-ustar": { - "source": "apache", - "extensions": ["ustar"] - }, - "application/x-wais-source": { - "source": "apache", - "extensions": ["src"] - }, - "application/x-web-app-manifest+json": { - "compressible": true, - "extensions": ["webapp"] - }, - "application/x-www-form-urlencoded": { - "source": "iana", - "compressible": true - }, - "application/x-x509-ca-cert": { - "source": "apache", - "extensions": ["der","crt","pem"] - }, - "application/x-xfig": { - "source": "apache", - "extensions": ["fig"] - }, - "application/x-xliff+xml": { - "source": "apache", - "extensions": ["xlf"] - }, - "application/x-xpinstall": { - "source": "apache", - "compressible": false, - "extensions": ["xpi"] - }, - "application/x-xz": { - "source": "apache", - "extensions": ["xz"] - }, - "application/x-zmachine": { - "source": "apache", - "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"] - }, - "application/x400-bp": { - "source": "iana" - }, - "application/xacml+xml": { - "source": "iana" - }, - "application/xaml+xml": { - "source": "apache", - "extensions": ["xaml"] - }, - "application/xcap-att+xml": { - "source": "iana" - }, - "application/xcap-caps+xml": { - "source": "iana" - }, - "application/xcap-diff+xml": { - "source": "iana", - "extensions": ["xdf"] - }, - "application/xcap-el+xml": { - "source": "iana" - }, - "application/xcap-error+xml": { - "source": "iana" - }, - "application/xcap-ns+xml": { - "source": "iana" - }, - "application/xcon-conference-info+xml": { - "source": "iana" - }, - "application/xcon-conference-info-diff+xml": { - "source": "iana" - }, - "application/xenc+xml": { - "source": "iana", - "extensions": ["xenc"] - }, - "application/xhtml+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xhtml","xht"] - }, - "application/xhtml-voice+xml": { - "source": "apache" - }, - "application/xml": { - "source": "iana", - "compressible": true, - "extensions": ["xml","xsl","xsd"] - }, - "application/xml-dtd": { - "source": "iana", - "compressible": true, - "extensions": ["dtd"] - }, - "application/xml-external-parsed-entity": { - "source": "iana" - }, - "application/xml-patch+xml": { - "source": "iana" - }, - "application/xmpp+xml": { - "source": "iana" - }, - "application/xop+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xop"] - }, - "application/xproc+xml": { - "source": "apache", - "extensions": ["xpl"] - }, - "application/xslt+xml": { - "source": "iana", - "extensions": ["xslt"] - }, - "application/xspf+xml": { - "source": "apache", - "extensions": ["xspf"] - }, - "application/xv+xml": { - "source": "iana", - "extensions": ["mxml","xhvml","xvml","xvm"] - }, - "application/yang": { - "source": "iana", - "extensions": ["yang"] - }, - "application/yin+xml": { - "source": "iana", - "extensions": ["yin"] - }, - "application/zip": { - "source": "iana", - "compressible": false, - "extensions": ["zip"] - }, - "application/zlib": { - "source": "iana" - }, - "audio/1d-interleaved-parityfec": { - "source": "iana" - }, - "audio/32kadpcm": { - "source": "iana" - }, - "audio/3gpp": { - "source": "iana" - }, - "audio/3gpp2": { - "source": "iana" - }, - "audio/ac3": { - "source": "iana" - }, - "audio/adpcm": { - "source": "apache", - "extensions": ["adp"] - }, - "audio/amr": { - "source": "iana" - }, - "audio/amr-wb": { - "source": "iana" - }, - "audio/amr-wb+": { - "source": "iana" - }, - "audio/aptx": { - "source": "iana" - }, - "audio/asc": { - "source": "iana" - }, - "audio/atrac-advanced-lossless": { - "source": "iana" - }, - "audio/atrac-x": { - "source": "iana" - }, - "audio/atrac3": { - "source": "iana" - }, - "audio/basic": { - "source": "iana", - "compressible": false, - "extensions": ["au","snd"] - }, - "audio/bv16": { - "source": "iana" - }, - "audio/bv32": { - "source": "iana" - }, - "audio/clearmode": { - "source": "iana" - }, - "audio/cn": { - "source": "iana" - }, - "audio/dat12": { - "source": "iana" - }, - "audio/dls": { - "source": "iana" - }, - "audio/dsr-es201108": { - "source": "iana" - }, - "audio/dsr-es202050": { - "source": "iana" - }, - "audio/dsr-es202211": { - "source": "iana" - }, - "audio/dsr-es202212": { - "source": "iana" - }, - "audio/dv": { - "source": "iana" - }, - "audio/dvi4": { - "source": "iana" - }, - "audio/eac3": { - "source": "iana" - }, - "audio/encaprtp": { - "source": "iana" - }, - "audio/evrc": { - "source": "iana" - }, - "audio/evrc-qcp": { - "source": "iana" - }, - "audio/evrc0": { - "source": "iana" - }, - "audio/evrc1": { - "source": "iana" - }, - "audio/evrcb": { - "source": "iana" - }, - "audio/evrcb0": { - "source": "iana" - }, - "audio/evrcb1": { - "source": "iana" - }, - "audio/evrcnw": { - "source": "iana" - }, - "audio/evrcnw0": { - "source": "iana" - }, - "audio/evrcnw1": { - "source": "iana" - }, - "audio/evrcwb": { - "source": "iana" - }, - "audio/evrcwb0": { - "source": "iana" - }, - "audio/evrcwb1": { - "source": "iana" - }, - "audio/fwdred": { - "source": "iana" - }, - "audio/g711-0": { - "source": "iana" - }, - "audio/g719": { - "source": "iana" - }, - "audio/g722": { - "source": "iana" - }, - "audio/g7221": { - "source": "iana" - }, - "audio/g723": { - "source": "iana" - }, - "audio/g726-16": { - "source": "iana" - }, - "audio/g726-24": { - "source": "iana" - }, - "audio/g726-32": { - "source": "iana" - }, - "audio/g726-40": { - "source": "iana" - }, - "audio/g728": { - "source": "iana" - }, - "audio/g729": { - "source": "iana" - }, - "audio/g7291": { - "source": "iana" - }, - "audio/g729d": { - "source": "iana" - }, - "audio/g729e": { - "source": "iana" - }, - "audio/gsm": { - "source": "iana" - }, - "audio/gsm-efr": { - "source": "iana" - }, - "audio/gsm-hr-08": { - "source": "iana" - }, - "audio/ilbc": { - "source": "iana" - }, - "audio/ip-mr_v2.5": { - "source": "iana" - }, - "audio/isac": { - "source": "apache" - }, - "audio/l16": { - "source": "iana" - }, - "audio/l20": { - "source": "iana" - }, - "audio/l24": { - "source": "iana", - "compressible": false - }, - "audio/l8": { - "source": "iana" - }, - "audio/lpc": { - "source": "iana" - }, - "audio/midi": { - "source": "apache", - "extensions": ["mid","midi","kar","rmi"] - }, - "audio/mobile-xmf": { - "source": "iana" - }, - "audio/mp4": { - "source": "iana", - "compressible": false, - "extensions": ["mp4a","m4a"] - }, - "audio/mp4a-latm": { - "source": "iana" - }, - "audio/mpa": { - "source": "iana" - }, - "audio/mpa-robust": { - "source": "iana" - }, - "audio/mpeg": { - "source": "iana", - "compressible": false, - "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"] - }, - "audio/mpeg4-generic": { - "source": "iana" - }, - "audio/musepack": { - "source": "apache" - }, - "audio/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["oga","ogg","spx"] - }, - "audio/opus": { - "source": "iana" - }, - "audio/parityfec": { - "source": "iana" - }, - "audio/pcma": { - "source": "iana" - }, - "audio/pcma-wb": { - "source": "iana" - }, - "audio/pcmu": { - "source": "iana" - }, - "audio/pcmu-wb": { - "source": "iana" - }, - "audio/prs.sid": { - "source": "iana" - }, - "audio/qcelp": { - "source": "iana" - }, - "audio/raptorfec": { - "source": "iana" - }, - "audio/red": { - "source": "iana" - }, - "audio/rtp-enc-aescm128": { - "source": "iana" - }, - "audio/rtp-midi": { - "source": "iana" - }, - "audio/rtploopback": { - "source": "iana" - }, - "audio/rtx": { - "source": "iana" - }, - "audio/s3m": { - "source": "apache", - "extensions": ["s3m"] - }, - "audio/silk": { - "source": "apache", - "extensions": ["sil"] - }, - "audio/smv": { - "source": "iana" - }, - "audio/smv-qcp": { - "source": "iana" - }, - "audio/smv0": { - "source": "iana" - }, - "audio/sp-midi": { - "source": "iana" - }, - "audio/speex": { - "source": "iana" - }, - "audio/t140c": { - "source": "iana" - }, - "audio/t38": { - "source": "iana" - }, - "audio/telephone-event": { - "source": "iana" - }, - "audio/tone": { - "source": "iana" - }, - "audio/uemclip": { - "source": "iana" - }, - "audio/ulpfec": { - "source": "iana" - }, - "audio/vdvi": { - "source": "iana" - }, - "audio/vmr-wb": { - "source": "iana" - }, - "audio/vnd.3gpp.iufp": { - "source": "iana" - }, - "audio/vnd.4sb": { - "source": "iana" - }, - "audio/vnd.audiokoz": { - "source": "iana" - }, - "audio/vnd.celp": { - "source": "iana" - }, - "audio/vnd.cisco.nse": { - "source": "iana" - }, - "audio/vnd.cmles.radio-events": { - "source": "iana" - }, - "audio/vnd.cns.anp1": { - "source": "iana" - }, - "audio/vnd.cns.inf1": { - "source": "iana" - }, - "audio/vnd.dece.audio": { - "source": "iana", - "extensions": ["uva","uvva"] - }, - "audio/vnd.digital-winds": { - "source": "iana", - "extensions": ["eol"] - }, - "audio/vnd.dlna.adts": { - "source": "iana" - }, - "audio/vnd.dolby.heaac.1": { - "source": "iana" - }, - "audio/vnd.dolby.heaac.2": { - "source": "iana" - }, - "audio/vnd.dolby.mlp": { - "source": "iana" - }, - "audio/vnd.dolby.mps": { - "source": "iana" - }, - "audio/vnd.dolby.pl2": { - "source": "iana" - }, - "audio/vnd.dolby.pl2x": { - "source": "iana" - }, - "audio/vnd.dolby.pl2z": { - "source": "iana" - }, - "audio/vnd.dolby.pulse.1": { - "source": "iana" - }, - "audio/vnd.dra": { - "source": "iana", - "extensions": ["dra"] - }, - "audio/vnd.dts": { - "source": "iana", - "extensions": ["dts"] - }, - "audio/vnd.dts.hd": { - "source": "iana", - "extensions": ["dtshd"] - }, - "audio/vnd.dvb.file": { - "source": "iana" - }, - "audio/vnd.everad.plj": { - "source": "iana" - }, - "audio/vnd.hns.audio": { - "source": "iana" - }, - "audio/vnd.lucent.voice": { - "source": "iana", - "extensions": ["lvp"] - }, - "audio/vnd.ms-playready.media.pya": { - "source": "iana", - "extensions": ["pya"] - }, - "audio/vnd.nokia.mobile-xmf": { - "source": "iana" - }, - "audio/vnd.nortel.vbk": { - "source": "iana" - }, - "audio/vnd.nuera.ecelp4800": { - "source": "iana", - "extensions": ["ecelp4800"] - }, - "audio/vnd.nuera.ecelp7470": { - "source": "iana", - "extensions": ["ecelp7470"] - }, - "audio/vnd.nuera.ecelp9600": { - "source": "iana", - "extensions": ["ecelp9600"] - }, - "audio/vnd.octel.sbc": { - "source": "iana" - }, - "audio/vnd.qcelp": { - "source": "iana" - }, - "audio/vnd.rhetorex.32kadpcm": { - "source": "iana" - }, - "audio/vnd.rip": { - "source": "iana", - "extensions": ["rip"] - }, - "audio/vnd.rn-realaudio": { - "compressible": false - }, - "audio/vnd.sealedmedia.softseal.mpeg": { - "source": "iana" - }, - "audio/vnd.vmx.cvsd": { - "source": "iana" - }, - "audio/vnd.wave": { - "compressible": false - }, - "audio/vorbis": { - "source": "iana", - "compressible": false - }, - "audio/vorbis-config": { - "source": "iana" - }, - "audio/wav": { - "compressible": false, - "extensions": ["wav"] - }, - "audio/wave": { - "compressible": false, - "extensions": ["wav"] - }, - "audio/webm": { - "source": "apache", - "compressible": false, - "extensions": ["weba"] - }, - "audio/x-aac": { - "source": "apache", - "compressible": false, - "extensions": ["aac"] - }, - "audio/x-aiff": { - "source": "apache", - "extensions": ["aif","aiff","aifc"] - }, - "audio/x-caf": { - "source": "apache", - "compressible": false, - "extensions": ["caf"] - }, - "audio/x-flac": { - "source": "apache", - "extensions": ["flac"] - }, - "audio/x-m4a": { - "source": "nginx", - "extensions": ["m4a"] - }, - "audio/x-matroska": { - "source": "apache", - "extensions": ["mka"] - }, - "audio/x-mpegurl": { - "source": "apache", - "extensions": ["m3u"] - }, - "audio/x-ms-wax": { - "source": "apache", - "extensions": ["wax"] - }, - "audio/x-ms-wma": { - "source": "apache", - "extensions": ["wma"] - }, - "audio/x-pn-realaudio": { - "source": "apache", - "extensions": ["ram","ra"] - }, - "audio/x-pn-realaudio-plugin": { - "source": "apache", - "extensions": ["rmp"] - }, - "audio/x-realaudio": { - "source": "nginx", - "extensions": ["ra"] - }, - "audio/x-tta": { - "source": "apache" - }, - "audio/x-wav": { - "source": "apache", - "extensions": ["wav"] - }, - "audio/xm": { - "source": "apache", - "extensions": ["xm"] - }, - "chemical/x-cdx": { - "source": "apache", - "extensions": ["cdx"] - }, - "chemical/x-cif": { - "source": "apache", - "extensions": ["cif"] - }, - "chemical/x-cmdf": { - "source": "apache", - "extensions": ["cmdf"] - }, - "chemical/x-cml": { - "source": "apache", - "extensions": ["cml"] - }, - "chemical/x-csml": { - "source": "apache", - "extensions": ["csml"] - }, - "chemical/x-pdb": { - "source": "apache" - }, - "chemical/x-xyz": { - "source": "apache", - "extensions": ["xyz"] - }, - "font/opentype": { - "compressible": true, - "extensions": ["otf"] - }, - "image/bmp": { - "source": "apache", - "compressible": true, - "extensions": ["bmp"] - }, - "image/cgm": { - "source": "iana", - "extensions": ["cgm"] - }, - "image/fits": { - "source": "iana" - }, - "image/g3fax": { - "source": "iana", - "extensions": ["g3"] - }, - "image/gif": { - "source": "iana", - "compressible": false, - "extensions": ["gif"] - }, - "image/ief": { - "source": "iana", - "extensions": ["ief"] - }, - "image/jp2": { - "source": "iana" - }, - "image/jpeg": { - "source": "iana", - "compressible": false, - "extensions": ["jpeg","jpg","jpe"] - }, - "image/jpm": { - "source": "iana" - }, - "image/jpx": { - "source": "iana" - }, - "image/ktx": { - "source": "iana", - "extensions": ["ktx"] - }, - "image/naplps": { - "source": "iana" - }, - "image/pjpeg": { - "compressible": false - }, - "image/png": { - "source": "iana", - "compressible": false, - "extensions": ["png"] - }, - "image/prs.btif": { - "source": "iana", - "extensions": ["btif"] - }, - "image/prs.pti": { - "source": "iana" - }, - "image/pwg-raster": { - "source": "iana" - }, - "image/sgi": { - "source": "apache", - "extensions": ["sgi"] - }, - "image/svg+xml": { - "source": "iana", - "compressible": true, - "extensions": ["svg","svgz"] - }, - "image/t38": { - "source": "iana" - }, - "image/tiff": { - "source": "iana", - "compressible": false, - "extensions": ["tiff","tif"] - }, - "image/tiff-fx": { - "source": "iana" - }, - "image/vnd.adobe.photoshop": { - "source": "iana", - "compressible": true, - "extensions": ["psd"] - }, - "image/vnd.airzip.accelerator.azv": { - "source": "iana" - }, - "image/vnd.cns.inf2": { - "source": "iana" - }, - "image/vnd.dece.graphic": { - "source": "iana", - "extensions": ["uvi","uvvi","uvg","uvvg"] - }, - "image/vnd.djvu": { - "source": "iana", - "extensions": ["djvu","djv"] - }, - "image/vnd.dvb.subtitle": { - "source": "iana", - "extensions": ["sub"] - }, - "image/vnd.dwg": { - "source": "iana", - "extensions": ["dwg"] - }, - "image/vnd.dxf": { - "source": "iana", - "extensions": ["dxf"] - }, - "image/vnd.fastbidsheet": { - "source": "iana", - "extensions": ["fbs"] - }, - "image/vnd.fpx": { - "source": "iana", - "extensions": ["fpx"] - }, - "image/vnd.fst": { - "source": "iana", - "extensions": ["fst"] - }, - "image/vnd.fujixerox.edmics-mmr": { - "source": "iana", - "extensions": ["mmr"] - }, - "image/vnd.fujixerox.edmics-rlc": { - "source": "iana", - "extensions": ["rlc"] - }, - "image/vnd.globalgraphics.pgb": { - "source": "iana" - }, - "image/vnd.microsoft.icon": { - "source": "iana" - }, - "image/vnd.mix": { - "source": "iana" - }, - "image/vnd.mozilla.apng": { - "source": "iana" - }, - "image/vnd.ms-modi": { - "source": "iana", - "extensions": ["mdi"] - }, - "image/vnd.ms-photo": { - "source": "apache", - "extensions": ["wdp"] - }, - "image/vnd.net-fpx": { - "source": "iana", - "extensions": ["npx"] - }, - "image/vnd.radiance": { - "source": "iana" - }, - "image/vnd.sealed.png": { - "source": "iana" - }, - "image/vnd.sealedmedia.softseal.gif": { - "source": "iana" - }, - "image/vnd.sealedmedia.softseal.jpg": { - "source": "iana" - }, - "image/vnd.svf": { - "source": "iana" - }, - "image/vnd.tencent.tap": { - "source": "iana" - }, - "image/vnd.valve.source.texture": { - "source": "iana" - }, - "image/vnd.wap.wbmp": { - "source": "iana", - "extensions": ["wbmp"] - }, - "image/vnd.xiff": { - "source": "iana", - "extensions": ["xif"] - }, - "image/vnd.zbrush.pcx": { - "source": "iana" - }, - "image/webp": { - "source": "apache", - "extensions": ["webp"] - }, - "image/x-3ds": { - "source": "apache", - "extensions": ["3ds"] - }, - "image/x-cmu-raster": { - "source": "apache", - "extensions": ["ras"] - }, - "image/x-cmx": { - "source": "apache", - "extensions": ["cmx"] - }, - "image/x-freehand": { - "source": "apache", - "extensions": ["fh","fhc","fh4","fh5","fh7"] - }, - "image/x-icon": { - "source": "apache", - "compressible": true, - "extensions": ["ico"] - }, - "image/x-jng": { - "source": "nginx", - "extensions": ["jng"] - }, - "image/x-mrsid-image": { - "source": "apache", - "extensions": ["sid"] - }, - "image/x-ms-bmp": { - "source": "nginx", - "compressible": true, - "extensions": ["bmp"] - }, - "image/x-pcx": { - "source": "apache", - "extensions": ["pcx"] - }, - "image/x-pict": { - "source": "apache", - "extensions": ["pic","pct"] - }, - "image/x-portable-anymap": { - "source": "apache", - "extensions": ["pnm"] - }, - "image/x-portable-bitmap": { - "source": "apache", - "extensions": ["pbm"] - }, - "image/x-portable-graymap": { - "source": "apache", - "extensions": ["pgm"] - }, - "image/x-portable-pixmap": { - "source": "apache", - "extensions": ["ppm"] - }, - "image/x-rgb": { - "source": "apache", - "extensions": ["rgb"] - }, - "image/x-tga": { - "source": "apache", - "extensions": ["tga"] - }, - "image/x-xbitmap": { - "source": "apache", - "extensions": ["xbm"] - }, - "image/x-xcf": { - "compressible": false - }, - "image/x-xpixmap": { - "source": "apache", - "extensions": ["xpm"] - }, - "image/x-xwindowdump": { - "source": "apache", - "extensions": ["xwd"] - }, - "message/cpim": { - "source": "iana" - }, - "message/delivery-status": { - "source": "iana" - }, - "message/disposition-notification": { - "source": "iana" - }, - "message/external-body": { - "source": "iana" - }, - "message/feedback-report": { - "source": "iana" - }, - "message/global": { - "source": "iana" - }, - "message/global-delivery-status": { - "source": "iana" - }, - "message/global-disposition-notification": { - "source": "iana" - }, - "message/global-headers": { - "source": "iana" - }, - "message/http": { - "source": "iana", - "compressible": false - }, - "message/imdn+xml": { - "source": "iana", - "compressible": true - }, - "message/news": { - "source": "iana" - }, - "message/partial": { - "source": "iana", - "compressible": false - }, - "message/rfc822": { - "source": "iana", - "compressible": true, - "extensions": ["eml","mime"] - }, - "message/s-http": { - "source": "iana" - }, - "message/sip": { - "source": "iana" - }, - "message/sipfrag": { - "source": "iana" - }, - "message/tracking-status": { - "source": "iana" - }, - "message/vnd.si.simp": { - "source": "iana" - }, - "message/vnd.wfa.wsc": { - "source": "iana" - }, - "model/iges": { - "source": "iana", - "compressible": false, - "extensions": ["igs","iges"] - }, - "model/mesh": { - "source": "iana", - "compressible": false, - "extensions": ["msh","mesh","silo"] - }, - "model/vnd.collada+xml": { - "source": "iana", - "extensions": ["dae"] - }, - "model/vnd.dwf": { - "source": "iana", - "extensions": ["dwf"] - }, - "model/vnd.flatland.3dml": { - "source": "iana" - }, - "model/vnd.gdl": { - "source": "iana", - "extensions": ["gdl"] - }, - "model/vnd.gs-gdl": { - "source": "apache" - }, - "model/vnd.gs.gdl": { - "source": "iana" - }, - "model/vnd.gtw": { - "source": "iana", - "extensions": ["gtw"] - }, - "model/vnd.moml+xml": { - "source": "iana" - }, - "model/vnd.mts": { - "source": "iana", - "extensions": ["mts"] - }, - "model/vnd.opengex": { - "source": "iana" - }, - "model/vnd.parasolid.transmit.binary": { - "source": "iana" - }, - "model/vnd.parasolid.transmit.text": { - "source": "iana" - }, - "model/vnd.valve.source.compiled-map": { - "source": "iana" - }, - "model/vnd.vtu": { - "source": "iana", - "extensions": ["vtu"] - }, - "model/vrml": { - "source": "iana", - "compressible": false, - "extensions": ["wrl","vrml"] - }, - "model/x3d+binary": { - "source": "apache", - "compressible": false, - "extensions": ["x3db","x3dbz"] - }, - "model/x3d+fastinfoset": { - "source": "iana" - }, - "model/x3d+vrml": { - "source": "apache", - "compressible": false, - "extensions": ["x3dv","x3dvz"] - }, - "model/x3d+xml": { - "source": "iana", - "compressible": true, - "extensions": ["x3d","x3dz"] - }, - "model/x3d-vrml": { - "source": "iana" - }, - "multipart/alternative": { - "source": "iana", - "compressible": false - }, - "multipart/appledouble": { - "source": "iana" - }, - "multipart/byteranges": { - "source": "iana" - }, - "multipart/digest": { - "source": "iana" - }, - "multipart/encrypted": { - "source": "iana", - "compressible": false - }, - "multipart/form-data": { - "source": "iana", - "compressible": false - }, - "multipart/header-set": { - "source": "iana" - }, - "multipart/mixed": { - "source": "iana", - "compressible": false - }, - "multipart/parallel": { - "source": "iana" - }, - "multipart/related": { - "source": "iana", - "compressible": false - }, - "multipart/report": { - "source": "iana" - }, - "multipart/signed": { - "source": "iana", - "compressible": false - }, - "multipart/voice-message": { - "source": "iana" - }, - "multipart/x-mixed-replace": { - "source": "iana" - }, - "text/1d-interleaved-parityfec": { - "source": "iana" - }, - "text/cache-manifest": { - "source": "iana", - "compressible": true, - "extensions": ["appcache","manifest"] - }, - "text/calendar": { - "source": "iana", - "extensions": ["ics","ifb"] - }, - "text/calender": { - "compressible": true - }, - "text/cmd": { - "compressible": true - }, - "text/coffeescript": { - "extensions": ["coffee","litcoffee"] - }, - "text/css": { - "source": "iana", - "compressible": true, - "extensions": ["css"] - }, - "text/csv": { - "source": "iana", - "compressible": true, - "extensions": ["csv"] - }, - "text/csv-schema": { - "source": "iana" - }, - "text/directory": { - "source": "iana" - }, - "text/dns": { - "source": "iana" - }, - "text/ecmascript": { - "source": "iana" - }, - "text/encaprtp": { - "source": "iana" - }, - "text/enriched": { - "source": "iana" - }, - "text/fwdred": { - "source": "iana" - }, - "text/grammar-ref-list": { - "source": "iana" - }, - "text/hjson": { - "extensions": ["hjson"] - }, - "text/html": { - "source": "iana", - "compressible": true, - "extensions": ["html","htm","shtml"] - }, - "text/jade": { - "extensions": ["jade"] - }, - "text/javascript": { - "source": "iana", - "compressible": true - }, - "text/jcr-cnd": { - "source": "iana" - }, - "text/jsx": { - "compressible": true, - "extensions": ["jsx"] - }, - "text/less": { - "extensions": ["less"] - }, - "text/markdown": { - "source": "iana" - }, - "text/mathml": { - "source": "nginx", - "extensions": ["mml"] - }, - "text/mizar": { - "source": "iana" - }, - "text/n3": { - "source": "iana", - "compressible": true, - "extensions": ["n3"] - }, - "text/parameters": { - "source": "iana" - }, - "text/parityfec": { - "source": "iana" - }, - "text/plain": { - "source": "iana", - "compressible": true, - "extensions": ["txt","text","conf","def","list","log","in","ini"] - }, - "text/provenance-notation": { - "source": "iana" - }, - "text/prs.fallenstein.rst": { - "source": "iana" - }, - "text/prs.lines.tag": { - "source": "iana", - "extensions": ["dsc"] - }, - "text/raptorfec": { - "source": "iana" - }, - "text/red": { - "source": "iana" - }, - "text/rfc822-headers": { - "source": "iana" - }, - "text/richtext": { - "source": "iana", - "compressible": true, - "extensions": ["rtx"] - }, - "text/rtf": { - "source": "iana", - "compressible": true, - "extensions": ["rtf"] - }, - "text/rtp-enc-aescm128": { - "source": "iana" - }, - "text/rtploopback": { - "source": "iana" - }, - "text/rtx": { - "source": "iana" - }, - "text/sgml": { - "source": "iana", - "extensions": ["sgml","sgm"] - }, - "text/stylus": { - "extensions": ["stylus","styl"] - }, - "text/t140": { - "source": "iana" - }, - "text/tab-separated-values": { - "source": "iana", - "compressible": true, - "extensions": ["tsv"] - }, - "text/troff": { - "source": "iana", - "extensions": ["t","tr","roff","man","me","ms"] - }, - "text/turtle": { - "source": "iana", - "extensions": ["ttl"] - }, - "text/ulpfec": { - "source": "iana" - }, - "text/uri-list": { - "source": "iana", - "compressible": true, - "extensions": ["uri","uris","urls"] - }, - "text/vcard": { - "source": "iana", - "compressible": true, - "extensions": ["vcard"] - }, - "text/vnd.a": { - "source": "iana" - }, - "text/vnd.abc": { - "source": "iana" - }, - "text/vnd.curl": { - "source": "iana", - "extensions": ["curl"] - }, - "text/vnd.curl.dcurl": { - "source": "apache", - "extensions": ["dcurl"] - }, - "text/vnd.curl.mcurl": { - "source": "apache", - "extensions": ["mcurl"] - }, - "text/vnd.curl.scurl": { - "source": "apache", - "extensions": ["scurl"] - }, - "text/vnd.debian.copyright": { - "source": "iana" - }, - "text/vnd.dmclientscript": { - "source": "iana" - }, - "text/vnd.dvb.subtitle": { - "source": "iana", - "extensions": ["sub"] - }, - "text/vnd.esmertec.theme-descriptor": { - "source": "iana" - }, - "text/vnd.fly": { - "source": "iana", - "extensions": ["fly"] - }, - "text/vnd.fmi.flexstor": { - "source": "iana", - "extensions": ["flx"] - }, - "text/vnd.graphviz": { - "source": "iana", - "extensions": ["gv"] - }, - "text/vnd.in3d.3dml": { - "source": "iana", - "extensions": ["3dml"] - }, - "text/vnd.in3d.spot": { - "source": "iana", - "extensions": ["spot"] - }, - "text/vnd.iptc.newsml": { - "source": "iana" - }, - "text/vnd.iptc.nitf": { - "source": "iana" - }, - "text/vnd.latex-z": { - "source": "iana" - }, - "text/vnd.motorola.reflex": { - "source": "iana" - }, - "text/vnd.ms-mediapackage": { - "source": "iana" - }, - "text/vnd.net2phone.commcenter.command": { - "source": "iana" - }, - "text/vnd.radisys.msml-basic-layout": { - "source": "iana" - }, - "text/vnd.si.uricatalogue": { - "source": "iana" - }, - "text/vnd.sun.j2me.app-descriptor": { - "source": "iana", - "extensions": ["jad"] - }, - "text/vnd.trolltech.linguist": { - "source": "iana" - }, - "text/vnd.wap.si": { - "source": "iana" - }, - "text/vnd.wap.sl": { - "source": "iana" - }, - "text/vnd.wap.wml": { - "source": "iana", - "extensions": ["wml"] - }, - "text/vnd.wap.wmlscript": { - "source": "iana", - "extensions": ["wmls"] - }, - "text/vtt": { - "charset": "UTF-8", - "compressible": true, - "extensions": ["vtt"] - }, - "text/x-asm": { - "source": "apache", - "extensions": ["s","asm"] - }, - "text/x-c": { - "source": "apache", - "extensions": ["c","cc","cxx","cpp","h","hh","dic"] - }, - "text/x-component": { - "source": "nginx", - "extensions": ["htc"] - }, - "text/x-fortran": { - "source": "apache", - "extensions": ["f","for","f77","f90"] - }, - "text/x-gwt-rpc": { - "compressible": true - }, - "text/x-handlebars-template": { - "extensions": ["hbs"] - }, - "text/x-java-source": { - "source": "apache", - "extensions": ["java"] - }, - "text/x-jquery-tmpl": { - "compressible": true - }, - "text/x-lua": { - "extensions": ["lua"] - }, - "text/x-markdown": { - "compressible": true, - "extensions": ["markdown","md","mkd"] - }, - "text/x-nfo": { - "source": "apache", - "extensions": ["nfo"] - }, - "text/x-opml": { - "source": "apache", - "extensions": ["opml"] - }, - "text/x-pascal": { - "source": "apache", - "extensions": ["p","pas"] - }, - "text/x-processing": { - "compressible": true, - "extensions": ["pde"] - }, - "text/x-sass": { - "extensions": ["sass"] - }, - "text/x-scss": { - "extensions": ["scss"] - }, - "text/x-setext": { - "source": "apache", - "extensions": ["etx"] - }, - "text/x-sfv": { - "source": "apache", - "extensions": ["sfv"] - }, - "text/x-uuencode": { - "source": "apache", - "extensions": ["uu"] - }, - "text/x-vcalendar": { - "source": "apache", - "extensions": ["vcs"] - }, - "text/x-vcard": { - "source": "apache", - "extensions": ["vcf"] - }, - "text/xml": { - "source": "iana", - "compressible": true, - "extensions": ["xml"] - }, - "text/xml-external-parsed-entity": { - "source": "iana" - }, - "text/yaml": { - "extensions": ["yaml","yml"] - }, - "video/1d-interleaved-parityfec": { - "source": "apache" - }, - "video/3gpp": { - "source": "apache", - "extensions": ["3gp","3gpp"] - }, - "video/3gpp-tt": { - "source": "apache" - }, - "video/3gpp2": { - "source": "apache", - "extensions": ["3g2"] - }, - "video/bmpeg": { - "source": "apache" - }, - "video/bt656": { - "source": "apache" - }, - "video/celb": { - "source": "apache" - }, - "video/dv": { - "source": "apache" - }, - "video/h261": { - "source": "apache", - "extensions": ["h261"] - }, - "video/h263": { - "source": "apache", - "extensions": ["h263"] - }, - "video/h263-1998": { - "source": "apache" - }, - "video/h263-2000": { - "source": "apache" - }, - "video/h264": { - "source": "apache", - "extensions": ["h264"] - }, - "video/h264-rcdo": { - "source": "apache" - }, - "video/h264-svc": { - "source": "apache" - }, - "video/jpeg": { - "source": "apache", - "extensions": ["jpgv"] - }, - "video/jpeg2000": { - "source": "apache" - }, - "video/jpm": { - "source": "apache", - "extensions": ["jpm","jpgm"] - }, - "video/mj2": { - "source": "apache", - "extensions": ["mj2","mjp2"] - }, - "video/mp1s": { - "source": "apache" - }, - "video/mp2p": { - "source": "apache" - }, - "video/mp2t": { - "source": "apache", - "extensions": ["ts"] - }, - "video/mp4": { - "source": "apache", - "compressible": false, - "extensions": ["mp4","mp4v","mpg4"] - }, - "video/mp4v-es": { - "source": "apache" - }, - "video/mpeg": { - "source": "apache", - "compressible": false, - "extensions": ["mpeg","mpg","mpe","m1v","m2v"] - }, - "video/mpeg4-generic": { - "source": "apache" - }, - "video/mpv": { - "source": "apache" - }, - "video/nv": { - "source": "apache" - }, - "video/ogg": { - "source": "apache", - "compressible": false, - "extensions": ["ogv"] - }, - "video/parityfec": { - "source": "apache" - }, - "video/pointer": { - "source": "apache" - }, - "video/quicktime": { - "source": "apache", - "compressible": false, - "extensions": ["qt","mov"] - }, - "video/raw": { - "source": "apache" - }, - "video/rtp-enc-aescm128": { - "source": "apache" - }, - "video/rtx": { - "source": "apache" - }, - "video/smpte292m": { - "source": "apache" - }, - "video/ulpfec": { - "source": "apache" - }, - "video/vc1": { - "source": "apache" - }, - "video/vnd.cctv": { - "source": "apache" - }, - "video/vnd.dece.hd": { - "source": "apache", - "extensions": ["uvh","uvvh"] - }, - "video/vnd.dece.mobile": { - "source": "apache", - "extensions": ["uvm","uvvm"] - }, - "video/vnd.dece.mp4": { - "source": "apache" - }, - "video/vnd.dece.pd": { - "source": "apache", - "extensions": ["uvp","uvvp"] - }, - "video/vnd.dece.sd": { - "source": "apache", - "extensions": ["uvs","uvvs"] - }, - "video/vnd.dece.video": { - "source": "apache", - "extensions": ["uvv","uvvv"] - }, - "video/vnd.directv.mpeg": { - "source": "apache" - }, - "video/vnd.directv.mpeg-tts": { - "source": "apache" - }, - "video/vnd.dlna.mpeg-tts": { - "source": "apache" - }, - "video/vnd.dvb.file": { - "source": "apache", - "extensions": ["dvb"] - }, - "video/vnd.fvt": { - "source": "apache", - "extensions": ["fvt"] - }, - "video/vnd.hns.video": { - "source": "apache" - }, - "video/vnd.iptvforum.1dparityfec-1010": { - "source": "apache" - }, - "video/vnd.iptvforum.1dparityfec-2005": { - "source": "apache" - }, - "video/vnd.iptvforum.2dparityfec-1010": { - "source": "apache" - }, - "video/vnd.iptvforum.2dparityfec-2005": { - "source": "apache" - }, - "video/vnd.iptvforum.ttsavc": { - "source": "apache" - }, - "video/vnd.iptvforum.ttsmpeg2": { - "source": "apache" - }, - "video/vnd.motorola.video": { - "source": "apache" - }, - "video/vnd.motorola.videop": { - "source": "apache" - }, - "video/vnd.mpegurl": { - "source": "apache", - "extensions": ["mxu","m4u"] - }, - "video/vnd.ms-playready.media.pyv": { - "source": "apache", - "extensions": ["pyv"] - }, - "video/vnd.nokia.interleaved-multimedia": { - "source": "apache" - }, - "video/vnd.nokia.videovoip": { - "source": "apache" - }, - "video/vnd.objectvideo": { - "source": "apache" - }, - "video/vnd.sealed.mpeg1": { - "source": "apache" - }, - "video/vnd.sealed.mpeg4": { - "source": "apache" - }, - "video/vnd.sealed.swf": { - "source": "apache" - }, - "video/vnd.sealedmedia.softseal.mov": { - "source": "apache" - }, - "video/vnd.uvvu.mp4": { - "source": "apache", - "extensions": ["uvu","uvvu"] - }, - "video/vnd.vivo": { - "source": "apache", - "extensions": ["viv"] - }, - "video/webm": { - "source": "apache", - "compressible": false, - "extensions": ["webm"] - }, - "video/x-f4v": { - "source": "apache", - "extensions": ["f4v"] - }, - "video/x-fli": { - "source": "apache", - "extensions": ["fli"] - }, - "video/x-flv": { - "source": "apache", - "compressible": false, - "extensions": ["flv"] - }, - "video/x-m4v": { - "source": "apache", - "extensions": ["m4v"] - }, - "video/x-matroska": { - "source": "apache", - "compressible": false, - "extensions": ["mkv","mk3d","mks"] - }, - "video/x-mng": { - "source": "apache", - "extensions": ["mng"] - }, - "video/x-ms-asf": { - "source": "apache", - "extensions": ["asf","asx"] - }, - "video/x-ms-vob": { - "source": "apache", - "extensions": ["vob"] - }, - "video/x-ms-wm": { - "source": "apache", - "extensions": ["wm"] - }, - "video/x-ms-wmv": { - "source": "apache", - "compressible": false, - "extensions": ["wmv"] - }, - "video/x-ms-wmx": { - "source": "apache", - "extensions": ["wmx"] - }, - "video/x-ms-wvx": { - "source": "apache", - "extensions": ["wvx"] - }, - "video/x-msvideo": { - "source": "apache", - "extensions": ["avi"] - }, - "video/x-sgi-movie": { - "source": "apache", - "extensions": ["movie"] - }, - "video/x-smv": { - "source": "apache", - "extensions": ["smv"] - }, - "x-conference/x-cooltalk": { - "source": "apache", - "extensions": ["ice"] - }, - "x-shader/x-fragment": { - "compressible": true - }, - "x-shader/x-vertex": { - "compressible": true - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/index.js deleted file mode 100644 index 551031f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * mime-db - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = require('./db.json') diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/package.json deleted file mode 100644 index 493b360..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/package.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "name": "mime-db", - "description": "Media Type Database", - "version": "1.18.0", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - } - ], - "license": "MIT", - "keywords": [ - "mime", - "db", - "type", - "types", - "database", - "charset", - "charsets" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/mime-db" - }, - "devDependencies": { - "bluebird": "2.9.34", - "co": "4.6.0", - "cogent": "1.0.1", - "csv-parse": "1.0.0", - "gnode": "0.1.1", - "istanbul": "0.3.19", - "mocha": "1.21.5", - "raw-body": "2.1.2", - "stream-to-array": "2" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "db.json", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "build": "node scripts/build", - "fetch": "gnode scripts/fetch-apache && gnode scripts/fetch-iana && gnode scripts/fetch-nginx", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", - "update": "npm run fetch && npm run build" - }, - "gitHead": "c48209a8786e61f20499ba14167252ad67638c5f", - "bugs": { - "url": "https://github.com/jshttp/mime-db/issues" - }, - "homepage": "https://github.com/jshttp/mime-db", - "_id": "mime-db@1.18.0", - "_shasum": "5317e28224c08af1d484f60973dd386ba8f389e0", - "_from": "mime-db@>=1.18.0 <1.19.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "5317e28224c08af1d484f60973dd386ba8f389e0", - "tarball": "http://registry.npmjs.org/mime-db/-/mime-db-1.18.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.18.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/package.json deleted file mode 100644 index 09f70c8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/mime-types/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "2.1.6", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": "https://searchbeam.jit.su" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - } - ], - "license": "MIT", - "keywords": [ - "mime", - "types" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/mime-types" - }, - "dependencies": { - "mime-db": "~1.18.0" - }, - "devDependencies": { - "istanbul": "0.3.19", - "mocha": "~1.21.5" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec test/test.js", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/test.js", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot test/test.js" - }, - "gitHead": "8bfa7c2c9a4ad07f5807c7a0e547e0246155944d", - "bugs": { - "url": "https://github.com/jshttp/mime-types/issues" - }, - "homepage": "https://github.com/jshttp/mime-types", - "_id": "mime-types@2.1.6", - "_shasum": "949f8788411864ddc70948a0f21c43f29d25667c", - "_from": "mime-types@>=2.1.6 <2.2.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "949f8788411864ddc70948a0f21c43f29d25667c", - "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-2.1.6.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.6.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/HISTORY.md deleted file mode 100644 index aa2a7c4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/HISTORY.md +++ /dev/null @@ -1,76 +0,0 @@ -0.5.3 / 2015-05-10 -================== - - * Fix media type parameter matching to be case-insensitive - -0.5.2 / 2015-05-06 -================== - - * Fix comparing media types with quoted values - * Fix splitting media types with quoted commas - -0.5.1 / 2015-02-14 -================== - - * Fix preference sorting to be stable for long acceptable lists - -0.5.0 / 2014-12-18 -================== - - * Fix list return order when large accepted list - * Fix missing identity encoding when q=0 exists - * Remove dynamic building of Negotiator class - -0.4.9 / 2014-10-14 -================== - - * Fix error when media type has invalid parameter - -0.4.8 / 2014-09-28 -================== - - * Fix all negotiations to be case-insensitive - * Stable sort preferences of same quality according to client order - * Support Node.js 0.6 - -0.4.7 / 2014-06-24 -================== - - * Handle invalid provided languages - * Handle invalid provided media types - -0.4.6 / 2014-06-11 -================== - - * Order by specificity when quality is the same - -0.4.5 / 2014-05-29 -================== - - * Fix regression in empty header handling - -0.4.4 / 2014-05-29 -================== - - * Fix behaviors when headers are not present - -0.4.3 / 2014-04-16 -================== - - * Handle slashes on media params correctly - -0.4.2 / 2014-02-28 -================== - - * Fix media type sorting - * Handle media types params strictly - -0.4.1 / 2014-01-16 -================== - - * Use most specific matches - -0.4.0 / 2014-01-09 -================== - - * Remove preferred prefix from methods diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE deleted file mode 100644 index ea6b9e2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -(The MIT License) - -Copyright (c) 2012-2014 Federico Romero -Copyright (c) 2012-2014 Isaac Z. Schlueter -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/README.md deleted file mode 100644 index ef507fa..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/README.md +++ /dev/null @@ -1,203 +0,0 @@ -# negotiator - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -An HTTP content negotiator for Node.js - -## Installation - -```sh -$ npm install negotiator -``` - -## API - -```js -var Negotiator = require('negotiator') -``` - -### Accept Negotiation - -```js -availableMediaTypes = ['text/html', 'text/plain', 'application/json'] - -// The negotiator constructor receives a request object -negotiator = new Negotiator(request) - -// Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8' - -negotiator.mediaTypes() -// -> ['text/html', 'image/jpeg', 'application/*'] - -negotiator.mediaTypes(availableMediaTypes) -// -> ['text/html', 'application/json'] - -negotiator.mediaType(availableMediaTypes) -// -> 'text/html' -``` - -You can check a working example at `examples/accept.js`. - -#### Methods - -##### mediaType() - -Returns the most preferred media type from the client. - -##### mediaType(availableMediaType) - -Returns the most preferred media type from a list of available media types. - -##### mediaTypes() - -Returns an array of preferred media types ordered by the client preference. - -##### mediaTypes(availableMediaTypes) - -Returns an array of preferred media types ordered by priority from a list of -available media types. - -### Accept-Language Negotiation - -```js -negotiator = new Negotiator(request) - -availableLanguages = 'en', 'es', 'fr' - -// Let's say Accept-Language header is 'en;q=0.8, es, pt' - -negotiator.languages() -// -> ['es', 'pt', 'en'] - -negotiator.languages(availableLanguages) -// -> ['es', 'en'] - -language = negotiator.language(availableLanguages) -// -> 'es' -``` - -You can check a working example at `examples/language.js`. - -#### Methods - -##### language() - -Returns the most preferred language from the client. - -##### language(availableLanguages) - -Returns the most preferred language from a list of available languages. - -##### languages() - -Returns an array of preferred languages ordered by the client preference. - -##### languages(availableLanguages) - -Returns an array of preferred languages ordered by priority from a list of -available languages. - -### Accept-Charset Negotiation - -```js -availableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5'] - -negotiator = new Negotiator(request) - -// Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2' - -negotiator.charsets() -// -> ['utf-8', 'iso-8859-1', 'utf-7'] - -negotiator.charsets(availableCharsets) -// -> ['utf-8', 'iso-8859-1'] - -negotiator.charset(availableCharsets) -// -> 'utf-8' -``` - -You can check a working example at `examples/charset.js`. - -#### Methods - -##### charset() - -Returns the most preferred charset from the client. - -##### charset(availableCharsets) - -Returns the most preferred charset from a list of available charsets. - -##### charsets() - -Returns an array of preferred charsets ordered by the client preference. - -##### charsets(availableCharsets) - -Returns an array of preferred charsets ordered by priority from a list of -available charsets. - -### Accept-Encoding Negotiation - -```js -availableEncodings = ['identity', 'gzip'] - -negotiator = new Negotiator(request) - -// Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5' - -negotiator.encodings() -// -> ['gzip', 'identity', 'compress'] - -negotiator.encodings(availableEncodings) -// -> ['gzip', 'identity'] - -negotiator.encoding(availableEncodings) -// -> 'gzip' -``` - -You can check a working example at `examples/encoding.js`. - -#### Methods - -##### encoding() - -Returns the most preferred encoding from the client. - -##### encoding(availableEncodings) - -Returns the most preferred encoding from a list of available encodings. - -##### encodings() - -Returns an array of preferred encodings ordered by the client preference. - -##### encodings(availableEncodings) - -Returns an array of preferred encodings ordered by priority from a list of -available encodings. - -## See Also - -The [accepts](https://npmjs.org/package/accepts#readme) module builds on -this module and provides an alternative interface, mime type validation, -and more. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/negotiator.svg -[npm-url]: https://npmjs.org/package/negotiator -[node-version-image]: https://img.shields.io/node/v/negotiator.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/negotiator/master.svg -[travis-url]: https://travis-ci.org/jshttp/negotiator -[coveralls-image]: https://img.shields.io/coveralls/jshttp/negotiator/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/negotiator?branch=master -[downloads-image]: https://img.shields.io/npm/dm/negotiator.svg -[downloads-url]: https://npmjs.org/package/negotiator diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/index.js deleted file mode 100644 index edae9cf..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/index.js +++ /dev/null @@ -1,62 +0,0 @@ - -var preferredCharsets = require('./lib/charset'); -var preferredEncodings = require('./lib/encoding'); -var preferredLanguages = require('./lib/language'); -var preferredMediaTypes = require('./lib/mediaType'); - -module.exports = Negotiator; -Negotiator.Negotiator = Negotiator; - -function Negotiator(request) { - if (!(this instanceof Negotiator)) { - return new Negotiator(request); - } - - this.request = request; -} - -Negotiator.prototype.charset = function charset(available) { - var set = this.charsets(available); - return set && set[0]; -}; - -Negotiator.prototype.charsets = function charsets(available) { - return preferredCharsets(this.request.headers['accept-charset'], available); -}; - -Negotiator.prototype.encoding = function encoding(available) { - var set = this.encodings(available); - return set && set[0]; -}; - -Negotiator.prototype.encodings = function encodings(available) { - return preferredEncodings(this.request.headers['accept-encoding'], available); -}; - -Negotiator.prototype.language = function language(available) { - var set = this.languages(available); - return set && set[0]; -}; - -Negotiator.prototype.languages = function languages(available) { - return preferredLanguages(this.request.headers['accept-language'], available); -}; - -Negotiator.prototype.mediaType = function mediaType(available) { - var set = this.mediaTypes(available); - return set && set[0]; -}; - -Negotiator.prototype.mediaTypes = function mediaTypes(available) { - return preferredMediaTypes(this.request.headers.accept, available); -}; - -// Backwards compatibility -Negotiator.prototype.preferredCharset = Negotiator.prototype.charset; -Negotiator.prototype.preferredCharsets = Negotiator.prototype.charsets; -Negotiator.prototype.preferredEncoding = Negotiator.prototype.encoding; -Negotiator.prototype.preferredEncodings = Negotiator.prototype.encodings; -Negotiator.prototype.preferredLanguage = Negotiator.prototype.language; -Negotiator.prototype.preferredLanguages = Negotiator.prototype.languages; -Negotiator.prototype.preferredMediaType = Negotiator.prototype.mediaType; -Negotiator.prototype.preferredMediaTypes = Negotiator.prototype.mediaTypes; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js deleted file mode 100644 index 7abd17c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js +++ /dev/null @@ -1,102 +0,0 @@ -module.exports = preferredCharsets; -preferredCharsets.preferredCharsets = preferredCharsets; - -function parseAcceptCharset(accept) { - var accepts = accept.split(','); - - for (var i = 0, j = 0; i < accepts.length; i++) { - var charset = parseCharset(accepts[i].trim(), i); - - if (charset) { - accepts[j++] = charset; - } - } - - // trim accepts - accepts.length = j; - - return accepts; -} - -function parseCharset(s, i) { - var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); - if (!match) return null; - - var charset = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - charset: charset, - q: q, - i: i - }; -} - -function getCharsetPriority(charset, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(charset, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -function specify(charset, spec, index) { - var s = 0; - if(spec.charset.toLowerCase() === charset.toLowerCase()){ - s |= 1; - } else if (spec.charset !== '*' ) { - return null - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s - } -} - -function preferredCharsets(accept, provided) { - // RFC 2616 sec 14.2: no header = * - var accepts = parseAcceptCharset(accept === undefined ? '*' : accept || ''); - - if (!provided) { - // sorted list of all charsets - return accepts.filter(isQuality).sort(compareSpecs).map(function getCharset(spec) { - return spec.charset; - }); - } - - var priorities = provided.map(function getPriority(type, index) { - return getCharsetPriority(type, accepts, index); - }); - - // sorted list of accepted charsets - return priorities.filter(isQuality).sort(compareSpecs).map(function getCharset(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -function isQuality(spec) { - return spec.q > 0; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js deleted file mode 100644 index 7fed673..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js +++ /dev/null @@ -1,118 +0,0 @@ -module.exports = preferredEncodings; -preferredEncodings.preferredEncodings = preferredEncodings; - -function parseAcceptEncoding(accept) { - var accepts = accept.split(','); - var hasIdentity = false; - var minQuality = 1; - - for (var i = 0, j = 0; i < accepts.length; i++) { - var encoding = parseEncoding(accepts[i].trim(), i); - - if (encoding) { - accepts[j++] = encoding; - hasIdentity = hasIdentity || specify('identity', encoding); - minQuality = Math.min(minQuality, encoding.q || 1); - } - } - - if (!hasIdentity) { - /* - * If identity doesn't explicitly appear in the accept-encoding header, - * it's added to the list of acceptable encoding with the lowest q - */ - accepts[j++] = { - encoding: 'identity', - q: minQuality, - i: i - }; - } - - // trim accepts - accepts.length = j; - - return accepts; -} - -function parseEncoding(s, i) { - var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); - - if (!match) return null; - - var encoding = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';'); - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - encoding: encoding, - q: q, - i: i - }; -} - -function getEncodingPriority(encoding, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(encoding, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -function specify(encoding, spec, index) { - var s = 0; - if(spec.encoding.toLowerCase() === encoding.toLowerCase()){ - s |= 1; - } else if (spec.encoding !== '*' ) { - return null - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s - } -}; - -function preferredEncodings(accept, provided) { - var accepts = parseAcceptEncoding(accept || ''); - - if (!provided) { - // sorted list of all encodings - return accepts.filter(isQuality).sort(compareSpecs).map(function getEncoding(spec) { - return spec.encoding; - }); - } - - var priorities = provided.map(function getPriority(type, index) { - return getEncodingPriority(type, accepts, index); - }); - - // sorted list of accepted encodings - return priorities.filter(isQuality).sort(compareSpecs).map(function getEncoding(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -function isQuality(spec) { - return spec.q > 0; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js deleted file mode 100644 index ed9e1ec..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js +++ /dev/null @@ -1,112 +0,0 @@ -module.exports = preferredLanguages; -preferredLanguages.preferredLanguages = preferredLanguages; - -function parseAcceptLanguage(accept) { - var accepts = accept.split(','); - - for (var i = 0, j = 0; i < accepts.length; i++) { - var langauge = parseLanguage(accepts[i].trim(), i); - - if (langauge) { - accepts[j++] = langauge; - } - } - - // trim accepts - accepts.length = j; - - return accepts; -} - -function parseLanguage(s, i) { - var match = s.match(/^\s*(\S+?)(?:-(\S+?))?\s*(?:;(.*))?$/); - if (!match) return null; - - var prefix = match[1], - suffix = match[2], - full = prefix; - - if (suffix) full += "-" + suffix; - - var q = 1; - if (match[3]) { - var params = match[3].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].split('='); - if (p[0] === 'q') q = parseFloat(p[1]); - } - } - - return { - prefix: prefix, - suffix: suffix, - q: q, - i: i, - full: full - }; -} - -function getLanguagePriority(language, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(language, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -function specify(language, spec, index) { - var p = parseLanguage(language) - if (!p) return null; - var s = 0; - if(spec.full.toLowerCase() === p.full.toLowerCase()){ - s |= 4; - } else if (spec.prefix.toLowerCase() === p.full.toLowerCase()) { - s |= 2; - } else if (spec.full.toLowerCase() === p.prefix.toLowerCase()) { - s |= 1; - } else if (spec.full !== '*' ) { - return null - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s - } -}; - -function preferredLanguages(accept, provided) { - // RFC 2616 sec 14.4: no header = * - var accepts = parseAcceptLanguage(accept === undefined ? '*' : accept || ''); - - if (!provided) { - // sorted list of all languages - return accepts.filter(isQuality).sort(compareSpecs).map(function getLanguage(spec) { - return spec.full; - }); - } - - var priorities = provided.map(function getPriority(type, index) { - return getLanguagePriority(type, accepts, index); - }); - - // sorted list of accepted languages - return priorities.filter(isQuality).sort(compareSpecs).map(function getLanguage(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -function isQuality(spec) { - return spec.q > 0; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js deleted file mode 100644 index 4170c25..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js +++ /dev/null @@ -1,179 +0,0 @@ -/** - * negotiator - * Copyright(c) 2012 Isaac Z. Schlueter - * Copyright(c) 2014 Federico Romero - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -module.exports = preferredMediaTypes; -preferredMediaTypes.preferredMediaTypes = preferredMediaTypes; - -function parseAccept(accept) { - var accepts = splitMediaTypes(accept); - - for (var i = 0, j = 0; i < accepts.length; i++) { - var mediaType = parseMediaType(accepts[i].trim(), i); - - if (mediaType) { - accepts[j++] = mediaType; - } - } - - // trim accepts - accepts.length = j; - - return accepts; -}; - -function parseMediaType(s, i) { - var match = s.match(/\s*(\S+?)\/([^;\s]+)\s*(?:;(.*))?/); - if (!match) return null; - - var type = match[1], - subtype = match[2], - full = "" + type + "/" + subtype, - params = {}, - q = 1; - - if (match[3]) { - params = match[3].split(';').map(function(s) { - return s.trim().split('='); - }).reduce(function (set, p) { - var name = p[0].toLowerCase(); - var value = p[1]; - - set[name] = value && value[0] === '"' && value[value.length - 1] === '"' - ? value.substr(1, value.length - 2) - : value; - - return set; - }, params); - - if (params.q != null) { - q = parseFloat(params.q); - delete params.q; - } - } - - return { - type: type, - subtype: subtype, - params: params, - q: q, - i: i, - full: full - }; -} - -function getMediaTypePriority(type, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(type, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -function specify(type, spec, index) { - var p = parseMediaType(type); - var s = 0; - - if (!p) { - return null; - } - - if(spec.type.toLowerCase() == p.type.toLowerCase()) { - s |= 4 - } else if(spec.type != '*') { - return null; - } - - if(spec.subtype.toLowerCase() == p.subtype.toLowerCase()) { - s |= 2 - } else if(spec.subtype != '*') { - return null; - } - - var keys = Object.keys(spec.params); - if (keys.length > 0) { - if (keys.every(function (k) { - return spec.params[k] == '*' || (spec.params[k] || '').toLowerCase() == (p.params[k] || '').toLowerCase(); - })) { - s |= 1 - } else { - return null - } - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s, - } - -} - -function preferredMediaTypes(accept, provided) { - // RFC 2616 sec 14.2: no header = */* - var accepts = parseAccept(accept === undefined ? '*/*' : accept || ''); - - if (!provided) { - // sorted list of all types - return accepts.filter(isQuality).sort(compareSpecs).map(function getType(spec) { - return spec.full; - }); - } - - var priorities = provided.map(function getPriority(type, index) { - return getMediaTypePriority(type, accepts, index); - }); - - // sorted list of accepted types - return priorities.filter(isQuality).sort(compareSpecs).map(function getType(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -function isQuality(spec) { - return spec.q > 0; -} - -function quoteCount(string) { - var count = 0; - var index = 0; - - while ((index = string.indexOf('"', index)) !== -1) { - count++; - index++; - } - - return count; -} - -function splitMediaTypes(accept) { - var accepts = accept.split(','); - - for (var i = 1, j = 0; i < accepts.length; i++) { - if (quoteCount(accepts[j]) % 2 == 0) { - accepts[++j] = accepts[i]; - } else { - accepts[j] += ',' + accepts[i]; - } - } - - // trim accepts - accepts.length = j + 1; - - return accepts; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/package.json deleted file mode 100644 index e6d64f4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/node_modules/negotiator/package.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "name": "negotiator", - "description": "HTTP content negotiation", - "version": "0.5.3", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Federico Romero", - "email": "federico.romero@outboxlabs.com" - }, - { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - } - ], - "license": "MIT", - "keywords": [ - "http", - "content negotiation", - "accept", - "accept-language", - "accept-encoding", - "accept-charset" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/negotiator" - }, - "devDependencies": { - "istanbul": "0.3.9", - "mocha": "~1.21.5" - }, - "files": [ - "lib/", - "HISTORY.md", - "LICENSE", - "index.js", - "README.md" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "cbb717b3f164f25820f90b160cda6d0166b9d922", - "bugs": { - "url": "https://github.com/jshttp/negotiator/issues" - }, - "homepage": "https://github.com/jshttp/negotiator", - "_id": "negotiator@0.5.3", - "_shasum": "269d5c476810ec92edbe7b6c2f28316384f9a7e8", - "_from": "negotiator@0.5.3", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "federomero", - "email": "federomero@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "269d5c476810ec92edbe7b6c2f28316384f9a7e8", - "tarball": "http://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/package.json deleted file mode 100644 index 8d29ad9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/accepts/package.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "name": "accepts", - "description": "Higher-level content negotiation", - "version": "1.2.12", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jshttp/accepts" - }, - "dependencies": { - "mime-types": "~2.1.4", - "negotiator": "0.5.3" - }, - "devDependencies": { - "istanbul": "0.3.17", - "mocha": "~1.21.5" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "keywords": [ - "content", - "negotiation", - "accept", - "accepts" - ], - "gitHead": "f01900aa33b1089575bd29caea851a8a241df07c", - "bugs": { - "url": "https://github.com/jshttp/accepts/issues" - }, - "homepage": "https://github.com/jshttp/accepts", - "_id": "accepts@1.2.12", - "_shasum": "7e6d880f473b5c48d46e3e35f71ea7c3b68514c3", - "_from": "accepts@>=1.2.12 <1.3.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "federomero", - "email": "federomero@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "7e6d880f473b5c48d46e3e35f71ea7c3b68514c3", - "tarball": "http://registry.npmjs.org/accepts/-/accepts-1.2.12.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.12.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/LICENSE deleted file mode 100644 index 983fbe8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/README.md deleted file mode 100644 index 91fa5b6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Array Flatten - -[![NPM version][npm-image]][npm-url] -[![NPM downloads][downloads-image]][downloads-url] -[![Build status][travis-image]][travis-url] -[![Test coverage][coveralls-image]][coveralls-url] - -> Flatten an array of nested arrays into a single flat array. Accepts an optional depth. - -## Installation - -``` -npm install array-flatten --save -``` - -## Usage - -```javascript -var flatten = require('array-flatten') - -flatten([1, [2, [3, [4, [5], 6], 7], 8], 9]) -//=> [1, 2, 3, 4, 5, 6, 7, 8, 9] - -flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2) -//=> [1, 2, 3, [4, [5], 6], 7, 8, 9] - -(function () { - flatten(arguments) //=> [1, 2, 3] -})(1, [2, 3]) -``` - -## License - -MIT - -[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat -[npm-url]: https://npmjs.org/package/array-flatten -[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat -[downloads-url]: https://npmjs.org/package/array-flatten -[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat -[travis-url]: https://travis-ci.org/blakeembrey/array-flatten -[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat -[coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/array-flatten.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/array-flatten.js deleted file mode 100644 index 089117b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/array-flatten.js +++ /dev/null @@ -1,64 +0,0 @@ -'use strict' - -/** - * Expose `arrayFlatten`. - */ -module.exports = arrayFlatten - -/** - * Recursive flatten function with depth. - * - * @param {Array} array - * @param {Array} result - * @param {Number} depth - * @return {Array} - */ -function flattenWithDepth (array, result, depth) { - for (var i = 0; i < array.length; i++) { - var value = array[i] - - if (depth > 0 && Array.isArray(value)) { - flattenWithDepth(value, result, depth - 1) - } else { - result.push(value) - } - } - - return result -} - -/** - * Recursive flatten function. Omitting depth is slightly faster. - * - * @param {Array} array - * @param {Array} result - * @return {Array} - */ -function flattenForever (array, result) { - for (var i = 0; i < array.length; i++) { - var value = array[i] - - if (Array.isArray(value)) { - flattenForever(value, result) - } else { - result.push(value) - } - } - - return result -} - -/** - * Flatten an array, with the ability to define a depth. - * - * @param {Array} array - * @param {Number} depth - * @return {Array} - */ -function arrayFlatten (array, depth) { - if (depth == null) { - return flattenForever(array, []) - } - - return flattenWithDepth(array, [], depth) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/package.json deleted file mode 100644 index f80f937..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/array-flatten/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "array-flatten", - "version": "1.1.1", - "description": "Flatten an array of nested arrays into a single flat array", - "main": "array-flatten.js", - "files": [ - "array-flatten.js", - "LICENSE" - ], - "scripts": { - "test": "istanbul cover _mocha -- -R spec" - }, - "repository": { - "type": "git", - "url": "git://github.com/blakeembrey/array-flatten.git" - }, - "keywords": [ - "array", - "flatten", - "arguments", - "depth" - ], - "author": { - "name": "Blake Embrey", - "email": "hello@blakeembrey.com", - "url": "http://blakeembrey.me" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/blakeembrey/array-flatten/issues" - }, - "homepage": "https://github.com/blakeembrey/array-flatten", - "devDependencies": { - "istanbul": "^0.3.13", - "mocha": "^2.2.4", - "pre-commit": "^1.0.7", - "standard": "^3.7.3" - }, - "gitHead": "1963a9189229d408e1e8f585a00c8be9edbd1803", - "_id": "array-flatten@1.1.1", - "_shasum": "9a5f699051b1e7073328f2a008968b64ea2955d2", - "_from": "array-flatten@1.1.1", - "_npmVersion": "2.11.3", - "_nodeVersion": "2.3.3", - "_npmUser": { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - "maintainers": [ - { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - } - ], - "dist": { - "shasum": "9a5f699051b1e7073328f2a008968b64ea2955d2", - "tarball": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/HISTORY.md deleted file mode 100644 index 1192551..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/HISTORY.md +++ /dev/null @@ -1,40 +0,0 @@ -0.5.0 / 2014-10-11 -================== - - * Add `parse` function - -0.4.0 / 2014-09-21 -================== - - * Expand non-Unicode `filename` to the full ISO-8859-1 charset - -0.3.0 / 2014-09-20 -================== - - * Add `fallback` option - * Add `type` option - -0.2.0 / 2014-09-19 -================== - - * Reduce ambiguity of file names with hex escape in buggy browsers - -0.1.2 / 2014-09-19 -================== - - * Fix periodic invalid Unicode filename header - -0.1.1 / 2014-09-19 -================== - - * Fix invalid characters appearing in `filename*` parameter - -0.1.0 / 2014-09-18 -================== - - * Make the `filename` argument optional - -0.0.0 / 2014-09-18 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/README.md deleted file mode 100644 index d265431..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/README.md +++ /dev/null @@ -1,141 +0,0 @@ -# content-disposition - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Create and parse HTTP `Content-Disposition` header - -## Installation - -```sh -$ npm install content-disposition -``` - -## API - -```js -var contentDisposition = require('content-disposition') -``` - -### contentDisposition(filename, options) - -Create an attachment `Content-Disposition` header value using the given file name, -if supplied. The `filename` is optional and if no file name is desired, but you -want to specify `options`, set `filename` to `undefined`. - -```js -res.setHeader('Content-Disposition', contentDisposition('∫ maths.pdf')) -``` - -**note** HTTP headers are of the ISO-8859-1 character set. If you are writing this -header through a means different from `setHeader` in Node.js, you'll want to specify -the `'binary'` encoding in Node.js. - -#### Options - -`contentDisposition` accepts these properties in the options object. - -##### fallback - -If the `filename` option is outside ISO-8859-1, then the file name is actually -stored in a supplemental field for clients that support Unicode file names and -a ISO-8859-1 version of the file name is automatically generated. - -This specifies the ISO-8859-1 file name to override the automatic generation or -disables the generation all together, defaults to `true`. - - - A string will specify the ISO-8859-1 file name to use in place of automatic - generation. - - `false` will disable including a ISO-8859-1 file name and only include the - Unicode version (unless the file name is already ISO-8859-1). - - `true` will enable automatic generation if the file name is outside ISO-8859-1. - -If the `filename` option is ISO-8859-1 and this option is specified and has a -different value, then the `filename` option is encoded in the extended field -and this set as the fallback field, even though they are both ISO-8859-1. - -##### type - -Specifies the disposition type, defaults to `"attachment"`. This can also be -`"inline"`, or any other value (all values except inline are treated like -`attachment`, but can convey additional information if both parties agree to -it). The type is normalized to lower-case. - -### contentDisposition.parse(string) - -```js -var disposition = contentDisposition.parse('attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt"'); -``` - -Parse a `Content-Disposition` header string. This automatically handles extended -("Unicode") parameters by decoding them and providing them under the standard -parameter name. This will return an object with the following properties (examples -are shown for the string `'attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt'`): - - - `type`: The disposition type (always lower case). Example: `'attachment'` - - - `parameters`: An object of the parameters in the disposition (name of parameter - always lower case and extended versions replace non-extended versions). Example: - `{filename: "€ rates.txt"}` - -## Examples - -### Send a file for download - -```js -var contentDisposition = require('content-disposition') -var destroy = require('destroy') -var http = require('http') -var onFinished = require('on-finished') - -var filePath = '/path/to/public/plans.pdf' - -http.createServer(function onRequest(req, res) { - // set headers - res.setHeader('Content-Type', 'application/pdf') - res.setHeader('Content-Disposition', contentDisposition(filePath)) - - // send file - var stream = fs.createReadStream(filePath) - stream.pipe(res) - onFinished(res, function (err) { - destroy(stream) - }) -}) -``` - -## Testing - -```sh -$ npm test -``` - -## References - -- [RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1][rfc-2616] -- [RFC 5987: Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field Parameters][rfc-5987] -- [RFC 6266: Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)][rfc-6266] -- [Test Cases for HTTP Content-Disposition header field (RFC 6266) and the Encodings defined in RFCs 2047, 2231 and 5987][tc-2231] - -[rfc-2616]: https://tools.ietf.org/html/rfc2616 -[rfc-5987]: https://tools.ietf.org/html/rfc5987 -[rfc-6266]: https://tools.ietf.org/html/rfc6266 -[tc-2231]: http://greenbytes.de/tech/tc2231/ - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/content-disposition.svg?style=flat -[npm-url]: https://npmjs.org/package/content-disposition -[node-version-image]: https://img.shields.io/node/v/content-disposition.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/content-disposition.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/content-disposition -[coveralls-image]: https://img.shields.io/coveralls/jshttp/content-disposition.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/content-disposition?branch=master -[downloads-image]: https://img.shields.io/npm/dm/content-disposition.svg?style=flat -[downloads-url]: https://npmjs.org/package/content-disposition diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/index.js deleted file mode 100644 index fa3bc74..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/index.js +++ /dev/null @@ -1,443 +0,0 @@ -/*! - * content-disposition - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = contentDisposition -module.exports.parse = parse - -/** - * Module dependencies. - */ - -var basename = require('path').basename - -/** - * RegExp to match non attr-char, *after* encodeURIComponent (i.e. not including "%") - */ - -var encodeUriAttrCharRegExp = /[\x00-\x20"'\(\)*,\/:;<=>?@\[\\\]\{\}\x7f]/g - -/** - * RegExp to match percent encoding escape. - */ - -var hexEscapeRegExp = /%[0-9A-Fa-f]{2}/ -var hexEscapeReplaceRegExp = /%([0-9A-Fa-f]{2})/g - -/** - * RegExp to match non-latin1 characters. - */ - -var nonLatin1RegExp = /[^\x20-\x7e\xa0-\xff]/g - -/** - * RegExp to match quoted-pair in RFC 2616 - * - * quoted-pair = "\" CHAR - * CHAR = - */ - -var qescRegExp = /\\([\u0000-\u007f])/g; - -/** - * RegExp to match chars that must be quoted-pair in RFC 2616 - */ - -var quoteRegExp = /([\\"])/g - -/** - * RegExp for various RFC 2616 grammar - * - * parameter = token "=" ( token | quoted-string ) - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) - * qdtext = > - * quoted-pair = "\" CHAR - * CHAR = - * TEXT = - * LWS = [CRLF] 1*( SP | HT ) - * CRLF = CR LF - * CR = - * LF = - * SP = - * HT = - * CTL = - * OCTET = - */ - -var paramRegExp = /; *([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *= *("(?:[ !\x23-\x5b\x5d-\x7e\x80-\xff]|\\[\x20-\x7e])*"|[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) */g -var textRegExp = /^[\x20-\x7e\x80-\xff]+$/ -var tokenRegExp = /^[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+$/ - -/** - * RegExp for various RFC 5987 grammar - * - * ext-value = charset "'" [ language ] "'" value-chars - * charset = "UTF-8" / "ISO-8859-1" / mime-charset - * mime-charset = 1*mime-charsetc - * mime-charsetc = ALPHA / DIGIT - * / "!" / "#" / "$" / "%" / "&" - * / "+" / "-" / "^" / "_" / "`" - * / "{" / "}" / "~" - * language = ( 2*3ALPHA [ extlang ] ) - * / 4ALPHA - * / 5*8ALPHA - * extlang = *3( "-" 3ALPHA ) - * value-chars = *( pct-encoded / attr-char ) - * pct-encoded = "%" HEXDIG HEXDIG - * attr-char = ALPHA / DIGIT - * / "!" / "#" / "$" / "&" / "+" / "-" / "." - * / "^" / "_" / "`" / "|" / "~" - */ - -var extValueRegExp = /^([A-Za-z0-9!#$%&+\-^_`{}~]+)'(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}|[A-Za-z]{4,8}|)'((?:%[0-9A-Fa-f]{2}|[A-Za-z0-9!#$&+\-\.^_`|~])+)$/ - -/** - * RegExp for various RFC 6266 grammar - * - * disposition-type = "inline" | "attachment" | disp-ext-type - * disp-ext-type = token - * disposition-parm = filename-parm | disp-ext-parm - * filename-parm = "filename" "=" value - * | "filename*" "=" ext-value - * disp-ext-parm = token "=" value - * | ext-token "=" ext-value - * ext-token = - */ - -var dispositionTypeRegExp = /^([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *(?:$|;)/ - -/** - * Create an attachment Content-Disposition header. - * - * @param {string} [filename] - * @param {object} [options] - * @param {string} [options.type=attachment] - * @param {string|boolean} [options.fallback=true] - * @return {string} - * @api public - */ - -function contentDisposition(filename, options) { - var opts = options || {} - - // get type - var type = opts.type || 'attachment' - - // get parameters - var params = createparams(filename, opts.fallback) - - // format into string - return format(new ContentDisposition(type, params)) -} - -/** - * Create parameters object from filename and fallback. - * - * @param {string} [filename] - * @param {string|boolean} [fallback=true] - * @return {object} - * @api private - */ - -function createparams(filename, fallback) { - if (filename === undefined) { - return - } - - var params = {} - - if (typeof filename !== 'string') { - throw new TypeError('filename must be a string') - } - - // fallback defaults to true - if (fallback === undefined) { - fallback = true - } - - if (typeof fallback !== 'string' && typeof fallback !== 'boolean') { - throw new TypeError('fallback must be a string or boolean') - } - - if (typeof fallback === 'string' && nonLatin1RegExp.test(fallback)) { - throw new TypeError('fallback must be ISO-8859-1 string') - } - - // restrict to file base name - var name = basename(filename) - - // determine if name is suitable for quoted string - var isQuotedString = textRegExp.test(name) - - // generate fallback name - var fallbackName = typeof fallback !== 'string' - ? fallback && getlatin1(name) - : basename(fallback) - var hasFallback = typeof fallbackName === 'string' && fallbackName !== name - - // set extended filename parameter - if (hasFallback || !isQuotedString || hexEscapeRegExp.test(name)) { - params['filename*'] = name - } - - // set filename parameter - if (isQuotedString || hasFallback) { - params.filename = hasFallback - ? fallbackName - : name - } - - return params -} - -/** - * Format object to Content-Disposition header. - * - * @param {object} obj - * @param {string} obj.type - * @param {object} [obj.parameters] - * @return {string} - * @api private - */ - -function format(obj) { - var parameters = obj.parameters - var type = obj.type - - if (!type || typeof type !== 'string' || !tokenRegExp.test(type)) { - throw new TypeError('invalid type') - } - - // start with normalized type - var string = String(type).toLowerCase() - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - var val = param.substr(-1) === '*' - ? ustring(parameters[param]) - : qstring(parameters[param]) - - string += '; ' + param + '=' + val - } - } - - return string -} - -/** - * Decode a RFC 6987 field value (gracefully). - * - * @param {string} str - * @return {string} - * @api private - */ - -function decodefield(str) { - var match = extValueRegExp.exec(str) - - if (!match) { - throw new TypeError('invalid extended field value') - } - - var charset = match[1].toLowerCase() - var encoded = match[2] - var value - - // to binary string - var binary = encoded.replace(hexEscapeReplaceRegExp, pdecode) - - switch (charset) { - case 'iso-8859-1': - value = getlatin1(binary) - break - case 'utf-8': - value = new Buffer(binary, 'binary').toString('utf8') - break - default: - throw new TypeError('unsupported charset in extended field') - } - - return value -} - -/** - * Get ISO-8859-1 version of string. - * - * @param {string} val - * @return {string} - * @api private - */ - -function getlatin1(val) { - // simple Unicode -> ISO-8859-1 transformation - return String(val).replace(nonLatin1RegExp, '?') -} - -/** - * Parse Content-Disposition header string. - * - * @param {string} string - * @return {object} - * @api private - */ - -function parse(string) { - if (!string || typeof string !== 'string') { - throw new TypeError('argument string is required') - } - - var match = dispositionTypeRegExp.exec(string) - - if (!match) { - throw new TypeError('invalid type format') - } - - // normalize type - var index = match[0].length - var type = match[1].toLowerCase() - - var key - var names = [] - var params = {} - var value - - // calculate index to start at - index = paramRegExp.lastIndex = match[0].substr(-1) === ';' - ? index - 1 - : index - - // match parameters - while (match = paramRegExp.exec(string)) { - if (match.index !== index) { - throw new TypeError('invalid parameter format') - } - - index += match[0].length - key = match[1].toLowerCase() - value = match[2] - - if (names.indexOf(key) !== -1) { - throw new TypeError('invalid duplicate parameter') - } - - names.push(key) - - if (key.indexOf('*') + 1 === key.length) { - // decode extended value - key = key.slice(0, -1) - value = decodefield(value) - - // overwrite existing value - params[key] = value - continue - } - - if (typeof params[key] === 'string') { - continue - } - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(qescRegExp, '$1') - } - - params[key] = value - } - - if (index !== -1 && index !== string.length) { - throw new TypeError('invalid parameter format') - } - - return new ContentDisposition(type, params) -} - -/** - * Percent decode a single character. - * - * @param {string} str - * @param {string} hex - * @return {string} - * @api private - */ - -function pdecode(str, hex) { - return String.fromCharCode(parseInt(hex, 16)) -} - -/** - * Percent encode a single character. - * - * @param {string} char - * @return {string} - * @api private - */ - -function pencode(char) { - var hex = String(char) - .charCodeAt(0) - .toString(16) - .toUpperCase() - return hex.length === 1 - ? '%0' + hex - : '%' + hex -} - -/** - * Quote a string for HTTP. - * - * @param {string} val - * @return {string} - * @api private - */ - -function qstring(val) { - var str = String(val) - - return '"' + str.replace(quoteRegExp, '\\$1') + '"' -} - -/** - * Encode a Unicode string for HTTP (RFC 5987). - * - * @param {string} val - * @return {string} - * @api private - */ - -function ustring(val) { - var str = String(val) - - // percent encode as UTF-8 - var encoded = encodeURIComponent(str) - .replace(encodeUriAttrCharRegExp, pencode) - - return 'UTF-8\'\'' + encoded -} - -/** - * Class for parsed Content-Disposition header for v8 optimization - */ - -function ContentDisposition(type, parameters) { - this.type = type - this.parameters = parameters -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/package.json deleted file mode 100644 index b0bb7ec..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-disposition/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "content-disposition", - "description": "Create and parse Content-Disposition header", - "version": "0.5.0", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "keywords": [ - "content-disposition", - "http", - "rfc6266", - "res" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/content-disposition" - }, - "devDependencies": { - "istanbul": "0.3.2", - "mocha": "~1.21.4" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "f3c915f0c9d9f5ec79713dba24c8c6181b73305d", - "bugs": { - "url": "https://github.com/jshttp/content-disposition/issues" - }, - "homepage": "https://github.com/jshttp/content-disposition", - "_id": "content-disposition@0.5.0", - "_shasum": "4284fe6ae0630874639e44e80a418c2934135e9e", - "_from": "content-disposition@0.5.0", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "4284fe6ae0630874639e44e80a418c2934135e9e", - "tarball": "http://registry.npmjs.org/content-disposition/-/content-disposition-0.5.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/HISTORY.md deleted file mode 100644 index 8a623a2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/HISTORY.md +++ /dev/null @@ -1,9 +0,0 @@ -1.0.1 / 2015-02-13 -================== - - * Improve missing `Content-Type` header error message - -1.0.0 / 2015-02-01 -================== - - * Initial implementation, derived from `media-typer@0.3.0` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/LICENSE deleted file mode 100644 index 34b1a2d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/README.md deleted file mode 100644 index 3ed6741..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# content-type - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Create and parse HTTP Content-Type header according to RFC 7231 - -## Installation - -```sh -$ npm install content-type -``` - -## API - -```js -var contentType = require('content-type') -``` - -### contentType.parse(string) - -```js -var obj = contentType.parse('image/svg+xml; charset=utf-8') -``` - -Parse a content type string. This will return an object with the following -properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`): - - - `type`: The media type (the type and subtype, always lower case). - Example: `'image/svg+xml'` - - - `parameters`: An object of the parameters in the media type (name of parameter - always lower case). Example: `{charset: 'utf-8'}` - -Throws a `TypeError` if the string is missing or invalid. - -### contentType.parse(req) - -```js -var obj = contentType.parse(req) -``` - -Parse the `content-type` header from the given `req`. Short-cut for -`contentType.parse(req.headers['content-type'])`. - -Throws a `TypeError` if the `Content-Type` header is missing or invalid. - -### contentType.parse(res) - -```js -var obj = contentType.parse(res) -``` - -Parse the `content-type` header set on the given `res`. Short-cut for -`contentType.parse(res.getHeader('content-type'))`. - -Throws a `TypeError` if the `Content-Type` header is missing or invalid. - -### contentType.format(obj) - -```js -var str = contentType.format({type: 'image/svg+xml'}) -``` - -Format an object into a content type string. This will return a string of the -content type for the given object with the following properties (examples are -shown that produce the string `'image/svg+xml; charset=utf-8'`): - - - `type`: The media type (will be lower-cased). Example: `'image/svg+xml'` - - - `parameters`: An object of the parameters in the media type (name of the - parameter will be lower-cased). Example: `{charset: 'utf-8'}` - -Throws a `TypeError` if the object contains an invalid type or parameter names. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/content-type.svg -[npm-url]: https://npmjs.org/package/content-type -[node-version-image]: https://img.shields.io/node/v/content-type.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/content-type/master.svg -[travis-url]: https://travis-ci.org/jshttp/content-type -[coveralls-image]: https://img.shields.io/coveralls/jshttp/content-type/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/content-type -[downloads-image]: https://img.shields.io/npm/dm/content-type.svg -[downloads-url]: https://npmjs.org/package/content-type diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/index.js deleted file mode 100644 index 6a2ea9f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/index.js +++ /dev/null @@ -1,214 +0,0 @@ -/*! - * content-type - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1 - * - * parameter = token "=" ( token / quoted-string ) - * token = 1*tchar - * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" - * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" - * / DIGIT / ALPHA - * ; any VCHAR, except delimiters - * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE - * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text - * obs-text = %x80-FF - * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - */ -var paramRegExp = /; *([!#$%&'\*\+\-\.\^_`\|~0-9A-Za-z]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'\*\+\-\.\^_`\|~0-9A-Za-z]+) */g -var textRegExp = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/ -var tokenRegExp = /^[!#$%&'\*\+\-\.\^_`\|~0-9A-Za-z]+$/ - -/** - * RegExp to match quoted-pair in RFC 7230 sec 3.2.6 - * - * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - * obs-text = %x80-FF - */ -var qescRegExp = /\\([\u000b\u0020-\u00ff])/g - -/** - * RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6 - */ -var quoteRegExp = /([\\"])/g - -/** - * RegExp to match type in RFC 6838 - * - * media-type = type "/" subtype - * type = token - * subtype = token - */ -var typeRegExp = /^[!#$%&'\*\+\-\.\^_`\|~0-9A-Za-z]+\/[!#$%&'\*\+\-\.\^_`\|~0-9A-Za-z]+$/ - -/** - * Module exports. - * @public - */ - -exports.format = format -exports.parse = parse - -/** - * Format object to media type. - * - * @param {object} obj - * @return {string} - * @public - */ - -function format(obj) { - if (!obj || typeof obj !== 'object') { - throw new TypeError('argument obj is required') - } - - var parameters = obj.parameters - var type = obj.type - - if (!type || !typeRegExp.test(type)) { - throw new TypeError('invalid type') - } - - var string = type - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - if (!tokenRegExp.test(param)) { - throw new TypeError('invalid parameter name') - } - - string += '; ' + param + '=' + qstring(parameters[param]) - } - } - - return string -} - -/** - * Parse media type to object. - * - * @param {string|object} string - * @return {Object} - * @public - */ - -function parse(string) { - if (!string) { - throw new TypeError('argument string is required') - } - - if (typeof string === 'object') { - // support req/res-like objects as argument - string = getcontenttype(string) - - if (typeof string !== 'string') { - throw new TypeError('content-type header is missing from object'); - } - } - - if (typeof string !== 'string') { - throw new TypeError('argument string is required to be a string') - } - - var index = string.indexOf(';') - var type = index !== -1 - ? string.substr(0, index).trim() - : string.trim() - - if (!typeRegExp.test(type)) { - throw new TypeError('invalid media type') - } - - var key - var match - var obj = new ContentType(type.toLowerCase()) - var value - - paramRegExp.lastIndex = index - - while (match = paramRegExp.exec(string)) { - if (match.index !== index) { - throw new TypeError('invalid parameter format') - } - - index += match[0].length - key = match[1].toLowerCase() - value = match[2] - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(qescRegExp, '$1') - } - - obj.parameters[key] = value - } - - if (index !== -1 && index !== string.length) { - throw new TypeError('invalid parameter format') - } - - return obj -} - -/** - * Get content-type from req/res objects. - * - * @param {object} - * @return {Object} - * @private - */ - -function getcontenttype(obj) { - if (typeof obj.getHeader === 'function') { - // res-like - return obj.getHeader('content-type') - } - - if (typeof obj.headers === 'object') { - // req-like - return obj.headers && obj.headers['content-type'] - } -} - -/** - * Quote a string if necessary. - * - * @param {string} val - * @return {string} - * @private - */ - -function qstring(val) { - var str = String(val) - - // no need to quote tokens - if (tokenRegExp.test(str)) { - return str - } - - if (str.length > 0 && !textRegExp.test(str)) { - throw new TypeError('invalid parameter value') - } - - return '"' + str.replace(quoteRegExp, '\\$1') + '"' -} - -/** - * Class to represent a content type. - * @private - */ -function ContentType(type) { - this.parameters = Object.create(null) - this.type = type -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/package.json deleted file mode 100644 index 9f29142..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/content-type/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "content-type", - "description": "Create and parse HTTP Content-Type header", - "version": "1.0.1", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "content-type", - "http", - "req", - "res", - "rfc7231" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/content-type" - }, - "devDependencies": { - "istanbul": "0.3.5", - "mocha": "~1.21.5" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" - }, - "gitHead": "3aa58f9c5a358a3634b8601602177888b4a477d8", - "bugs": { - "url": "https://github.com/jshttp/content-type/issues" - }, - "homepage": "https://github.com/jshttp/content-type", - "_id": "content-type@1.0.1", - "_shasum": "a19d2247327dc038050ce622b7a154ec59c5e600", - "_from": "content-type@>=1.0.1 <1.1.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "a19d2247327dc038050ce622b7a154ec59c5e600", - "tarball": "http://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/History.md deleted file mode 100644 index 78513cc..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/History.md +++ /dev/null @@ -1,38 +0,0 @@ -1.0.6 / 2015-02-03 -================== - -* use `npm test` instead of `make test` to run tests -* clearer assertion messages when checking input - - -1.0.5 / 2014-09-05 -================== - -* add license to package.json - -1.0.4 / 2014-06-25 -================== - - * corrected avoidance of timing attacks (thanks @tenbits!) - -1.0.3 / 2014-01-28 -================== - - * [incorrect] fix for timing attacks - -1.0.2 / 2014-01-28 -================== - - * fix missing repository warning - * fix typo in test - -1.0.1 / 2013-04-15 -================== - - * Revert "Changed underlying HMAC algo. to sha512." - * Revert "Fix for timing attacks on MAC verification." - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/Readme.md deleted file mode 100644 index 2559e84..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/Readme.md +++ /dev/null @@ -1,42 +0,0 @@ - -# cookie-signature - - Sign and unsign cookies. - -## Example - -```js -var cookie = require('cookie-signature'); - -var val = cookie.sign('hello', 'tobiiscool'); -val.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI'); - -var val = cookie.sign('hello', 'tobiiscool'); -cookie.unsign(val, 'tobiiscool').should.equal('hello'); -cookie.unsign(val, 'luna').should.be.false; -``` - -## License - -(The MIT License) - -Copyright (c) 2012 LearnBoost <tj@learnboost.com> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/index.js deleted file mode 100644 index b8c9463..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/index.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Sign the given `val` with `secret`. - * - * @param {String} val - * @param {String} secret - * @return {String} - * @api private - */ - -exports.sign = function(val, secret){ - if ('string' != typeof val) throw new TypeError("Cookie value must be provided as a string."); - if ('string' != typeof secret) throw new TypeError("Secret string must be provided."); - return val + '.' + crypto - .createHmac('sha256', secret) - .update(val) - .digest('base64') - .replace(/\=+$/, ''); -}; - -/** - * Unsign and decode the given `val` with `secret`, - * returning `false` if the signature is invalid. - * - * @param {String} val - * @param {String} secret - * @return {String|Boolean} - * @api private - */ - -exports.unsign = function(val, secret){ - if ('string' != typeof val) throw new TypeError("Signed cookie string must be provided."); - if ('string' != typeof secret) throw new TypeError("Secret string must be provided."); - var str = val.slice(0, val.lastIndexOf('.')) - , mac = exports.sign(str, secret); - - return sha1(mac) == sha1(val) ? str : false; -}; - -/** - * Private - */ - -function sha1(str){ - return crypto.createHash('sha1').update(str).digest('hex'); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/package.json deleted file mode 100644 index 2b6da14..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie-signature/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "cookie-signature", - "version": "1.0.6", - "description": "Sign and unsign cookies", - "keywords": [ - "cookie", - "sign", - "unsign" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@learnboost.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-cookie-signature.git" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "scripts": { - "test": "mocha --require should --reporter spec" - }, - "main": "index", - "gitHead": "391b56cf44d88c493491b7e3fc53208cfb976d2a", - "bugs": { - "url": "https://github.com/visionmedia/node-cookie-signature/issues" - }, - "homepage": "https://github.com/visionmedia/node-cookie-signature", - "_id": "cookie-signature@1.0.6", - "_shasum": "e303a882b342cc3ee8ca513a79999734dab3ae2c", - "_from": "cookie-signature@1.0.6", - "_npmVersion": "2.3.0", - "_nodeVersion": "0.10.36", - "_npmUser": { - "name": "natevw", - "email": "natevw@yahoo.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "natevw", - "email": "natevw@yahoo.com" - } - ], - "dist": { - "shasum": "e303a882b342cc3ee8ca513a79999734dab3ae2c", - "tarball": "http://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/LICENSE deleted file mode 100644 index 0855435..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2012-2014 Roman Shtylman - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/README.md deleted file mode 100644 index acdb5c2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# cookie - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -cookie is a basic cookie parser and serializer. It doesn't make assumptions about how you are going to deal with your cookies. It basically just provides a way to read and write the HTTP cookie headers. - -See [RFC6265](http://tools.ietf.org/html/rfc6265) for details about the http header for cookies. - -## how? - -``` -npm install cookie -``` - -```javascript -var cookie = require('cookie'); - -var hdr = cookie.serialize('foo', 'bar'); -// hdr = 'foo=bar'; - -var cookies = cookie.parse('foo=bar; cat=meow; dog=ruff'); -// cookies = { foo: 'bar', cat: 'meow', dog: 'ruff' }; -``` - -## more - -The serialize function takes a third parameter, an object, to set cookie options. See the RFC for valid values. - -### path -> cookie path - -### expires -> absolute expiration date for the cookie (Date object) - -### maxAge -> relative max age of the cookie from when the client receives it (seconds) - -### domain -> domain for the cookie - -### secure -> true or false - -### httpOnly -> true or false - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/cookie.svg -[npm-url]: https://npmjs.org/package/cookie -[node-version-image]: https://img.shields.io/node/v/cookie.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/cookie/master.svg -[travis-url]: https://travis-ci.org/jshttp/cookie -[coveralls-image]: https://img.shields.io/coveralls/jshttp/cookie/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/cookie?branch=master -[downloads-image]: https://img.shields.io/npm/dm/cookie.svg -[downloads-url]: https://npmjs.org/package/cookie diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/index.js deleted file mode 100644 index 8dea066..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/index.js +++ /dev/null @@ -1,116 +0,0 @@ -/*! - * cookie - * Copyright(c) 2012-2014 Roman Shtylman - * MIT Licensed - */ - -/** - * Module exports. - * @public - */ - -exports.parse = parse; -exports.serialize = serialize; - -/** - * Module variables. - * @private - */ - -var decode = decodeURIComponent; -var encode = encodeURIComponent; - -/** - * Parse a cookie header. - * - * Parse the given cookie header string into an object - * The object has the various cookies as keys(names) => values - * - * @param {string} str - * @param {object} [options] - * @return {string} - * @public - */ - -function parse(str, options) { - var obj = {} - var opt = options || {}; - var pairs = str.split(/; */); - var dec = opt.decode || decode; - - pairs.forEach(function(pair) { - var eq_idx = pair.indexOf('=') - - // skip things that don't look like key=value - if (eq_idx < 0) { - return; - } - - var key = pair.substr(0, eq_idx).trim() - var val = pair.substr(++eq_idx, pair.length).trim(); - - // quoted values - if ('"' == val[0]) { - val = val.slice(1, -1); - } - - // only assign once - if (undefined == obj[key]) { - obj[key] = tryDecode(val, dec); - } - }); - - return obj; -} - -/** - * Serialize data into a cookie header. - * - * Serialize the a name value pair into a cookie string suitable for - * http headers. An optional options object specified cookie parameters. - * - * serialize('foo', 'bar', { httpOnly: true }) - * => "foo=bar; httpOnly" - * - * @param {string} name - * @param {string} val - * @param {object} [options] - * @return {string} - * @public - */ - -function serialize(name, val, options) { - var opt = options || {}; - var enc = opt.encode || encode; - var pairs = [name + '=' + enc(val)]; - - if (null != opt.maxAge) { - var maxAge = opt.maxAge - 0; - if (isNaN(maxAge)) throw new Error('maxAge should be a Number'); - pairs.push('Max-Age=' + maxAge); - } - - if (opt.domain) pairs.push('Domain=' + opt.domain); - if (opt.path) pairs.push('Path=' + opt.path); - if (opt.expires) pairs.push('Expires=' + opt.expires.toUTCString()); - if (opt.httpOnly) pairs.push('HttpOnly'); - if (opt.secure) pairs.push('Secure'); - - return pairs.join('; '); -} - -/** - * Try decoding a string using a decoding function. - * - * @param {string} str - * @param {function} decode - * @private - */ - -function tryDecode(str, decode) { - try { - return decode(str); - } catch (e) { - return str; - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/package.json deleted file mode 100644 index 8d35b5e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/cookie/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "cookie", - "description": "cookie parsing and serialization", - "version": "0.1.3", - "author": { - "name": "Roman Shtylman", - "email": "shtylman@gmail.com" - }, - "license": "MIT", - "keywords": [ - "cookie", - "cookies" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/cookie" - }, - "devDependencies": { - "istanbul": "0.3.9", - "mocha": "1.x.x" - }, - "files": [ - "LICENSE", - "README.md", - "index.js" - ], - "engines": { - "node": "*" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" - }, - "gitHead": "f46097723c16f920a7b9759e154c34792e1d1a3b", - "bugs": { - "url": "https://github.com/jshttp/cookie/issues" - }, - "homepage": "https://github.com/jshttp/cookie", - "_id": "cookie@0.1.3", - "_shasum": "e734a5c1417fce472d5aef82c381cabb64d1a435", - "_from": "cookie@0.1.3", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "e734a5c1417fce472d5aef82c381cabb64d1a435", - "tarball": "http://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/.jshintrc b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/.jshintrc deleted file mode 100644 index 299877f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/.jshintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "laxbreak": true -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/.npmignore deleted file mode 100644 index 7e6163d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -support -test -examples -example -*.sock -dist diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/History.md deleted file mode 100644 index 854c971..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/History.md +++ /dev/null @@ -1,195 +0,0 @@ - -2.2.0 / 2015-05-09 -================== - - * package: update "ms" to v0.7.1 (#202, @dougwilson) - * README: add logging to file example (#193, @DanielOchoa) - * README: fixed a typo (#191, @amir-s) - * browser: expose `storage` (#190, @stephenmathieson) - * Makefile: add a `distclean` target (#189, @stephenmathieson) - -2.1.3 / 2015-03-13 -================== - - * Updated stdout/stderr example (#186) - * Updated example/stdout.js to match debug current behaviour - * Renamed example/stderr.js to stdout.js - * Update Readme.md (#184) - * replace high intensity foreground color for bold (#182, #183) - -2.1.2 / 2015-03-01 -================== - - * dist: recompile - * update "ms" to v0.7.0 - * package: update "browserify" to v9.0.3 - * component: fix "ms.js" repo location - * changed bower package name - * updated documentation about using debug in a browser - * fix: security error on safari (#167, #168, @yields) - -2.1.1 / 2014-12-29 -================== - - * browser: use `typeof` to check for `console` existence - * browser: check for `console.log` truthiness (fix IE 8/9) - * browser: add support for Chrome apps - * Readme: added Windows usage remarks - * Add `bower.json` to properly support bower install - -2.1.0 / 2014-10-15 -================== - - * node: implement `DEBUG_FD` env variable support - * package: update "browserify" to v6.1.0 - * package: add "license" field to package.json (#135, @panuhorsmalahti) - -2.0.0 / 2014-09-01 -================== - - * package: update "browserify" to v5.11.0 - * node: use stderr rather than stdout for logging (#29, @stephenmathieson) - -1.0.4 / 2014-07-15 -================== - - * dist: recompile - * example: remove `console.info()` log usage - * example: add "Content-Type" UTF-8 header to browser example - * browser: place %c marker after the space character - * browser: reset the "content" color via `color: inherit` - * browser: add colors support for Firefox >= v31 - * debug: prefer an instance `log()` function over the global one (#119) - * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) - -1.0.3 / 2014-07-09 -================== - - * Add support for multiple wildcards in namespaces (#122, @seegno) - * browser: fix lint - -1.0.2 / 2014-06-10 -================== - - * browser: update color palette (#113, @gscottolson) - * common: make console logging function configurable (#108, @timoxley) - * node: fix %o colors on old node <= 0.8.x - * Makefile: find node path using shell/which (#109, @timoxley) - -1.0.1 / 2014-06-06 -================== - - * browser: use `removeItem()` to clear localStorage - * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) - * package: add "contributors" section - * node: fix comment typo - * README: list authors - -1.0.0 / 2014-06-04 -================== - - * make ms diff be global, not be scope - * debug: ignore empty strings in enable() - * node: make DEBUG_COLORS able to disable coloring - * *: export the `colors` array - * npmignore: don't publish the `dist` dir - * Makefile: refactor to use browserify - * package: add "browserify" as a dev dependency - * Readme: add Web Inspector Colors section - * node: reset terminal color for the debug content - * node: map "%o" to `util.inspect()` - * browser: map "%j" to `JSON.stringify()` - * debug: add custom "formatters" - * debug: use "ms" module for humanizing the diff - * Readme: add "bash" syntax highlighting - * browser: add Firebug color support - * browser: add colors for WebKit browsers - * node: apply log to `console` - * rewrite: abstract common logic for Node & browsers - * add .jshintrc file - -0.8.1 / 2014-04-14 -================== - - * package: re-add the "component" section - -0.8.0 / 2014-03-30 -================== - - * add `enable()` method for nodejs. Closes #27 - * change from stderr to stdout - * remove unnecessary index.js file - -0.7.4 / 2013-11-13 -================== - - * remove "browserify" key from package.json (fixes something in browserify) - -0.7.3 / 2013-10-30 -================== - - * fix: catch localStorage security error when cookies are blocked (Chrome) - * add debug(err) support. Closes #46 - * add .browser prop to package.json. Closes #42 - -0.7.2 / 2013-02-06 -================== - - * fix package.json - * fix: Mobile Safari (private mode) is broken with debug - * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript - -0.7.1 / 2013-02-05 -================== - - * add repository URL to package.json - * add DEBUG_COLORED to force colored output - * add browserify support - * fix component. Closes #24 - -0.7.0 / 2012-05-04 -================== - - * Added .component to package.json - * Added debug.component.js build - -0.6.0 / 2012-03-16 -================== - - * Added support for "-" prefix in DEBUG [Vinay Pulim] - * Added `.enabled` flag to the node version [TooTallNate] - -0.5.0 / 2012-02-02 -================== - - * Added: humanize diffs. Closes #8 - * Added `debug.disable()` to the CS variant - * Removed padding. Closes #10 - * Fixed: persist client-side variant again. Closes #9 - -0.4.0 / 2012-02-01 -================== - - * Added browser variant support for older browsers [TooTallNate] - * Added `debug.enable('project:*')` to browser variant [TooTallNate] - * Added padding to diff (moved it to the right) - -0.3.0 / 2012-01-26 -================== - - * Added millisecond diff when isatty, otherwise UTC string - -0.2.0 / 2012-01-22 -================== - - * Added wildcard support - -0.1.0 / 2011-12-02 -================== - - * Added: remove colors unless stderr isatty [TooTallNate] - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/Makefile deleted file mode 100644 index 5cf4a59..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/Makefile +++ /dev/null @@ -1,36 +0,0 @@ - -# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 -THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) -THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) - -# BIN directory -BIN := $(THIS_DIR)/node_modules/.bin - -# applications -NODE ?= $(shell which node) -NPM ?= $(NODE) $(shell which npm) -BROWSERIFY ?= $(NODE) $(BIN)/browserify - -all: dist/debug.js - -install: node_modules - -clean: - @rm -rf dist - -dist: - @mkdir -p $@ - -dist/debug.js: node_modules browser.js debug.js dist - @$(BROWSERIFY) \ - --standalone debug \ - . > $@ - -distclean: clean - @rm -rf node_modules - -node_modules: package.json - @NODE_ENV= $(NPM) install - @touch node_modules - -.PHONY: all install clean distclean diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/Readme.md deleted file mode 100644 index b4f45e3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/Readme.md +++ /dev/null @@ -1,188 +0,0 @@ -# debug - - tiny node.js debugging utility modelled after node core's debugging technique. - -## Installation - -```bash -$ npm install debug -``` - -## Usage - - With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility. - -Example _app.js_: - -```js -var debug = require('debug')('http') - , http = require('http') - , name = 'My App'; - -// fake app - -debug('booting %s', name); - -http.createServer(function(req, res){ - debug(req.method + ' ' + req.url); - res.end('hello\n'); -}).listen(3000, function(){ - debug('listening'); -}); - -// fake worker of some kind - -require('./worker'); -``` - -Example _worker.js_: - -```js -var debug = require('debug')('worker'); - -setInterval(function(){ - debug('doing some work'); -}, 1000); -``` - - The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: - - ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) - - ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) - -#### Windows note - - On Windows the environment variable is set using the `set` command. - - ```cmd - set DEBUG=*,-not_this - ``` - -Then, run the program to be debugged as usual. - -## Millisecond diff - - When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. - - ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) - - When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: - - ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) - -## Conventions - - If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". - -## Wildcards - - The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. - - You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:". - -## Browser support - - Debug works in the browser as well, currently persisted by `localStorage`. Consider the situation shown below where you have `worker:a` and `worker:b`, and wish to debug both. Somewhere in the code on your page, include: - -```js -window.myDebug = require("debug"); -``` - - ("debug" is a global object in the browser so we give this object a different name.) When your page is open in the browser, type the following in the console: - -```js -myDebug.enable("worker:*") -``` - - Refresh the page. Debug output will continue to be sent to the console until it is disabled by typing `myDebug.disable()` in the console. - -```js -a = debug('worker:a'); -b = debug('worker:b'); - -setInterval(function(){ - a('doing some work'); -}, 1000); - -setInterval(function(){ - b('doing some work'); -}, 1200); -``` - -#### Web Inspector Colors - - Colors are also enabled on "Web Inspectors" that understand the `%c` formatting - option. These are WebKit web inspectors, Firefox ([since version - 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) - and the Firebug plugin for Firefox (any version). - - Colored output looks something like: - - ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) - -### stderr vs stdout - -You can set an alternative logging method per-namespace by overriding the `log` method on a per-namespace or globally: - -Example _stdout.js_: - -```js -var debug = require('debug'); -var error = debug('app:error'); - -// by default stderr is used -error('goes to stderr!'); - -var log = debug('app:log'); -// set this namespace to log via console.log -log.log = console.log.bind(console); // don't forget to bind to console! -log('goes to stdout'); -error('still goes to stderr!'); - -// set all output to go via console.info -// overrides all per-namespace log settings -debug.log = console.info.bind(console); -error('now goes to stdout via console.info'); -log('still goes to stdout, but via console.info now'); -``` - -### Save debug output to a file - -You can save all debug statements to a file by piping them. - -Example: - -```bash -$ DEBUG_FD=3 node your-app.js 3> whatever.log -``` - -## Authors - - - TJ Holowaychuk - - Nathan Rajlich - -## License - -(The MIT License) - -Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/bower.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/bower.json deleted file mode 100644 index 6af573f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/bower.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "visionmedia-debug", - "main": "dist/debug.js", - "version": "2.2.0", - "homepage": "https://github.com/visionmedia/debug", - "authors": [ - "TJ Holowaychuk " - ], - "description": "visionmedia-debug", - "moduleType": [ - "amd", - "es6", - "globals", - "node" - ], - "keywords": [ - "visionmedia", - "debug" - ], - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/browser.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/browser.js deleted file mode 100644 index 7c76452..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/browser.js +++ /dev/null @@ -1,168 +0,0 @@ - -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = 'undefined' != typeof chrome - && 'undefined' != typeof chrome.storage - ? chrome.storage.local - : localstorage(); - -/** - * Colors. - */ - -exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // is webkit? http://stackoverflow.com/a/16459606/376773 - return ('WebkitAppearance' in document.documentElement.style) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (window.console && (console.firebug || (console.exception && console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - return JSON.stringify(v); -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs() { - var args = arguments; - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return args; - - var c = 'color: ' + this.color; - args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1)); - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); - return args; -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // this hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return 'object' === typeof console - && console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - exports.storage.removeItem('debug'); - } else { - exports.storage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - var r; - try { - r = exports.storage.debug; - } catch(e) {} - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); - -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - -function localstorage(){ - try { - return window.localStorage; - } catch (e) {} -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/component.json deleted file mode 100644 index ca10637..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/component.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "debug", - "repo": "visionmedia/debug", - "description": "small debugging utility", - "version": "2.2.0", - "keywords": [ - "debug", - "log", - "debugger" - ], - "main": "browser.js", - "scripts": [ - "browser.js", - "debug.js" - ], - "dependencies": { - "rauchg/ms.js": "0.7.1" - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/debug.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/debug.js deleted file mode 100644 index 7571a86..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/debug.js +++ /dev/null @@ -1,197 +0,0 @@ - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = debug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = require('ms'); - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lowercased letter, i.e. "n". - */ - -exports.formatters = {}; - -/** - * Previously assigned color. - */ - -var prevColor = 0; - -/** - * Previous log timestamp. - */ - -var prevTime; - -/** - * Select a color. - * - * @return {Number} - * @api private - */ - -function selectColor() { - return exports.colors[prevColor++ % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function debug(namespace) { - - // define the `disabled` version - function disabled() { - } - disabled.enabled = false; - - // define the `enabled` version - function enabled() { - - var self = enabled; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // add the `color` if not set - if (null == self.useColors) self.useColors = exports.useColors(); - if (null == self.color && self.useColors) self.color = selectColor(); - - var args = Array.prototype.slice.call(arguments); - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %o - args = ['%o'].concat(args); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - if ('function' === typeof exports.formatArgs) { - args = exports.formatArgs.apply(self, args); - } - var logFn = enabled.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - enabled.enabled = true; - - var fn = exports.enabled(namespace) ? enabled : disabled; - - fn.namespace = namespace; - - return fn; -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - var split = (namespaces || '').split(/[\s,]+/); - var len = split.length; - - for (var i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node.js deleted file mode 100644 index 1d392a8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node.js +++ /dev/null @@ -1,209 +0,0 @@ - -/** - * Module dependencies. - */ - -var tty = require('tty'); -var util = require('util'); - -/** - * This is the Node.js implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -/** - * The file descriptor to write the `debug()` calls to. - * Set the `DEBUG_FD` env variable to override with another value. i.e.: - * - * $ DEBUG_FD=3 node script.js 3>debug.log - */ - -var fd = parseInt(process.env.DEBUG_FD, 10) || 2; -var stream = 1 === fd ? process.stdout : - 2 === fd ? process.stderr : - createWritableStdioStream(fd); - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - var debugColors = (process.env.DEBUG_COLORS || '').trim().toLowerCase(); - if (0 === debugColors.length) { - return tty.isatty(fd); - } else { - return '0' !== debugColors - && 'no' !== debugColors - && 'false' !== debugColors - && 'disabled' !== debugColors; - } -} - -/** - * Map %o to `util.inspect()`, since Node doesn't do that out of the box. - */ - -var inspect = (4 === util.inspect.length ? - // node <= 0.8.x - function (v, colors) { - return util.inspect(v, void 0, void 0, colors); - } : - // node > 0.8.x - function (v, colors) { - return util.inspect(v, { colors: colors }); - } -); - -exports.formatters.o = function(v) { - return inspect(v, this.useColors) - .replace(/\s*\n\s*/g, ' '); -}; - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs() { - var args = arguments; - var useColors = this.useColors; - var name = this.namespace; - - if (useColors) { - var c = this.color; - - args[0] = ' \u001b[3' + c + ';1m' + name + ' ' - + '\u001b[0m' - + args[0] + '\u001b[3' + c + 'm' - + ' +' + exports.humanize(this.diff) + '\u001b[0m'; - } else { - args[0] = new Date().toUTCString() - + ' ' + name + ' ' + args[0]; - } - return args; -} - -/** - * Invokes `console.error()` with the specified arguments. - */ - -function log() { - return stream.write(util.format.apply(this, arguments) + '\n'); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Copied from `node/src/node.js`. - * - * XXX: It's lame that node doesn't expose this API out-of-the-box. It also - * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. - */ - -function createWritableStdioStream (fd) { - var stream; - var tty_wrap = process.binding('tty_wrap'); - - // Note stream._type is used for test-module-load-list.js - - switch (tty_wrap.guessHandleType(fd)) { - case 'TTY': - stream = new tty.WriteStream(fd); - stream._type = 'tty'; - - // Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - case 'FILE': - var fs = require('fs'); - stream = new fs.SyncWriteStream(fd, { autoClose: false }); - stream._type = 'fs'; - break; - - case 'PIPE': - case 'TCP': - var net = require('net'); - stream = new net.Socket({ - fd: fd, - readable: false, - writable: true - }); - - // FIXME Should probably have an option in net.Socket to create a - // stream from an existing fd which is writable only. But for now - // we'll just add this hack and set the `readable` member to false. - // Test: ./node test/fixtures/echo.js < /etc/passwd - stream.readable = false; - stream.read = null; - stream._type = 'pipe'; - - // FIXME Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - default: - // Probably an error on in uv_guess_handle() - throw new Error('Implement me. Unknown stream file type!'); - } - - // For supporting legacy API we put the FD here. - stream.fd = fd; - - stream._isStdio = true; - - return stream; -} - -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ - -exports.enable(load()); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/History.md deleted file mode 100644 index 32fdfc1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/History.md +++ /dev/null @@ -1,66 +0,0 @@ - -0.7.1 / 2015-04-20 -================== - - * prevent extraordinary long inputs (@evilpacket) - * Fixed broken readme link - -0.7.0 / 2014-11-24 -================== - - * add time abbreviations, updated tests and readme for the new units - * fix example in the readme. - * add LICENSE file - -0.6.2 / 2013-12-05 -================== - - * Adding repository section to package.json to suppress warning from NPM. - -0.6.1 / 2013-05-10 -================== - - * fix singularization [visionmedia] - -0.6.0 / 2013-03-15 -================== - - * fix minutes - -0.5.1 / 2013-02-24 -================== - - * add component namespace - -0.5.0 / 2012-11-09 -================== - - * add short formatting as default and .long option - * add .license property to component.json - * add version to component.json - -0.4.0 / 2012-10-22 -================== - - * add rounding to fix crazy decimals - -0.3.0 / 2012-09-07 -================== - - * fix `ms()` [visionmedia] - -0.2.0 / 2012-09-03 -================== - - * add component.json [visionmedia] - * add days support [visionmedia] - * add hours support [visionmedia] - * add minutes support [visionmedia] - * add seconds support [visionmedia] - * add ms string support [visionmedia] - * refactor tests to facilitate ms(number) [visionmedia] - -0.1.0 / 2012-03-07 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/LICENSE deleted file mode 100644 index 6c07561..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Guillermo Rauch - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/README.md deleted file mode 100644 index 9b4fd03..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('2 days') // 172800000 -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2.5 hrs') // 9000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours'), { long: true }) // "10 hours" -``` - -- Node/Browser compatible. Published as [`ms`](https://www.npmjs.org/package/ms) in [NPM](http://nodejs.org/download). -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/index.js deleted file mode 100644 index 4f92771..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/index.js +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = '' + str; - if (str.length > 10000) return; - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/package.json deleted file mode 100644 index 253335e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/node_modules/ms/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "ms", - "version": "0.7.1", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "gitHead": "713dcf26d9e6fd9dbc95affe7eff9783b7f1b909", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "homepage": "https://github.com/guille/ms.js", - "_id": "ms@0.7.1", - "scripts": {}, - "_shasum": "9cd13c03adbff25b65effde7ce864ee952017098", - "_from": "ms@0.7.1", - "_npmVersion": "2.7.5", - "_nodeVersion": "0.12.2", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "dist": { - "shasum": "9cd13c03adbff25b65effde7ce864ee952017098", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/package.json deleted file mode 100644 index 24bb9c9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/debug/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "debug", - "version": "2.2.0", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/debug.git" - }, - "description": "small debugging utility", - "keywords": [ - "debug", - "log", - "debugger" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Nathan Rajlich", - "email": "nathan@tootallnate.net", - "url": "http://n8.io" - } - ], - "license": "MIT", - "dependencies": { - "ms": "0.7.1" - }, - "devDependencies": { - "browserify": "9.0.3", - "mocha": "*" - }, - "main": "./node.js", - "browser": "./browser.js", - "component": { - "scripts": { - "debug/index.js": "browser.js", - "debug/debug.js": "debug.js" - } - }, - "gitHead": "b38458422b5aa8aa6d286b10dfe427e8a67e2b35", - "bugs": { - "url": "https://github.com/visionmedia/debug/issues" - }, - "homepage": "https://github.com/visionmedia/debug", - "_id": "debug@2.2.0", - "scripts": {}, - "_shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da", - "_from": "debug@>=2.2.0 <2.3.0", - "_npmVersion": "2.7.4", - "_nodeVersion": "0.12.2", - "_npmUser": { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - } - ], - "dist": { - "shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da", - "tarball": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/History.md deleted file mode 100644 index 4a36a6c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/History.md +++ /dev/null @@ -1,75 +0,0 @@ -1.0.1 / 2015-04-07 -================== - - * Fix `TypeError`s when under `'use strict'` code - * Fix useless type name on auto-generated messages - * Support io.js 1.x - * Support Node.js 0.12 - -1.0.0 / 2014-09-17 -================== - - * No changes - -0.4.5 / 2014-09-09 -================== - - * Improve call speed to functions using the function wrapper - * Support Node.js 0.6 - -0.4.4 / 2014-07-27 -================== - - * Work-around v8 generating empty stack traces - -0.4.3 / 2014-07-26 -================== - - * Fix exception when global `Error.stackTraceLimit` is too low - -0.4.2 / 2014-07-19 -================== - - * Correct call site for wrapped functions and properties - -0.4.1 / 2014-07-19 -================== - - * Improve automatic message generation for function properties - -0.4.0 / 2014-07-19 -================== - - * Add `TRACE_DEPRECATION` environment variable - * Remove non-standard grey color from color output - * Support `--no-deprecation` argument - * Support `--trace-deprecation` argument - * Support `deprecate.property(fn, prop, message)` - -0.3.0 / 2014-06-16 -================== - - * Add `NO_DEPRECATION` environment variable - -0.2.0 / 2014-06-15 -================== - - * Add `deprecate.property(obj, prop, message)` - * Remove `supports-color` dependency for node.js 0.8 - -0.1.0 / 2014-06-15 -================== - - * Add `deprecate.function(fn, message)` - * Add `process.on('deprecation', fn)` emitter - * Automatically generate message when omitted from `deprecate()` - -0.0.1 / 2014-06-15 -================== - - * Fix warning for dynamic calls at singe call site - -0.0.0 / 2014-06-15 -================== - - * Initial implementation diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/Readme.md deleted file mode 100644 index 5ead5da..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/Readme.md +++ /dev/null @@ -1,274 +0,0 @@ -# depd - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Downloads][npm-downloads-image]][npm-url] -[![Node.js Version][node-image]][node-url] -[![Linux Build][travis-image]][travis-url] -[![Windows Build][appveyor-image]][appveyor-url] -[![Coverage Status][coveralls-image]][coveralls-url] -[![Gratipay][gratipay-image]][gratipay-url] - -Deprecate all the things - -> With great modules comes great responsibility; mark things deprecated! - -## Install - -```sh -$ npm install depd -``` - -## API - -```js -var deprecate = require('depd')('my-module') -``` - -This library allows you to display deprecation messages to your users. -This library goes above and beyond with deprecation warnings by -introspection of the call stack (but only the bits that it is interested -in). - -Instead of just warning on the first invocation of a deprecated -function and never again, this module will warn on the first invocation -of a deprecated function per unique call site, making it ideal to alert -users of all deprecated uses across the code base, rather than just -whatever happens to execute first. - -The deprecation warnings from this module also include the file and line -information for the call into the module that the deprecated function was -in. - -**NOTE** this library has a similar interface to the `debug` module, and -this module uses the calling file to get the boundary for the call stacks, -so you should always create a new `deprecate` object in each file and not -within some central file. - -### depd(namespace) - -Create a new deprecate function that uses the given namespace name in the -messages and will display the call site prior to the stack entering the -file this function was called from. It is highly suggested you use the -name of your module as the namespace. - -### deprecate(message) - -Call this function from deprecated code to display a deprecation message. -This message will appear once per unique caller site. Caller site is the -first call site in the stack in a different file from the caller of this -function. - -If the message is omitted, a message is generated for you based on the site -of the `deprecate()` call and will display the name of the function called, -similar to the name displayed in a stack trace. - -### deprecate.function(fn, message) - -Call this function to wrap a given function in a deprecation message on any -call to the function. An optional message can be supplied to provide a custom -message. - -### deprecate.property(obj, prop, message) - -Call this function to wrap a given property on object in a deprecation message -on any accessing or setting of the property. An optional message can be supplied -to provide a custom message. - -The method must be called on the object where the property belongs (not -inherited from the prototype). - -If the property is a data descriptor, it will be converted to an accessor -descriptor in order to display the deprecation message. - -### process.on('deprecation', fn) - -This module will allow easy capturing of deprecation errors by emitting the -errors as the type "deprecation" on the global `process`. If there are no -listeners for this type, the errors are written to STDERR as normal, but if -there are any listeners, nothing will be written to STDERR and instead only -emitted. From there, you can write the errors in a different format or to a -logging source. - -The error represents the deprecation and is emitted only once with the same -rules as writing to STDERR. The error has the following properties: - - - `message` - This is the message given by the library - - `name` - This is always `'DeprecationError'` - - `namespace` - This is the namespace the deprecation came from - - `stack` - This is the stack of the call to the deprecated thing - -Example `error.stack` output: - -``` -DeprecationError: my-cool-module deprecated oldfunction - at Object. ([eval]-wrapper:6:22) - at Module._compile (module.js:456:26) - at evalScript (node.js:532:25) - at startup (node.js:80:7) - at node.js:902:3 -``` - -### process.env.NO_DEPRECATION - -As a user of modules that are deprecated, the environment variable `NO_DEPRECATION` -is provided as a quick solution to silencing deprecation warnings from being -output. The format of this is similar to that of `DEBUG`: - -```sh -$ NO_DEPRECATION=my-module,othermod node app.js -``` - -This will suppress deprecations from being output for "my-module" and "othermod". -The value is a list of comma-separated namespaces. To suppress every warning -across all namespaces, use the value `*` for a namespace. - -Providing the argument `--no-deprecation` to the `node` executable will suppress -all deprecations (only available in Node.js 0.8 or higher). - -**NOTE** This will not suppress the deperecations given to any "deprecation" -event listeners, just the output to STDERR. - -### process.env.TRACE_DEPRECATION - -As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION` -is provided as a solution to getting more detailed location information in deprecation -warnings by including the entire stack trace. The format of this is the same as -`NO_DEPRECATION`: - -```sh -$ TRACE_DEPRECATION=my-module,othermod node app.js -``` - -This will include stack traces for deprecations being output for "my-module" and -"othermod". The value is a list of comma-separated namespaces. To trace every -warning across all namespaces, use the value `*` for a namespace. - -Providing the argument `--trace-deprecation` to the `node` executable will trace -all deprecations (only available in Node.js 0.8 or higher). - -**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`. - -## Display - -![message](files/message.png) - -When a user calls a function in your library that you mark deprecated, they -will see the following written to STDERR (in the given colors, similar colors -and layout to the `debug` module): - -``` -bright cyan bright yellow -| | reset cyan -| | | | -▼ ▼ ▼ ▼ -my-cool-module deprecated oldfunction [eval]-wrapper:6:22 -▲ ▲ ▲ ▲ -| | | | -namespace | | location of mycoolmod.oldfunction() call - | deprecation message - the word "deprecated" -``` - -If the user redirects their STDERR to a file or somewhere that does not support -colors, they see (similar layout to the `debug` module): - -``` -Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22 -▲ ▲ ▲ ▲ ▲ -| | | | | -timestamp of message namespace | | location of mycoolmod.oldfunction() call - | deprecation message - the word "deprecated" -``` - -## Examples - -### Deprecating all calls to a function - -This will display a deprecated message about "oldfunction" being deprecated -from "my-module" on STDERR. - -```js -var deprecate = require('depd')('my-cool-module') - -// message automatically derived from function name -// Object.oldfunction -exports.oldfunction = deprecate.function(function oldfunction() { - // all calls to function are deprecated -}) - -// specific message -exports.oldfunction = deprecate.function(function () { - // all calls to function are deprecated -}, 'oldfunction') -``` - -### Conditionally deprecating a function call - -This will display a deprecated message about "weirdfunction" being deprecated -from "my-module" on STDERR when called with less than 2 arguments. - -```js -var deprecate = require('depd')('my-cool-module') - -exports.weirdfunction = function () { - if (arguments.length < 2) { - // calls with 0 or 1 args are deprecated - deprecate('weirdfunction args < 2') - } -} -``` - -When calling `deprecate` as a function, the warning is counted per call site -within your own module, so you can display different deprecations depending -on different situations and the users will still get all the warnings: - -```js -var deprecate = require('depd')('my-cool-module') - -exports.weirdfunction = function () { - if (arguments.length < 2) { - // calls with 0 or 1 args are deprecated - deprecate('weirdfunction args < 2') - } else if (typeof arguments[0] !== 'string') { - // calls with non-string first argument are deprecated - deprecate('weirdfunction non-string first arg') - } -} -``` - -### Deprecating property access - -This will display a deprecated message about "oldprop" being deprecated -from "my-module" on STDERR when accessed. A deprecation will be displayed -when setting the value and when getting the value. - -```js -var deprecate = require('depd')('my-cool-module') - -exports.oldprop = 'something' - -// message automatically derives from property name -deprecate.property(exports, 'oldprop') - -// explicit message -deprecate.property(exports, 'oldprop', 'oldprop >= 0.10') -``` - -## License - -[MIT](LICENSE) - -[npm-version-image]: https://img.shields.io/npm/v/depd.svg -[npm-downloads-image]: https://img.shields.io/npm/dm/depd.svg -[npm-url]: https://npmjs.org/package/depd -[travis-image]: https://img.shields.io/travis/dougwilson/nodejs-depd/master.svg?label=linux -[travis-url]: https://travis-ci.org/dougwilson/nodejs-depd -[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/nodejs-depd/master.svg?label=windows -[appveyor-url]: https://ci.appveyor.com/project/dougwilson/nodejs-depd -[coveralls-image]: https://img.shields.io/coveralls/dougwilson/nodejs-depd/master.svg -[coveralls-url]: https://coveralls.io/r/dougwilson/nodejs-depd?branch=master -[node-image]: https://img.shields.io/node/v/depd.svg -[node-url]: http://nodejs.org/download/ -[gratipay-image]: https://img.shields.io/gratipay/dougwilson.svg -[gratipay-url]: https://www.gratipay.com/dougwilson/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/index.js deleted file mode 100644 index d183b0a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/index.js +++ /dev/null @@ -1,529 +0,0 @@ -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var callSiteToString = require('./lib/compat').callSiteToString -var EventEmitter = require('events').EventEmitter -var relative = require('path').relative - -/** - * Module exports. - */ - -module.exports = depd - -/** - * Get the path to base files on. - */ - -var basePath = process.cwd() - -/** - * Get listener count on event emitter. - */ - -/*istanbul ignore next*/ -var eventListenerCount = EventEmitter.listenerCount - || function (emitter, type) { return emitter.listeners(type).length } - -/** - * Determine if namespace is contained in the string. - */ - -function containsNamespace(str, namespace) { - var val = str.split(/[ ,]+/) - - namespace = String(namespace).toLowerCase() - - for (var i = 0 ; i < val.length; i++) { - if (!(str = val[i])) continue; - - // namespace contained - if (str === '*' || str.toLowerCase() === namespace) { - return true - } - } - - return false -} - -/** - * Convert a data descriptor to accessor descriptor. - */ - -function convertDataDescriptorToAccessor(obj, prop, message) { - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - var value = descriptor.value - - descriptor.get = function getter() { return value } - - if (descriptor.writable) { - descriptor.set = function setter(val) { return value = val } - } - - delete descriptor.value - delete descriptor.writable - - Object.defineProperty(obj, prop, descriptor) - - return descriptor -} - -/** - * Create arguments string to keep arity. - */ - -function createArgumentsString(arity) { - var str = '' - - for (var i = 0; i < arity; i++) { - str += ', arg' + i - } - - return str.substr(2) -} - -/** - * Create stack string from stack. - */ - -function createStackString(stack) { - var str = this.name + ': ' + this.namespace - - if (this.message) { - str += ' deprecated ' + this.message - } - - for (var i = 0; i < stack.length; i++) { - str += '\n at ' + callSiteToString(stack[i]) - } - - return str -} - -/** - * Create deprecate for namespace in caller. - */ - -function depd(namespace) { - if (!namespace) { - throw new TypeError('argument namespace is required') - } - - var stack = getStack() - var site = callSiteLocation(stack[1]) - var file = site[0] - - function deprecate(message) { - // call to self as log - log.call(deprecate, message) - } - - deprecate._file = file - deprecate._ignored = isignored(namespace) - deprecate._namespace = namespace - deprecate._traced = istraced(namespace) - deprecate._warned = Object.create(null) - - deprecate.function = wrapfunction - deprecate.property = wrapproperty - - return deprecate -} - -/** - * Determine if namespace is ignored. - */ - -function isignored(namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.noDeprecation) { - // --no-deprecation support - return true - } - - var str = process.env.NO_DEPRECATION || '' - - // namespace ignored - return containsNamespace(str, namespace) -} - -/** - * Determine if namespace is traced. - */ - -function istraced(namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.traceDeprecation) { - // --trace-deprecation support - return true - } - - var str = process.env.TRACE_DEPRECATION || '' - - // namespace traced - return containsNamespace(str, namespace) -} - -/** - * Display deprecation message. - */ - -function log(message, site) { - var haslisteners = eventListenerCount(process, 'deprecation') !== 0 - - // abort early if no destination - if (!haslisteners && this._ignored) { - return - } - - var caller - var callFile - var callSite - var i = 0 - var seen = false - var stack = getStack() - var file = this._file - - if (site) { - // provided site - callSite = callSiteLocation(stack[1]) - callSite.name = site.name - file = callSite[0] - } else { - // get call site - i = 2 - site = callSiteLocation(stack[i]) - callSite = site - } - - // get caller of deprecated thing in relation to file - for (; i < stack.length; i++) { - caller = callSiteLocation(stack[i]) - callFile = caller[0] - - if (callFile === file) { - seen = true - } else if (callFile === this._file) { - file = this._file - } else if (seen) { - break - } - } - - var key = caller - ? site.join(':') + '__' + caller.join(':') - : undefined - - if (key !== undefined && key in this._warned) { - // already warned - return - } - - this._warned[key] = true - - // generate automatic message from call site - if (!message) { - message = callSite === site || !callSite.name - ? defaultMessage(site) - : defaultMessage(callSite) - } - - // emit deprecation if listeners exist - if (haslisteners) { - var err = DeprecationError(this._namespace, message, stack.slice(i)) - process.emit('deprecation', err) - return - } - - // format and write message - var format = process.stderr.isTTY - ? formatColor - : formatPlain - var msg = format.call(this, message, caller, stack.slice(i)) - process.stderr.write(msg + '\n', 'utf8') - - return -} - -/** - * Get call site location as array. - */ - -function callSiteLocation(callSite) { - var file = callSite.getFileName() || '' - var line = callSite.getLineNumber() - var colm = callSite.getColumnNumber() - - if (callSite.isEval()) { - file = callSite.getEvalOrigin() + ', ' + file - } - - var site = [file, line, colm] - - site.callSite = callSite - site.name = callSite.getFunctionName() - - return site -} - -/** - * Generate a default message from the site. - */ - -function defaultMessage(site) { - var callSite = site.callSite - var funcName = site.name - - // make useful anonymous name - if (!funcName) { - funcName = '' - } - - var context = callSite.getThis() - var typeName = context && callSite.getTypeName() - - // ignore useless type name - if (typeName === 'Object') { - typeName = undefined - } - - // make useful type name - if (typeName === 'Function') { - typeName = context.name || typeName - } - - return typeName && callSite.getMethodName() - ? typeName + '.' + funcName - : funcName -} - -/** - * Format deprecation message without color. - */ - -function formatPlain(msg, caller, stack) { - var timestamp = new Date().toUTCString() - - var formatted = timestamp - + ' ' + this._namespace - + ' deprecated ' + msg - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n at ' + callSiteToString(stack[i]) - } - - return formatted - } - - if (caller) { - formatted += ' at ' + formatLocation(caller) - } - - return formatted -} - -/** - * Format deprecation message with color. - */ - -function formatColor(msg, caller, stack) { - var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' // bold cyan - + ' \x1b[33;1mdeprecated\x1b[22;39m' // bold yellow - + ' \x1b[0m' + msg + '\x1b[39m' // reset - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n \x1b[36mat ' + callSiteToString(stack[i]) + '\x1b[39m' // cyan - } - - return formatted - } - - if (caller) { - formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan - } - - return formatted -} - -/** - * Format call site location. - */ - -function formatLocation(callSite) { - return relative(basePath, callSite[0]) - + ':' + callSite[1] - + ':' + callSite[2] -} - -/** - * Get the stack as array of call sites. - */ - -function getStack() { - var limit = Error.stackTraceLimit - var obj = {} - var prep = Error.prepareStackTrace - - Error.prepareStackTrace = prepareObjectStackTrace - Error.stackTraceLimit = Math.max(10, limit) - - // capture the stack - Error.captureStackTrace(obj) - - // slice this function off the top - var stack = obj.stack.slice(1) - - Error.prepareStackTrace = prep - Error.stackTraceLimit = limit - - return stack -} - -/** - * Capture call site stack from v8. - */ - -function prepareObjectStackTrace(obj, stack) { - return stack -} - -/** - * Return a wrapped function in a deprecation message. - */ - -function wrapfunction(fn, message) { - if (typeof fn !== 'function') { - throw new TypeError('argument fn must be a function') - } - - var args = createArgumentsString(fn.length) - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - site.name = fn.name - - var deprecatedfn = eval('(function (' + args + ') {\n' - + '"use strict"\n' - + 'log.call(deprecate, message, site)\n' - + 'return fn.apply(this, arguments)\n' - + '})') - - return deprecatedfn -} - -/** - * Wrap property in a deprecation message. - */ - -function wrapproperty(obj, prop, message) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - throw new TypeError('argument obj must be object') - } - - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - - if (!descriptor) { - throw new TypeError('must call property on owner object') - } - - if (!descriptor.configurable) { - throw new TypeError('property must be configurable') - } - - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - // set site name - site.name = prop - - // convert data descriptor - if ('value' in descriptor) { - descriptor = convertDataDescriptorToAccessor(obj, prop, message) - } - - var get = descriptor.get - var set = descriptor.set - - // wrap getter - if (typeof get === 'function') { - descriptor.get = function getter() { - log.call(deprecate, message, site) - return get.apply(this, arguments) - } - } - - // wrap setter - if (typeof set === 'function') { - descriptor.set = function setter() { - log.call(deprecate, message, site) - return set.apply(this, arguments) - } - } - - Object.defineProperty(obj, prop, descriptor) -} - -/** - * Create DeprecationError for deprecation - */ - -function DeprecationError(namespace, message, stack) { - var error = new Error() - var stackString - - Object.defineProperty(error, 'constructor', { - value: DeprecationError - }) - - Object.defineProperty(error, 'message', { - configurable: true, - enumerable: false, - value: message, - writable: true - }) - - Object.defineProperty(error, 'name', { - enumerable: false, - configurable: true, - value: 'DeprecationError', - writable: true - }) - - Object.defineProperty(error, 'namespace', { - configurable: true, - enumerable: false, - value: namespace, - writable: true - }) - - Object.defineProperty(error, 'stack', { - configurable: true, - enumerable: false, - get: function () { - if (stackString !== undefined) { - return stackString - } - - // prepare stack trace - return stackString = createStackString.call(this, stack) - }, - set: function setter(val) { - stackString = val - } - }) - - return error -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/lib/compat/buffer-concat.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/lib/compat/buffer-concat.js deleted file mode 100644 index 09d9721..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/lib/compat/buffer-concat.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = bufferConcat - -/** - * Concatenate an array of Buffers. - */ - -function bufferConcat(bufs) { - var length = 0 - - for (var i = 0, len = bufs.length; i < len; i++) { - length += bufs[i].length - } - - var buf = new Buffer(length) - var pos = 0 - - for (var i = 0, len = bufs.length; i < len; i++) { - bufs[i].copy(buf, pos) - pos += bufs[i].length - } - - return buf -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/lib/compat/callsite-tostring.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/lib/compat/callsite-tostring.js deleted file mode 100644 index 17cf7ed..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/lib/compat/callsite-tostring.js +++ /dev/null @@ -1,101 +0,0 @@ -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = callSiteToString - -/** - * Format a CallSite file location to a string. - */ - -function callSiteFileLocation(callSite) { - var fileName - var fileLocation = '' - - if (callSite.isNative()) { - fileLocation = 'native' - } else if (callSite.isEval()) { - fileName = callSite.getScriptNameOrSourceURL() - if (!fileName) { - fileLocation = callSite.getEvalOrigin() - } - } else { - fileName = callSite.getFileName() - } - - if (fileName) { - fileLocation += fileName - - var lineNumber = callSite.getLineNumber() - if (lineNumber != null) { - fileLocation += ':' + lineNumber - - var columnNumber = callSite.getColumnNumber() - if (columnNumber) { - fileLocation += ':' + columnNumber - } - } - } - - return fileLocation || 'unknown source' -} - -/** - * Format a CallSite to a string. - */ - -function callSiteToString(callSite) { - var addSuffix = true - var fileLocation = callSiteFileLocation(callSite) - var functionName = callSite.getFunctionName() - var isConstructor = callSite.isConstructor() - var isMethodCall = !(callSite.isToplevel() || isConstructor) - var line = '' - - if (isMethodCall) { - var methodName = callSite.getMethodName() - var typeName = getConstructorName(callSite) - - if (functionName) { - if (typeName && functionName.indexOf(typeName) !== 0) { - line += typeName + '.' - } - - line += functionName - - if (methodName && functionName.lastIndexOf('.' + methodName) !== functionName.length - methodName.length - 1) { - line += ' [as ' + methodName + ']' - } - } else { - line += typeName + '.' + (methodName || '') - } - } else if (isConstructor) { - line += 'new ' + (functionName || '') - } else if (functionName) { - line += functionName - } else { - addSuffix = false - line += fileLocation - } - - if (addSuffix) { - line += ' (' + fileLocation + ')' - } - - return line -} - -/** - * Get constructor name of reviver. - */ - -function getConstructorName(obj) { - var receiver = obj.receiver - return (receiver.constructor && receiver.constructor.name) || null -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/lib/compat/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/lib/compat/index.js deleted file mode 100644 index 7fee026..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/lib/compat/index.js +++ /dev/null @@ -1,69 +0,0 @@ -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -lazyProperty(module.exports, 'bufferConcat', function bufferConcat() { - return Buffer.concat || require('./buffer-concat') -}) - -lazyProperty(module.exports, 'callSiteToString', function callSiteToString() { - var limit = Error.stackTraceLimit - var obj = {} - var prep = Error.prepareStackTrace - - function prepareObjectStackTrace(obj, stack) { - return stack - } - - Error.prepareStackTrace = prepareObjectStackTrace - Error.stackTraceLimit = 2 - - // capture the stack - Error.captureStackTrace(obj) - - // slice the stack - var stack = obj.stack.slice() - - Error.prepareStackTrace = prep - Error.stackTraceLimit = limit - - return stack[0].toString ? toString : require('./callsite-tostring') -}) - -/** - * Define a lazy property. - */ - -function lazyProperty(obj, prop, getter) { - function get() { - var val = getter() - - Object.defineProperty(obj, prop, { - configurable: true, - enumerable: true, - value: val - }) - - return val - } - - Object.defineProperty(obj, prop, { - configurable: true, - enumerable: true, - get: get - }) -} - -/** - * Call toString() on the obj - */ - -function toString(obj) { - return obj.toString() -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/package.json deleted file mode 100644 index b67d8d2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/depd/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "depd", - "description": "Deprecate all the things", - "version": "1.0.1", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "deprecate", - "deprecated" - ], - "repository": { - "type": "git", - "url": "https://github.com/dougwilson/nodejs-depd" - }, - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "istanbul": "0.3.5", - "mocha": "~1.21.5" - }, - "files": [ - "lib/", - "History.md", - "LICENSE", - "index.js", - "Readme.md" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --reporter spec --bail test/", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --no-exit test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/" - }, - "gitHead": "769e0f8108463c35a6937a9d634ab19fee45100a", - "bugs": { - "url": "https://github.com/dougwilson/nodejs-depd/issues" - }, - "homepage": "https://github.com/dougwilson/nodejs-depd", - "_id": "depd@1.0.1", - "_shasum": "80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa", - "_from": "depd@>=1.0.1 <1.1.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa", - "tarball": "http://registry.npmjs.org/depd/-/depd-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/LICENSE deleted file mode 100644 index a3f0274..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2012-2013 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. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/Readme.md deleted file mode 100644 index 2cfcc99..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/Readme.md +++ /dev/null @@ -1,15 +0,0 @@ - -# escape-html - - Escape HTML entities - -## Example - -```js -var escape = require('escape-html'); -escape(str); -``` - -## License - - MIT \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/index.js deleted file mode 100644 index d0f9256..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/index.js +++ /dev/null @@ -1,29 +0,0 @@ -/*! - * escape-html - * Copyright(c) 2012-2013 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module exports. - * @public - */ - -module.exports = escapeHtml; - -/** - * Escape special characters in the given string of html. - * - * @param {string} str The string to escape for inserting into HTML - * @return {string} - * @public - */ - -function escapeHtml(html) { - return String(html) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(//g, '>'); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/package.json deleted file mode 100644 index 605bf91..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/escape-html/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "escape-html", - "description": "Escape HTML entities", - "version": "1.0.2", - "license": "MIT", - "keywords": [ - "escape", - "html", - "utility" - ], - "repository": { - "type": "git", - "url": "https://github.com/component/escape-html" - }, - "files": [ - "LICENSE", - "Readme.md", - "index.js" - ], - "gitHead": "2477a23ae56f75e0a5622a20b5b55da00de3a23b", - "bugs": { - "url": "https://github.com/component/escape-html/issues" - }, - "homepage": "https://github.com/component/escape-html", - "_id": "escape-html@1.0.2", - "scripts": {}, - "_shasum": "d77d32fa98e38c2f41ae85e9278e0e0e6ba1022c", - "_from": "escape-html@1.0.2", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "d77d32fa98e38c2f41ae85e9278e0e0e6ba1022c", - "tarball": "http://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/HISTORY.md deleted file mode 100644 index bd0f26d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/HISTORY.md +++ /dev/null @@ -1,71 +0,0 @@ -1.7.0 / 2015-06-08 -================== - - * Always include entity length in ETags for hash length extensions - * Generate non-Stats ETags using MD5 only (no longer CRC32) - * Improve stat performance by removing hashing - * Remove base64 padding in ETags to shorten - * Use MD5 instead of MD4 in weak ETags over 1KB - -1.6.0 / 2015-05-10 -================== - - * Improve support for JXcore - * Remove requirement of `atime` in the stats object - * Support "fake" stats objects in environments without `fs` - -1.5.1 / 2014-11-19 -================== - - * deps: crc@3.2.1 - - Minor fixes - -1.5.0 / 2014-10-14 -================== - - * Improve string performance - * Slightly improve speed for weak ETags over 1KB - -1.4.0 / 2014-09-21 -================== - - * Support "fake" stats objects - * Support Node.js 0.6 - -1.3.1 / 2014-09-14 -================== - - * Use the (new and improved) `crc` for crc32 - -1.3.0 / 2014-08-29 -================== - - * Default strings to strong ETags - * Improve speed for weak ETags over 1KB - -1.2.1 / 2014-08-29 -================== - - * Use the (much faster) `buffer-crc32` for crc32 - -1.2.0 / 2014-08-24 -================== - - * Add support for file stat objects - -1.1.0 / 2014-08-24 -================== - - * Add fast-path for empty entity - * Add weak ETag generation - * Shrink size of generated ETags - -1.0.1 / 2014-08-24 -================== - - * Fix behavior of string containing Unicode - -1.0.0 / 2014-05-18 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/LICENSE deleted file mode 100644 index 142ede3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/README.md deleted file mode 100644 index 8da9e05..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/README.md +++ /dev/null @@ -1,165 +0,0 @@ -# etag - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Create simple ETags - -## Installation - -```sh -$ npm install etag -``` - -## API - -```js -var etag = require('etag') -``` - -### etag(entity, [options]) - -Generate a strong ETag for the given entity. This should be the complete -body of the entity. Strings, `Buffer`s, and `fs.Stats` are accepted. By -default, a strong ETag is generated except for `fs.Stats`, which will -generate a weak ETag (this can be overwritten by `options.weak`). - -```js -res.setHeader('ETag', etag(body)) -``` - -#### Options - -`etag` accepts these properties in the options object. - -##### weak - -Specifies if the generated ETag will include the weak validator mark (that -is, the leading `W/`). The actual entity tag is the same. The default value -is `false`, unless the `entity` is `fs.Stats`, in which case it is `true`. - -## Testing - -```sh -$ npm test -``` - -## Benchmark - -```bash -$ npm run-script bench - -> etag@1.6.0 bench nodejs-etag -> node benchmark/index.js - - http_parser@1.0 - node@0.10.33 - v8@3.14.5.9 - ares@1.9.0-DEV - uv@0.10.29 - zlib@1.2.3 - modules@11 - openssl@1.0.1j - -> node benchmark/body0-100b.js - - 100B body - - 1 test completed. - 2 tests completed. - 3 tests completed. - 4 tests completed. - -* buffer - strong x 289,198 ops/sec ±1.09% (190 runs sampled) -* buffer - weak x 287,838 ops/sec ±0.91% (189 runs sampled) -* string - strong x 284,586 ops/sec ±1.05% (192 runs sampled) -* string - weak x 287,439 ops/sec ±0.82% (192 runs sampled) - -> node benchmark/body1-1kb.js - - 1KB body - - 1 test completed. - 2 tests completed. - 3 tests completed. - 4 tests completed. - -* buffer - strong x 212,423 ops/sec ±0.75% (193 runs sampled) -* buffer - weak x 211,871 ops/sec ±0.74% (194 runs sampled) - string - strong x 205,291 ops/sec ±0.86% (194 runs sampled) - string - weak x 208,463 ops/sec ±0.79% (192 runs sampled) - -> node benchmark/body2-5kb.js - - 5KB body - - 1 test completed. - 2 tests completed. - 3 tests completed. - 4 tests completed. - -* buffer - strong x 92,901 ops/sec ±0.58% (195 runs sampled) -* buffer - weak x 93,045 ops/sec ±0.65% (192 runs sampled) - string - strong x 89,621 ops/sec ±0.68% (194 runs sampled) - string - weak x 90,070 ops/sec ±0.70% (196 runs sampled) - -> node benchmark/body3-10kb.js - - 10KB body - - 1 test completed. - 2 tests completed. - 3 tests completed. - 4 tests completed. - -* buffer - strong x 54,220 ops/sec ±0.85% (192 runs sampled) -* buffer - weak x 54,069 ops/sec ±0.83% (191 runs sampled) - string - strong x 53,078 ops/sec ±0.53% (194 runs sampled) - string - weak x 53,849 ops/sec ±0.47% (197 runs sampled) - -> node benchmark/body4-100kb.js - - 100KB body - - 1 test completed. - 2 tests completed. - 3 tests completed. - 4 tests completed. - -* buffer - strong x 6,673 ops/sec ±0.15% (197 runs sampled) -* buffer - weak x 6,716 ops/sec ±0.12% (198 runs sampled) - string - strong x 6,357 ops/sec ±0.14% (197 runs sampled) - string - weak x 6,344 ops/sec ±0.21% (197 runs sampled) - -> node benchmark/stats.js - - stats - - 1 test completed. - 2 tests completed. - 3 tests completed. - 4 tests completed. - -* real - strong x 1,671,989 ops/sec ±0.13% (197 runs sampled) -* real - weak x 1,681,297 ops/sec ±0.12% (198 runs sampled) - fake - strong x 927,063 ops/sec ±0.14% (198 runs sampled) - fake - weak x 914,461 ops/sec ±0.41% (191 runs sampled) -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/etag.svg -[npm-url]: https://npmjs.org/package/etag -[node-version-image]: https://img.shields.io/node/v/etag.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/etag/master.svg -[travis-url]: https://travis-ci.org/jshttp/etag -[coveralls-image]: https://img.shields.io/coveralls/jshttp/etag/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/etag?branch=master -[downloads-image]: https://img.shields.io/npm/dm/etag.svg -[downloads-url]: https://npmjs.org/package/etag diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/index.js deleted file mode 100644 index b582c84..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/index.js +++ /dev/null @@ -1,132 +0,0 @@ -/*! - * etag - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - * @public - */ - -module.exports = etag - -/** - * Module dependencies. - * @private - */ - -var crypto = require('crypto') -var Stats = require('fs').Stats - -/** - * Module variables. - * @private - */ - -var base64PadCharRegExp = /=+$/ -var toString = Object.prototype.toString - -/** - * Generate an entity tag. - * - * @param {Buffer|string} entity - * @return {string} - * @private - */ - -function entitytag(entity) { - if (entity.length === 0) { - // fast-path empty - return '"0-1B2M2Y8AsgTpgAmY7PhCfg"' - } - - // compute hash of entity - var hash = crypto - .createHash('md5') - .update(entity, 'utf8') - .digest('base64') - .replace(base64PadCharRegExp, '') - - // compute length of entity - var len = typeof entity === 'string' - ? Buffer.byteLength(entity, 'utf8') - : entity.length - - return '"' + len.toString(16) + '-' + hash + '"' -} - -/** - * Create a simple ETag. - * - * @param {string|Buffer|Stats} entity - * @param {object} [options] - * @param {boolean} [options.weak] - * @return {String} - * @public - */ - -function etag(entity, options) { - if (entity == null) { - throw new TypeError('argument entity is required') - } - - // support fs.Stats object - var isStats = isstats(entity) - var weak = options && typeof options.weak === 'boolean' - ? options.weak - : isStats - - // validate argument - if (!isStats && typeof entity !== 'string' && !Buffer.isBuffer(entity)) { - throw new TypeError('argument entity must be string, Buffer, or fs.Stats') - } - - // generate entity tag - var tag = isStats - ? stattag(entity) - : entitytag(entity) - - return weak - ? 'W/' + tag - : tag -} - -/** - * Determine if object is a Stats object. - * - * @param {object} obj - * @return {boolean} - * @api private - */ - -function isstats(obj) { - // genuine fs.Stats - if (typeof Stats === 'function' && obj instanceof Stats) { - return true - } - - // quack quack - return obj && typeof obj === 'object' - && 'ctime' in obj && toString.call(obj.ctime) === '[object Date]' - && 'mtime' in obj && toString.call(obj.mtime) === '[object Date]' - && 'ino' in obj && typeof obj.ino === 'number' - && 'size' in obj && typeof obj.size === 'number' -} - -/** - * Generate a tag for a stat. - * - * @param {object} stat - * @return {string} - * @private - */ - -function stattag(stat) { - var mtime = stat.mtime.getTime().toString(16) - var size = stat.size.toString(16) - - return '"' + size + '-' + mtime + '"' -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/package.json deleted file mode 100644 index 3e5a864..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/etag/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "etag", - "description": "Create simple ETags", - "version": "1.7.0", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "David Björklund", - "email": "david.bjorklund@gmail.com" - } - ], - "license": "MIT", - "keywords": [ - "etag", - "http", - "res" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/etag" - }, - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "istanbul": "0.3.14", - "mocha": "~1.21.4", - "seedrandom": "2.3.11" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "a511f5c8c930fd9546dbd88acb080f96bc788cfc", - "bugs": { - "url": "https://github.com/jshttp/etag/issues" - }, - "homepage": "https://github.com/jshttp/etag", - "_id": "etag@1.7.0", - "_shasum": "03d30b5f67dd6e632d2945d30d6652731a34d5d8", - "_from": "etag@>=1.7.0 <1.8.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "03d30b5f67dd6e632d2945d30d6652731a34d5d8", - "tarball": "http://registry.npmjs.org/etag/-/etag-1.7.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/HISTORY.md deleted file mode 100644 index 26a9435..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/HISTORY.md +++ /dev/null @@ -1,90 +0,0 @@ -0.4.0 / 2015-06-14 -================== - - * Fix a false-positive when unpiping in Node.js 0.8 - * Support `statusCode` property on `Error` objects - * Use `unpipe` module for unpiping requests - * deps: escape-html@1.0.2 - * deps: on-finished@~2.3.0 - - Add defined behavior for HTTP `CONNECT` requests - - Add defined behavior for HTTP `Upgrade` requests - - deps: ee-first@1.1.1 - * perf: enable strict mode - * perf: remove argument reassignment - -0.3.6 / 2015-05-11 -================== - - * deps: debug@~2.2.0 - - deps: ms@0.7.1 - -0.3.5 / 2015-04-22 -================== - - * deps: on-finished@~2.2.1 - - Fix `isFinished(req)` when data buffered - -0.3.4 / 2015-03-15 -================== - - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - -0.3.3 / 2015-01-01 -================== - - * deps: debug@~2.1.1 - * deps: on-finished@~2.2.0 - -0.3.2 / 2014-10-22 -================== - - * deps: on-finished@~2.1.1 - - Fix handling of pipelined requests - -0.3.1 / 2014-10-16 -================== - - * deps: debug@~2.1.0 - - Implement `DEBUG_FD` env variable support - -0.3.0 / 2014-09-17 -================== - - * Terminate in progress response only on error - * Use `on-finished` to determine request status - -0.2.0 / 2014-09-03 -================== - - * Set `X-Content-Type-Options: nosniff` header - * deps: debug@~2.0.0 - -0.1.0 / 2014-07-16 -================== - - * Respond after request fully read - - prevents hung responses and socket hang ups - * deps: debug@1.0.4 - -0.0.3 / 2014-07-11 -================== - - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.0.2 / 2014-06-19 -================== - - * Handle invalid status codes - -0.0.1 / 2014-06-05 -================== - - * deps: debug@1.0.2 - -0.0.0 / 2014-06-05 -================== - - * Extracted from connect/express diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/LICENSE deleted file mode 100644 index b60a5ad..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/README.md deleted file mode 100644 index 6b171d4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/README.md +++ /dev/null @@ -1,133 +0,0 @@ -# finalhandler - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-image]][node-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Node.js function to invoke as the final step to respond to HTTP request. - -## Installation - -```sh -$ npm install finalhandler -``` - -## API - -```js -var finalhandler = require('finalhandler') -``` - -### finalhandler(req, res, [options]) - -Returns function to be invoked as the final step for the given `req` and `res`. -This function is to be invoked as `fn(err)`. If `err` is falsy, the handler will -write out a 404 response to the `res`. If it is truthy, an error response will -be written out to the `res`, and `res.statusCode` is set from `err.status`. - -The final handler will also unpipe anything from `req` when it is invoked. - -#### options.env - -By default, the environment is determined by `NODE_ENV` variable, but it can be -overridden by this option. - -#### options.onerror - -Provide a function to be called with the `err` when it exists. Can be used for -writing errors to a central location without excessive function generation. Called -as `onerror(err, req, res)`. - -## Examples - -### always 404 - -```js -var finalhandler = require('finalhandler') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - done() -}) - -server.listen(3000) -``` - -### perform simple action - -```js -var finalhandler = require('finalhandler') -var fs = require('fs') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - - fs.readFile('index.html', function (err, buf) { - if (err) return done(err) - res.setHeader('Content-Type', 'text/html') - res.end(buf) - }) -}) - -server.listen(3000) -``` - -### use with middleware-style functions - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -var serve = serveStatic('public') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - serve(req, res, done) -}) - -server.listen(3000) -``` - -### keep log of all errors - -```js -var finalhandler = require('finalhandler') -var fs = require('fs') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res, {onerror: logerror}) - - fs.readFile('index.html', function (err, buf) { - if (err) return done(err) - res.setHeader('Content-Type', 'text/html') - res.end(buf) - }) -}) - -server.listen(3000) - -function logerror(err) { - console.error(err.stack || err.toString()) -} -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/finalhandler.svg -[npm-url]: https://npmjs.org/package/finalhandler -[node-image]: https://img.shields.io/node/v/finalhandler.svg -[node-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/pillarjs/finalhandler.svg -[travis-url]: https://travis-ci.org/pillarjs/finalhandler -[coveralls-image]: https://img.shields.io/coveralls/pillarjs/finalhandler.svg -[coveralls-url]: https://coveralls.io/r/pillarjs/finalhandler?branch=master -[downloads-image]: https://img.shields.io/npm/dm/finalhandler.svg -[downloads-url]: https://npmjs.org/package/finalhandler diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/index.js deleted file mode 100644 index 0de7c6b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/index.js +++ /dev/null @@ -1,151 +0,0 @@ -/*! - * finalhandler - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var debug = require('debug')('finalhandler') -var escapeHtml = require('escape-html') -var http = require('http') -var onFinished = require('on-finished') -var unpipe = require('unpipe') - -/** - * Module variables. - * @private - */ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } -var isFinished = onFinished.isFinished - -/** - * Module exports. - * @public - */ - -module.exports = finalhandler - -/** - * Create a function to handle the final response. - * - * @param {Request} req - * @param {Response} res - * @param {Object} [options] - * @return {Function} - * @public - */ - -function finalhandler(req, res, options) { - var opts = options || {} - - // get environment - var env = opts.env || process.env.NODE_ENV || 'development' - - // get error callback - var onerror = opts.onerror - - return function (err) { - var status = res.statusCode - - // ignore 404 on in-flight response - if (!err && res._header) { - debug('cannot 404 after headers sent') - return - } - - // unhandled error - if (err) { - // respect err.statusCode - if (err.statusCode) { - status = err.statusCode - } - - // respect err.status - if (err.status) { - status = err.status - } - - // default status code to 500 - if (!status || status < 400) { - status = 500 - } - - // production gets a basic error message - var msg = env === 'production' - ? http.STATUS_CODES[status] - : err.stack || err.toString() - msg = escapeHtml(msg) - .replace(/\n/g, '
') - .replace(/ /g, '  ') + '\n' - } else { - status = 404 - msg = 'Cannot ' + escapeHtml(req.method) + ' ' + escapeHtml(req.originalUrl || req.url) + '\n' - } - - debug('default %s', status) - - // schedule onerror callback - if (err && onerror) { - defer(onerror, err, req, res) - } - - // cannot actually respond - if (res._header) { - return req.socket.destroy() - } - - send(req, res, status, msg) - } -} - -/** - * Send response. - * - * @param {IncomingMessage} req - * @param {OutgoingMessage} res - * @param {number} status - * @param {string} body - * @private - */ - -function send(req, res, status, body) { - function write() { - res.statusCode = status - - // security header for content sniffing - res.setHeader('X-Content-Type-Options', 'nosniff') - - // standard headers - res.setHeader('Content-Type', 'text/html; charset=utf-8') - res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8')) - - if (req.method === 'HEAD') { - res.end() - return - } - - res.end(body, 'utf8') - } - - if (isFinished(req)) { - write() - return - } - - // unpipe everything from the request - unpipe(req) - - // flush the request - onFinished(req, write) - req.resume() -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/HISTORY.md deleted file mode 100644 index 85e0f8d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/HISTORY.md +++ /dev/null @@ -1,4 +0,0 @@ -1.0.0 / 2015-06-14 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/LICENSE deleted file mode 100644 index aed0138..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/README.md deleted file mode 100644 index e536ad2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# unpipe - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-image]][node-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Unpipe a stream from all destinations. - -## Installation - -```sh -$ npm install unpipe -``` - -## API - -```js -var unpipe = require('unpipe') -``` - -### unpipe(stream) - -Unpipes all destinations from a given stream. With stream 2+, this is -equivalent to `stream.unpipe()`. When used with streams 1 style streams -(typically Node.js 0.8 and below), this module attempts to undo the -actions done in `stream.pipe(dest)`. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/unpipe.svg -[npm-url]: https://npmjs.org/package/unpipe -[node-image]: https://img.shields.io/node/v/unpipe.svg -[node-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/stream-utils/unpipe.svg -[travis-url]: https://travis-ci.org/stream-utils/unpipe -[coveralls-image]: https://img.shields.io/coveralls/stream-utils/unpipe.svg -[coveralls-url]: https://coveralls.io/r/stream-utils/unpipe?branch=master -[downloads-image]: https://img.shields.io/npm/dm/unpipe.svg -[downloads-url]: https://npmjs.org/package/unpipe diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/index.js deleted file mode 100644 index 15c3d97..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/index.js +++ /dev/null @@ -1,69 +0,0 @@ -/*! - * unpipe - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - * @public - */ - -module.exports = unpipe - -/** - * Determine if there are Node.js pipe-like data listeners. - * @private - */ - -function hasPipeDataListeners(stream) { - var listeners = stream.listeners('data') - - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].name === 'ondata') { - return true - } - } - - return false -} - -/** - * Unpipe a stream from all destinations. - * - * @param {object} stream - * @public - */ - -function unpipe(stream) { - if (!stream) { - throw new TypeError('argument stream is required') - } - - if (typeof stream.unpipe === 'function') { - // new-style - stream.unpipe() - return - } - - // Node.js 0.8 hack - if (!hasPipeDataListeners(stream)) { - return - } - - var listener - var listeners = stream.listeners('close') - - for (var i = 0; i < listeners.length; i++) { - listener = listeners[i] - - if (listener.name !== 'cleanup' && listener.name !== 'onclose') { - continue - } - - // invoke the listener - listener.call(stream) - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/package.json deleted file mode 100644 index 973dbfa..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/node_modules/unpipe/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "unpipe", - "description": "Unpipe a stream from all destinations", - "version": "1.0.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/stream-utils/unpipe" - }, - "devDependencies": { - "istanbul": "0.3.15", - "mocha": "2.2.5", - "readable-stream": "1.1.13" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "d2df901c06487430e78dca62b6edb8bb2fc5e99d", - "bugs": { - "url": "https://github.com/stream-utils/unpipe/issues" - }, - "homepage": "https://github.com/stream-utils/unpipe", - "_id": "unpipe@1.0.0", - "_shasum": "b2bf4ee8514aae6165b4817829d21b2ef49904ec", - "_from": "unpipe@>=1.0.0 <1.1.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "b2bf4ee8514aae6165b4817829d21b2ef49904ec", - "tarball": "http://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/package.json deleted file mode 100644 index 9549095..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/finalhandler/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "finalhandler", - "description": "Node.js final http responder", - "version": "0.4.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/pillarjs/finalhandler" - }, - "dependencies": { - "debug": "~2.2.0", - "escape-html": "1.0.2", - "on-finished": "~2.3.0", - "unpipe": "~1.0.0" - }, - "devDependencies": { - "istanbul": "0.3.15", - "mocha": "2.2.5", - "readable-stream": "2.0.0", - "supertest": "1.0.1" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "fe4e4de9ebb0f3831493ad75119ee6ba40542853", - "bugs": { - "url": "https://github.com/pillarjs/finalhandler/issues" - }, - "homepage": "https://github.com/pillarjs/finalhandler", - "_id": "finalhandler@0.4.0", - "_shasum": "965a52d9e8d05d2b857548541fb89b53a2497d9b", - "_from": "finalhandler@0.4.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "965a52d9e8d05d2b857548541fb89b53a2497d9b", - "tarball": "http://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/HISTORY.md deleted file mode 100644 index 3c95fbb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/HISTORY.md +++ /dev/null @@ -1,38 +0,0 @@ -0.3.0 / 2015-05-12 -================== - - * Add weak `ETag` matching support - -0.2.4 / 2014-09-07 -================== - - * Support Node.js 0.6 - -0.2.3 / 2014-09-07 -================== - - * Move repository to jshttp - -0.2.2 / 2014-02-19 -================== - - * Revert "Fix for blank page on Safari reload" - -0.2.1 / 2014-01-29 -================== - - * Fix for blank page on Safari reload - -0.2.0 / 2013-08-11 -================== - - * Return stale for `Cache-Control: no-cache` - -0.1.0 / 2012-06-15 -================== - * Add `If-None-Match: *` support - -0.0.1 / 2012-06-10 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/LICENSE deleted file mode 100644 index f527394..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2012 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. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/README.md deleted file mode 100644 index 0813e30..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# fresh - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -HTTP response freshness testing - -## Installation - -``` -$ npm install fresh -``` - -## API - -```js -var fresh = require('fresh') -``` - -### fresh(req, res) - - Check freshness of `req` and `res` headers. - - When the cache is "fresh" __true__ is returned, - otherwise __false__ is returned to indicate that - the cache is now stale. - -## Example - -```js -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'luna' }; -fresh(req, res); -// => false - -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'tobi' }; -fresh(req, res); -// => true -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/fresh.svg -[npm-url]: https://npmjs.org/package/fresh -[node-version-image]: https://img.shields.io/node/v/fresh.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/fresh/master.svg -[travis-url]: https://travis-ci.org/jshttp/fresh -[coveralls-image]: https://img.shields.io/coveralls/jshttp/fresh/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/fresh?branch=master -[downloads-image]: https://img.shields.io/npm/dm/fresh.svg -[downloads-url]: https://npmjs.org/package/fresh diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/index.js deleted file mode 100644 index a900873..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/index.js +++ /dev/null @@ -1,57 +0,0 @@ - -/** - * Expose `fresh()`. - */ - -module.exports = fresh; - -/** - * Check freshness of `req` and `res` headers. - * - * When the cache is "fresh" __true__ is returned, - * otherwise __false__ is returned to indicate that - * the cache is now stale. - * - * @param {Object} req - * @param {Object} res - * @return {Boolean} - * @api public - */ - -function fresh(req, res) { - // defaults - var etagMatches = true; - var notModified = true; - - // fields - var modifiedSince = req['if-modified-since']; - var noneMatch = req['if-none-match']; - var lastModified = res['last-modified']; - var etag = res['etag']; - var cc = req['cache-control']; - - // unconditional request - if (!modifiedSince && !noneMatch) return false; - - // check for no-cache cache request directive - if (cc && cc.indexOf('no-cache') !== -1) return false; - - // parse if-none-match - if (noneMatch) noneMatch = noneMatch.split(/ *, */); - - // if-none-match - if (noneMatch) { - etagMatches = noneMatch.some(function (match) { - return match === '*' || match === etag || match === 'W/' + etag; - }); - } - - // if-modified-since - if (modifiedSince) { - modifiedSince = new Date(modifiedSince); - lastModified = new Date(lastModified); - notModified = lastModified <= modifiedSince; - } - - return !! (etagMatches && notModified); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/package.json deleted file mode 100644 index dab2e5c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/fresh/package.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "fresh", - "description": "HTTP response freshness testing", - "version": "0.3.0", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - } - ], - "license": "MIT", - "keywords": [ - "fresh", - "http", - "conditional", - "cache" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/fresh" - }, - "devDependencies": { - "istanbul": "0.3.9", - "mocha": "1.21.5" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "14616c9748368ca08cd6a955dd88ab659b778634", - "bugs": { - "url": "https://github.com/jshttp/fresh/issues" - }, - "homepage": "https://github.com/jshttp/fresh", - "_id": "fresh@0.3.0", - "_shasum": "651f838e22424e7566de161d8358caa199f83d4f", - "_from": "fresh@0.3.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "651f838e22424e7566de161d8358caa199f83d4f", - "tarball": "http://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/LICENSE deleted file mode 100644 index a53a533..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2013 Jonathan Ong - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/README.md deleted file mode 100644 index ca4cf24..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Merge Descriptors - -Merge objects using descriptors. - -```js -var thing = { - get name() { - return 'jon' - } -} - -var animal = { - -} - -merge(animal, thing) - -animal.name === 'jon' -``` - -## API - -### merge(destination, source) - -Redefines `destination`'s descriptors with `source`'s. - -### merge(destination, source, false) - -Defines `source`'s descriptors on `destination` if `destination` does not have -a descriptor by the same name. - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/index.js deleted file mode 100644 index 5d0af3a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/index.js +++ /dev/null @@ -1,57 +0,0 @@ -/*! - * merge-descriptors - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** - * Module exports. - * @public - */ - -module.exports = merge - -/** - * Module variables. - * @private - */ - -var hasOwnProperty = Object.prototype.hasOwnProperty - -/** - * Merge the property descriptors of `src` into `dest` - * - * @param {object} dest Object to add descriptors to - * @param {object} src Object to clone descriptors from - * @param {boolean} [redefine=true] Redefine `dest` properties with `src` properties - * @returns {object} Reference to dest - * @public - */ - -function merge(dest, src, redefine) { - if (!dest) { - throw new TypeError('argument dest is required') - } - - if (!src) { - throw new TypeError('argument src is required') - } - - if (redefine === undefined) { - // Default to true - redefine = true - } - - Object.getOwnPropertyNames(src).forEach(function forEachOwnPropertyName(name) { - if (!redefine && hasOwnProperty.call(dest, name)) { - // Skip desriptor - return - } - - // Copy descriptor - var descriptor = Object.getOwnPropertyDescriptor(src, name) - Object.defineProperty(dest, name, descriptor) - }) - - return dest -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/package.json deleted file mode 100644 index fcea731..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/merge-descriptors/package.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "name": "merge-descriptors", - "description": "Merge objects using descriptors", - "version": "1.0.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/component/merge-descriptors.git" - }, - "bugs": { - "url": "https://github.com/component/merge-descriptors/issues" - }, - "files": [ - "LICENSE", - "README.md", - "index.js" - ], - "gitHead": "81d7a3c14099884c391bd237d7d8edf23c6d6f18", - "homepage": "https://github.com/component/merge-descriptors", - "_id": "merge-descriptors@1.0.0", - "scripts": {}, - "_shasum": "2169cf7538e1b0cc87fb88e1502d8474bbf79864", - "_from": "merge-descriptors@1.0.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - { - "name": "yields", - "email": "yields@icloud.com" - }, - { - "name": "ianstormtaylor", - "email": "ian@ianstormtaylor.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "timoxley", - "email": "secoif@gmail.com" - }, - { - "name": "mattmueller", - "email": "mattmuelle@gmail.com" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "queckezz", - "email": "fabian.eichenberger@gmail.com" - }, - { - "name": "anthonyshort", - "email": "antshort@gmail.com" - }, - { - "name": "dominicbarnes", - "email": "dominic@dbarnes.info" - }, - { - "name": "clintwood", - "email": "clint@anotherway.co.za" - }, - { - "name": "thehydroimpulse", - "email": "dnfagnan@gmail.com" - }, - { - "name": "stephenmathieson", - "email": "me@stephenmathieson.com" - }, - { - "name": "trevorgerhardt", - "email": "trevorgerhardt@gmail.com" - }, - { - "name": "timaschew", - "email": "timaschew@gmail.com" - }, - { - "name": "hughsk", - "email": "hughskennedy@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "2169cf7538e1b0cc87fb88e1502d8474bbf79864", - "tarball": "http://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/HISTORY.md deleted file mode 100644 index c9e302c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/HISTORY.md +++ /dev/null @@ -1,24 +0,0 @@ -1.1.1 / 2014-12-30 -================== - - * Improve `browserify` support - -1.1.0 / 2014-07-05 -================== - - * Add `CONNECT` method - -1.0.1 / 2014-06-02 -================== - - * Fix module to work with harmony transform - -1.0.0 / 2014-05-08 -================== - - * Add `PURGE` method - -0.1.0 / 2013-10-28 -================== - - * Add `http.METHODS` support diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/LICENSE deleted file mode 100644 index 8bce401..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2013-2014 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. - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/README.md deleted file mode 100644 index dccc473..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Methods - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - - HTTP verbs that node core's parser supports. - - -## Install - -```bash -$ npm install methods -``` - -## API - -```js -var methods = require('methods') -``` - -### methods - -This is an array of lower-case method names that Node.js supports. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/methods.svg?style=flat -[npm-url]: https://npmjs.org/package/methods -[node-version-image]: https://img.shields.io/node/v/methods.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/methods.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/methods -[coveralls-image]: https://img.shields.io/coveralls/jshttp/methods.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/methods?branch=master -[downloads-image]: https://img.shields.io/npm/dm/methods.svg?style=flat -[downloads-url]: https://npmjs.org/package/methods diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/index.js deleted file mode 100644 index e89c7fd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/index.js +++ /dev/null @@ -1,42 +0,0 @@ - -var http = require('http'); - -/* istanbul ignore next: implementation differs on version */ -if (http.METHODS) { - - module.exports = http.METHODS.map(function(method){ - return method.toLowerCase(); - }); - -} else { - - module.exports = [ - 'get', - 'post', - 'put', - 'head', - 'delete', - 'options', - 'trace', - 'copy', - 'lock', - 'mkcol', - 'move', - 'purge', - 'propfind', - 'proppatch', - 'unlock', - 'report', - 'mkactivity', - 'checkout', - 'merge', - 'm-search', - 'notify', - 'subscribe', - 'unsubscribe', - 'patch', - 'search', - 'connect' - ]; - -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/package.json deleted file mode 100644 index c1ce061..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/methods/package.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "name": "methods", - "description": "HTTP methods that node supports", - "version": "1.1.1", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jshttp/methods" - }, - "devDependencies": { - "istanbul": "0.3", - "mocha": "1" - }, - "files": [ - "index.js", - "HISTORY.md", - "LICENSE" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" - }, - "browser": { - "http": false - }, - "keywords": [ - "http", - "methods" - ], - "gitHead": "6293c6b27c5fb963acf67a347af80ad2ebd7247f", - "bugs": { - "url": "https://github.com/jshttp/methods/issues" - }, - "homepage": "https://github.com/jshttp/methods", - "_id": "methods@1.1.1", - "_shasum": "17ea6366066d00c58e375b8ec7dfd0453c89822a", - "_from": "methods@>=1.1.1 <1.2.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "17ea6366066d00c58e375b8ec7dfd0453c89822a", - "tarball": "http://registry.npmjs.org/methods/-/methods-1.1.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/methods/-/methods-1.1.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/HISTORY.md deleted file mode 100644 index 98ff0e9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/HISTORY.md +++ /dev/null @@ -1,88 +0,0 @@ -2.3.0 / 2015-05-26 -================== - - * Add defined behavior for HTTP `CONNECT` requests - * Add defined behavior for HTTP `Upgrade` requests - * deps: ee-first@1.1.1 - -2.2.1 / 2015-04-22 -================== - - * Fix `isFinished(req)` when data buffered - -2.2.0 / 2014-12-22 -================== - - * Add message object to callback arguments - -2.1.1 / 2014-10-22 -================== - - * Fix handling of pipelined requests - -2.1.0 / 2014-08-16 -================== - - * Check if `socket` is detached - * Return `undefined` for `isFinished` if state unknown - -2.0.0 / 2014-08-16 -================== - - * Add `isFinished` function - * Move to `jshttp` organization - * Remove support for plain socket argument - * Rename to `on-finished` - * Support both `req` and `res` as arguments - * deps: ee-first@1.0.5 - -1.2.2 / 2014-06-10 -================== - - * Reduce listeners added to emitters - - avoids "event emitter leak" warnings when used multiple times on same request - -1.2.1 / 2014-06-08 -================== - - * Fix returned value when already finished - -1.2.0 / 2014-06-05 -================== - - * Call callback when called on already-finished socket - -1.1.4 / 2014-05-27 -================== - - * Support node.js 0.8 - -1.1.3 / 2014-04-30 -================== - - * Make sure errors passed as instanceof `Error` - -1.1.2 / 2014-04-18 -================== - - * Default the `socket` to passed-in object - -1.1.1 / 2014-01-16 -================== - - * Rename module to `finished` - -1.1.0 / 2013-12-25 -================== - - * Call callback when called on already-errored socket - -1.0.1 / 2013-12-20 -================== - - * Actually pass the error to the callback - -1.0.0 / 2013-12-20 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/LICENSE deleted file mode 100644 index 5931fd2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2013 Jonathan Ong -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/README.md deleted file mode 100644 index a0e1157..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/README.md +++ /dev/null @@ -1,154 +0,0 @@ -# on-finished - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Execute a callback when a HTTP request closes, finishes, or errors. - -## Install - -```sh -$ npm install on-finished -``` - -## API - -```js -var onFinished = require('on-finished') -``` - -### onFinished(res, listener) - -Attach a listener to listen for the response to finish. The listener will -be invoked only once when the response finished. If the response finished -to an error, the first argument will contain the error. If the response -has already finished, the listener will be invoked. - -Listening to the end of a response would be used to close things associated -with the response, like open files. - -Listener is invoked as `listener(err, res)`. - -```js -onFinished(res, function (err, res) { - // clean up open fds, etc. - // err contains the error is request error'd -}) -``` - -### onFinished(req, listener) - -Attach a listener to listen for the request to finish. The listener will -be invoked only once when the request finished. If the request finished -to an error, the first argument will contain the error. If the request -has already finished, the listener will be invoked. - -Listening to the end of a request would be used to know when to continue -after reading the data. - -Listener is invoked as `listener(err, req)`. - -```js -var data = '' - -req.setEncoding('utf8') -res.on('data', function (str) { - data += str -}) - -onFinished(req, function (err, req) { - // data is read unless there is err -}) -``` - -### onFinished.isFinished(res) - -Determine if `res` is already finished. This would be useful to check and -not even start certain operations if the response has already finished. - -### onFinished.isFinished(req) - -Determine if `req` is already finished. This would be useful to check and -not even start certain operations if the request has already finished. - -## Special Node.js requests - -### HTTP CONNECT method - -The meaning of the `CONNECT` method from RFC 7231, section 4.3.6: - -> The CONNECT method requests that the recipient establish a tunnel to -> the destination origin server identified by the request-target and, -> if successful, thereafter restrict its behavior to blind forwarding -> of packets, in both directions, until the tunnel is closed. Tunnels -> are commonly used to create an end-to-end virtual connection, through -> one or more proxies, which can then be secured using TLS (Transport -> Layer Security, [RFC5246]). - -In Node.js, these request objects come from the `'connect'` event on -the HTTP server. - -When this module is used on a HTTP `CONNECT` request, the request is -considered "finished" immediately, **due to limitations in the Node.js -interface**. This means if the `CONNECT` request contains a request entity, -the request will be considered "finished" even before it has been read. - -There is no such thing as a response object to a `CONNECT` request in -Node.js, so there is no support for for one. - -### HTTP Upgrade request - -The meaning of the `Upgrade` header from RFC 7230, section 6.1: - -> The "Upgrade" header field is intended to provide a simple mechanism -> for transitioning from HTTP/1.1 to some other protocol on the same -> connection. - -In Node.js, these request objects come from the `'upgrade'` event on -the HTTP server. - -When this module is used on a HTTP request with an `Upgrade` header, the -request is considered "finished" immediately, **due to limitations in the -Node.js interface**. This means if the `Upgrade` request contains a request -entity, the request will be considered "finished" even before it has been -read. - -There is no such thing as a response object to a `Upgrade` request in -Node.js, so there is no support for for one. - -## Example - -The following code ensures that file descriptors are always closed -once the response finishes. - -```js -var destroy = require('destroy') -var http = require('http') -var onFinished = require('on-finished') - -http.createServer(function onRequest(req, res) { - var stream = fs.createReadStream('package.json') - stream.pipe(res) - onFinished(res, function (err) { - destroy(stream) - }) -}) -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/on-finished.svg -[npm-url]: https://npmjs.org/package/on-finished -[node-version-image]: https://img.shields.io/node/v/on-finished.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/on-finished/master.svg -[travis-url]: https://travis-ci.org/jshttp/on-finished -[coveralls-image]: https://img.shields.io/coveralls/jshttp/on-finished/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/on-finished?branch=master -[downloads-image]: https://img.shields.io/npm/dm/on-finished.svg -[downloads-url]: https://npmjs.org/package/on-finished diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/index.js deleted file mode 100644 index 9abd98f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/index.js +++ /dev/null @@ -1,196 +0,0 @@ -/*! - * on-finished - * Copyright(c) 2013 Jonathan Ong - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - * @public - */ - -module.exports = onFinished -module.exports.isFinished = isFinished - -/** - * Module dependencies. - * @private - */ - -var first = require('ee-first') - -/** - * Variables. - * @private - */ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Invoke callback when the response has finished, useful for - * cleaning up resources afterwards. - * - * @param {object} msg - * @param {function} listener - * @return {object} - * @public - */ - -function onFinished(msg, listener) { - if (isFinished(msg) !== false) { - defer(listener, null, msg) - return msg - } - - // attach the listener to the message - attachListener(msg, listener) - - return msg -} - -/** - * Determine if message is already finished. - * - * @param {object} msg - * @return {boolean} - * @public - */ - -function isFinished(msg) { - var socket = msg.socket - - if (typeof msg.finished === 'boolean') { - // OutgoingMessage - return Boolean(msg.finished || (socket && !socket.writable)) - } - - if (typeof msg.complete === 'boolean') { - // IncomingMessage - return Boolean(msg.upgrade || !socket || !socket.readable || (msg.complete && !msg.readable)) - } - - // don't know - return undefined -} - -/** - * Attach a finished listener to the message. - * - * @param {object} msg - * @param {function} callback - * @private - */ - -function attachFinishedListener(msg, callback) { - var eeMsg - var eeSocket - var finished = false - - function onFinish(error) { - eeMsg.cancel() - eeSocket.cancel() - - finished = true - callback(error) - } - - // finished on first message event - eeMsg = eeSocket = first([[msg, 'end', 'finish']], onFinish) - - function onSocket(socket) { - // remove listener - msg.removeListener('socket', onSocket) - - if (finished) return - if (eeMsg !== eeSocket) return - - // finished on first socket event - eeSocket = first([[socket, 'error', 'close']], onFinish) - } - - if (msg.socket) { - // socket already assigned - onSocket(msg.socket) - return - } - - // wait for socket to be assigned - msg.on('socket', onSocket) - - if (msg.socket === undefined) { - // node.js 0.8 patch - patchAssignSocket(msg, onSocket) - } -} - -/** - * Attach the listener to the message. - * - * @param {object} msg - * @return {function} - * @private - */ - -function attachListener(msg, listener) { - var attached = msg.__onFinished - - // create a private single listener with queue - if (!attached || !attached.queue) { - attached = msg.__onFinished = createListener(msg) - attachFinishedListener(msg, attached) - } - - attached.queue.push(listener) -} - -/** - * Create listener on message. - * - * @param {object} msg - * @return {function} - * @private - */ - -function createListener(msg) { - function listener(err) { - if (msg.__onFinished === listener) msg.__onFinished = null - if (!listener.queue) return - - var queue = listener.queue - listener.queue = null - - for (var i = 0; i < queue.length; i++) { - queue[i](err, msg) - } - } - - listener.queue = [] - - return listener -} - -/** - * Patch ServerResponse.prototype.assignSocket for node.js 0.8. - * - * @param {ServerResponse} res - * @param {function} callback - * @private - */ - -function patchAssignSocket(res, callback) { - var assignSocket = res.assignSocket - - if (typeof assignSocket !== 'function') return - - // res.on('socket', callback) is broken in 0.8 - res.assignSocket = function _assignSocket(socket) { - assignSocket.call(this, socket) - callback(socket) - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md deleted file mode 100644 index cbd2478..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# EE First - -[![NPM version][npm-image]][npm-url] -[![Build status][travis-image]][travis-url] -[![Test coverage][coveralls-image]][coveralls-url] -[![License][license-image]][license-url] -[![Downloads][downloads-image]][downloads-url] -[![Gittip][gittip-image]][gittip-url] - -Get the first event in a set of event emitters and event pairs, -then clean up after itself. - -## Install - -```sh -$ npm install ee-first -``` - -## API - -```js -var first = require('ee-first') -``` - -### first(arr, listener) - -Invoke `listener` on the first event from the list specified in `arr`. `arr` is -an array of arrays, with each array in the format `[ee, ...event]`. `listener` -will be called only once, the first time any of the given events are emitted. If -`error` is one of the listened events, then if that fires first, the `listener` -will be given the `err` argument. - -The `listener` is invoked as `listener(err, ee, event, args)`, where `err` is the -first argument emitted from an `error` event, if applicable; `ee` is the event -emitter that fired; `event` is the string event name that fired; and `args` is an -array of the arguments that were emitted on the event. - -```js -var ee1 = new EventEmitter() -var ee2 = new EventEmitter() - -first([ - [ee1, 'close', 'end', 'error'], - [ee2, 'error'] -], function (err, ee, event, args) { - // listener invoked -}) -``` - -#### .cancel() - -The group of listeners can be cancelled before being invoked and have all the event -listeners removed from the underlying event emitters. - -```js -var thunk = first([ - [ee1, 'close', 'end', 'error'], - [ee2, 'error'] -], function (err, ee, event, args) { - // listener invoked -}) - -// cancel and clean up -thunk.cancel() -``` - -[npm-image]: https://img.shields.io/npm/v/ee-first.svg?style=flat-square -[npm-url]: https://npmjs.org/package/ee-first -[github-tag]: http://img.shields.io/github/tag/jonathanong/ee-first.svg?style=flat-square -[github-url]: https://github.com/jonathanong/ee-first/tags -[travis-image]: https://img.shields.io/travis/jonathanong/ee-first.svg?style=flat-square -[travis-url]: https://travis-ci.org/jonathanong/ee-first -[coveralls-image]: https://img.shields.io/coveralls/jonathanong/ee-first.svg?style=flat-square -[coveralls-url]: https://coveralls.io/r/jonathanong/ee-first?branch=master -[license-image]: http://img.shields.io/npm/l/ee-first.svg?style=flat-square -[license-url]: LICENSE.md -[downloads-image]: http://img.shields.io/npm/dm/ee-first.svg?style=flat-square -[downloads-url]: https://npmjs.org/package/ee-first -[gittip-image]: https://img.shields.io/gittip/jonathanong.svg?style=flat-square -[gittip-url]: https://www.gittip.com/jonathanong/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js deleted file mode 100644 index 501287c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js +++ /dev/null @@ -1,95 +0,0 @@ -/*! - * ee-first - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - * @public - */ - -module.exports = first - -/** - * Get the first event in a set of event emitters and event pairs. - * - * @param {array} stuff - * @param {function} done - * @public - */ - -function first(stuff, done) { - if (!Array.isArray(stuff)) - throw new TypeError('arg must be an array of [ee, events...] arrays') - - var cleanups = [] - - for (var i = 0; i < stuff.length; i++) { - var arr = stuff[i] - - if (!Array.isArray(arr) || arr.length < 2) - throw new TypeError('each array member must be [ee, events...]') - - var ee = arr[0] - - for (var j = 1; j < arr.length; j++) { - var event = arr[j] - var fn = listener(event, callback) - - // listen to the event - ee.on(event, fn) - // push this listener to the list of cleanups - cleanups.push({ - ee: ee, - event: event, - fn: fn, - }) - } - } - - function callback() { - cleanup() - done.apply(null, arguments) - } - - function cleanup() { - var x - for (var i = 0; i < cleanups.length; i++) { - x = cleanups[i] - x.ee.removeListener(x.event, x.fn) - } - } - - function thunk(fn) { - done = fn - } - - thunk.cancel = cleanup - - return thunk -} - -/** - * Create the event listener. - * @private - */ - -function listener(event, done) { - return function onevent(arg1) { - var args = new Array(arguments.length) - var ee = this - var err = event === 'error' - ? arg1 - : null - - // copy args to prevent arguments escaping scope - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - done(err, ee, event, args) - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json deleted file mode 100644 index 14d9289..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "ee-first", - "description": "return the first event in a set of ee/event pairs", - "version": "1.1.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jonathanong/ee-first" - }, - "devDependencies": { - "istanbul": "0.3.9", - "mocha": "2.2.5" - }, - "files": [ - "index.js", - "LICENSE" - ], - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "512e0ce4cc3643f603708f965a97b61b1a9c0441", - "bugs": { - "url": "https://github.com/jonathanong/ee-first/issues" - }, - "homepage": "https://github.com/jonathanong/ee-first", - "_id": "ee-first@1.1.1", - "_shasum": "590c61156b0ae2f4f0255732a158b266bc56b21d", - "_from": "ee-first@1.1.1", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "590c61156b0ae2f4f0255732a158b266bc56b21d", - "tarball": "http://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/package.json deleted file mode 100644 index ff6250e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/on-finished/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "on-finished", - "description": "Execute a callback when a request closes, finishes, or errors", - "version": "2.3.0", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jshttp/on-finished" - }, - "dependencies": { - "ee-first": "1.1.1" - }, - "devDependencies": { - "istanbul": "0.3.9", - "mocha": "2.2.5" - }, - "engines": { - "node": ">= 0.8" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "index.js" - ], - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "34babcb58126a416fcf5205768204f2e12699dda", - "bugs": { - "url": "https://github.com/jshttp/on-finished/issues" - }, - "homepage": "https://github.com/jshttp/on-finished", - "_id": "on-finished@2.3.0", - "_shasum": "20f1336481b083cd75337992a16971aa2d906947", - "_from": "on-finished@>=2.3.0 <2.4.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "20f1336481b083cd75337992a16971aa2d906947", - "tarball": "http://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/.npmignore deleted file mode 100644 index 85c82a5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -benchmark/ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/HISTORY.md deleted file mode 100644 index 65a0860..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/HISTORY.md +++ /dev/null @@ -1,42 +0,0 @@ -1.3.0 / 2014-08-09 -================== - - * Add `parseurl.original` for parsing `req.originalUrl` with fallback - * Return `undefined` if `req.url` is `undefined` - -1.2.0 / 2014-07-21 -================== - - * Cache URLs based on original value - * Remove no-longer-needed URL mis-parse work-around - * Simplify the "fast-path" `RegExp` - -1.1.3 / 2014-07-08 -================== - - * Fix typo - -1.1.2 / 2014-07-08 -================== - - * Seriously fix Node.js 0.8 compatibility - -1.1.1 / 2014-07-08 -================== - - * Fix Node.js 0.8 compatibility - -1.1.0 / 2014-07-08 -================== - - * Incorporate URL href-only parse fast-path - -1.0.1 / 2014-03-08 -================== - - * Add missing `require` - -1.0.0 / 2014-03-08 -================== - - * Genesis from `connect` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/LICENSE deleted file mode 100644 index ec7dfe7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ - -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/README.md deleted file mode 100644 index 0db1d02..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/README.md +++ /dev/null @@ -1,107 +0,0 @@ -# parseurl - -[![NPM version](https://badge.fury.io/js/parseurl.svg)](http://badge.fury.io/js/parseurl) -[![Build Status](https://travis-ci.org/expressjs/parseurl.svg?branch=master)](https://travis-ci.org/expressjs/parseurl) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/parseurl.svg?branch=master)](https://coveralls.io/r/expressjs/parseurl) - -Parse a URL with memoization. - -## Install - -```bash -$ npm install parseurl -``` - -## API - -```js -var parseurl = require('parseurl') -``` - -### parseurl(req) - -Parse the URL of the given request object (looks at the `req.url` property) -and return the result. The result is the same as `url.parse` in Node.js core. -Calling this function multiple times on the same `req` where `req.url` does -not change will return a cached parsed object, rather than parsing again. - -### parseurl.original(req) - -Parse the original URL of the given request object and return the result. -This works by trying to parse `req.originalUrl` if it is a string, otherwise -parses `req.url`. The result is the same as `url.parse` in Node.js core. -Calling this function multiple times on the same `req` where `req.originalUrl` -does not change will return a cached parsed object, rather than parsing again. - -## Benchmark - -```bash -$ npm run-script bench - -> parseurl@1.3.0 bench nodejs-parseurl -> node benchmark/index.js - -> node benchmark/fullurl.js - - Parsing URL "http://localhost:8888/foo/bar?user=tj&pet=fluffy" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 1,290,780 ops/sec ±0.46% (195 runs sampled) - nativeurl x 56,401 ops/sec ±0.22% (196 runs sampled) - parseurl x 55,231 ops/sec ±0.22% (194 runs sampled) - -> node benchmark/pathquery.js - - Parsing URL "/foo/bar?user=tj&pet=fluffy" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 1,986,668 ops/sec ±0.27% (190 runs sampled) - nativeurl x 98,740 ops/sec ±0.21% (195 runs sampled) - parseurl x 2,628,171 ops/sec ±0.36% (195 runs sampled) - -> node benchmark/samerequest.js - - Parsing URL "/foo/bar?user=tj&pet=fluffy" on same request object - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 2,184,468 ops/sec ±0.40% (194 runs sampled) - nativeurl x 99,437 ops/sec ±0.71% (194 runs sampled) - parseurl x 10,498,005 ops/sec ±0.61% (186 runs sampled) - -> node benchmark/simplepath.js - - Parsing URL "/foo/bar" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 4,535,825 ops/sec ±0.27% (191 runs sampled) - nativeurl x 98,769 ops/sec ±0.54% (191 runs sampled) - parseurl x 4,164,865 ops/sec ±0.34% (192 runs sampled) - -> node benchmark/slash.js - - Parsing URL "/" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 4,908,405 ops/sec ±0.42% (191 runs sampled) - nativeurl x 100,945 ops/sec ±0.59% (188 runs sampled) - parseurl x 4,333,208 ops/sec ±0.27% (194 runs sampled) -``` - -## License - - [MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/index.js deleted file mode 100644 index 8632347..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/index.js +++ /dev/null @@ -1,136 +0,0 @@ -/*! - * parseurl - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var url = require('url') -var parse = url.parse -var Url = url.Url - -/** - * Pattern for a simple path case. - * See: https://github.com/joyent/node/pull/7878 - */ - -var simplePathRegExp = /^(\/\/?(?!\/)[^\?#\s]*)(\?[^#\s]*)?$/ - -/** - * Exports. - */ - -module.exports = parseurl -module.exports.original = originalurl - -/** - * Parse the `req` url with memoization. - * - * @param {ServerRequest} req - * @return {Object} - * @api public - */ - -function parseurl(req) { - var url = req.url - - if (url === undefined) { - // URL is undefined - return undefined - } - - var parsed = req._parsedUrl - - if (fresh(url, parsed)) { - // Return cached URL parse - return parsed - } - - // Parse the URL - parsed = fastparse(url) - parsed._raw = url - - return req._parsedUrl = parsed -}; - -/** - * Parse the `req` original url with fallback and memoization. - * - * @param {ServerRequest} req - * @return {Object} - * @api public - */ - -function originalurl(req) { - var url = req.originalUrl - - if (typeof url !== 'string') { - // Fallback - return parseurl(req) - } - - var parsed = req._parsedOriginalUrl - - if (fresh(url, parsed)) { - // Return cached URL parse - return parsed - } - - // Parse the URL - parsed = fastparse(url) - parsed._raw = url - - return req._parsedOriginalUrl = parsed -}; - -/** - * Parse the `str` url with fast-path short-cut. - * - * @param {string} str - * @return {Object} - * @api private - */ - -function fastparse(str) { - // Try fast path regexp - // See: https://github.com/joyent/node/pull/7878 - var simplePath = typeof str === 'string' && simplePathRegExp.exec(str) - - // Construct simple URL - if (simplePath) { - var pathname = simplePath[1] - var search = simplePath[2] || null - var url = Url !== undefined - ? new Url() - : {} - url.path = str - url.href = str - url.pathname = pathname - url.search = search - url.query = search && search.substr(1) - - return url - } - - return parse(str) -} - -/** - * Determine if parsed is still fresh for url. - * - * @param {string} url - * @param {object} parsedUrl - * @return {boolean} - * @api private - */ - -function fresh(url, parsedUrl) { - return typeof parsedUrl === 'object' - && parsedUrl !== null - && (Url === undefined || parsedUrl instanceof Url) - && parsedUrl._raw === url -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/package.json deleted file mode 100644 index 4a6a46b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/parseurl/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "parseurl", - "description": "parse a url with memoization", - "version": "1.3.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/expressjs/parseurl" - }, - "license": "MIT", - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "fast-url-parser": "~1.0.0", - "istanbul": "0.3.0", - "mocha": "~1.21.4" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --check-leaks --bail --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec test/" - }, - "gitHead": "03b7ccca240e2bef5df6c25797e99175d28fb2cb", - "bugs": { - "url": "https://github.com/expressjs/parseurl/issues" - }, - "homepage": "https://github.com/expressjs/parseurl", - "_id": "parseurl@1.3.0", - "_shasum": "b58046db4223e145afa76009e61bac87cc2281b3", - "_from": "parseurl@>=1.3.0 <1.4.0", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "b58046db4223e145afa76009e61bac87cc2281b3", - "tarball": "http://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/History.md deleted file mode 100644 index 7f65878..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/History.md +++ /dev/null @@ -1,36 +0,0 @@ -0.1.7 / 2015-07-28 -================== - - * Fixed regression with escaped round brackets and matching groups. - -0.1.6 / 2015-06-19 -================== - - * Replace `index` feature by outputting all parameters, unnamed and named. - -0.1.5 / 2015-05-08 -================== - - * Add an index property for position in match result. - -0.1.4 / 2015-03-05 -================== - - * Add license information - -0.1.3 / 2014-07-06 -================== - - * Better array support - * Improved support for trailing slash in non-ending mode - -0.1.0 / 2014-03-06 -================== - - * add options.end - -0.0.2 / 2013-02-10 -================== - - * Update to match current express - * add .license property to component.json diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/LICENSE deleted file mode 100644 index 983fbe8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/Readme.md deleted file mode 100644 index 95452a6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/Readme.md +++ /dev/null @@ -1,35 +0,0 @@ -# Path-to-RegExp - -Turn an Express-style path string such as `/user/:name` into a regular expression. - -**Note:** This is a legacy branch. You should upgrade to `1.x`. - -## Usage - -```javascript -var pathToRegexp = require('path-to-regexp'); -``` - -### pathToRegexp(path, keys, options) - - - **path** A string in the express format, an array of such strings, or a regular expression - - **keys** An array to be populated with the keys present in the url. Once the function completes, this will be an array of strings. - - **options** - - **options.sensitive** Defaults to false, set this to true to make routes case sensitive - - **options.strict** Defaults to false, set this to true to make the trailing slash matter. - - **options.end** Defaults to true, set this to false to only match the prefix of the URL. - -```javascript -var keys = []; -var exp = pathToRegexp('/foo/:bar', keys); -//keys = ['bar'] -//exp = /^\/foo\/(?:([^\/]+?))\/?$/i -``` - -## Live Demo - -You can see a live demo of this library in use at [express-route-tester](http://forbeslindesay.github.com/express-route-tester/). - -## License - - MIT diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/index.js deleted file mode 100644 index 500d1da..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/index.js +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Expose `pathtoRegexp`. - */ - -module.exports = pathtoRegexp; - -/** - * Match matching groups in a regular expression. - */ -var MATCHING_GROUP_REGEXP = /\((?!\?)/g; - -/** - * Normalize the given path string, - * returning a regular expression. - * - * An empty array should be passed, - * which will contain the placeholder - * key names. For example "/user/:id" will - * then contain ["id"]. - * - * @param {String|RegExp|Array} path - * @param {Array} keys - * @param {Object} options - * @return {RegExp} - * @api private - */ - -function pathtoRegexp(path, keys, options) { - options = options || {}; - keys = keys || []; - var strict = options.strict; - var end = options.end !== false; - var flags = options.sensitive ? '' : 'i'; - var extraOffset = 0; - var keysOffset = keys.length; - var i = 0; - var name = 0; - var m; - - if (path instanceof RegExp) { - while (m = MATCHING_GROUP_REGEXP.exec(path.source)) { - keys.push({ - name: name++, - optional: false, - offset: m.index - }); - } - - return path; - } - - if (Array.isArray(path)) { - // Map array parts into regexps and return their source. We also pass - // the same keys and options instance into every generation to get - // consistent matching groups before we join the sources together. - path = path.map(function (value) { - return pathtoRegexp(value, keys, options).source; - }); - - return new RegExp('(?:' + path.join('|') + ')', flags); - } - - path = ('^' + path + (strict ? '' : path[path.length - 1] === '/' ? '?' : '/?')) - .replace(/\/\(/g, '/(?:') - .replace(/([\/\.])/g, '\\$1') - .replace(/(\\\/)?(\\\.)?:(\w+)(\(.*?\))?(\*)?(\?)?/g, function (match, slash, format, key, capture, star, optional, offset) { - slash = slash || ''; - format = format || ''; - capture = capture || '([^\\/' + format + ']+?)'; - optional = optional || ''; - - keys.push({ - name: key, - optional: !!optional, - offset: offset + extraOffset - }); - - var result = '' - + (optional ? '' : slash) - + '(?:' - + format + (optional ? slash : '') + capture - + (star ? '((?:[\\/' + format + '].+?)?)' : '') - + ')' - + optional; - - extraOffset += result.length - match.length; - - return result; - }) - .replace(/\*/g, function (star, index) { - var len = keys.length - - while (len-- > keysOffset && keys[len].offset > index) { - keys[len].offset += 3; // Replacement length minus asterisk length. - } - - return '(.*)'; - }); - - // This is a workaround for handling unnamed matching groups. - while (m = MATCHING_GROUP_REGEXP.exec(path)) { - var escapeCount = 0; - var index = m.index; - - while (path.charAt(--index) === '\\') { - escapeCount++; - } - - // It's possible to escape the bracket. - if (escapeCount % 2 === 1) { - continue; - } - - if (keysOffset + i === keys.length || keys[keysOffset + i].offset > m.index) { - keys.splice(keysOffset + i, 0, { - name: name++, // Unnamed matching groups must be consistently linear. - optional: false, - offset: m.index - }); - } - - i++; - } - - // If the path is non-ending, match until the end or a slash. - path += (end ? '$' : (path[path.length - 1] === '/' ? '' : '(?=\\/|$)')); - - return new RegExp(path, flags); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/package.json deleted file mode 100644 index 118b1e6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/path-to-regexp/package.json +++ /dev/null @@ -1,185 +0,0 @@ -{ - "name": "path-to-regexp", - "description": "Express style path to RegExp utility", - "version": "0.1.7", - "files": [ - "index.js", - "LICENSE" - ], - "scripts": { - "test": "istanbul cover _mocha -- -R spec" - }, - "keywords": [ - "express", - "regexp" - ], - "component": { - "scripts": { - "path-to-regexp": "index.js" - } - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/component/path-to-regexp.git" - }, - "devDependencies": { - "mocha": "^1.17.1", - "istanbul": "^0.2.6" - }, - "gitHead": "039118d6c3c186d3f176c73935ca887a32a33d93", - "bugs": { - "url": "https://github.com/component/path-to-regexp/issues" - }, - "homepage": "https://github.com/component/path-to-regexp#readme", - "_id": "path-to-regexp@0.1.7", - "_shasum": "df604178005f522f15eb4490e7247a1bfaa67f8c", - "_from": "path-to-regexp@0.1.7", - "_npmVersion": "2.13.2", - "_nodeVersion": "2.3.3", - "_npmUser": { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "hughsk", - "email": "hughskennedy@gmail.com" - }, - { - "name": "timaschew", - "email": "timaschew@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dominicbarnes", - "email": "dominic@dbarnes.info" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - { - "name": "retrofox", - "email": "rdsuarez@gmail.com" - }, - { - "name": "coreh", - "email": "thecoreh@gmail.com" - }, - { - "name": "forbeslindesay", - "email": "forbes@lindesay.co.uk" - }, - { - "name": "kelonye", - "email": "kelonyemitchel@gmail.com" - }, - { - "name": "mattmueller", - "email": "mattmuelle@gmail.com" - }, - { - "name": "yields", - "email": "yields@icloud.com" - }, - { - "name": "anthonyshort", - "email": "antshort@gmail.com" - }, - { - "name": "ianstormtaylor", - "email": "ian@ianstormtaylor.com" - }, - { - "name": "cristiandouce", - "email": "cristian@gravityonmars.com" - }, - { - "name": "swatinem", - "email": "arpad.borsos@googlemail.com" - }, - { - "name": "stagas", - "email": "gstagas@gmail.com" - }, - { - "name": "amasad", - "email": "amjad.masad@gmail.com" - }, - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - { - "name": "calvinfo", - "email": "calvin@calv.info" - }, - { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - { - "name": "timoxley", - "email": "secoif@gmail.com" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "queckezz", - "email": "fabian.eichenberger@gmail.com" - }, - { - "name": "nami-doc", - "email": "vendethiel@hotmail.fr" - }, - { - "name": "clintwood", - "email": "clint@anotherway.co.za" - }, - { - "name": "thehydroimpulse", - "email": "dnfagnan@gmail.com" - }, - { - "name": "stephenmathieson", - "email": "me@stephenmathieson.com" - }, - { - "name": "trevorgerhardt", - "email": "trevorgerhardt@gmail.com" - }, - { - "name": "dfcreative", - "email": "df.creative@gmail.com" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "df604178005f522f15eb4490e7247a1bfaa67f8c", - "tarball": "http://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/HISTORY.md deleted file mode 100644 index 7248dbb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/HISTORY.md +++ /dev/null @@ -1,66 +0,0 @@ -1.0.8 / 2015-05-10 -================== - - * deps: ipaddr.js@1.0.1 - -1.0.7 / 2015-03-16 -================== - - * deps: ipaddr.js@0.1.9 - - Fix OOM on certain inputs to `isValid` - -1.0.6 / 2015-02-01 -================== - - * deps: ipaddr.js@0.1.8 - -1.0.5 / 2015-01-08 -================== - - * deps: ipaddr.js@0.1.6 - -1.0.4 / 2014-11-23 -================== - - * deps: ipaddr.js@0.1.5 - - Fix edge cases with `isValid` - -1.0.3 / 2014-09-21 -================== - - * Use `forwarded` npm module - -1.0.2 / 2014-09-18 -================== - - * Fix a global leak when multiple subnets are trusted - * Support Node.js 0.6 - * deps: ipaddr.js@0.1.3 - -1.0.1 / 2014-06-03 -================== - - * Fix links in npm package - -1.0.0 / 2014-05-08 -================== - - * Add `trust` argument to determine proxy trust on - * Accepts custom function - * Accepts IPv4/IPv6 address(es) - * Accepts subnets - * Accepts pre-defined names - * Add optional `trust` argument to `proxyaddr.all` to - stop at first untrusted - * Add `proxyaddr.compile` to pre-compile `trust` function - to make subsequent calls faster - -0.0.1 / 2014-05-04 -================== - - * Fix bad npm publish - -0.0.0 / 2014-05-04 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/README.md deleted file mode 100644 index 26f7fc0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/README.md +++ /dev/null @@ -1,137 +0,0 @@ -# proxy-addr - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Determine address of proxied request - -## Install - -```sh -$ npm install proxy-addr -``` - -## API - -```js -var proxyaddr = require('proxy-addr') -``` - -### proxyaddr(req, trust) - -Return the address of the request, using the given `trust` parameter. - -The `trust` argument is a function that returns `true` if you trust -the address, `false` if you don't. The closest untrusted address is -returned. - -```js -proxyaddr(req, function(addr){ return addr === '127.0.0.1' }) -proxyaddr(req, function(addr, i){ return i < 1 }) -``` - -The `trust` arugment may also be a single IP address string or an -array of trusted addresses, as plain IP addresses, CIDR-formatted -strings, or IP/netmask strings. - -```js -proxyaddr(req, '127.0.0.1') -proxyaddr(req, ['127.0.0.0/8', '10.0.0.0/8']) -proxyaddr(req, ['127.0.0.0/255.0.0.0', '192.168.0.0/255.255.0.0']) -``` - -This module also supports IPv6. Your IPv6 addresses will be normalized -automatically (i.e. `fe80::00ed:1` equals `fe80:0:0:0:0:0:ed:1`). - -```js -proxyaddr(req, '::1') -proxyaddr(req, ['::1/128', 'fe80::/10']) -proxyaddr(req, ['fe80::/ffc0::']) -``` - -This module will automatically work with IPv4-mapped IPv6 addresses -as well to support node.js in IPv6-only mode. This means that you do -not have to specify both `::ffff:a00:1` and `10.0.0.1`. - -As a convenience, this module also takes certain pre-defined names -in addition to IP addresses, which expand into IP addresses: - -```js -proxyaddr(req, 'loopback') -proxyaddr(req, ['loopback', 'fc00:ac:1ab5:fff::1/64']) -``` - - * `loopback`: IPv4 and IPv6 loopback addresses (like `::1` and - `127.0.0.1`). - * `linklocal`: IPv4 and IPv6 link-local addresses (like - `fe80::1:1:1:1` and `169.254.0.1`). - * `uniquelocal`: IPv4 private addresses and IPv6 unique-local - addresses (like `fc00:ac:1ab5:fff::1` and `192.168.0.1`). - -When `trust` is specified as a function, it will be called for each -address to determine if it is a trusted address. The function is -given two arguments: `addr` and `i`, where `addr` is a string of -the address to check and `i` is a number that represents the distance -from the socket address. - -### proxyaddr.all(req, [trust]) - -Return all the addresses of the request, optionally stopping at the -first untrusted. This array is ordered from closest to furthest -(i.e. `arr[0] === req.connection.remoteAddress`). - -```js -proxyaddr.all(req) -``` - -The optional `trust` argument takes the same arguments as `trust` -does in `proxyaddr(req, trust)`. - -```js -proxyaddr.all(req, 'loopback') -``` - -### proxyaddr.compile(val) - -Compiles argument `val` into a `trust` function. This function takes -the same arguments as `trust` does in `proxyaddr(req, trust)` and -returns a function suitable for `proxyaddr(req, trust)`. - -```js -var trust = proxyaddr.compile('localhost') -var addr = proxyaddr(req, trust) -``` - -This function is meant to be optimized for use against every request. -It is recommend to compile a trust function up-front for the trusted -configuration and pass that to `proxyaddr(req, trust)` for each request. - -## Testing - -```sh -$ npm test -``` - -## Benchmarks - -```sh -$ npm run-script bench -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/proxy-addr.svg -[npm-url]: https://npmjs.org/package/proxy-addr -[node-version-image]: https://img.shields.io/node/v/proxy-addr.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/proxy-addr/master.svg -[travis-url]: https://travis-ci.org/jshttp/proxy-addr -[coveralls-image]: https://img.shields.io/coveralls/jshttp/proxy-addr/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/proxy-addr?branch=master -[downloads-image]: https://img.shields.io/npm/dm/proxy-addr.svg -[downloads-url]: https://npmjs.org/package/proxy-addr diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/index.js deleted file mode 100644 index d739513..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/index.js +++ /dev/null @@ -1,345 +0,0 @@ -/*! - * proxy-addr - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = proxyaddr; -module.exports.all = alladdrs; -module.exports.compile = compile; - -/** - * Module dependencies. - */ - -var forwarded = require('forwarded'); -var ipaddr = require('ipaddr.js'); - -/** - * Variables. - */ - -var digitre = /^[0-9]+$/; -var isip = ipaddr.isValid; -var parseip = ipaddr.parse; - -/** - * Pre-defined IP ranges. - */ - -var ipranges = { - linklocal: ['169.254.0.0/16', 'fe80::/10'], - loopback: ['127.0.0.1/8', '::1/128'], - uniquelocal: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fc00::/7'] -}; - -/** - * Get all addresses in the request, optionally stopping - * at the first untrusted. - * - * @param {Object} request - * @param {Function|Array|String} [trust] - * @api public - */ - -function alladdrs(req, trust) { - // get addresses - var addrs = forwarded(req); - - if (!trust) { - // Return all addresses - return addrs; - } - - if (typeof trust !== 'function') { - trust = compile(trust); - } - - for (var i = 0; i < addrs.length - 1; i++) { - if (trust(addrs[i], i)) continue; - - addrs.length = i + 1; - } - - return addrs; -} - -/** - * Compile argument into trust function. - * - * @param {Array|String} val - * @api private - */ - -function compile(val) { - if (!val) { - throw new TypeError('argument is required'); - } - - var trust = typeof val === 'string' - ? [val] - : val; - - if (!Array.isArray(trust)) { - throw new TypeError('unsupported trust argument'); - } - - for (var i = 0; i < trust.length; i++) { - val = trust[i]; - - if (!ipranges.hasOwnProperty(val)) { - continue; - } - - // Splice in pre-defined range - val = ipranges[val]; - trust.splice.apply(trust, [i, 1].concat(val)); - i += val.length - 1; - } - - return compileTrust(compileRangeSubnets(trust)); -} - -/** - * Compile `arr` elements into range subnets. - * - * @param {Array} arr - * @api private - */ - -function compileRangeSubnets(arr) { - var rangeSubnets = new Array(arr.length); - - for (var i = 0; i < arr.length; i++) { - rangeSubnets[i] = parseipNotation(arr[i]); - } - - return rangeSubnets; -} - -/** - * Compile range subnet array into trust function. - * - * @param {Array} rangeSubnets - * @api private - */ - -function compileTrust(rangeSubnets) { - // Return optimized function based on length - var len = rangeSubnets.length; - return len === 0 - ? trustNone - : len === 1 - ? trustSingle(rangeSubnets[0]) - : trustMulti(rangeSubnets); -} - -/** - * Parse IP notation string into range subnet. - * - * @param {String} note - * @api private - */ - -function parseipNotation(note) { - var ip; - var kind; - var max; - var pos = note.lastIndexOf('/'); - var range; - - ip = pos !== -1 - ? note.substring(0, pos) - : note; - - if (!isip(ip)) { - throw new TypeError('invalid IP address: ' + ip); - } - - ip = parseip(ip); - - kind = ip.kind(); - max = kind === 'ipv6' - ? 128 - : 32; - - range = pos !== -1 - ? note.substring(pos + 1, note.length) - : max; - - if (typeof range !== 'number') { - range = digitre.test(range) - ? parseInt(range, 10) - : isip(range) - ? parseNetmask(range) - : 0; - } - - if (ip.kind() === 'ipv6' && ip.isIPv4MappedAddress()) { - // Store as IPv4 - ip = ip.toIPv4Address(); - range = range <= max - ? range - 96 - : range; - } - - if (range <= 0 || range > max) { - throw new TypeError('invalid range on address: ' + note); - } - - return [ip, range]; -} - -/** - * Parse netmask string into CIDR range. - * - * @param {String} note - * @api private - */ - -function parseNetmask(netmask) { - var ip = parseip(netmask); - var parts; - var size; - - switch (ip.kind()) { - case 'ipv4': - parts = ip.octets; - size = 8; - break; - case 'ipv6': - parts = ip.parts; - size = 16; - break; - } - - var max = Math.pow(2, size) - 1; - var part; - var range = 0; - - for (var i = 0; i < parts.length; i++) { - part = parts[i] & max; - - if (part === max) { - range += size; - continue; - } - - while (part) { - part = (part << 1) & max; - range += 1; - } - - break; - } - - return range; -} - -/** - * Determine address of proxied request. - * - * @param {Object} request - * @param {Function|Array|String} trust - * @api public - */ - -function proxyaddr(req, trust) { - if (!req) { - throw new TypeError('req argument is required'); - } - - if (!trust) { - throw new TypeError('trust argument is required'); - } - - var addrs = alladdrs(req, trust); - var addr = addrs[addrs.length - 1]; - - return addr; -} - -/** - * Static trust function to trust nothing. - * - * @api private - */ - -function trustNone() { - return false; -} - -/** - * Compile trust function for multiple subnets. - * - * @param {Array} subnets - * @api private - */ - -function trustMulti(subnets) { - return function trust(addr) { - if (!isip(addr)) return false; - - var ip = parseip(addr); - var ipv4; - var kind = ip.kind(); - var subnet; - var subnetip; - var subnetkind; - var subnetrange; - var trusted; - - for (var i = 0; i < subnets.length; i++) { - subnet = subnets[i]; - subnetip = subnet[0]; - subnetkind = subnetip.kind(); - subnetrange = subnet[1]; - trusted = ip; - - if (kind !== subnetkind) { - if (kind !== 'ipv6' || subnetkind !== 'ipv4' || !ip.isIPv4MappedAddress()) { - continue; - } - - // Store addr as IPv4 - ipv4 = ipv4 || ip.toIPv4Address(); - trusted = ipv4; - } - - if (trusted.match(subnetip, subnetrange)) return true; - } - - return false; - }; -} - -/** - * Compile trust function for single subnet. - * - * @param {Object} subnet - * @api private - */ - -function trustSingle(subnet) { - var subnetip = subnet[0]; - var subnetkind = subnetip.kind(); - var subnetisipv4 = subnetkind === 'ipv4'; - var subnetrange = subnet[1]; - - return function trust(addr) { - if (!isip(addr)) return false; - - var ip = parseip(addr); - var kind = ip.kind(); - - return kind === subnetkind - ? ip.match(subnetip, subnetrange) - : subnetisipv4 && kind === 'ipv6' && ip.isIPv4MappedAddress() - ? ip.toIPv4Address().match(subnetip, subnetrange) - : false; - }; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md deleted file mode 100644 index 97fa1d1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md +++ /dev/null @@ -1,4 +0,0 @@ -0.1.0 / 2014-09-21 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md deleted file mode 100644 index 2b4988f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# forwarded - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Parse HTTP X-Forwarded-For header - -## Installation - -```sh -$ npm install forwarded -``` - -## API - -```js -var forwarded = require('forwarded') -``` - -### forwarded(req) - -```js -var addresses = forwarded(req) -``` - -Parse the `X-Forwarded-For` header from the request. Returns an array -of the addresses, including the socket address for the `req`. In reverse -order (i.e. index `0` is the socket address and the last index is the -furthest address, typically the end-user). - -## Testing - -```sh -$ npm test -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/forwarded.svg?style=flat -[npm-url]: https://npmjs.org/package/forwarded -[node-version-image]: https://img.shields.io/node/v/forwarded.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/forwarded.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/forwarded -[coveralls-image]: https://img.shields.io/coveralls/jshttp/forwarded.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/forwarded?branch=master -[downloads-image]: https://img.shields.io/npm/dm/forwarded.svg?style=flat -[downloads-url]: https://npmjs.org/package/forwarded diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js deleted file mode 100644 index 2f5c340..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js +++ /dev/null @@ -1,35 +0,0 @@ -/*! - * forwarded - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = forwarded - -/** - * Get all addresses in the request, using the `X-Forwarded-For` header. - * - * @param {Object} req - * @api public - */ - -function forwarded(req) { - if (!req) { - throw new TypeError('argument req is required') - } - - // simple header parsing - var proxyAddrs = (req.headers['x-forwarded-for'] || '') - .split(/ *, */) - .filter(Boolean) - .reverse() - var socketAddr = req.connection.remoteAddress - var addrs = [socketAddr].concat(proxyAddrs) - - // return all addresses - return addrs -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json deleted file mode 100644 index fa8af9e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "forwarded", - "description": "Parse HTTP X-Forwarded-For header", - "version": "0.1.0", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "keywords": [ - "x-forwarded-for", - "http", - "req" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/forwarded" - }, - "devDependencies": { - "istanbul": "0.3.2", - "mocha": "~1.21.4" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "e9a9faeb3cfaadf40eb57d144fff26bca9b818e8", - "bugs": { - "url": "https://github.com/jshttp/forwarded/issues" - }, - "homepage": "https://github.com/jshttp/forwarded", - "_id": "forwarded@0.1.0", - "_shasum": "19ef9874c4ae1c297bcf078fde63a09b66a84363", - "_from": "forwarded@>=0.1.0 <0.2.0", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "19ef9874c4ae1c297bcf078fde63a09b66a84363", - "tarball": "http://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore deleted file mode 100644 index 7a1537b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.idea -node_modules diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile deleted file mode 100644 index 7fd355a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile +++ /dev/null @@ -1,18 +0,0 @@ -fs = require 'fs' -CoffeeScript = require 'coffee-script' -nodeunit = require 'nodeunit' -UglifyJS = require 'uglify-js' - -task 'build', 'build the JavaScript files from CoffeeScript source', build = (cb) -> - source = fs.readFileSync 'src/ipaddr.coffee' - fs.writeFileSync 'lib/ipaddr.js', CoffeeScript.compile source.toString() - - invoke 'test' - invoke 'compress' - -task 'test', 'run the bundled tests', (cb) -> - nodeunit.reporters.default.run ['test'] - -task 'compress', 'uglify the resulting javascript', (cb) -> - result = UglifyJS.minify('lib/ipaddr.js') - fs.writeFileSync('ipaddr.min.js', result.code) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE deleted file mode 100644 index 3493f0d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2011 Peter Zotov - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md deleted file mode 100644 index c596e7e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md +++ /dev/null @@ -1,161 +0,0 @@ -# ipaddr.js — an IPv6 and IPv4 address manipulation library - -ipaddr.js is a small (1.9K minified and gzipped) library for manipulating -IP addresses in JavaScript environments. It runs on both CommonJS runtimes -(e.g. [nodejs]) and in a web browser. - -ipaddr.js allows you to verify and parse string representation of an IP -address, match it against a CIDR range or range list, determine if it falls -into some reserved ranges (examples include loopback and private ranges), -and convert between IPv4 and IPv4-mapped IPv6 addresses. - -[nodejs]: http://nodejs.org - -## Installation - -`npm install ipaddr.js` - -## API - -ipaddr.js defines one object in the global scope: `ipaddr`. In CommonJS, -it is exported from the module: - -```js -var ipaddr = require('ipaddr.js'); -``` - -The API consists of several global methods and two classes: ipaddr.IPv6 and ipaddr.IPv4. - -### Global methods - -There are three global methods defined: `ipaddr.isValid`, `ipaddr.parse` and -`ipaddr.process`. All of them receive a string as a single parameter. - -The `ipaddr.isValid` method returns `true` if the address is a valid IPv4 or -IPv6 address, and `false` otherwise. It does not throw any exceptions. - -The `ipaddr.parse` method returns an object representing the IP address, -or throws an `Error` if the passed string is not a valid representation of an -IP address. - -The `ipaddr.process` method works just like the `ipaddr.parse` one, but it -automatically converts IPv4-mapped IPv6 addresses to their IPv4 couterparts -before returning. It is useful when you have a Node.js instance listening -on an IPv6 socket, and the `net.ivp6.bindv6only` sysctl parameter (or its -equivalent on non-Linux OS) is set to 0. In this case, you can accept IPv4 -connections on your IPv6-only socket, but the remote address will be mangled. -Use `ipaddr.process` method to automatically demangle it. - -### Object representation - -Parsing methods return an object which descends from `ipaddr.IPv6` or -`ipaddr.IPv4`. These objects share some properties, but most of them differ. - -#### Shared properties - -One can determine the type of address by calling `addr.kind()`. It will return -either `"ipv6"` or `"ipv4"`. - -An address can be converted back to its string representation with `addr.toString()`. -Note that this method: - * does not return the original string used to create the object (in fact, there is - no way of getting that string) - * returns a compact representation (when it is applicable) - -A `match(range, bits)` method can be used to check if the address falls into a -certain CIDR range. -Note that an address can be (obviously) matched only against an address of the same type. - -For example: - -```js -var addr = ipaddr.parse("2001:db8:1234::1"); -var range = ipaddr.parse("2001:db8::"); - -addr.match(range, 32); // => true -``` - -Alternatively, `match` can also be called as `match([range, bits])`. In this way, -it can be used together with the `parseCIDR(string)` method, which parses an IP -address together with a CIDR range. - -For example: - -```js -var addr = ipaddr.parse("2001:db8:1234::1"); - -addr.match(ipaddr.parseCIDR("2001:db8::/32")); // => true -``` - -A `range()` method returns one of predefined names for several special ranges defined -by IP protocols. The exact names (and their respective CIDR ranges) can be looked up -in the source: [IPv6 ranges] and [IPv4 ranges]. Some common ones include `"unicast"` -(the default one) and `"reserved"`. - -You can match against your own range list by using -`ipaddr.subnetMatch(address, rangeList, defaultName)` method. It can work with both -IPv6 and IPv4 addresses, and accepts a name-to-subnet map as the range list. For example: - -```js -var rangeList = { - documentationOnly: [ ipaddr.parse('2001:db8::'), 32 ], - tunnelProviders: [ - [ ipaddr.parse('2001:470::'), 32 ], // he.net - [ ipaddr.parse('2001:5c0::'), 32 ] // freenet6 - ] -}; -ipaddr.subnetMatch(ipaddr.parse('2001:470:8:66::1'), rangeList, 'unknown'); // => "he.net" -``` - -The addresses can be converted to their byte representation with `toByteArray()`. -(Actually, JavaScript mostly does not know about byte buffers. They are emulated with -arrays of numbers, each in range of 0..255.) - -```js -var bytes = ipaddr.parse('2a00:1450:8007::68').toByteArray(); // ipv6.google.com -bytes // => [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, , 0x00, 0x68 ] -``` - -The `ipaddr.IPv4` and `ipaddr.IPv6` objects have some methods defined, too. All of them -have the same interface for both protocols, and are similar to global methods. - -`ipaddr.IPvX.isValid(string)` can be used to check if the string is a valid address -for particular protocol, and `ipaddr.IPvX.parse(string)` is the error-throwing parser. - -[IPv6 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L186 -[IPv4 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L71 - -#### IPv6 properties - -Sometimes you will want to convert IPv6 not to a compact string representation (with -the `::` substitution); the `toNormalizedString()` method will return an address where -all zeroes are explicit. - -For example: - -```js -var addr = ipaddr.parse("2001:0db8::0001"); -addr.toString(); // => "2001:db8::1" -addr.toNormalizedString(); // => "2001:db8:0:0:0:0:0:1" -``` - -The `isIPv4MappedAddress()` method will return `true` if this address is an IPv4-mapped -one, and `toIPv4Address()` will return an IPv4 object address. - -To access the underlying binary representation of the address, use `addr.parts`. - -```js -var addr = ipaddr.parse("2001:db8:10::1234:DEAD"); -addr.parts // => [0x2001, 0xdb8, 0x10, 0, 0, 0, 0x1234, 0xdead] -``` - -#### IPv4 properties - -`toIPv4MappedAddress()` will return a corresponding IPv4-mapped IPv6 address. - -To access the underlying representation of the address, use `addr.octets`. - -```js -var addr = ipaddr.parse("192.168.1.1"); -addr.octets // => [192, 168, 1, 1] -``` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js deleted file mode 100644 index 9e2800d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var r,t,e,n,i,o,a,s;t={},s=this,"undefined"!=typeof module&&null!==module&&module.exports?module.exports=t:s.ipaddr=t,a=function(r,t,e,n){var i,o;if(r.length!==t.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;n>0;){if(o=e-n,0>o&&(o=0),r[i]>>o!==t[i]>>o)return!1;n-=e,i+=1}return!0},t.subnetMatch=function(r,t,e){var n,i,o,a,s;null==e&&(e="unicast");for(n in t)for(i=t[n],"[object Array]"!==toString.call(i[0])&&(i=[i]),a=0,s=i.length;s>a;a++)if(o=i[a],r.match.apply(r,o))return n;return e},t.IPv4=function(){function r(r){var t,e,n;if(4!==r.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(e=0,n=r.length;n>e;e++)if(t=r[e],!(t>=0&&255>=t))throw new Error("ipaddr: ipv4 octet is a byte");this.octets=r}return r.prototype.kind=function(){return"ipv4"},r.prototype.toString=function(){return this.octets.join(".")},r.prototype.toByteArray=function(){return this.octets.slice(0)},r.prototype.match=function(r,t){var e;if(void 0===t&&(e=r,r=e[0],t=e[1]),"ipv4"!==r.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return a(this.octets,r.octets,8,t)},r.prototype.SpecialRanges={unspecified:[[new r([0,0,0,0]),8]],broadcast:[[new r([255,255,255,255]),32]],multicast:[[new r([224,0,0,0]),4]],linkLocal:[[new r([169,254,0,0]),16]],loopback:[[new r([127,0,0,0]),8]],"private":[[new r([10,0,0,0]),8],[new r([172,16,0,0]),12],[new r([192,168,0,0]),16]],reserved:[[new r([192,0,0,0]),24],[new r([192,0,2,0]),24],[new r([192,88,99,0]),24],[new r([198,51,100,0]),24],[new r([203,0,113,0]),24],[new r([240,0,0,0]),4]]},r.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},r.prototype.toIPv4MappedAddress=function(){return t.IPv6.parse("::ffff:"+this.toString())},r}(),e="(0?\\d+|0x[a-f0-9]+)",n={fourOctet:new RegExp("^"+e+"\\."+e+"\\."+e+"\\."+e+"$","i"),longValue:new RegExp("^"+e+"$","i")},t.IPv4.parser=function(r){var t,e,i,o,a;if(e=function(r){return"0"===r[0]&&"x"!==r[1]?parseInt(r,8):parseInt(r)},t=r.match(n.fourOctet))return function(){var r,n,o,a;for(o=t.slice(1,6),a=[],r=0,n=o.length;n>r;r++)i=o[r],a.push(e(i));return a}();if(t=r.match(n.longValue)){if(a=e(t[1]),a>4294967295||0>a)throw new Error("ipaddr: address outside defined range");return function(){var r,t;for(t=[],o=r=0;24>=r;o=r+=8)t.push(a>>o&255);return t}().reverse()}return null},t.IPv6=function(){function r(r){var t,e,n;if(8!==r.length)throw new Error("ipaddr: ipv6 part count should be 8");for(e=0,n=r.length;n>e;e++)if(t=r[e],!(t>=0&&65535>=t))throw new Error("ipaddr: ipv6 part should fit to two octets");this.parts=r}return r.prototype.kind=function(){return"ipv6"},r.prototype.toString=function(){var r,t,e,n,i,o,a;for(i=function(){var r,e,n,i;for(n=this.parts,i=[],r=0,e=n.length;e>r;r++)t=n[r],i.push(t.toString(16));return i}.call(this),r=[],e=function(t){return r.push(t)},n=0,o=0,a=i.length;a>o;o++)switch(t=i[o],n){case 0:e("0"===t?"":t),n=1;break;case 1:"0"===t?n=2:e(t);break;case 2:"0"!==t&&(e(""),e(t),n=3);break;case 3:e(t)}return 2===n&&(e(""),e("")),r.join(":")},r.prototype.toByteArray=function(){var r,t,e,n,i;for(r=[],i=this.parts,e=0,n=i.length;n>e;e++)t=i[e],r.push(t>>8),r.push(255&t);return r},r.prototype.toNormalizedString=function(){var r;return function(){var t,e,n,i;for(n=this.parts,i=[],t=0,e=n.length;e>t;t++)r=n[t],i.push(r.toString(16));return i}.call(this).join(":")},r.prototype.match=function(r,t){var e;if(void 0===t&&(e=r,r=e[0],t=e[1]),"ipv6"!==r.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return a(this.parts,r.parts,16,t)},r.prototype.SpecialRanges={unspecified:[new r([0,0,0,0,0,0,0,0]),128],linkLocal:[new r([65152,0,0,0,0,0,0,0]),10],multicast:[new r([65280,0,0,0,0,0,0,0]),8],loopback:[new r([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new r([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new r([0,0,0,0,0,65535,0,0]),96],rfc6145:[new r([0,0,0,0,65535,0,0,0]),96],rfc6052:[new r([100,65435,0,0,0,0,0,0]),96],"6to4":[new r([8194,0,0,0,0,0,0,0]),16],teredo:[new r([8193,0,0,0,0,0,0,0]),32],reserved:[[new r([8193,3512,0,0,0,0,0,0]),32]]},r.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},r.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},r.prototype.toIPv4Address=function(){var r,e,n;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return n=this.parts.slice(-2),r=n[0],e=n[1],new t.IPv4([r>>8,255&r,e>>8,255&e])},r}(),i="(?:[0-9a-f]+::?)+",o={"native":new RegExp("^(::)?("+i+")?([0-9a-f]+)?(::)?$","i"),transitional:new RegExp("^((?:"+i+")|(?:::)(?:"+i+")?)"+(""+e+"\\."+e+"\\."+e+"\\."+e+"$"),"i")},r=function(r,t){var e,n,i,o,a;if(r.indexOf("::")!==r.lastIndexOf("::"))return null;for(e=0,n=-1;(n=r.indexOf(":",n+1))>=0;)e++;if(":"===r[0]&&e--,":"===r[r.length-1]&&e--,e>t)return null;for(a=t-e,o=":";a--;)o+="0:";return r=r.replace("::",o),":"===r[0]&&(r=r.slice(1)),":"===r[r.length-1]&&(r=r.slice(0,-1)),function(){var t,e,n,o;for(n=r.split(":"),o=[],t=0,e=n.length;e>t;t++)i=n[t],o.push(parseInt(i,16));return o}()},t.IPv6.parser=function(t){var e,n;return t.match(o["native"])?r(t,8):(e=t.match(o.transitional))&&(n=r(e[1].slice(0,-1),6))?(n.push(parseInt(e[2])<<8|parseInt(e[3])),n.push(parseInt(e[4])<<8|parseInt(e[5])),n):null},t.IPv4.isIPv4=t.IPv6.isIPv6=function(r){return null!==this.parser(r)},t.IPv4.isValid=t.IPv6.isValid=function(r){var t;try{return new this(this.parser(r)),!0}catch(e){return t=e,!1}},t.IPv4.parse=t.IPv6.parse=function(r){var t;if(t=this.parser(r),null===t)throw new Error("ipaddr: string is not formatted like ip address");return new this(t)},t.IPv4.parseCIDR=t.IPv6.parseCIDR=function(r){var t;if(t=r.match(/^(.+)\/(\d+)$/))return[this.parse(t[1]),parseInt(t[2])];throw new Error("ipaddr: string is not formatted like a CIDR range")},t.isValid=function(r){return t.IPv6.isValid(r)||t.IPv4.isValid(r)},t.parse=function(r){if(t.IPv6.isValid(r))return t.IPv6.parse(r);if(t.IPv4.isValid(r))return t.IPv4.parse(r);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},t.parseCIDR=function(r){var e;try{return t.IPv6.parseCIDR(r)}catch(n){e=n;try{return t.IPv4.parseCIDR(r)}catch(n){throw e=n,new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format")}}},t.process=function(r){var t;return t=this.parse(r),"ipv6"===t.kind()&&t.isIPv4MappedAddress()?t.toIPv4Address():t}}).call(this); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js deleted file mode 100644 index 5d99e08..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js +++ /dev/null @@ -1,439 +0,0 @@ -(function() { - var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root; - - ipaddr = {}; - - root = this; - - if ((typeof module !== "undefined" && module !== null) && module.exports) { - module.exports = ipaddr; - } else { - root['ipaddr'] = ipaddr; - } - - matchCIDR = function(first, second, partSize, cidrBits) { - var part, shift; - if (first.length !== second.length) { - throw new Error("ipaddr: cannot match CIDR for objects with different lengths"); - } - part = 0; - while (cidrBits > 0) { - shift = partSize - cidrBits; - if (shift < 0) { - shift = 0; - } - if (first[part] >> shift !== second[part] >> shift) { - return false; - } - cidrBits -= partSize; - part += 1; - } - return true; - }; - - ipaddr.subnetMatch = function(address, rangeList, defaultName) { - var rangeName, rangeSubnets, subnet, _i, _len; - if (defaultName == null) { - defaultName = 'unicast'; - } - for (rangeName in rangeList) { - rangeSubnets = rangeList[rangeName]; - if (toString.call(rangeSubnets[0]) !== '[object Array]') { - rangeSubnets = [rangeSubnets]; - } - for (_i = 0, _len = rangeSubnets.length; _i < _len; _i++) { - subnet = rangeSubnets[_i]; - if (address.match.apply(address, subnet)) { - return rangeName; - } - } - } - return defaultName; - }; - - ipaddr.IPv4 = (function() { - function IPv4(octets) { - var octet, _i, _len; - if (octets.length !== 4) { - throw new Error("ipaddr: ipv4 octet count should be 4"); - } - for (_i = 0, _len = octets.length; _i < _len; _i++) { - octet = octets[_i]; - if (!((0 <= octet && octet <= 255))) { - throw new Error("ipaddr: ipv4 octet is a byte"); - } - } - this.octets = octets; - } - - IPv4.prototype.kind = function() { - return 'ipv4'; - }; - - IPv4.prototype.toString = function() { - return this.octets.join("."); - }; - - IPv4.prototype.toByteArray = function() { - return this.octets.slice(0); - }; - - IPv4.prototype.match = function(other, cidrRange) { - var _ref; - if (cidrRange === void 0) { - _ref = other, other = _ref[0], cidrRange = _ref[1]; - } - if (other.kind() !== 'ipv4') { - throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one"); - } - return matchCIDR(this.octets, other.octets, 8, cidrRange); - }; - - IPv4.prototype.SpecialRanges = { - unspecified: [[new IPv4([0, 0, 0, 0]), 8]], - broadcast: [[new IPv4([255, 255, 255, 255]), 32]], - multicast: [[new IPv4([224, 0, 0, 0]), 4]], - linkLocal: [[new IPv4([169, 254, 0, 0]), 16]], - loopback: [[new IPv4([127, 0, 0, 0]), 8]], - "private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]], - reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]] - }; - - IPv4.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv4.prototype.toIPv4MappedAddress = function() { - return ipaddr.IPv6.parse("::ffff:" + (this.toString())); - }; - - return IPv4; - - })(); - - ipv4Part = "(0?\\d+|0x[a-f0-9]+)"; - - ipv4Regexes = { - fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'), - longValue: new RegExp("^" + ipv4Part + "$", 'i') - }; - - ipaddr.IPv4.parser = function(string) { - var match, parseIntAuto, part, shift, value; - parseIntAuto = function(string) { - if (string[0] === "0" && string[1] !== "x") { - return parseInt(string, 8); - } else { - return parseInt(string); - } - }; - if (match = string.match(ipv4Regexes.fourOctet)) { - return (function() { - var _i, _len, _ref, _results; - _ref = match.slice(1, 6); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(parseIntAuto(part)); - } - return _results; - })(); - } else if (match = string.match(ipv4Regexes.longValue)) { - value = parseIntAuto(match[1]); - if (value > 0xffffffff || value < 0) { - throw new Error("ipaddr: address outside defined range"); - } - return ((function() { - var _i, _results; - _results = []; - for (shift = _i = 0; _i <= 24; shift = _i += 8) { - _results.push((value >> shift) & 0xff); - } - return _results; - })()).reverse(); - } else { - return null; - } - }; - - ipaddr.IPv6 = (function() { - function IPv6(parts) { - var part, _i, _len; - if (parts.length !== 8) { - throw new Error("ipaddr: ipv6 part count should be 8"); - } - for (_i = 0, _len = parts.length; _i < _len; _i++) { - part = parts[_i]; - if (!((0 <= part && part <= 0xffff))) { - throw new Error("ipaddr: ipv6 part should fit to two octets"); - } - } - this.parts = parts; - } - - IPv6.prototype.kind = function() { - return 'ipv6'; - }; - - IPv6.prototype.toString = function() { - var compactStringParts, part, pushPart, state, stringParts, _i, _len; - stringParts = (function() { - var _i, _len, _ref, _results; - _ref = this.parts; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(part.toString(16)); - } - return _results; - }).call(this); - compactStringParts = []; - pushPart = function(part) { - return compactStringParts.push(part); - }; - state = 0; - for (_i = 0, _len = stringParts.length; _i < _len; _i++) { - part = stringParts[_i]; - switch (state) { - case 0: - if (part === '0') { - pushPart(''); - } else { - pushPart(part); - } - state = 1; - break; - case 1: - if (part === '0') { - state = 2; - } else { - pushPart(part); - } - break; - case 2: - if (part !== '0') { - pushPart(''); - pushPart(part); - state = 3; - } - break; - case 3: - pushPart(part); - } - } - if (state === 2) { - pushPart(''); - pushPart(''); - } - return compactStringParts.join(":"); - }; - - IPv6.prototype.toByteArray = function() { - var bytes, part, _i, _len, _ref; - bytes = []; - _ref = this.parts; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - bytes.push(part >> 8); - bytes.push(part & 0xff); - } - return bytes; - }; - - IPv6.prototype.toNormalizedString = function() { - var part; - return ((function() { - var _i, _len, _ref, _results; - _ref = this.parts; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(part.toString(16)); - } - return _results; - }).call(this)).join(":"); - }; - - IPv6.prototype.match = function(other, cidrRange) { - var _ref; - if (cidrRange === void 0) { - _ref = other, other = _ref[0], cidrRange = _ref[1]; - } - if (other.kind() !== 'ipv6') { - throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one"); - } - return matchCIDR(this.parts, other.parts, 16, cidrRange); - }; - - IPv6.prototype.SpecialRanges = { - unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128], - linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10], - multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8], - loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128], - uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7], - ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96], - rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96], - rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96], - '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16], - teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32], - reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]] - }; - - IPv6.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv6.prototype.isIPv4MappedAddress = function() { - return this.range() === 'ipv4Mapped'; - }; - - IPv6.prototype.toIPv4Address = function() { - var high, low, _ref; - if (!this.isIPv4MappedAddress()) { - throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4"); - } - _ref = this.parts.slice(-2), high = _ref[0], low = _ref[1]; - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]); - }; - - return IPv6; - - })(); - - ipv6Part = "(?:[0-9a-f]+::?)+"; - - ipv6Regexes = { - "native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?$", 'i'), - transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + ("" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$"), 'i') - }; - - expandIPv6 = function(string, parts) { - var colonCount, lastColon, part, replacement, replacementCount; - if (string.indexOf('::') !== string.lastIndexOf('::')) { - return null; - } - colonCount = 0; - lastColon = -1; - while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) { - colonCount++; - } - if (string[0] === ':') { - colonCount--; - } - if (string[string.length - 1] === ':') { - colonCount--; - } - if (colonCount > parts) { - return null; - } - replacementCount = parts - colonCount; - replacement = ':'; - while (replacementCount--) { - replacement += '0:'; - } - string = string.replace('::', replacement); - if (string[0] === ':') { - string = string.slice(1); - } - if (string[string.length - 1] === ':') { - string = string.slice(0, -1); - } - return (function() { - var _i, _len, _ref, _results; - _ref = string.split(":"); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(parseInt(part, 16)); - } - return _results; - })(); - }; - - ipaddr.IPv6.parser = function(string) { - var match, parts; - if (string.match(ipv6Regexes['native'])) { - return expandIPv6(string, 8); - } else if (match = string.match(ipv6Regexes['transitional'])) { - parts = expandIPv6(match[1].slice(0, -1), 6); - if (parts) { - parts.push(parseInt(match[2]) << 8 | parseInt(match[3])); - parts.push(parseInt(match[4]) << 8 | parseInt(match[5])); - return parts; - } - } - return null; - }; - - ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) { - return this.parser(string) !== null; - }; - - ipaddr.IPv4.isValid = ipaddr.IPv6.isValid = function(string) { - var e; - try { - new this(this.parser(string)); - return true; - } catch (_error) { - e = _error; - return false; - } - }; - - ipaddr.IPv4.parse = ipaddr.IPv6.parse = function(string) { - var parts; - parts = this.parser(string); - if (parts === null) { - throw new Error("ipaddr: string is not formatted like ip address"); - } - return new this(parts); - }; - - ipaddr.IPv4.parseCIDR = ipaddr.IPv6.parseCIDR = function(string) { - var match; - if (match = string.match(/^(.+)\/(\d+)$/)) { - return [this.parse(match[1]), parseInt(match[2])]; - } - throw new Error("ipaddr: string is not formatted like a CIDR range"); - }; - - ipaddr.isValid = function(string) { - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string); - }; - - ipaddr.parse = function(string) { - if (ipaddr.IPv6.isValid(string)) { - return ipaddr.IPv6.parse(string); - } else if (ipaddr.IPv4.isValid(string)) { - return ipaddr.IPv4.parse(string); - } else { - throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format"); - } - }; - - ipaddr.parseCIDR = function(string) { - var e; - try { - return ipaddr.IPv6.parseCIDR(string); - } catch (_error) { - e = _error; - try { - return ipaddr.IPv4.parseCIDR(string); - } catch (_error) { - e = _error; - throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format"); - } - } - }; - - ipaddr.process = function(string) { - var addr; - addr = this.parse(string); - if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) { - return addr.toIPv4Address(); - } else { - return addr; - } - }; - -}).call(this); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json deleted file mode 100644 index 298362e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "ipaddr.js", - "description": "A library for manipulating IPv4 and IPv6 addresses in JavaScript.", - "version": "1.0.1", - "author": { - "name": "Peter Zotov", - "email": "whitequark@whitequark.org" - }, - "directories": { - "lib": "./lib" - }, - "dependencies": {}, - "devDependencies": { - "coffee-script": "~1.6", - "nodeunit": "~0.5.3", - "uglify-js": "latest" - }, - "scripts": { - "test": "cake build test" - }, - "keywords": [ - "ip", - "ipv4", - "ipv6" - ], - "repository": { - "type": "git", - "url": "git://github.com/whitequark/ipaddr.js" - }, - "main": "./lib/ipaddr", - "engines": { - "node": ">= 0.2.5" - }, - "license": "MIT", - "gitHead": "0a5a26d9317a58d67047e7f32b5b1bbe7f2f7fbf", - "bugs": { - "url": "https://github.com/whitequark/ipaddr.js/issues" - }, - "_id": "ipaddr.js@1.0.1", - "_shasum": "5f38801dc73e0400fc7076386f6ed5215fbd8f95", - "_from": "ipaddr.js@1.0.1", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "whitequark", - "email": "whitequark@whitequark.org" - }, - "maintainers": [ - { - "name": "whitequark", - "email": "whitequark@whitequark.org" - } - ], - "dist": { - "shasum": "5f38801dc73e0400fc7076386f6ed5215fbd8f95", - "tarball": "http://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.1.tgz" - }, - "_resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.1.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/whitequark/ipaddr.js" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee deleted file mode 100644 index 0a48080..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee +++ /dev/null @@ -1,374 +0,0 @@ -# Define the main object -ipaddr = {} - -root = this - -# Export for both the CommonJS and browser-like environment -if module? && module.exports - module.exports = ipaddr -else - root['ipaddr'] = ipaddr - -# A generic CIDR (Classless Inter-Domain Routing) RFC1518 range matcher. -matchCIDR = (first, second, partSize, cidrBits) -> - if first.length != second.length - throw new Error "ipaddr: cannot match CIDR for objects with different lengths" - - part = 0 - while cidrBits > 0 - shift = partSize - cidrBits - shift = 0 if shift < 0 - - if first[part] >> shift != second[part] >> shift - return false - - cidrBits -= partSize - part += 1 - - return true - -# An utility function to ease named range matching. See examples below. -ipaddr.subnetMatch = (address, rangeList, defaultName='unicast') -> - for rangeName, rangeSubnets of rangeList - # ECMA5 Array.isArray isn't available everywhere - if toString.call(rangeSubnets[0]) != '[object Array]' - rangeSubnets = [ rangeSubnets ] - - for subnet in rangeSubnets - return rangeName if address.match.apply(address, subnet) - - return defaultName - -# An IPv4 address (RFC791). -class ipaddr.IPv4 - # Constructs a new IPv4 address from an array of four octets. - # Verifies the input. - constructor: (octets) -> - if octets.length != 4 - throw new Error "ipaddr: ipv4 octet count should be 4" - - for octet in octets - if !(0 <= octet <= 255) - throw new Error "ipaddr: ipv4 octet is a byte" - - @octets = octets - - # The 'kind' method exists on both IPv4 and IPv6 classes. - kind: -> - return 'ipv4' - - # Returns the address in convenient, decimal-dotted format. - toString: -> - return @octets.join "." - - # Returns an array of byte-sized values in network order - toByteArray: -> - return @octets.slice(0) # octets.clone - - # Checks if this address matches other one within given CIDR range. - match: (other, cidrRange) -> - if cidrRange == undefined - [other, cidrRange] = other - - if other.kind() != 'ipv4' - throw new Error "ipaddr: cannot match ipv4 address with non-ipv4 one" - - return matchCIDR(this.octets, other.octets, 8, cidrRange) - - # Special IPv4 address ranges. - SpecialRanges: - unspecified: [ - [ new IPv4([0, 0, 0, 0]), 8 ] - ] - broadcast: [ - [ new IPv4([255, 255, 255, 255]), 32 ] - ] - multicast: [ # RFC3171 - [ new IPv4([224, 0, 0, 0]), 4 ] - ] - linkLocal: [ # RFC3927 - [ new IPv4([169, 254, 0, 0]), 16 ] - ] - loopback: [ # RFC5735 - [ new IPv4([127, 0, 0, 0]), 8 ] - ] - private: [ # RFC1918 - [ new IPv4([10, 0, 0, 0]), 8 ] - [ new IPv4([172, 16, 0, 0]), 12 ] - [ new IPv4([192, 168, 0, 0]), 16 ] - ] - reserved: [ # Reserved and testing-only ranges; RFCs 5735, 5737, 2544, 1700 - [ new IPv4([192, 0, 0, 0]), 24 ] - [ new IPv4([192, 0, 2, 0]), 24 ] - [ new IPv4([192, 88, 99, 0]), 24 ] - [ new IPv4([198, 51, 100, 0]), 24 ] - [ new IPv4([203, 0, 113, 0]), 24 ] - [ new IPv4([240, 0, 0, 0]), 4 ] - ] - - # Checks if the address corresponds to one of the special ranges. - range: -> - return ipaddr.subnetMatch(this, @SpecialRanges) - - # Convrets this IPv4 address to an IPv4-mapped IPv6 address. - toIPv4MappedAddress: -> - return ipaddr.IPv6.parse "::ffff:#{@toString()}" - -# A list of regular expressions that match arbitrary IPv4 addresses, -# for which a number of weird notations exist. -# Note that an address like 0010.0xa5.1.1 is considered legal. -ipv4Part = "(0?\\d+|0x[a-f0-9]+)" -ipv4Regexes = - fourOctet: new RegExp "^#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}$", 'i' - longValue: new RegExp "^#{ipv4Part}$", 'i' - -# Classful variants (like a.b, where a is an octet, and b is a 24-bit -# value representing last three octets; this corresponds to a class C -# address) are omitted due to classless nature of modern Internet. -ipaddr.IPv4.parser = (string) -> - parseIntAuto = (string) -> - if string[0] == "0" && string[1] != "x" - parseInt(string, 8) - else - parseInt(string) - - # parseInt recognizes all that octal & hexadecimal weirdness for us - if match = string.match(ipv4Regexes.fourOctet) - return (parseIntAuto(part) for part in match[1..5]) - else if match = string.match(ipv4Regexes.longValue) - value = parseIntAuto(match[1]) - if value > 0xffffffff || value < 0 - throw new Error "ipaddr: address outside defined range" - return ((value >> shift) & 0xff for shift in [0..24] by 8).reverse() - else - return null - -# An IPv6 address (RFC2460) -class ipaddr.IPv6 - # Constructs an IPv6 address from an array of eight 16-bit parts. - # Throws an error if the input is invalid. - constructor: (parts) -> - if parts.length != 8 - throw new Error "ipaddr: ipv6 part count should be 8" - - for part in parts - if !(0 <= part <= 0xffff) - throw new Error "ipaddr: ipv6 part should fit to two octets" - - @parts = parts - - # The 'kind' method exists on both IPv4 and IPv6 classes. - kind: -> - return 'ipv6' - - # Returns the address in compact, human-readable format like - # 2001:db8:8:66::1 - toString: -> - stringParts = (part.toString(16) for part in @parts) - - compactStringParts = [] - pushPart = (part) -> compactStringParts.push part - - state = 0 - for part in stringParts - switch state - when 0 - if part == '0' - pushPart('') - else - pushPart(part) - - state = 1 - when 1 - if part == '0' - state = 2 - else - pushPart(part) - when 2 - unless part == '0' - pushPart('') - pushPart(part) - state = 3 - when 3 - pushPart(part) - - if state == 2 - pushPart('') - pushPart('') - - return compactStringParts.join ":" - - # Returns an array of byte-sized values in network order - toByteArray: -> - bytes = [] - for part in @parts - bytes.push(part >> 8) - bytes.push(part & 0xff) - - return bytes - - # Returns the address in expanded format with all zeroes included, like - # 2001:db8:8:66:0:0:0:1 - toNormalizedString: -> - return (part.toString(16) for part in @parts).join ":" - - # Checks if this address matches other one within given CIDR range. - match: (other, cidrRange) -> - if cidrRange == undefined - [other, cidrRange] = other - - if other.kind() != 'ipv6' - throw new Error "ipaddr: cannot match ipv6 address with non-ipv6 one" - - return matchCIDR(this.parts, other.parts, 16, cidrRange) - - # Special IPv6 ranges - SpecialRanges: - unspecified: [ new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128 ] # RFC4291, here and after - linkLocal: [ new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10 ] - multicast: [ new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8 ] - loopback: [ new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128 ] - uniqueLocal: [ new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7 ] - ipv4Mapped: [ new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96 ] - rfc6145: [ new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96 ] # RFC6145 - rfc6052: [ new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96 ] # RFC6052 - '6to4': [ new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16 ] # RFC3056 - teredo: [ new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32 ] # RFC6052, RFC6146 - reserved: [ - [ new IPv6([ 0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32 ] # RFC4291 - ] - - # Checks if the address corresponds to one of the special ranges. - range: -> - return ipaddr.subnetMatch(this, @SpecialRanges) - - # Checks if this address is an IPv4-mapped IPv6 address. - isIPv4MappedAddress: -> - return @range() == 'ipv4Mapped' - - # Converts this address to IPv4 address if it is an IPv4-mapped IPv6 address. - # Throws an error otherwise. - toIPv4Address: -> - unless @isIPv4MappedAddress() - throw new Error "ipaddr: trying to convert a generic ipv6 address to ipv4" - - [high, low] = @parts[-2..-1] - - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]) - -# IPv6-matching regular expressions. -# For IPv6, the task is simpler: it is enough to match the colon-delimited -# hexadecimal IPv6 and a transitional variant with dotted-decimal IPv4 at -# the end. -ipv6Part = "(?:[0-9a-f]+::?)+" -ipv6Regexes = - native: new RegExp "^(::)?(#{ipv6Part})?([0-9a-f]+)?(::)?$", 'i' - transitional: new RegExp "^((?:#{ipv6Part})|(?:::)(?:#{ipv6Part})?)" + - "#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}$", 'i' - -# Expand :: in an IPv6 address or address part consisting of `parts` groups. -expandIPv6 = (string, parts) -> - # More than one '::' means invalid adddress - if string.indexOf('::') != string.lastIndexOf('::') - return null - - # How many parts do we already have? - colonCount = 0 - lastColon = -1 - while (lastColon = string.indexOf(':', lastColon + 1)) >= 0 - colonCount++ - - # 0::0 is two parts more than :: - colonCount-- if string[0] == ':' - colonCount-- if string[string.length-1] == ':' - - # The following loop would hang if colonCount > parts - if colonCount > parts - return null - - # replacement = ':' + '0:' * (parts - colonCount) - replacementCount = parts - colonCount - replacement = ':' - while replacementCount-- - replacement += '0:' - - # Insert the missing zeroes - string = string.replace('::', replacement) - - # Trim any garbage which may be hanging around if :: was at the edge in - # the source string - string = string[1..-1] if string[0] == ':' - string = string[0..-2] if string[string.length-1] == ':' - - return (parseInt(part, 16) for part in string.split(":")) - -# Parse an IPv6 address. -ipaddr.IPv6.parser = (string) -> - if string.match(ipv6Regexes['native']) - return expandIPv6(string, 8) - - else if match = string.match(ipv6Regexes['transitional']) - parts = expandIPv6(match[1][0..-2], 6) - if parts - parts.push(parseInt(match[2]) << 8 | parseInt(match[3])) - parts.push(parseInt(match[4]) << 8 | parseInt(match[5])) - return parts - - return null - -# Checks if a given string is formatted like IPv4/IPv6 address. -ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = (string) -> - return @parser(string) != null - -# Checks if a given string is a valid IPv4/IPv6 address. -ipaddr.IPv4.isValid = ipaddr.IPv6.isValid = (string) -> - try - new this(@parser(string)) - return true - catch e - return false - -# Tries to parse and validate a string with IPv4/IPv6 address. -# Throws an error if it fails. -ipaddr.IPv4.parse = ipaddr.IPv6.parse = (string) -> - parts = @parser(string) - if parts == null - throw new Error "ipaddr: string is not formatted like ip address" - - return new this(parts) - -ipaddr.IPv4.parseCIDR = ipaddr.IPv6.parseCIDR = (string) -> - if match = string.match(/^(.+)\/(\d+)$/) - return [@parse(match[1]), parseInt(match[2])] - - throw new Error "ipaddr: string is not formatted like a CIDR range" - -# Checks if the address is valid IP address -ipaddr.isValid = (string) -> - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string) - -# Try to parse an address and throw an error if it is impossible -ipaddr.parse = (string) -> - if ipaddr.IPv6.isValid(string) - return ipaddr.IPv6.parse(string) - else if ipaddr.IPv4.isValid(string) - return ipaddr.IPv4.parse(string) - else - throw new Error "ipaddr: the address has neither IPv6 nor IPv4 format" - -ipaddr.parseCIDR = (string) -> - try - return ipaddr.IPv6.parseCIDR(string) - catch e - try - return ipaddr.IPv4.parseCIDR(string) - catch e - throw new Error "ipaddr: the address has neither IPv6 nor IPv4 CIDR format" - -# Parse an address and return plain IPv4 address if it is an IPv4-mapped address -ipaddr.process = (string) -> - addr = @parse(string) - if addr.kind() == 'ipv6' && addr.isIPv4MappedAddress() - return addr.toIPv4Address() - else - return addr diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee deleted file mode 100644 index 361561e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee +++ /dev/null @@ -1,262 +0,0 @@ -ipaddr = require '../lib/ipaddr' - -module.exports = - 'should define main classes': (test) -> - test.ok(ipaddr.IPv4?, 'defines IPv4 class') - test.ok(ipaddr.IPv6?, 'defines IPv6 class') - test.done() - - 'can construct IPv4 from octets': (test) -> - test.doesNotThrow -> - new ipaddr.IPv4([192, 168, 1, 2]) - test.done() - - 'refuses to construct invalid IPv4': (test) -> - test.throws -> - new ipaddr.IPv4([300, 1, 2, 3]) - test.throws -> - new ipaddr.IPv4([8, 8, 8]) - test.done() - - 'converts IPv4 to string correctly': (test) -> - addr = new ipaddr.IPv4([192, 168, 1, 1]) - test.equal(addr.toString(), '192.168.1.1') - test.done() - - 'returns correct kind for IPv4': (test) -> - addr = new ipaddr.IPv4([1, 2, 3, 4]) - test.equal(addr.kind(), 'ipv4') - test.done() - - 'allows to access IPv4 octets': (test) -> - addr = new ipaddr.IPv4([42, 0, 0, 0]) - test.equal(addr.octets[0], 42) - test.done() - - 'checks IPv4 address format': (test) -> - test.equal(ipaddr.IPv4.isIPv4('192.168.007.0xa'), true) - test.equal(ipaddr.IPv4.isIPv4('1024.0.0.1'), true) - test.equal(ipaddr.IPv4.isIPv4('8.0xa.wtf.6'), false) - test.done() - - 'validates IPv4 addresses': (test) -> - test.equal(ipaddr.IPv4.isValid('192.168.007.0xa'), true) - test.equal(ipaddr.IPv4.isValid('1024.0.0.1'), false) - test.equal(ipaddr.IPv4.isValid('8.0xa.wtf.6'), false) - test.done() - - 'parses IPv4 in several weird formats': (test) -> - test.deepEqual(ipaddr.IPv4.parse('192.168.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('0xc0.168.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('192.0250.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('0xc0a80101').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('030052000401').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('3232235777').octets, [192, 168, 1, 1]) - test.done() - - 'barfs at invalid IPv4': (test) -> - test.throws -> - ipaddr.IPv4.parse('10.0.0.wtf') - test.done() - - 'matches IPv4 CIDR correctly': (test) -> - addr = new ipaddr.IPv4([10, 5, 0, 1]) - test.equal(addr.match(ipaddr.IPv4.parse('0.0.0.0'), 0), true) - test.equal(addr.match(ipaddr.IPv4.parse('11.0.0.0'), 8), false) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.0'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.1'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.10'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.5.5.0'), 16), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 16), false) - test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 15), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.5.0.2'), 32), false) - test.equal(addr.match(addr, 32), true) - test.done() - - 'parses IPv4 CIDR correctly': (test) -> - addr = new ipaddr.IPv4([10, 5, 0, 1]) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('0.0.0.0/0')), true) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('11.0.0.0/8')), false) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.0.0.0/8')), true) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.0.0.1/8')), true) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.0.0.10/8')), true) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.5.5.0/16')), true) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.4.5.0/16')), false) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.4.5.0/15')), true) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.5.0.2/32')), false) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.5.0.1/32')), true) - test.throws -> - ipaddr.IPv4.parseCIDR('10.5.0.1') - test.done() - - 'detects reserved IPv4 networks': (test) -> - test.equal(ipaddr.IPv4.parse('0.0.0.0').range(), 'unspecified') - test.equal(ipaddr.IPv4.parse('0.1.0.0').range(), 'unspecified') - test.equal(ipaddr.IPv4.parse('10.1.0.1').range(), 'private') - test.equal(ipaddr.IPv4.parse('192.168.2.1').range(), 'private') - test.equal(ipaddr.IPv4.parse('224.100.0.1').range(), 'multicast') - test.equal(ipaddr.IPv4.parse('169.254.15.0').range(), 'linkLocal') - test.equal(ipaddr.IPv4.parse('127.1.1.1').range(), 'loopback') - test.equal(ipaddr.IPv4.parse('255.255.255.255').range(), 'broadcast') - test.equal(ipaddr.IPv4.parse('240.1.2.3').range(), 'reserved') - test.equal(ipaddr.IPv4.parse('8.8.8.8').range(), 'unicast') - test.done() - - 'can construct IPv6 from parts': (test) -> - test.doesNotThrow -> - new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.done() - - 'refuses to construct invalid IPv6': (test) -> - test.throws -> - new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 0, 1]) - test.throws -> - new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 1]) - test.done() - - 'converts IPv6 to string correctly': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.equal(addr.toNormalizedString(), '2001:db8:f53a:0:0:0:0:1') - test.equal(addr.toString(), '2001:db8:f53a::1') - test.equal(new ipaddr.IPv6([0, 0, 0, 0, 0, 0, 0, 1]).toString(), '::1') - test.equal(new ipaddr.IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]).toString(), '2001:db8::') - test.done() - - 'returns correct kind for IPv6': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.equal(addr.kind(), 'ipv6') - test.done() - - 'allows to access IPv6 address parts': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 42, 0, 1]) - test.equal(addr.parts[5], 42) - test.done() - - 'checks IPv6 address format': (test) -> - test.equal(ipaddr.IPv6.isIPv6('2001:db8:F53A::1'), true) - test.equal(ipaddr.IPv6.isIPv6('200001::1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:192.168.1.1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1:0'), false) - test.equal(ipaddr.IPv6.isIPv6('fe80::wtf'), false) - test.done() - - 'validates IPv6 addresses': (test) -> - test.equal(ipaddr.IPv6.isValid('2001:db8:F53A::1'), true) - test.equal(ipaddr.IPv6.isValid('200001::1'), false) - test.equal(ipaddr.IPv6.isValid('::ffff:192.168.1.1'), true) - test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1'), false) - test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1:0'), false) - test.equal(ipaddr.IPv6.isValid('2001:db8::F53A::1'), false) - test.equal(ipaddr.IPv6.isValid('fe80::wtf'), false) - test.done() - - 'parses IPv6 in different formats': (test) -> - test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A:0:0:0:0:1').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.deepEqual(ipaddr.IPv6.parse('fe80::10').parts, [0xfe80, 0, 0, 0, 0, 0, 0, 0x10]) - test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A::').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 0]) - test.deepEqual(ipaddr.IPv6.parse('::1').parts, [0, 0, 0, 0, 0, 0, 0, 1]) - test.deepEqual(ipaddr.IPv6.parse('::').parts, [0, 0, 0, 0, 0, 0, 0, 0]) - test.done() - - 'barfs at invalid IPv6': (test) -> - test.throws -> - ipaddr.IPv6.parse('fe80::0::1') - test.done() - - 'matches IPv6 CIDR correctly': (test) -> - addr = ipaddr.IPv6.parse('2001:db8:f53a::1') - test.equal(addr.match(ipaddr.IPv6.parse('::'), 0), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53a::1:1'), 64), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53b::1:1'), 48), false) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f531::1:1'), 44), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f500::1'), 40), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db9:f500::1'), 40), false) - test.equal(addr.match(addr, 128), true) - test.done() - - 'parses IPv6 CIDR correctly': (test) -> - addr = ipaddr.IPv6.parse('2001:db8:f53a::1') - test.equal(addr.match(ipaddr.IPv6.parseCIDR('::/0')), true) - test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f53a::1:1/64')), true) - test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f53b::1:1/48')), false) - test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f531::1:1/44')), true) - test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f500::1/40')), true) - test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db9:f500::1/40')), false) - test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f53a::1/128')), true) - test.throws -> - ipaddr.IPv6.parseCIDR('2001:db8:f53a::1') - test.done() - - 'converts between IPv4-mapped IPv6 addresses and IPv4 addresses': (test) -> - addr = ipaddr.IPv4.parse('77.88.21.11') - mapped = addr.toIPv4MappedAddress() - test.deepEqual(mapped.parts, [0, 0, 0, 0, 0, 0xffff, 0x4d58, 0x150b]) - test.deepEqual(mapped.toIPv4Address().octets, addr.octets) - test.done() - - 'refuses to convert non-IPv4-mapped IPv6 address to IPv4 address': (test) -> - test.throws -> - ipaddr.IPv6.parse('2001:db8::1').toIPv4Address() - test.done() - - 'detects reserved IPv6 networks': (test) -> - test.equal(ipaddr.IPv6.parse('::').range(), 'unspecified') - test.equal(ipaddr.IPv6.parse('fe80::1234:5678:abcd:0123').range(), 'linkLocal') - test.equal(ipaddr.IPv6.parse('ff00::1234').range(), 'multicast') - test.equal(ipaddr.IPv6.parse('::1').range(), 'loopback') - test.equal(ipaddr.IPv6.parse('fc00::').range(), 'uniqueLocal') - test.equal(ipaddr.IPv6.parse('::ffff:192.168.1.10').range(), 'ipv4Mapped') - test.equal(ipaddr.IPv6.parse('::ffff:0:192.168.1.10').range(), 'rfc6145') - test.equal(ipaddr.IPv6.parse('64:ff9b::1234').range(), 'rfc6052') - test.equal(ipaddr.IPv6.parse('2002:1f63:45e8::1').range(), '6to4') - test.equal(ipaddr.IPv6.parse('2001::4242').range(), 'teredo') - test.equal(ipaddr.IPv6.parse('2001:db8::3210').range(), 'reserved') - test.equal(ipaddr.IPv6.parse('2001:470:8:66::1').range(), 'unicast') - test.done() - - 'is able to determine IP address type': (test) -> - test.equal(ipaddr.parse('8.8.8.8').kind(), 'ipv4') - test.equal(ipaddr.parse('2001:db8:3312::1').kind(), 'ipv6') - test.done() - - 'throws an error if tried to parse an invalid address': (test) -> - test.throws -> - ipaddr.parse('::some.nonsense') - test.done() - - 'correctly processes IPv4-mapped addresses': (test) -> - test.equal(ipaddr.process('8.8.8.8').kind(), 'ipv4') - test.equal(ipaddr.process('2001:db8:3312::1').kind(), 'ipv6') - test.equal(ipaddr.process('::ffff:192.168.1.1').kind(), 'ipv4') - test.done() - - 'correctly converts IPv6 and IPv4 addresses to byte arrays': (test) -> - test.deepEqual(ipaddr.parse('1.2.3.4').toByteArray(), - [0x1, 0x2, 0x3, 0x4]); - # Fuck yeah. The first byte of Google's IPv6 address is 42. 42! - test.deepEqual(ipaddr.parse('2a00:1450:8007::68').toByteArray(), - [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68 ]) - test.done() - - 'correctly parses 1 as an IPv4 address': (test) -> - test.equal(ipaddr.IPv6.isValid('1'), false) - test.equal(ipaddr.IPv4.isValid('1'), true) - test.deepEqual(new ipaddr.IPv4([0, 0, 0, 1]), ipaddr.parse('1')) - test.done() - - 'correctly detects IPv4 and IPv6 CIDR addresses': (test) -> - test.deepEqual([ipaddr.IPv6.parse('fc00::'), 64], - ipaddr.parseCIDR('fc00::/64')) - test.deepEqual([ipaddr.IPv4.parse('1.2.3.4'), 5], - ipaddr.parseCIDR('1.2.3.4/5')) - test.done() - - 'does not consider a very large or very small number a valid IP address': (test) -> - test.equal(ipaddr.isValid('4999999999'), false) - test.equal(ipaddr.isValid('-1'), false) - test.done() - - 'does not hang on ::8:8:8:8:8:8:8:8:8': (test) -> - test.equal(ipaddr.IPv6.isValid('::8:8:8:8:8:8:8:8:8'), false) - test.done() diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/package.json deleted file mode 100644 index a1b58c2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/proxy-addr/package.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "name": "proxy-addr", - "description": "Determine address of proxied request", - "version": "1.0.8", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "ip", - "proxy", - "x-forwarded-for" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/proxy-addr" - }, - "dependencies": { - "forwarded": "~0.1.0", - "ipaddr.js": "1.0.1" - }, - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "istanbul": "0.3.9", - "mocha": "~1.21.5" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "b32d9bda51c92f67a5c2c7b4f81971dbef41783c", - "bugs": { - "url": "https://github.com/jshttp/proxy-addr/issues" - }, - "homepage": "https://github.com/jshttp/proxy-addr", - "_id": "proxy-addr@1.0.8", - "_shasum": "db54ec878bcc1053d57646609219b3715678bafe", - "_from": "proxy-addr@>=1.0.8 <1.1.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "db54ec878bcc1053d57646609219b3715678bafe", - "tarball": "http://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.8.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.8.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/.eslintignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/.eslintignore deleted file mode 100644 index 1521c8b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/.npmignore deleted file mode 100644 index 2abba8d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/.npmignore +++ /dev/null @@ -1,19 +0,0 @@ -.idea -*.iml -npm-debug.log -dump.rdb -node_modules -results.tap -results.xml -npm-shrinkwrap.json -config.json -.DS_Store -*/.DS_Store -*/*/.DS_Store -._* -*/._* -*/*/._* -coverage.* -lib-cov -complexity.md -dist diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/.travis.yml deleted file mode 100644 index f502178..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js - -node_js: - - 0.10 - - 0.12 - - iojs diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/CHANGELOG.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/CHANGELOG.md deleted file mode 100644 index 1fadc78..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/CHANGELOG.md +++ /dev/null @@ -1,88 +0,0 @@ - -## [**3.1.0**](https://github.com/hapijs/qs/issues?milestone=24&state=open) -- [**#89**](https://github.com/hapijs/qs/issues/89) Add option to disable "Transform dot notation to bracket notation" - -## [**3.0.0**](https://github.com/hapijs/qs/issues?milestone=23&state=closed) -- [**#77**](https://github.com/hapijs/qs/issues/77) Perf boost -- [**#60**](https://github.com/hapijs/qs/issues/60) Add explicit option to disable array parsing -- [**#80**](https://github.com/hapijs/qs/issues/80) qs.parse silently drops properties -- [**#74**](https://github.com/hapijs/qs/issues/74) Bad parse when turning array into object -- [**#81**](https://github.com/hapijs/qs/issues/81) Add a `filter` option -- [**#68**](https://github.com/hapijs/qs/issues/68) Fixed issue with recursion and passing strings into objects. -- [**#66**](https://github.com/hapijs/qs/issues/66) Add mixed array and object dot notation support Closes: #47 -- [**#76**](https://github.com/hapijs/qs/issues/76) RFC 3986 -- [**#85**](https://github.com/hapijs/qs/issues/85) No equal sign -- [**#84**](https://github.com/hapijs/qs/issues/84) update license attribute - -## [**2.4.1**](https://github.com/hapijs/qs/issues?milestone=20&state=closed) -- [**#73**](https://github.com/hapijs/qs/issues/73) Property 'hasOwnProperty' of object # is not a function - -## [**2.4.0**](https://github.com/hapijs/qs/issues?milestone=19&state=closed) -- [**#70**](https://github.com/hapijs/qs/issues/70) Add arrayFormat option - -## [**2.3.3**](https://github.com/hapijs/qs/issues?milestone=18&state=closed) -- [**#59**](https://github.com/hapijs/qs/issues/59) make sure array indexes are >= 0, closes #57 -- [**#58**](https://github.com/hapijs/qs/issues/58) make qs usable for browser loader - -## [**2.3.2**](https://github.com/hapijs/qs/issues?milestone=17&state=closed) -- [**#55**](https://github.com/hapijs/qs/issues/55) allow merging a string into an object - -## [**2.3.1**](https://github.com/hapijs/qs/issues?milestone=16&state=closed) -- [**#52**](https://github.com/hapijs/qs/issues/52) Return "undefined" and "false" instead of throwing "TypeError". - -## [**2.3.0**](https://github.com/hapijs/qs/issues?milestone=15&state=closed) -- [**#50**](https://github.com/hapijs/qs/issues/50) add option to omit array indices, closes #46 - -## [**2.2.5**](https://github.com/hapijs/qs/issues?milestone=14&state=closed) -- [**#39**](https://github.com/hapijs/qs/issues/39) Is there an alternative to Buffer.isBuffer? -- [**#49**](https://github.com/hapijs/qs/issues/49) refactor utils.merge, fixes #45 -- [**#41**](https://github.com/hapijs/qs/issues/41) avoid browserifying Buffer, for #39 - -## [**2.2.4**](https://github.com/hapijs/qs/issues?milestone=13&state=closed) -- [**#38**](https://github.com/hapijs/qs/issues/38) how to handle object keys beginning with a number - -## [**2.2.3**](https://github.com/hapijs/qs/issues?milestone=12&state=closed) -- [**#37**](https://github.com/hapijs/qs/issues/37) parser discards first empty value in array -- [**#36**](https://github.com/hapijs/qs/issues/36) Update to lab 4.x - -## [**2.2.2**](https://github.com/hapijs/qs/issues?milestone=11&state=closed) -- [**#33**](https://github.com/hapijs/qs/issues/33) Error when plain object in a value -- [**#34**](https://github.com/hapijs/qs/issues/34) use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty -- [**#24**](https://github.com/hapijs/qs/issues/24) Changelog? Semver? - -## [**2.2.1**](https://github.com/hapijs/qs/issues?milestone=10&state=closed) -- [**#32**](https://github.com/hapijs/qs/issues/32) account for circular references properly, closes #31 -- [**#31**](https://github.com/hapijs/qs/issues/31) qs.parse stackoverflow on circular objects - -## [**2.2.0**](https://github.com/hapijs/qs/issues?milestone=9&state=closed) -- [**#26**](https://github.com/hapijs/qs/issues/26) Don't use Buffer global if it's not present -- [**#30**](https://github.com/hapijs/qs/issues/30) Bug when merging non-object values into arrays -- [**#29**](https://github.com/hapijs/qs/issues/29) Don't call Utils.clone at the top of Utils.merge -- [**#23**](https://github.com/hapijs/qs/issues/23) Ability to not limit parameters? - -## [**2.1.0**](https://github.com/hapijs/qs/issues?milestone=8&state=closed) -- [**#22**](https://github.com/hapijs/qs/issues/22) Enable using a RegExp as delimiter - -## [**2.0.0**](https://github.com/hapijs/qs/issues?milestone=7&state=closed) -- [**#18**](https://github.com/hapijs/qs/issues/18) Why is there arrayLimit? -- [**#20**](https://github.com/hapijs/qs/issues/20) Configurable parametersLimit -- [**#21**](https://github.com/hapijs/qs/issues/21) make all limits optional, for #18, for #20 - -## [**1.2.2**](https://github.com/hapijs/qs/issues?milestone=6&state=closed) -- [**#19**](https://github.com/hapijs/qs/issues/19) Don't overwrite null values - -## [**1.2.1**](https://github.com/hapijs/qs/issues?milestone=5&state=closed) -- [**#16**](https://github.com/hapijs/qs/issues/16) ignore non-string delimiters -- [**#15**](https://github.com/hapijs/qs/issues/15) Close code block - -## [**1.2.0**](https://github.com/hapijs/qs/issues?milestone=4&state=closed) -- [**#12**](https://github.com/hapijs/qs/issues/12) Add optional delim argument -- [**#13**](https://github.com/hapijs/qs/issues/13) fix #11: flattened keys in array are now correctly parsed - -## [**1.1.0**](https://github.com/hapijs/qs/issues?milestone=3&state=closed) -- [**#7**](https://github.com/hapijs/qs/issues/7) Empty values of a POST array disappear after being submitted -- [**#9**](https://github.com/hapijs/qs/issues/9) Should not omit equals signs (=) when value is null -- [**#6**](https://github.com/hapijs/qs/issues/6) Minor grammar fix in README - -## [**1.0.2**](https://github.com/hapijs/qs/issues?milestone=2&state=closed) -- [**#5**](https://github.com/hapijs/qs/issues/5) array holes incorrectly copied into object on large index diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/CONTRIBUTING.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/CONTRIBUTING.md deleted file mode 100644 index 8928361..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/CONTRIBUTING.md +++ /dev/null @@ -1 +0,0 @@ -Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md). diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/LICENSE deleted file mode 100644 index d456948..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2014 Nathan LaFreniere and other contributors. -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. - * The names of any contributors may not 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 HOLDERS AND 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. - - * * * - -The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/README.md deleted file mode 100644 index 48a0de9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/README.md +++ /dev/null @@ -1,317 +0,0 @@ -# qs - -A querystring parsing and stringifying library with some added security. - -[![Build Status](https://secure.travis-ci.org/hapijs/qs.svg)](http://travis-ci.org/hapijs/qs) - -Lead Maintainer: [Nathan LaFreniere](https://github.com/nlf) - -The **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring). - -## Usage - -```javascript -var Qs = require('qs'); - -var obj = Qs.parse('a=c'); // { a: 'c' } -var str = Qs.stringify(obj); // 'a=c' -``` - -### Parsing Objects - -```javascript -Qs.parse(string, [options]); -``` - -**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`, or prefixing the sub-key with a dot `.`. -For example, the string `'foo[bar]=baz'` converts to: - -```javascript -{ - foo: { - bar: 'baz' - } -} -``` - -When using the `plainObjects` option the parsed value is returned as a plain object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like: - -```javascript -Qs.parse('a.hasOwnProperty=b', { plainObjects: true }); -// { a: { hasOwnProperty: 'b' } } -``` - -By default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option. - -```javascript -Qs.parse('a.hasOwnProperty=b', { allowPrototypes: true }); -// { a: { hasOwnProperty: 'b' } } -``` - -URI encoded strings work too: - -```javascript -Qs.parse('a%5Bb%5D=c'); -// { a: { b: 'c' } } -``` - -You can also nest your objects, like `'foo[bar][baz]=foobarbaz'`: - -```javascript -{ - foo: { - bar: { - baz: 'foobarbaz' - } - } -} -``` - -By default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like -`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be: - -```javascript -{ - a: { - b: { - c: { - d: { - e: { - f: { - '[g][h][i]': 'j' - } - } - } - } - } - } -} -``` - -This depth can be overridden by passing a `depth` option to `Qs.parse(string, [options])`: - -```javascript -Qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 }); -// { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } } -``` - -The depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number. - -For similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option: - -```javascript -Qs.parse('a=b&c=d', { parameterLimit: 1 }); -// { a: 'b' } -``` - -An optional delimiter can also be passed: - -```javascript -Qs.parse('a=b;c=d', { delimiter: ';' }); -// { a: 'b', c: 'd' } -``` - -Delimiters can be a regular expression too: - -```javascript -Qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ }); -// { a: 'b', c: 'd', e: 'f' } -``` - -Option `allowDots` can be used to disable dot notation: - -```javascript -Qs.parse('a.b=c', { allowDots: false }); -// { 'a.b': 'c' } } -``` - -### Parsing Arrays - -**qs** can also parse arrays using a similar `[]` notation: - -```javascript -Qs.parse('a[]=b&a[]=c'); -// { a: ['b', 'c'] } -``` - -You may specify an index as well: - -```javascript -Qs.parse('a[1]=c&a[0]=b'); -// { a: ['b', 'c'] } -``` - -Note that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number -to create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving -their order: - -```javascript -Qs.parse('a[1]=b&a[15]=c'); -// { a: ['b', 'c'] } -``` - -Note that an empty string is also a value, and will be preserved: - -```javascript -Qs.parse('a[]=&a[]=b'); -// { a: ['', 'b'] } -Qs.parse('a[0]=b&a[1]=&a[2]=c'); -// { a: ['b', '', 'c'] } -``` - -**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will -instead be converted to an object with the index as the key: - -```javascript -Qs.parse('a[100]=b'); -// { a: { '100': 'b' } } -``` - -This limit can be overridden by passing an `arrayLimit` option: - -```javascript -Qs.parse('a[1]=b', { arrayLimit: 0 }); -// { a: { '1': 'b' } } -``` - -To disable array parsing entirely, set `parseArrays` to `false`. - -```javascript -Qs.parse('a[]=b', { parseArrays: false }); -// { a: { '0': 'b' } } -``` - -If you mix notations, **qs** will merge the two items into an object: - -```javascript -Qs.parse('a[0]=b&a[b]=c'); -// { a: { '0': 'b', b: 'c' } } -``` - -You can also create arrays of objects: - -```javascript -Qs.parse('a[][b]=c'); -// { a: [{ b: 'c' }] } -``` - -### Stringifying - -```javascript -Qs.stringify(object, [options]); -``` - -When stringifying, **qs** always URI encodes output. Objects are stringified as you would expect: - -```javascript -Qs.stringify({ a: 'b' }); -// 'a=b' -Qs.stringify({ a: { b: 'c' } }); -// 'a%5Bb%5D=c' -``` - -Examples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage. - -When arrays are stringified, by default they are given explicit indices: - -```javascript -Qs.stringify({ a: ['b', 'c', 'd'] }); -// 'a[0]=b&a[1]=c&a[2]=d' -``` - -You may override this by setting the `indices` option to `false`: - -```javascript -Qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }); -// 'a=b&a=c&a=d' -``` - -You may use the `arrayFormat` option to specify the format of the output array - -```javascript -Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }) -// 'a[0]=b&a[1]=c' -Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }) -// 'a[]=b&a[]=c' -Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }) -// 'a=b&a=c' -``` - -Empty strings and null values will omit the value, but the equals sign (=) remains in place: - -```javascript -Qs.stringify({ a: '' }); -// 'a=' -``` - -Properties that are set to `undefined` will be omitted entirely: - -```javascript -Qs.stringify({ a: null, b: undefined }); -// 'a=' -``` - -The delimiter may be overridden with stringify as well: - -```javascript -Qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }); -// 'a=b;c=d' -``` - -Finally, you can use the `filter` option to restrict which keys will be included in the stringified output. -If you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you -pass an array, it will be used to select properties and array indices for stringification: - -```javascript -function filterFunc(prefix, value) { - if (prefix == 'b') { - // Return an `undefined` value to omit a property. - return; - } - if (prefix == 'e[f]') { - return value.getTime(); - } - if (prefix == 'e[g][0]') { - return value * 2; - } - return value; -} -Qs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc }) -// 'a=b&c=d&e[f]=123&e[g][0]=4' -Qs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] }) -// 'a=b&e=f' -Qs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] }) -// 'a[0]=b&a[2]=d' -``` - -### Handling of `null` values - -By default, `null` values are treated like empty strings: - -```javascript -Qs.stringify({ a: null, b: '' }); -// 'a=&b=' -``` - -Parsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings. - -```javascript -Qs.parse('a&b=') -// { a: '', b: '' } -``` - -To distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null` -values have no `=` sign: - -```javascript -Qs.stringify({ a: null, b: '' }, { strictNullHandling: true }); -// 'a&b=' -``` - -To parse values without `=` back to `null` use the `strictNullHandling` flag: - -```javascript -Qs.parse('a&b=', { strictNullHandling: true }); -// { a: null, b: '' } - -``` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/bower.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/bower.json deleted file mode 100644 index ffd0641..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/bower.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "qs", - "main": "dist/qs.js", - "version": "3.0.0", - "homepage": "https://github.com/hapijs/qs", - "authors": [ - "Nathan LaFreniere " - ], - "description": "A querystring parser that supports nesting and arrays, with a depth limit", - "keywords": [ - "querystring", - "qs" - ], - "license": "BSD-3-Clause", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/index.js deleted file mode 100644 index 0e09493..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/index.js +++ /dev/null @@ -1,15 +0,0 @@ -// Load modules - -var Stringify = require('./stringify'); -var Parse = require('./parse'); - - -// Declare internals - -var internals = {}; - - -module.exports = { - stringify: Stringify, - parse: Parse -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/parse.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/parse.js deleted file mode 100644 index e7c56c5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/parse.js +++ /dev/null @@ -1,186 +0,0 @@ -// Load modules - -var Utils = require('./utils'); - - -// Declare internals - -var internals = { - delimiter: '&', - depth: 5, - arrayLimit: 20, - parameterLimit: 1000, - strictNullHandling: false, - plainObjects: false, - allowPrototypes: false -}; - - -internals.parseValues = function (str, options) { - - var obj = {}; - var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit); - - for (var i = 0, il = parts.length; i < il; ++i) { - var part = parts[i]; - var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1; - - if (pos === -1) { - obj[Utils.decode(part)] = ''; - - if (options.strictNullHandling) { - obj[Utils.decode(part)] = null; - } - } - else { - var key = Utils.decode(part.slice(0, pos)); - var val = Utils.decode(part.slice(pos + 1)); - - if (!Object.prototype.hasOwnProperty.call(obj, key)) { - obj[key] = val; - } - else { - obj[key] = [].concat(obj[key]).concat(val); - } - } - } - - return obj; -}; - - -internals.parseObject = function (chain, val, options) { - - if (!chain.length) { - return val; - } - - var root = chain.shift(); - - var obj; - if (root === '[]') { - obj = []; - obj = obj.concat(internals.parseObject(chain, val, options)); - } - else { - obj = options.plainObjects ? Object.create(null) : {}; - var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root; - var index = parseInt(cleanRoot, 10); - var indexString = '' + index; - if (!isNaN(index) && - root !== cleanRoot && - indexString === cleanRoot && - index >= 0 && - (options.parseArrays && - index <= options.arrayLimit)) { - - obj = []; - obj[index] = internals.parseObject(chain, val, options); - } - else { - obj[cleanRoot] = internals.parseObject(chain, val, options); - } - } - - return obj; -}; - - -internals.parseKeys = function (key, val, options) { - - if (!key) { - return; - } - - // Transform dot notation to bracket notation - - if (options.allowDots) { - key = key.replace(/\.([^\.\[]+)/g, '[$1]'); - } - - // The regex chunks - - var parent = /^([^\[\]]*)/; - var child = /(\[[^\[\]]*\])/g; - - // Get the parent - - var segment = parent.exec(key); - - // Stash the parent if it exists - - var keys = []; - if (segment[1]) { - // If we aren't using plain objects, optionally prefix keys - // that would overwrite object prototype properties - if (!options.plainObjects && - Object.prototype.hasOwnProperty(segment[1])) { - - if (!options.allowPrototypes) { - return; - } - } - - keys.push(segment[1]); - } - - // Loop through children appending to the array until we hit depth - - var i = 0; - while ((segment = child.exec(key)) !== null && i < options.depth) { - - ++i; - if (!options.plainObjects && - Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) { - - if (!options.allowPrototypes) { - continue; - } - } - keys.push(segment[1]); - } - - // If there's a remainder, just add whatever is left - - if (segment) { - keys.push('[' + key.slice(segment.index) + ']'); - } - - return internals.parseObject(keys, val, options); -}; - - -module.exports = function (str, options) { - - options = options || {}; - options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : internals.delimiter; - options.depth = typeof options.depth === 'number' ? options.depth : internals.depth; - options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : internals.arrayLimit; - options.parseArrays = options.parseArrays !== false; - options.allowDots = options.allowDots !== false; - options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : internals.plainObjects; - options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : internals.allowPrototypes; - options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : internals.parameterLimit; - options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling; - - if (str === '' || - str === null || - typeof str === 'undefined') { - - return options.plainObjects ? Object.create(null) : {}; - } - - var tempObj = typeof str === 'string' ? internals.parseValues(str, options) : str; - var obj = options.plainObjects ? Object.create(null) : {}; - - // Iterate over the keys and setup the new object - - var keys = Object.keys(tempObj); - for (var i = 0, il = keys.length; i < il; ++i) { - var key = keys[i]; - var newObj = internals.parseKeys(key, tempObj[key], options); - obj = Utils.merge(obj, newObj, options); - } - - return Utils.compact(obj); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/stringify.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/stringify.js deleted file mode 100644 index 7414284..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/stringify.js +++ /dev/null @@ -1,121 +0,0 @@ -// Load modules - -var Utils = require('./utils'); - - -// Declare internals - -var internals = { - delimiter: '&', - arrayPrefixGenerators: { - brackets: function (prefix, key) { - - return prefix + '[]'; - }, - indices: function (prefix, key) { - - return prefix + '[' + key + ']'; - }, - repeat: function (prefix, key) { - - return prefix; - } - }, - strictNullHandling: false -}; - - -internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, filter) { - - if (typeof filter === 'function') { - obj = filter(prefix, obj); - } - else if (Utils.isBuffer(obj)) { - obj = obj.toString(); - } - else if (obj instanceof Date) { - obj = obj.toISOString(); - } - else if (obj === null) { - if (strictNullHandling) { - return Utils.encode(prefix); - } - - obj = ''; - } - - if (typeof obj === 'string' || - typeof obj === 'number' || - typeof obj === 'boolean') { - - return [Utils.encode(prefix) + '=' + Utils.encode(obj)]; - } - - var values = []; - - if (typeof obj === 'undefined') { - return values; - } - - var objKeys = Array.isArray(filter) ? filter : Object.keys(obj); - for (var i = 0, il = objKeys.length; i < il; ++i) { - var key = objKeys[i]; - - if (Array.isArray(obj)) { - values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, filter)); - } - else { - values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix, strictNullHandling, filter)); - } - } - - return values; -}; - - -module.exports = function (obj, options) { - - options = options || {}; - var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter; - var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling; - var objKeys; - var filter; - if (typeof options.filter === 'function') { - filter = options.filter; - obj = filter('', obj); - } - else if (Array.isArray(options.filter)) { - objKeys = filter = options.filter; - } - - var keys = []; - - if (typeof obj !== 'object' || - obj === null) { - - return ''; - } - - var arrayFormat; - if (options.arrayFormat in internals.arrayPrefixGenerators) { - arrayFormat = options.arrayFormat; - } - else if ('indices' in options) { - arrayFormat = options.indices ? 'indices' : 'repeat'; - } - else { - arrayFormat = 'indices'; - } - - var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat]; - - if (!objKeys) { - objKeys = Object.keys(obj); - } - for (var i = 0, il = objKeys.length; i < il; ++i) { - var key = objKeys[i]; - keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, filter)); - } - - return keys.join(delimiter); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/utils.js deleted file mode 100644 index 88f3147..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/lib/utils.js +++ /dev/null @@ -1,190 +0,0 @@ -// Load modules - - -// Declare internals - -var internals = {}; -internals.hexTable = new Array(256); -for (var h = 0; h < 256; ++h) { - internals.hexTable[h] = '%' + ((h < 16 ? '0' : '') + h.toString(16)).toUpperCase(); -} - - -exports.arrayToObject = function (source, options) { - - var obj = options.plainObjects ? Object.create(null) : {}; - for (var i = 0, il = source.length; i < il; ++i) { - if (typeof source[i] !== 'undefined') { - - obj[i] = source[i]; - } - } - - return obj; -}; - - -exports.merge = function (target, source, options) { - - if (!source) { - return target; - } - - if (typeof source !== 'object') { - if (Array.isArray(target)) { - target.push(source); - } - else if (typeof target === 'object') { - target[source] = true; - } - else { - target = [target, source]; - } - - return target; - } - - if (typeof target !== 'object') { - target = [target].concat(source); - return target; - } - - if (Array.isArray(target) && - !Array.isArray(source)) { - - target = exports.arrayToObject(target, options); - } - - var keys = Object.keys(source); - for (var k = 0, kl = keys.length; k < kl; ++k) { - var key = keys[k]; - var value = source[key]; - - if (!Object.prototype.hasOwnProperty.call(target, key)) { - target[key] = value; - } - else { - target[key] = exports.merge(target[key], value, options); - } - } - - return target; -}; - - -exports.decode = function (str) { - - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (e) { - return str; - } -}; - -exports.encode = function (str) { - - // This code was originally written by Brian White (mscdex) for the io.js core querystring library. - // It has been adapted here for stricter adherence to RFC 3986 - if (str.length === 0) { - return str; - } - - if (typeof str !== 'string') { - str = '' + str; - } - - var out = ''; - for (var i = 0, il = str.length; i < il; ++i) { - var c = str.charCodeAt(i); - - if (c === 0x2D || // - - c === 0x2E || // . - c === 0x5F || // _ - c === 0x7E || // ~ - (c >= 0x30 && c <= 0x39) || // 0-9 - (c >= 0x41 && c <= 0x5A) || // a-z - (c >= 0x61 && c <= 0x7A)) { // A-Z - - out += str[i]; - continue; - } - - if (c < 0x80) { - out += internals.hexTable[c]; - continue; - } - - if (c < 0x800) { - out += internals.hexTable[0xC0 | (c >> 6)] + internals.hexTable[0x80 | (c & 0x3F)]; - continue; - } - - if (c < 0xD800 || c >= 0xE000) { - out += internals.hexTable[0xE0 | (c >> 12)] + internals.hexTable[0x80 | ((c >> 6) & 0x3F)] + internals.hexTable[0x80 | (c & 0x3F)]; - continue; - } - - ++i; - c = 0x10000 + (((c & 0x3FF) << 10) | (str.charCodeAt(i) & 0x3FF)); - out += internals.hexTable[0xF0 | (c >> 18)] + internals.hexTable[0x80 | ((c >> 12) & 0x3F)] + internals.hexTable[0x80 | ((c >> 6) & 0x3F)] + internals.hexTable[0x80 | (c & 0x3F)]; - } - - return out; -}; - -exports.compact = function (obj, refs) { - - if (typeof obj !== 'object' || - obj === null) { - - return obj; - } - - refs = refs || []; - var lookup = refs.indexOf(obj); - if (lookup !== -1) { - return refs[lookup]; - } - - refs.push(obj); - - if (Array.isArray(obj)) { - var compacted = []; - - for (var i = 0, il = obj.length; i < il; ++i) { - if (typeof obj[i] !== 'undefined') { - compacted.push(obj[i]); - } - } - - return compacted; - } - - var keys = Object.keys(obj); - for (i = 0, il = keys.length; i < il; ++i) { - var key = keys[i]; - obj[key] = exports.compact(obj[key], refs); - } - - return obj; -}; - - -exports.isRegExp = function (obj) { - - return Object.prototype.toString.call(obj) === '[object RegExp]'; -}; - - -exports.isBuffer = function (obj) { - - if (obj === null || - typeof obj === 'undefined') { - - return false; - } - - return !!(obj.constructor && - obj.constructor.isBuffer && - obj.constructor.isBuffer(obj)); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/package.json deleted file mode 100644 index 1bae0ed..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "qs", - "version": "4.0.0", - "description": "A querystring parser that supports nesting and arrays, with a depth limit", - "homepage": "https://github.com/hapijs/qs", - "main": "lib/index.js", - "dependencies": {}, - "devDependencies": { - "browserify": "^10.2.1", - "code": "1.x.x", - "lab": "5.x.x" - }, - "scripts": { - "test": "lab -a code -t 100 -L", - "test-cov-html": "lab -a code -r html -o coverage.html", - "dist": "browserify --standalone Qs lib/index.js > dist/qs.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/hapijs/qs.git" - }, - "keywords": [ - "querystring", - "qs" - ], - "license": "BSD-3-Clause", - "gitHead": "e573dd08eae6cce30d2202704691a102dfa3782a", - "bugs": { - "url": "https://github.com/hapijs/qs/issues" - }, - "_id": "qs@4.0.0", - "_shasum": "c31d9b74ec27df75e543a86c78728ed8d4623607", - "_from": "qs@4.0.0", - "_npmVersion": "2.12.0", - "_nodeVersion": "0.12.4", - "_npmUser": { - "name": "nlf", - "email": "quitlahok@gmail.com" - }, - "dist": { - "shasum": "c31d9b74ec27df75e543a86c78728ed8d4623607", - "tarball": "http://registry.npmjs.org/qs/-/qs-4.0.0.tgz" - }, - "maintainers": [ - { - "name": "nlf", - "email": "quitlahok@gmail.com" - }, - { - "name": "hueniverse", - "email": "eran@hueniverse.com" - } - ], - "directories": {}, - "_resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/test/parse.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/test/parse.js deleted file mode 100644 index a19d764..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/test/parse.js +++ /dev/null @@ -1,478 +0,0 @@ -/* eslint no-extend-native:0 */ -// Load modules - -var Code = require('code'); -var Lab = require('lab'); -var Qs = require('../'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var expect = Code.expect; -var describe = lab.experiment; -var it = lab.test; - - -describe('parse()', function () { - - it('parses a simple string', function (done) { - - expect(Qs.parse('0=foo')).to.deep.equal({ '0': 'foo' }); - expect(Qs.parse('foo=c++')).to.deep.equal({ foo: 'c ' }); - expect(Qs.parse('a[>=]=23')).to.deep.equal({ a: { '>=': '23' } }); - expect(Qs.parse('a[<=>]==23')).to.deep.equal({ a: { '<=>': '=23' } }); - expect(Qs.parse('a[==]=23')).to.deep.equal({ a: { '==': '23' } }); - expect(Qs.parse('foo', { strictNullHandling: true })).to.deep.equal({ foo: null }); - expect(Qs.parse('foo' )).to.deep.equal({ foo: '' }); - expect(Qs.parse('foo=')).to.deep.equal({ foo: '' }); - expect(Qs.parse('foo=bar')).to.deep.equal({ foo: 'bar' }); - expect(Qs.parse(' foo = bar = baz ')).to.deep.equal({ ' foo ': ' bar = baz ' }); - expect(Qs.parse('foo=bar=baz')).to.deep.equal({ foo: 'bar=baz' }); - expect(Qs.parse('foo=bar&bar=baz')).to.deep.equal({ foo: 'bar', bar: 'baz' }); - expect(Qs.parse('foo2=bar2&baz2=')).to.deep.equal({ foo2: 'bar2', baz2: '' }); - expect(Qs.parse('foo=bar&baz', { strictNullHandling: true })).to.deep.equal({ foo: 'bar', baz: null }); - expect(Qs.parse('foo=bar&baz')).to.deep.equal({ foo: 'bar', baz: '' }); - expect(Qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World')).to.deep.equal({ - cht: 'p3', - chd: 't:60,40', - chs: '250x100', - chl: 'Hello|World' - }); - done(); - }); - - it('allows disabling dot notation', function (done) { - - expect(Qs.parse('a.b=c')).to.deep.equal({ a: { b: 'c' } }); - expect(Qs.parse('a.b=c', { allowDots: false })).to.deep.equal({ 'a.b': 'c' }); - done(); - }); - - it('parses a single nested string', function (done) { - - expect(Qs.parse('a[b]=c')).to.deep.equal({ a: { b: 'c' } }); - done(); - }); - - it('parses a double nested string', function (done) { - - expect(Qs.parse('a[b][c]=d')).to.deep.equal({ a: { b: { c: 'd' } } }); - done(); - }); - - it('defaults to a depth of 5', function (done) { - - expect(Qs.parse('a[b][c][d][e][f][g][h]=i')).to.deep.equal({ a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } }); - done(); - }); - - it('only parses one level when depth = 1', function (done) { - - expect(Qs.parse('a[b][c]=d', { depth: 1 })).to.deep.equal({ a: { b: { '[c]': 'd' } } }); - expect(Qs.parse('a[b][c][d]=e', { depth: 1 })).to.deep.equal({ a: { b: { '[c][d]': 'e' } } }); - done(); - }); - - it('parses a simple array', function (done) { - - expect(Qs.parse('a=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); - done(); - }); - - it('parses an explicit array', function (done) { - - expect(Qs.parse('a[]=b')).to.deep.equal({ a: ['b'] }); - expect(Qs.parse('a[]=b&a[]=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[]=b&a[]=c&a[]=d')).to.deep.equal({ a: ['b', 'c', 'd'] }); - done(); - }); - - it('parses a mix of simple and explicit arrays', function (done) { - - expect(Qs.parse('a=b&a[]=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[]=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[0]=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a=b&a[0]=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[1]=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a=b&a[1]=c')).to.deep.equal({ a: ['b', 'c'] }); - done(); - }); - - it('parses a nested array', function (done) { - - expect(Qs.parse('a[b][]=c&a[b][]=d')).to.deep.equal({ a: { b: ['c', 'd'] } }); - expect(Qs.parse('a[>=]=25')).to.deep.equal({ a: { '>=': '25' } }); - done(); - }); - - it('allows to specify array indices', function (done) { - - expect(Qs.parse('a[1]=c&a[0]=b&a[2]=d')).to.deep.equal({ a: ['b', 'c', 'd'] }); - expect(Qs.parse('a[1]=c&a[0]=b')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[1]=c')).to.deep.equal({ a: ['c'] }); - done(); - }); - - it('limits specific array indices to 20', function (done) { - - expect(Qs.parse('a[20]=a')).to.deep.equal({ a: ['a'] }); - expect(Qs.parse('a[21]=a')).to.deep.equal({ a: { '21': 'a' } }); - done(); - }); - - it('supports keys that begin with a number', function (done) { - - expect(Qs.parse('a[12b]=c')).to.deep.equal({ a: { '12b': 'c' } }); - done(); - }); - - it('supports encoded = signs', function (done) { - - expect(Qs.parse('he%3Dllo=th%3Dere')).to.deep.equal({ 'he=llo': 'th=ere' }); - done(); - }); - - it('is ok with url encoded strings', function (done) { - - expect(Qs.parse('a[b%20c]=d')).to.deep.equal({ a: { 'b c': 'd' } }); - expect(Qs.parse('a[b]=c%20d')).to.deep.equal({ a: { b: 'c d' } }); - done(); - }); - - it('allows brackets in the value', function (done) { - - expect(Qs.parse('pets=["tobi"]')).to.deep.equal({ pets: '["tobi"]' }); - expect(Qs.parse('operators=[">=", "<="]')).to.deep.equal({ operators: '[">=", "<="]' }); - done(); - }); - - it('allows empty values', function (done) { - - expect(Qs.parse('')).to.deep.equal({}); - expect(Qs.parse(null)).to.deep.equal({}); - expect(Qs.parse(undefined)).to.deep.equal({}); - done(); - }); - - it('transforms arrays to objects', function (done) { - - expect(Qs.parse('foo[0]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }); - expect(Qs.parse('foo[bad]=baz&foo[0]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); - expect(Qs.parse('foo[bad]=baz&foo[]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); - expect(Qs.parse('foo[]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }); - expect(Qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar', '1': 'foo' } }); - expect(Qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb')).to.deep.equal({ foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); - expect(Qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c')).to.deep.equal({ a: { '0': 'b', t: 'u', c: true } }); - expect(Qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y')).to.deep.equal({ a: { '0': 'b', '1': 'c', x: 'y' } }); - done(); - }); - - it('transforms arrays to objects (dot notation)', function (done) { - - expect(Qs.parse('foo[0].baz=bar&fool.bad=baz')).to.deep.equal({ foo: [{ baz: 'bar' }], fool: { bad: 'baz' } }); - expect(Qs.parse('foo[0].baz=bar&fool.bad.boo=baz')).to.deep.equal({ foo: [{ baz: 'bar' }], fool: { bad: { boo: 'baz' } } }); - expect(Qs.parse('foo[0][0].baz=bar&fool.bad=baz')).to.deep.equal({ foo: [[{ baz: 'bar' }]], fool: { bad: 'baz' } }); - expect(Qs.parse('foo[0].baz[0]=15&foo[0].bar=2')).to.deep.equal({ foo: [{ baz: ['15'], bar: '2' }] }); - expect(Qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2')).to.deep.equal({ foo: [{ baz: ['15', '16'], bar: '2' }] }); - expect(Qs.parse('foo.bad=baz&foo[0]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); - expect(Qs.parse('foo.bad=baz&foo[]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); - expect(Qs.parse('foo[]=bar&foo.bad=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }); - expect(Qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar', '1': 'foo' } }); - expect(Qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb')).to.deep.equal({ foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); - done(); - }); - - it('can add keys to objects', function (done) { - - expect(Qs.parse('a[b]=c&a=d')).to.deep.equal({ a: { b: 'c', d: true } }); - done(); - }); - - it('correctly prunes undefined values when converting an array to an object', function (done) { - - expect(Qs.parse('a[2]=b&a[99999999]=c')).to.deep.equal({ a: { '2': 'b', '99999999': 'c' } }); - done(); - }); - - it('supports malformed uri characters', function (done) { - - expect(Qs.parse('{%:%}', { strictNullHandling: true })).to.deep.equal({ '{%:%}': null }); - expect(Qs.parse('{%:%}=')).to.deep.equal({ '{%:%}': '' }); - expect(Qs.parse('foo=%:%}')).to.deep.equal({ foo: '%:%}' }); - done(); - }); - - it('doesn\'t produce empty keys', function (done) { - - expect(Qs.parse('_r=1&')).to.deep.equal({ '_r': '1' }); - done(); - }); - - it('cannot access Object prototype', function (done) { - - Qs.parse('constructor[prototype][bad]=bad'); - Qs.parse('bad[constructor][prototype][bad]=bad'); - expect(typeof Object.prototype.bad).to.equal('undefined'); - done(); - }); - - it('parses arrays of objects', function (done) { - - expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }); - expect(Qs.parse('a[0][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }); - done(); - }); - - it('allows for empty strings in arrays', function (done) { - - expect(Qs.parse('a[]=b&a[]=&a[]=c')).to.deep.equal({ a: ['b', '', 'c'] }); - expect(Qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', { strictNullHandling: true })).to.deep.equal({ a: ['b', null, 'c', ''] }); - expect(Qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', { strictNullHandling: true })).to.deep.equal({ a: ['b', '', 'c', null] }); - expect(Qs.parse('a[]=&a[]=b&a[]=c')).to.deep.equal({ a: ['', 'b', 'c'] }); - done(); - }); - - it('compacts sparse arrays', function (done) { - - expect(Qs.parse('a[10]=1&a[2]=2')).to.deep.equal({ a: ['2', '1'] }); - done(); - }); - - it('parses semi-parsed strings', function (done) { - - expect(Qs.parse({ 'a[b]': 'c' })).to.deep.equal({ a: { b: 'c' } }); - expect(Qs.parse({ 'a[b]': 'c', 'a[d]': 'e' })).to.deep.equal({ a: { b: 'c', d: 'e' } }); - done(); - }); - - it('parses buffers correctly', function (done) { - - var b = new Buffer('test'); - expect(Qs.parse({ a: b })).to.deep.equal({ a: b }); - done(); - }); - - it('continues parsing when no parent is found', function (done) { - - expect(Qs.parse('[]=&a=b')).to.deep.equal({ '0': '', a: 'b' }); - expect(Qs.parse('[]&a=b', { strictNullHandling: true })).to.deep.equal({ '0': null, a: 'b' }); - expect(Qs.parse('[foo]=bar')).to.deep.equal({ foo: 'bar' }); - done(); - }); - - it('does not error when parsing a very long array', function (done) { - - var str = 'a[]=a'; - while (Buffer.byteLength(str) < 128 * 1024) { - str += '&' + str; - } - - expect(function () { - - Qs.parse(str); - }).to.not.throw(); - - done(); - }); - - it('should not throw when a native prototype has an enumerable property', { parallel: false }, function (done) { - - Object.prototype.crash = ''; - Array.prototype.crash = ''; - expect(Qs.parse.bind(null, 'a=b')).to.not.throw(); - expect(Qs.parse('a=b')).to.deep.equal({ a: 'b' }); - expect(Qs.parse.bind(null, 'a[][b]=c')).to.not.throw(); - expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }); - delete Object.prototype.crash; - delete Array.prototype.crash; - done(); - }); - - it('parses a string with an alternative string delimiter', function (done) { - - expect(Qs.parse('a=b;c=d', { delimiter: ';' })).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('parses a string with an alternative RegExp delimiter', function (done) { - - expect(Qs.parse('a=b; c=d', { delimiter: /[;,] */ })).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('does not use non-splittable objects as delimiters', function (done) { - - expect(Qs.parse('a=b&c=d', { delimiter: true })).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('allows overriding parameter limit', function (done) { - - expect(Qs.parse('a=b&c=d', { parameterLimit: 1 })).to.deep.equal({ a: 'b' }); - done(); - }); - - it('allows setting the parameter limit to Infinity', function (done) { - - expect(Qs.parse('a=b&c=d', { parameterLimit: Infinity })).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('allows overriding array limit', function (done) { - - expect(Qs.parse('a[0]=b', { arrayLimit: -1 })).to.deep.equal({ a: { '0': 'b' } }); - expect(Qs.parse('a[-1]=b', { arrayLimit: -1 })).to.deep.equal({ a: { '-1': 'b' } }); - expect(Qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 })).to.deep.equal({ a: { '0': 'b', '1': 'c' } }); - done(); - }); - - it('allows disabling array parsing', function (done) { - - expect(Qs.parse('a[0]=b&a[1]=c', { parseArrays: false })).to.deep.equal({ a: { '0': 'b', '1': 'c' } }); - done(); - }); - - it('parses an object', function (done) { - - var input = { - 'user[name]': { 'pop[bob]': 3 }, - 'user[email]': null - }; - - var expected = { - 'user': { - 'name': { 'pop[bob]': 3 }, - 'email': null - } - }; - - var result = Qs.parse(input); - - expect(result).to.deep.equal(expected); - done(); - }); - - it('parses an object in dot notation', function (done) { - - var input = { - 'user.name': { 'pop[bob]': 3 }, - 'user.email.': null - }; - - var expected = { - 'user': { - 'name': { 'pop[bob]': 3 }, - 'email': null - } - }; - - var result = Qs.parse(input); - - expect(result).to.deep.equal(expected); - done(); - }); - - it('parses an object and not child values', function (done) { - - var input = { - 'user[name]': { 'pop[bob]': { 'test': 3 } }, - 'user[email]': null - }; - - var expected = { - 'user': { - 'name': { 'pop[bob]': { 'test': 3 } }, - 'email': null - } - }; - - var result = Qs.parse(input); - - expect(result).to.deep.equal(expected); - done(); - }); - - it('does not blow up when Buffer global is missing', function (done) { - - var tempBuffer = global.Buffer; - delete global.Buffer; - var result = Qs.parse('a=b&c=d'); - global.Buffer = tempBuffer; - expect(result).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('does not crash when parsing circular references', function (done) { - - var a = {}; - a.b = a; - - var parsed; - - expect(function () { - - parsed = Qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a }); - }).to.not.throw(); - - expect(parsed).to.contain('foo'); - expect(parsed.foo).to.contain('bar', 'baz'); - expect(parsed.foo.bar).to.equal('baz'); - expect(parsed.foo.baz).to.deep.equal(a); - done(); - }); - - it('parses plain objects correctly', function (done) { - - var a = Object.create(null); - a.b = 'c'; - - expect(Qs.parse(a)).to.deep.equal({ b: 'c' }); - var result = Qs.parse({ a: a }); - expect(result).to.contain('a'); - expect(result.a).to.deep.equal(a); - done(); - }); - - it('parses dates correctly', function (done) { - - var now = new Date(); - expect(Qs.parse({ a: now })).to.deep.equal({ a: now }); - done(); - }); - - it('parses regular expressions correctly', function (done) { - - var re = /^test$/; - expect(Qs.parse({ a: re })).to.deep.equal({ a: re }); - done(); - }); - - it('can allow overwriting prototype properties', function (done) { - - expect(Qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true })).to.deep.equal({ a: { hasOwnProperty: 'b' } }, { prototype: false }); - expect(Qs.parse('hasOwnProperty=b', { allowPrototypes: true })).to.deep.equal({ hasOwnProperty: 'b' }, { prototype: false }); - done(); - }); - - it('can return plain objects', function (done) { - - var expected = Object.create(null); - expected.a = Object.create(null); - expected.a.b = 'c'; - expected.a.hasOwnProperty = 'd'; - expect(Qs.parse('a[b]=c&a[hasOwnProperty]=d', { plainObjects: true })).to.deep.equal(expected); - expect(Qs.parse(null, { plainObjects: true })).to.deep.equal(Object.create(null)); - var expectedArray = Object.create(null); - expectedArray.a = Object.create(null); - expectedArray.a['0'] = 'b'; - expectedArray.a.c = 'd'; - expect(Qs.parse('a[]=b&a[c]=d', { plainObjects: true })).to.deep.equal(expectedArray); - done(); - }); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/test/stringify.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/test/stringify.js deleted file mode 100644 index 48b7803..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/test/stringify.js +++ /dev/null @@ -1,259 +0,0 @@ -/* eslint no-extend-native:0 */ -// Load modules - -var Code = require('code'); -var Lab = require('lab'); -var Qs = require('../'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var expect = Code.expect; -var describe = lab.experiment; -var it = lab.test; - - -describe('stringify()', function () { - - it('stringifies a querystring object', function (done) { - - expect(Qs.stringify({ a: 'b' })).to.equal('a=b'); - expect(Qs.stringify({ a: 1 })).to.equal('a=1'); - expect(Qs.stringify({ a: 1, b: 2 })).to.equal('a=1&b=2'); - expect(Qs.stringify({ a: 'A_Z' })).to.equal('a=A_Z'); - expect(Qs.stringify({ a: '€' })).to.equal('a=%E2%82%AC'); - expect(Qs.stringify({ a: '' })).to.equal('a=%EE%80%80'); - expect(Qs.stringify({ a: 'א' })).to.equal('a=%D7%90'); - expect(Qs.stringify({ a: '𐐷' })).to.equal('a=%F0%90%90%B7'); - done(); - }); - - it('stringifies a nested object', function (done) { - - expect(Qs.stringify({ a: { b: 'c' } })).to.equal('a%5Bb%5D=c'); - expect(Qs.stringify({ a: { b: { c: { d: 'e' } } } })).to.equal('a%5Bb%5D%5Bc%5D%5Bd%5D=e'); - done(); - }); - - it('stringifies an array value', function (done) { - - expect(Qs.stringify({ a: ['b', 'c', 'd'] })).to.equal('a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d'); - done(); - }); - - it('omits array indices when asked', function (done) { - - expect(Qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false })).to.equal('a=b&a=c&a=d'); - done(); - }); - - it('stringifies a nested array value', function (done) { - - expect(Qs.stringify({ a: { b: ['c', 'd'] } })).to.equal('a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); - done(); - }); - - it('stringifies an object inside an array', function (done) { - - expect(Qs.stringify({ a: [{ b: 'c' }] })).to.equal('a%5B0%5D%5Bb%5D=c'); - expect(Qs.stringify({ a: [{ b: { c: [1] } }] })).to.equal('a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1'); - done(); - }); - - it('does not omit object keys when indices = false', function (done) { - - expect(Qs.stringify({ a: [{ b: 'c' }] }, { indices: false })).to.equal('a%5Bb%5D=c'); - done(); - }); - - it('uses indices notation for arrays when indices=true', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] }, { indices: true })).to.equal('a%5B0%5D=b&a%5B1%5D=c'); - done(); - }); - - it('uses indices notation for arrays when no arrayFormat is specified', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] })).to.equal('a%5B0%5D=b&a%5B1%5D=c'); - done(); - }); - - it('uses indices notation for arrays when no arrayFormat=indices', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })).to.equal('a%5B0%5D=b&a%5B1%5D=c'); - done(); - }); - - it('uses repeat notation for arrays when no arrayFormat=repeat', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })).to.equal('a=b&a=c'); - done(); - }); - - it('uses brackets notation for arrays when no arrayFormat=brackets', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })).to.equal('a%5B%5D=b&a%5B%5D=c'); - done(); - }); - - it('stringifies a complicated object', function (done) { - - expect(Qs.stringify({ a: { b: 'c', d: 'e' } })).to.equal('a%5Bb%5D=c&a%5Bd%5D=e'); - done(); - }); - - it('stringifies an empty value', function (done) { - - expect(Qs.stringify({ a: '' })).to.equal('a='); - expect(Qs.stringify({ a: null }, { strictNullHandling: true })).to.equal('a'); - - expect(Qs.stringify({ a: '', b: '' })).to.equal('a=&b='); - expect(Qs.stringify({ a: null, b: '' }, { strictNullHandling: true })).to.equal('a&b='); - - expect(Qs.stringify({ a: { b: '' } })).to.equal('a%5Bb%5D='); - expect(Qs.stringify({ a: { b: null } }, { strictNullHandling: true })).to.equal('a%5Bb%5D'); - expect(Qs.stringify({ a: { b: null } }, { strictNullHandling: false })).to.equal('a%5Bb%5D='); - - done(); - }); - - it('stringifies an empty object', function (done) { - - var obj = Object.create(null); - obj.a = 'b'; - expect(Qs.stringify(obj)).to.equal('a=b'); - done(); - }); - - it('returns an empty string for invalid input', function (done) { - - expect(Qs.stringify(undefined)).to.equal(''); - expect(Qs.stringify(false)).to.equal(''); - expect(Qs.stringify(null)).to.equal(''); - expect(Qs.stringify('')).to.equal(''); - done(); - }); - - it('stringifies an object with an empty object as a child', function (done) { - - var obj = { - a: Object.create(null) - }; - - obj.a.b = 'c'; - expect(Qs.stringify(obj)).to.equal('a%5Bb%5D=c'); - done(); - }); - - it('drops keys with a value of undefined', function (done) { - - expect(Qs.stringify({ a: undefined })).to.equal(''); - - expect(Qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true })).to.equal('a%5Bc%5D'); - expect(Qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false })).to.equal('a%5Bc%5D='); - expect(Qs.stringify({ a: { b: undefined, c: '' } })).to.equal('a%5Bc%5D='); - done(); - }); - - it('url encodes values', function (done) { - - expect(Qs.stringify({ a: 'b c' })).to.equal('a=b%20c'); - done(); - }); - - it('stringifies a date', function (done) { - - var now = new Date(); - var str = 'a=' + encodeURIComponent(now.toISOString()); - expect(Qs.stringify({ a: now })).to.equal(str); - done(); - }); - - it('stringifies the weird object from qs', function (done) { - - expect(Qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' })).to.equal('my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F'); - done(); - }); - - it('skips properties that are part of the object prototype', function (done) { - - Object.prototype.crash = 'test'; - expect(Qs.stringify({ a: 'b' })).to.equal('a=b'); - expect(Qs.stringify({ a: { b: 'c' } })).to.equal('a%5Bb%5D=c'); - delete Object.prototype.crash; - done(); - }); - - it('stringifies boolean values', function (done) { - - expect(Qs.stringify({ a: true })).to.equal('a=true'); - expect(Qs.stringify({ a: { b: true } })).to.equal('a%5Bb%5D=true'); - expect(Qs.stringify({ b: false })).to.equal('b=false'); - expect(Qs.stringify({ b: { c: false } })).to.equal('b%5Bc%5D=false'); - done(); - }); - - it('stringifies buffer values', function (done) { - - expect(Qs.stringify({ a: new Buffer('test') })).to.equal('a=test'); - expect(Qs.stringify({ a: { b: new Buffer('test') } })).to.equal('a%5Bb%5D=test'); - done(); - }); - - it('stringifies an object using an alternative delimiter', function (done) { - - expect(Qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' })).to.equal('a=b;c=d'); - done(); - }); - - it('doesn\'t blow up when Buffer global is missing', function (done) { - - var tempBuffer = global.Buffer; - delete global.Buffer; - expect(Qs.stringify({ a: 'b', c: 'd' })).to.equal('a=b&c=d'); - global.Buffer = tempBuffer; - done(); - }); - - it('selects properties when filter=array', function (done) { - - expect(Qs.stringify({ a: 'b' }, { filter: ['a'] })).to.equal('a=b'); - expect(Qs.stringify({ a: 1 }, { filter: [] })).to.equal(''); - expect(Qs.stringify({ a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, { filter: ['a', 'b', 0, 2] })).to.equal('a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3'); - done(); - - }); - - it('supports custom representations when filter=function', function (done) { - - var calls = 0; - var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } }; - var filterFunc = function (prefix, value) { - - calls++; - if (calls === 1) { - expect(prefix).to.be.empty(); - expect(value).to.equal(obj); - } - else if (prefix === 'c') { - return; - } - else if (value instanceof Date) { - expect(prefix).to.equal('e[f]'); - return value.getTime(); - } - return value; - }; - - expect(Qs.stringify(obj, { filter: filterFunc })).to.equal('a=b&e%5Bf%5D=1257894000000'); - expect(calls).to.equal(5); - done(); - - }); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/test/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/test/utils.js deleted file mode 100644 index a9a6b52..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/qs/test/utils.js +++ /dev/null @@ -1,28 +0,0 @@ -// Load modules - -var Code = require('code'); -var Lab = require('lab'); -var Utils = require('../lib/utils'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var expect = Code.expect; -var describe = lab.experiment; -var it = lab.test; - - -describe('merge()', function () { - - it('can merge two objects with the same key', function (done) { - - expect(Utils.merge({ a: 'b' }, { a: 'c' })).to.deep.equal({ a: ['b', 'c'] }); - done(); - }); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/HISTORY.md deleted file mode 100644 index 1bb53bd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/HISTORY.md +++ /dev/null @@ -1,35 +0,0 @@ -1.0.2 / 2014-09-08 -================== - - * Support Node.js 0.6 - -1.0.1 / 2014-09-07 -================== - - * Move repository to jshttp - -1.0.0 / 2013-12-11 -================== - - * Add repository to package.json - * Add MIT license - -0.0.4 / 2012-06-17 -================== - - * Change ret -1 for unsatisfiable and -2 when invalid - -0.0.3 / 2012-06-17 -================== - - * Fix last-byte-pos default to len - 1 - -0.0.2 / 2012-06-14 -================== - - * Add `.type` - -0.0.1 / 2012-06-11 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/LICENSE deleted file mode 100644 index a491841..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2012-2014 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. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/README.md deleted file mode 100644 index 6a2682f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# range-parser - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Range header field parser. - -## Installation - -``` -$ npm install range-parser -``` - -## Examples - -```js -assert(-1 == parse(200, 'bytes=500-20')); -assert(-2 == parse(200, 'bytes=malformed')); -parse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }])); -parse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }])); -parse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }])); -parse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }])); -parse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }])); -parse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }])); -parse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }])); -parse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }])); -parse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }])); -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/range-parser.svg?style=flat -[npm-url]: https://npmjs.org/package/range-parser -[node-version-image]: https://img.shields.io/badge/node.js-%3E%3D_0.6-brightgreen.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/range-parser.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/range-parser -[coveralls-image]: https://img.shields.io/coveralls/jshttp/range-parser.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/range-parser -[downloads-image]: https://img.shields.io/npm/dm/range-parser.svg?style=flat -[downloads-url]: https://npmjs.org/package/range-parser diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/index.js deleted file mode 100644 index 09a6c40..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/index.js +++ /dev/null @@ -1,49 +0,0 @@ - -/** - * Parse "Range" header `str` relative to the given file `size`. - * - * @param {Number} size - * @param {String} str - * @return {Array} - * @api public - */ - -module.exports = function(size, str){ - var valid = true; - var i = str.indexOf('='); - - if (-1 == i) return -2; - - var arr = str.slice(i + 1).split(',').map(function(range){ - var range = range.split('-') - , start = parseInt(range[0], 10) - , end = parseInt(range[1], 10); - - // -nnn - if (isNaN(start)) { - start = size - end; - end = size - 1; - // nnn- - } else if (isNaN(end)) { - end = size - 1; - } - - // limit last-byte-pos to current length - if (end > size - 1) end = size - 1; - - // invalid - if (isNaN(start) - || isNaN(end) - || start > end - || start < 0) valid = false; - - return { - start: start, - end: end - }; - }); - - arr.type = str.slice(0, i); - - return valid ? arr : -1; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/package.json deleted file mode 100644 index c4f8b2f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/range-parser/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "range-parser", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "Range header field string parser", - "version": "1.0.2", - "license": "MIT", - "keywords": [ - "range", - "parser", - "http" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/range-parser" - }, - "devDependencies": { - "istanbul": "0", - "mocha": "1", - "should": "2" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --require should", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --require should", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot --require should" - }, - "gitHead": "ae23b02ce705b56e7f7c48e832d41fa710227ecc", - "bugs": { - "url": "https://github.com/jshttp/range-parser/issues" - }, - "homepage": "https://github.com/jshttp/range-parser", - "_id": "range-parser@1.0.2", - "_shasum": "06a12a42e5131ba8e457cd892044867f2344e549", - "_from": "range-parser@>=1.0.2 <1.1.0", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "06a12a42e5131ba8e457cd892044867f2344e549", - "tarball": "http://registry.npmjs.org/range-parser/-/range-parser-1.0.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/HISTORY.md deleted file mode 100644 index 1fa40b5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/HISTORY.md +++ /dev/null @@ -1,295 +0,0 @@ -0.13.0 / 2015-06-16 -=================== - - * Allow Node.js HTTP server to set `Date` response header - * Fix incorrectly removing `Content-Location` on 304 response - * Improve the default redirect response headers - * Send appropriate headers on default error response - * Use `http-errors` for standard emitted errors - * Use `statuses` instead of `http` module for status messages - * deps: escape-html@1.0.2 - * deps: etag@~1.7.0 - - Improve stat performance by removing hashing - * deps: fresh@0.3.0 - - Add weak `ETag` matching support - * deps: on-finished@~2.3.0 - - Add defined behavior for HTTP `CONNECT` requests - - Add defined behavior for HTTP `Upgrade` requests - - deps: ee-first@1.1.1 - * perf: enable strict mode - * perf: remove unnecessary array allocations - -0.12.3 / 2015-05-13 -=================== - - * deps: debug@~2.2.0 - - deps: ms@0.7.1 - * deps: depd@~1.0.1 - * deps: etag@~1.6.0 - - Improve support for JXcore - - Support "fake" stats objects in environments without `fs` - * deps: ms@0.7.1 - - Prevent extraordinarily long inputs - * deps: on-finished@~2.2.1 - -0.12.2 / 2015-03-13 -=================== - - * Throw errors early for invalid `extensions` or `index` options - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - -0.12.1 / 2015-02-17 -=================== - - * Fix regression sending zero-length files - -0.12.0 / 2015-02-16 -=================== - - * Always read the stat size from the file - * Fix mutating passed-in `options` - * deps: mime@1.3.4 - -0.11.1 / 2015-01-20 -=================== - - * Fix `root` path disclosure - -0.11.0 / 2015-01-05 -=================== - - * deps: debug@~2.1.1 - * deps: etag@~1.5.1 - - deps: crc@3.2.1 - * deps: ms@0.7.0 - - Add `milliseconds` - - Add `msecs` - - Add `secs` - - Add `mins` - - Add `hrs` - - Add `yrs` - * deps: on-finished@~2.2.0 - -0.10.1 / 2014-10-22 -=================== - - * deps: on-finished@~2.1.1 - - Fix handling of pipelined requests - -0.10.0 / 2014-10-15 -=================== - - * deps: debug@~2.1.0 - - Implement `DEBUG_FD` env variable support - * deps: depd@~1.0.0 - * deps: etag@~1.5.0 - - Improve string performance - - Slightly improve speed for weak ETags over 1KB - -0.9.3 / 2014-09-24 -================== - - * deps: etag@~1.4.0 - - Support "fake" stats objects - -0.9.2 / 2014-09-15 -================== - - * deps: depd@0.4.5 - * deps: etag@~1.3.1 - * deps: range-parser@~1.0.2 - -0.9.1 / 2014-09-07 -================== - - * deps: fresh@0.2.4 - -0.9.0 / 2014-09-07 -================== - - * Add `lastModified` option - * Use `etag` to generate `ETag` header - * deps: debug@~2.0.0 - -0.8.5 / 2014-09-04 -================== - - * Fix malicious path detection for empty string path - -0.8.4 / 2014-09-04 -================== - - * Fix a path traversal issue when using `root` - -0.8.3 / 2014-08-16 -================== - - * deps: destroy@1.0.3 - - renamed from dethroy - * deps: on-finished@2.1.0 - -0.8.2 / 2014-08-14 -================== - - * Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` - * deps: dethroy@1.0.2 - -0.8.1 / 2014-08-05 -================== - - * Fix `extensions` behavior when file already has extension - -0.8.0 / 2014-08-05 -================== - - * Add `extensions` option - -0.7.4 / 2014-08-04 -================== - - * Fix serving index files without root dir - -0.7.3 / 2014-07-29 -================== - - * Fix incorrect 403 on Windows and Node.js 0.11 - -0.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -0.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -0.7.0 / 2014-07-20 -================== - - * Deprecate `hidden` option; use `dotfiles` option - * Add `dotfiles` option - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - -0.6.0 / 2014-07-11 -================== - - * Deprecate `from` option; use `root` option - * Deprecate `send.etag()` -- use `etag` in `options` - * Deprecate `send.hidden()` -- use `hidden` in `options` - * Deprecate `send.index()` -- use `index` in `options` - * Deprecate `send.maxage()` -- use `maxAge` in `options` - * Deprecate `send.root()` -- use `root` in `options` - * Cap `maxAge` value to 1 year - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.5.0 / 2014-06-28 -================== - - * Accept string for `maxAge` (converted by `ms`) - * Add `headers` event - * Include link in default redirect response - * Use `EventEmitter.listenerCount` to count listeners - -0.4.3 / 2014-06-11 -================== - - * Do not throw un-catchable error on file open race condition - * Use `escape-html` for HTML escaping - * deps: debug@1.0.2 - - fix some debugging output colors on node.js 0.8 - * deps: finished@1.2.2 - * deps: fresh@0.2.2 - -0.4.2 / 2014-06-09 -================== - - * fix "event emitter leak" warnings - * deps: debug@1.0.1 - * deps: finished@1.2.1 - -0.4.1 / 2014-06-02 -================== - - * Send `max-age` in `Cache-Control` in correct format - -0.4.0 / 2014-05-27 -================== - - * Calculate ETag with md5 for reduced collisions - * Fix wrong behavior when index file matches directory - * Ignore stream errors after request ends - - Goodbye `EBADF, read` - * Skip directories in index file search - * deps: debug@0.8.1 - -0.3.0 / 2014-04-24 -================== - - * Fix sending files with dots without root set - * Coerce option types - * Accept API options in options object - * Set etags to "weak" - * Include file path in etag - * Make "Can't set headers after they are sent." catchable - * Send full entity-body for multi range requests - * Default directory access to 403 when index disabled - * Support multiple index paths - * Support "If-Range" header - * Control whether to generate etags - * deps: mime@1.2.11 - -0.2.0 / 2014-01-29 -================== - - * update range-parser and fresh - -0.1.4 / 2013-08-11 -================== - - * update fresh - -0.1.3 / 2013-07-08 -================== - - * Revert "Fix fd leak" - -0.1.2 / 2013-07-03 -================== - - * Fix fd leak - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/LICENSE deleted file mode 100644 index e4d595b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/README.md deleted file mode 100644 index 3586060..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/README.md +++ /dev/null @@ -1,195 +0,0 @@ -# send - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Linux Build][travis-image]][travis-url] -[![Windows Build][appveyor-image]][appveyor-url] -[![Test Coverage][coveralls-image]][coveralls-url] -[![Gratipay][gratipay-image]][gratipay-url] - -Send is a library for streaming files from the file system as a http response -supporting partial responses (Ranges), conditional-GET negotiation, high test -coverage, and granular events which may be leveraged to take appropriate actions -in your application or framework. - -Looking to serve up entire folders mapped to URLs? Try [serve-static](https://www.npmjs.org/package/serve-static). - -## Installation - -```bash -$ npm install send -``` - -## API - -```js -var send = require('send') -``` - -### send(req, path, [options]) - -Create a new `SendStream` for the given path to send to a `res`. The `req` is -the Node.js HTTP request and the `path` is a urlencoded path to send (urlencoded, -not the actual file-system path). - -#### Options - -##### dotfiles - -Set how "dotfiles" are treated when encountered. A dotfile is a file -or directory that begins with a dot ("."). Note this check is done on -the path itself without checking if the path actually exists on the -disk. If `root` is specified, only the dotfiles above the root are -checked (i.e. the root itself can be within a dotfile when when set -to "deny"). - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and 404. - -The default value is _similar_ to `'ignore'`, with the exception that -this default will not ignore the files within a directory that begins -with a dot, for backward-compatibility. - -##### etag - -Enable or disable etag generation, defaults to true. - -##### extensions - -If a given file doesn't exist, try appending one of the given extensions, -in the given order. By default, this is disabled (set to `false`). An -example value that will serve extension-less HTML files: `['html', 'htm']`. -This is skipped if the requested file already has an extension. - -##### index - -By default send supports "index.html" files, to disable this -set `false` or to supply a new index pass a string or an array -in preferred order. - -##### lastModified - -Enable or disable `Last-Modified` header, defaults to true. Uses the file -system's last modified value. - -##### maxAge - -Provide a max-age in milliseconds for http caching, defaults to 0. -This can also be a string accepted by the -[ms](https://www.npmjs.org/package/ms#readme) module. - -##### root - -Serve files relative to `path`. - -### Events - -The `SendStream` is an event emitter and will emit the following events: - - - `error` an error occurred `(err)` - - `directory` a directory was requested - - `file` a file was requested `(path, stat)` - - `headers` the headers are about to be set on a file `(res, path, stat)` - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -### .pipe - -The `pipe` method is used to pipe the response into the Node.js HTTP response -object, typically `send(req, path, options).pipe(res)`. - -## Error-handling - -By default when no `error` listeners are present an automatic response will be -made, otherwise you have full control over the response, aka you may show a 5xx -page etc. - -## Caching - -It does _not_ perform internal caching, you should use a reverse proxy cache -such as Varnish for this, or those fancy things called CDNs. If your -application is small enough that it would benefit from single-node memory -caching, it's small enough that it does not need caching at all ;). - -## Debugging - -To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ npm test -``` - -## Examples - -### Small example - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - send(req, req.url).pipe(res); -}).listen(3000); -``` - -Serving from a root directory with custom error-handling: - -```js -var http = require('http'); -var send = require('send'); -var url = require('url'); - -var app = http.createServer(function(req, res){ - // your custom error-handling logic: - function error(err) { - res.statusCode = err.status || 500; - res.end(err.message); - } - - // your custom headers - function headers(res, path, stat) { - // serve all files for download - res.setHeader('Content-Disposition', 'attachment'); - } - - // your custom directory handling logic: - function redirect() { - res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, url.parse(req.url).pathname, {root: '/www/example.com/public'}) - .on('error', error) - .on('directory', redirect) - .on('headers', headers) - .pipe(res); -}).listen(3000); -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/send.svg -[npm-url]: https://npmjs.org/package/send -[travis-image]: https://img.shields.io/travis/pillarjs/send/master.svg?label=linux -[travis-url]: https://travis-ci.org/pillarjs/send -[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/send/master.svg?label=windows -[appveyor-url]: https://ci.appveyor.com/project/dougwilson/send -[coveralls-image]: https://img.shields.io/coveralls/pillarjs/send/master.svg -[coveralls-url]: https://coveralls.io/r/pillarjs/send?branch=master -[downloads-image]: https://img.shields.io/npm/dm/send.svg -[downloads-url]: https://npmjs.org/package/send -[gratipay-image]: https://img.shields.io/gratipay/dougwilson.svg -[gratipay-url]: https://www.gratipay.com/dougwilson/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/index.js deleted file mode 100644 index 3510989..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/index.js +++ /dev/null @@ -1,820 +0,0 @@ -/*! - * send - * Copyright(c) 2012 TJ Holowaychuk - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var createError = require('http-errors') -var debug = require('debug')('send') -var deprecate = require('depd')('send') -var destroy = require('destroy') -var escapeHtml = require('escape-html') - , parseRange = require('range-parser') - , Stream = require('stream') - , mime = require('mime') - , fresh = require('fresh') - , path = require('path') - , fs = require('fs') - , normalize = path.normalize - , join = path.join -var etag = require('etag') -var EventEmitter = require('events').EventEmitter; -var ms = require('ms'); -var onFinished = require('on-finished') -var statuses = require('statuses') - -/** - * Variables. - */ -var extname = path.extname -var maxMaxAge = 60 * 60 * 24 * 365 * 1000; // 1 year -var resolve = path.resolve -var sep = path.sep -var toString = Object.prototype.toString -var upPathRegexp = /(?:^|[\\\/])\.\.(?:[\\\/]|$)/ - -/** - * Module exports. - * @public - */ - -module.exports = send -module.exports.mime = mime - -/** - * Shim EventEmitter.listenerCount for node.js < 0.10 - */ - -/* istanbul ignore next */ -var listenerCount = EventEmitter.listenerCount - || function(emitter, type){ return emitter.listeners(type).length; }; - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {object} req - * @param {string} path - * @param {object} [options] - * @return {SendStream} - * @public - */ - -function send(req, path, options) { - return new SendStream(req, path, options); -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * @param {Request} req - * @param {String} path - * @param {object} [options] - * @private - */ - -function SendStream(req, path, options) { - var opts = options || {} - - this.options = opts - this.path = path - this.req = req - - this._etag = opts.etag !== undefined - ? Boolean(opts.etag) - : true - - this._dotfiles = opts.dotfiles !== undefined - ? opts.dotfiles - : 'ignore' - - if (this._dotfiles !== 'ignore' && this._dotfiles !== 'allow' && this._dotfiles !== 'deny') { - throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') - } - - this._hidden = Boolean(opts.hidden) - - if (opts.hidden !== undefined) { - deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') - } - - // legacy support - if (opts.dotfiles === undefined) { - this._dotfiles = undefined - } - - this._extensions = opts.extensions !== undefined - ? normalizeList(opts.extensions, 'extensions option') - : [] - - this._index = opts.index !== undefined - ? normalizeList(opts.index, 'index option') - : ['index.html'] - - this._lastModified = opts.lastModified !== undefined - ? Boolean(opts.lastModified) - : true - - this._maxage = opts.maxAge || opts.maxage - this._maxage = typeof this._maxage === 'string' - ? ms(this._maxage) - : Number(this._maxage) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), maxMaxAge) - : 0 - - this._root = opts.root - ? resolve(opts.root) - : null - - if (!this._root && opts.from) { - this.from(opts.from) - } -} - -/** - * Inherits from `Stream.prototype`. - */ - -SendStream.prototype.__proto__ = Stream.prototype; - -/** - * Enable or disable etag generation. - * - * @param {Boolean} val - * @return {SendStream} - * @api public - */ - -SendStream.prototype.etag = deprecate.function(function etag(val) { - val = Boolean(val); - debug('etag %s', val); - this._etag = val; - return this; -}, 'send.etag: pass etag as option'); - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = deprecate.function(function hidden(val) { - val = Boolean(val); - debug('hidden %s', val); - this._hidden = val; - this._dotfiles = undefined - return this; -}, 'send.hidden: use dotfiles option'); - -/** - * Set index `paths`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean|Array} paths - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = deprecate.function(function index(paths) { - var index = !paths ? [] : normalizeList(paths, 'paths argument'); - debug('index %o', paths); - this._index = index; - return this; -}, 'send.index: pass index as option'); - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = function(path){ - path = String(path); - this._root = resolve(path) - return this; -}; - -SendStream.prototype.from = deprecate.function(SendStream.prototype.root, - 'send.from: pass root as option'); - -SendStream.prototype.root = deprecate.function(SendStream.prototype.root, - 'send.root: pass root as option'); - -/** - * Set max-age to `maxAge`. - * - * @param {Number} maxAge - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = deprecate.function(function maxage(maxAge) { - maxAge = typeof maxAge === 'string' - ? ms(maxAge) - : Number(maxAge); - if (isNaN(maxAge)) maxAge = 0; - if (Infinity == maxAge) maxAge = 60 * 60 * 24 * 365 * 1000; - debug('max-age %d', maxAge); - this._maxage = maxAge; - return this; -}, 'send.maxage: pass maxAge as option'); - -/** - * Emit error with `status`. - * - * @param {number} status - * @param {Error} [error] - * @private - */ - -SendStream.prototype.error = function error(status, error) { - // emit if listeners instead of responding - if (listenerCount(this, 'error') !== 0) { - return this.emit('error', createError(error, status, { - expose: false - })) - } - - var res = this.res - var msg = statuses[status] - - // wipe all existing headers - res._headers = null - - // send basic response - res.statusCode = status - res.setHeader('Content-Type', 'text/plain; charset=UTF-8') - res.setHeader('Content-Length', Buffer.byteLength(msg)) - res.setHeader('X-Content-Type-Options', 'nosniff') - res.end(msg) -} - -/** - * Check if the pathname ends with "/". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasTrailingSlash = function(){ - return '/' == this.path[this.path.length - 1]; -}; - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function(){ - return this.req.headers['if-none-match'] - || this.req.headers['if-modified-since']; -}; - -/** - * Strip content-* header fields. - * - * @private - */ - -SendStream.prototype.removeContentHeaderFields = function removeContentHeaderFields() { - var res = this.res - var headers = Object.keys(res._headers || {}) - - for (var i = 0; i < headers.length; i++) { - var header = headers[i] - if (header.substr(0, 8) === 'content-' && header !== 'content-location') { - res.removeHeader(header) - } - } -} - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function(){ - var res = this.res; - debug('not modified'); - this.removeContentHeaderFields(); - res.statusCode = 304; - res.end(); -}; - -/** - * Raise error that headers already sent. - * - * @api private - */ - -SendStream.prototype.headersAlreadySent = function headersAlreadySent(){ - var err = new Error('Can\'t set headers after they are sent.'); - debug('headers already sent'); - this.error(500, err); -}; - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function(){ - var res = this.res; - return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; -}; - -/** - * Handle stat() error. - * - * @param {Error} error - * @private - */ - -SendStream.prototype.onStatError = function onStatError(error) { - switch (error.code) { - case 'ENAMETOOLONG': - case 'ENOENT': - case 'ENOTDIR': - this.error(404, error) - break - default: - this.error(500, error) - break - } -} - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function(){ - return fresh(this.req.headers, this.res._headers); -}; - -/** - * Check if the range is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isRangeFresh = function isRangeFresh(){ - var ifRange = this.req.headers['if-range']; - - if (!ifRange) return true; - - return ~ifRange.indexOf('"') - ? ~ifRange.indexOf(this.res._headers['etag']) - : Date.parse(this.res._headers['last-modified']) <= Date.parse(ifRange); -}; - -/** - * Redirect to path. - * - * @param {string} path - * @private - */ - -SendStream.prototype.redirect = function redirect(path) { - if (listenerCount(this, 'directory') !== 0) { - this.emit('directory') - return - } - - if (this.hasTrailingSlash()) { - this.error(403) - return - } - - var loc = path + '/' - var msg = 'Redirecting to ' + escapeHtml(loc) + '\n' - var res = this.res - - // redirect - res.statusCode = 301 - res.setHeader('Content-Type', 'text/html; charset=UTF-8') - res.setHeader('Content-Length', Buffer.byteLength(msg)) - res.setHeader('X-Content-Type-Options', 'nosniff') - res.setHeader('Location', loc) - res.end(msg) -} - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function(res){ - var self = this - , args = arguments - , root = this._root; - - // references - this.res = res; - - // decode the path - var path = decode(this.path) - if (path === -1) return this.error(400) - - // null byte(s) - if (~path.indexOf('\0')) return this.error(400); - - var parts - if (root !== null) { - // malicious path - if (upPathRegexp.test(normalize('.' + sep + path))) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // join / normalize from optional root dir - path = normalize(join(root, path)) - root = normalize(root + sep) - - // explode path parts - parts = path.substr(root.length).split(sep) - } else { - // ".." is malicious without "root" - if (upPathRegexp.test(path)) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = normalize(path).split(sep) - - // resolve the path - path = resolve(path) - } - - // dotfile handling - if (containsDotFile(parts)) { - var access = this._dotfiles - - // legacy support - if (access === undefined) { - access = parts[parts.length - 1][0] === '.' - ? (this._hidden ? 'allow' : 'ignore') - : 'allow' - } - - debug('%s dotfile "%s"', access, path) - switch (access) { - case 'allow': - break - case 'deny': - return this.error(403) - case 'ignore': - default: - return this.error(404) - } - } - - // index file support - if (this._index.length && this.path[this.path.length - 1] === '/') { - this.sendIndex(path); - return res; - } - - this.sendFile(path); - return res; -}; - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function(path, stat){ - var len = stat.size; - var options = this.options - var opts = {} - var res = this.res; - var req = this.req; - var ranges = req.headers.range; - var offset = options.start || 0; - - if (res._header) { - // impossible to send now - return this.headersAlreadySent(); - } - - debug('pipe "%s"', path) - - // set header fields - this.setHeader(path, stat); - - // set content-type - this.type(path); - - // conditional GET support - if (this.isConditionalGET() - && this.isCachable() - && this.isFresh()) { - return this.notModified(); - } - - // adjust len to start/end options - len = Math.max(0, len - offset); - if (options.end !== undefined) { - var bytes = options.end - offset + 1; - if (len > bytes) len = bytes; - } - - // Range support - if (ranges) { - ranges = parseRange(len, ranges); - - // If-Range support - if (!this.isRangeFresh()) { - debug('range stale'); - ranges = -2; - } - - // unsatisfiable - if (-1 == ranges) { - debug('range unsatisfiable'); - res.setHeader('Content-Range', 'bytes */' + stat.size); - return this.error(416); - } - - // valid (syntactically invalid/multiple ranges are treated as a regular response) - if (-2 != ranges && ranges.length === 1) { - debug('range %j', ranges); - - // Content-Range - res.statusCode = 206; - res.setHeader('Content-Range', 'bytes ' - + ranges[0].start - + '-' - + ranges[0].end - + '/' - + len); - - offset += ranges[0].start; - len = ranges[0].end - ranges[0].start + 1; - } - } - - // clone options - for (var prop in options) { - opts[prop] = options[prop] - } - - // set read options - opts.start = offset - opts.end = Math.max(offset, offset + len - 1) - - // content-length - res.setHeader('Content-Length', len); - - // HEAD support - if ('HEAD' == req.method) return res.end(); - - this.stream(path, opts) -}; - -/** - * Transfer file for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendFile = function sendFile(path) { - var i = 0 - var self = this - - debug('stat "%s"', path); - fs.stat(path, function onstat(err, stat) { - if (err && err.code === 'ENOENT' - && !extname(path) - && path[path.length - 1] !== sep) { - // not found, check extensions - return next(err) - } - if (err) return self.onStatError(err) - if (stat.isDirectory()) return self.redirect(self.path) - self.emit('file', path, stat) - self.send(path, stat) - }) - - function next(err) { - if (self._extensions.length <= i) { - return err - ? self.onStatError(err) - : self.error(404) - } - - var p = path + '.' + self._extensions[i++] - - debug('stat "%s"', p) - fs.stat(p, function (err, stat) { - if (err) return next(err) - if (stat.isDirectory()) return next() - self.emit('file', p, stat) - self.send(p, stat) - }) - } -} - -/** - * Transfer index for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendIndex = function sendIndex(path){ - var i = -1; - var self = this; - - function next(err){ - if (++i >= self._index.length) { - if (err) return self.onStatError(err); - return self.error(404); - } - - var p = join(path, self._index[i]); - - debug('stat "%s"', p); - fs.stat(p, function(err, stat){ - if (err) return next(err); - if (stat.isDirectory()) return next(); - self.emit('file', p, stat); - self.send(p, stat); - }); - } - - next(); -}; - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function(path, options){ - // TODO: this is all lame, refactor meeee - var finished = false; - var self = this; - var res = this.res; - var req = this.req; - - // pipe - var stream = fs.createReadStream(path, options); - this.emit('stream', stream); - stream.pipe(res); - - // response finished, done with the fd - onFinished(res, function onfinished(){ - finished = true; - destroy(stream); - }); - - // error handling code-smell - stream.on('error', function onerror(err){ - // request already finished - if (finished) return; - - // clean up stream - finished = true; - destroy(stream); - - // error - self.onStatError(err); - }); - - // end - stream.on('end', function onend(){ - self.emit('end'); - }); -}; - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function(path){ - var res = this.res; - if (res.getHeader('Content-Type')) return; - var type = mime.lookup(path); - var charset = mime.charsets.lookup(type); - debug('content-type %s', type); - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); -}; - -/** - * Set response header fields, most - * fields may be pre-defined. - * - * @param {String} path - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function setHeader(path, stat){ - var res = this.res; - - this.emit('headers', res, path, stat); - - if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); - if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + Math.floor(this._maxage / 1000)); - - if (this._lastModified && !res.getHeader('Last-Modified')) { - var modified = stat.mtime.toUTCString() - debug('modified %s', modified) - res.setHeader('Last-Modified', modified) - } - - if (this._etag && !res.getHeader('ETag')) { - var val = etag(stat) - debug('etag %s', val) - res.setHeader('ETag', val) - } -}; - -/** - * Determine if path parts contain a dotfile. - * - * @api private - */ - -function containsDotFile(parts) { - for (var i = 0; i < parts.length; i++) { - if (parts[i][0] === '.') { - return true - } - } - - return false -} - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -function decode(path) { - try { - return decodeURIComponent(path) - } catch (err) { - return -1 - } -} - -/** - * Normalize the index option into an array. - * - * @param {boolean|string|array} val - * @param {string} name - * @private - */ - -function normalizeList(val, name) { - var list = [].concat(val || []) - - for (var i = 0; i < list.length; i++) { - if (typeof list[i] !== 'string') { - throw new TypeError(name + ' must be array of strings or false') - } - } - - return list -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/.bin/mime b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/.bin/mime deleted file mode 120000 index fbb7ee0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/.bin/mime +++ /dev/null @@ -1 +0,0 @@ -../mime/cli.js \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/destroy/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/destroy/README.md deleted file mode 100644 index 665acb7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/destroy/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Destroy - -[![NPM version][npm-image]][npm-url] -[![Build status][travis-image]][travis-url] -[![Test coverage][coveralls-image]][coveralls-url] -[![Dependency Status][david-image]][david-url] -[![License][license-image]][license-url] -[![Downloads][downloads-image]][downloads-url] -[![Gittip][gittip-image]][gittip-url] - -Destroy a stream. - -## API - -```js -var destroy = require('destroy') - -var fs = require('fs') -var stream = fs.createReadStream('package.json') -destroy(stream) -``` - -[npm-image]: https://img.shields.io/npm/v/destroy.svg?style=flat-square -[npm-url]: https://npmjs.org/package/destroy -[github-tag]: http://img.shields.io/github/tag/stream-utils/destroy.svg?style=flat-square -[github-url]: https://github.com/stream-utils/destroy/tags -[travis-image]: https://img.shields.io/travis/stream-utils/destroy.svg?style=flat-square -[travis-url]: https://travis-ci.org/stream-utils/destroy -[coveralls-image]: https://img.shields.io/coveralls/stream-utils/destroy.svg?style=flat-square -[coveralls-url]: https://coveralls.io/r/stream-utils/destroy?branch=master -[david-image]: http://img.shields.io/david/stream-utils/destroy.svg?style=flat-square -[david-url]: https://david-dm.org/stream-utils/destroy -[license-image]: http://img.shields.io/npm/l/destroy.svg?style=flat-square -[license-url]: LICENSE.md -[downloads-image]: http://img.shields.io/npm/dm/destroy.svg?style=flat-square -[downloads-url]: https://npmjs.org/package/destroy -[gittip-image]: https://img.shields.io/gittip/jonathanong.svg?style=flat-square -[gittip-url]: https://www.gittip.com/jonathanong/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/destroy/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/destroy/index.js deleted file mode 100644 index b455217..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/destroy/index.js +++ /dev/null @@ -1,36 +0,0 @@ -var ReadStream = require('fs').ReadStream -var Stream = require('stream') - -module.exports = function destroy(stream) { - if (stream instanceof ReadStream) { - return destroyReadStream(stream) - } - - if (!(stream instanceof Stream)) { - return stream - } - - if (typeof stream.destroy === 'function') { - stream.destroy() - } - - return stream -} - -function destroyReadStream(stream) { - stream.destroy() - - if (typeof stream.close === 'function') { - // node.js core bug work-around - stream.on('open', onopenClose) - } - - return stream -} - -function onopenClose() { - if (typeof this.fd === 'number') { - // actually close down the fd - this.close() - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/destroy/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/destroy/package.json deleted file mode 100644 index c88380a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/destroy/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "destroy", - "description": "destroy a stream if possible", - "version": "1.0.3", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/stream-utils/destroy" - }, - "devDependencies": { - "istanbul": "0", - "mocha": "1" - }, - "scripts": { - "test": "mocha --reporter spec", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" - }, - "files": [ - "index.js" - ], - "keywords": [ - "stream", - "streams", - "destroy", - "cleanup", - "leak", - "fd" - ], - "gitHead": "50af95ece4a70202f9301bc3edc8f9fdbbad0f26", - "bugs": { - "url": "https://github.com/stream-utils/destroy/issues" - }, - "homepage": "https://github.com/stream-utils/destroy", - "_id": "destroy@1.0.3", - "_shasum": "b433b4724e71fd8551d9885174851c5fc377e2c9", - "_from": "destroy@1.0.3", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "b433b4724e71fd8551d9885174851c5fc377e2c9", - "tarball": "http://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/HISTORY.md deleted file mode 100644 index 4c7087d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/HISTORY.md +++ /dev/null @@ -1,76 +0,0 @@ -2015-02-02 / 1.3.1 -================== - - * Fix regression where status can be overwritten in `createError` `props` - -2015-02-01 / 1.3.0 -================== - - * Construct errors using defined constructors from `createError` - * Fix error names that are not identifiers - - `createError["I'mateapot"]` is now `createError.ImATeapot` - * Set a meaningful `name` property on constructed errors - -2014-12-09 / 1.2.8 -================== - - * Fix stack trace from exported function - * Remove `arguments.callee` usage - -2014-10-14 / 1.2.7 -================== - - * Remove duplicate line - -2014-10-02 / 1.2.6 -================== - - * Fix `expose` to be `true` for `ClientError` constructor - -2014-09-28 / 1.2.5 -================== - - * deps: statuses@1 - -2014-09-21 / 1.2.4 -================== - - * Fix dependency version to work with old `npm`s - -2014-09-21 / 1.2.3 -================== - - * deps: statuses@~1.1.0 - -2014-09-21 / 1.2.2 -================== - - * Fix publish error - -2014-09-21 / 1.2.1 -================== - - * Support Node.js 0.6 - * Use `inherits` instead of `util` - -2014-09-09 / 1.2.0 -================== - - * Fix the way inheriting functions - * Support `expose` being provided in properties argument - -2014-09-08 / 1.1.0 -================== - - * Default status to 500 - * Support provided `error` to extend - -2014-09-08 / 1.0.1 -================== - - * Fix accepting string message - -2014-09-08 / 1.0.0 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/README.md deleted file mode 100644 index 520271e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# http-errors - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Create HTTP errors for Express, Koa, Connect, etc. with ease. - -## Example - -```js -var createError = require('http-errors'); - -app.use(function (req, res, next) { - if (!req.user) return next(createError(401, 'Please login to view this page.')); - next(); -}) -``` - -## API - -This is the current API, currently extracted from Koa and subject to change. - -### Error Properties - -- `message` -- `status` and `statusCode` - the status code of the error, defaulting to `500` - -### createError([status], [message], [properties]) - -```js -var err = createError(404, 'This video does not exist!'); -``` - -- `status: 500` - the status code as a number -- `message` - the message of the error, defaulting to node's text for that status code. -- `properties` - custom properties to attach to the object - -### new createError\[code || name\](\[msg]\)) - -```js -var err = new createError.NotFound(); -``` - -- `code` - the status code as a number -- `name` - the name of the error as a "bumpy case", i.e. `NotFound` or `InternalServerError`. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/http-errors.svg?style=flat -[npm-url]: https://npmjs.org/package/http-errors -[node-version-image]: https://img.shields.io/node/v/http-errors.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/http-errors.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/http-errors -[coveralls-image]: https://img.shields.io/coveralls/jshttp/http-errors.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/http-errors -[downloads-image]: https://img.shields.io/npm/dm/http-errors.svg?style=flat -[downloads-url]: https://npmjs.org/package/http-errors diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/index.js deleted file mode 100644 index d84b114..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/index.js +++ /dev/null @@ -1,120 +0,0 @@ - -var statuses = require('statuses'); -var inherits = require('inherits'); - -function toIdentifier(str) { - return str.split(' ').map(function (token) { - return token.slice(0, 1).toUpperCase() + token.slice(1) - }).join('').replace(/[^ _0-9a-z]/gi, '') -} - -exports = module.exports = function httpError() { - // so much arity going on ~_~ - var err; - var msg; - var status = 500; - var props = {}; - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - if (arg instanceof Error) { - err = arg; - status = err.status || err.statusCode || status; - continue; - } - switch (typeof arg) { - case 'string': - msg = arg; - break; - case 'number': - status = arg; - break; - case 'object': - props = arg; - break; - } - } - - if (typeof status !== 'number' || !statuses[status]) { - status = 500 - } - - // constructor - var HttpError = exports[status] - - if (!err) { - // create error - err = HttpError - ? new HttpError(msg) - : new Error(msg || statuses[status]) - Error.captureStackTrace(err, httpError) - } - - if (!HttpError || !(err instanceof HttpError)) { - // add properties to generic error - err.expose = status < 500 - err.status = err.statusCode = status - } - - for (var key in props) { - if (key !== 'status' && key !== 'statusCode') { - err[key] = props[key] - } - } - - return err; -}; - -// create generic error objects -var codes = statuses.codes.filter(function (num) { - return num >= 400; -}); - -codes.forEach(function (code) { - var name = toIdentifier(statuses[code]) - var className = name.match(/Error$/) ? name : name + 'Error' - - if (code >= 500) { - var ServerError = function ServerError(msg) { - var self = new Error(msg != null ? msg : statuses[code]) - Error.captureStackTrace(self, ServerError) - self.__proto__ = ServerError.prototype - Object.defineProperty(self, 'name', { - enumerable: false, - configurable: true, - value: className, - writable: true - }) - return self - } - inherits(ServerError, Error); - ServerError.prototype.status = - ServerError.prototype.statusCode = code; - ServerError.prototype.expose = false; - exports[code] = - exports[name] = ServerError - return; - } - - var ClientError = function ClientError(msg) { - var self = new Error(msg != null ? msg : statuses[code]) - Error.captureStackTrace(self, ClientError) - self.__proto__ = ClientError.prototype - Object.defineProperty(self, 'name', { - enumerable: false, - configurable: true, - value: className, - writable: true - }) - return self - } - inherits(ClientError, Error); - ClientError.prototype.status = - ClientError.prototype.statusCode = code; - ClientError.prototype.expose = true; - exports[code] = - exports[name] = ClientError - return; -}); - -// backwards-compatibility -exports["I'mateapot"] = exports.ImATeapot diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/LICENSE deleted file mode 100644 index dea3013..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/README.md deleted file mode 100644 index b1c5665..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/README.md +++ /dev/null @@ -1,42 +0,0 @@ -Browser-friendly inheritance fully compatible with standard node.js -[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). - -This package exports standard `inherits` from node.js `util` module in -node environment, but also provides alternative browser-friendly -implementation through [browser -field](https://gist.github.com/shtylman/4339901). Alternative -implementation is a literal copy of standard one located in standalone -module to avoid requiring of `util`. It also has a shim for old -browsers with no `Object.create` support. - -While keeping you sure you are using standard `inherits` -implementation in node.js environment, it allows bundlers such as -[browserify](https://github.com/substack/node-browserify) to not -include full `util` package to your client code if all you need is -just `inherits` function. It worth, because browser shim for `util` -package is large and `inherits` is often the single function you need -from it. - -It's recommended to use this package instead of -`require('util').inherits` for any code that has chances to be used -not only in node.js but in browser too. - -## usage - -```js -var inherits = require('inherits'); -// then use exactly as the standard one -``` - -## note on version ~1.0 - -Version ~1.0 had completely different motivation and is not compatible -neither with 2.0 nor with standard node.js `inherits`. - -If you are using version ~1.0 and planning to switch to ~2.0, be -careful: - -* new version uses `super_` instead of `super` for referencing - superclass -* new version overwrites current prototype while old one preserves any - existing fields on it diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits.js deleted file mode 100644 index 29f5e24..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('util').inherits diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits_browser.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits_browser.js deleted file mode 100644 index c1e78a7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits_browser.js +++ /dev/null @@ -1,23 +0,0 @@ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/package.json deleted file mode 100644 index 005588b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "inherits", - "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", - "version": "2.0.1", - "keywords": [ - "inheritance", - "class", - "klass", - "oop", - "object-oriented", - "inherits", - "browser", - "browserify" - ], - "main": "./inherits.js", - "browser": "./inherits_browser.js", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/inherits" - }, - "license": "ISC", - "scripts": { - "test": "node test" - }, - "bugs": { - "url": "https://github.com/isaacs/inherits/issues" - }, - "_id": "inherits@2.0.1", - "dist": { - "shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", - "tarball": "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "_from": "inherits@>=2.0.1 <2.1.0", - "_npmVersion": "1.3.8", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "directories": {}, - "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", - "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/isaacs/inherits" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/test.js deleted file mode 100644 index fc53012..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/test.js +++ /dev/null @@ -1,25 +0,0 @@ -var inherits = require('./inherits.js') -var assert = require('assert') - -function test(c) { - assert(c.constructor === Child) - assert(c.constructor.super_ === Parent) - assert(Object.getPrototypeOf(c) === Child.prototype) - assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) - assert(c instanceof Child) - assert(c instanceof Parent) -} - -function Child() { - Parent.call(this) - test(this) -} - -function Parent() {} - -inherits(Child, Parent) - -var c = new Child -test(c) - -console.log('ok') diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/package.json deleted file mode 100644 index 43b1c1d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/http-errors/package.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "http-errors", - "description": "Create HTTP error objects", - "version": "1.3.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Alan Plum", - "email": "me@pluma.io" - }, - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jshttp/http-errors" - }, - "dependencies": { - "inherits": "~2.0.1", - "statuses": "1" - }, - "devDependencies": { - "istanbul": "0", - "mocha": "1" - }, - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" - }, - "keywords": [ - "http", - "error" - ], - "files": [ - "index.js", - "HISTORY.md", - "LICENSE", - "README.md" - ], - "gitHead": "89a8502b40d5dd42da2908f265275e2eeb8d0699", - "bugs": { - "url": "https://github.com/jshttp/http-errors/issues" - }, - "homepage": "https://github.com/jshttp/http-errors", - "_id": "http-errors@1.3.1", - "_shasum": "197e22cdebd4198585e8694ef6786197b91ed942", - "_from": "http-errors@>=1.3.1 <1.4.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "egeste", - "email": "npm@egeste.net" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "197e22cdebd4198585e8694ef6786197b91ed942", - "tarball": "http://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/.npmignore deleted file mode 100644 index e69de29..0000000 diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/README.md deleted file mode 100644 index 506fbe5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# mime - -Comprehensive MIME type mapping API based on mime-db module. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## Contributing / Testing - - npm run test - -## Command Line - - mime [path_string] - -E.g. - - > mime scripts/jquery.js - application/javascript - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - -```js -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.default_type -Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) - -### mime.extension(type) -Get the default extension for `type` - -```js -mime.extension('text/html'); // => 'html' -mime.extension('application/octet-stream'); // => 'bin' -``` - -### mime.charsets.lookup() - -Map mime-type to charset - -```js -mime.charsets.lookup('text/plain'); // => 'UTF-8' -``` - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -Custom type mappings can be added on a per-project basis via the following APIs. - -### mime.define() - -Add custom mime/extension mappings - -```js -mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... -}); - -mime.lookup('x-sft'); // => 'text/x-some-format' -``` - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - -```js -mime.extension('text/x-some-format'); // => 'x-sf' -``` - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - -```js -mime.load('./my_project.types'); -``` -The .types file format is simple - See the `types` dir for examples. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/build/build.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/build/build.js deleted file mode 100644 index ed5313e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/build/build.js +++ /dev/null @@ -1,11 +0,0 @@ -var db = require('mime-db'); - -var mapByType = {}; -Object.keys(db).forEach(function(key) { - var extensions = db[key].extensions; - if (extensions) { - mapByType[key] = extensions; - } -}); - -console.log(JSON.stringify(mapByType)); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/build/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/build/test.js deleted file mode 100644 index 58b9ba7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/build/test.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('../mime'); -var assert = require('assert'); -var path = require('path'); - -// -// Test mime lookups -// - -assert.equal('text/plain', mime.lookup('text.txt')); // normal file -assert.equal('text/plain', mime.lookup('TEXT.TXT')); // uppercase -assert.equal('text/plain', mime.lookup('dir/text.txt')); // dir + file -assert.equal('text/plain', mime.lookup('.text.txt')); // hidden file -assert.equal('text/plain', mime.lookup('.txt')); // nameless -assert.equal('text/plain', mime.lookup('txt')); // extension-only -assert.equal('text/plain', mime.lookup('/txt')); // extension-less () -assert.equal('text/plain', mime.lookup('\\txt')); // Windows, extension-less -assert.equal('application/octet-stream', mime.lookup('text.nope')); // unrecognized -assert.equal('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default - -// -// Test extensions -// - -assert.equal('txt', mime.extension(mime.types.text)); -assert.equal('html', mime.extension(mime.types.htm)); -assert.equal('bin', mime.extension('application/octet-stream')); -assert.equal('bin', mime.extension('application/octet-stream ')); -assert.equal('html', mime.extension(' text/html; charset=UTF-8')); -assert.equal('html', mime.extension('text/html; charset=UTF-8 ')); -assert.equal('html', mime.extension('text/html; charset=UTF-8')); -assert.equal('html', mime.extension('text/html ; charset=UTF-8')); -assert.equal('html', mime.extension('text/html;charset=UTF-8')); -assert.equal('html', mime.extension('text/Html;charset=UTF-8')); -assert.equal(undefined, mime.extension('unrecognized')); - -// -// Test node.types lookups -// - -assert.equal('application/font-woff', mime.lookup('file.woff')); -assert.equal('application/octet-stream', mime.lookup('file.buffer')); -assert.equal('audio/mp4', mime.lookup('file.m4a')); -assert.equal('font/opentype', mime.lookup('file.otf')); - -// -// Test charsets -// - -assert.equal('UTF-8', mime.charsets.lookup('text/plain')); -assert.equal(undefined, mime.charsets.lookup(mime.types.js)); -assert.equal('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -console.log('\nAll tests passed'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/cli.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/cli.js deleted file mode 100755 index 20b1ffe..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/cli.js +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env node - -var mime = require('./mime.js'); -var file = process.argv[2]; -var type = mime.lookup(file); - -process.stdout.write(type + '\n'); - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/mime.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/mime.js deleted file mode 100644 index 341b6a5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/mime.js +++ /dev/null @@ -1,108 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - for (var i = 0; i < exts.length; i++) { - if (process.env.DEBUG_MIME && this.types[exts]) { - console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + - this.types[exts] + ' to ' + type); - } - - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - this._loading = file; - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); - - this._loading = null; -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); - return this.extensions[type]; -}; - -// Default instance -var mime = new Mime(); - -// Define built-in types -mime.define(require('./types.json')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -}; - -module.exports = mime; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/package.json deleted file mode 100644 index 721460b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "scripts": { - "prepublish": "node build/build.js > types.json", - "test": "node build/test.js" - }, - "bin": { - "mime": "cli.js" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "description": "A comprehensive library for mime-type mapping", - "licenses": [ - { - "type": "MIT", - "url": "https://raw.github.com/broofa/node-mime/master/LICENSE" - } - ], - "dependencies": {}, - "devDependencies": { - "mime-db": "^1.2.0" - }, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.3.4", - "gitHead": "1628f6e0187095009dcef4805c3a49706f137974", - "bugs": { - "url": "https://github.com/broofa/node-mime/issues" - }, - "homepage": "https://github.com/broofa/node-mime", - "_id": "mime@1.3.4", - "_shasum": "115f9e3b6b3daf2959983cb38f149a2d40eb5d53", - "_from": "mime@1.3.4", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "broofa", - "email": "robert@broofa.com" - }, - "maintainers": [ - { - "name": "broofa", - "email": "robert@broofa.com" - }, - { - "name": "bentomas", - "email": "benjamin@benjaminthomas.org" - } - ], - "dist": { - "shasum": "115f9e3b6b3daf2959983cb38f149a2d40eb5d53", - "tarball": "http://registry.npmjs.org/mime/-/mime-1.3.4.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/types.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/types.json deleted file mode 100644 index c674b1c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/mime/types.json +++ /dev/null @@ -1 +0,0 @@ -{"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomsvc+xml":["atomsvc"],"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/cu-seeme":["cu"],"application/dash+xml":["mdp"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/font-tdpfr":["pfr"],"application/font-woff":["woff"],"application/font-woff2":["woff2"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/java-archive":["jar"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"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/postscript":["ai","eps","ps"],"application/prs.cww":["cww"],"application/pskc+xml":["pskcxml"],"application/rdf+xml":["rdf"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"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-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"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.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.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"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.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.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"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.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"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.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"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.gmx":["gmx"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"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.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.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.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"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.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.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.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"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.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"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-officetheme":["thmx"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["stl"],"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-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.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.data":["ngdat"],"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.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.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"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.teacher":["teacher"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.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.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"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.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"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.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/voicexml+xml":["vxml"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["dmg"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-otf":["otf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-ttf":["ttf","ttc"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["iso"],"application/x-java-jnlp-file":["jnlp"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdownload":["exe","dll","com","bat","msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["wmf","wmz","emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-nzb":["nzb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["rar"],"application/x-research-info-systems":["ris"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["obj"],"application/x-ustar":["ustar"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt"],"application/x-xfig":["fig"],"application/x-xliff+xml":["xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"application/xaml+xml":["xaml"],"application/xcap-diff+xml":["xdf"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xml":["xml","xsl","xsd"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/adpcm":["adp"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mp4":["mp4a","m4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/webm":["weba"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-wav":["wav"],"audio/xm":["xm"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"font/opentype":["otf"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/g3fax":["g3"],"image/gif":["gif"],"image/ief":["ief"],"image/jpeg":["jpeg","jpg","jpe"],"image/ktx":["ktx"],"image/png":["png"],"image/prs.btif":["btif"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/tiff":["tiff","tif"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["sub"],"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.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/webp":["webp"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["ico"],"image/x-mrsid-image":["sid"],"image/x-pcx":["pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/rfc822":["eml","mime"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.vtu":["vtu"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["x3db","x3dbz"],"model/x3d+vrml":["x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee"],"text/css":["css"],"text/csv":["csv"],"text/hjson":["hjson"],"text/html":["html","htm"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/prs.lines.tag":["dsc"],"text/richtext":["rtx"],"text/sgml":["sgml","sgm"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"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.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/vtt":["vtt"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["markdown","md","mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-pascal":["p","pas"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/jpeg":["jpgv"],"video/jpm":["jpm","jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/webm":["webm"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/History.md deleted file mode 100644 index 32fdfc1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/History.md +++ /dev/null @@ -1,66 +0,0 @@ - -0.7.1 / 2015-04-20 -================== - - * prevent extraordinary long inputs (@evilpacket) - * Fixed broken readme link - -0.7.0 / 2014-11-24 -================== - - * add time abbreviations, updated tests and readme for the new units - * fix example in the readme. - * add LICENSE file - -0.6.2 / 2013-12-05 -================== - - * Adding repository section to package.json to suppress warning from NPM. - -0.6.1 / 2013-05-10 -================== - - * fix singularization [visionmedia] - -0.6.0 / 2013-03-15 -================== - - * fix minutes - -0.5.1 / 2013-02-24 -================== - - * add component namespace - -0.5.0 / 2012-11-09 -================== - - * add short formatting as default and .long option - * add .license property to component.json - * add version to component.json - -0.4.0 / 2012-10-22 -================== - - * add rounding to fix crazy decimals - -0.3.0 / 2012-09-07 -================== - - * fix `ms()` [visionmedia] - -0.2.0 / 2012-09-03 -================== - - * add component.json [visionmedia] - * add days support [visionmedia] - * add hours support [visionmedia] - * add minutes support [visionmedia] - * add seconds support [visionmedia] - * add ms string support [visionmedia] - * refactor tests to facilitate ms(number) [visionmedia] - -0.1.0 / 2012-03-07 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/LICENSE deleted file mode 100644 index 6c07561..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Guillermo Rauch - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/README.md deleted file mode 100644 index 9b4fd03..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('2 days') // 172800000 -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2.5 hrs') // 9000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours'), { long: true }) // "10 hours" -``` - -- Node/Browser compatible. Published as [`ms`](https://www.npmjs.org/package/ms) in [NPM](http://nodejs.org/download). -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/index.js deleted file mode 100644 index 4f92771..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/index.js +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = '' + str; - if (str.length > 10000) return; - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/package.json deleted file mode 100644 index 253335e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/ms/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "ms", - "version": "0.7.1", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "gitHead": "713dcf26d9e6fd9dbc95affe7eff9783b7f1b909", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "homepage": "https://github.com/guille/ms.js", - "_id": "ms@0.7.1", - "scripts": {}, - "_shasum": "9cd13c03adbff25b65effde7ce864ee952017098", - "_from": "ms@0.7.1", - "_npmVersion": "2.7.5", - "_nodeVersion": "0.12.2", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "dist": { - "shasum": "9cd13c03adbff25b65effde7ce864ee952017098", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/README.md deleted file mode 100644 index f6ae24c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/README.md +++ /dev/null @@ -1,114 +0,0 @@ -# Statuses - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -HTTP status utility for node. - -## API - -```js -var status = require('statuses'); -``` - -### var code = status(Integer || String) - -If `Integer` or `String` is a valid HTTP code or status message, then the appropriate `code` will be returned. Otherwise, an error will be thrown. - -```js -status(403) // => 'Forbidden' -status('403') // => 'Forbidden' -status('forbidden') // => 403 -status('Forbidden') // => 403 -status(306) // throws, as it's not supported by node.js -``` - -### status.codes - -Returns an array of all the status codes as `Integer`s. - -### var msg = status[code] - -Map of `code` to `status message`. `undefined` for invalid `code`s. - -```js -status[404] // => 'Not Found' -``` - -### var code = status[msg] - -Map of `status message` to `code`. `msg` can either be title-cased or lower-cased. `undefined` for invalid `status message`s. - -```js -status['not found'] // => 404 -status['Not Found'] // => 404 -``` - -### status.redirect[code] - -Returns `true` if a status code is a valid redirect status. - -```js -status.redirect[200] // => undefined -status.redirect[301] // => true -``` - -### status.empty[code] - -Returns `true` if a status code expects an empty body. - -```js -status.empty[200] // => undefined -status.empty[204] // => true -status.empty[304] // => true -``` - -### status.retry[code] - -Returns `true` if you should retry the rest. - -```js -status.retry[501] // => undefined -status.retry[503] // => true -``` - -### statuses/codes.json - -```js -var codes = require('statuses/codes.json'); -``` - -This is a JSON file of the status codes -taken from `require('http').STATUS_CODES`. -This is saved so that codes are consistent even in older node.js versions. -For example, `308` will be added in v0.12. - -## Adding Status Codes - -The status codes are primarily sourced from http://www.iana.org/assignments/http-status-codes/http-status-codes-1.csv. -Additionally, custom codes are added from http://en.wikipedia.org/wiki/List_of_HTTP_status_codes. -These are added manually in the `lib/*.json` files. -If you would like to add a status code, add it to the appropriate JSON file. - -To rebuild `codes.json`, run the following: - -```bash -# update src/iana.json -npm run update -# build codes.json -npm run build -``` - -[npm-image]: https://img.shields.io/npm/v/statuses.svg?style=flat -[npm-url]: https://npmjs.org/package/statuses -[node-version-image]: http://img.shields.io/badge/node.js-%3E%3D_0.6-brightgreen.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/statuses.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/statuses -[coveralls-image]: https://img.shields.io/coveralls/jshttp/statuses.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/statuses?branch=master -[downloads-image]: http://img.shields.io/npm/dm/statuses.svg?style=flat -[downloads-url]: https://npmjs.org/package/statuses diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/codes.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/codes.json deleted file mode 100644 index 4c45a88..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/codes.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "100": "Continue", - "101": "Switching Protocols", - "102": "Processing", - "200": "OK", - "201": "Created", - "202": "Accepted", - "203": "Non-Authoritative Information", - "204": "No Content", - "205": "Reset Content", - "206": "Partial Content", - "207": "Multi-Status", - "208": "Already Reported", - "226": "IM Used", - "300": "Multiple Choices", - "301": "Moved Permanently", - "302": "Found", - "303": "See Other", - "304": "Not Modified", - "305": "Use Proxy", - "306": "(Unused)", - "307": "Temporary Redirect", - "308": "Permanent Redirect", - "400": "Bad Request", - "401": "Unauthorized", - "402": "Payment Required", - "403": "Forbidden", - "404": "Not Found", - "405": "Method Not Allowed", - "406": "Not Acceptable", - "407": "Proxy Authentication Required", - "408": "Request Timeout", - "409": "Conflict", - "410": "Gone", - "411": "Length Required", - "412": "Precondition Failed", - "413": "Payload Too Large", - "414": "URI Too Long", - "415": "Unsupported Media Type", - "416": "Range Not Satisfiable", - "417": "Expectation Failed", - "418": "I'm a teapot", - "422": "Unprocessable Entity", - "423": "Locked", - "424": "Failed Dependency", - "425": "Unordered Collection", - "426": "Upgrade Required", - "428": "Precondition Required", - "429": "Too Many Requests", - "431": "Request Header Fields Too Large", - "451": "Unavailable For Legal Reasons", - "500": "Internal Server Error", - "501": "Not Implemented", - "502": "Bad Gateway", - "503": "Service Unavailable", - "504": "Gateway Timeout", - "505": "HTTP Version Not Supported", - "506": "Variant Also Negotiates", - "507": "Insufficient Storage", - "508": "Loop Detected", - "509": "Bandwidth Limit Exceeded", - "510": "Not Extended", - "511": "Network Authentication Required" -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/index.js deleted file mode 100644 index b06182d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/index.js +++ /dev/null @@ -1,60 +0,0 @@ - -var codes = require('./codes.json'); - -module.exports = status; - -// [Integer...] -status.codes = Object.keys(codes).map(function (code) { - code = ~~code; - var msg = codes[code]; - status[code] = msg; - status[msg] = status[msg.toLowerCase()] = code; - return code; -}); - -// status codes for redirects -status.redirect = { - 300: true, - 301: true, - 302: true, - 303: true, - 305: true, - 307: true, - 308: true, -}; - -// status codes for empty bodies -status.empty = { - 204: true, - 205: true, - 304: true, -}; - -// status codes for when you should retry the request -status.retry = { - 502: true, - 503: true, - 504: true, -}; - -function status(code) { - if (typeof code === 'number') { - if (!status[code]) throw new Error('invalid status code: ' + code); - return code; - } - - if (typeof code !== 'string') { - throw new TypeError('code must be a number or string'); - } - - // '403' - var n = parseInt(code, 10) - if (!isNaN(n)) { - if (!status[n]) throw new Error('invalid status code: ' + n); - return n; - } - - n = status[code.toLowerCase()]; - if (!n) throw new Error('invalid status message: "' + code + '"'); - return n; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/package.json deleted file mode 100644 index affbc79..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/node_modules/statuses/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "statuses", - "description": "HTTP status utility", - "version": "1.2.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "repository": { - "type": "git", - "url": "https://github.com/jshttp/statuses" - }, - "license": "MIT", - "keywords": [ - "http", - "status", - "code" - ], - "files": [ - "index.js", - "codes.json", - "LICENSE" - ], - "devDependencies": { - "csv-parse": "0.0.6", - "istanbul": "0", - "mocha": "1", - "stream-to-array": "2" - }, - "scripts": { - "build": "node scripts/build.js", - "update": "node scripts/update.js", - "test": "mocha --reporter spec --bail --check-leaks", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks" - }, - "gitHead": "49e6ac7ae4c63ee8186f56cb52112a7eeda28ed7", - "bugs": { - "url": "https://github.com/jshttp/statuses/issues" - }, - "homepage": "https://github.com/jshttp/statuses", - "_id": "statuses@1.2.1", - "_shasum": "dded45cc18256d51ed40aec142489d5c61026d28", - "_from": "statuses@>=1.2.1 <1.3.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "dded45cc18256d51ed40aec142489d5c61026d28", - "tarball": "http://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/package.json deleted file mode 100644 index 8b50da2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/send/package.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "send", - "description": "Better streaming static file server with Range and conditional-GET support", - "version": "0.13.0", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/pillarjs/send" - }, - "keywords": [ - "static", - "file", - "server" - ], - "dependencies": { - "debug": "~2.2.0", - "depd": "~1.0.1", - "destroy": "1.0.3", - "escape-html": "1.0.2", - "etag": "~1.7.0", - "fresh": "0.3.0", - "http-errors": "~1.3.1", - "mime": "1.3.4", - "ms": "0.7.1", - "on-finished": "~2.3.0", - "range-parser": "~1.0.2", - "statuses": "~1.2.1" - }, - "devDependencies": { - "after": "0.8.1", - "istanbul": "0.3.9", - "mocha": "2.2.5", - "supertest": "1.0.1" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --check-leaks --reporter spec --bail", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot" - }, - "gitHead": "80cfa7f54ce87c75e92619d5bc510406bd69133a", - "bugs": { - "url": "https://github.com/pillarjs/send/issues" - }, - "homepage": "https://github.com/pillarjs/send", - "_id": "send@0.13.0", - "_shasum": "518f921aeb0560aec7dcab2990b14cf6f3cce5de", - "_from": "send@0.13.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "518f921aeb0560aec7dcab2990b14cf6f3cce5de", - "tarball": "http://registry.npmjs.org/send/-/send-0.13.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/send/-/send-0.13.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/HISTORY.md deleted file mode 100644 index 744b6f1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/HISTORY.md +++ /dev/null @@ -1,284 +0,0 @@ -1.10.0 / 2015-06-17 -=================== - - * Add `fallthrough` option - - Allows declaring this middleware is the final destination - - Provides better integration with Express patterns - * Fix reading options from options prototype - * Improve the default redirect response headers - * deps: escape-html@1.0.2 - * deps: send@0.13.0 - - Allow Node.js HTTP server to set `Date` response header - - Fix incorrectly removing `Content-Location` on 304 response - - Improve the default redirect response headers - - Send appropriate headers on default error response - - Use `http-errors` for standard emitted errors - - Use `statuses` instead of `http` module for status messages - - deps: escape-html@1.0.2 - - deps: etag@~1.7.0 - - deps: fresh@0.3.0 - - deps: on-finished@~2.3.0 - - perf: enable strict mode - - perf: remove unnecessary array allocations - * perf: enable strict mode - * perf: remove argument reassignment - -1.9.3 / 2015-05-14 -================== - - * deps: send@0.12.3 - - deps: debug@~2.2.0 - - deps: depd@~1.0.1 - - deps: etag@~1.6.0 - - deps: ms@0.7.1 - - deps: on-finished@~2.2.1 - -1.9.2 / 2015-03-14 -================== - - * deps: send@0.12.2 - - Throw errors early for invalid `extensions` or `index` options - - deps: debug@~2.1.3 - -1.9.1 / 2015-02-17 -================== - - * deps: send@0.12.1 - - Fix regression sending zero-length files - -1.9.0 / 2015-02-16 -================== - - * deps: send@0.12.0 - - Always read the stat size from the file - - Fix mutating passed-in `options` - - deps: mime@1.3.4 - -1.8.1 / 2015-01-20 -================== - - * Fix redirect loop in Node.js 0.11.14 - * deps: send@0.11.1 - - Fix root path disclosure - -1.8.0 / 2015-01-05 -================== - - * deps: send@0.11.0 - - deps: debug@~2.1.1 - - deps: etag@~1.5.1 - - deps: ms@0.7.0 - - deps: on-finished@~2.2.0 - -1.7.2 / 2015-01-02 -================== - - * Fix potential open redirect when mounted at root - -1.7.1 / 2014-10-22 -================== - - * deps: send@0.10.1 - - deps: on-finished@~2.1.1 - -1.7.0 / 2014-10-15 -================== - - * deps: send@0.10.0 - - deps: debug@~2.1.0 - - deps: depd@~1.0.0 - - deps: etag@~1.5.0 - -1.6.5 / 2015-02-04 -================== - - * Fix potential open redirect when mounted at root - - Back-ported from v1.7.2 - -1.6.4 / 2014-10-08 -================== - - * Fix redirect loop when index file serving disabled - -1.6.3 / 2014-09-24 -================== - - * deps: send@0.9.3 - - deps: etag@~1.4.0 - -1.6.2 / 2014-09-15 -================== - - * deps: send@0.9.2 - - deps: depd@0.4.5 - - deps: etag@~1.3.1 - - deps: range-parser@~1.0.2 - -1.6.1 / 2014-09-07 -================== - - * deps: send@0.9.1 - - deps: fresh@0.2.4 - -1.6.0 / 2014-09-07 -================== - - * deps: send@0.9.0 - - Add `lastModified` option - - Use `etag` to generate `ETag` header - - deps: debug@~2.0.0 - -1.5.4 / 2014-09-04 -================== - - * deps: send@0.8.5 - - Fix a path traversal issue when using `root` - - Fix malicious path detection for empty string path - -1.5.3 / 2014-08-17 -================== - - * deps: send@0.8.3 - -1.5.2 / 2014-08-14 -================== - - * deps: send@0.8.2 - - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` - -1.5.1 / 2014-08-09 -================== - - * Fix parsing of weird `req.originalUrl` values - * deps: parseurl@~1.3.0 - * deps: utils-merge@1.0.0 - -1.5.0 / 2014-08-05 -================== - - * deps: send@0.8.1 - - Add `extensions` option - -1.4.4 / 2014-08-04 -================== - - * deps: send@0.7.4 - - Fix serving index files without root dir - -1.4.3 / 2014-07-29 -================== - - * deps: send@0.7.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - -1.4.2 / 2014-07-27 -================== - - * deps: send@0.7.2 - - deps: depd@0.4.4 - -1.4.1 / 2014-07-26 -================== - - * deps: send@0.7.1 - - deps: depd@0.4.3 - -1.4.0 / 2014-07-21 -================== - - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -1.3.2 / 2014-07-11 -================== - - * deps: send@0.6.0 - - Cap `maxAge` value to 1 year - - deps: debug@1.0.3 - -1.3.1 / 2014-07-09 -================== - - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -1.3.0 / 2014-06-28 -================== - - * Add `setHeaders` option - * Include HTML link in redirect response - * deps: send@0.5.0 - - Accept string for `maxAge` (converted by `ms`) - -1.2.3 / 2014-06-11 -================== - - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -1.2.2 / 2014-06-09 -================== - - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - -1.2.1 / 2014-06-02 -================== - - * use `escape-html` for escaping - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -1.2.0 / 2014-05-29 -================== - - * deps: send@0.4.0 - - Calculate ETag with md5 for reduced collisions - - Fix wrong behavior when index file matches directory - - Ignore stream errors after request ends - - Skip directories in index file search - - deps: debug@0.8.1 - -1.1.0 / 2014-04-24 -================== - - * Accept options directly to `send` module - * deps: send@0.3.0 - -1.0.4 / 2014-04-07 -================== - - * Resolve relative paths at middleware setup - * Use parseurl to parse the URL from request - -1.0.3 / 2014-03-20 -================== - - * Do not rely on connect-like environments - -1.0.2 / 2014-03-06 -================== - - * deps: send@0.2.0 - -1.0.1 / 2014-03-05 -================== - - * Add mime export for back-compat - -1.0.0 / 2014-03-05 -================== - - * Genesis from `connect` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/LICENSE deleted file mode 100644 index d8cce67..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -(The MIT License) - -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 LearnBoost -Copyright (c) 2011 TJ Holowaychuk -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/README.md deleted file mode 100644 index 1a7b054..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/README.md +++ /dev/null @@ -1,235 +0,0 @@ -# serve-static - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Linux Build][travis-image]][travis-url] -[![Windows Build][appveyor-image]][appveyor-url] -[![Test Coverage][coveralls-image]][coveralls-url] -[![Gratipay][gratipay-image]][gratipay-url] - -## Install - -```sh -$ npm install serve-static -``` - -## API - -```js -var serveStatic = require('serve-static') -``` - -### serveStatic(root, options) - -Create a new middleware function to serve files from within a given root -directory. The file to serve will be determined by combining `req.url` -with the provided root directory. When a file is not found, instead of -sending a 404 response, this module will instead call `next()` to move on -to the next middleware, allowing for stacking and fall-backs. - -#### Options - -##### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file -or directory that begins with a dot ("."). Note this check is done on -the path itself without checking if the path actually exists on the -disk. If `root` is specified, only the dotfiles above the root are -checked (i.e. the root itself can be within a dotfile when set -to "deny"). - -The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Deny a request for a dotfile and 403/`next()`. - - `'ignore'` Pretend like the dotfile does not exist and 404/`next()`. - -##### etag - -Enable or disable etag generation, defaults to true. - -##### extensions - -Set file extension fallbacks. When set, if a file is not found, the given -extensions will be added to the file name and search for. The first that -exists will be served. Example: `['html', 'htm']`. - -The default value is `false`. - -##### fallthrough - -Set the middleware to have client errors fall-through as just unhandled -requests, otherwise forward a client error. The difference is that client -errors like a bad request or a request to a non-existent file will cause -this middleware to simply `next()` to your next middleware when this value -is `true`. When this value is `false`, these errors (even 404s), will invoke -`next(err)`. - -Typically `true` is desired such that multiple physical directories can be -mapped to the same web address or for routes to fill in non-existent files. - -The value `false` can be used if this middleware is mounted at a path that -is designed to be strictly a single file system directory, which allows for -short-circuiting 404s for less overhead. This middleware will also reply to -all methods. - -The default value is `true`. - -##### index - -By default this module will send "index.html" files in response to a request -on a directory. To disable this set `false` or to supply a new index pass a -string or an array in preferred order. - -##### lastModified - -Enable or disable `Last-Modified` header, defaults to true. Uses the file -system's last modified value. - -##### maxAge - -Provide a max-age in milliseconds for http caching, defaults to 0. This -can also be a string accepted by the [ms](https://www.npmjs.org/package/ms#readme) -module. - -##### redirect - -Redirect to trailing "/" when the pathname is a dir. Defaults to `true`. - -##### setHeaders - -Function to set custom headers on response. Alterations to the headers need to -occur synchronously. The function is called as `fn(res, path, stat)`, where -the arguments are: - - - `res` the response object - - `path` the file path that is being sent - - `stat` the stat object of the file that is being sent - -## Examples - -### Serve files with vanilla node.js http server - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -// Serve up public/ftp folder -var serve = serveStatic('public/ftp', {'index': ['index.html', 'index.htm']}) - -// Create server -var server = http.createServer(function(req, res){ - var done = finalhandler(req, res) - serve(req, res, done) -}) - -// Listen -server.listen(3000) -``` - -### Serve all files as downloads - -```js -var contentDisposition = require('content-disposition') -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -// Serve up public/ftp folder -var serve = serveStatic('public/ftp', { - 'index': false, - 'setHeaders': setHeaders -}) - -// Set header to force download -function setHeaders(res, path) { - res.setHeader('Content-Disposition', contentDisposition(path)) -} - -// Create server -var server = http.createServer(function(req, res){ - var done = finalhandler(req, res) - serve(req, res, done) -}) - -// Listen -server.listen(3000) -``` - -### Serving using express - -#### Simple - -This is a simple example of using Express. - -```js -var express = require('express') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic('public/ftp', {'index': ['default.html', 'default.htm']})) -app.listen(3000) -``` - -#### Multiple roots - -This example shows a simple way to search through multiple directories. -Files are look for in `public-optimized/` first, then `public/` second as -a fallback. - -```js -var express = require('express') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic(__dirname + '/public-optimized')) -app.use(serveStatic(__dirname + '/public')) -app.listen(3000) -``` - -#### Different settings for paths - -This example shows how to set a different max age depending on the served -file type. In this example, HTML files are not cached, while everything else -is for 1 day. - -```js -var express = require('express') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic(__dirname + '/public', { - maxAge: '1d', - setHeaders: setCustomCacheControl -})) - -app.listen(3000) - -function setCustomCacheControl(res, path) { - if (serveStatic.mime.lookup(path) === 'text/html') { - // Custom Cache-Control for HTML files - res.setHeader('Cache-Control', 'public, max-age=0') - } -} -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/serve-static.svg -[npm-url]: https://npmjs.org/package/serve-static -[travis-image]: https://img.shields.io/travis/expressjs/serve-static/master.svg?label=linux -[travis-url]: https://travis-ci.org/expressjs/serve-static -[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/serve-static/master.svg?label=windows -[appveyor-url]: https://ci.appveyor.com/project/dougwilson/serve-static -[coveralls-image]: https://img.shields.io/coveralls/expressjs/serve-static/master.svg -[coveralls-url]: https://coveralls.io/r/expressjs/serve-static -[downloads-image]: https://img.shields.io/npm/dm/serve-static.svg -[downloads-url]: https://npmjs.org/package/serve-static -[gratipay-image]: https://img.shields.io/gratipay/dougwilson.svg -[gratipay-url]: https://gratipay.com/dougwilson/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/index.js deleted file mode 100644 index 0a9f494..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/index.js +++ /dev/null @@ -1,187 +0,0 @@ -/*! - * serve-static - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var escapeHtml = require('escape-html') -var parseUrl = require('parseurl') -var resolve = require('path').resolve -var send = require('send') -var url = require('url') - -/** - * Module exports. - * @public - */ - -module.exports = serveStatic -module.exports.mime = send.mime - -/** - * @param {string} root - * @param {object} [options] - * @return {function} - * @public - */ - -function serveStatic(root, options) { - if (!root) { - throw new TypeError('root path required') - } - - if (typeof root !== 'string') { - throw new TypeError('root path must be a string') - } - - // copy options object - var opts = Object.create(options || null) - - // fall-though - var fallthrough = opts.fallthrough !== false - - // default redirect - var redirect = opts.redirect !== false - - // headers listener - var setHeaders = opts.setHeaders - - if (setHeaders && typeof setHeaders !== 'function') { - throw new TypeError('option setHeaders must be function') - } - - // setup options for send - opts.maxage = opts.maxage || opts.maxAge || 0 - opts.root = resolve(root) - - // construct directory listener - var onDirectory = redirect - ? createRedirectDirectoryListener() - : createNotFoundDirectoryListener() - - return function serveStatic(req, res, next) { - if (req.method !== 'GET' && req.method !== 'HEAD') { - if (fallthrough) { - return next() - } - - // method not allowed - res.statusCode = 405 - res.setHeader('Allow', 'GET, HEAD') - res.setHeader('Content-Length', '0') - res.end() - return - } - - var forwardError = !fallthrough - var originalUrl = parseUrl.original(req) - var path = parseUrl(req).pathname - - // make sure redirect occurs at mount - if (path === '/' && originalUrl.pathname.substr(-1) !== '/') { - path = '' - } - - // create send stream - var stream = send(req, path, opts) - - // add directory handler - stream.on('directory', onDirectory) - - // add headers listener - if (setHeaders) { - stream.on('headers', setHeaders) - } - - // add file listener for fallthrough - if (fallthrough) { - stream.on('file', function onFile() { - // once file is determined, always forward error - forwardError = true - }) - } - - // forward errors - stream.on('error', function error(err) { - if (forwardError || !(err.statusCode < 500)) { - next(err) - return - } - - next() - }) - - // pipe - stream.pipe(res) - } -} - -/** - * Collapse all leading slashes into a single slash - * @private - */ -function collapseLeadingSlashes(str) { - for (var i = 0; i < str.length; i++) { - if (str[i] !== '/') { - break - } - } - - return i > 1 - ? '/' + str.substr(i) - : str -} - -/** - * Create a directory listener that just 404s. - * @private - */ - -function createNotFoundDirectoryListener() { - return function notFound() { - this.error(404) - } -} - -/** - * Create a directory listener that performs a redirect. - * @private - */ - -function createRedirectDirectoryListener() { - return function redirect() { - if (this.hasTrailingSlash()) { - this.error(404) - return - } - - // get original URL - var originalUrl = parseUrl.original(this.req) - - // append trailing slash - originalUrl.path = null - originalUrl.pathname = collapseLeadingSlashes(originalUrl.pathname + '/') - - // reformat the URL - var loc = url.format(originalUrl) - var msg = 'Redirecting to ' + escapeHtml(loc) + '\n' - var res = this.res - - // send redirect response - res.statusCode = 303 - res.setHeader('Content-Type', 'text/html; charset=UTF-8') - res.setHeader('Content-Length', Buffer.byteLength(msg)) - res.setHeader('X-Content-Type-Options', 'nosniff') - res.setHeader('Location', loc) - res.end(msg) - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/package.json deleted file mode 100644 index c190511..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/serve-static/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "serve-static", - "description": "Serve static files", - "version": "1.10.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/expressjs/serve-static" - }, - "dependencies": { - "escape-html": "1.0.2", - "parseurl": "~1.3.0", - "send": "0.13.0" - }, - "devDependencies": { - "istanbul": "0.3.9", - "mocha": "2.2.5", - "supertest": "1.0.1" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" - }, - "gitHead": "856c5e0f796a8988525c356018594bfb8c51a4fa", - "bugs": { - "url": "https://github.com/expressjs/serve-static/issues" - }, - "homepage": "https://github.com/expressjs/serve-static", - "_id": "serve-static@1.10.0", - "_shasum": "be632faa685820e4a43ed3df1379135cc4f370d7", - "_from": "serve-static@>=1.10.0 <1.11.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "be632faa685820e4a43ed3df1379135cc4f370d7", - "tarball": "http://registry.npmjs.org/serve-static/-/serve-static-1.10.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/HISTORY.md deleted file mode 100644 index 8976fd3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/HISTORY.md +++ /dev/null @@ -1,174 +0,0 @@ -1.6.8 / 2015-09-04 -================== - - * deps: mime-types@~2.1.6 - - Add new mime types - -1.6.7 / 2015-08-20 -================== - - * Fix type error when given invalid type to match against - * deps: mime-types@~2.1.5 - - Add new mime types - -1.6.6 / 2015-07-31 -================== - - * deps: mime-types@~2.1.4 - - Add new mime types - -1.6.5 / 2015-07-16 -================== - - * deps: mime-types@~2.1.3 - - Add new mime types - -1.6.4 / 2015-07-01 -================== - - * deps: mime-types@~2.1.2 - - Add new mime types - * perf: enable strict mode - * perf: remove argument reassignment - -1.6.3 / 2015-06-08 -================== - - * deps: mime-types@~2.1.1 - - Add new mime types - * perf: reduce try block size - * perf: remove bitwise operations - -1.6.2 / 2015-05-10 -================== - - * deps: mime-types@~2.0.11 - - Add new mime types - -1.6.1 / 2015-03-13 -================== - - * deps: mime-types@~2.0.10 - - Add new mime types - -1.6.0 / 2015-02-12 -================== - - * fix false-positives in `hasBody` `Transfer-Encoding` check - * support wildcard for both type and subtype (`*/*`) - -1.5.7 / 2015-02-09 -================== - - * fix argument reassignment - * deps: mime-types@~2.0.9 - - Add new mime types - -1.5.6 / 2015-01-29 -================== - - * deps: mime-types@~2.0.8 - - Add new mime types - -1.5.5 / 2014-12-30 -================== - - * deps: mime-types@~2.0.7 - - Add new mime types - - Fix missing extensions - - Fix various invalid MIME type entries - - Remove example template MIME types - - deps: mime-db@~1.5.0 - -1.5.4 / 2014-12-10 -================== - - * deps: mime-types@~2.0.4 - - Add new mime types - - deps: mime-db@~1.3.0 - -1.5.3 / 2014-11-09 -================== - - * deps: mime-types@~2.0.3 - - Add new mime types - - deps: mime-db@~1.2.0 - -1.5.2 / 2014-09-28 -================== - - * deps: mime-types@~2.0.2 - - Add new mime types - - deps: mime-db@~1.1.0 - -1.5.1 / 2014-09-07 -================== - - * Support Node.js 0.6 - * deps: media-typer@0.3.0 - * deps: mime-types@~2.0.1 - - Support Node.js 0.6 - -1.5.0 / 2014-09-05 -================== - - * fix `hasbody` to be true for `content-length: 0` - -1.4.0 / 2014-09-02 -================== - - * update mime-types - -1.3.2 / 2014-06-24 -================== - - * use `~` range on mime-types - -1.3.1 / 2014-06-19 -================== - - * fix global variable leak - -1.3.0 / 2014-06-19 -================== - - * improve type parsing - - - invalid media type never matches - - media type not case-sensitive - - extra LWS does not affect results - -1.2.2 / 2014-06-19 -================== - - * fix behavior on unknown type argument - -1.2.1 / 2014-06-03 -================== - - * switch dependency from `mime` to `mime-types@1.0.0` - -1.2.0 / 2014-05-11 -================== - - * support suffix matching: - - - `+json` matches `application/vnd+json` - - `*/vnd+json` matches `application/vnd+json` - - `application/*+json` matches `application/vnd+json` - -1.1.0 / 2014-04-12 -================== - - * add non-array values support - * expose internal utilities: - - - `.is()` - - `.hasBody()` - - `.normalize()` - - `.match()` - -1.0.1 / 2014-03-30 -================== - - * add `multipart` as a shorthand diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/LICENSE deleted file mode 100644 index 386b7b6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/README.md deleted file mode 100644 index f75f6be..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/README.md +++ /dev/null @@ -1,132 +0,0 @@ -# type-is - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Infer the content-type of a request. - -### Install - -```sh -$ npm install type-is -``` - -## API - -```js -var http = require('http') -var is = require('type-is') - -http.createServer(function (req, res) { - var istext = is(req, ['text/*']) - res.end('you ' + (istext ? 'sent' : 'did not send') + ' me text') -}) -``` - -### type = is(request, types) - -`request` is the node HTTP request. `types` is an array of types. - -```js -// req.headers.content-type = 'application/json' - -is(req, ['json']) // 'json' -is(req, ['html', 'json']) // 'json' -is(req, ['application/*']) // 'application/json' -is(req, ['application/json']) // 'application/json' - -is(req, ['html']) // false -``` - -### is.hasBody(request) - -Returns a Boolean if the given `request` has a body, regardless of the -`Content-Type` header. - -```js -if (is.hasBody(req)) { - // read the body, since there is one - - req.on('data', function (chunk) { - // ... - }) -} -``` - -### type = is.is(mediaType, types) - -`mediaType` is the [media type](https://tools.ietf.org/html/rfc6838) string. `types` is an array of types. - -```js -var mediaType = 'application/json' - -is.is(mediaType, ['json']) // 'json' -is.is(mediaType, ['html', 'json']) // 'json' -is.is(mediaType, ['application/*']) // 'application/json' -is.is(mediaType, ['application/json']) // 'application/json' - -is.is(mediaType, ['html']) // false -``` - -### Each type can be: - -- An extension name such as `json`. This name will be returned if matched. -- A mime type such as `application/json`. -- A mime type with a wildcard such as `*/*` or `*/json` or `application/*`. The full mime type will be returned if matched. -- A suffix such as `+json`. This can be combined with a wildcard such as `*/vnd+json` or `application/*+json`. The full mime type will be returned if matched. - -`false` will be returned if no type matches or the content type is invalid. - -`null` will be returned if the request does not have a body. - -## Examples - -#### Example body parser - -```js -var is = require('type-is'); - -function bodyParser(req, res, next) { - if (!is.hasBody(req)) { - return next() - } - - switch (is(req, ['urlencoded', 'json', 'multipart'])) { - case 'urlencoded': - // parse urlencoded body - throw new Error('implement urlencoded body parsing') - break - case 'json': - // parse json body - throw new Error('implement json body parsing') - break - case 'multipart': - // parse multipart body - throw new Error('implement multipart body parsing') - break - default: - // 415 error code - res.statusCode = 415 - res.end() - return - } -} -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/type-is.svg -[npm-url]: https://npmjs.org/package/type-is -[node-version-image]: https://img.shields.io/node/v/type-is.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/type-is/master.svg -[travis-url]: https://travis-ci.org/jshttp/type-is -[coveralls-image]: https://img.shields.io/coveralls/jshttp/type-is/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/type-is?branch=master -[downloads-image]: https://img.shields.io/npm/dm/type-is.svg -[downloads-url]: https://npmjs.org/package/type-is diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/index.js deleted file mode 100644 index 5c11ef1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/index.js +++ /dev/null @@ -1,262 +0,0 @@ -/*! - * type-is - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var typer = require('media-typer') -var mime = require('mime-types') - -/** - * Module exports. - * @public - */ - -module.exports = typeofrequest -module.exports.is = typeis -module.exports.hasBody = hasbody -module.exports.normalize = normalize -module.exports.match = mimeMatch - -/** - * Compare a `value` content-type with `types`. - * Each `type` can be an extension like `html`, - * a special shortcut like `multipart` or `urlencoded`, - * or a mime type. - * - * If no types match, `false` is returned. - * Otherwise, the first `type` that matches is returned. - * - * @param {String} value - * @param {Array} types - * @public - */ - -function typeis(value, types_) { - var i - var types = types_ - - // remove parameters and normalize - var val = tryNormalizeType(value) - - // no type or invalid - if (!val) { - return false - } - - // support flattened arguments - if (types && !Array.isArray(types)) { - types = new Array(arguments.length - 1) - for (i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // no types, return the content type - if (!types || !types.length) { - return val - } - - var type - for (i = 0; i < types.length; i++) { - if (mimeMatch(normalize(type = types[i]), val)) { - return type[0] === '+' || type.indexOf('*') !== -1 - ? val - : type - } - } - - // no matches - return false -} - -/** - * Check if a request has a request body. - * A request with a body __must__ either have `transfer-encoding` - * or `content-length` headers set. - * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 - * - * @param {Object} request - * @return {Boolean} - * @public - */ - -function hasbody(req) { - return req.headers['transfer-encoding'] !== undefined - || !isNaN(req.headers['content-length']) -} - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains any of the give mime `type`s. - * If there is no request body, `null` is returned. - * If there is no content type, `false` is returned. - * Otherwise, it returns the first `type` that matches. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * this.is('html'); // => 'html' - * this.is('text/html'); // => 'text/html' - * this.is('text/*', 'application/json'); // => 'text/html' - * - * // When Content-Type is application/json - * this.is('json', 'urlencoded'); // => 'json' - * this.is('application/json'); // => 'application/json' - * this.is('html', 'application/*'); // => 'application/json' - * - * this.is('html'); // => false - * - * @param {String|Array} types... - * @return {String|false|null} - * @public - */ - -function typeofrequest(req, types_) { - var types = types_ - - // no body - if (!hasbody(req)) { - return null - } - - // support flattened arguments - if (arguments.length > 2) { - types = new Array(arguments.length - 1) - for (var i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // request content type - var value = req.headers['content-type'] - - return typeis(value, types) -} - -/** - * Normalize a mime type. - * If it's a shorthand, expand it to a valid mime type. - * - * In general, you probably want: - * - * var type = is(req, ['urlencoded', 'json', 'multipart']); - * - * Then use the appropriate body parsers. - * These three are the most common request body types - * and are thus ensured to work. - * - * @param {String} type - * @private - */ - -function normalize(type) { - if (typeof type !== 'string') { - // invalid type - return false - } - - switch (type) { - case 'urlencoded': - return 'application/x-www-form-urlencoded' - case 'multipart': - return 'multipart/*' - } - - if (type[0] === '+') { - // "+json" -> "*/*+json" expando - return '*/*' + type - } - - return type.indexOf('/') === -1 - ? mime.lookup(type) - : type -} - -/** - * Check if `exected` mime type - * matches `actual` mime type with - * wildcard and +suffix support. - * - * @param {String} expected - * @param {String} actual - * @return {Boolean} - * @private - */ - -function mimeMatch(expected, actual) { - // invalid type - if (expected === false) { - return false - } - - // split types - var actualParts = actual.split('/') - var expectedParts = expected.split('/') - - // invalid format - if (actualParts.length !== 2 || expectedParts.length !== 2) { - return false - } - - // validate type - if (expectedParts[0] !== '*' && expectedParts[0] !== actualParts[0]) { - return false - } - - // validate suffix wildcard - if (expectedParts[1].substr(0, 2) === '*+') { - return expectedParts[1].length <= actualParts[1].length + 1 - && expectedParts[1].substr(1) === actualParts[1].substr(1 - expectedParts[1].length) - } - - // validate subtype - if (expectedParts[1] !== '*' && expectedParts[1] !== actualParts[1]) { - return false - } - - return true -} - -/** - * Normalize a type and remove parameters. - * - * @param {string} value - * @return {string} - * @private - */ - -function normalizeType(value) { - // parse the type - var type = typer.parse(value) - - // remove the parameters - type.parameters = undefined - - // reformat it - return typer.format(type) -} - -/** - * Try to normalize a type and remove parameters. - * - * @param {string} value - * @return {string} - * @private - */ - -function tryNormalizeType(value) { - try { - return normalizeType(value) - } catch (err) { - return null - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/HISTORY.md deleted file mode 100644 index 62c2003..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/HISTORY.md +++ /dev/null @@ -1,22 +0,0 @@ -0.3.0 / 2014-09-07 -================== - - * Support Node.js 0.6 - * Throw error when parameter format invalid on parse - -0.2.0 / 2014-06-18 -================== - - * Add `typer.format()` to format media types - -0.1.0 / 2014-06-17 -================== - - * Accept `req` as argument to `parse` - * Accept `res` as argument to `parse` - * Parse media type with extra LWS between type and first parameter - -0.0.0 / 2014-06-13 -================== - - * Initial implementation diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/README.md deleted file mode 100644 index d8df623..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# media-typer - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Simple RFC 6838 media type parser - -## Installation - -```sh -$ npm install media-typer -``` - -## API - -```js -var typer = require('media-typer') -``` - -### typer.parse(string) - -```js -var obj = typer.parse('image/svg+xml; charset=utf-8') -``` - -Parse a media type string. This will return an object with the following -properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`): - - - `type`: The type of the media type (always lower case). Example: `'image'` - - - `subtype`: The subtype of the media type (always lower case). Example: `'svg'` - - - `suffix`: The suffix of the media type (always lower case). Example: `'xml'` - - - `parameters`: An object of the parameters in the media type (name of parameter always lower case). Example: `{charset: 'utf-8'}` - -### typer.parse(req) - -```js -var obj = typer.parse(req) -``` - -Parse the `content-type` header from the given `req`. Short-cut for -`typer.parse(req.headers['content-type'])`. - -### typer.parse(res) - -```js -var obj = typer.parse(res) -``` - -Parse the `content-type` header set on the given `res`. Short-cut for -`typer.parse(res.getHeader('content-type'))`. - -### typer.format(obj) - -```js -var obj = typer.format({type: 'image', subtype: 'svg', suffix: 'xml'}) -``` - -Format an object into a media type string. This will return a string of the -mime type for the given object. For the properties of the object, see the -documentation for `typer.parse(string)`. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/media-typer.svg?style=flat -[npm-url]: https://npmjs.org/package/media-typer -[node-version-image]: https://img.shields.io/badge/node.js-%3E%3D_0.6-brightgreen.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/media-typer.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/media-typer -[coveralls-image]: https://img.shields.io/coveralls/jshttp/media-typer.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/media-typer -[downloads-image]: https://img.shields.io/npm/dm/media-typer.svg?style=flat -[downloads-url]: https://npmjs.org/package/media-typer diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/index.js deleted file mode 100644 index 07f7295..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/index.js +++ /dev/null @@ -1,270 +0,0 @@ -/*! - * media-typer - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * RegExp to match *( ";" parameter ) in RFC 2616 sec 3.7 - * - * parameter = token "=" ( token | quoted-string ) - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) - * qdtext = > - * quoted-pair = "\" CHAR - * CHAR = - * TEXT = - * LWS = [CRLF] 1*( SP | HT ) - * CRLF = CR LF - * CR = - * LF = - * SP = - * SHT = - * CTL = - * OCTET = - */ -var paramRegExp = /; *([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *= *("(?:[ !\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u0020-\u007e])*"|[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) */g; -var textRegExp = /^[\u0020-\u007e\u0080-\u00ff]+$/ -var tokenRegExp = /^[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+$/ - -/** - * RegExp to match quoted-pair in RFC 2616 - * - * quoted-pair = "\" CHAR - * CHAR = - */ -var qescRegExp = /\\([\u0000-\u007f])/g; - -/** - * RegExp to match chars that must be quoted-pair in RFC 2616 - */ -var quoteRegExp = /([\\"])/g; - -/** - * RegExp to match type in RFC 6838 - * - * type-name = restricted-name - * subtype-name = restricted-name - * restricted-name = restricted-name-first *126restricted-name-chars - * restricted-name-first = ALPHA / DIGIT - * restricted-name-chars = ALPHA / DIGIT / "!" / "#" / - * "$" / "&" / "-" / "^" / "_" - * restricted-name-chars =/ "." ; Characters before first dot always - * ; specify a facet name - * restricted-name-chars =/ "+" ; Characters after last plus always - * ; specify a structured syntax suffix - * ALPHA = %x41-5A / %x61-7A ; A-Z / a-z - * DIGIT = %x30-39 ; 0-9 - */ -var subtypeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/ -var typeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/ -var typeRegExp = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/; - -/** - * Module exports. - */ - -exports.format = format -exports.parse = parse - -/** - * Format object to media type. - * - * @param {object} obj - * @return {string} - * @api public - */ - -function format(obj) { - if (!obj || typeof obj !== 'object') { - throw new TypeError('argument obj is required') - } - - var parameters = obj.parameters - var subtype = obj.subtype - var suffix = obj.suffix - var type = obj.type - - if (!type || !typeNameRegExp.test(type)) { - throw new TypeError('invalid type') - } - - if (!subtype || !subtypeNameRegExp.test(subtype)) { - throw new TypeError('invalid subtype') - } - - // format as type/subtype - var string = type + '/' + subtype - - // append +suffix - if (suffix) { - if (!typeNameRegExp.test(suffix)) { - throw new TypeError('invalid suffix') - } - - string += '+' + suffix - } - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - if (!tokenRegExp.test(param)) { - throw new TypeError('invalid parameter name') - } - - string += '; ' + param + '=' + qstring(parameters[param]) - } - } - - return string -} - -/** - * Parse media type to object. - * - * @param {string|object} string - * @return {Object} - * @api public - */ - -function parse(string) { - if (!string) { - throw new TypeError('argument string is required') - } - - // support req/res-like objects as argument - if (typeof string === 'object') { - string = getcontenttype(string) - } - - if (typeof string !== 'string') { - throw new TypeError('argument string is required to be a string') - } - - var index = string.indexOf(';') - var type = index !== -1 - ? string.substr(0, index) - : string - - var key - var match - var obj = splitType(type) - var params = {} - var value - - paramRegExp.lastIndex = index - - while (match = paramRegExp.exec(string)) { - if (match.index !== index) { - throw new TypeError('invalid parameter format') - } - - index += match[0].length - key = match[1].toLowerCase() - value = match[2] - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(qescRegExp, '$1') - } - - params[key] = value - } - - if (index !== -1 && index !== string.length) { - throw new TypeError('invalid parameter format') - } - - obj.parameters = params - - return obj -} - -/** - * Get content-type from req/res objects. - * - * @param {object} - * @return {Object} - * @api private - */ - -function getcontenttype(obj) { - if (typeof obj.getHeader === 'function') { - // res-like - return obj.getHeader('content-type') - } - - if (typeof obj.headers === 'object') { - // req-like - return obj.headers && obj.headers['content-type'] - } -} - -/** - * Quote a string if necessary. - * - * @param {string} val - * @return {string} - * @api private - */ - -function qstring(val) { - var str = String(val) - - // no need to quote tokens - if (tokenRegExp.test(str)) { - return str - } - - if (str.length > 0 && !textRegExp.test(str)) { - throw new TypeError('invalid parameter value') - } - - return '"' + str.replace(quoteRegExp, '\\$1') + '"' -} - -/** - * Simply "type/subtype+siffx" into parts. - * - * @param {string} string - * @return {Object} - * @api private - */ - -function splitType(string) { - var match = typeRegExp.exec(string.toLowerCase()) - - if (!match) { - throw new TypeError('invalid media type') - } - - var type = match[1] - var subtype = match[2] - var suffix - - // suffix after last + - var index = subtype.lastIndexOf('+') - if (index !== -1) { - suffix = subtype.substr(index + 1) - subtype = subtype.substr(0, index) - } - - var obj = { - type: type, - subtype: subtype, - suffix: suffix - } - - return obj -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/package.json deleted file mode 100644 index 4bd1a51..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/media-typer/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "media-typer", - "description": "Simple RFC 6838 media type parser and formatter", - "version": "0.3.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jshttp/media-typer" - }, - "devDependencies": { - "istanbul": "0.3.2", - "mocha": "~1.21.4", - "should": "~4.0.4" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "d49d41ffd0bb5a0655fa44a59df2ec0bfc835b16", - "bugs": { - "url": "https://github.com/jshttp/media-typer/issues" - }, - "homepage": "https://github.com/jshttp/media-typer", - "_id": "media-typer@0.3.0", - "_shasum": "8710d7af0aa626f8fffa1ce00168545263255748", - "_from": "media-typer@0.3.0", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "8710d7af0aa626f8fffa1ce00168545263255748", - "tarball": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/HISTORY.md deleted file mode 100644 index e7bed42..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/HISTORY.md +++ /dev/null @@ -1,165 +0,0 @@ -2.1.6 / 2015-09--03 -================== - - * deps: mime-db@~1.18.0 - - Add new mime types - -2.1.5 / 2015-08-20 -================== - - * deps: mime-db@~1.17.0 - - Add new mime types - -2.1.4 / 2015-07-30 -================== - - * deps: mime-db@~1.16.0 - - Add new mime types - -2.1.3 / 2015-07-13 -================== - - * deps: mime-db@~1.15.0 - - Add new mime types - -2.1.2 / 2015-06-25 -================== - - * deps: mime-db@~1.14.0 - - Add new mime types - -2.1.1 / 2015-06-08 -================== - - * perf: fix deopt during mapping - -2.1.0 / 2015-06-07 -================== - - * Fix incorrectly treating extension-less file name as extension - - i.e. `'path/to/json'` will no longer return `application/json` - * Fix `.charset(type)` to accept parameters - * Fix `.charset(type)` to match case-insensitive - * Improve generation of extension to MIME mapping - * Refactor internals for readability and no argument reassignment - * Prefer `application/*` MIME types from the same source - * Prefer any type over `application/octet-stream` - * deps: mime-db@~1.13.0 - - Add nginx as a source - - Add new mime types - -2.0.14 / 2015-06-06 -=================== - - * deps: mime-db@~1.12.0 - - Add new mime types - -2.0.13 / 2015-05-31 -=================== - - * deps: mime-db@~1.11.0 - - Add new mime types - -2.0.12 / 2015-05-19 -=================== - - * deps: mime-db@~1.10.0 - - Add new mime types - -2.0.11 / 2015-05-05 -=================== - - * deps: mime-db@~1.9.1 - - Add new mime types - -2.0.10 / 2015-03-13 -=================== - - * deps: mime-db@~1.8.0 - - Add new mime types - -2.0.9 / 2015-02-09 -================== - - * deps: mime-db@~1.7.0 - - Add new mime types - - Community extensions ownership transferred from `node-mime` - -2.0.8 / 2015-01-29 -================== - - * deps: mime-db@~1.6.0 - - Add new mime types - -2.0.7 / 2014-12-30 -================== - - * deps: mime-db@~1.5.0 - - Add new mime types - - Fix various invalid MIME type entries - -2.0.6 / 2014-12-30 -================== - - * deps: mime-db@~1.4.0 - - Add new mime types - - Fix various invalid MIME type entries - - Remove example template MIME types - -2.0.5 / 2014-12-29 -================== - - * deps: mime-db@~1.3.1 - - Fix missing extensions - -2.0.4 / 2014-12-10 -================== - - * deps: mime-db@~1.3.0 - - Add new mime types - -2.0.3 / 2014-11-09 -================== - - * deps: mime-db@~1.2.0 - - Add new mime types - -2.0.2 / 2014-09-28 -================== - - * deps: mime-db@~1.1.0 - - Add new mime types - - Add additional compressible - - Update charsets - -2.0.1 / 2014-09-07 -================== - - * Support Node.js 0.6 - -2.0.0 / 2014-09-02 -================== - - * Use `mime-db` - * Remove `.define()` - -1.0.2 / 2014-08-04 -================== - - * Set charset=utf-8 for `text/javascript` - -1.0.1 / 2014-06-24 -================== - - * Add `text/jsx` type - -1.0.0 / 2014-05-12 -================== - - * Return `false` for unknown types - * Set charset=utf-8 for `application/json` - -0.1.0 / 2014-05-02 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE deleted file mode 100644 index 0616607..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/README.md deleted file mode 100644 index e26295d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/README.md +++ /dev/null @@ -1,103 +0,0 @@ -# mime-types - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -The ultimate javascript content-type utility. - -Similar to [node-mime](https://github.com/broofa/node-mime), except: - -- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, - so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. -- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. -- Additional mime types are added such as jade and stylus via [mime-db](https://github.com/jshttp/mime-db) -- No `.define()` functionality - -Otherwise, the API is compatible. - -## Install - -```sh -$ npm install mime-types -``` - -## Adding Types - -All mime types are based on [mime-db](https://github.com/jshttp/mime-db), -so open a PR there if you'd like to add mime types. - -## API - -```js -var mime = require('mime-types') -``` - -All functions return `false` if input is invalid or not found. - -### mime.lookup(path) - -Lookup the content-type associated with a file. - -```js -mime.lookup('json') // 'application/json' -mime.lookup('.md') // 'text/x-markdown' -mime.lookup('file.html') // 'text/html' -mime.lookup('folder/file.js') // 'application/javascript' -mime.lookup('folder/.htaccess') // false - -mime.lookup('cats') // false -``` - -### mime.contentType(type) - -Create a full content-type header given a content-type or extension. - -```js -mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' -mime.contentType('file.json') // 'application/json; charset=utf-8' - -// from a full path -mime.contentType(path.extname('/path/to/file.json')) // 'application/json; charset=utf-8' -``` - -### mime.extension(type) - -Get the default extension for a content-type. - -```js -mime.extension('application/octet-stream') // 'bin' -``` - -### mime.charset(type) - -Lookup the implied default charset of a content-type. - -```js -mime.charset('text/x-markdown') // 'UTF-8' -``` - -### var type = mime.types[extension] - -A map of content-types by extension. - -### [extensions...] = mime.extensions[type] - -A map of extensions by content-type. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/mime-types.svg -[npm-url]: https://npmjs.org/package/mime-types -[node-version-image]: https://img.shields.io/node/v/mime-types.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/mime-types/master.svg -[travis-url]: https://travis-ci.org/jshttp/mime-types -[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-types/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/mime-types -[downloads-image]: https://img.shields.io/npm/dm/mime-types.svg -[downloads-url]: https://npmjs.org/package/mime-types diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/index.js deleted file mode 100644 index f7008b2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/index.js +++ /dev/null @@ -1,188 +0,0 @@ -/*! - * mime-types - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var db = require('mime-db') -var extname = require('path').extname - -/** - * Module variables. - * @private - */ - -var extractTypeRegExp = /^\s*([^;\s]*)(?:;|\s|$)/ -var textTypeRegExp = /^text\//i - -/** - * Module exports. - * @public - */ - -exports.charset = charset -exports.charsets = { lookup: charset } -exports.contentType = contentType -exports.extension = extension -exports.extensions = Object.create(null) -exports.lookup = lookup -exports.types = Object.create(null) - -// Populate the extensions/types maps -populateMaps(exports.extensions, exports.types) - -/** - * Get the default charset for a MIME type. - * - * @param {string} type - * @return {boolean|string} - */ - -function charset(type) { - if (!type || typeof type !== 'string') { - return false - } - - // TODO: use media-typer - var match = extractTypeRegExp.exec(type) - var mime = match && db[match[1].toLowerCase()] - - if (mime && mime.charset) { - return mime.charset - } - - // default text/* to utf-8 - if (match && textTypeRegExp.test(match[1])) { - return 'UTF-8' - } - - return false -} - -/** - * Create a full Content-Type header given a MIME type or extension. - * - * @param {string} str - * @return {boolean|string} - */ - -function contentType(str) { - // TODO: should this even be in this module? - if (!str || typeof str !== 'string') { - return false - } - - var mime = str.indexOf('/') === -1 - ? exports.lookup(str) - : str - - if (!mime) { - return false - } - - // TODO: use content-type or other module - if (mime.indexOf('charset') === -1) { - var charset = exports.charset(mime) - if (charset) mime += '; charset=' + charset.toLowerCase() - } - - return mime -} - -/** - * Get the default extension for a MIME type. - * - * @param {string} type - * @return {boolean|string} - */ - -function extension(type) { - if (!type || typeof type !== 'string') { - return false - } - - // TODO: use media-typer - var match = extractTypeRegExp.exec(type) - - // get extensions - var exts = match && exports.extensions[match[1].toLowerCase()] - - if (!exts || !exts.length) { - return false - } - - return exts[0] -} - -/** - * Lookup the MIME type for a file path/extension. - * - * @param {string} path - * @return {boolean|string} - */ - -function lookup(path) { - if (!path || typeof path !== 'string') { - return false - } - - // get the extension ("ext" or ".ext" or full path) - var extension = extname('x.' + path) - .toLowerCase() - .substr(1) - - if (!extension) { - return false - } - - return exports.types[extension] || false -} - -/** - * Populate the extensions and types maps. - * @private - */ - -function populateMaps(extensions, types) { - // source preference (least -> most) - var preference = ['nginx', 'apache', undefined, 'iana'] - - Object.keys(db).forEach(function forEachMimeType(type) { - var mime = db[type] - var exts = mime.extensions - - if (!exts || !exts.length) { - return - } - - // mime -> extensions - extensions[type] = exts - - // extension -> mime - for (var i = 0; i < exts.length; i++) { - var extension = exts[i] - - if (types[extension]) { - var from = preference.indexOf(db[types[extension]].source) - var to = preference.indexOf(mime.source) - - if (types[extension] !== 'application/octet-stream' - && from > to || (from === to && types[extension].substr(0, 12) === 'application/')) { - // skip the remapping - continue - } - } - - // set the extension -> mime - types[extension] = type - } - }) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/HISTORY.md deleted file mode 100644 index 87ab929..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/HISTORY.md +++ /dev/null @@ -1,266 +0,0 @@ -1.18.0 / 2015-09-03 -=================== - - * Add `application/pkcs12` - * Add `application/vnd.3gpp-prose+xml` - * Add `application/vnd.3gpp.mid-call+xml` - * Add `application/vnd.3gpp.state-and-event-info+xml` - * Add `application/vnd.anki` - * Add `application/vnd.firemonkeys.cloudcell` - * Add `application/vnd.openblox.game+xml` - * Add `application/vnd.openblox.game-binary` - -1.17.0 / 2015-08-13 -=================== - - * Add `application/x-msdos-program` - * Add `audio/g711-0` - * Add `image/vnd.mozilla.apng` - * Add extension `.exe` to `application/x-msdos-program` - -1.16.0 / 2015-07-29 -=================== - - * Add `application/vnd.uri-map` - -1.15.0 / 2015-07-13 -=================== - - * Add `application/x-httpd-php` - -1.14.0 / 2015-06-25 -=================== - - * Add `application/scim+json` - * Add `application/vnd.3gpp.ussd+xml` - * Add `application/vnd.biopax.rdf+xml` - * Add `text/x-processing` - -1.13.0 / 2015-06-07 -=================== - - * Add nginx as a source - * Add `application/x-cocoa` - * Add `application/x-java-archive-diff` - * Add `application/x-makeself` - * Add `application/x-perl` - * Add `application/x-pilot` - * Add `application/x-redhat-package-manager` - * Add `application/x-sea` - * Add `audio/x-m4a` - * Add `audio/x-realaudio` - * Add `image/x-jng` - * Add `text/mathml` - -1.12.0 / 2015-06-05 -=================== - - * Add `application/bdoc` - * Add `application/vnd.hyperdrive+json` - * Add `application/x-bdoc` - * Add extension `.rtf` to `text/rtf` - -1.11.0 / 2015-05-31 -=================== - - * Add `audio/wav` - * Add `audio/wave` - * Add extension `.litcoffee` to `text/coffeescript` - * Add extension `.sfd-hdstx` to `application/vnd.hydrostatix.sof-data` - * Add extension `.n-gage` to `application/vnd.nokia.n-gage.symbian.install` - -1.10.0 / 2015-05-19 -=================== - - * Add `application/vnd.balsamiq.bmpr` - * Add `application/vnd.microsoft.portable-executable` - * Add `application/x-ns-proxy-autoconfig` - -1.9.1 / 2015-04-19 -================== - - * Remove `.json` extension from `application/manifest+json` - - This is causing bugs downstream - -1.9.0 / 2015-04-19 -================== - - * Add `application/manifest+json` - * Add `application/vnd.micro+json` - * Add `image/vnd.zbrush.pcx` - * Add `image/x-ms-bmp` - -1.8.0 / 2015-03-13 -================== - - * Add `application/vnd.citationstyles.style+xml` - * Add `application/vnd.fastcopy-disk-image` - * Add `application/vnd.gov.sk.xmldatacontainer+xml` - * Add extension `.jsonld` to `application/ld+json` - -1.7.0 / 2015-02-08 -================== - - * Add `application/vnd.gerber` - * Add `application/vnd.msa-disk-image` - -1.6.1 / 2015-02-05 -================== - - * Community extensions ownership transferred from `node-mime` - -1.6.0 / 2015-01-29 -================== - - * Add `application/jose` - * Add `application/jose+json` - * Add `application/json-seq` - * Add `application/jwk+json` - * Add `application/jwk-set+json` - * Add `application/jwt` - * Add `application/rdap+json` - * Add `application/vnd.gov.sk.e-form+xml` - * Add `application/vnd.ims.imsccv1p3` - -1.5.0 / 2014-12-30 -================== - - * Add `application/vnd.oracle.resource+json` - * Fix various invalid MIME type entries - - `application/mbox+xml` - - `application/oscp-response` - - `application/vwg-multiplexed` - - `audio/g721` - -1.4.0 / 2014-12-21 -================== - - * Add `application/vnd.ims.imsccv1p2` - * Fix various invalid MIME type entries - - `application/vnd-acucobol` - - `application/vnd-curl` - - `application/vnd-dart` - - `application/vnd-dxr` - - `application/vnd-fdf` - - `application/vnd-mif` - - `application/vnd-sema` - - `application/vnd-wap-wmlc` - - `application/vnd.adobe.flash-movie` - - `application/vnd.dece-zip` - - `application/vnd.dvb_service` - - `application/vnd.micrografx-igx` - - `application/vnd.sealed-doc` - - `application/vnd.sealed-eml` - - `application/vnd.sealed-mht` - - `application/vnd.sealed-ppt` - - `application/vnd.sealed-tiff` - - `application/vnd.sealed-xls` - - `application/vnd.sealedmedia.softseal-html` - - `application/vnd.sealedmedia.softseal-pdf` - - `application/vnd.wap-slc` - - `application/vnd.wap-wbxml` - - `audio/vnd.sealedmedia.softseal-mpeg` - - `image/vnd-djvu` - - `image/vnd-svf` - - `image/vnd-wap-wbmp` - - `image/vnd.sealed-png` - - `image/vnd.sealedmedia.softseal-gif` - - `image/vnd.sealedmedia.softseal-jpg` - - `model/vnd-dwf` - - `model/vnd.parasolid.transmit-binary` - - `model/vnd.parasolid.transmit-text` - - `text/vnd-a` - - `text/vnd-curl` - - `text/vnd.wap-wml` - * Remove example template MIME types - - `application/example` - - `audio/example` - - `image/example` - - `message/example` - - `model/example` - - `multipart/example` - - `text/example` - - `video/example` - -1.3.1 / 2014-12-16 -================== - - * Fix missing extensions - - `application/json5` - - `text/hjson` - -1.3.0 / 2014-12-07 -================== - - * Add `application/a2l` - * Add `application/aml` - * Add `application/atfx` - * Add `application/atxml` - * Add `application/cdfx+xml` - * Add `application/dii` - * Add `application/json5` - * Add `application/lxf` - * Add `application/mf4` - * Add `application/vnd.apache.thrift.compact` - * Add `application/vnd.apache.thrift.json` - * Add `application/vnd.coffeescript` - * Add `application/vnd.enphase.envoy` - * Add `application/vnd.ims.imsccv1p1` - * Add `text/csv-schema` - * Add `text/hjson` - * Add `text/markdown` - * Add `text/yaml` - -1.2.0 / 2014-11-09 -================== - - * Add `application/cea` - * Add `application/dit` - * Add `application/vnd.gov.sk.e-form+zip` - * Add `application/vnd.tmd.mediaflex.api+xml` - * Type `application/epub+zip` is now IANA-registered - -1.1.2 / 2014-10-23 -================== - - * Rebuild database for `application/x-www-form-urlencoded` change - -1.1.1 / 2014-10-20 -================== - - * Mark `application/x-www-form-urlencoded` as compressible. - -1.1.0 / 2014-09-28 -================== - - * Add `application/font-woff2` - -1.0.3 / 2014-09-25 -================== - - * Fix engine requirement in package - -1.0.2 / 2014-09-25 -================== - - * Add `application/coap-group+json` - * Add `application/dcd` - * Add `application/vnd.apache.thrift.binary` - * Add `image/vnd.tencent.tap` - * Mark all JSON-derived types as compressible - * Update `text/vtt` data - -1.0.1 / 2014-08-30 -================== - - * Fix extension ordering - -1.0.0 / 2014-08-30 -================== - - * Add `application/atf` - * Add `application/merge-patch+json` - * Add `multipart/x-mixed-replace` - * Add `source: 'apache'` metadata - * Add `source: 'iana'` metadata - * Remove badly-assumed charset data diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/README.md deleted file mode 100644 index 164cca0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# mime-db - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Downloads][npm-downloads-image]][npm-url] -[![Node.js Version][node-image]][node-url] -[![Build Status][travis-image]][travis-url] -[![Coverage Status][coveralls-image]][coveralls-url] - -This is a database of all mime types. -It consists of a single, public JSON file and does not include any logic, -allowing it to remain as un-opinionated as possible with an API. -It aggregates data from the following sources: - -- http://www.iana.org/assignments/media-types/media-types.xhtml -- http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -- http://hg.nginx.org/nginx/raw-file/default/conf/mime.types - -## Installation - -```bash -npm install mime-db -``` - -### Database Download - -If you're crazy enough to use this in the browser, you can just grab the -JSON file using [RawGit](https://rawgit.com/). It is recommended to replace -`master` with [a release tag](https://github.com/jshttp/mime-db/tags) as the -JSON format may change in the future. - -``` -https://cdn.rawgit.com/jshttp/mime-db/master/db.json -``` - -## Usage - -```js -var db = require('mime-db'); - -// grab data on .js files -var data = db['application/javascript']; -``` - -## Data Structure - -The JSON file is a map lookup for lowercased mime types. -Each mime type has the following properties: - -- `.source` - where the mime type is defined. - If not set, it's probably a custom media type. - - `apache` - [Apache common media types](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types) - - `iana` - [IANA-defined media types](http://www.iana.org/assignments/media-types/media-types.xhtml) - - `nginx` - [nginx media types](http://hg.nginx.org/nginx/raw-file/default/conf/mime.types) -- `.extensions[]` - known extensions associated with this mime type. -- `.compressible` - whether a file of this type is can be gzipped. -- `.charset` - the default charset associated with this type, if any. - -If unknown, every property could be `undefined`. - -## Contributing - -To edit the database, only make PRs against `src/custom.json` or -`src/custom-suffix.json`. - -To update the build, run `npm run build`. - -## Adding Custom Media Types - -The best way to get new media types included in this library is to register -them with the IANA. The community registration procedure is outlined in -[RFC 6838 section 5](http://tools.ietf.org/html/rfc6838#section-5). Types -registered with the IANA are automatically pulled into this library. - -[npm-version-image]: https://img.shields.io/npm/v/mime-db.svg -[npm-downloads-image]: https://img.shields.io/npm/dm/mime-db.svg -[npm-url]: https://npmjs.org/package/mime-db -[travis-image]: https://img.shields.io/travis/jshttp/mime-db/master.svg -[travis-url]: https://travis-ci.org/jshttp/mime-db -[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-db/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/mime-db?branch=master -[node-image]: https://img.shields.io/node/v/mime-db.svg -[node-url]: http://nodejs.org/download/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/db.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/db.json deleted file mode 100644 index 96aae45..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/db.json +++ /dev/null @@ -1,6460 +0,0 @@ -{ - "application/1d-interleaved-parityfec": { - "source": "iana" - }, - "application/3gpdash-qoe-report+xml": { - "source": "iana" - }, - "application/3gpp-ims+xml": { - "source": "iana" - }, - "application/a2l": { - "source": "iana" - }, - "application/activemessage": { - "source": "iana" - }, - "application/alto-costmap+json": { - "source": "iana", - "compressible": true - }, - "application/alto-costmapfilter+json": { - "source": "iana", - "compressible": true - }, - "application/alto-directory+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointcost+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointcostparams+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointprop+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointpropparams+json": { - "source": "iana", - "compressible": true - }, - "application/alto-error+json": { - "source": "iana", - "compressible": true - }, - "application/alto-networkmap+json": { - "source": "iana", - "compressible": true - }, - "application/alto-networkmapfilter+json": { - "source": "iana", - "compressible": true - }, - "application/aml": { - "source": "iana" - }, - "application/andrew-inset": { - "source": "iana", - "extensions": ["ez"] - }, - "application/applefile": { - "source": "iana" - }, - "application/applixware": { - "source": "apache", - "extensions": ["aw"] - }, - "application/atf": { - "source": "iana" - }, - "application/atfx": { - "source": "iana" - }, - "application/atom+xml": { - "source": "iana", - "compressible": true, - "extensions": ["atom"] - }, - "application/atomcat+xml": { - "source": "iana", - "extensions": ["atomcat"] - }, - "application/atomdeleted+xml": { - "source": "iana" - }, - "application/atomicmail": { - "source": "iana" - }, - "application/atomsvc+xml": { - "source": "iana", - "extensions": ["atomsvc"] - }, - "application/atxml": { - "source": "iana" - }, - "application/auth-policy+xml": { - "source": "iana" - }, - "application/bacnet-xdd+zip": { - "source": "iana" - }, - "application/batch-smtp": { - "source": "iana" - }, - "application/bdoc": { - "compressible": false, - "extensions": ["bdoc"] - }, - "application/beep+xml": { - "source": "iana" - }, - "application/calendar+json": { - "source": "iana", - "compressible": true - }, - "application/calendar+xml": { - "source": "iana" - }, - "application/call-completion": { - "source": "iana" - }, - "application/cals-1840": { - "source": "iana" - }, - "application/cbor": { - "source": "iana" - }, - "application/ccmp+xml": { - "source": "iana" - }, - "application/ccxml+xml": { - "source": "iana", - "extensions": ["ccxml"] - }, - "application/cdfx+xml": { - "source": "iana" - }, - "application/cdmi-capability": { - "source": "iana", - "extensions": ["cdmia"] - }, - "application/cdmi-container": { - "source": "iana", - "extensions": ["cdmic"] - }, - "application/cdmi-domain": { - "source": "iana", - "extensions": ["cdmid"] - }, - "application/cdmi-object": { - "source": "iana", - "extensions": ["cdmio"] - }, - "application/cdmi-queue": { - "source": "iana", - "extensions": ["cdmiq"] - }, - "application/cea": { - "source": "iana" - }, - "application/cea-2018+xml": { - "source": "iana" - }, - "application/cellml+xml": { - "source": "iana" - }, - "application/cfw": { - "source": "iana" - }, - "application/cms": { - "source": "iana" - }, - "application/cnrp+xml": { - "source": "iana" - }, - "application/coap-group+json": { - "source": "iana", - "compressible": true - }, - "application/commonground": { - "source": "iana" - }, - "application/conference-info+xml": { - "source": "iana" - }, - "application/cpl+xml": { - "source": "iana" - }, - "application/csrattrs": { - "source": "iana" - }, - "application/csta+xml": { - "source": "iana" - }, - "application/cstadata+xml": { - "source": "iana" - }, - "application/cu-seeme": { - "source": "apache", - "extensions": ["cu"] - }, - "application/cybercash": { - "source": "iana" - }, - "application/dart": { - "compressible": true - }, - "application/dash+xml": { - "source": "iana", - "extensions": ["mdp"] - }, - "application/dashdelta": { - "source": "iana" - }, - "application/davmount+xml": { - "source": "iana", - "extensions": ["davmount"] - }, - "application/dca-rft": { - "source": "iana" - }, - "application/dcd": { - "source": "iana" - }, - "application/dec-dx": { - "source": "iana" - }, - "application/dialog-info+xml": { - "source": "iana" - }, - "application/dicom": { - "source": "iana" - }, - "application/dii": { - "source": "iana" - }, - "application/dit": { - "source": "iana" - }, - "application/dns": { - "source": "iana" - }, - "application/docbook+xml": { - "source": "apache", - "extensions": ["dbk"] - }, - "application/dskpp+xml": { - "source": "iana" - }, - "application/dssc+der": { - "source": "iana", - "extensions": ["dssc"] - }, - "application/dssc+xml": { - "source": "iana", - "extensions": ["xdssc"] - }, - "application/dvcs": { - "source": "iana" - }, - "application/ecmascript": { - "source": "iana", - "compressible": true, - "extensions": ["ecma"] - }, - "application/edi-consent": { - "source": "iana" - }, - "application/edi-x12": { - "source": "iana", - "compressible": false - }, - "application/edifact": { - "source": "iana", - "compressible": false - }, - "application/emma+xml": { - "source": "iana", - "extensions": ["emma"] - }, - "application/emotionml+xml": { - "source": "iana" - }, - "application/encaprtp": { - "source": "iana" - }, - "application/epp+xml": { - "source": "iana" - }, - "application/epub+zip": { - "source": "iana", - "extensions": ["epub"] - }, - "application/eshop": { - "source": "iana" - }, - "application/exi": { - "source": "iana", - "extensions": ["exi"] - }, - "application/fastinfoset": { - "source": "iana" - }, - "application/fastsoap": { - "source": "iana" - }, - "application/fdt+xml": { - "source": "iana" - }, - "application/fits": { - "source": "iana" - }, - "application/font-sfnt": { - "source": "iana" - }, - "application/font-tdpfr": { - "source": "iana", - "extensions": ["pfr"] - }, - "application/font-woff": { - "source": "iana", - "compressible": false, - "extensions": ["woff"] - }, - "application/font-woff2": { - "compressible": false, - "extensions": ["woff2"] - }, - "application/framework-attributes+xml": { - "source": "iana" - }, - "application/gml+xml": { - "source": "apache", - "extensions": ["gml"] - }, - "application/gpx+xml": { - "source": "apache", - "extensions": ["gpx"] - }, - "application/gxf": { - "source": "apache", - "extensions": ["gxf"] - }, - "application/gzip": { - "source": "iana", - "compressible": false - }, - "application/h224": { - "source": "iana" - }, - "application/held+xml": { - "source": "iana" - }, - "application/http": { - "source": "iana" - }, - "application/hyperstudio": { - "source": "iana", - "extensions": ["stk"] - }, - "application/ibe-key-request+xml": { - "source": "iana" - }, - "application/ibe-pkg-reply+xml": { - "source": "iana" - }, - "application/ibe-pp-data": { - "source": "iana" - }, - "application/iges": { - "source": "iana" - }, - "application/im-iscomposing+xml": { - "source": "iana" - }, - "application/index": { - "source": "iana" - }, - "application/index.cmd": { - "source": "iana" - }, - "application/index.obj": { - "source": "iana" - }, - "application/index.response": { - "source": "iana" - }, - "application/index.vnd": { - "source": "iana" - }, - "application/inkml+xml": { - "source": "iana", - "extensions": ["ink","inkml"] - }, - "application/iotp": { - "source": "iana" - }, - "application/ipfix": { - "source": "iana", - "extensions": ["ipfix"] - }, - "application/ipp": { - "source": "iana" - }, - "application/isup": { - "source": "iana" - }, - "application/its+xml": { - "source": "iana" - }, - "application/java-archive": { - "source": "apache", - "compressible": false, - "extensions": ["jar","war","ear"] - }, - "application/java-serialized-object": { - "source": "apache", - "compressible": false, - "extensions": ["ser"] - }, - "application/java-vm": { - "source": "apache", - "compressible": false, - "extensions": ["class"] - }, - "application/javascript": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["js"] - }, - "application/jose": { - "source": "iana" - }, - "application/jose+json": { - "source": "iana", - "compressible": true - }, - "application/jrd+json": { - "source": "iana", - "compressible": true - }, - "application/json": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["json","map"] - }, - "application/json-patch+json": { - "source": "iana", - "compressible": true - }, - "application/json-seq": { - "source": "iana" - }, - "application/json5": { - "extensions": ["json5"] - }, - "application/jsonml+json": { - "source": "apache", - "compressible": true, - "extensions": ["jsonml"] - }, - "application/jwk+json": { - "source": "iana", - "compressible": true - }, - "application/jwk-set+json": { - "source": "iana", - "compressible": true - }, - "application/jwt": { - "source": "iana" - }, - "application/kpml-request+xml": { - "source": "iana" - }, - "application/kpml-response+xml": { - "source": "iana" - }, - "application/ld+json": { - "source": "iana", - "compressible": true, - "extensions": ["jsonld"] - }, - "application/link-format": { - "source": "iana" - }, - "application/load-control+xml": { - "source": "iana" - }, - "application/lost+xml": { - "source": "iana", - "extensions": ["lostxml"] - }, - "application/lostsync+xml": { - "source": "iana" - }, - "application/lxf": { - "source": "iana" - }, - "application/mac-binhex40": { - "source": "iana", - "extensions": ["hqx"] - }, - "application/mac-compactpro": { - "source": "apache", - "extensions": ["cpt"] - }, - "application/macwriteii": { - "source": "iana" - }, - "application/mads+xml": { - "source": "iana", - "extensions": ["mads"] - }, - "application/manifest+json": { - "charset": "UTF-8", - "compressible": true, - "extensions": ["webmanifest"] - }, - "application/marc": { - "source": "iana", - "extensions": ["mrc"] - }, - "application/marcxml+xml": { - "source": "iana", - "extensions": ["mrcx"] - }, - "application/mathematica": { - "source": "iana", - "extensions": ["ma","nb","mb"] - }, - "application/mathml+xml": { - "source": "iana", - "extensions": ["mathml"] - }, - "application/mathml-content+xml": { - "source": "iana" - }, - "application/mathml-presentation+xml": { - "source": "iana" - }, - "application/mbms-associated-procedure-description+xml": { - "source": "iana" - }, - "application/mbms-deregister+xml": { - "source": "iana" - }, - "application/mbms-envelope+xml": { - "source": "iana" - }, - "application/mbms-msk+xml": { - "source": "iana" - }, - "application/mbms-msk-response+xml": { - "source": "iana" - }, - "application/mbms-protection-description+xml": { - "source": "iana" - }, - "application/mbms-reception-report+xml": { - "source": "iana" - }, - "application/mbms-register+xml": { - "source": "iana" - }, - "application/mbms-register-response+xml": { - "source": "iana" - }, - "application/mbms-schedule+xml": { - "source": "iana" - }, - "application/mbms-user-service-description+xml": { - "source": "iana" - }, - "application/mbox": { - "source": "iana", - "extensions": ["mbox"] - }, - "application/media-policy-dataset+xml": { - "source": "iana" - }, - "application/media_control+xml": { - "source": "iana" - }, - "application/mediaservercontrol+xml": { - "source": "iana", - "extensions": ["mscml"] - }, - "application/merge-patch+json": { - "source": "iana", - "compressible": true - }, - "application/metalink+xml": { - "source": "apache", - "extensions": ["metalink"] - }, - "application/metalink4+xml": { - "source": "iana", - "extensions": ["meta4"] - }, - "application/mets+xml": { - "source": "iana", - "extensions": ["mets"] - }, - "application/mf4": { - "source": "iana" - }, - "application/mikey": { - "source": "iana" - }, - "application/mods+xml": { - "source": "iana", - "extensions": ["mods"] - }, - "application/moss-keys": { - "source": "iana" - }, - "application/moss-signature": { - "source": "iana" - }, - "application/mosskey-data": { - "source": "iana" - }, - "application/mosskey-request": { - "source": "iana" - }, - "application/mp21": { - "source": "iana", - "extensions": ["m21","mp21"] - }, - "application/mp4": { - "source": "iana", - "extensions": ["mp4s","m4p"] - }, - "application/mpeg4-generic": { - "source": "iana" - }, - "application/mpeg4-iod": { - "source": "iana" - }, - "application/mpeg4-iod-xmt": { - "source": "iana" - }, - "application/mrb-consumer+xml": { - "source": "iana" - }, - "application/mrb-publish+xml": { - "source": "iana" - }, - "application/msc-ivr+xml": { - "source": "iana" - }, - "application/msc-mixer+xml": { - "source": "iana" - }, - "application/msword": { - "source": "iana", - "compressible": false, - "extensions": ["doc","dot"] - }, - "application/mxf": { - "source": "iana", - "extensions": ["mxf"] - }, - "application/nasdata": { - "source": "iana" - }, - "application/news-checkgroups": { - "source": "iana" - }, - "application/news-groupinfo": { - "source": "iana" - }, - "application/news-transmission": { - "source": "iana" - }, - "application/nlsml+xml": { - "source": "iana" - }, - "application/nss": { - "source": "iana" - }, - "application/ocsp-request": { - "source": "iana" - }, - "application/ocsp-response": { - "source": "iana" - }, - "application/octet-stream": { - "source": "iana", - "compressible": false, - "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"] - }, - "application/oda": { - "source": "iana", - "extensions": ["oda"] - }, - "application/odx": { - "source": "iana" - }, - "application/oebps-package+xml": { - "source": "iana", - "extensions": ["opf"] - }, - "application/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["ogx"] - }, - "application/omdoc+xml": { - "source": "apache", - "extensions": ["omdoc"] - }, - "application/onenote": { - "source": "apache", - "extensions": ["onetoc","onetoc2","onetmp","onepkg"] - }, - "application/oxps": { - "source": "iana", - "extensions": ["oxps"] - }, - "application/p2p-overlay+xml": { - "source": "iana" - }, - "application/parityfec": { - "source": "iana" - }, - "application/patch-ops-error+xml": { - "source": "iana", - "extensions": ["xer"] - }, - "application/pdf": { - "source": "iana", - "compressible": false, - "extensions": ["pdf"] - }, - "application/pdx": { - "source": "iana" - }, - "application/pgp-encrypted": { - "source": "iana", - "compressible": false, - "extensions": ["pgp"] - }, - "application/pgp-keys": { - "source": "iana" - }, - "application/pgp-signature": { - "source": "iana", - "extensions": ["asc","sig"] - }, - "application/pics-rules": { - "source": "apache", - "extensions": ["prf"] - }, - "application/pidf+xml": { - "source": "iana" - }, - "application/pidf-diff+xml": { - "source": "iana" - }, - "application/pkcs10": { - "source": "iana", - "extensions": ["p10"] - }, - "application/pkcs12": { - "source": "iana" - }, - "application/pkcs7-mime": { - "source": "iana", - "extensions": ["p7m","p7c"] - }, - "application/pkcs7-signature": { - "source": "iana", - "extensions": ["p7s"] - }, - "application/pkcs8": { - "source": "iana", - "extensions": ["p8"] - }, - "application/pkix-attr-cert": { - "source": "iana", - "extensions": ["ac"] - }, - "application/pkix-cert": { - "source": "iana", - "extensions": ["cer"] - }, - "application/pkix-crl": { - "source": "iana", - "extensions": ["crl"] - }, - "application/pkix-pkipath": { - "source": "iana", - "extensions": ["pkipath"] - }, - "application/pkixcmp": { - "source": "iana", - "extensions": ["pki"] - }, - "application/pls+xml": { - "source": "iana", - "extensions": ["pls"] - }, - "application/poc-settings+xml": { - "source": "iana" - }, - "application/postscript": { - "source": "iana", - "compressible": true, - "extensions": ["ai","eps","ps"] - }, - "application/provenance+xml": { - "source": "iana" - }, - "application/prs.alvestrand.titrax-sheet": { - "source": "iana" - }, - "application/prs.cww": { - "source": "iana", - "extensions": ["cww"] - }, - "application/prs.hpub+zip": { - "source": "iana" - }, - "application/prs.nprend": { - "source": "iana" - }, - "application/prs.plucker": { - "source": "iana" - }, - "application/prs.rdf-xml-crypt": { - "source": "iana" - }, - "application/prs.xsf+xml": { - "source": "iana" - }, - "application/pskc+xml": { - "source": "iana", - "extensions": ["pskcxml"] - }, - "application/qsig": { - "source": "iana" - }, - "application/raptorfec": { - "source": "iana" - }, - "application/rdap+json": { - "source": "iana", - "compressible": true - }, - "application/rdf+xml": { - "source": "iana", - "compressible": true, - "extensions": ["rdf"] - }, - "application/reginfo+xml": { - "source": "iana", - "extensions": ["rif"] - }, - "application/relax-ng-compact-syntax": { - "source": "iana", - "extensions": ["rnc"] - }, - "application/remote-printing": { - "source": "iana" - }, - "application/reputon+json": { - "source": "iana", - "compressible": true - }, - "application/resource-lists+xml": { - "source": "iana", - "extensions": ["rl"] - }, - "application/resource-lists-diff+xml": { - "source": "iana", - "extensions": ["rld"] - }, - "application/riscos": { - "source": "iana" - }, - "application/rlmi+xml": { - "source": "iana" - }, - "application/rls-services+xml": { - "source": "iana", - "extensions": ["rs"] - }, - "application/rpki-ghostbusters": { - "source": "iana", - "extensions": ["gbr"] - }, - "application/rpki-manifest": { - "source": "iana", - "extensions": ["mft"] - }, - "application/rpki-roa": { - "source": "iana", - "extensions": ["roa"] - }, - "application/rpki-updown": { - "source": "iana" - }, - "application/rsd+xml": { - "source": "apache", - "extensions": ["rsd"] - }, - "application/rss+xml": { - "source": "apache", - "compressible": true, - "extensions": ["rss"] - }, - "application/rtf": { - "source": "iana", - "compressible": true, - "extensions": ["rtf"] - }, - "application/rtploopback": { - "source": "iana" - }, - "application/rtx": { - "source": "iana" - }, - "application/samlassertion+xml": { - "source": "iana" - }, - "application/samlmetadata+xml": { - "source": "iana" - }, - "application/sbml+xml": { - "source": "iana", - "extensions": ["sbml"] - }, - "application/scaip+xml": { - "source": "iana" - }, - "application/scim+json": { - "source": "iana", - "compressible": true - }, - "application/scvp-cv-request": { - "source": "iana", - "extensions": ["scq"] - }, - "application/scvp-cv-response": { - "source": "iana", - "extensions": ["scs"] - }, - "application/scvp-vp-request": { - "source": "iana", - "extensions": ["spq"] - }, - "application/scvp-vp-response": { - "source": "iana", - "extensions": ["spp"] - }, - "application/sdp": { - "source": "iana", - "extensions": ["sdp"] - }, - "application/sep+xml": { - "source": "iana" - }, - "application/sep-exi": { - "source": "iana" - }, - "application/session-info": { - "source": "iana" - }, - "application/set-payment": { - "source": "iana" - }, - "application/set-payment-initiation": { - "source": "iana", - "extensions": ["setpay"] - }, - "application/set-registration": { - "source": "iana" - }, - "application/set-registration-initiation": { - "source": "iana", - "extensions": ["setreg"] - }, - "application/sgml": { - "source": "iana" - }, - "application/sgml-open-catalog": { - "source": "iana" - }, - "application/shf+xml": { - "source": "iana", - "extensions": ["shf"] - }, - "application/sieve": { - "source": "iana" - }, - "application/simple-filter+xml": { - "source": "iana" - }, - "application/simple-message-summary": { - "source": "iana" - }, - "application/simplesymbolcontainer": { - "source": "iana" - }, - "application/slate": { - "source": "iana" - }, - "application/smil": { - "source": "iana" - }, - "application/smil+xml": { - "source": "iana", - "extensions": ["smi","smil"] - }, - "application/smpte336m": { - "source": "iana" - }, - "application/soap+fastinfoset": { - "source": "iana" - }, - "application/soap+xml": { - "source": "iana", - "compressible": true - }, - "application/sparql-query": { - "source": "iana", - "extensions": ["rq"] - }, - "application/sparql-results+xml": { - "source": "iana", - "extensions": ["srx"] - }, - "application/spirits-event+xml": { - "source": "iana" - }, - "application/sql": { - "source": "iana" - }, - "application/srgs": { - "source": "iana", - "extensions": ["gram"] - }, - "application/srgs+xml": { - "source": "iana", - "extensions": ["grxml"] - }, - "application/sru+xml": { - "source": "iana", - "extensions": ["sru"] - }, - "application/ssdl+xml": { - "source": "apache", - "extensions": ["ssdl"] - }, - "application/ssml+xml": { - "source": "iana", - "extensions": ["ssml"] - }, - "application/tamp-apex-update": { - "source": "iana" - }, - "application/tamp-apex-update-confirm": { - "source": "iana" - }, - "application/tamp-community-update": { - "source": "iana" - }, - "application/tamp-community-update-confirm": { - "source": "iana" - }, - "application/tamp-error": { - "source": "iana" - }, - "application/tamp-sequence-adjust": { - "source": "iana" - }, - "application/tamp-sequence-adjust-confirm": { - "source": "iana" - }, - "application/tamp-status-query": { - "source": "iana" - }, - "application/tamp-status-response": { - "source": "iana" - }, - "application/tamp-update": { - "source": "iana" - }, - "application/tamp-update-confirm": { - "source": "iana" - }, - "application/tar": { - "compressible": true - }, - "application/tei+xml": { - "source": "iana", - "extensions": ["tei","teicorpus"] - }, - "application/thraud+xml": { - "source": "iana", - "extensions": ["tfi"] - }, - "application/timestamp-query": { - "source": "iana" - }, - "application/timestamp-reply": { - "source": "iana" - }, - "application/timestamped-data": { - "source": "iana", - "extensions": ["tsd"] - }, - "application/ttml+xml": { - "source": "iana" - }, - "application/tve-trigger": { - "source": "iana" - }, - "application/ulpfec": { - "source": "iana" - }, - "application/urc-grpsheet+xml": { - "source": "iana" - }, - "application/urc-ressheet+xml": { - "source": "iana" - }, - "application/urc-targetdesc+xml": { - "source": "iana" - }, - "application/urc-uisocketdesc+xml": { - "source": "iana" - }, - "application/vcard+json": { - "source": "iana", - "compressible": true - }, - "application/vcard+xml": { - "source": "iana" - }, - "application/vemmi": { - "source": "iana" - }, - "application/vividence.scriptfile": { - "source": "apache" - }, - "application/vnd.3gpp-prose+xml": { - "source": "iana" - }, - "application/vnd.3gpp.bsf+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mid-call+xml": { - "source": "iana" - }, - "application/vnd.3gpp.pic-bw-large": { - "source": "iana", - "extensions": ["plb"] - }, - "application/vnd.3gpp.pic-bw-small": { - "source": "iana", - "extensions": ["psb"] - }, - "application/vnd.3gpp.pic-bw-var": { - "source": "iana", - "extensions": ["pvb"] - }, - "application/vnd.3gpp.sms": { - "source": "iana" - }, - "application/vnd.3gpp.state-and-event-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.ussd+xml": { - "source": "iana" - }, - "application/vnd.3gpp2.bcmcsinfo+xml": { - "source": "iana" - }, - "application/vnd.3gpp2.sms": { - "source": "iana" - }, - "application/vnd.3gpp2.tcap": { - "source": "iana", - "extensions": ["tcap"] - }, - "application/vnd.3m.post-it-notes": { - "source": "iana", - "extensions": ["pwn"] - }, - "application/vnd.accpac.simply.aso": { - "source": "iana", - "extensions": ["aso"] - }, - "application/vnd.accpac.simply.imp": { - "source": "iana", - "extensions": ["imp"] - }, - "application/vnd.acucobol": { - "source": "iana", - "extensions": ["acu"] - }, - "application/vnd.acucorp": { - "source": "iana", - "extensions": ["atc","acutc"] - }, - "application/vnd.adobe.air-application-installer-package+zip": { - "source": "apache", - "extensions": ["air"] - }, - "application/vnd.adobe.flash.movie": { - "source": "iana" - }, - "application/vnd.adobe.formscentral.fcdt": { - "source": "iana", - "extensions": ["fcdt"] - }, - "application/vnd.adobe.fxp": { - "source": "iana", - "extensions": ["fxp","fxpl"] - }, - "application/vnd.adobe.partial-upload": { - "source": "iana" - }, - "application/vnd.adobe.xdp+xml": { - "source": "iana", - "extensions": ["xdp"] - }, - "application/vnd.adobe.xfdf": { - "source": "iana", - "extensions": ["xfdf"] - }, - "application/vnd.aether.imp": { - "source": "iana" - }, - "application/vnd.ah-barcode": { - "source": "iana" - }, - "application/vnd.ahead.space": { - "source": "iana", - "extensions": ["ahead"] - }, - "application/vnd.airzip.filesecure.azf": { - "source": "iana", - "extensions": ["azf"] - }, - "application/vnd.airzip.filesecure.azs": { - "source": "iana", - "extensions": ["azs"] - }, - "application/vnd.amazon.ebook": { - "source": "apache", - "extensions": ["azw"] - }, - "application/vnd.americandynamics.acc": { - "source": "iana", - "extensions": ["acc"] - }, - "application/vnd.amiga.ami": { - "source": "iana", - "extensions": ["ami"] - }, - "application/vnd.amundsen.maze+xml": { - "source": "iana" - }, - "application/vnd.android.package-archive": { - "source": "apache", - "compressible": false, - "extensions": ["apk"] - }, - "application/vnd.anki": { - "source": "iana" - }, - "application/vnd.anser-web-certificate-issue-initiation": { - "source": "iana", - "extensions": ["cii"] - }, - "application/vnd.anser-web-funds-transfer-initiation": { - "source": "apache", - "extensions": ["fti"] - }, - "application/vnd.antix.game-component": { - "source": "iana", - "extensions": ["atx"] - }, - "application/vnd.apache.thrift.binary": { - "source": "iana" - }, - "application/vnd.apache.thrift.compact": { - "source": "iana" - }, - "application/vnd.apache.thrift.json": { - "source": "iana" - }, - "application/vnd.api+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.apple.installer+xml": { - "source": "iana", - "extensions": ["mpkg"] - }, - "application/vnd.apple.mpegurl": { - "source": "iana", - "extensions": ["m3u8"] - }, - "application/vnd.arastra.swi": { - "source": "iana" - }, - "application/vnd.aristanetworks.swi": { - "source": "iana", - "extensions": ["swi"] - }, - "application/vnd.artsquare": { - "source": "iana" - }, - "application/vnd.astraea-software.iota": { - "source": "iana", - "extensions": ["iota"] - }, - "application/vnd.audiograph": { - "source": "iana", - "extensions": ["aep"] - }, - "application/vnd.autopackage": { - "source": "iana" - }, - "application/vnd.avistar+xml": { - "source": "iana" - }, - "application/vnd.balsamiq.bmml+xml": { - "source": "iana" - }, - "application/vnd.balsamiq.bmpr": { - "source": "iana" - }, - "application/vnd.bekitzur-stech+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.biopax.rdf+xml": { - "source": "iana" - }, - "application/vnd.blueice.multipass": { - "source": "iana", - "extensions": ["mpm"] - }, - "application/vnd.bluetooth.ep.oob": { - "source": "iana" - }, - "application/vnd.bluetooth.le.oob": { - "source": "iana" - }, - "application/vnd.bmi": { - "source": "iana", - "extensions": ["bmi"] - }, - "application/vnd.businessobjects": { - "source": "iana", - "extensions": ["rep"] - }, - "application/vnd.cab-jscript": { - "source": "iana" - }, - "application/vnd.canon-cpdl": { - "source": "iana" - }, - "application/vnd.canon-lips": { - "source": "iana" - }, - "application/vnd.cendio.thinlinc.clientconf": { - "source": "iana" - }, - "application/vnd.century-systems.tcp_stream": { - "source": "iana" - }, - "application/vnd.chemdraw+xml": { - "source": "iana", - "extensions": ["cdxml"] - }, - "application/vnd.chipnuts.karaoke-mmd": { - "source": "iana", - "extensions": ["mmd"] - }, - "application/vnd.cinderella": { - "source": "iana", - "extensions": ["cdy"] - }, - "application/vnd.cirpack.isdn-ext": { - "source": "iana" - }, - "application/vnd.citationstyles.style+xml": { - "source": "iana" - }, - "application/vnd.claymore": { - "source": "iana", - "extensions": ["cla"] - }, - "application/vnd.cloanto.rp9": { - "source": "iana", - "extensions": ["rp9"] - }, - "application/vnd.clonk.c4group": { - "source": "iana", - "extensions": ["c4g","c4d","c4f","c4p","c4u"] - }, - "application/vnd.cluetrust.cartomobile-config": { - "source": "iana", - "extensions": ["c11amc"] - }, - "application/vnd.cluetrust.cartomobile-config-pkg": { - "source": "iana", - "extensions": ["c11amz"] - }, - "application/vnd.coffeescript": { - "source": "iana" - }, - "application/vnd.collection+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.collection.doc+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.collection.next+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.commerce-battelle": { - "source": "iana" - }, - "application/vnd.commonspace": { - "source": "iana", - "extensions": ["csp"] - }, - "application/vnd.contact.cmsg": { - "source": "iana", - "extensions": ["cdbcmsg"] - }, - "application/vnd.cosmocaller": { - "source": "iana", - "extensions": ["cmc"] - }, - "application/vnd.crick.clicker": { - "source": "iana", - "extensions": ["clkx"] - }, - "application/vnd.crick.clicker.keyboard": { - "source": "iana", - "extensions": ["clkk"] - }, - "application/vnd.crick.clicker.palette": { - "source": "iana", - "extensions": ["clkp"] - }, - "application/vnd.crick.clicker.template": { - "source": "iana", - "extensions": ["clkt"] - }, - "application/vnd.crick.clicker.wordbank": { - "source": "iana", - "extensions": ["clkw"] - }, - "application/vnd.criticaltools.wbs+xml": { - "source": "iana", - "extensions": ["wbs"] - }, - "application/vnd.ctc-posml": { - "source": "iana", - "extensions": ["pml"] - }, - "application/vnd.ctct.ws+xml": { - "source": "iana" - }, - "application/vnd.cups-pdf": { - "source": "iana" - }, - "application/vnd.cups-postscript": { - "source": "iana" - }, - "application/vnd.cups-ppd": { - "source": "iana", - "extensions": ["ppd"] - }, - "application/vnd.cups-raster": { - "source": "iana" - }, - "application/vnd.cups-raw": { - "source": "iana" - }, - "application/vnd.curl": { - "source": "iana" - }, - "application/vnd.curl.car": { - "source": "apache", - "extensions": ["car"] - }, - "application/vnd.curl.pcurl": { - "source": "apache", - "extensions": ["pcurl"] - }, - "application/vnd.cyan.dean.root+xml": { - "source": "iana" - }, - "application/vnd.cybank": { - "source": "iana" - }, - "application/vnd.dart": { - "source": "iana", - "compressible": true, - "extensions": ["dart"] - }, - "application/vnd.data-vision.rdz": { - "source": "iana", - "extensions": ["rdz"] - }, - "application/vnd.debian.binary-package": { - "source": "iana" - }, - "application/vnd.dece.data": { - "source": "iana", - "extensions": ["uvf","uvvf","uvd","uvvd"] - }, - "application/vnd.dece.ttml+xml": { - "source": "iana", - "extensions": ["uvt","uvvt"] - }, - "application/vnd.dece.unspecified": { - "source": "iana", - "extensions": ["uvx","uvvx"] - }, - "application/vnd.dece.zip": { - "source": "iana", - "extensions": ["uvz","uvvz"] - }, - "application/vnd.denovo.fcselayout-link": { - "source": "iana", - "extensions": ["fe_launch"] - }, - "application/vnd.desmume-movie": { - "source": "iana" - }, - "application/vnd.dir-bi.plate-dl-nosuffix": { - "source": "iana" - }, - "application/vnd.dm.delegation+xml": { - "source": "iana" - }, - "application/vnd.dna": { - "source": "iana", - "extensions": ["dna"] - }, - "application/vnd.document+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.dolby.mlp": { - "source": "apache", - "extensions": ["mlp"] - }, - "application/vnd.dolby.mobile.1": { - "source": "iana" - }, - "application/vnd.dolby.mobile.2": { - "source": "iana" - }, - "application/vnd.doremir.scorecloud-binary-document": { - "source": "iana" - }, - "application/vnd.dpgraph": { - "source": "iana", - "extensions": ["dpg"] - }, - "application/vnd.dreamfactory": { - "source": "iana", - "extensions": ["dfac"] - }, - "application/vnd.ds-keypoint": { - "source": "apache", - "extensions": ["kpxx"] - }, - "application/vnd.dtg.local": { - "source": "iana" - }, - "application/vnd.dtg.local.flash": { - "source": "iana" - }, - "application/vnd.dtg.local.html": { - "source": "iana" - }, - "application/vnd.dvb.ait": { - "source": "iana", - "extensions": ["ait"] - }, - "application/vnd.dvb.dvbj": { - "source": "iana" - }, - "application/vnd.dvb.esgcontainer": { - "source": "iana" - }, - "application/vnd.dvb.ipdcdftnotifaccess": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgaccess": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgaccess2": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgpdd": { - "source": "iana" - }, - "application/vnd.dvb.ipdcroaming": { - "source": "iana" - }, - "application/vnd.dvb.iptv.alfec-base": { - "source": "iana" - }, - "application/vnd.dvb.iptv.alfec-enhancement": { - "source": "iana" - }, - "application/vnd.dvb.notif-aggregate-root+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-container+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-generic+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-msglist+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-registration-request+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-registration-response+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-init+xml": { - "source": "iana" - }, - "application/vnd.dvb.pfr": { - "source": "iana" - }, - "application/vnd.dvb.service": { - "source": "iana", - "extensions": ["svc"] - }, - "application/vnd.dxr": { - "source": "iana" - }, - "application/vnd.dynageo": { - "source": "iana", - "extensions": ["geo"] - }, - "application/vnd.dzr": { - "source": "iana" - }, - "application/vnd.easykaraoke.cdgdownload": { - "source": "iana" - }, - "application/vnd.ecdis-update": { - "source": "iana" - }, - "application/vnd.ecowin.chart": { - "source": "iana", - "extensions": ["mag"] - }, - "application/vnd.ecowin.filerequest": { - "source": "iana" - }, - "application/vnd.ecowin.fileupdate": { - "source": "iana" - }, - "application/vnd.ecowin.series": { - "source": "iana" - }, - "application/vnd.ecowin.seriesrequest": { - "source": "iana" - }, - "application/vnd.ecowin.seriesupdate": { - "source": "iana" - }, - "application/vnd.emclient.accessrequest+xml": { - "source": "iana" - }, - "application/vnd.enliven": { - "source": "iana", - "extensions": ["nml"] - }, - "application/vnd.enphase.envoy": { - "source": "iana" - }, - "application/vnd.eprints.data+xml": { - "source": "iana" - }, - "application/vnd.epson.esf": { - "source": "iana", - "extensions": ["esf"] - }, - "application/vnd.epson.msf": { - "source": "iana", - "extensions": ["msf"] - }, - "application/vnd.epson.quickanime": { - "source": "iana", - "extensions": ["qam"] - }, - "application/vnd.epson.salt": { - "source": "iana", - "extensions": ["slt"] - }, - "application/vnd.epson.ssf": { - "source": "iana", - "extensions": ["ssf"] - }, - "application/vnd.ericsson.quickcall": { - "source": "iana" - }, - "application/vnd.eszigno3+xml": { - "source": "iana", - "extensions": ["es3","et3"] - }, - "application/vnd.etsi.aoc+xml": { - "source": "iana" - }, - "application/vnd.etsi.asic-e+zip": { - "source": "iana" - }, - "application/vnd.etsi.asic-s+zip": { - "source": "iana" - }, - "application/vnd.etsi.cug+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvcommand+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvdiscovery+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvprofile+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-bc+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-cod+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-npvr+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvservice+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsync+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvueprofile+xml": { - "source": "iana" - }, - "application/vnd.etsi.mcid+xml": { - "source": "iana" - }, - "application/vnd.etsi.mheg5": { - "source": "iana" - }, - "application/vnd.etsi.overload-control-policy-dataset+xml": { - "source": "iana" - }, - "application/vnd.etsi.pstn+xml": { - "source": "iana" - }, - "application/vnd.etsi.sci+xml": { - "source": "iana" - }, - "application/vnd.etsi.simservs+xml": { - "source": "iana" - }, - "application/vnd.etsi.timestamp-token": { - "source": "iana" - }, - "application/vnd.etsi.tsl+xml": { - "source": "iana" - }, - "application/vnd.etsi.tsl.der": { - "source": "iana" - }, - "application/vnd.eudora.data": { - "source": "iana" - }, - "application/vnd.ezpix-album": { - "source": "iana", - "extensions": ["ez2"] - }, - "application/vnd.ezpix-package": { - "source": "iana", - "extensions": ["ez3"] - }, - "application/vnd.f-secure.mobile": { - "source": "iana" - }, - "application/vnd.fastcopy-disk-image": { - "source": "iana" - }, - "application/vnd.fdf": { - "source": "iana", - "extensions": ["fdf"] - }, - "application/vnd.fdsn.mseed": { - "source": "iana", - "extensions": ["mseed"] - }, - "application/vnd.fdsn.seed": { - "source": "iana", - "extensions": ["seed","dataless"] - }, - "application/vnd.ffsns": { - "source": "iana" - }, - "application/vnd.fints": { - "source": "iana" - }, - "application/vnd.firemonkeys.cloudcell": { - "source": "iana" - }, - "application/vnd.flographit": { - "source": "iana", - "extensions": ["gph"] - }, - "application/vnd.fluxtime.clip": { - "source": "iana", - "extensions": ["ftc"] - }, - "application/vnd.font-fontforge-sfd": { - "source": "iana" - }, - "application/vnd.framemaker": { - "source": "iana", - "extensions": ["fm","frame","maker","book"] - }, - "application/vnd.frogans.fnc": { - "source": "iana", - "extensions": ["fnc"] - }, - "application/vnd.frogans.ltf": { - "source": "iana", - "extensions": ["ltf"] - }, - "application/vnd.fsc.weblaunch": { - "source": "iana", - "extensions": ["fsc"] - }, - "application/vnd.fujitsu.oasys": { - "source": "iana", - "extensions": ["oas"] - }, - "application/vnd.fujitsu.oasys2": { - "source": "iana", - "extensions": ["oa2"] - }, - "application/vnd.fujitsu.oasys3": { - "source": "iana", - "extensions": ["oa3"] - }, - "application/vnd.fujitsu.oasysgp": { - "source": "iana", - "extensions": ["fg5"] - }, - "application/vnd.fujitsu.oasysprs": { - "source": "iana", - "extensions": ["bh2"] - }, - "application/vnd.fujixerox.art-ex": { - "source": "iana" - }, - "application/vnd.fujixerox.art4": { - "source": "iana" - }, - "application/vnd.fujixerox.ddd": { - "source": "iana", - "extensions": ["ddd"] - }, - "application/vnd.fujixerox.docuworks": { - "source": "iana", - "extensions": ["xdw"] - }, - "application/vnd.fujixerox.docuworks.binder": { - "source": "iana", - "extensions": ["xbd"] - }, - "application/vnd.fujixerox.docuworks.container": { - "source": "iana" - }, - "application/vnd.fujixerox.hbpl": { - "source": "iana" - }, - "application/vnd.fut-misnet": { - "source": "iana" - }, - "application/vnd.fuzzysheet": { - "source": "iana", - "extensions": ["fzs"] - }, - "application/vnd.genomatix.tuxedo": { - "source": "iana", - "extensions": ["txd"] - }, - "application/vnd.geo+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.geocube+xml": { - "source": "iana" - }, - "application/vnd.geogebra.file": { - "source": "iana", - "extensions": ["ggb"] - }, - "application/vnd.geogebra.tool": { - "source": "iana", - "extensions": ["ggt"] - }, - "application/vnd.geometry-explorer": { - "source": "iana", - "extensions": ["gex","gre"] - }, - "application/vnd.geonext": { - "source": "iana", - "extensions": ["gxt"] - }, - "application/vnd.geoplan": { - "source": "iana", - "extensions": ["g2w"] - }, - "application/vnd.geospace": { - "source": "iana", - "extensions": ["g3w"] - }, - "application/vnd.gerber": { - "source": "iana" - }, - "application/vnd.globalplatform.card-content-mgt": { - "source": "iana" - }, - "application/vnd.globalplatform.card-content-mgt-response": { - "source": "iana" - }, - "application/vnd.gmx": { - "source": "iana", - "extensions": ["gmx"] - }, - "application/vnd.google-earth.kml+xml": { - "source": "iana", - "compressible": true, - "extensions": ["kml"] - }, - "application/vnd.google-earth.kmz": { - "source": "iana", - "compressible": false, - "extensions": ["kmz"] - }, - "application/vnd.gov.sk.e-form+xml": { - "source": "iana" - }, - "application/vnd.gov.sk.e-form+zip": { - "source": "iana" - }, - "application/vnd.gov.sk.xmldatacontainer+xml": { - "source": "iana" - }, - "application/vnd.grafeq": { - "source": "iana", - "extensions": ["gqf","gqs"] - }, - "application/vnd.gridmp": { - "source": "iana" - }, - "application/vnd.groove-account": { - "source": "iana", - "extensions": ["gac"] - }, - "application/vnd.groove-help": { - "source": "iana", - "extensions": ["ghf"] - }, - "application/vnd.groove-identity-message": { - "source": "iana", - "extensions": ["gim"] - }, - "application/vnd.groove-injector": { - "source": "iana", - "extensions": ["grv"] - }, - "application/vnd.groove-tool-message": { - "source": "iana", - "extensions": ["gtm"] - }, - "application/vnd.groove-tool-template": { - "source": "iana", - "extensions": ["tpl"] - }, - "application/vnd.groove-vcard": { - "source": "iana", - "extensions": ["vcg"] - }, - "application/vnd.hal+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hal+xml": { - "source": "iana", - "extensions": ["hal"] - }, - "application/vnd.handheld-entertainment+xml": { - "source": "iana", - "extensions": ["zmm"] - }, - "application/vnd.hbci": { - "source": "iana", - "extensions": ["hbci"] - }, - "application/vnd.hcl-bireports": { - "source": "iana" - }, - "application/vnd.heroku+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hhe.lesson-player": { - "source": "iana", - "extensions": ["les"] - }, - "application/vnd.hp-hpgl": { - "source": "iana", - "extensions": ["hpgl"] - }, - "application/vnd.hp-hpid": { - "source": "iana", - "extensions": ["hpid"] - }, - "application/vnd.hp-hps": { - "source": "iana", - "extensions": ["hps"] - }, - "application/vnd.hp-jlyt": { - "source": "iana", - "extensions": ["jlt"] - }, - "application/vnd.hp-pcl": { - "source": "iana", - "extensions": ["pcl"] - }, - "application/vnd.hp-pclxl": { - "source": "iana", - "extensions": ["pclxl"] - }, - "application/vnd.httphone": { - "source": "iana" - }, - "application/vnd.hydrostatix.sof-data": { - "source": "iana", - "extensions": ["sfd-hdstx"] - }, - "application/vnd.hyperdrive+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hzn-3d-crossword": { - "source": "iana" - }, - "application/vnd.ibm.afplinedata": { - "source": "iana" - }, - "application/vnd.ibm.electronic-media": { - "source": "iana" - }, - "application/vnd.ibm.minipay": { - "source": "iana", - "extensions": ["mpy"] - }, - "application/vnd.ibm.modcap": { - "source": "iana", - "extensions": ["afp","listafp","list3820"] - }, - "application/vnd.ibm.rights-management": { - "source": "iana", - "extensions": ["irm"] - }, - "application/vnd.ibm.secure-container": { - "source": "iana", - "extensions": ["sc"] - }, - "application/vnd.iccprofile": { - "source": "iana", - "extensions": ["icc","icm"] - }, - "application/vnd.ieee.1905": { - "source": "iana" - }, - "application/vnd.igloader": { - "source": "iana", - "extensions": ["igl"] - }, - "application/vnd.immervision-ivp": { - "source": "iana", - "extensions": ["ivp"] - }, - "application/vnd.immervision-ivu": { - "source": "iana", - "extensions": ["ivu"] - }, - "application/vnd.ims.imsccv1p1": { - "source": "iana" - }, - "application/vnd.ims.imsccv1p2": { - "source": "iana" - }, - "application/vnd.ims.imsccv1p3": { - "source": "iana" - }, - "application/vnd.ims.lis.v2.result+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolconsumerprofile+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolproxy+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolproxy.id+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolsettings+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolsettings.simple+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.informedcontrol.rms+xml": { - "source": "iana" - }, - "application/vnd.informix-visionary": { - "source": "iana" - }, - "application/vnd.infotech.project": { - "source": "iana" - }, - "application/vnd.infotech.project+xml": { - "source": "iana" - }, - "application/vnd.innopath.wamp.notification": { - "source": "iana" - }, - "application/vnd.insors.igm": { - "source": "iana", - "extensions": ["igm"] - }, - "application/vnd.intercon.formnet": { - "source": "iana", - "extensions": ["xpw","xpx"] - }, - "application/vnd.intergeo": { - "source": "iana", - "extensions": ["i2g"] - }, - "application/vnd.intertrust.digibox": { - "source": "iana" - }, - "application/vnd.intertrust.nncp": { - "source": "iana" - }, - "application/vnd.intu.qbo": { - "source": "iana", - "extensions": ["qbo"] - }, - "application/vnd.intu.qfx": { - "source": "iana", - "extensions": ["qfx"] - }, - "application/vnd.iptc.g2.catalogitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.conceptitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.knowledgeitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.newsitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.newsmessage+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.packageitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.planningitem+xml": { - "source": "iana" - }, - "application/vnd.ipunplugged.rcprofile": { - "source": "iana", - "extensions": ["rcprofile"] - }, - "application/vnd.irepository.package+xml": { - "source": "iana", - "extensions": ["irp"] - }, - "application/vnd.is-xpr": { - "source": "iana", - "extensions": ["xpr"] - }, - "application/vnd.isac.fcs": { - "source": "iana", - "extensions": ["fcs"] - }, - "application/vnd.jam": { - "source": "iana", - "extensions": ["jam"] - }, - "application/vnd.japannet-directory-service": { - "source": "iana" - }, - "application/vnd.japannet-jpnstore-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-payment-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-registration": { - "source": "iana" - }, - "application/vnd.japannet-registration-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-setstore-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-verification": { - "source": "iana" - }, - "application/vnd.japannet-verification-wakeup": { - "source": "iana" - }, - "application/vnd.jcp.javame.midlet-rms": { - "source": "iana", - "extensions": ["rms"] - }, - "application/vnd.jisp": { - "source": "iana", - "extensions": ["jisp"] - }, - "application/vnd.joost.joda-archive": { - "source": "iana", - "extensions": ["joda"] - }, - "application/vnd.jsk.isdn-ngn": { - "source": "iana" - }, - "application/vnd.kahootz": { - "source": "iana", - "extensions": ["ktz","ktr"] - }, - "application/vnd.kde.karbon": { - "source": "iana", - "extensions": ["karbon"] - }, - "application/vnd.kde.kchart": { - "source": "iana", - "extensions": ["chrt"] - }, - "application/vnd.kde.kformula": { - "source": "iana", - "extensions": ["kfo"] - }, - "application/vnd.kde.kivio": { - "source": "iana", - "extensions": ["flw"] - }, - "application/vnd.kde.kontour": { - "source": "iana", - "extensions": ["kon"] - }, - "application/vnd.kde.kpresenter": { - "source": "iana", - "extensions": ["kpr","kpt"] - }, - "application/vnd.kde.kspread": { - "source": "iana", - "extensions": ["ksp"] - }, - "application/vnd.kde.kword": { - "source": "iana", - "extensions": ["kwd","kwt"] - }, - "application/vnd.kenameaapp": { - "source": "iana", - "extensions": ["htke"] - }, - "application/vnd.kidspiration": { - "source": "iana", - "extensions": ["kia"] - }, - "application/vnd.kinar": { - "source": "iana", - "extensions": ["kne","knp"] - }, - "application/vnd.koan": { - "source": "iana", - "extensions": ["skp","skd","skt","skm"] - }, - "application/vnd.kodak-descriptor": { - "source": "iana", - "extensions": ["sse"] - }, - "application/vnd.las.las+xml": { - "source": "iana", - "extensions": ["lasxml"] - }, - "application/vnd.liberty-request+xml": { - "source": "iana" - }, - "application/vnd.llamagraphics.life-balance.desktop": { - "source": "iana", - "extensions": ["lbd"] - }, - "application/vnd.llamagraphics.life-balance.exchange+xml": { - "source": "iana", - "extensions": ["lbe"] - }, - "application/vnd.lotus-1-2-3": { - "source": "iana", - "extensions": ["123"] - }, - "application/vnd.lotus-approach": { - "source": "iana", - "extensions": ["apr"] - }, - "application/vnd.lotus-freelance": { - "source": "iana", - "extensions": ["pre"] - }, - "application/vnd.lotus-notes": { - "source": "iana", - "extensions": ["nsf"] - }, - "application/vnd.lotus-organizer": { - "source": "iana", - "extensions": ["org"] - }, - "application/vnd.lotus-screencam": { - "source": "iana", - "extensions": ["scm"] - }, - "application/vnd.lotus-wordpro": { - "source": "iana", - "extensions": ["lwp"] - }, - "application/vnd.macports.portpkg": { - "source": "iana", - "extensions": ["portpkg"] - }, - "application/vnd.marlin.drm.actiontoken+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.conftoken+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.license+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.mdcf": { - "source": "iana" - }, - "application/vnd.mason+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.maxmind.maxmind-db": { - "source": "iana" - }, - "application/vnd.mcd": { - "source": "iana", - "extensions": ["mcd"] - }, - "application/vnd.medcalcdata": { - "source": "iana", - "extensions": ["mc1"] - }, - "application/vnd.mediastation.cdkey": { - "source": "iana", - "extensions": ["cdkey"] - }, - "application/vnd.meridian-slingshot": { - "source": "iana" - }, - "application/vnd.mfer": { - "source": "iana", - "extensions": ["mwf"] - }, - "application/vnd.mfmp": { - "source": "iana", - "extensions": ["mfm"] - }, - "application/vnd.micro+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.micrografx.flo": { - "source": "iana", - "extensions": ["flo"] - }, - "application/vnd.micrografx.igx": { - "source": "iana", - "extensions": ["igx"] - }, - "application/vnd.microsoft.portable-executable": { - "source": "iana" - }, - "application/vnd.miele+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.mif": { - "source": "iana", - "extensions": ["mif"] - }, - "application/vnd.minisoft-hp3000-save": { - "source": "iana" - }, - "application/vnd.mitsubishi.misty-guard.trustweb": { - "source": "iana" - }, - "application/vnd.mobius.daf": { - "source": "iana", - "extensions": ["daf"] - }, - "application/vnd.mobius.dis": { - "source": "iana", - "extensions": ["dis"] - }, - "application/vnd.mobius.mbk": { - "source": "iana", - "extensions": ["mbk"] - }, - "application/vnd.mobius.mqy": { - "source": "iana", - "extensions": ["mqy"] - }, - "application/vnd.mobius.msl": { - "source": "iana", - "extensions": ["msl"] - }, - "application/vnd.mobius.plc": { - "source": "iana", - "extensions": ["plc"] - }, - "application/vnd.mobius.txf": { - "source": "iana", - "extensions": ["txf"] - }, - "application/vnd.mophun.application": { - "source": "iana", - "extensions": ["mpn"] - }, - "application/vnd.mophun.certificate": { - "source": "iana", - "extensions": ["mpc"] - }, - "application/vnd.motorola.flexsuite": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.adsi": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.fis": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.gotap": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.kmr": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.ttc": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.wem": { - "source": "iana" - }, - "application/vnd.motorola.iprm": { - "source": "iana" - }, - "application/vnd.mozilla.xul+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xul"] - }, - "application/vnd.ms-3mfdocument": { - "source": "iana" - }, - "application/vnd.ms-artgalry": { - "source": "iana", - "extensions": ["cil"] - }, - "application/vnd.ms-asf": { - "source": "iana" - }, - "application/vnd.ms-cab-compressed": { - "source": "iana", - "extensions": ["cab"] - }, - "application/vnd.ms-color.iccprofile": { - "source": "apache" - }, - "application/vnd.ms-excel": { - "source": "iana", - "compressible": false, - "extensions": ["xls","xlm","xla","xlc","xlt","xlw"] - }, - "application/vnd.ms-excel.addin.macroenabled.12": { - "source": "iana", - "extensions": ["xlam"] - }, - "application/vnd.ms-excel.sheet.binary.macroenabled.12": { - "source": "iana", - "extensions": ["xlsb"] - }, - "application/vnd.ms-excel.sheet.macroenabled.12": { - "source": "iana", - "extensions": ["xlsm"] - }, - "application/vnd.ms-excel.template.macroenabled.12": { - "source": "iana", - "extensions": ["xltm"] - }, - "application/vnd.ms-fontobject": { - "source": "iana", - "compressible": true, - "extensions": ["eot"] - }, - "application/vnd.ms-htmlhelp": { - "source": "iana", - "extensions": ["chm"] - }, - "application/vnd.ms-ims": { - "source": "iana", - "extensions": ["ims"] - }, - "application/vnd.ms-lrm": { - "source": "iana", - "extensions": ["lrm"] - }, - "application/vnd.ms-office.activex+xml": { - "source": "iana" - }, - "application/vnd.ms-officetheme": { - "source": "iana", - "extensions": ["thmx"] - }, - "application/vnd.ms-opentype": { - "source": "apache", - "compressible": true - }, - "application/vnd.ms-package.obfuscated-opentype": { - "source": "apache" - }, - "application/vnd.ms-pki.seccat": { - "source": "apache", - "extensions": ["cat"] - }, - "application/vnd.ms-pki.stl": { - "source": "apache", - "extensions": ["stl"] - }, - "application/vnd.ms-playready.initiator+xml": { - "source": "iana" - }, - "application/vnd.ms-powerpoint": { - "source": "iana", - "compressible": false, - "extensions": ["ppt","pps","pot"] - }, - "application/vnd.ms-powerpoint.addin.macroenabled.12": { - "source": "iana", - "extensions": ["ppam"] - }, - "application/vnd.ms-powerpoint.presentation.macroenabled.12": { - "source": "iana", - "extensions": ["pptm"] - }, - "application/vnd.ms-powerpoint.slide.macroenabled.12": { - "source": "iana", - "extensions": ["sldm"] - }, - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": { - "source": "iana", - "extensions": ["ppsm"] - }, - "application/vnd.ms-powerpoint.template.macroenabled.12": { - "source": "iana", - "extensions": ["potm"] - }, - "application/vnd.ms-printing.printticket+xml": { - "source": "apache" - }, - "application/vnd.ms-project": { - "source": "iana", - "extensions": ["mpp","mpt"] - }, - "application/vnd.ms-tnef": { - "source": "iana" - }, - "application/vnd.ms-windows.printerpairing": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.lic-chlg-req": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.lic-resp": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.meter-chlg-req": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.meter-resp": { - "source": "iana" - }, - "application/vnd.ms-word.document.macroenabled.12": { - "source": "iana", - "extensions": ["docm"] - }, - "application/vnd.ms-word.template.macroenabled.12": { - "source": "iana", - "extensions": ["dotm"] - }, - "application/vnd.ms-works": { - "source": "iana", - "extensions": ["wps","wks","wcm","wdb"] - }, - "application/vnd.ms-wpl": { - "source": "iana", - "extensions": ["wpl"] - }, - "application/vnd.ms-xpsdocument": { - "source": "iana", - "compressible": false, - "extensions": ["xps"] - }, - "application/vnd.msa-disk-image": { - "source": "iana" - }, - "application/vnd.mseq": { - "source": "iana", - "extensions": ["mseq"] - }, - "application/vnd.msign": { - "source": "iana" - }, - "application/vnd.multiad.creator": { - "source": "iana" - }, - "application/vnd.multiad.creator.cif": { - "source": "iana" - }, - "application/vnd.music-niff": { - "source": "iana" - }, - "application/vnd.musician": { - "source": "iana", - "extensions": ["mus"] - }, - "application/vnd.muvee.style": { - "source": "iana", - "extensions": ["msty"] - }, - "application/vnd.mynfc": { - "source": "iana", - "extensions": ["taglet"] - }, - "application/vnd.ncd.control": { - "source": "iana" - }, - "application/vnd.ncd.reference": { - "source": "iana" - }, - "application/vnd.nervana": { - "source": "iana" - }, - "application/vnd.netfpx": { - "source": "iana" - }, - "application/vnd.neurolanguage.nlu": { - "source": "iana", - "extensions": ["nlu"] - }, - "application/vnd.nintendo.nitro.rom": { - "source": "iana" - }, - "application/vnd.nintendo.snes.rom": { - "source": "iana" - }, - "application/vnd.nitf": { - "source": "iana", - "extensions": ["ntf","nitf"] - }, - "application/vnd.noblenet-directory": { - "source": "iana", - "extensions": ["nnd"] - }, - "application/vnd.noblenet-sealer": { - "source": "iana", - "extensions": ["nns"] - }, - "application/vnd.noblenet-web": { - "source": "iana", - "extensions": ["nnw"] - }, - "application/vnd.nokia.catalogs": { - "source": "iana" - }, - "application/vnd.nokia.conml+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.conml+xml": { - "source": "iana" - }, - "application/vnd.nokia.iptv.config+xml": { - "source": "iana" - }, - "application/vnd.nokia.isds-radio-presets": { - "source": "iana" - }, - "application/vnd.nokia.landmark+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.landmark+xml": { - "source": "iana" - }, - "application/vnd.nokia.landmarkcollection+xml": { - "source": "iana" - }, - "application/vnd.nokia.n-gage.ac+xml": { - "source": "iana" - }, - "application/vnd.nokia.n-gage.data": { - "source": "iana", - "extensions": ["ngdat"] - }, - "application/vnd.nokia.n-gage.symbian.install": { - "source": "iana", - "extensions": ["n-gage"] - }, - "application/vnd.nokia.ncd": { - "source": "iana" - }, - "application/vnd.nokia.pcd+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.pcd+xml": { - "source": "iana" - }, - "application/vnd.nokia.radio-preset": { - "source": "iana", - "extensions": ["rpst"] - }, - "application/vnd.nokia.radio-presets": { - "source": "iana", - "extensions": ["rpss"] - }, - "application/vnd.novadigm.edm": { - "source": "iana", - "extensions": ["edm"] - }, - "application/vnd.novadigm.edx": { - "source": "iana", - "extensions": ["edx"] - }, - "application/vnd.novadigm.ext": { - "source": "iana", - "extensions": ["ext"] - }, - "application/vnd.ntt-local.content-share": { - "source": "iana" - }, - "application/vnd.ntt-local.file-transfer": { - "source": "iana" - }, - "application/vnd.ntt-local.ogw_remote-access": { - "source": "iana" - }, - "application/vnd.ntt-local.sip-ta_remote": { - "source": "iana" - }, - "application/vnd.ntt-local.sip-ta_tcp_stream": { - "source": "iana" - }, - "application/vnd.oasis.opendocument.chart": { - "source": "iana", - "extensions": ["odc"] - }, - "application/vnd.oasis.opendocument.chart-template": { - "source": "iana", - "extensions": ["otc"] - }, - "application/vnd.oasis.opendocument.database": { - "source": "iana", - "extensions": ["odb"] - }, - "application/vnd.oasis.opendocument.formula": { - "source": "iana", - "extensions": ["odf"] - }, - "application/vnd.oasis.opendocument.formula-template": { - "source": "iana", - "extensions": ["odft"] - }, - "application/vnd.oasis.opendocument.graphics": { - "source": "iana", - "compressible": false, - "extensions": ["odg"] - }, - "application/vnd.oasis.opendocument.graphics-template": { - "source": "iana", - "extensions": ["otg"] - }, - "application/vnd.oasis.opendocument.image": { - "source": "iana", - "extensions": ["odi"] - }, - "application/vnd.oasis.opendocument.image-template": { - "source": "iana", - "extensions": ["oti"] - }, - "application/vnd.oasis.opendocument.presentation": { - "source": "iana", - "compressible": false, - "extensions": ["odp"] - }, - "application/vnd.oasis.opendocument.presentation-template": { - "source": "iana", - "extensions": ["otp"] - }, - "application/vnd.oasis.opendocument.spreadsheet": { - "source": "iana", - "compressible": false, - "extensions": ["ods"] - }, - "application/vnd.oasis.opendocument.spreadsheet-template": { - "source": "iana", - "extensions": ["ots"] - }, - "application/vnd.oasis.opendocument.text": { - "source": "iana", - "compressible": false, - "extensions": ["odt"] - }, - "application/vnd.oasis.opendocument.text-master": { - "source": "iana", - "extensions": ["odm"] - }, - "application/vnd.oasis.opendocument.text-template": { - "source": "iana", - "extensions": ["ott"] - }, - "application/vnd.oasis.opendocument.text-web": { - "source": "iana", - "extensions": ["oth"] - }, - "application/vnd.obn": { - "source": "iana" - }, - "application/vnd.oftn.l10n+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.oipf.contentaccessdownload+xml": { - "source": "iana" - }, - "application/vnd.oipf.contentaccessstreaming+xml": { - "source": "iana" - }, - "application/vnd.oipf.cspg-hexbinary": { - "source": "iana" - }, - "application/vnd.oipf.dae.svg+xml": { - "source": "iana" - }, - "application/vnd.oipf.dae.xhtml+xml": { - "source": "iana" - }, - "application/vnd.oipf.mippvcontrolmessage+xml": { - "source": "iana" - }, - "application/vnd.oipf.pae.gem": { - "source": "iana" - }, - "application/vnd.oipf.spdiscovery+xml": { - "source": "iana" - }, - "application/vnd.oipf.spdlist+xml": { - "source": "iana" - }, - "application/vnd.oipf.ueprofile+xml": { - "source": "iana" - }, - "application/vnd.oipf.userprofile+xml": { - "source": "iana" - }, - "application/vnd.olpc-sugar": { - "source": "iana", - "extensions": ["xo"] - }, - "application/vnd.oma-scws-config": { - "source": "iana" - }, - "application/vnd.oma-scws-http-request": { - "source": "iana" - }, - "application/vnd.oma-scws-http-response": { - "source": "iana" - }, - "application/vnd.oma.bcast.associated-procedure-parameter+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.drm-trigger+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.imd+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.ltkm": { - "source": "iana" - }, - "application/vnd.oma.bcast.notification+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.provisioningtrigger": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgboot": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgdd+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgdu": { - "source": "iana" - }, - "application/vnd.oma.bcast.simple-symbol-container": { - "source": "iana" - }, - "application/vnd.oma.bcast.smartcard-trigger+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.sprov+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.stkm": { - "source": "iana" - }, - "application/vnd.oma.cab-address-book+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-feature-handler+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-pcc+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-subs-invite+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-user-prefs+xml": { - "source": "iana" - }, - "application/vnd.oma.dcd": { - "source": "iana" - }, - "application/vnd.oma.dcdc": { - "source": "iana" - }, - "application/vnd.oma.dd2+xml": { - "source": "iana", - "extensions": ["dd2"] - }, - "application/vnd.oma.drm.risd+xml": { - "source": "iana" - }, - "application/vnd.oma.group-usage-list+xml": { - "source": "iana" - }, - "application/vnd.oma.pal+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.detailed-progress-report+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.final-report+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.groups+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.invocation-descriptor+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.optimized-progress-report+xml": { - "source": "iana" - }, - "application/vnd.oma.push": { - "source": "iana" - }, - "application/vnd.oma.scidm.messages+xml": { - "source": "iana" - }, - "application/vnd.oma.xcap-directory+xml": { - "source": "iana" - }, - "application/vnd.omads-email+xml": { - "source": "iana" - }, - "application/vnd.omads-file+xml": { - "source": "iana" - }, - "application/vnd.omads-folder+xml": { - "source": "iana" - }, - "application/vnd.omaloc-supl-init": { - "source": "iana" - }, - "application/vnd.openblox.game+xml": { - "source": "iana" - }, - "application/vnd.openblox.game-binary": { - "source": "iana" - }, - "application/vnd.openeye.oeb": { - "source": "iana" - }, - "application/vnd.openofficeorg.extension": { - "source": "apache", - "extensions": ["oxt"] - }, - "application/vnd.openxmlformats-officedocument.custom-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawing+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.extended-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation": { - "source": "iana", - "compressible": false, - "extensions": ["pptx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slide": { - "source": "iana", - "extensions": ["sldx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": { - "source": "iana", - "extensions": ["ppsx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.template": { - "source": "apache", - "extensions": ["potx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { - "source": "iana", - "compressible": false, - "extensions": ["xlsx"] - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": { - "source": "apache", - "extensions": ["xltx"] - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.theme+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.themeoverride+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.vmldrawing": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { - "source": "iana", - "compressible": false, - "extensions": ["docx"] - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": { - "source": "apache", - "extensions": ["dotx"] - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.core-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.relationships+xml": { - "source": "iana" - }, - "application/vnd.oracle.resource+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.orange.indata": { - "source": "iana" - }, - "application/vnd.osa.netdeploy": { - "source": "iana" - }, - "application/vnd.osgeo.mapguide.package": { - "source": "iana", - "extensions": ["mgp"] - }, - "application/vnd.osgi.bundle": { - "source": "iana" - }, - "application/vnd.osgi.dp": { - "source": "iana", - "extensions": ["dp"] - }, - "application/vnd.osgi.subsystem": { - "source": "iana", - "extensions": ["esa"] - }, - "application/vnd.otps.ct-kip+xml": { - "source": "iana" - }, - "application/vnd.palm": { - "source": "iana", - "extensions": ["pdb","pqa","oprc"] - }, - "application/vnd.panoply": { - "source": "iana" - }, - "application/vnd.paos+xml": { - "source": "iana" - }, - "application/vnd.paos.xml": { - "source": "apache" - }, - "application/vnd.pawaafile": { - "source": "iana", - "extensions": ["paw"] - }, - "application/vnd.pcos": { - "source": "iana" - }, - "application/vnd.pg.format": { - "source": "iana", - "extensions": ["str"] - }, - "application/vnd.pg.osasli": { - "source": "iana", - "extensions": ["ei6"] - }, - "application/vnd.piaccess.application-licence": { - "source": "iana" - }, - "application/vnd.picsel": { - "source": "iana", - "extensions": ["efif"] - }, - "application/vnd.pmi.widget": { - "source": "iana", - "extensions": ["wg"] - }, - "application/vnd.poc.group-advertisement+xml": { - "source": "iana" - }, - "application/vnd.pocketlearn": { - "source": "iana", - "extensions": ["plf"] - }, - "application/vnd.powerbuilder6": { - "source": "iana", - "extensions": ["pbd"] - }, - "application/vnd.powerbuilder6-s": { - "source": "iana" - }, - "application/vnd.powerbuilder7": { - "source": "iana" - }, - "application/vnd.powerbuilder7-s": { - "source": "iana" - }, - "application/vnd.powerbuilder75": { - "source": "iana" - }, - "application/vnd.powerbuilder75-s": { - "source": "iana" - }, - "application/vnd.preminet": { - "source": "iana" - }, - "application/vnd.previewsystems.box": { - "source": "iana", - "extensions": ["box"] - }, - "application/vnd.proteus.magazine": { - "source": "iana", - "extensions": ["mgz"] - }, - "application/vnd.publishare-delta-tree": { - "source": "iana", - "extensions": ["qps"] - }, - "application/vnd.pvi.ptid1": { - "source": "iana", - "extensions": ["ptid"] - }, - "application/vnd.pwg-multiplexed": { - "source": "iana" - }, - "application/vnd.pwg-xhtml-print+xml": { - "source": "iana" - }, - "application/vnd.qualcomm.brew-app-res": { - "source": "iana" - }, - "application/vnd.quark.quarkxpress": { - "source": "iana", - "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"] - }, - "application/vnd.quobject-quoxdocument": { - "source": "iana" - }, - "application/vnd.radisys.moml+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-conf+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-conn+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-dialog+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-stream+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-conf+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-base+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-fax-detect+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-group+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-speech+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-transform+xml": { - "source": "iana" - }, - "application/vnd.rainstor.data": { - "source": "iana" - }, - "application/vnd.rapid": { - "source": "iana" - }, - "application/vnd.realvnc.bed": { - "source": "iana", - "extensions": ["bed"] - }, - "application/vnd.recordare.musicxml": { - "source": "iana", - "extensions": ["mxl"] - }, - "application/vnd.recordare.musicxml+xml": { - "source": "iana", - "extensions": ["musicxml"] - }, - "application/vnd.renlearn.rlprint": { - "source": "iana" - }, - "application/vnd.rig.cryptonote": { - "source": "iana", - "extensions": ["cryptonote"] - }, - "application/vnd.rim.cod": { - "source": "apache", - "extensions": ["cod"] - }, - "application/vnd.rn-realmedia": { - "source": "apache", - "extensions": ["rm"] - }, - "application/vnd.rn-realmedia-vbr": { - "source": "apache", - "extensions": ["rmvb"] - }, - "application/vnd.route66.link66+xml": { - "source": "iana", - "extensions": ["link66"] - }, - "application/vnd.rs-274x": { - "source": "iana" - }, - "application/vnd.ruckus.download": { - "source": "iana" - }, - "application/vnd.s3sms": { - "source": "iana" - }, - "application/vnd.sailingtracker.track": { - "source": "iana", - "extensions": ["st"] - }, - "application/vnd.sbm.cid": { - "source": "iana" - }, - "application/vnd.sbm.mid2": { - "source": "iana" - }, - "application/vnd.scribus": { - "source": "iana" - }, - "application/vnd.sealed.3df": { - "source": "iana" - }, - "application/vnd.sealed.csf": { - "source": "iana" - }, - "application/vnd.sealed.doc": { - "source": "iana" - }, - "application/vnd.sealed.eml": { - "source": "iana" - }, - "application/vnd.sealed.mht": { - "source": "iana" - }, - "application/vnd.sealed.net": { - "source": "iana" - }, - "application/vnd.sealed.ppt": { - "source": "iana" - }, - "application/vnd.sealed.tiff": { - "source": "iana" - }, - "application/vnd.sealed.xls": { - "source": "iana" - }, - "application/vnd.sealedmedia.softseal.html": { - "source": "iana" - }, - "application/vnd.sealedmedia.softseal.pdf": { - "source": "iana" - }, - "application/vnd.seemail": { - "source": "iana", - "extensions": ["see"] - }, - "application/vnd.sema": { - "source": "iana", - "extensions": ["sema"] - }, - "application/vnd.semd": { - "source": "iana", - "extensions": ["semd"] - }, - "application/vnd.semf": { - "source": "iana", - "extensions": ["semf"] - }, - "application/vnd.shana.informed.formdata": { - "source": "iana", - "extensions": ["ifm"] - }, - "application/vnd.shana.informed.formtemplate": { - "source": "iana", - "extensions": ["itp"] - }, - "application/vnd.shana.informed.interchange": { - "source": "iana", - "extensions": ["iif"] - }, - "application/vnd.shana.informed.package": { - "source": "iana", - "extensions": ["ipk"] - }, - "application/vnd.simtech-mindmapper": { - "source": "iana", - "extensions": ["twd","twds"] - }, - "application/vnd.siren+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.smaf": { - "source": "iana", - "extensions": ["mmf"] - }, - "application/vnd.smart.notebook": { - "source": "iana" - }, - "application/vnd.smart.teacher": { - "source": "iana", - "extensions": ["teacher"] - }, - "application/vnd.software602.filler.form+xml": { - "source": "iana" - }, - "application/vnd.software602.filler.form-xml-zip": { - "source": "iana" - }, - "application/vnd.solent.sdkm+xml": { - "source": "iana", - "extensions": ["sdkm","sdkd"] - }, - "application/vnd.spotfire.dxp": { - "source": "iana", - "extensions": ["dxp"] - }, - "application/vnd.spotfire.sfs": { - "source": "iana", - "extensions": ["sfs"] - }, - "application/vnd.sss-cod": { - "source": "iana" - }, - "application/vnd.sss-dtf": { - "source": "iana" - }, - "application/vnd.sss-ntf": { - "source": "iana" - }, - "application/vnd.stardivision.calc": { - "source": "apache", - "extensions": ["sdc"] - }, - "application/vnd.stardivision.draw": { - "source": "apache", - "extensions": ["sda"] - }, - "application/vnd.stardivision.impress": { - "source": "apache", - "extensions": ["sdd"] - }, - "application/vnd.stardivision.math": { - "source": "apache", - "extensions": ["smf"] - }, - "application/vnd.stardivision.writer": { - "source": "apache", - "extensions": ["sdw","vor"] - }, - "application/vnd.stardivision.writer-global": { - "source": "apache", - "extensions": ["sgl"] - }, - "application/vnd.stepmania.package": { - "source": "iana", - "extensions": ["smzip"] - }, - "application/vnd.stepmania.stepchart": { - "source": "iana", - "extensions": ["sm"] - }, - "application/vnd.street-stream": { - "source": "iana" - }, - "application/vnd.sun.wadl+xml": { - "source": "iana" - }, - "application/vnd.sun.xml.calc": { - "source": "apache", - "extensions": ["sxc"] - }, - "application/vnd.sun.xml.calc.template": { - "source": "apache", - "extensions": ["stc"] - }, - "application/vnd.sun.xml.draw": { - "source": "apache", - "extensions": ["sxd"] - }, - "application/vnd.sun.xml.draw.template": { - "source": "apache", - "extensions": ["std"] - }, - "application/vnd.sun.xml.impress": { - "source": "apache", - "extensions": ["sxi"] - }, - "application/vnd.sun.xml.impress.template": { - "source": "apache", - "extensions": ["sti"] - }, - "application/vnd.sun.xml.math": { - "source": "apache", - "extensions": ["sxm"] - }, - "application/vnd.sun.xml.writer": { - "source": "apache", - "extensions": ["sxw"] - }, - "application/vnd.sun.xml.writer.global": { - "source": "apache", - "extensions": ["sxg"] - }, - "application/vnd.sun.xml.writer.template": { - "source": "apache", - "extensions": ["stw"] - }, - "application/vnd.sus-calendar": { - "source": "iana", - "extensions": ["sus","susp"] - }, - "application/vnd.svd": { - "source": "iana", - "extensions": ["svd"] - }, - "application/vnd.swiftview-ics": { - "source": "iana" - }, - "application/vnd.symbian.install": { - "source": "apache", - "extensions": ["sis","sisx"] - }, - "application/vnd.syncml+xml": { - "source": "iana", - "extensions": ["xsm"] - }, - "application/vnd.syncml.dm+wbxml": { - "source": "iana", - "extensions": ["bdm"] - }, - "application/vnd.syncml.dm+xml": { - "source": "iana", - "extensions": ["xdm"] - }, - "application/vnd.syncml.dm.notification": { - "source": "iana" - }, - "application/vnd.syncml.dmddf+wbxml": { - "source": "iana" - }, - "application/vnd.syncml.dmddf+xml": { - "source": "iana" - }, - "application/vnd.syncml.dmtnds+wbxml": { - "source": "iana" - }, - "application/vnd.syncml.dmtnds+xml": { - "source": "iana" - }, - "application/vnd.syncml.ds.notification": { - "source": "iana" - }, - "application/vnd.tao.intent-module-archive": { - "source": "iana", - "extensions": ["tao"] - }, - "application/vnd.tcpdump.pcap": { - "source": "iana", - "extensions": ["pcap","cap","dmp"] - }, - "application/vnd.tmd.mediaflex.api+xml": { - "source": "iana" - }, - "application/vnd.tmobile-livetv": { - "source": "iana", - "extensions": ["tmo"] - }, - "application/vnd.trid.tpt": { - "source": "iana", - "extensions": ["tpt"] - }, - "application/vnd.triscape.mxs": { - "source": "iana", - "extensions": ["mxs"] - }, - "application/vnd.trueapp": { - "source": "iana", - "extensions": ["tra"] - }, - "application/vnd.truedoc": { - "source": "iana" - }, - "application/vnd.ubisoft.webplayer": { - "source": "iana" - }, - "application/vnd.ufdl": { - "source": "iana", - "extensions": ["ufd","ufdl"] - }, - "application/vnd.uiq.theme": { - "source": "iana", - "extensions": ["utz"] - }, - "application/vnd.umajin": { - "source": "iana", - "extensions": ["umj"] - }, - "application/vnd.unity": { - "source": "iana", - "extensions": ["unityweb"] - }, - "application/vnd.uoml+xml": { - "source": "iana", - "extensions": ["uoml"] - }, - "application/vnd.uplanet.alert": { - "source": "iana" - }, - "application/vnd.uplanet.alert-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.bearer-choice": { - "source": "iana" - }, - "application/vnd.uplanet.bearer-choice-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.cacheop": { - "source": "iana" - }, - "application/vnd.uplanet.cacheop-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.channel": { - "source": "iana" - }, - "application/vnd.uplanet.channel-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.list": { - "source": "iana" - }, - "application/vnd.uplanet.list-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.listcmd": { - "source": "iana" - }, - "application/vnd.uplanet.listcmd-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.signal": { - "source": "iana" - }, - "application/vnd.uri-map": { - "source": "iana" - }, - "application/vnd.valve.source.material": { - "source": "iana" - }, - "application/vnd.vcx": { - "source": "iana", - "extensions": ["vcx"] - }, - "application/vnd.vd-study": { - "source": "iana" - }, - "application/vnd.vectorworks": { - "source": "iana" - }, - "application/vnd.verimatrix.vcas": { - "source": "iana" - }, - "application/vnd.vidsoft.vidconference": { - "source": "iana" - }, - "application/vnd.visio": { - "source": "iana", - "extensions": ["vsd","vst","vss","vsw"] - }, - "application/vnd.visionary": { - "source": "iana", - "extensions": ["vis"] - }, - "application/vnd.vividence.scriptfile": { - "source": "iana" - }, - "application/vnd.vsf": { - "source": "iana", - "extensions": ["vsf"] - }, - "application/vnd.wap.sic": { - "source": "iana" - }, - "application/vnd.wap.slc": { - "source": "iana" - }, - "application/vnd.wap.wbxml": { - "source": "iana", - "extensions": ["wbxml"] - }, - "application/vnd.wap.wmlc": { - "source": "iana", - "extensions": ["wmlc"] - }, - "application/vnd.wap.wmlscriptc": { - "source": "iana", - "extensions": ["wmlsc"] - }, - "application/vnd.webturbo": { - "source": "iana", - "extensions": ["wtb"] - }, - "application/vnd.wfa.p2p": { - "source": "iana" - }, - "application/vnd.wfa.wsc": { - "source": "iana" - }, - "application/vnd.windows.devicepairing": { - "source": "iana" - }, - "application/vnd.wmc": { - "source": "iana" - }, - "application/vnd.wmf.bootstrap": { - "source": "iana" - }, - "application/vnd.wolfram.mathematica": { - "source": "iana" - }, - "application/vnd.wolfram.mathematica.package": { - "source": "iana" - }, - "application/vnd.wolfram.player": { - "source": "iana", - "extensions": ["nbp"] - }, - "application/vnd.wordperfect": { - "source": "iana", - "extensions": ["wpd"] - }, - "application/vnd.wqd": { - "source": "iana", - "extensions": ["wqd"] - }, - "application/vnd.wrq-hp3000-labelled": { - "source": "iana" - }, - "application/vnd.wt.stf": { - "source": "iana", - "extensions": ["stf"] - }, - "application/vnd.wv.csp+wbxml": { - "source": "iana" - }, - "application/vnd.wv.csp+xml": { - "source": "iana" - }, - "application/vnd.wv.ssp+xml": { - "source": "iana" - }, - "application/vnd.xacml+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.xara": { - "source": "iana", - "extensions": ["xar"] - }, - "application/vnd.xfdl": { - "source": "iana", - "extensions": ["xfdl"] - }, - "application/vnd.xfdl.webform": { - "source": "iana" - }, - "application/vnd.xmi+xml": { - "source": "iana" - }, - "application/vnd.xmpie.cpkg": { - "source": "iana" - }, - "application/vnd.xmpie.dpkg": { - "source": "iana" - }, - "application/vnd.xmpie.plan": { - "source": "iana" - }, - "application/vnd.xmpie.ppkg": { - "source": "iana" - }, - "application/vnd.xmpie.xlim": { - "source": "iana" - }, - "application/vnd.yamaha.hv-dic": { - "source": "iana", - "extensions": ["hvd"] - }, - "application/vnd.yamaha.hv-script": { - "source": "iana", - "extensions": ["hvs"] - }, - "application/vnd.yamaha.hv-voice": { - "source": "iana", - "extensions": ["hvp"] - }, - "application/vnd.yamaha.openscoreformat": { - "source": "iana", - "extensions": ["osf"] - }, - "application/vnd.yamaha.openscoreformat.osfpvg+xml": { - "source": "iana", - "extensions": ["osfpvg"] - }, - "application/vnd.yamaha.remote-setup": { - "source": "iana" - }, - "application/vnd.yamaha.smaf-audio": { - "source": "iana", - "extensions": ["saf"] - }, - "application/vnd.yamaha.smaf-phrase": { - "source": "iana", - "extensions": ["spf"] - }, - "application/vnd.yamaha.through-ngn": { - "source": "iana" - }, - "application/vnd.yamaha.tunnel-udpencap": { - "source": "iana" - }, - "application/vnd.yaoweme": { - "source": "iana" - }, - "application/vnd.yellowriver-custom-menu": { - "source": "iana", - "extensions": ["cmp"] - }, - "application/vnd.zul": { - "source": "iana", - "extensions": ["zir","zirz"] - }, - "application/vnd.zzazz.deck+xml": { - "source": "iana", - "extensions": ["zaz"] - }, - "application/voicexml+xml": { - "source": "iana", - "extensions": ["vxml"] - }, - "application/vq-rtcpxr": { - "source": "iana" - }, - "application/watcherinfo+xml": { - "source": "iana" - }, - "application/whoispp-query": { - "source": "iana" - }, - "application/whoispp-response": { - "source": "iana" - }, - "application/widget": { - "source": "iana", - "extensions": ["wgt"] - }, - "application/winhlp": { - "source": "apache", - "extensions": ["hlp"] - }, - "application/wita": { - "source": "iana" - }, - "application/wordperfect5.1": { - "source": "iana" - }, - "application/wsdl+xml": { - "source": "iana", - "extensions": ["wsdl"] - }, - "application/wspolicy+xml": { - "source": "iana", - "extensions": ["wspolicy"] - }, - "application/x-7z-compressed": { - "source": "apache", - "compressible": false, - "extensions": ["7z"] - }, - "application/x-abiword": { - "source": "apache", - "extensions": ["abw"] - }, - "application/x-ace-compressed": { - "source": "apache", - "extensions": ["ace"] - }, - "application/x-amf": { - "source": "apache" - }, - "application/x-apple-diskimage": { - "source": "apache", - "extensions": ["dmg"] - }, - "application/x-authorware-bin": { - "source": "apache", - "extensions": ["aab","x32","u32","vox"] - }, - "application/x-authorware-map": { - "source": "apache", - "extensions": ["aam"] - }, - "application/x-authorware-seg": { - "source": "apache", - "extensions": ["aas"] - }, - "application/x-bcpio": { - "source": "apache", - "extensions": ["bcpio"] - }, - "application/x-bdoc": { - "compressible": false, - "extensions": ["bdoc"] - }, - "application/x-bittorrent": { - "source": "apache", - "extensions": ["torrent"] - }, - "application/x-blorb": { - "source": "apache", - "extensions": ["blb","blorb"] - }, - "application/x-bzip": { - "source": "apache", - "compressible": false, - "extensions": ["bz"] - }, - "application/x-bzip2": { - "source": "apache", - "compressible": false, - "extensions": ["bz2","boz"] - }, - "application/x-cbr": { - "source": "apache", - "extensions": ["cbr","cba","cbt","cbz","cb7"] - }, - "application/x-cdlink": { - "source": "apache", - "extensions": ["vcd"] - }, - "application/x-cfs-compressed": { - "source": "apache", - "extensions": ["cfs"] - }, - "application/x-chat": { - "source": "apache", - "extensions": ["chat"] - }, - "application/x-chess-pgn": { - "source": "apache", - "extensions": ["pgn"] - }, - "application/x-chrome-extension": { - "extensions": ["crx"] - }, - "application/x-cocoa": { - "source": "nginx", - "extensions": ["cco"] - }, - "application/x-compress": { - "source": "apache" - }, - "application/x-conference": { - "source": "apache", - "extensions": ["nsc"] - }, - "application/x-cpio": { - "source": "apache", - "extensions": ["cpio"] - }, - "application/x-csh": { - "source": "apache", - "extensions": ["csh"] - }, - "application/x-deb": { - "compressible": false - }, - "application/x-debian-package": { - "source": "apache", - "extensions": ["deb","udeb"] - }, - "application/x-dgc-compressed": { - "source": "apache", - "extensions": ["dgc"] - }, - "application/x-director": { - "source": "apache", - "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"] - }, - "application/x-doom": { - "source": "apache", - "extensions": ["wad"] - }, - "application/x-dtbncx+xml": { - "source": "apache", - "extensions": ["ncx"] - }, - "application/x-dtbook+xml": { - "source": "apache", - "extensions": ["dtb"] - }, - "application/x-dtbresource+xml": { - "source": "apache", - "extensions": ["res"] - }, - "application/x-dvi": { - "source": "apache", - "compressible": false, - "extensions": ["dvi"] - }, - "application/x-envoy": { - "source": "apache", - "extensions": ["evy"] - }, - "application/x-eva": { - "source": "apache", - "extensions": ["eva"] - }, - "application/x-font-bdf": { - "source": "apache", - "extensions": ["bdf"] - }, - "application/x-font-dos": { - "source": "apache" - }, - "application/x-font-framemaker": { - "source": "apache" - }, - "application/x-font-ghostscript": { - "source": "apache", - "extensions": ["gsf"] - }, - "application/x-font-libgrx": { - "source": "apache" - }, - "application/x-font-linux-psf": { - "source": "apache", - "extensions": ["psf"] - }, - "application/x-font-otf": { - "source": "apache", - "compressible": true, - "extensions": ["otf"] - }, - "application/x-font-pcf": { - "source": "apache", - "extensions": ["pcf"] - }, - "application/x-font-snf": { - "source": "apache", - "extensions": ["snf"] - }, - "application/x-font-speedo": { - "source": "apache" - }, - "application/x-font-sunos-news": { - "source": "apache" - }, - "application/x-font-ttf": { - "source": "apache", - "compressible": true, - "extensions": ["ttf","ttc"] - }, - "application/x-font-type1": { - "source": "apache", - "extensions": ["pfa","pfb","pfm","afm"] - }, - "application/x-font-vfont": { - "source": "apache" - }, - "application/x-freearc": { - "source": "apache", - "extensions": ["arc"] - }, - "application/x-futuresplash": { - "source": "apache", - "extensions": ["spl"] - }, - "application/x-gca-compressed": { - "source": "apache", - "extensions": ["gca"] - }, - "application/x-glulx": { - "source": "apache", - "extensions": ["ulx"] - }, - "application/x-gnumeric": { - "source": "apache", - "extensions": ["gnumeric"] - }, - "application/x-gramps-xml": { - "source": "apache", - "extensions": ["gramps"] - }, - "application/x-gtar": { - "source": "apache", - "extensions": ["gtar"] - }, - "application/x-gzip": { - "source": "apache" - }, - "application/x-hdf": { - "source": "apache", - "extensions": ["hdf"] - }, - "application/x-httpd-php": { - "compressible": true, - "extensions": ["php"] - }, - "application/x-install-instructions": { - "source": "apache", - "extensions": ["install"] - }, - "application/x-iso9660-image": { - "source": "apache", - "extensions": ["iso"] - }, - "application/x-java-archive-diff": { - "source": "nginx", - "extensions": ["jardiff"] - }, - "application/x-java-jnlp-file": { - "source": "apache", - "compressible": false, - "extensions": ["jnlp"] - }, - "application/x-javascript": { - "compressible": true - }, - "application/x-latex": { - "source": "apache", - "compressible": false, - "extensions": ["latex"] - }, - "application/x-lua-bytecode": { - "extensions": ["luac"] - }, - "application/x-lzh-compressed": { - "source": "apache", - "extensions": ["lzh","lha"] - }, - "application/x-makeself": { - "source": "nginx", - "extensions": ["run"] - }, - "application/x-mie": { - "source": "apache", - "extensions": ["mie"] - }, - "application/x-mobipocket-ebook": { - "source": "apache", - "extensions": ["prc","mobi"] - }, - "application/x-mpegurl": { - "compressible": false - }, - "application/x-ms-application": { - "source": "apache", - "extensions": ["application"] - }, - "application/x-ms-shortcut": { - "source": "apache", - "extensions": ["lnk"] - }, - "application/x-ms-wmd": { - "source": "apache", - "extensions": ["wmd"] - }, - "application/x-ms-wmz": { - "source": "apache", - "extensions": ["wmz"] - }, - "application/x-ms-xbap": { - "source": "apache", - "extensions": ["xbap"] - }, - "application/x-msaccess": { - "source": "apache", - "extensions": ["mdb"] - }, - "application/x-msbinder": { - "source": "apache", - "extensions": ["obd"] - }, - "application/x-mscardfile": { - "source": "apache", - "extensions": ["crd"] - }, - "application/x-msclip": { - "source": "apache", - "extensions": ["clp"] - }, - "application/x-msdos-program": { - "extensions": ["exe"] - }, - "application/x-msdownload": { - "source": "apache", - "extensions": ["exe","dll","com","bat","msi"] - }, - "application/x-msmediaview": { - "source": "apache", - "extensions": ["mvb","m13","m14"] - }, - "application/x-msmetafile": { - "source": "apache", - "extensions": ["wmf","wmz","emf","emz"] - }, - "application/x-msmoney": { - "source": "apache", - "extensions": ["mny"] - }, - "application/x-mspublisher": { - "source": "apache", - "extensions": ["pub"] - }, - "application/x-msschedule": { - "source": "apache", - "extensions": ["scd"] - }, - "application/x-msterminal": { - "source": "apache", - "extensions": ["trm"] - }, - "application/x-mswrite": { - "source": "apache", - "extensions": ["wri"] - }, - "application/x-netcdf": { - "source": "apache", - "extensions": ["nc","cdf"] - }, - "application/x-ns-proxy-autoconfig": { - "compressible": true, - "extensions": ["pac"] - }, - "application/x-nzb": { - "source": "apache", - "extensions": ["nzb"] - }, - "application/x-perl": { - "source": "nginx", - "extensions": ["pl","pm"] - }, - "application/x-pilot": { - "source": "nginx", - "extensions": ["prc","pdb"] - }, - "application/x-pkcs12": { - "source": "apache", - "compressible": false, - "extensions": ["p12","pfx"] - }, - "application/x-pkcs7-certificates": { - "source": "apache", - "extensions": ["p7b","spc"] - }, - "application/x-pkcs7-certreqresp": { - "source": "apache", - "extensions": ["p7r"] - }, - "application/x-rar-compressed": { - "source": "apache", - "compressible": false, - "extensions": ["rar"] - }, - "application/x-redhat-package-manager": { - "source": "nginx", - "extensions": ["rpm"] - }, - "application/x-research-info-systems": { - "source": "apache", - "extensions": ["ris"] - }, - "application/x-sea": { - "source": "nginx", - "extensions": ["sea"] - }, - "application/x-sh": { - "source": "apache", - "compressible": true, - "extensions": ["sh"] - }, - "application/x-shar": { - "source": "apache", - "extensions": ["shar"] - }, - "application/x-shockwave-flash": { - "source": "apache", - "compressible": false, - "extensions": ["swf"] - }, - "application/x-silverlight-app": { - "source": "apache", - "extensions": ["xap"] - }, - "application/x-sql": { - "source": "apache", - "extensions": ["sql"] - }, - "application/x-stuffit": { - "source": "apache", - "compressible": false, - "extensions": ["sit"] - }, - "application/x-stuffitx": { - "source": "apache", - "extensions": ["sitx"] - }, - "application/x-subrip": { - "source": "apache", - "extensions": ["srt"] - }, - "application/x-sv4cpio": { - "source": "apache", - "extensions": ["sv4cpio"] - }, - "application/x-sv4crc": { - "source": "apache", - "extensions": ["sv4crc"] - }, - "application/x-t3vm-image": { - "source": "apache", - "extensions": ["t3"] - }, - "application/x-tads": { - "source": "apache", - "extensions": ["gam"] - }, - "application/x-tar": { - "source": "apache", - "compressible": true, - "extensions": ["tar"] - }, - "application/x-tcl": { - "source": "apache", - "extensions": ["tcl","tk"] - }, - "application/x-tex": { - "source": "apache", - "extensions": ["tex"] - }, - "application/x-tex-tfm": { - "source": "apache", - "extensions": ["tfm"] - }, - "application/x-texinfo": { - "source": "apache", - "extensions": ["texinfo","texi"] - }, - "application/x-tgif": { - "source": "apache", - "extensions": ["obj"] - }, - "application/x-ustar": { - "source": "apache", - "extensions": ["ustar"] - }, - "application/x-wais-source": { - "source": "apache", - "extensions": ["src"] - }, - "application/x-web-app-manifest+json": { - "compressible": true, - "extensions": ["webapp"] - }, - "application/x-www-form-urlencoded": { - "source": "iana", - "compressible": true - }, - "application/x-x509-ca-cert": { - "source": "apache", - "extensions": ["der","crt","pem"] - }, - "application/x-xfig": { - "source": "apache", - "extensions": ["fig"] - }, - "application/x-xliff+xml": { - "source": "apache", - "extensions": ["xlf"] - }, - "application/x-xpinstall": { - "source": "apache", - "compressible": false, - "extensions": ["xpi"] - }, - "application/x-xz": { - "source": "apache", - "extensions": ["xz"] - }, - "application/x-zmachine": { - "source": "apache", - "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"] - }, - "application/x400-bp": { - "source": "iana" - }, - "application/xacml+xml": { - "source": "iana" - }, - "application/xaml+xml": { - "source": "apache", - "extensions": ["xaml"] - }, - "application/xcap-att+xml": { - "source": "iana" - }, - "application/xcap-caps+xml": { - "source": "iana" - }, - "application/xcap-diff+xml": { - "source": "iana", - "extensions": ["xdf"] - }, - "application/xcap-el+xml": { - "source": "iana" - }, - "application/xcap-error+xml": { - "source": "iana" - }, - "application/xcap-ns+xml": { - "source": "iana" - }, - "application/xcon-conference-info+xml": { - "source": "iana" - }, - "application/xcon-conference-info-diff+xml": { - "source": "iana" - }, - "application/xenc+xml": { - "source": "iana", - "extensions": ["xenc"] - }, - "application/xhtml+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xhtml","xht"] - }, - "application/xhtml-voice+xml": { - "source": "apache" - }, - "application/xml": { - "source": "iana", - "compressible": true, - "extensions": ["xml","xsl","xsd"] - }, - "application/xml-dtd": { - "source": "iana", - "compressible": true, - "extensions": ["dtd"] - }, - "application/xml-external-parsed-entity": { - "source": "iana" - }, - "application/xml-patch+xml": { - "source": "iana" - }, - "application/xmpp+xml": { - "source": "iana" - }, - "application/xop+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xop"] - }, - "application/xproc+xml": { - "source": "apache", - "extensions": ["xpl"] - }, - "application/xslt+xml": { - "source": "iana", - "extensions": ["xslt"] - }, - "application/xspf+xml": { - "source": "apache", - "extensions": ["xspf"] - }, - "application/xv+xml": { - "source": "iana", - "extensions": ["mxml","xhvml","xvml","xvm"] - }, - "application/yang": { - "source": "iana", - "extensions": ["yang"] - }, - "application/yin+xml": { - "source": "iana", - "extensions": ["yin"] - }, - "application/zip": { - "source": "iana", - "compressible": false, - "extensions": ["zip"] - }, - "application/zlib": { - "source": "iana" - }, - "audio/1d-interleaved-parityfec": { - "source": "iana" - }, - "audio/32kadpcm": { - "source": "iana" - }, - "audio/3gpp": { - "source": "iana" - }, - "audio/3gpp2": { - "source": "iana" - }, - "audio/ac3": { - "source": "iana" - }, - "audio/adpcm": { - "source": "apache", - "extensions": ["adp"] - }, - "audio/amr": { - "source": "iana" - }, - "audio/amr-wb": { - "source": "iana" - }, - "audio/amr-wb+": { - "source": "iana" - }, - "audio/aptx": { - "source": "iana" - }, - "audio/asc": { - "source": "iana" - }, - "audio/atrac-advanced-lossless": { - "source": "iana" - }, - "audio/atrac-x": { - "source": "iana" - }, - "audio/atrac3": { - "source": "iana" - }, - "audio/basic": { - "source": "iana", - "compressible": false, - "extensions": ["au","snd"] - }, - "audio/bv16": { - "source": "iana" - }, - "audio/bv32": { - "source": "iana" - }, - "audio/clearmode": { - "source": "iana" - }, - "audio/cn": { - "source": "iana" - }, - "audio/dat12": { - "source": "iana" - }, - "audio/dls": { - "source": "iana" - }, - "audio/dsr-es201108": { - "source": "iana" - }, - "audio/dsr-es202050": { - "source": "iana" - }, - "audio/dsr-es202211": { - "source": "iana" - }, - "audio/dsr-es202212": { - "source": "iana" - }, - "audio/dv": { - "source": "iana" - }, - "audio/dvi4": { - "source": "iana" - }, - "audio/eac3": { - "source": "iana" - }, - "audio/encaprtp": { - "source": "iana" - }, - "audio/evrc": { - "source": "iana" - }, - "audio/evrc-qcp": { - "source": "iana" - }, - "audio/evrc0": { - "source": "iana" - }, - "audio/evrc1": { - "source": "iana" - }, - "audio/evrcb": { - "source": "iana" - }, - "audio/evrcb0": { - "source": "iana" - }, - "audio/evrcb1": { - "source": "iana" - }, - "audio/evrcnw": { - "source": "iana" - }, - "audio/evrcnw0": { - "source": "iana" - }, - "audio/evrcnw1": { - "source": "iana" - }, - "audio/evrcwb": { - "source": "iana" - }, - "audio/evrcwb0": { - "source": "iana" - }, - "audio/evrcwb1": { - "source": "iana" - }, - "audio/fwdred": { - "source": "iana" - }, - "audio/g711-0": { - "source": "iana" - }, - "audio/g719": { - "source": "iana" - }, - "audio/g722": { - "source": "iana" - }, - "audio/g7221": { - "source": "iana" - }, - "audio/g723": { - "source": "iana" - }, - "audio/g726-16": { - "source": "iana" - }, - "audio/g726-24": { - "source": "iana" - }, - "audio/g726-32": { - "source": "iana" - }, - "audio/g726-40": { - "source": "iana" - }, - "audio/g728": { - "source": "iana" - }, - "audio/g729": { - "source": "iana" - }, - "audio/g7291": { - "source": "iana" - }, - "audio/g729d": { - "source": "iana" - }, - "audio/g729e": { - "source": "iana" - }, - "audio/gsm": { - "source": "iana" - }, - "audio/gsm-efr": { - "source": "iana" - }, - "audio/gsm-hr-08": { - "source": "iana" - }, - "audio/ilbc": { - "source": "iana" - }, - "audio/ip-mr_v2.5": { - "source": "iana" - }, - "audio/isac": { - "source": "apache" - }, - "audio/l16": { - "source": "iana" - }, - "audio/l20": { - "source": "iana" - }, - "audio/l24": { - "source": "iana", - "compressible": false - }, - "audio/l8": { - "source": "iana" - }, - "audio/lpc": { - "source": "iana" - }, - "audio/midi": { - "source": "apache", - "extensions": ["mid","midi","kar","rmi"] - }, - "audio/mobile-xmf": { - "source": "iana" - }, - "audio/mp4": { - "source": "iana", - "compressible": false, - "extensions": ["mp4a","m4a"] - }, - "audio/mp4a-latm": { - "source": "iana" - }, - "audio/mpa": { - "source": "iana" - }, - "audio/mpa-robust": { - "source": "iana" - }, - "audio/mpeg": { - "source": "iana", - "compressible": false, - "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"] - }, - "audio/mpeg4-generic": { - "source": "iana" - }, - "audio/musepack": { - "source": "apache" - }, - "audio/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["oga","ogg","spx"] - }, - "audio/opus": { - "source": "iana" - }, - "audio/parityfec": { - "source": "iana" - }, - "audio/pcma": { - "source": "iana" - }, - "audio/pcma-wb": { - "source": "iana" - }, - "audio/pcmu": { - "source": "iana" - }, - "audio/pcmu-wb": { - "source": "iana" - }, - "audio/prs.sid": { - "source": "iana" - }, - "audio/qcelp": { - "source": "iana" - }, - "audio/raptorfec": { - "source": "iana" - }, - "audio/red": { - "source": "iana" - }, - "audio/rtp-enc-aescm128": { - "source": "iana" - }, - "audio/rtp-midi": { - "source": "iana" - }, - "audio/rtploopback": { - "source": "iana" - }, - "audio/rtx": { - "source": "iana" - }, - "audio/s3m": { - "source": "apache", - "extensions": ["s3m"] - }, - "audio/silk": { - "source": "apache", - "extensions": ["sil"] - }, - "audio/smv": { - "source": "iana" - }, - "audio/smv-qcp": { - "source": "iana" - }, - "audio/smv0": { - "source": "iana" - }, - "audio/sp-midi": { - "source": "iana" - }, - "audio/speex": { - "source": "iana" - }, - "audio/t140c": { - "source": "iana" - }, - "audio/t38": { - "source": "iana" - }, - "audio/telephone-event": { - "source": "iana" - }, - "audio/tone": { - "source": "iana" - }, - "audio/uemclip": { - "source": "iana" - }, - "audio/ulpfec": { - "source": "iana" - }, - "audio/vdvi": { - "source": "iana" - }, - "audio/vmr-wb": { - "source": "iana" - }, - "audio/vnd.3gpp.iufp": { - "source": "iana" - }, - "audio/vnd.4sb": { - "source": "iana" - }, - "audio/vnd.audiokoz": { - "source": "iana" - }, - "audio/vnd.celp": { - "source": "iana" - }, - "audio/vnd.cisco.nse": { - "source": "iana" - }, - "audio/vnd.cmles.radio-events": { - "source": "iana" - }, - "audio/vnd.cns.anp1": { - "source": "iana" - }, - "audio/vnd.cns.inf1": { - "source": "iana" - }, - "audio/vnd.dece.audio": { - "source": "iana", - "extensions": ["uva","uvva"] - }, - "audio/vnd.digital-winds": { - "source": "iana", - "extensions": ["eol"] - }, - "audio/vnd.dlna.adts": { - "source": "iana" - }, - "audio/vnd.dolby.heaac.1": { - "source": "iana" - }, - "audio/vnd.dolby.heaac.2": { - "source": "iana" - }, - "audio/vnd.dolby.mlp": { - "source": "iana" - }, - "audio/vnd.dolby.mps": { - "source": "iana" - }, - "audio/vnd.dolby.pl2": { - "source": "iana" - }, - "audio/vnd.dolby.pl2x": { - "source": "iana" - }, - "audio/vnd.dolby.pl2z": { - "source": "iana" - }, - "audio/vnd.dolby.pulse.1": { - "source": "iana" - }, - "audio/vnd.dra": { - "source": "iana", - "extensions": ["dra"] - }, - "audio/vnd.dts": { - "source": "iana", - "extensions": ["dts"] - }, - "audio/vnd.dts.hd": { - "source": "iana", - "extensions": ["dtshd"] - }, - "audio/vnd.dvb.file": { - "source": "iana" - }, - "audio/vnd.everad.plj": { - "source": "iana" - }, - "audio/vnd.hns.audio": { - "source": "iana" - }, - "audio/vnd.lucent.voice": { - "source": "iana", - "extensions": ["lvp"] - }, - "audio/vnd.ms-playready.media.pya": { - "source": "iana", - "extensions": ["pya"] - }, - "audio/vnd.nokia.mobile-xmf": { - "source": "iana" - }, - "audio/vnd.nortel.vbk": { - "source": "iana" - }, - "audio/vnd.nuera.ecelp4800": { - "source": "iana", - "extensions": ["ecelp4800"] - }, - "audio/vnd.nuera.ecelp7470": { - "source": "iana", - "extensions": ["ecelp7470"] - }, - "audio/vnd.nuera.ecelp9600": { - "source": "iana", - "extensions": ["ecelp9600"] - }, - "audio/vnd.octel.sbc": { - "source": "iana" - }, - "audio/vnd.qcelp": { - "source": "iana" - }, - "audio/vnd.rhetorex.32kadpcm": { - "source": "iana" - }, - "audio/vnd.rip": { - "source": "iana", - "extensions": ["rip"] - }, - "audio/vnd.rn-realaudio": { - "compressible": false - }, - "audio/vnd.sealedmedia.softseal.mpeg": { - "source": "iana" - }, - "audio/vnd.vmx.cvsd": { - "source": "iana" - }, - "audio/vnd.wave": { - "compressible": false - }, - "audio/vorbis": { - "source": "iana", - "compressible": false - }, - "audio/vorbis-config": { - "source": "iana" - }, - "audio/wav": { - "compressible": false, - "extensions": ["wav"] - }, - "audio/wave": { - "compressible": false, - "extensions": ["wav"] - }, - "audio/webm": { - "source": "apache", - "compressible": false, - "extensions": ["weba"] - }, - "audio/x-aac": { - "source": "apache", - "compressible": false, - "extensions": ["aac"] - }, - "audio/x-aiff": { - "source": "apache", - "extensions": ["aif","aiff","aifc"] - }, - "audio/x-caf": { - "source": "apache", - "compressible": false, - "extensions": ["caf"] - }, - "audio/x-flac": { - "source": "apache", - "extensions": ["flac"] - }, - "audio/x-m4a": { - "source": "nginx", - "extensions": ["m4a"] - }, - "audio/x-matroska": { - "source": "apache", - "extensions": ["mka"] - }, - "audio/x-mpegurl": { - "source": "apache", - "extensions": ["m3u"] - }, - "audio/x-ms-wax": { - "source": "apache", - "extensions": ["wax"] - }, - "audio/x-ms-wma": { - "source": "apache", - "extensions": ["wma"] - }, - "audio/x-pn-realaudio": { - "source": "apache", - "extensions": ["ram","ra"] - }, - "audio/x-pn-realaudio-plugin": { - "source": "apache", - "extensions": ["rmp"] - }, - "audio/x-realaudio": { - "source": "nginx", - "extensions": ["ra"] - }, - "audio/x-tta": { - "source": "apache" - }, - "audio/x-wav": { - "source": "apache", - "extensions": ["wav"] - }, - "audio/xm": { - "source": "apache", - "extensions": ["xm"] - }, - "chemical/x-cdx": { - "source": "apache", - "extensions": ["cdx"] - }, - "chemical/x-cif": { - "source": "apache", - "extensions": ["cif"] - }, - "chemical/x-cmdf": { - "source": "apache", - "extensions": ["cmdf"] - }, - "chemical/x-cml": { - "source": "apache", - "extensions": ["cml"] - }, - "chemical/x-csml": { - "source": "apache", - "extensions": ["csml"] - }, - "chemical/x-pdb": { - "source": "apache" - }, - "chemical/x-xyz": { - "source": "apache", - "extensions": ["xyz"] - }, - "font/opentype": { - "compressible": true, - "extensions": ["otf"] - }, - "image/bmp": { - "source": "apache", - "compressible": true, - "extensions": ["bmp"] - }, - "image/cgm": { - "source": "iana", - "extensions": ["cgm"] - }, - "image/fits": { - "source": "iana" - }, - "image/g3fax": { - "source": "iana", - "extensions": ["g3"] - }, - "image/gif": { - "source": "iana", - "compressible": false, - "extensions": ["gif"] - }, - "image/ief": { - "source": "iana", - "extensions": ["ief"] - }, - "image/jp2": { - "source": "iana" - }, - "image/jpeg": { - "source": "iana", - "compressible": false, - "extensions": ["jpeg","jpg","jpe"] - }, - "image/jpm": { - "source": "iana" - }, - "image/jpx": { - "source": "iana" - }, - "image/ktx": { - "source": "iana", - "extensions": ["ktx"] - }, - "image/naplps": { - "source": "iana" - }, - "image/pjpeg": { - "compressible": false - }, - "image/png": { - "source": "iana", - "compressible": false, - "extensions": ["png"] - }, - "image/prs.btif": { - "source": "iana", - "extensions": ["btif"] - }, - "image/prs.pti": { - "source": "iana" - }, - "image/pwg-raster": { - "source": "iana" - }, - "image/sgi": { - "source": "apache", - "extensions": ["sgi"] - }, - "image/svg+xml": { - "source": "iana", - "compressible": true, - "extensions": ["svg","svgz"] - }, - "image/t38": { - "source": "iana" - }, - "image/tiff": { - "source": "iana", - "compressible": false, - "extensions": ["tiff","tif"] - }, - "image/tiff-fx": { - "source": "iana" - }, - "image/vnd.adobe.photoshop": { - "source": "iana", - "compressible": true, - "extensions": ["psd"] - }, - "image/vnd.airzip.accelerator.azv": { - "source": "iana" - }, - "image/vnd.cns.inf2": { - "source": "iana" - }, - "image/vnd.dece.graphic": { - "source": "iana", - "extensions": ["uvi","uvvi","uvg","uvvg"] - }, - "image/vnd.djvu": { - "source": "iana", - "extensions": ["djvu","djv"] - }, - "image/vnd.dvb.subtitle": { - "source": "iana", - "extensions": ["sub"] - }, - "image/vnd.dwg": { - "source": "iana", - "extensions": ["dwg"] - }, - "image/vnd.dxf": { - "source": "iana", - "extensions": ["dxf"] - }, - "image/vnd.fastbidsheet": { - "source": "iana", - "extensions": ["fbs"] - }, - "image/vnd.fpx": { - "source": "iana", - "extensions": ["fpx"] - }, - "image/vnd.fst": { - "source": "iana", - "extensions": ["fst"] - }, - "image/vnd.fujixerox.edmics-mmr": { - "source": "iana", - "extensions": ["mmr"] - }, - "image/vnd.fujixerox.edmics-rlc": { - "source": "iana", - "extensions": ["rlc"] - }, - "image/vnd.globalgraphics.pgb": { - "source": "iana" - }, - "image/vnd.microsoft.icon": { - "source": "iana" - }, - "image/vnd.mix": { - "source": "iana" - }, - "image/vnd.mozilla.apng": { - "source": "iana" - }, - "image/vnd.ms-modi": { - "source": "iana", - "extensions": ["mdi"] - }, - "image/vnd.ms-photo": { - "source": "apache", - "extensions": ["wdp"] - }, - "image/vnd.net-fpx": { - "source": "iana", - "extensions": ["npx"] - }, - "image/vnd.radiance": { - "source": "iana" - }, - "image/vnd.sealed.png": { - "source": "iana" - }, - "image/vnd.sealedmedia.softseal.gif": { - "source": "iana" - }, - "image/vnd.sealedmedia.softseal.jpg": { - "source": "iana" - }, - "image/vnd.svf": { - "source": "iana" - }, - "image/vnd.tencent.tap": { - "source": "iana" - }, - "image/vnd.valve.source.texture": { - "source": "iana" - }, - "image/vnd.wap.wbmp": { - "source": "iana", - "extensions": ["wbmp"] - }, - "image/vnd.xiff": { - "source": "iana", - "extensions": ["xif"] - }, - "image/vnd.zbrush.pcx": { - "source": "iana" - }, - "image/webp": { - "source": "apache", - "extensions": ["webp"] - }, - "image/x-3ds": { - "source": "apache", - "extensions": ["3ds"] - }, - "image/x-cmu-raster": { - "source": "apache", - "extensions": ["ras"] - }, - "image/x-cmx": { - "source": "apache", - "extensions": ["cmx"] - }, - "image/x-freehand": { - "source": "apache", - "extensions": ["fh","fhc","fh4","fh5","fh7"] - }, - "image/x-icon": { - "source": "apache", - "compressible": true, - "extensions": ["ico"] - }, - "image/x-jng": { - "source": "nginx", - "extensions": ["jng"] - }, - "image/x-mrsid-image": { - "source": "apache", - "extensions": ["sid"] - }, - "image/x-ms-bmp": { - "source": "nginx", - "compressible": true, - "extensions": ["bmp"] - }, - "image/x-pcx": { - "source": "apache", - "extensions": ["pcx"] - }, - "image/x-pict": { - "source": "apache", - "extensions": ["pic","pct"] - }, - "image/x-portable-anymap": { - "source": "apache", - "extensions": ["pnm"] - }, - "image/x-portable-bitmap": { - "source": "apache", - "extensions": ["pbm"] - }, - "image/x-portable-graymap": { - "source": "apache", - "extensions": ["pgm"] - }, - "image/x-portable-pixmap": { - "source": "apache", - "extensions": ["ppm"] - }, - "image/x-rgb": { - "source": "apache", - "extensions": ["rgb"] - }, - "image/x-tga": { - "source": "apache", - "extensions": ["tga"] - }, - "image/x-xbitmap": { - "source": "apache", - "extensions": ["xbm"] - }, - "image/x-xcf": { - "compressible": false - }, - "image/x-xpixmap": { - "source": "apache", - "extensions": ["xpm"] - }, - "image/x-xwindowdump": { - "source": "apache", - "extensions": ["xwd"] - }, - "message/cpim": { - "source": "iana" - }, - "message/delivery-status": { - "source": "iana" - }, - "message/disposition-notification": { - "source": "iana" - }, - "message/external-body": { - "source": "iana" - }, - "message/feedback-report": { - "source": "iana" - }, - "message/global": { - "source": "iana" - }, - "message/global-delivery-status": { - "source": "iana" - }, - "message/global-disposition-notification": { - "source": "iana" - }, - "message/global-headers": { - "source": "iana" - }, - "message/http": { - "source": "iana", - "compressible": false - }, - "message/imdn+xml": { - "source": "iana", - "compressible": true - }, - "message/news": { - "source": "iana" - }, - "message/partial": { - "source": "iana", - "compressible": false - }, - "message/rfc822": { - "source": "iana", - "compressible": true, - "extensions": ["eml","mime"] - }, - "message/s-http": { - "source": "iana" - }, - "message/sip": { - "source": "iana" - }, - "message/sipfrag": { - "source": "iana" - }, - "message/tracking-status": { - "source": "iana" - }, - "message/vnd.si.simp": { - "source": "iana" - }, - "message/vnd.wfa.wsc": { - "source": "iana" - }, - "model/iges": { - "source": "iana", - "compressible": false, - "extensions": ["igs","iges"] - }, - "model/mesh": { - "source": "iana", - "compressible": false, - "extensions": ["msh","mesh","silo"] - }, - "model/vnd.collada+xml": { - "source": "iana", - "extensions": ["dae"] - }, - "model/vnd.dwf": { - "source": "iana", - "extensions": ["dwf"] - }, - "model/vnd.flatland.3dml": { - "source": "iana" - }, - "model/vnd.gdl": { - "source": "iana", - "extensions": ["gdl"] - }, - "model/vnd.gs-gdl": { - "source": "apache" - }, - "model/vnd.gs.gdl": { - "source": "iana" - }, - "model/vnd.gtw": { - "source": "iana", - "extensions": ["gtw"] - }, - "model/vnd.moml+xml": { - "source": "iana" - }, - "model/vnd.mts": { - "source": "iana", - "extensions": ["mts"] - }, - "model/vnd.opengex": { - "source": "iana" - }, - "model/vnd.parasolid.transmit.binary": { - "source": "iana" - }, - "model/vnd.parasolid.transmit.text": { - "source": "iana" - }, - "model/vnd.valve.source.compiled-map": { - "source": "iana" - }, - "model/vnd.vtu": { - "source": "iana", - "extensions": ["vtu"] - }, - "model/vrml": { - "source": "iana", - "compressible": false, - "extensions": ["wrl","vrml"] - }, - "model/x3d+binary": { - "source": "apache", - "compressible": false, - "extensions": ["x3db","x3dbz"] - }, - "model/x3d+fastinfoset": { - "source": "iana" - }, - "model/x3d+vrml": { - "source": "apache", - "compressible": false, - "extensions": ["x3dv","x3dvz"] - }, - "model/x3d+xml": { - "source": "iana", - "compressible": true, - "extensions": ["x3d","x3dz"] - }, - "model/x3d-vrml": { - "source": "iana" - }, - "multipart/alternative": { - "source": "iana", - "compressible": false - }, - "multipart/appledouble": { - "source": "iana" - }, - "multipart/byteranges": { - "source": "iana" - }, - "multipart/digest": { - "source": "iana" - }, - "multipart/encrypted": { - "source": "iana", - "compressible": false - }, - "multipart/form-data": { - "source": "iana", - "compressible": false - }, - "multipart/header-set": { - "source": "iana" - }, - "multipart/mixed": { - "source": "iana", - "compressible": false - }, - "multipart/parallel": { - "source": "iana" - }, - "multipart/related": { - "source": "iana", - "compressible": false - }, - "multipart/report": { - "source": "iana" - }, - "multipart/signed": { - "source": "iana", - "compressible": false - }, - "multipart/voice-message": { - "source": "iana" - }, - "multipart/x-mixed-replace": { - "source": "iana" - }, - "text/1d-interleaved-parityfec": { - "source": "iana" - }, - "text/cache-manifest": { - "source": "iana", - "compressible": true, - "extensions": ["appcache","manifest"] - }, - "text/calendar": { - "source": "iana", - "extensions": ["ics","ifb"] - }, - "text/calender": { - "compressible": true - }, - "text/cmd": { - "compressible": true - }, - "text/coffeescript": { - "extensions": ["coffee","litcoffee"] - }, - "text/css": { - "source": "iana", - "compressible": true, - "extensions": ["css"] - }, - "text/csv": { - "source": "iana", - "compressible": true, - "extensions": ["csv"] - }, - "text/csv-schema": { - "source": "iana" - }, - "text/directory": { - "source": "iana" - }, - "text/dns": { - "source": "iana" - }, - "text/ecmascript": { - "source": "iana" - }, - "text/encaprtp": { - "source": "iana" - }, - "text/enriched": { - "source": "iana" - }, - "text/fwdred": { - "source": "iana" - }, - "text/grammar-ref-list": { - "source": "iana" - }, - "text/hjson": { - "extensions": ["hjson"] - }, - "text/html": { - "source": "iana", - "compressible": true, - "extensions": ["html","htm","shtml"] - }, - "text/jade": { - "extensions": ["jade"] - }, - "text/javascript": { - "source": "iana", - "compressible": true - }, - "text/jcr-cnd": { - "source": "iana" - }, - "text/jsx": { - "compressible": true, - "extensions": ["jsx"] - }, - "text/less": { - "extensions": ["less"] - }, - "text/markdown": { - "source": "iana" - }, - "text/mathml": { - "source": "nginx", - "extensions": ["mml"] - }, - "text/mizar": { - "source": "iana" - }, - "text/n3": { - "source": "iana", - "compressible": true, - "extensions": ["n3"] - }, - "text/parameters": { - "source": "iana" - }, - "text/parityfec": { - "source": "iana" - }, - "text/plain": { - "source": "iana", - "compressible": true, - "extensions": ["txt","text","conf","def","list","log","in","ini"] - }, - "text/provenance-notation": { - "source": "iana" - }, - "text/prs.fallenstein.rst": { - "source": "iana" - }, - "text/prs.lines.tag": { - "source": "iana", - "extensions": ["dsc"] - }, - "text/raptorfec": { - "source": "iana" - }, - "text/red": { - "source": "iana" - }, - "text/rfc822-headers": { - "source": "iana" - }, - "text/richtext": { - "source": "iana", - "compressible": true, - "extensions": ["rtx"] - }, - "text/rtf": { - "source": "iana", - "compressible": true, - "extensions": ["rtf"] - }, - "text/rtp-enc-aescm128": { - "source": "iana" - }, - "text/rtploopback": { - "source": "iana" - }, - "text/rtx": { - "source": "iana" - }, - "text/sgml": { - "source": "iana", - "extensions": ["sgml","sgm"] - }, - "text/stylus": { - "extensions": ["stylus","styl"] - }, - "text/t140": { - "source": "iana" - }, - "text/tab-separated-values": { - "source": "iana", - "compressible": true, - "extensions": ["tsv"] - }, - "text/troff": { - "source": "iana", - "extensions": ["t","tr","roff","man","me","ms"] - }, - "text/turtle": { - "source": "iana", - "extensions": ["ttl"] - }, - "text/ulpfec": { - "source": "iana" - }, - "text/uri-list": { - "source": "iana", - "compressible": true, - "extensions": ["uri","uris","urls"] - }, - "text/vcard": { - "source": "iana", - "compressible": true, - "extensions": ["vcard"] - }, - "text/vnd.a": { - "source": "iana" - }, - "text/vnd.abc": { - "source": "iana" - }, - "text/vnd.curl": { - "source": "iana", - "extensions": ["curl"] - }, - "text/vnd.curl.dcurl": { - "source": "apache", - "extensions": ["dcurl"] - }, - "text/vnd.curl.mcurl": { - "source": "apache", - "extensions": ["mcurl"] - }, - "text/vnd.curl.scurl": { - "source": "apache", - "extensions": ["scurl"] - }, - "text/vnd.debian.copyright": { - "source": "iana" - }, - "text/vnd.dmclientscript": { - "source": "iana" - }, - "text/vnd.dvb.subtitle": { - "source": "iana", - "extensions": ["sub"] - }, - "text/vnd.esmertec.theme-descriptor": { - "source": "iana" - }, - "text/vnd.fly": { - "source": "iana", - "extensions": ["fly"] - }, - "text/vnd.fmi.flexstor": { - "source": "iana", - "extensions": ["flx"] - }, - "text/vnd.graphviz": { - "source": "iana", - "extensions": ["gv"] - }, - "text/vnd.in3d.3dml": { - "source": "iana", - "extensions": ["3dml"] - }, - "text/vnd.in3d.spot": { - "source": "iana", - "extensions": ["spot"] - }, - "text/vnd.iptc.newsml": { - "source": "iana" - }, - "text/vnd.iptc.nitf": { - "source": "iana" - }, - "text/vnd.latex-z": { - "source": "iana" - }, - "text/vnd.motorola.reflex": { - "source": "iana" - }, - "text/vnd.ms-mediapackage": { - "source": "iana" - }, - "text/vnd.net2phone.commcenter.command": { - "source": "iana" - }, - "text/vnd.radisys.msml-basic-layout": { - "source": "iana" - }, - "text/vnd.si.uricatalogue": { - "source": "iana" - }, - "text/vnd.sun.j2me.app-descriptor": { - "source": "iana", - "extensions": ["jad"] - }, - "text/vnd.trolltech.linguist": { - "source": "iana" - }, - "text/vnd.wap.si": { - "source": "iana" - }, - "text/vnd.wap.sl": { - "source": "iana" - }, - "text/vnd.wap.wml": { - "source": "iana", - "extensions": ["wml"] - }, - "text/vnd.wap.wmlscript": { - "source": "iana", - "extensions": ["wmls"] - }, - "text/vtt": { - "charset": "UTF-8", - "compressible": true, - "extensions": ["vtt"] - }, - "text/x-asm": { - "source": "apache", - "extensions": ["s","asm"] - }, - "text/x-c": { - "source": "apache", - "extensions": ["c","cc","cxx","cpp","h","hh","dic"] - }, - "text/x-component": { - "source": "nginx", - "extensions": ["htc"] - }, - "text/x-fortran": { - "source": "apache", - "extensions": ["f","for","f77","f90"] - }, - "text/x-gwt-rpc": { - "compressible": true - }, - "text/x-handlebars-template": { - "extensions": ["hbs"] - }, - "text/x-java-source": { - "source": "apache", - "extensions": ["java"] - }, - "text/x-jquery-tmpl": { - "compressible": true - }, - "text/x-lua": { - "extensions": ["lua"] - }, - "text/x-markdown": { - "compressible": true, - "extensions": ["markdown","md","mkd"] - }, - "text/x-nfo": { - "source": "apache", - "extensions": ["nfo"] - }, - "text/x-opml": { - "source": "apache", - "extensions": ["opml"] - }, - "text/x-pascal": { - "source": "apache", - "extensions": ["p","pas"] - }, - "text/x-processing": { - "compressible": true, - "extensions": ["pde"] - }, - "text/x-sass": { - "extensions": ["sass"] - }, - "text/x-scss": { - "extensions": ["scss"] - }, - "text/x-setext": { - "source": "apache", - "extensions": ["etx"] - }, - "text/x-sfv": { - "source": "apache", - "extensions": ["sfv"] - }, - "text/x-uuencode": { - "source": "apache", - "extensions": ["uu"] - }, - "text/x-vcalendar": { - "source": "apache", - "extensions": ["vcs"] - }, - "text/x-vcard": { - "source": "apache", - "extensions": ["vcf"] - }, - "text/xml": { - "source": "iana", - "compressible": true, - "extensions": ["xml"] - }, - "text/xml-external-parsed-entity": { - "source": "iana" - }, - "text/yaml": { - "extensions": ["yaml","yml"] - }, - "video/1d-interleaved-parityfec": { - "source": "apache" - }, - "video/3gpp": { - "source": "apache", - "extensions": ["3gp","3gpp"] - }, - "video/3gpp-tt": { - "source": "apache" - }, - "video/3gpp2": { - "source": "apache", - "extensions": ["3g2"] - }, - "video/bmpeg": { - "source": "apache" - }, - "video/bt656": { - "source": "apache" - }, - "video/celb": { - "source": "apache" - }, - "video/dv": { - "source": "apache" - }, - "video/h261": { - "source": "apache", - "extensions": ["h261"] - }, - "video/h263": { - "source": "apache", - "extensions": ["h263"] - }, - "video/h263-1998": { - "source": "apache" - }, - "video/h263-2000": { - "source": "apache" - }, - "video/h264": { - "source": "apache", - "extensions": ["h264"] - }, - "video/h264-rcdo": { - "source": "apache" - }, - "video/h264-svc": { - "source": "apache" - }, - "video/jpeg": { - "source": "apache", - "extensions": ["jpgv"] - }, - "video/jpeg2000": { - "source": "apache" - }, - "video/jpm": { - "source": "apache", - "extensions": ["jpm","jpgm"] - }, - "video/mj2": { - "source": "apache", - "extensions": ["mj2","mjp2"] - }, - "video/mp1s": { - "source": "apache" - }, - "video/mp2p": { - "source": "apache" - }, - "video/mp2t": { - "source": "apache", - "extensions": ["ts"] - }, - "video/mp4": { - "source": "apache", - "compressible": false, - "extensions": ["mp4","mp4v","mpg4"] - }, - "video/mp4v-es": { - "source": "apache" - }, - "video/mpeg": { - "source": "apache", - "compressible": false, - "extensions": ["mpeg","mpg","mpe","m1v","m2v"] - }, - "video/mpeg4-generic": { - "source": "apache" - }, - "video/mpv": { - "source": "apache" - }, - "video/nv": { - "source": "apache" - }, - "video/ogg": { - "source": "apache", - "compressible": false, - "extensions": ["ogv"] - }, - "video/parityfec": { - "source": "apache" - }, - "video/pointer": { - "source": "apache" - }, - "video/quicktime": { - "source": "apache", - "compressible": false, - "extensions": ["qt","mov"] - }, - "video/raw": { - "source": "apache" - }, - "video/rtp-enc-aescm128": { - "source": "apache" - }, - "video/rtx": { - "source": "apache" - }, - "video/smpte292m": { - "source": "apache" - }, - "video/ulpfec": { - "source": "apache" - }, - "video/vc1": { - "source": "apache" - }, - "video/vnd.cctv": { - "source": "apache" - }, - "video/vnd.dece.hd": { - "source": "apache", - "extensions": ["uvh","uvvh"] - }, - "video/vnd.dece.mobile": { - "source": "apache", - "extensions": ["uvm","uvvm"] - }, - "video/vnd.dece.mp4": { - "source": "apache" - }, - "video/vnd.dece.pd": { - "source": "apache", - "extensions": ["uvp","uvvp"] - }, - "video/vnd.dece.sd": { - "source": "apache", - "extensions": ["uvs","uvvs"] - }, - "video/vnd.dece.video": { - "source": "apache", - "extensions": ["uvv","uvvv"] - }, - "video/vnd.directv.mpeg": { - "source": "apache" - }, - "video/vnd.directv.mpeg-tts": { - "source": "apache" - }, - "video/vnd.dlna.mpeg-tts": { - "source": "apache" - }, - "video/vnd.dvb.file": { - "source": "apache", - "extensions": ["dvb"] - }, - "video/vnd.fvt": { - "source": "apache", - "extensions": ["fvt"] - }, - "video/vnd.hns.video": { - "source": "apache" - }, - "video/vnd.iptvforum.1dparityfec-1010": { - "source": "apache" - }, - "video/vnd.iptvforum.1dparityfec-2005": { - "source": "apache" - }, - "video/vnd.iptvforum.2dparityfec-1010": { - "source": "apache" - }, - "video/vnd.iptvforum.2dparityfec-2005": { - "source": "apache" - }, - "video/vnd.iptvforum.ttsavc": { - "source": "apache" - }, - "video/vnd.iptvforum.ttsmpeg2": { - "source": "apache" - }, - "video/vnd.motorola.video": { - "source": "apache" - }, - "video/vnd.motorola.videop": { - "source": "apache" - }, - "video/vnd.mpegurl": { - "source": "apache", - "extensions": ["mxu","m4u"] - }, - "video/vnd.ms-playready.media.pyv": { - "source": "apache", - "extensions": ["pyv"] - }, - "video/vnd.nokia.interleaved-multimedia": { - "source": "apache" - }, - "video/vnd.nokia.videovoip": { - "source": "apache" - }, - "video/vnd.objectvideo": { - "source": "apache" - }, - "video/vnd.sealed.mpeg1": { - "source": "apache" - }, - "video/vnd.sealed.mpeg4": { - "source": "apache" - }, - "video/vnd.sealed.swf": { - "source": "apache" - }, - "video/vnd.sealedmedia.softseal.mov": { - "source": "apache" - }, - "video/vnd.uvvu.mp4": { - "source": "apache", - "extensions": ["uvu","uvvu"] - }, - "video/vnd.vivo": { - "source": "apache", - "extensions": ["viv"] - }, - "video/webm": { - "source": "apache", - "compressible": false, - "extensions": ["webm"] - }, - "video/x-f4v": { - "source": "apache", - "extensions": ["f4v"] - }, - "video/x-fli": { - "source": "apache", - "extensions": ["fli"] - }, - "video/x-flv": { - "source": "apache", - "compressible": false, - "extensions": ["flv"] - }, - "video/x-m4v": { - "source": "apache", - "extensions": ["m4v"] - }, - "video/x-matroska": { - "source": "apache", - "compressible": false, - "extensions": ["mkv","mk3d","mks"] - }, - "video/x-mng": { - "source": "apache", - "extensions": ["mng"] - }, - "video/x-ms-asf": { - "source": "apache", - "extensions": ["asf","asx"] - }, - "video/x-ms-vob": { - "source": "apache", - "extensions": ["vob"] - }, - "video/x-ms-wm": { - "source": "apache", - "extensions": ["wm"] - }, - "video/x-ms-wmv": { - "source": "apache", - "compressible": false, - "extensions": ["wmv"] - }, - "video/x-ms-wmx": { - "source": "apache", - "extensions": ["wmx"] - }, - "video/x-ms-wvx": { - "source": "apache", - "extensions": ["wvx"] - }, - "video/x-msvideo": { - "source": "apache", - "extensions": ["avi"] - }, - "video/x-sgi-movie": { - "source": "apache", - "extensions": ["movie"] - }, - "video/x-smv": { - "source": "apache", - "extensions": ["smv"] - }, - "x-conference/x-cooltalk": { - "source": "apache", - "extensions": ["ice"] - }, - "x-shader/x-fragment": { - "compressible": true - }, - "x-shader/x-vertex": { - "compressible": true - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/index.js deleted file mode 100644 index 551031f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * mime-db - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = require('./db.json') diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/package.json deleted file mode 100644 index 493b360..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/package.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "name": "mime-db", - "description": "Media Type Database", - "version": "1.18.0", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - } - ], - "license": "MIT", - "keywords": [ - "mime", - "db", - "type", - "types", - "database", - "charset", - "charsets" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/mime-db" - }, - "devDependencies": { - "bluebird": "2.9.34", - "co": "4.6.0", - "cogent": "1.0.1", - "csv-parse": "1.0.0", - "gnode": "0.1.1", - "istanbul": "0.3.19", - "mocha": "1.21.5", - "raw-body": "2.1.2", - "stream-to-array": "2" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "db.json", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "build": "node scripts/build", - "fetch": "gnode scripts/fetch-apache && gnode scripts/fetch-iana && gnode scripts/fetch-nginx", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", - "update": "npm run fetch && npm run build" - }, - "gitHead": "c48209a8786e61f20499ba14167252ad67638c5f", - "bugs": { - "url": "https://github.com/jshttp/mime-db/issues" - }, - "homepage": "https://github.com/jshttp/mime-db", - "_id": "mime-db@1.18.0", - "_shasum": "5317e28224c08af1d484f60973dd386ba8f389e0", - "_from": "mime-db@>=1.18.0 <1.19.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "5317e28224c08af1d484f60973dd386ba8f389e0", - "tarball": "http://registry.npmjs.org/mime-db/-/mime-db-1.18.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.18.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/package.json deleted file mode 100644 index 09f70c8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/node_modules/mime-types/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "2.1.6", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": "https://searchbeam.jit.su" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - } - ], - "license": "MIT", - "keywords": [ - "mime", - "types" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/mime-types" - }, - "dependencies": { - "mime-db": "~1.18.0" - }, - "devDependencies": { - "istanbul": "0.3.19", - "mocha": "~1.21.5" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec test/test.js", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/test.js", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot test/test.js" - }, - "gitHead": "8bfa7c2c9a4ad07f5807c7a0e547e0246155944d", - "bugs": { - "url": "https://github.com/jshttp/mime-types/issues" - }, - "homepage": "https://github.com/jshttp/mime-types", - "_id": "mime-types@2.1.6", - "_shasum": "949f8788411864ddc70948a0f21c43f29d25667c", - "_from": "mime-types@>=2.1.6 <2.2.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "949f8788411864ddc70948a0f21c43f29d25667c", - "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-2.1.6.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.6.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/package.json deleted file mode 100644 index 5393f8b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/type-is/package.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "name": "type-is", - "description": "Infer the content-type of a request.", - "version": "1.6.8", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jshttp/type-is" - }, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.6" - }, - "devDependencies": { - "istanbul": "0.3.19", - "mocha": "~1.21.5" - }, - "engines": { - "node": ">= 0.6" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "scripts": { - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "keywords": [ - "content", - "type", - "checking" - ], - "gitHead": "6c93143cead7c596072133491b84f03a05403d3e", - "bugs": { - "url": "https://github.com/jshttp/type-is/issues" - }, - "homepage": "https://github.com/jshttp/type-is", - "_id": "type-is@1.6.8", - "_shasum": "3bac8c0c852754c855143e206d4a16e908bf0315", - "_from": "type-is@>=1.6.6 <1.7.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "3bac8c0c852754c855143e206d4a16e908bf0315", - "tarball": "http://registry.npmjs.org/type-is/-/type-is-1.6.8.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.8.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/.travis.yml deleted file mode 100644 index af92b02..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: "node_js" -node_js: - - "0.4" - - "0.6" - - "0.8" - - "0.10" diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/LICENSE deleted file mode 100644 index e33bd10..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -(The MIT License) - -Copyright (c) 2013 Jared Hanson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/README.md deleted file mode 100644 index 2f94e9b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# utils-merge - -Merges the properties from a source object into a destination object. - -## Install - - $ npm install utils-merge - -## Usage - -```javascript -var a = { foo: 'bar' } - , b = { bar: 'baz' }; - -merge(a, b); -// => { foo: 'bar', bar: 'baz' } -``` - -## Tests - - $ npm install - $ npm test - -[![Build Status](https://secure.travis-ci.org/jaredhanson/utils-merge.png)](http://travis-ci.org/jaredhanson/utils-merge) - -## Credits - - - [Jared Hanson](http://github.com/jaredhanson) - -## License - -[The MIT License](http://opensource.org/licenses/MIT) - -Copyright (c) 2013 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/index.js deleted file mode 100644 index 4265c69..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/index.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Merge object b with object a. - * - * var a = { foo: 'bar' } - * , b = { bar: 'baz' }; - * - * merge(a, b); - * // => { foo: 'bar', bar: 'baz' } - * - * @param {Object} a - * @param {Object} b - * @return {Object} - * @api public - */ - -exports = module.exports = function(a, b){ - if (a && b) { - for (var key in b) { - a[key] = b[key]; - } - } - return a; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/package.json deleted file mode 100644 index 305d5e1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/utils-merge/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "utils-merge", - "version": "1.0.0", - "description": "merge() utility function", - "keywords": [ - "util" - ], - "repository": { - "type": "git", - "url": "git://github.com/jaredhanson/utils-merge.git" - }, - "bugs": { - "url": "http://github.com/jaredhanson/utils-merge/issues" - }, - "author": { - "name": "Jared Hanson", - "email": "jaredhanson@gmail.com", - "url": "http://www.jaredhanson.net/" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://www.opensource.org/licenses/MIT" - } - ], - "main": "./index", - "dependencies": {}, - "devDependencies": { - "mocha": "1.x.x", - "chai": "1.x.x" - }, - "scripts": { - "test": "mocha --reporter spec --require test/bootstrap/node test/*.test.js" - }, - "engines": { - "node": ">= 0.4.0" - }, - "_id": "utils-merge@1.0.0", - "dist": { - "shasum": "0294fb922bb9375153541c4f7096231f287c8af8", - "tarball": "http://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" - }, - "_from": "utils-merge@1.0.0", - "_npmVersion": "1.2.25", - "_npmUser": { - "name": "jaredhanson", - "email": "jaredhanson@gmail.com" - }, - "maintainers": [ - { - "name": "jaredhanson", - "email": "jaredhanson@gmail.com" - } - ], - "directories": {}, - "_shasum": "0294fb922bb9375153541c4f7096231f287c8af8", - "_resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/jaredhanson/utils-merge" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/HISTORY.md deleted file mode 100644 index cddbcd4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/HISTORY.md +++ /dev/null @@ -1,23 +0,0 @@ -1.0.1 / 2015-07-08 -================== - - * Fix setting empty header from empty `field` - * perf: enable strict mode - * perf: remove argument reassignments - -1.0.0 / 2014-08-10 -================== - - * Accept valid `Vary` header string as `field` - * Add `vary.append` for low-level string manipulation - * Move to `jshttp` orgainzation - -0.1.0 / 2014-06-05 -================== - - * Support array of fields to set - -0.0.0 / 2014-06-04 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/LICENSE deleted file mode 100644 index 142ede3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/README.md deleted file mode 100644 index 5966542..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# vary - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Manipulate the HTTP Vary header - -## Installation - -```sh -$ npm install vary -``` - -## API - -```js -var vary = require('vary') -``` - -### vary(res, field) - -Adds the given header `field` to the `Vary` response header of `res`. -This can be a string of a single field, a string of a valid `Vary` -header, or an array of multiple fields. - -This will append the header if not already listed, otherwise leaves -it listed in the current location. - -```js -// Append "Origin" to the Vary header of the response -vary(res, 'Origin') -``` - -### vary.append(header, field) - -Adds the given header `field` to the `Vary` response header string `header`. -This can be a string of a single field, a string of a valid `Vary` header, -or an array of multiple fields. - -This will append the header if not already listed, otherwise leaves -it listed in the current location. The new header string is returned. - -```js -// Get header string appending "Origin" to "Accept, User-Agent" -vary.append('Accept, User-Agent', 'Origin') -``` - -## Examples - -### Updating the Vary header when content is based on it - -```js -var http = require('http') -var vary = require('vary') - -http.createServer(function onRequest(req, res) { - // about to user-agent sniff - vary(res, 'User-Agent') - - var ua = req.headers['user-agent'] || '' - var isMobile = /mobi|android|touch|mini/i.test(ua) - - // serve site, depending on isMobile - res.setHeader('Content-Type', 'text/html') - res.end('You are (probably) ' + (isMobile ? '' : 'not ') + 'a mobile user') -}) -``` - -## Testing - -```sh -$ npm test -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/vary.svg -[npm-url]: https://npmjs.org/package/vary -[node-version-image]: https://img.shields.io/node/v/vary.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/vary/master.svg -[travis-url]: https://travis-ci.org/jshttp/vary -[coveralls-image]: https://img.shields.io/coveralls/jshttp/vary/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/vary -[downloads-image]: https://img.shields.io/npm/dm/vary.svg -[downloads-url]: https://npmjs.org/package/vary diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/index.js deleted file mode 100644 index e818dbb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/index.js +++ /dev/null @@ -1,117 +0,0 @@ -/*! - * vary - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module exports. - */ - -module.exports = vary; -module.exports.append = append; - -/** - * Variables. - */ - -var separators = /[\(\)<>@,;:\\"\/\[\]\?=\{\}\u0020\u0009]/; - -/** - * Append a field to a vary header. - * - * @param {String} header - * @param {String|Array} field - * @return {String} - * @api public - */ - -function append(header, field) { - if (typeof header !== 'string') { - throw new TypeError('header argument is required'); - } - - if (!field) { - throw new TypeError('field argument is required'); - } - - // get fields array - var fields = !Array.isArray(field) - ? parse(String(field)) - : field; - - // assert on invalid fields - for (var i = 0; i < fields.length; i++) { - if (separators.test(fields[i])) { - throw new TypeError('field argument contains an invalid header'); - } - } - - // existing, unspecified vary - if (header === '*') { - return header; - } - - // enumerate current values - var val = header; - var vals = parse(header.toLowerCase()); - - // unspecified vary - if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { - return '*'; - } - - for (var i = 0; i < fields.length; i++) { - var fld = fields[i].toLowerCase(); - - // append value (case-preserving) - if (vals.indexOf(fld) === -1) { - vals.push(fld); - val = val - ? val + ', ' + fields[i] - : fields[i]; - } - } - - return val; -} - -/** - * Parse a vary header into an array. - * - * @param {String} header - * @return {Array} - * @api private - */ - -function parse(header) { - return header.trim().split(/ *, */); -} - -/** - * Mark that a request is varied on a header field. - * - * @param {Object} res - * @param {String|Array} field - * @api public - */ - -function vary(res, field) { - if (!res || !res.getHeader || !res.setHeader) { - // quack quack - throw new TypeError('res argument is required'); - } - - // get existing header - var val = res.getHeader('Vary') || '' - var header = Array.isArray(val) - ? val.join(', ') - : String(val); - - // set new header - if ((val = append(header, field))) { - res.setHeader('Vary', val); - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/package.json deleted file mode 100644 index 1a508fe..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/node_modules/vary/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "vary", - "description": "Manipulate the HTTP Vary header", - "version": "1.0.1", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "http", - "res", - "vary" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/vary" - }, - "devDependencies": { - "istanbul": "0.3.17", - "mocha": "2.2.5", - "supertest": "1.0.1" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "650282ff8e614731837040a23e10f51c20728392", - "bugs": { - "url": "https://github.com/jshttp/vary/issues" - }, - "homepage": "https://github.com/jshttp/vary", - "_id": "vary@1.0.1", - "_shasum": "99e4981566a286118dfb2b817357df7993376d10", - "_from": "vary@>=1.0.1 <1.1.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "99e4981566a286118dfb2b817357df7993376d10", - "tarball": "http://registry.npmjs.org/vary/-/vary-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/package.json deleted file mode 100644 index 16f99ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express/package.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "name": "express", - "description": "Fast, unopinionated, minimalist web framework", - "version": "4.13.3", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Aaron Heckmann", - "email": "aaron.heckmann+github@gmail.com" - }, - { - "name": "Ciaran Jessup", - "email": "ciaranj@gmail.com" - }, - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Guillermo Rauch", - "email": "rauchg@gmail.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com" - }, - { - "name": "Roman Shtylman", - "email": "shtylman+expressjs@gmail.com" - }, - { - "name": "Young Jae Sim", - "email": "hanul@hanul.me" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/strongloop/express" - }, - "homepage": "http://expressjs.com/", - "keywords": [ - "express", - "framework", - "sinatra", - "web", - "rest", - "restful", - "router", - "app", - "api" - ], - "dependencies": { - "accepts": "~1.2.12", - "array-flatten": "1.1.1", - "content-disposition": "0.5.0", - "content-type": "~1.0.1", - "cookie": "0.1.3", - "cookie-signature": "1.0.6", - "debug": "~2.2.0", - "depd": "~1.0.1", - "escape-html": "1.0.2", - "etag": "~1.7.0", - "finalhandler": "0.4.0", - "fresh": "0.3.0", - "merge-descriptors": "1.0.0", - "methods": "~1.1.1", - "on-finished": "~2.3.0", - "parseurl": "~1.3.0", - "path-to-regexp": "0.1.7", - "proxy-addr": "~1.0.8", - "qs": "4.0.0", - "range-parser": "~1.0.2", - "send": "0.13.0", - "serve-static": "~1.10.0", - "type-is": "~1.6.6", - "utils-merge": "1.0.0", - "vary": "~1.0.1" - }, - "devDependencies": { - "after": "0.8.1", - "ejs": "2.3.3", - "istanbul": "0.3.17", - "marked": "0.3.5", - "mocha": "2.2.5", - "should": "7.0.2", - "supertest": "1.0.1", - "body-parser": "~1.13.3", - "connect-redis": "~2.4.1", - "cookie-parser": "~1.3.5", - "cookie-session": "~1.2.0", - "express-session": "~1.11.3", - "jade": "~1.11.0", - "method-override": "~2.3.5", - "morgan": "~1.6.1", - "multiparty": "~4.1.2", - "vhost": "~3.0.1" - }, - "engines": { - "node": ">= 0.10.0" - }, - "files": [ - "LICENSE", - "History.md", - "Readme.md", - "index.js", - "lib/" - ], - "scripts": { - "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/", - "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/" - }, - "gitHead": "ef7ad681b245fba023843ce94f6bcb8e275bbb8e", - "bugs": { - "url": "https://github.com/strongloop/express/issues" - }, - "_id": "express@4.13.3", - "_shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3", - "_from": "express@*", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "rfeng", - "email": "enjoyjava@gmail.com" - }, - { - "name": "aredridel", - "email": "aredridel@dinhe.net" - }, - { - "name": "strongloop", - "email": "callback@strongloop.com" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3", - "tarball": "http://registry.npmjs.org/express/-/express-4.13.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/express/-/express-4.13.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/.npmignore deleted file mode 100644 index 1ca9571..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -npm-debug.log diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/HISTORY.md deleted file mode 100644 index 00bf0ad..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/HISTORY.md +++ /dev/null @@ -1,189 +0,0 @@ -Express3 Handlebars Change History -================================== - -0.5.1 (2014-08-05) ------------------- - -* __[!]__ Last release before `v1.0` which will have breaking changes. - -* Improved `extname` docs in README and added example. ([#30][] @Crashthatch) - -* `extname` can now be specified _without_ the leading `"."`. - ([#51][] @calvinmetcalf) - - -[#30]: https://github.com/ericf/express3-handlebars/issues/30 -[#51]: https://github.com/ericf/express3-handlebars/issues/51 - - -0.5.0 (2013-07-25) ------------------- - -* Added `loadTemplates()` method which will load all the templates in a - specified directory. ([#21][]) - -* Added support for multiple partials directories. This enables the - `partialsDir` configuration property to be specified as an *array* of - directories, and loads all of the templates in each one. - - This feature allows an app's partials to be split up in multiple directories, - which is common if an app has some shared partials which will also be exposed - to the client, and some server-side-only partials. ([#20][]) - -* Added runnable code examples in this package's "examples/" directory. - ([#22][]) - -* Improved optional argument handling in public methods to treat Express - `locals` function objects as `options` and not `callback` params to the method - being invoked. ([#27][]) - - -[#20]: https://github.com/ericf/express3-handlebars/issues/20 -[#21]: https://github.com/ericf/express3-handlebars/issues/21 -[#22]: https://github.com/ericf/express3-handlebars/issues/22 -[#27]: https://github.com/ericf/express3-handlebars/issues/27 - - -0.4.1 (2013-04-06) ------------------- - -* Updated `async` dependency to the latest stable minor version: "~0.2". - - -0.4.0 (2013-03-24) ------------------- - -* __[!]__ Removed the following "get" -> "load" aliases which kept in v0.2.0 for - back-compat: - - * `getPartials()` -> `loadPartials()` - * `getTemplate()` -> `loadTemplate()` - - This is the future version where these aliases have been removed. - -* __[!]__ Renamed `lib/express3-handlebars.js` -> `lib/express-handlebars.js`. - -* Exposed `getHandlebarsSemver()` function as a static property on the - `ExpressHandlebars` constructor. - -* Rearranged module exports by moving the engine factory function to `index.js`, - making the `lib/express3-handlebars.js` module only responsible for exporting - the `ExpressHandlebars` constructor. - - -0.3.3 (2013-03-22) ------------------- - -* Updated internal `_resolveLayoutPath()` method to take the full - `options`/locals objects which the view is rendered with. This makes it easier - to override. ([#14][]) - - -[#14]: https://github.com/ericf/express3-handlebars/issues/14 - - -0.3.2 (2013-02-20) ------------------- - -* Transfered ownership and copyright to Yahoo! Inc. This software is still free - to use, and is now licensed under the Yahoo! Inc. BSD license. - - -0.3.1 (2013-02-18) ------------------- - -* Updated README with info about `options.helpers` for `render()` and - `renderView()` docs. ([#7][]) - - -[#7]: https://github.com/ericf/express3-handlebars/issues/7 - - -0.3.0 (2013-02-18) ------------------- - -* Added support for render-level helpers, via `options.helpers`, to the - `render()` and `renderView()` methods. Handlebars' `registerHelper()` function - now works as expected and does not have to be called before the - `ExpressHandlebars` instance is created. Helpers are now merged from: - `handlebars.helpers` (global), `helpers` (instance), and `options.helpers` - (render-level) before a template is rendered; this provides flexibility at - all levels. ([#3][], [#11][]) - -* Added `handlebarsVersion` property which is the version number of `handlebars` - as a semver. This is used internally to branch on certain operations which - differ between Handlebars releases. - - -[#3]: https://github.com/ericf/express3-handlebars/issues/3 -[#11]: https://github.com/ericf/express3-handlebars/issues/11 - - -0.2.3 (2013-02-13) ------------------- - -* Fixed issue with naming nested partials when using the latest version of - Handlebars (1.0.rc.2). Previous versions require a hack to replace "/"s with - "."s in partial names, and the latest version of Handlebars fixes that bug. - This hack will only be applied to old versions of Handlebars. ([#9][]) - - -[#9]: https://github.com/ericf/express3-handlebars/issues/9 - - -0.2.2 (2013-02-04) ------------------- - -* Updated README with the public method renames which happened v0.2.0. - - -0.2.1 (2013-02-04) ------------------- - -* `extname`, `layoutsDir`, and `partialsDir` property values will now reference - the values on the prototype unless an `ExpressHandlebars` instance is - constructed with config values for these properties. - -* Improved clarity of method implementations, and exposed more override "hooks" - via new private methods: `_getPartialName()`, `_renderTemplate()`, and - `_resolveLayoutPath()`. - - -0.2.0 (2013-02-01) ------------------- - -* __[!]__ Renamed methods prefixed with "get" to "load" for clarity: - - * `getPartials()` -> `loadPartials()` - * `getTemplate()` -> `loadTemplate()` - - Aliases for these methods have been created to maintain back-compat, but the - old method names are now deprecated will be removed in the future. ([#5][]) - -* All paths are resolved before checking in or adding to caches. ([#1][]) - -* Force `{precompiled: false}` option within `render()` and `renderView()` - methods to prevent trying to render with precompiled templates. ([#2][]) - - -[#1]: https://github.com/ericf/express3-handlebars/issues/1 -[#2]: https://github.com/ericf/express3-handlebars/issues/2 -[#5]: https://github.com/ericf/express3-handlebars/issues/5 - - -0.1.2 (2013-01-10) ------------------- - -* Tweaked formatting of README documentation. - - -0.1.1 (2013-01-10) ------------------- - -* Added README documentation. - - -0.1.0 (2013-01-07) ------------------- - -* Initial release. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/LICENSE deleted file mode 100644 index 6fd9545..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright 2013 Yahoo! Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the Yahoo! Inc. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/README.md deleted file mode 100644 index 28343bb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/README.md +++ /dev/null @@ -1,642 +0,0 @@ -RENAMED TO: `express-handlebars` -================================ - -**This package has been renamed to [`express-handlebars`][new-npm], be sure to -update your `package.json` files.** - -See: - -[new-npm]: https://www.npmjs.org/package/express-handlebars - ----- - -Express3 Handlebars -=================== - -A [Handlebars][] view engine for [Express][] which doesn't suck. - -[![Dependency Status](https://david-dm.org/ericf/express3-handlebars.png)][status] - - -[Express]: https://github.com/visionmedia/express -[Handlebars]: https://github.com/wycats/handlebars.js -[status]: https://david-dm.org/ericf/express3-handlebars - - -Goals & Design --------------- - -I created this project out of frustration with the existing Handlebars view -engines for Express. As of version 3.x, Express got out of the business of being -a generic view engine — this was a great decision — leaving developers to -implement the concepts of layouts, partials, and doing file I/O for their -template engines of choice. - -### Goals and Features - -After building a half-dozen Express apps, I developed requirements and opinions -about what a Handlebars view engine should provide and how it should be -implemented. The following is that list: - -* Add back the concept of "layout", which was removed in Express 3.x. - -* Add back the concept of "partials" via Handlebars' partials mechanism. - -* Support a directory of partials; e.g., `{{> foo/bar}}` which exists on the - file system at `views/partials/foo/bar.handlebars` by default. - -* Smart file system I/O and template caching. When in development, templates are - always loaded from disk. In production, raw files and compiled templates are - cached, including partials. - -* All async and non-blocking. File system I/O is slow and servers should not be - blocked from handling requests while reading from disk. I/O queuing is used to - avoid doing unnecessary work. - -* Ability to expose precompiled templates and partials to the client, enabling - template sharing and reuse. - -* Ability to use a different Handlebars module/implementation other than the - Handlebars npm package. - -### Package Design - -This package was designed to work great for both the simple and complex use -cases. I _intentionally_ made sure the full implementation is exposed and is -easily overrideable. - -The package exports a function which can be invoked with no arguments or with a -`config` object and it will return a function (closed over sane defaults) which -can be registered with an Express app. It's an engine factory function. - -This exported engine factory has two properties which expose the underlying -implementation: - -* `ExpressHandlebars()`: The constructor function which holds the internal - implementation on its `prototype`. This produces instance objects which store - their configuration, `compiled` and `precompiled` templates, and expose an - `engine()` function which can be registered with an Express app. - -* `create()`: A convenience factory function for creating `ExpressHandlebars` - instances. - -An instance-based approach is used so that multiple `ExpressHandlebars` -instances can be created with their own configuration, templates, partials, and -helpers. - - -Installation ------------- - -Install using npm: - -```shell -$ npm install express3-handlebars -``` - - -Usage ------ - -This view engine uses sane defaults that leverage the "Express-way" of -structuring an app's views. This makes it trivial to use in basic apps: - -### Basic Usage - -**Directory Structure:** - -``` -. -├── app.js -└── views - ├── home.handlebars - └── layouts - └── main.handlebars - -2 directories, 3 files -``` - -**app.js:** - -Creates a super simple Express app which shows the basic way to register a -Handlebars view engine using this package. - -```javascript -var express = require('express'), - exphbs = require('express3-handlebars'), - - app = express(); - -app.engine('handlebars', exphbs({defaultLayout: 'main'})); -app.set('view engine', 'handlebars'); - -app.get('/', function (req, res) { - res.render('home'); -}); - -app.listen(3000); -``` - -**views/layouts/main.handlebars:** - -The main layout is the HTML page wrapper which can be reused for the different -views of the app. `{{{body}}}` is used as a placeholder for where the main -content should be rendered. - -```html - - - - - Example App - - - - {{{body}}} - - - -``` - -**views/home.handlebars:** - -The content for the app's home view which will be rendered into the layout's -`{{{body}}}`. - -```html -

Example App: Home

-``` - -#### Running the Example - -The above example is bundled in this package's [examples directory][], where -it can be run by: - -```shell -$ cd examples/basic/ && node app -``` - -### Using Instances - -Another way to use this view engine is to create an instance(s) of -`ExpressHandlebars`, allowing access to the full API: - -```javascript -var express = require('express'), - exphbs = require('express3-handlebars'), - - app = express(), - hbs = exphbs.create({ /* config */ }); - -// Register `hbs.engine` with the Express app. -app.engine('handlebars', hbs.engine); -app.set('view engine', 'handlebars'); - -// ...still have a reference to `hbs`, on which methods like `loadPartials()` -// can be called. -``` - -**Note:** The [Advanced Usage][] example demonstrates how `ExpressHandlebars` -instances can be leveraged. - -### Template Caching - -This view engine uses a smart template caching strategy. In development, -templates will always be loaded from disk, i.e., no caching. In production, raw -files and compiled Handlebars templates are aggressively cached. - -The easiest way to control template/view caching is through Express' -[view cache setting][]: - -```javascript -app.enable('view cache'); -``` - -Express enables this setting by default when in production mode, i.e., -`process.env.NODE_ENV === "production"`. - -**Note:** All of the public API methods accept `options.cache`, which gives -control over caching when calling these methods directly. - -### Layouts - -A layout is simply a Handlebars template with a `{{{body}}}` placeholder. -Usually it will be an HTML page wrapper into which views will be rendered. - -This view engine adds back the concept of "layout", which was removed in Express -3.x. It can be configured with a path to the layouts directory, by default it's -set to `"views/layouts/"`. - -There are two ways to set a default layout: configuring the view engine's -`defaultLayout` property, or setting [Express locals][] `app.locals.layout`. - -The layout into which a view should be rendered can be overridden per-request -by assigning a different value to the `layout` request local. The following -will render the "home" view with no layout: - -```javascript -app.get('/', function (req, res, next) { - res.render('home', {layout: false}); -}); -``` - -### Helpers - -Helper functions, or "helpers" are functions that can be -[registered with Handlebars][] and can be called within a template. Helpers can -be used for transforming output, iterating over data, etc. To keep with the -spirit of *logic-less* templates, helpers are the place where logic should be -defined. - -Handlebars ships with some [built-in helpers][], such as: `with`, `if`, `each`, -etc. Most application will need to extend this set of helpers to include -app-specific logic and transformations. Beyond defining global helpers on -`Handlebars`, this view engine supports `ExpressHandlebars` instance-level -helpers via the `helpers` configuration property, and render-level helpers via -`options.helpers` when calling the `render()` and `renderView()` methods. - -The following example shows helpers being specified at each level: - -**app.js:** - -Creates a super simple Express app which shows the basic way to register -`ExpressHandlebars` instance-level helpers, and override one at the -render-level. - -```javascript -var express = require('express'), - exphbs = require('express3-handlebars'), - - app = express(), - hbs; - -hbs = exphbs.create({ - // Specify helpers which are only registered on this instance. - helpers: { - foo: function () { return 'FOO!'; }, - bar: function () { return 'BAR!'; } - } -}); - -app.engine('handlebars', hbs.engine); -app.set('view engine', 'handlebars'); - -app.get('/', function (req, res, next) { - res.render('home', { - showTitle: true, - - // Override `foo` helper only for this rendering. - helpers: { - foo: function () { return 'foo.'; } - } - }); -}); - -app.listen(3000); -``` - -**views/home.handlebars:** - -The app's home view which uses helper functions to help render the contents. - -```html - - - - - Example App - Home - - - - - {{#if showTitle}} -

Home

- {{/if}} - - -

{{foo}}

- - -

{{bar}}

- - - -``` - -#### More on Helpers - -Refer to the [Handlebars website][] for more information on defining helpers: - -* [Expression Helpers][] -* [Block Helpers][] - - -[examples directory]: https://github.com/ericf/express3-handlebars/tree/master/examples -[view cache setting]: http://expressjs.com/api.html#app-settings -[Express locals]: http://expressjs.com/api.html#app.locals -[registered with Handlebars]: https://github.com/wycats/handlebars.js/#registering-helpers -[built-in helpers]: http://handlebarsjs.com/#builtins -[Handlebars website]: http://handlebarsjs.com/ -[Expression Helpers]: http://handlebarsjs.com/expressions.html#helpers -[Block Helpers]: http://handlebarsjs.com/block_helpers.html - - -API ---- - -### Configuration and Defaults - -There are two main ways to use this package: via its engine factory function, or -creating `ExpressHandlebars` instances; both use the same configuration -properties and defaults. - -```javascript -var exphbs = require('express3-handlebars'); - -// Using the engine factory: -exphbs({ /* config */ }); - -// Create an instance: -exphbs.create({ /* config */ }); -``` - -The following is the list of configuration properties and their default values -(if any): - -#### `defaultLayout` -The string name or path of a template in the `layoutsDir` to use as the default -layout. This is overridden by a `layout` specified in the app or response -`locals`. **Note:** A falsy value will render without a layout; e.g., -`res.render('home', {layout: false});`. - -#### `extname=".handlebars"` -The string name of the file extension used by the templates. This value should -correspond with the `extname` under which this view engine is registered with -Express when calling `app.engine()`. - -The following example sets up an Express app to use `.hbs` as the file extension -for views: - -```javascript -var express = require('express'), - exphbs = require('express3-handlebars'), - - app = express(); - -app.engine('.hbs', exphbs({extname: '.hbs'})); -app.set('view engine', '.hbs'); -``` - -**Note:** Setting the app's `"view engine"` setting will make that value the -default file extension used for looking up views. - -#### `handlebars=require('handlebars')` -The Handlebars module/implementation. This allows for the `ExpressHandlebars` -instance to use a different Handlebars module/implementation than that provided -by the Handlebars npm package. - -#### `helpers` -An object which holds the helper functions used when rendering templates with -this `ExpressHandlebars` instance. When rendering a template, a collection of -helpers will be generated by merging: `handlebars.helpers` (global), `helpers` -(instance), and `options.helpers` (render-level). This allows Handlebars' -`registerHelper()` function to operate as expected, will providing two extra -levels over helper overrides. - -#### `layoutsDir="views/layouts/"` -The string path to the directory where the layout templates reside. - -#### `partialsDir="views/partials/"` -The string path to the directory where the partials templates reside. - -### Properties - -The public API properties are provided via `ExpressHandlebars` instances. In -additional to the properties listed in the **Configuration and Defaults** -section, the following are additional public properties: - -#### `compiled` -An object cache which holds compiled Handlebars template functions in the -format: `{"path/to/template": [Function]}`. - -#### `engine` -A function reference to the `renderView()` method which is bound to `this` -`ExpressHandlebars` instance. This bound function should be used when -registering this view engine with an Express app. - -#### `handlebarsVersion` -The version number of `handlebars` as a semver. This is unsed internally to -branch on certain operations which differ between Handlebars releases. - -#### `precompiled` -An object cache which holds precompiled Handlebars template strings in the -format: `{"path/to/template": [String]}`. - -### Methods - -The following is the list of public API methods provided via `ExpressHandlebars` -instances: - -#### `loadPartials(options|callback, [callback])` - -Retrieves the partials in the `partialsDir` and passes an object mapping the -partials in the form `{name: partial}` to the `callback`. - -By default each partial will be a compiled Handlebars template function. Use -`options.precompiled` to receive the partials as precompiled templates — this is -useful for sharing templates with client code. - -**Parameters:** - -* `[options]`: Optional object containing any of the following properties: - - * `[cache]`: Whether cached templates can be used if they have already been - requested. This is recommended for production to avoid unnecessary file I/O. - - * `[precompiled=false]`: Whether precompiled templates should be provided, - instead of compiled Handlebars template functions. - -* `callback`: Function to call once the partials are retrieved. - -The name of each partial corresponds to its location in `partialsDir`. For -example, consider the following directory structure: - -``` -views -└── partials - ├── foo - │   └── bar.handlebars - └── title.handlebars - -2 directories, 2 files -``` - -`loadPartials()` would produce the following result: - -```javascript -var hbs = require('express3-handlebars').create(); - -hbs.loadPartials(function (err, partials) { - console.log(partials); - // => { 'foo.bar': [Function], - // => title: [Function] } -}); -``` - -**Note:** The partial name `"foo.bar"` would ideally be `"foo/bar"`, but this is -being prevented by a [Handlebars bug][]. Once this bug is fixed, a future -version will use a "/" separator. Templates requiring the partial still use: -`{{> foo/bar}}`. - -#### `loadTemplate(filePath, options|callback, [callback])` - -Retrieves the template at the specified `filePath` and passes a compiled -Handlebars template function to the `callback`. - -Use `options.precompiled` to receive a precompiled Handlebars template. - -**Parameters:** - -* `filePath`: String path to the Handlebars template file. - -* `[options]`: Optional object containing any of the following properties: - - * `[cache]`: Whether a cached template can be used if it have already been - requested. This is recommended for production to avoid necessary file I/O. - - * `[precompiled=false]`: Whether a precompiled template should be provided, - instead of a compiled Handlebars template function. - -* `callback`: Function to call once the template is retrieved. - -#### `loadTemplates(dirPath, options|callback, [callback])` - -Retrieves the all the templates in the specified `dirPath` and passes an object -mapping the compiled templates in the form `{filename: template}` to the -`callback`. - -Use `options.precompiled` to receive precompiled Handlebars templates — this is -useful for sharing templates with client code. - -**Parameters:** - -* `dirPath`: String path to the directory containing Handlebars template files. - -* `[options]`: Optional object containing any of the following properties: - - * `[cache]`: Whether cached templates can be used if it have already been - requested. This is recommended for production to avoid necessary file I/O. - - * `[precompiled=false]`: Whether precompiled templates should be provided, - instead of a compiled Handlebars template function. - -* `callback`: Function to call once the templates are retrieved. - -#### `render(filePath, options|callback, [callback])` - -Renders the template at the specified `filePath` using this instance's `helpers` -and partials, and passes the resulting string to the `callback`. - -The `options` will be used both as the context in which the Handlebars template -is rendered, and to signal this view engine on how it should behave, e.g., -`options.cache = false` will load _always_ load the templates from disk. - -**Parameters:** - -* `filePath`: String path to the Handlebars template file. - -* `[options]`: Optional object which will serve as the context in which the - Handlebars template is rendered. It may also contain any of the following - properties which affect this view engine's behavior: - - * `[cache]`: Whether a cached template can be used if it have already been - requested. This is recommended for production to avoid unnecessary file I/O. - - * `[helpers]`: Render-level helpers should be merged with (and will override) - instance and global helper functions. - -* `callback`: Function to call once the template is retrieved. - -#### `renderView(viewPath, options|callback, [callback])` - -Renders the template at the specified `viewPath` as the `{{{body}}}` within the -layout specified by the `defaultLayout` or `options.layout`. Rendering will use -this instance's `helpers` and partials, and passes the resulting string to the -`callback`. - -This method is called by Express and is the main entry point into this Express -view engine implementation. It adds the concept of a "layout" and delegates -rendering to the `render()` method. - -The `options` will be used both as the context in which the Handlebars templates -are rendered, and to signal this view engine on how it should behave, e.g., -`options.cache=false` will load _always_ load the templates from disk. - -**Parameters:** - -* `viewPath`: String path to the Handlebars template file which should serve as - the `{{{body}}}` when using a layout. - -* `[options]`: Optional object which will serve as the context in which the - Handlebars templates are rendered. It may also contain any of the following - properties which affect this view engine's behavior: - - * `[cache]`: Whether cached templates can be used if they have already been - requested. This is recommended for production to avoid unnecessary file I/O. - - * `[helpers]`: Render-level helpers should be merged with (and will override) - instance and global helper functions. - - * `[layout]`: Optional string path to the Handlebars template file to be used - as the "layout". This overrides any `defaultLayout` value. Passing a falsy - value will render with no layout (even if a `defaultLayout` is defined). - -* `callback`: Function to call once the template is retrieved. - -### Statics - -The following is the list of static API properties and methods provided on the -`ExpressHandlebars` constructor: - -#### `getHandlebarsSemver(handlebars)` - -Returns a semver-compatible version string for the specified `handlebars` -module/implementation. - -This utility function is used to compute the value for an `ExpressHandlebars` -instance's `handlebarsVersion` property. - - -[Handlebars bug]: https://github.com/wycats/handlebars.js/pull/389 - - -Examples --------- - -### [Basic Usage][] - -This example shows the most basic way to use this view engine. - -### [Advanced Usage][] - -This example is more comprehensive and shows how to use many of the features of -this view engine, including helpers, partials, multiple layouts, etc. - -As noted in the **Package Design** section, this view engine's implementation is -instance-based, and more advanced usages can take advantage of this. The -Advanced Usage example demonstrates how to use an `ExpressHandlebars` instance -to share templates with the client, among other features. - - -[Basic Usage]: https://github.com/ericf/express3-handlebars/tree/master/examples/basic -[Advanced Usage]: https://github.com/ericf/express3-handlebars/tree/master/examples/advanced - - -License -------- - -This software is free to use under the Yahoo! Inc. BSD license. -See the [LICENSE file][] for license text and copyright information. - - -[LICENSE file]: https://github.com/ericf/express3-handlebars/blob/master/LICENSE diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/app.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/app.js deleted file mode 100644 index 2b7d8ae..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/app.js +++ /dev/null @@ -1,99 +0,0 @@ -var express = require('express'), - exphbs = require('../../'), // "express3-handlebars" - helpers = require('./lib/helpers'), - - app = express(), - hbs; - -// Create `ExpressHandlebars` instance with a default layout. -hbs = exphbs.create({ - defaultLayout: 'main', - helpers : helpers, - - // Uses multiple partials dirs, templates in "shared/templates/" are shared - // with the client-side of the app (see below). - partialsDir: [ - 'shared/templates/', - 'views/partials/' - ] -}); - -// Register `hbs` as our view engine using its bound `engine()` function. -app.engine('handlebars', hbs.engine); -app.set('view engine', 'handlebars'); - -// Middleware to expose the app's shared templates to the cliet-side of the app -// for pages which need them. -function exposeTemplates(req, res, next) { - // Uses the `ExpressHandlebars` instance to get the get the **precompiled** - // templates which will be shared with the client-side of the app. - hbs.loadTemplates('shared/templates/', { - cache : app.enabled('view cache'), - precompiled: true - }, function (err, templates) { - if (err) { return next(err); } - - // RegExp to remove the ".handlebars" extension from the template names. - var extRegex = new RegExp(hbs.extname + '$'); - - // Creates an array of templates which are exposed via - // `res.locals.templates`. - templates = Object.keys(templates).map(function (name) { - return { - name : name.replace(extRegex, ''), - template: templates[name] - }; - }); - - // Exposes the templates during view rendering. - if (templates.length) { - res.locals.templates = templates; - } - - next(); - }); -} - -app.get('/', function (req, res) { - res.render('home', { - title: 'Home' - }); -}); - -app.get('/yell', function (req, res) { - res.render('yell', { - title: 'Yell', - - // This `message` will be transformed by our `yell()` helper. - message: 'hello world' - }); -}); - -app.get('/exclaim', function (req, res) { - res.render('yell', { - title : 'Exclaim', - message: 'hello world', - - // This overrides _only_ the default `yell()` helper. - helpers: { - yell: function (msg) { - return (msg + '!!!'); - } - } - }); -}); - -app.get('/echo/:message?', exposeTemplates, function (req, res) { - res.render('echo', { - title : 'Echo', - message: req.params.message, - - // Overrides which layout to use, instead of the defaul "main" layout. - layout: 'shared-templates' - }); -}); - -app.use(express.static('public/')); -app.listen(3000); - -console.log('express3-handlebars example server listening on: 3000'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/lib/helpers.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/lib/helpers.js deleted file mode 100644 index 7f36cf6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/lib/helpers.js +++ /dev/null @@ -1,3 +0,0 @@ -exports.yell = function (msg) { - return msg.toUpperCase(); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/.npmignore deleted file mode 100644 index 52fcd60..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/.npmignore +++ /dev/null @@ -1,11 +0,0 @@ -.git* -benchmarks/ -coverage/ -docs/ -examples/ -support/ -test/ -testing.js -.DS_Store -.travis.yml -Contributing.md diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/History.md deleted file mode 100644 index ad56b36..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/History.md +++ /dev/null @@ -1,1924 +0,0 @@ -4.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - * deps: serve-static@~1.4.2 - -4.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - * deps: serve-static@~1.4.1 - -4.7.0 / 2014-07-25 -================== - - * fix `req.protocol` for proxy-direct connections - * configurable query parser with `app.set('query parser', parser)` - - `app.set('query parser', 'extended')` parse with "qs" module - - `app.set('query parser', 'simple')` parse with "querystring" core module - - `app.set('query parser', false)` disable query string parsing - - `app.set('query parser', true)` enable simple parsing - * deprecate `res.json(status, obj)` -- use `res.status(status).json(obj)` instead - * deprecate `res.jsonp(status, obj)` -- use `res.status(status).jsonp(obj)` instead - * deprecate `res.send(status, body)` -- use `res.status(status).send(body)` instead - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: finalhandler@0.1.0 - - Respond after request fully read - - deps: debug@1.0.4 - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - * deps: serve-static@~1.4.0 - - deps: parseurl@~1.2.0 - - deps: send@0.7.0 - * perf: prevent multiple `Buffer` creation in `res.send` - -4.6.1 / 2014-07-12 -================== - - * fix `subapp.mountpath` regression for `app.use(subapp)` - -4.6.0 / 2014-07-11 -================== - - * accept multiple callbacks to `app.use()` - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * catch errors in multiple `req.param(name, fn)` handlers - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * support non-string `path` in `app.use(path, fn)` - - supports array of paths - - supports `RegExp` - * router: fix optimization on router exit - * router: refactor location of `try` blocks - * router: speed up standard `app.use(fn)` - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: finalhandler@0.0.3 - - deps: debug@1.0.3 - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - * deps: path-to-regexp@0.1.3 - * deps: send@0.6.0 - - deps: debug@1.0.3 - * deps: serve-static@~1.3.2 - - deps: parseurl@~1.1.3 - - deps: send@0.6.0 - * perf: fix arguments reassign deopt in some `res` methods - -4.5.1 / 2014-07-06 -================== - - * fix routing regression when altering `req.method` - -4.5.0 / 2014-07-04 -================== - - * add deprecation message to non-plural `req.accepts*` - * add deprecation message to `res.send(body, status)` - * add deprecation message to `res.vary()` - * add `headers` option to `res.sendfile` - - use to set headers on successful file transfer - * add `mergeParams` option to `Router` - - merges `req.params` from parent routes - * add `req.hostname` -- correct name for what `req.host` returns - * deprecate things with `depd` module - * deprecate `req.host` -- use `req.hostname` instead - * fix behavior when handling request without routes - * fix handling when `route.all` is only route - * invoke `router.param()` only when route matches - * restore `req.params` after invoking router - * use `finalhandler` for final response handling - * use `media-typer` to alter content-type charset - * deps: accepts@~1.0.7 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - * deps: serve-static@~1.3.0 - - Accept string for `maxAge` (converted by `ms`) - - Add `setHeaders` option - - Include HTML link in redirect response - - deps: send@0.5.0 - * deps: type-is@~1.3.2 - -4.4.5 / 2014-06-26 -================== - - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -4.4.4 / 2014-06-20 -================== - - * fix `res.attachment` Unicode filenames in Safari - * fix "trim prefix" debug message in `express:router` - * deps: accepts@~1.0.5 - * deps: buffer-crc32@0.2.3 - -4.4.3 / 2014-06-11 -================== - - * fix persistence of modified `req.params[name]` from `app.param()` - * deps: accepts@1.0.3 - - deps: negotiator@0.4.6 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - * deps: serve-static@1.2.3 - - Do not throw un-catchable error on file open race condition - - deps: send@0.4.3 - -4.4.2 / 2014-06-09 -================== - - * fix catching errors from top-level handlers - * use `vary` module for `res.vary` - * deps: debug@1.0.1 - * deps: proxy-addr@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - * deps: serve-static@1.2.2 - - fix "event emitter leak" warnings - - deps: send@0.4.2 - * deps: type-is@1.2.1 - -4.4.1 / 2014-06-02 -================== - - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - * deps: serve-static@1.2.1 - - use `escape-html` for escaping - - deps: send@0.4.1 - -4.4.0 / 2014-05-30 -================== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * mark `res.send` ETag as weak and reduce collisions - * update accepts to 1.0.2 - - Fix interpretation when header not in request - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - * update serve-static to 1.2.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: send@0.4.0 - -4.3.2 / 2014-05-28 -================== - - * fix handling of errors from `router.param()` callbacks - -4.3.1 / 2014-05-23 -================== - - * revert "fix behavior of multiple `app.VERB` for the same path" - - this caused a regression in the order of route execution - -4.3.0 / 2014-05-21 -================== - - * add `req.baseUrl` to access the path stripped from `req.url` in routes - * fix behavior of multiple `app.VERB` for the same path - * fix issue routing requests among sub routers - * invoke `router.param()` only when necessary instead of every match - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * set proper `charset` in `Content-Type` for `res.send` - * update type-is to 1.2.0 - - support suffix matching - -4.2.0 / 2014-05-11 -================== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * fix `req.next` when inside router instance - * include `ETag` header in `HEAD` requests - * keep previous `Content-Type` for `res.jsonp` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update debug to 0.8.0 - - add `enable()` method - - change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - -4.1.2 / 2014-05-08 -================== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -4.1.1 / 2014-04-27 -================== - - * fix package.json to reflect supported node version - -4.1.0 / 2014-04-24 -================== - - * pass options from `res.sendfile` to `send` - * preserve casing of headers in `res.header` and `res.set` - * support unicode file names in `res.attachment` and `res.download` - * update accepts to 1.0.1 - - deps: negotiator@0.4.0 - * update cookie to 0.1.2 - - Fix for maxAge == 0 - - made compat with expires field - * update send to 0.3.0 - - Accept API options in options object - - Coerce option types - - Control whether to generate etags - - Default directory access to 403 when index disabled - - Fix sending files with dots without root set - - Include file path in etag - - Make "Can't set headers after they are sent." catchable - - Send full entity-body for multi range requests - - Set etags to "weak" - - Support "If-Range" header - - Support multiple index paths - - deps: mime@1.2.11 - * update serve-static to 1.1.0 - - Accept options directly to `send` module - - Resolve relative paths at middleware setup - - Use parseurl to parse the URL from request - - deps: send@0.3.0 - * update type-is to 1.1.0 - - add non-array values support - - add `multipart` as a shorthand - -4.0.0 / 2014-04-09 -================== - - * remove: - - node 0.8 support - - connect and connect's patches except for charset handling - - express(1) - moved to [express-generator](https://github.com/expressjs/generator) - - `express.createServer()` - it has been deprecated for a long time. Use `express()` - - `app.configure` - use logic in your own app code - - `app.router` - is removed - - `req.auth` - use `basic-auth` instead - - `req.accepted*` - use `req.accepts*()` instead - - `res.location` - relative URL resolution is removed - - `res.charset` - include the charset in the content type when using `res.set()` - - all bundled middleware except `static` - * change: - - `app.route` -> `app.mountpath` when mounting an express app in another express app - - `json spaces` no longer enabled by default in development - - `req.accepts*` -> `req.accepts*s` - i.e. `req.acceptsEncoding` -> `req.acceptsEncodings` - - `req.params` is now an object instead of an array - - `res.locals` is no longer a function. It is a plain js object. Treat it as such. - - `res.headerSent` -> `res.headersSent` to match node.js ServerResponse object - * refactor: - - `req.accepts*` with [accepts](https://github.com/expressjs/accepts) - - `req.is` with [type-is](https://github.com/expressjs/type-is) - - [path-to-regexp](https://github.com/component/path-to-regexp) - * add: - - `app.router()` - returns the app Router instance - - `app.route()` - Proxy to the app's `Router#route()` method to create a new route - - Router & Route - public API - -3.15.2 / 2014-07-27 -=================== - - * deps: connect@2.24.2 - - deps: body-parser@~1.5.2 - - deps: depd@0.4.4 - - deps: express-session@~1.7.2 - - deps: morgan@~1.2.2 - - deps: serve-static@~1.4.2 - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - -3.15.1 / 2014-07-26 -=================== - - * deps: connect@2.24.1 - - deps: body-parser@~1.5.1 - - deps: depd@0.4.3 - - deps: express-session@~1.7.1 - - deps: morgan@~1.2.1 - - deps: serve-index@~1.1.4 - - deps: serve-static@~1.4.1 - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - -3.15.0 / 2014-07-22 -=================== - - * Fix `req.protocol` for proxy-direct connections - * Pass options from `res.sendfile` to `send` - * deps: connect@2.24.0 - - deps: body-parser@~1.5.0 - - deps: compression@~1.0.9 - - deps: connect-timeout@~1.2.1 - - deps: debug@1.0.4 - - deps: depd@0.4.2 - - deps: express-session@~1.7.0 - - deps: finalhandler@0.1.0 - - deps: method-override@~2.1.2 - - deps: morgan@~1.2.0 - - deps: multiparty@3.3.1 - - deps: parseurl@~1.2.0 - - deps: serve-static@~1.4.0 - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -3.14.0 / 2014-07-11 -=================== - - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * deps: basic-auth@1.0.0 - - support empty password - - support empty username - * deps: connect@2.23.0 - - deps: debug@1.0.3 - - deps: express-session@~1.6.4 - - deps: method-override@~2.1.0 - - deps: parseurl@~1.1.3 - - deps: serve-static@~1.3.1 - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -3.13.0 / 2014-07-03 -=================== - - * add deprecation message to `app.configure` - * add deprecation message to `req.auth` - * use `basic-auth` to parse `Authorization` header - * deps: connect@2.22.0 - - deps: csurf@~1.3.0 - - deps: express-session@~1.6.1 - - deps: multiparty@3.3.0 - - deps: serve-static@~1.3.0 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - -3.12.1 / 2014-06-26 -=================== - - * deps: connect@2.21.1 - - deps: cookie-parser@1.3.2 - - deps: cookie-signature@1.0.4 - - deps: express-session@~1.5.2 - - deps: type-is@~1.3.2 - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -3.12.0 / 2014-06-21 -=================== - - * use `media-typer` to alter content-type charset - * deps: connect@2.21.0 - - deprecate `connect(middleware)` -- use `app.use(middleware)` instead - - deprecate `connect.createServer()` -- use `connect()` instead - - fix `res.setHeader()` patch to work with with get -> append -> set pattern - - deps: compression@~1.0.8 - - deps: errorhandler@~1.1.1 - - deps: express-session@~1.5.0 - - deps: serve-index@~1.1.3 - -3.11.0 / 2014-06-19 -=================== - - * deprecate things with `depd` module - * deps: buffer-crc32@0.2.3 - * deps: connect@2.20.2 - - deprecate `verify` option to `json` -- use `body-parser` npm module instead - - deprecate `verify` option to `urlencoded` -- use `body-parser` npm module instead - - deprecate things with `depd` module - - use `finalhandler` for final response handling - - use `media-typer` to parse `content-type` for charset - - deps: body-parser@1.4.3 - - deps: connect-timeout@1.1.1 - - deps: cookie-parser@1.3.1 - - deps: csurf@1.2.2 - - deps: errorhandler@1.1.0 - - deps: express-session@1.4.0 - - deps: multiparty@3.2.9 - - deps: serve-index@1.1.2 - - deps: type-is@1.3.1 - - deps: vhost@2.0.0 - -3.10.5 / 2014-06-11 -=================== - - * deps: connect@2.19.6 - - deps: body-parser@1.3.1 - - deps: compression@1.0.7 - - deps: debug@1.0.2 - - deps: serve-index@1.1.1 - - deps: serve-static@1.2.3 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -3.10.4 / 2014-06-09 -=================== - - * deps: connect@2.19.5 - - fix "event emitter leak" warnings - - deps: csurf@1.2.1 - - deps: debug@1.0.1 - - deps: serve-static@1.2.2 - - deps: type-is@1.2.1 - * deps: debug@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: finished@1.2.1 - - deps: debug@1.0.1 - -3.10.3 / 2014-06-05 -=================== - - * use `vary` module for `res.vary` - * deps: connect@2.19.4 - - deps: errorhandler@1.0.2 - - deps: method-override@2.0.2 - - deps: serve-favicon@2.0.1 - * deps: debug@1.0.0 - -3.10.2 / 2014-06-03 -=================== - - * deps: connect@2.19.3 - - deps: compression@1.0.6 - -3.10.1 / 2014-06-03 -=================== - - * deps: connect@2.19.2 - - deps: compression@1.0.4 - * deps: proxy-addr@1.0.1 - -3.10.0 / 2014-06-02 -=================== - - * deps: connect@2.19.1 - - deprecate `methodOverride()` -- use `method-override` npm module instead - - deps: body-parser@1.3.0 - - deps: method-override@2.0.1 - - deps: multiparty@3.2.8 - - deps: response-time@2.0.0 - - deps: serve-static@1.2.1 - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -3.9.0 / 2014-05-30 -================== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * Include ETag in HEAD requests - * mark `res.send` ETag as weak and reduce collisions - * update connect to 2.18.0 - - deps: compression@1.0.3 - - deps: serve-index@1.1.0 - - deps: serve-static@1.2.0 - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - -3.8.1 / 2014-05-27 -================== - - * update connect to 2.17.3 - - deps: body-parser@1.2.2 - - deps: express-session@1.2.1 - - deps: method-override@1.0.2 - -3.8.0 / 2014-05-21 -================== - - * keep previous `Content-Type` for `res.jsonp` - * set proper `charset` in `Content-Type` for `res.send` - * update connect to 2.17.1 - - fix `res.charset` appending charset when `content-type` has one - - deps: express-session@1.2.0 - - deps: morgan@1.1.1 - - deps: serve-index@1.0.3 - -3.7.0 / 2014-05-18 -================== - - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * update connect to 2.16.2 - - deprecate `res.headerSent` -- use `res.headersSent` - - deprecate `res.on("header")` -- use on-headers module instead - - fix edge-case in `res.appendHeader` that would append in wrong order - - json: use body-parser - - urlencoded: use body-parser - - dep: bytes@1.0.0 - - dep: cookie-parser@1.1.0 - - dep: csurf@1.2.0 - - dep: express-session@1.1.0 - - dep: method-override@1.0.1 - -3.6.0 / 2014-05-09 -================== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update connect to 2.15.0 - * Add `res.appendHeader` - * Call error stack even when response has been sent - * Patch `res.headerSent` to return Boolean - * Patch `res.headersSent` for node.js 0.8 - * Prevent default 404 handler after response sent - * dep: compression@1.0.2 - * dep: connect-timeout@1.1.0 - * dep: debug@^0.8.0 - * dep: errorhandler@1.0.1 - * dep: express-session@1.0.4 - * dep: morgan@1.0.1 - * dep: serve-favicon@2.0.0 - * dep: serve-index@1.0.2 - * update debug to 0.8.0 - * add `enable()` method - * change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - * update mkdirp to 0.5.0 - -3.5.3 / 2014-05-08 -================== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -3.5.2 / 2014-04-24 -================== - - * update connect to 2.14.5 - * update cookie to 0.1.2 - * update mkdirp to 0.4.0 - * update send to 0.3.0 - -3.5.1 / 2014-03-25 -================== - - * pin less-middleware in generated app - -3.5.0 / 2014-03-06 -================== - - * bump deps - -3.4.8 / 2014-01-13 -================== - - * prevent incorrect automatic OPTIONS responses #1868 @dpatti - * update binary and examples for jade 1.0 #1876 @yossi, #1877 @reqshark, #1892 @matheusazzi - * throw 400 in case of malformed paths @rlidwka - -3.4.7 / 2013-12-10 -================== - - * update connect - -3.4.6 / 2013-12-01 -================== - - * update connect (raw-body) - -3.4.5 / 2013-11-27 -================== - - * update connect - * res.location: remove leading ./ #1802 @kapouer - * res.redirect: fix `res.redirect('toString') #1829 @michaelficarra - * res.send: always send ETag when content-length > 0 - * router: add Router.all() method - -3.4.4 / 2013-10-29 -================== - - * update connect - * update supertest - * update methods - * express(1): replace bodyParser() with urlencoded() and json() #1795 @chirag04 - -3.4.3 / 2013-10-23 -================== - - * update connect - -3.4.2 / 2013-10-18 -================== - - * update connect - * downgrade commander - -3.4.1 / 2013-10-15 -================== - - * update connect - * update commander - * jsonp: check if callback is a function - * router: wrap encodeURIComponent in a try/catch #1735 (@lxe) - * res.format: now includes chraset @1747 (@sorribas) - * res.links: allow multiple calls @1746 (@sorribas) - -3.4.0 / 2013-09-07 -================== - - * add res.vary(). Closes #1682 - * update connect - -3.3.8 / 2013-09-02 -================== - - * update connect - -3.3.7 / 2013-08-28 -================== - - * update connect - -3.3.6 / 2013-08-27 -================== - - * Revert "remove charset from json responses. Closes #1631" (causes issues in some clients) - * add: req.accepts take an argument list - -3.3.4 / 2013-07-08 -================== - - * update send and connect - -3.3.3 / 2013-07-04 -================== - - * update connect - -3.3.2 / 2013-07-03 -================== - - * update connect - * update send - * remove .version export - -3.3.1 / 2013-06-27 -================== - - * update connect - -3.3.0 / 2013-06-26 -================== - - * update connect - * add support for multiple X-Forwarded-Proto values. Closes #1646 - * change: remove charset from json responses. Closes #1631 - * change: return actual booleans from req.accept* functions - * fix jsonp callback array throw - -3.2.6 / 2013-06-02 -================== - - * update connect - -3.2.5 / 2013-05-21 -================== - - * update connect - * update node-cookie - * add: throw a meaningful error when there is no default engine - * change generation of ETags with res.send() to GET requests only. Closes #1619 - -3.2.4 / 2013-05-09 -================== - - * fix `req.subdomains` when no Host is present - * fix `req.host` when no Host is present, return undefined - -3.2.3 / 2013-05-07 -================== - - * update connect / qs - -3.2.2 / 2013-05-03 -================== - - * update qs - -3.2.1 / 2013-04-29 -================== - - * add app.VERB() paths array deprecation warning - * update connect - * update qs and remove all ~ semver crap - * fix: accept number as value of Signed Cookie - -3.2.0 / 2013-04-15 -================== - - * add "view" constructor setting to override view behaviour - * add req.acceptsEncoding(name) - * add req.acceptedEncodings - * revert cookie signature change causing session race conditions - * fix sorting of Accept values of the same quality - -3.1.2 / 2013-04-12 -================== - - * add support for custom Accept parameters - * update cookie-signature - -3.1.1 / 2013-04-01 -================== - - * add X-Forwarded-Host support to `req.host` - * fix relative redirects - * update mkdirp - * update buffer-crc32 - * remove legacy app.configure() method from app template. - -3.1.0 / 2013-01-25 -================== - - * add support for leading "." in "view engine" setting - * add array support to `res.set()` - * add node 0.8.x to travis.yml - * add "subdomain offset" setting for tweaking `req.subdomains` - * add `res.location(url)` implementing `res.redirect()`-like setting of Location - * use app.get() for x-powered-by setting for inheritance - * fix colons in passwords for `req.auth` - -3.0.6 / 2013-01-04 -================== - - * add http verb methods to Router - * update connect - * fix mangling of the `res.cookie()` options object - * fix jsonp whitespace escape. Closes #1132 - -3.0.5 / 2012-12-19 -================== - - * add throwing when a non-function is passed to a route - * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses - * revert "add 'etag' option" - -3.0.4 / 2012-12-05 -================== - - * add 'etag' option to disable `res.send()` Etags - * add escaping of urls in text/plain in `res.redirect()` - for old browsers interpreting as html - * change crc32 module for a more liberal license - * update connect - -3.0.3 / 2012-11-13 -================== - - * update connect - * update cookie module - * fix cookie max-age - -3.0.2 / 2012-11-08 -================== - - * add OPTIONS to cors example. Closes #1398 - * fix route chaining regression. Closes #1397 - -3.0.1 / 2012-11-01 -================== - - * update connect - -3.0.0 / 2012-10-23 -================== - - * add `make clean` - * add "Basic" check to req.auth - * add `req.auth` test coverage - * add cb && cb(payload) to `res.jsonp()`. Closes #1374 - * add backwards compat for `res.redirect()` status. Closes #1336 - * add support for `res.json()` to retain previously defined Content-Types. Closes #1349 - * update connect - * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382 - * remove non-primitive string support for `res.send()` - * fix view-locals example. Closes #1370 - * fix route-separation example - -3.0.0rc5 / 2012-09-18 -================== - - * update connect - * add redis search example - * add static-files example - * add "x-powered-by" setting (`app.disable('x-powered-by')`) - * add "application/octet-stream" redirect Accept test case. Closes #1317 - -3.0.0rc4 / 2012-08-30 -================== - - * add `res.jsonp()`. Closes #1307 - * add "verbose errors" option to error-pages example - * add another route example to express(1) so people are not so confused - * add redis online user activity tracking example - * update connect dep - * fix etag quoting. Closes #1310 - * fix error-pages 404 status - * fix jsonp callback char restrictions - * remove old OPTIONS default response - -3.0.0rc3 / 2012-08-13 -================== - - * update connect dep - * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds] - * fix `res.render()` clobbering of "locals" - -3.0.0rc2 / 2012-08-03 -================== - - * add CORS example - * update connect dep - * deprecate `.createServer()` & remove old stale examples - * fix: escape `res.redirect()` link - * fix vhost example - -3.0.0rc1 / 2012-07-24 -================== - - * add more examples to view-locals - * add scheme-relative redirects (`res.redirect("//foo.com")`) support - * update cookie dep - * update connect dep - * update send dep - * fix `express(1)` -h flag, use -H for hogan. Closes #1245 - * fix `res.sendfile()` socket error handling regression - -3.0.0beta7 / 2012-07-16 -================== - - * update connect dep for `send()` root normalization regression - -3.0.0beta6 / 2012-07-13 -================== - - * add `err.view` property for view errors. Closes #1226 - * add "jsonp callback name" setting - * add support for "/foo/:bar*" non-greedy matches - * change `res.sendfile()` to use `send()` module - * change `res.send` to use "response-send" module - * remove `app.locals.use` and `res.locals.use`, use regular middleware - -3.0.0beta5 / 2012-07-03 -================== - - * add "make check" support - * add route-map example - * add `res.json(obj, status)` support back for BC - * add "methods" dep, remove internal methods module - * update connect dep - * update auth example to utilize cores pbkdf2 - * updated tests to use "supertest" - -3.0.0beta4 / 2012-06-25 -================== - - * Added `req.auth` - * Added `req.range(size)` - * Added `res.links(obj)` - * Added `res.send(body, status)` support back for backwards compat - * Added `.default()` support to `res.format()` - * Added 2xx / 304 check to `req.fresh` - * Revert "Added + support to the router" - * Fixed `res.send()` freshness check, respect res.statusCode - -3.0.0beta3 / 2012-06-15 -================== - - * Added hogan `--hjs` to express(1) [nullfirm] - * Added another example to content-negotiation - * Added `fresh` dep - * Changed: `res.send()` always checks freshness - * Fixed: expose connects mime module. Cloases #1165 - -3.0.0beta2 / 2012-06-06 -================== - - * Added `+` support to the router - * Added `req.host` - * Changed `req.param()` to check route first - * Update connect dep - -3.0.0beta1 / 2012-06-01 -================== - - * Added `res.format()` callback to override default 406 behaviour - * Fixed `res.redirect()` 406. Closes #1154 - -3.0.0alpha5 / 2012-05-30 -================== - - * Added `req.ip` - * Added `{ signed: true }` option to `res.cookie()` - * Removed `res.signedCookie()` - * Changed: dont reverse `req.ips` - * Fixed "trust proxy" setting check for `req.ips` - -3.0.0alpha4 / 2012-05-09 -================== - - * Added: allow `[]` in jsonp callback. Closes #1128 - * Added `PORT` env var support in generated template. Closes #1118 [benatkin] - * Updated: connect 2.2.2 - -3.0.0alpha3 / 2012-05-04 -================== - - * Added public `app.routes`. Closes #887 - * Added _view-locals_ example - * Added _mvc_ example - * Added `res.locals.use()`. Closes #1120 - * Added conditional-GET support to `res.send()` - * Added: coerce `res.set()` values to strings - * Changed: moved `static()` in generated apps below router - * Changed: `res.send()` only set ETag when not previously set - * Changed connect 2.2.1 dep - * Changed: `make test` now runs unit / acceptance tests - * Fixed req/res proto inheritance - -3.0.0alpha2 / 2012-04-26 -================== - - * Added `make benchmark` back - * Added `res.send()` support for `String` objects - * Added client-side data exposing example - * Added `res.header()` and `req.header()` aliases for BC - * Added `express.createServer()` for BC - * Perf: memoize parsed urls - * Perf: connect 2.2.0 dep - * Changed: make `expressInit()` middleware self-aware - * Fixed: use app.get() for all core settings - * Fixed redis session example - * Fixed session example. Closes #1105 - * Fixed generated express dep. Closes #1078 - -3.0.0alpha1 / 2012-04-15 -================== - - * Added `app.locals.use(callback)` - * Added `app.locals` object - * Added `app.locals(obj)` - * Added `res.locals` object - * Added `res.locals(obj)` - * Added `res.format()` for content-negotiation - * Added `app.engine()` - * Added `res.cookie()` JSON cookie support - * Added "trust proxy" setting - * Added `req.subdomains` - * Added `req.protocol` - * Added `req.secure` - * Added `req.path` - * Added `req.ips` - * Added `req.fresh` - * Added `req.stale` - * Added comma-delmited / array support for `req.accepts()` - * Added debug instrumentation - * Added `res.set(obj)` - * Added `res.set(field, value)` - * Added `res.get(field)` - * Added `app.get(setting)`. Closes #842 - * Added `req.acceptsLanguage()` - * Added `req.acceptsCharset()` - * Added `req.accepted` - * Added `req.acceptedLanguages` - * Added `req.acceptedCharsets` - * Added "json replacer" setting - * Added "json spaces" setting - * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92 - * Added `--less` support to express(1) - * Added `express.response` prototype - * Added `express.request` prototype - * Added `express.application` prototype - * Added `app.path()` - * Added `app.render()` - * Added `res.type()` to replace `res.contentType()` - * Changed: `res.redirect()` to add relative support - * Changed: enable "jsonp callback" by default - * Changed: renamed "case sensitive routes" to "case sensitive routing" - * Rewrite of all tests with mocha - * Removed "root" setting - * Removed `res.redirect('home')` support - * Removed `req.notify()` - * Removed `app.register()` - * Removed `app.redirect()` - * Removed `app.is()` - * Removed `app.helpers()` - * Removed `app.dynamicHelpers()` - * Fixed `res.sendfile()` with non-GET. Closes #723 - * Fixed express(1) public dir for windows. Closes #866 - -2.5.9/ 2012-04-02 -================== - - * Added support for PURGE request method [pbuyle] - * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki] - -2.5.8 / 2012-02-08 -================== - - * Update mkdirp dep. Closes #991 - -2.5.7 / 2012-02-06 -================== - - * Fixed `app.all` duplicate DELETE requests [mscdex] - -2.5.6 / 2012-01-13 -================== - - * Updated hamljs dev dep. Closes #953 - -2.5.5 / 2012-01-08 -================== - - * Fixed: set `filename` on cached templates [matthewleon] - -2.5.4 / 2012-01-02 -================== - - * Fixed `express(1)` eol on 0.4.x. Closes #947 - -2.5.3 / 2011-12-30 -================== - - * Fixed `req.is()` when a charset is present - -2.5.2 / 2011-12-10 -================== - - * Fixed: express(1) LF -> CRLF for windows - -2.5.1 / 2011-11-17 -================== - - * Changed: updated connect to 1.8.x - * Removed sass.js support from express(1) - -2.5.0 / 2011-10-24 -================== - - * Added ./routes dir for generated app by default - * Added npm install reminder to express(1) app gen - * Added 0.5.x support - * Removed `make test-cov` since it wont work with node 0.5.x - * Fixed express(1) public dir for windows. Closes #866 - -2.4.7 / 2011-10-05 -================== - - * Added mkdirp to express(1). Closes #795 - * Added simple _json-config_ example - * Added shorthand for the parsed request's pathname via `req.path` - * Changed connect dep to 1.7.x to fix npm issue... - * Fixed `res.redirect()` __HEAD__ support. [reported by xerox] - * Fixed `req.flash()`, only escape args - * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie] - -2.4.6 / 2011-08-22 -================== - - * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode] - -2.4.5 / 2011-08-19 -================== - - * Added support for routes to handle errors. Closes #809 - * Added `app.routes.all()`. Closes #803 - * Added "basepath" setting to work in conjunction with reverse proxies etc. - * Refactored `Route` to use a single array of callbacks - * Added support for multiple callbacks for `app.param()`. Closes #801 -Closes #805 - * Changed: removed .call(self) for route callbacks - * Dependency: `qs >= 0.3.1` - * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808 - -2.4.4 / 2011-08-05 -================== - - * Fixed `res.header()` intention of a set, even when `undefined` - * Fixed `*`, value no longer required - * Fixed `res.send(204)` support. Closes #771 - -2.4.3 / 2011-07-14 -================== - - * Added docs for `status` option special-case. Closes #739 - * Fixed `options.filename`, exposing the view path to template engines - -2.4.2. / 2011-07-06 -================== - - * Revert "removed jsonp stripping" for XSS - -2.4.1 / 2011-07-06 -================== - - * Added `res.json()` JSONP support. Closes #737 - * Added _extending-templates_ example. Closes #730 - * Added "strict routing" setting for trailing slashes - * Added support for multiple envs in `app.configure()` calls. Closes #735 - * Changed: `res.send()` using `res.json()` - * Changed: when cookie `path === null` don't default it - * Changed; default cookie path to "home" setting. Closes #731 - * Removed _pids/logs_ creation from express(1) - -2.4.0 / 2011-06-28 -================== - - * Added chainable `res.status(code)` - * Added `res.json()`, an explicit version of `res.send(obj)` - * Added simple web-service example - -2.3.12 / 2011-06-22 -================== - - * \#express is now on freenode! come join! - * Added `req.get(field, param)` - * Added links to Japanese documentation, thanks @hideyukisaito! - * Added; the `express(1)` generated app outputs the env - * Added `content-negotiation` example - * Dependency: connect >= 1.5.1 < 2.0.0 - * Fixed view layout bug. Closes #720 - * Fixed; ignore body on 304. Closes #701 - -2.3.11 / 2011-06-04 -================== - - * Added `npm test` - * Removed generation of dummy test file from `express(1)` - * Fixed; `express(1)` adds express as a dep - * Fixed; prune on `prepublish` - -2.3.10 / 2011-05-27 -================== - - * Added `req.route`, exposing the current route - * Added _package.json_ generation support to `express(1)` - * Fixed call to `app.param()` function for optional params. Closes #682 - -2.3.9 / 2011-05-25 -================== - - * Fixed bug-ish with `../' in `res.partial()` calls - -2.3.8 / 2011-05-24 -================== - - * Fixed `app.options()` - -2.3.7 / 2011-05-23 -================== - - * Added route `Collection`, ex: `app.get('/user/:id').remove();` - * Added support for `app.param(fn)` to define param logic - * Removed `app.param()` support for callback with return value - * Removed module.parent check from express(1) generated app. Closes #670 - * Refactored router. Closes #639 - -2.3.6 / 2011-05-20 -================== - - * Changed; using devDependencies instead of git submodules - * Fixed redis session example - * Fixed markdown example - * Fixed view caching, should not be enabled in development - -2.3.5 / 2011-05-20 -================== - - * Added export `.view` as alias for `.View` - -2.3.4 / 2011-05-08 -================== - - * Added `./examples/say` - * Fixed `res.sendfile()` bug preventing the transfer of files with spaces - -2.3.3 / 2011-05-03 -================== - - * Added "case sensitive routes" option. - * Changed; split methods supported per rfc [slaskis] - * Fixed route-specific middleware when using the same callback function several times - -2.3.2 / 2011-04-27 -================== - - * Fixed view hints - -2.3.1 / 2011-04-26 -================== - - * Added `app.match()` as `app.match.all()` - * Added `app.lookup()` as `app.lookup.all()` - * Added `app.remove()` for `app.remove.all()` - * Added `app.remove.VERB()` - * Fixed template caching collision issue. Closes #644 - * Moved router over from connect and started refactor - -2.3.0 / 2011-04-25 -================== - - * Added options support to `res.clearCookie()` - * Added `res.helpers()` as alias of `res.locals()` - * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0` - * Changed; auto set Content-Type in res.attachement [Aaron Heckmann] - * Renamed "cache views" to "view cache". Closes #628 - * Fixed caching of views when using several apps. Closes #637 - * Fixed gotcha invoking `app.param()` callbacks once per route middleware. -Closes #638 - * Fixed partial lookup precedence. Closes #631 -Shaw] - -2.2.2 / 2011-04-12 -================== - - * Added second callback support for `res.download()` connection errors - * Fixed `filename` option passing to template engine - -2.2.1 / 2011-04-04 -================== - - * Added `layout(path)` helper to change the layout within a view. Closes #610 - * Fixed `partial()` collection object support. - Previously only anything with `.length` would work. - When `.length` is present one must still be aware of holes, - however now `{ collection: {foo: 'bar'}}` is valid, exposes - `keyInCollection` and `keysInCollection`. - - * Performance improved with better view caching - * Removed `request` and `response` locals - * Changed; errorHandler page title is now `Express` instead of `Connect` - -2.2.0 / 2011-03-30 -================== - - * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606 - * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606 - * Added `app.VERB(path)` as alias of `app.lookup.VERB()`. - * Dependency `connect >= 1.2.0` - -2.1.1 / 2011-03-29 -================== - - * Added; expose `err.view` object when failing to locate a view - * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann] - * Fixed; `res.send(undefined)` responds with 204 [aheckmann] - -2.1.0 / 2011-03-24 -================== - - * Added `/_?` partial lookup support. Closes #447 - * Added `request`, `response`, and `app` local variables - * Added `settings` local variable, containing the app's settings - * Added `req.flash()` exception if `req.session` is not available - * Added `res.send(bool)` support (json response) - * Fixed stylus example for latest version - * Fixed; wrap try/catch around `res.render()` - -2.0.0 / 2011-03-17 -================== - - * Fixed up index view path alternative. - * Changed; `res.locals()` without object returns the locals - -2.0.0rc3 / 2011-03-17 -================== - - * Added `res.locals(obj)` to compliment `res.local(key, val)` - * Added `res.partial()` callback support - * Fixed recursive error reporting issue in `res.render()` - -2.0.0rc2 / 2011-03-17 -================== - - * Changed; `partial()` "locals" are now optional - * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01] - * Fixed .filename view engine option [reported by drudge] - * Fixed blog example - * Fixed `{req,res}.app` reference when mounting [Ben Weaver] - -2.0.0rc / 2011-03-14 -================== - - * Fixed; expose `HTTPSServer` constructor - * Fixed express(1) default test charset. Closes #579 [reported by secoif] - * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP] - -2.0.0beta3 / 2011-03-09 -================== - - * Added support for `res.contentType()` literal - The original `res.contentType('.json')`, - `res.contentType('application/json')`, and `res.contentType('json')` - will work now. - * Added `res.render()` status option support back - * Added charset option for `res.render()` - * Added `.charset` support (via connect 1.0.4) - * Added view resolution hints when in development and a lookup fails - * Added layout lookup support relative to the page view. - For example while rendering `./views/user/index.jade` if you create - `./views/user/layout.jade` it will be used in favour of the root layout. - * Fixed `res.redirect()`. RFC states absolute url [reported by unlink] - * Fixed; default `res.send()` string charset to utf8 - * Removed `Partial` constructor (not currently used) - -2.0.0beta2 / 2011-03-07 -================== - - * Added res.render() `.locals` support back to aid in migration process - * Fixed flash example - -2.0.0beta / 2011-03-03 -================== - - * Added HTTPS support - * Added `res.cookie()` maxAge support - * Added `req.header()` _Referrer_ / _Referer_ special-case, either works - * Added mount support for `res.redirect()`, now respects the mount-point - * Added `union()` util, taking place of `merge(clone())` combo - * Added stylus support to express(1) generated app - * Added secret to session middleware used in examples and generated app - * Added `res.local(name, val)` for progressive view locals - * Added default param support to `req.param(name, default)` - * Added `app.disabled()` and `app.enabled()` - * Added `app.register()` support for omitting leading ".", either works - * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539 - * Added `app.param()` to map route params to async/sync logic - * Added; aliased `app.helpers()` as `app.locals()`. Closes #481 - * Added extname with no leading "." support to `res.contentType()` - * Added `cache views` setting, defaulting to enabled in "production" env - * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_. - * Added `req.accepts()` support for extensions - * Changed; `res.download()` and `res.sendfile()` now utilize Connect's - static file server `connect.static.send()`. - * Changed; replaced `connect.utils.mime()` with npm _mime_ module - * Changed; allow `req.query` to be pre-defined (via middleware or other parent - * Changed view partial resolution, now relative to parent view - * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`. - * Fixed `req.param()` bug returning Array.prototype methods. Closes #552 - * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()` - * Fixed; using _qs_ module instead of _querystring_ - * Fixed; strip unsafe chars from jsonp callbacks - * Removed "stream threshold" setting - -1.0.8 / 2011-03-01 -================== - - * Allow `req.query` to be pre-defined (via middleware or other parent app) - * "connect": ">= 0.5.0 < 1.0.0". Closes #547 - * Removed the long deprecated __EXPRESS_ENV__ support - -1.0.7 / 2011-02-07 -================== - - * Fixed `render()` setting inheritance. - Mounted apps would not inherit "view engine" - -1.0.6 / 2011-02-07 -================== - - * Fixed `view engine` setting bug when period is in dirname - -1.0.5 / 2011-02-05 -================== - - * Added secret to generated app `session()` call - -1.0.4 / 2011-02-05 -================== - - * Added `qs` dependency to _package.json_ - * Fixed namespaced `require()`s for latest connect support - -1.0.3 / 2011-01-13 -================== - - * Remove unsafe characters from JSONP callback names [Ryan Grove] - -1.0.2 / 2011-01-10 -================== - - * Removed nested require, using `connect.router` - -1.0.1 / 2010-12-29 -================== - - * Fixed for middleware stacked via `createServer()` - previously the `foo` middleware passed to `createServer(foo)` - would not have access to Express methods such as `res.send()` - or props like `req.query` etc. - -1.0.0 / 2010-11-16 -================== - - * Added; deduce partial object names from the last segment. - For example by default `partial('forum/post', postObject)` will - give you the _post_ object, providing a meaningful default. - * Added http status code string representation to `res.redirect()` body - * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__. - * Added `req.is()` to aid in content negotiation - * Added partial local inheritance [suggested by masylum]. Closes #102 - providing access to parent template locals. - * Added _-s, --session[s]_ flag to express(1) to add session related middleware - * Added _--template_ flag to express(1) to specify the - template engine to use. - * Added _--css_ flag to express(1) to specify the - stylesheet engine to use (or just plain css by default). - * Added `app.all()` support [thanks aheckmann] - * Added partial direct object support. - You may now `partial('user', user)` providing the "user" local, - vs previously `partial('user', { object: user })`. - * Added _route-separation_ example since many people question ways - to do this with CommonJS modules. Also view the _blog_ example for - an alternative. - * Performance; caching view path derived partial object names - * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454 - * Fixed jsonp support; _text/javascript_ as per mailinglist discussion - -1.0.0rc4 / 2010-10-14 -================== - - * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0 - * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware)) - * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass] - * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass] - * Added `partial()` support for array-like collections. Closes #434 - * Added support for swappable querystring parsers - * Added session usage docs. Closes #443 - * Added dynamic helper caching. Closes #439 [suggested by maritz] - * Added authentication example - * Added basic Range support to `res.sendfile()` (and `res.download()` etc) - * Changed; `express(1)` generated app using 2 spaces instead of 4 - * Default env to "development" again [aheckmann] - * Removed _context_ option is no more, use "scope" - * Fixed; exposing _./support_ libs to examples so they can run without installs - * Fixed mvc example - -1.0.0rc3 / 2010-09-20 -================== - - * Added confirmation for `express(1)` app generation. Closes #391 - * Added extending of flash formatters via `app.flashFormatters` - * Added flash formatter support. Closes #411 - * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold" - * Added _stream threshold_ setting for `res.sendfile()` - * Added `res.send()` __HEAD__ support - * Added `res.clearCookie()` - * Added `res.cookie()` - * Added `res.render()` headers option - * Added `res.redirect()` response bodies - * Added `res.render()` status option support. Closes #425 [thanks aheckmann] - * Fixed `res.sendfile()` responding with 403 on malicious path - * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_ - * Fixed; mounted apps settings now inherit from parent app [aheckmann] - * Fixed; stripping Content-Length / Content-Type when 204 - * Fixed `res.send()` 204. Closes #419 - * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402 - * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo] - - -1.0.0rc2 / 2010-08-17 -================== - - * Added `app.register()` for template engine mapping. Closes #390 - * Added `res.render()` callback support as second argument (no options) - * Added callback support to `res.download()` - * Added callback support for `res.sendfile()` - * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()` - * Added "partials" setting to docs - * Added default expresso tests to `express(1)` generated app. Closes #384 - * Fixed `res.sendfile()` error handling, defer via `next()` - * Fixed `res.render()` callback when a layout is used [thanks guillermo] - * Fixed; `make install` creating ~/.node_libraries when not present - * Fixed issue preventing error handlers from being defined anywhere. Closes #387 - -1.0.0rc / 2010-07-28 -================== - - * Added mounted hook. Closes #369 - * Added connect dependency to _package.json_ - - * Removed "reload views" setting and support code - development env never caches, production always caches. - - * Removed _param_ in route callbacks, signature is now - simply (req, res, next), previously (req, res, params, next). - Use _req.params_ for path captures, _req.query_ for GET params. - - * Fixed "home" setting - * Fixed middleware/router precedence issue. Closes #366 - * Fixed; _configure()_ callbacks called immediately. Closes #368 - -1.0.0beta2 / 2010-07-23 -================== - - * Added more examples - * Added; exporting `Server` constructor - * Added `Server#helpers()` for view locals - * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349 - * Added support for absolute view paths - * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363 - * Added Guillermo Rauch to the contributor list - * Added support for "as" for non-collection partials. Closes #341 - * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf] - * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo] - * Fixed instanceof `Array` checks, now `Array.isArray()` - * Fixed express(1) expansion of public dirs. Closes #348 - * Fixed middleware precedence. Closes #345 - * Fixed view watcher, now async [thanks aheckmann] - -1.0.0beta / 2010-07-15 -================== - - * Re-write - - much faster - - much lighter - - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs - -0.14.0 / 2010-06-15 -================== - - * Utilize relative requires - * Added Static bufferSize option [aheckmann] - * Fixed caching of view and partial subdirectories [aheckmann] - * Fixed mime.type() comments now that ".ext" is not supported - * Updated haml submodule - * Updated class submodule - * Removed bin/express - -0.13.0 / 2010-06-01 -================== - - * Added node v0.1.97 compatibility - * Added support for deleting cookies via Request#cookie('key', null) - * Updated haml submodule - * Fixed not-found page, now using using charset utf-8 - * Fixed show-exceptions page, now using using charset utf-8 - * Fixed view support due to fs.readFile Buffers - * Changed; mime.type() no longer accepts ".type" due to node extname() changes - -0.12.0 / 2010-05-22 -================== - - * Added node v0.1.96 compatibility - * Added view `helpers` export which act as additional local variables - * Updated haml submodule - * Changed ETag; removed inode, modified time only - * Fixed LF to CRLF for setting multiple cookies - * Fixed cookie complation; values are now urlencoded - * Fixed cookies parsing; accepts quoted values and url escaped cookies - -0.11.0 / 2010-05-06 -================== - - * Added support for layouts using different engines - - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' }) - - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml' - - this.render('page.html.haml', { layout: false }) // no layout - * Updated ext submodule - * Updated haml submodule - * Fixed EJS partial support by passing along the context. Issue #307 - -0.10.1 / 2010-05-03 -================== - - * Fixed binary uploads. - -0.10.0 / 2010-04-30 -================== - - * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s - encoding is set to 'utf8' or 'utf-8'. - * Added "encoding" option to Request#render(). Closes #299 - * Added "dump exceptions" setting, which is enabled by default. - * Added simple ejs template engine support - * Added error reponse support for text/plain, application/json. Closes #297 - * Added callback function param to Request#error() - * Added Request#sendHead() - * Added Request#stream() - * Added support for Request#respond(304, null) for empty response bodies - * Added ETag support to Request#sendfile() - * Added options to Request#sendfile(), passed to fs.createReadStream() - * Added filename arg to Request#download() - * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request - * Performance enhanced by preventing several calls to toLowerCase() in Router#match() - * Changed; Request#sendfile() now streams - * Changed; Renamed Request#halt() to Request#respond(). Closes #289 - * Changed; Using sys.inspect() instead of JSON.encode() for error output - * Changed; run() returns the http.Server instance. Closes #298 - * Changed; Defaulting Server#host to null (INADDR_ANY) - * Changed; Logger "common" format scale of 0.4f - * Removed Logger "request" format - * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found - * Fixed several issues with http client - * Fixed Logger Content-Length output - * Fixed bug preventing Opera from retaining the generated session id. Closes #292 - -0.9.0 / 2010-04-14 -================== - - * Added DSL level error() route support - * Added DSL level notFound() route support - * Added Request#error() - * Added Request#notFound() - * Added Request#render() callback function. Closes #258 - * Added "max upload size" setting - * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254 - * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js - * Added callback function support to Request#halt() as 3rd/4th arg - * Added preprocessing of route param wildcards using param(). Closes #251 - * Added view partial support (with collections etc) - * Fixed bug preventing falsey params (such as ?page=0). Closes #286 - * Fixed setting of multiple cookies. Closes #199 - * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml) - * Changed; session cookie is now httpOnly - * Changed; Request is no longer global - * Changed; Event is no longer global - * Changed; "sys" module is no longer global - * Changed; moved Request#download to Static plugin where it belongs - * Changed; Request instance created before body parsing. Closes #262 - * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253 - * Changed; Pre-caching view partials in memory when "cache view partials" is enabled - * Updated support to node --version 0.1.90 - * Updated dependencies - * Removed set("session cookie") in favour of use(Session, { cookie: { ... }}) - * Removed utils.mixin(); use Object#mergeDeep() - -0.8.0 / 2010-03-19 -================== - - * Added coffeescript example app. Closes #242 - * Changed; cache api now async friendly. Closes #240 - * Removed deprecated 'express/static' support. Use 'express/plugins/static' - -0.7.6 / 2010-03-19 -================== - - * Added Request#isXHR. Closes #229 - * Added `make install` (for the executable) - * Added `express` executable for setting up simple app templates - * Added "GET /public/*" to Static plugin, defaulting to /public - * Added Static plugin - * Fixed; Request#render() only calls cache.get() once - * Fixed; Namespacing View caches with "view:" - * Fixed; Namespacing Static caches with "static:" - * Fixed; Both example apps now use the Static plugin - * Fixed set("views"). Closes #239 - * Fixed missing space for combined log format - * Deprecated Request#sendfile() and 'express/static' - * Removed Server#running - -0.7.5 / 2010-03-16 -================== - - * Added Request#flash() support without args, now returns all flashes - * Updated ext submodule - -0.7.4 / 2010-03-16 -================== - - * Fixed session reaper - * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft) - -0.7.3 / 2010-03-16 -================== - - * Added package.json - * Fixed requiring of haml / sass due to kiwi removal - -0.7.2 / 2010-03-16 -================== - - * Fixed GIT submodules (HAH!) - -0.7.1 / 2010-03-16 -================== - - * Changed; Express now using submodules again until a PM is adopted - * Changed; chat example using millisecond conversions from ext - -0.7.0 / 2010-03-15 -================== - - * Added Request#pass() support (finds the next matching route, or the given path) - * Added Logger plugin (default "common" format replaces CommonLogger) - * Removed Profiler plugin - * Removed CommonLogger plugin - -0.6.0 / 2010-03-11 -================== - - * Added seed.yml for kiwi package management support - * Added HTTP client query string support when method is GET. Closes #205 - - * Added support for arbitrary view engines. - For example "foo.engine.html" will now require('engine'), - the exports from this module are cached after the first require(). - - * Added async plugin support - - * Removed usage of RESTful route funcs as http client - get() etc, use http.get() and friends - - * Removed custom exceptions - -0.5.0 / 2010-03-10 -================== - - * Added ext dependency (library of js extensions) - * Removed extname() / basename() utils. Use path module - * Removed toArray() util. Use arguments.values - * Removed escapeRegexp() util. Use RegExp.escape() - * Removed process.mixin() dependency. Use utils.mixin() - * Removed Collection - * Removed ElementCollection - * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com) ;) - -0.4.0 / 2010-02-11 -================== - - * Added flash() example to sample upload app - * Added high level restful http client module (express/http) - * Changed; RESTful route functions double as HTTP clients. Closes #69 - * Changed; throwing error when routes are added at runtime - * Changed; defaulting render() context to the current Request. Closes #197 - * Updated haml submodule - -0.3.0 / 2010-02-11 -================== - - * Updated haml / sass submodules. Closes #200 - * Added flash message support. Closes #64 - * Added accepts() now allows multiple args. fixes #117 - * Added support for plugins to halt. Closes #189 - * Added alternate layout support. Closes #119 - * Removed Route#run(). Closes #188 - * Fixed broken specs due to use(Cookie) missing - -0.2.1 / 2010-02-05 -================== - - * Added "plot" format option for Profiler (for gnuplot processing) - * Added request number to Profiler plugin - * Fixed binary encoding for multi-part file uploads, was previously defaulting to UTF8 - * Fixed issue with routes not firing when not files are present. Closes #184 - * Fixed process.Promise -> events.Promise - -0.2.0 / 2010-02-03 -================== - - * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180 - * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174 - * Added expiration support to cache api with reaper. Closes #133 - * Added cache Store.Memory#reap() - * Added Cache; cache api now uses first class Cache instances - * Added abstract session Store. Closes #172 - * Changed; cache Memory.Store#get() utilizing Collection - * Renamed MemoryStore -> Store.Memory - * Fixed use() of the same plugin several time will always use latest options. Closes #176 - -0.1.0 / 2010-02-03 -================== - - * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context - * Updated node support to 0.1.27 Closes #169 - * Updated dirname(__filename) -> __dirname - * Updated libxmljs support to v0.2.0 - * Added session support with memory store / reaping - * Added quick uid() helper - * Added multi-part upload support - * Added Sass.js support / submodule - * Added production env caching view contents and static files - * Added static file caching. Closes #136 - * Added cache plugin with memory stores - * Added support to StaticFile so that it works with non-textual files. - * Removed dirname() helper - * Removed several globals (now their modules must be required) - -0.0.2 / 2010-01-10 -================== - - * Added view benchmarks; currently haml vs ejs - * Added Request#attachment() specs. Closes #116 - * Added use of node's parseQuery() util. Closes #123 - * Added `make init` for submodules - * Updated Haml - * Updated sample chat app to show messages on load - * Updated libxmljs parseString -> parseHtmlString - * Fixed `make init` to work with older versions of git - * Fixed specs can now run independant specs for those who cant build deps. Closes #127 - * Fixed issues introduced by the node url module changes. Closes 126. - * Fixed two assertions failing due to Collection#keys() returning strings - * Fixed faulty Collection#toArray() spec due to keys() returning strings - * Fixed `make test` now builds libxmljs.node before testing - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/LICENSE deleted file mode 100644 index 0f3c767..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2009-2014 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. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/Readme.md deleted file mode 100644 index 8abbcc4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/Readme.md +++ /dev/null @@ -1,128 +0,0 @@ -[![Express Logo](https://i.cloudup.com/zfY6lL7eFa-3000x3000.png)](https://expressjs.com/) - - Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). - - [![NPM Version](https://badge.fury.io/js/express.svg)](https://badge.fury.io/js/express) - [![Build Status](https://travis-ci.org/visionmedia/express.svg?branch=master)](https://travis-ci.org/visionmedia/express) - [![Coverage Status](https://img.shields.io/coveralls/visionmedia/express.svg)](https://coveralls.io/r/visionmedia/express) - [![Gittip](http://img.shields.io/gittip/dougwilson.svg)](https://www.gittip.com/dougwilson/) - -```js -var express = require('express') -var app = express() - -app.get('/', function (req, res) { - res.send('Hello World') -}) - -app.listen(3000) -``` - - **PROTIP** Be sure to read [Migrating from 3.x to 4.x](https://github.com/visionmedia/express/wiki/Migrating-from-3.x-to-4.x) as well as [New features in 4.x](https://github.com/visionmedia/express/wiki/New-features-in-4.x). - -### Installation - -```bash -$ npm install express -``` - -## Quick Start - - The quickest way to get started with express is to utilize the executable [`express(1)`](https://github.com/expressjs/generator) to generate an application as shown below: - - Install the executable. The executable's major version will match Express's: - -```bash -$ npm install -g express-generator@4 -``` - - Create the app: - -```bash -$ express /tmp/foo && cd /tmp/foo -``` - - Install dependencies: - -```bash -$ npm install -``` - - Start the server: - -```bash -$ npm start -``` - -## Features - - * Robust routing - * HTTP helpers (redirection, caching, etc) - * View system supporting 14+ template engines - * Content negotiation - * Focus on high performance - * Executable for generating applications quickly - * High test coverage - -## Philosophy - - The Express philosophy is to provide small, robust tooling for HTTP servers, making - it a great solution for single page applications, web sites, hybrids, or public - HTTP APIs. - - Express does not force you to use any specific ORM or template engine. With support for over - 14 template engines via [Consolidate.js](https://github.com/visionmedia/consolidate.js), - you can quickly craft your perfect framework. - -## More Information - - * [Website and Documentation](http://expressjs.com/) - [[website repo](https://github.com/visionmedia/expressjs.com)] - * [Github Organization](https://github.com/expressjs) for Official Middleware & Modules - * [#express](https://webchat.freenode.net/?channels=express) on freenode IRC - * Visit the [Wiki](https://github.com/visionmedia/express/wiki) - * [Google Group](https://groups.google.com/group/express-js) for discussion - * [Русскоязычная документация](http://jsman.ru/express/) - * [한국어 문서](http://expressjs.kr) - [[website repo](https://github.com/Hanul/expressjs.kr)] - * Run express examples [online](https://runnable.com/express) - -## Viewing Examples - - Clone the Express repo, then install the dev dependencies to install all the example / test suite dependencies: - -```bash -$ git clone git://github.com/visionmedia/express.git --depth 1 -$ cd express -$ npm install -``` - - Then run whichever example you want: - - $ node examples/content-negotiation - - You can also view live examples here: - - - -## Running Tests - - To run the test suite, first invoke the following command within the repo, installing the development dependencies: - -```bash -$ npm install -``` - - Then run the tests: - -```bash -$ npm test -``` - -### Contributors - - * Author: [TJ Holowaychuk](https://github.com/visionmedia) - * Lead Maintainer: [Douglas Christopher Wilson](https://github.com/dougwilson) - * [All Contributors](https://github.com/visionmedia/express/graphs/contributors) - -### License - - [MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/index.js deleted file mode 100644 index 3da3378..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/express'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/application.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/application.js deleted file mode 100644 index b8b69c0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/application.js +++ /dev/null @@ -1,554 +0,0 @@ -/** - * Module dependencies. - */ - -var finalhandler = require('finalhandler'); -var mixin = require('utils-merge'); -var Router = require('./router'); -var methods = require('methods'); -var middleware = require('./middleware/init'); -var query = require('./middleware/query'); -var debug = require('debug')('express:application'); -var View = require('./view'); -var http = require('http'); -var compileETag = require('./utils').compileETag; -var compileQueryParser = require('./utils').compileQueryParser; -var compileTrust = require('./utils').compileTrust; -var deprecate = require('depd')('express'); -var resolve = require('path').resolve; - -/** - * Application prototype. - */ - -var app = exports = module.exports = {}; - -/** - * Initialize the server. - * - * - setup default configuration - * - setup default middleware - * - setup route reflection methods - * - * @api private - */ - -app.init = function(){ - this.cache = {}; - this.settings = {}; - this.engines = {}; - this.defaultConfiguration(); -}; - -/** - * Initialize application configuration. - * - * @api private - */ - -app.defaultConfiguration = function(){ - // default settings - this.enable('x-powered-by'); - this.set('etag', 'weak'); - var env = process.env.NODE_ENV || 'development'; - this.set('env', env); - this.set('query parser', 'extended'); - this.set('subdomain offset', 2); - this.set('trust proxy', false); - - debug('booting in %s mode', env); - - // inherit protos - this.on('mount', function(parent){ - this.request.__proto__ = parent.request; - this.response.__proto__ = parent.response; - this.engines.__proto__ = parent.engines; - this.settings.__proto__ = parent.settings; - }); - - // setup locals - this.locals = Object.create(null); - - // top-most app is mounted at / - this.mountpath = '/'; - - // default locals - this.locals.settings = this.settings; - - // default configuration - this.set('view', View); - this.set('views', resolve('views')); - this.set('jsonp callback name', 'callback'); - - if (env === 'production') { - this.enable('view cache'); - } - - Object.defineProperty(this, 'router', { - get: function() { - throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.'); - } - }); -}; - -/** - * lazily adds the base router if it has not yet been added. - * - * We cannot add the base router in the defaultConfiguration because - * it reads app settings which might be set after that has run. - * - * @api private - */ -app.lazyrouter = function() { - if (!this._router) { - this._router = new Router({ - caseSensitive: this.enabled('case sensitive routing'), - strict: this.enabled('strict routing') - }); - - this._router.use(query(this.get('query parser fn'))); - this._router.use(middleware.init(this)); - } -}; - -/** - * Dispatch a req, res pair into the application. Starts pipeline processing. - * - * If no _done_ callback is provided, then default error handlers will respond - * in the event of an error bubbling through the stack. - * - * @api private - */ - -app.handle = function(req, res, done) { - var router = this._router; - - // final handler - done = done || finalhandler(req, res, { - env: this.get('env'), - onerror: logerror.bind(this) - }); - - // no routes - if (!router) { - debug('no routes defined on app'); - done(); - return; - } - - router.handle(req, res, done); -}; - -/** - * Proxy `Router#use()` to add middleware to the app router. - * See Router#use() documentation for details. - * - * If the _fn_ parameter is an express app, then it will be - * mounted at the _route_ specified. - * - * @api public - */ - -app.use = function use(path, fn) { - var mount_app; - var mount_path; - - // check for .use(path, app) or .use(app) signature - if (arguments.length <= 2) { - mount_path = typeof path === 'string' - ? path - : '/'; - mount_app = typeof path === 'function' - ? path - : fn; - } - - // setup router - this.lazyrouter(); - var router = this._router; - - // express app - if (mount_app && mount_app.handle && mount_app.set) { - debug('.use app under %s', mount_path); - mount_app.mountpath = mount_path; - mount_app.parent = this; - - // restore .app property on req and res - router.use(mount_path, function mounted_app(req, res, next) { - var orig = req.app; - mount_app.handle(req, res, function(err) { - req.__proto__ = orig.request; - res.__proto__ = orig.response; - next(err); - }); - }); - - // mounted an app - mount_app.emit('mount', this); - - return this; - } - - // pass-through use - router.use.apply(router, arguments); - - return this; -}; - -/** - * Proxy to the app `Router#route()` - * Returns a new `Route` instance for the _path_. - * - * Routes are isolated middleware stacks for specific paths. - * See the Route api docs for details. - * - * @api public - */ - -app.route = function(path){ - this.lazyrouter(); - return this._router.route(path); -}; - -/** - * Register the given template engine callback `fn` - * as `ext`. - * - * By default will `require()` the engine based on the - * file extension. For example if you try to render - * a "foo.jade" file Express will invoke the following internally: - * - * app.engine('jade', require('jade').__express); - * - * For engines that do not provide `.__express` out of the box, - * or if you wish to "map" a different extension to the template engine - * you may use this method. For example mapping the EJS template engine to - * ".html" files: - * - * app.engine('html', require('ejs').renderFile); - * - * In this case EJS provides a `.renderFile()` method with - * the same signature that Express expects: `(path, options, callback)`, - * though note that it aliases this method as `ejs.__express` internally - * so if you're using ".ejs" extensions you dont need to do anything. - * - * Some template engines do not follow this convention, the - * [Consolidate.js](https://github.com/visionmedia/consolidate.js) - * library was created to map all of node's popular template - * engines to follow this convention, thus allowing them to - * work seamlessly within Express. - * - * @param {String} ext - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.engine = function(ext, fn){ - if ('function' != typeof fn) throw new Error('callback function required'); - if ('.' != ext[0]) ext = '.' + ext; - this.engines[ext] = fn; - return this; -}; - -/** - * Proxy to `Router#param()` with one added api feature. The _name_ parameter - * can be an array of names. - * - * See the Router#param() docs for more details. - * - * @param {String|Array} name - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.param = function(name, fn){ - var self = this; - self.lazyrouter(); - - if (Array.isArray(name)) { - name.forEach(function(key) { - self.param(key, fn); - }); - return this; - } - - self._router.param(name, fn); - return this; -}; - -/** - * Assign `setting` to `val`, or return `setting`'s value. - * - * app.set('foo', 'bar'); - * app.get('foo'); - * // => "bar" - * - * Mounted servers inherit their parent server's settings. - * - * @param {String} setting - * @param {*} [val] - * @return {Server} for chaining - * @api public - */ - -app.set = function(setting, val){ - if (arguments.length === 1) { - // app.get(setting) - return this.settings[setting]; - } - - // set value - this.settings[setting] = val; - - // trigger matched settings - switch (setting) { - case 'etag': - debug('compile etag %s', val); - this.set('etag fn', compileETag(val)); - break; - case 'query parser': - debug('compile query parser %s', val); - this.set('query parser fn', compileQueryParser(val)); - break; - case 'trust proxy': - debug('compile trust proxy %s', val); - this.set('trust proxy fn', compileTrust(val)); - break; - } - - return this; -}; - -/** - * Return the app's absolute pathname - * based on the parent(s) that have - * mounted it. - * - * For example if the application was - * mounted as "/admin", which itself - * was mounted as "/blog" then the - * return value would be "/blog/admin". - * - * @return {String} - * @api private - */ - -app.path = function(){ - return this.parent - ? this.parent.path() + this.mountpath - : ''; -}; - -/** - * Check if `setting` is enabled (truthy). - * - * app.enabled('foo') - * // => false - * - * app.enable('foo') - * app.enabled('foo') - * // => true - * - * @param {String} setting - * @return {Boolean} - * @api public - */ - -app.enabled = function(setting){ - return !!this.set(setting); -}; - -/** - * Check if `setting` is disabled. - * - * app.disabled('foo') - * // => true - * - * app.enable('foo') - * app.disabled('foo') - * // => false - * - * @param {String} setting - * @return {Boolean} - * @api public - */ - -app.disabled = function(setting){ - return !this.set(setting); -}; - -/** - * Enable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @api public - */ - -app.enable = function(setting){ - return this.set(setting, true); -}; - -/** - * Disable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @api public - */ - -app.disable = function(setting){ - return this.set(setting, false); -}; - -/** - * Delegate `.VERB(...)` calls to `router.VERB(...)`. - */ - -methods.forEach(function(method){ - app[method] = function(path){ - if ('get' == method && 1 == arguments.length) return this.set(path); - - this.lazyrouter(); - - var route = this._router.route(path); - route[method].apply(route, [].slice.call(arguments, 1)); - return this; - }; -}); - -/** - * Special-cased "all" method, applying the given route `path`, - * middleware, and callback to _every_ HTTP method. - * - * @param {String} path - * @param {Function} ... - * @return {app} for chaining - * @api public - */ - -app.all = function(path){ - this.lazyrouter(); - - var route = this._router.route(path); - var args = [].slice.call(arguments, 1); - methods.forEach(function(method){ - route[method].apply(route, args); - }); - - return this; -}; - -// del -> delete alias - -app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead'); - -/** - * Render the given view `name` name with `options` - * and a callback accepting an error and the - * rendered template string. - * - * Example: - * - * app.render('email', { name: 'Tobi' }, function(err, html){ - * // ... - * }) - * - * @param {String} name - * @param {String|Function} options or fn - * @param {Function} fn - * @api public - */ - -app.render = function(name, options, fn){ - var opts = {}; - var cache = this.cache; - var engines = this.engines; - var view; - - // support callback function as second arg - if ('function' == typeof options) { - fn = options, options = {}; - } - - // merge app.locals - mixin(opts, this.locals); - - // merge options._locals - if (options._locals) mixin(opts, options._locals); - - // merge options - mixin(opts, options); - - // set .cache unless explicitly provided - opts.cache = null == opts.cache - ? this.enabled('view cache') - : opts.cache; - - // primed cache - if (opts.cache) view = cache[name]; - - // view - if (!view) { - view = new (this.get('view'))(name, { - defaultEngine: this.get('view engine'), - root: this.get('views'), - engines: engines - }); - - if (!view.path) { - var err = new Error('Failed to lookup view "' + name + '" in views directory "' + view.root + '"'); - err.view = view; - return fn(err); - } - - // prime the cache - if (opts.cache) cache[name] = view; - } - - // render - try { - view.render(opts, fn); - } catch (err) { - fn(err); - } -}; - -/** - * Listen for connections. - * - * A node `http.Server` is returned, with this - * application (which is a `Function`) as its - * callback. If you wish to create both an HTTP - * and HTTPS server you may do so with the "http" - * and "https" modules as shown here: - * - * var http = require('http') - * , https = require('https') - * , express = require('express') - * , app = express(); - * - * http.createServer(app).listen(80); - * https.createServer({ ... }, app).listen(443); - * - * @return {http.Server} - * @api public - */ - -app.listen = function(){ - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; - -/** -* Log error using console.error. -* -* @param {Error} err -* @api public -*/ - -function logerror(err){ - if (this.get('env') !== 'test') console.error(err.stack || err.toString()); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/express.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/express.js deleted file mode 100644 index 7be6832..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/express.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter; -var mixin = require('utils-merge'); -var proto = require('./application'); -var Route = require('./router/route'); -var Router = require('./router'); -var req = require('./request'); -var res = require('./response'); - -/** - * Expose `createApplication()`. - */ - -exports = module.exports = createApplication; - -/** - * Create an express application. - * - * @return {Function} - * @api public - */ - -function createApplication() { - var app = function(req, res, next) { - app.handle(req, res, next); - }; - - mixin(app, proto); - mixin(app, EventEmitter.prototype); - - app.request = { __proto__: req, app: app }; - app.response = { __proto__: res, app: app }; - app.init(); - return app; -} - -/** - * Expose the prototypes. - */ - -exports.application = proto; -exports.request = req; -exports.response = res; - -/** - * Expose constructors. - */ - -exports.Route = Route; -exports.Router = Router; - -/** - * Expose middleware - */ - -exports.query = require('./middleware/query'); -exports.static = require('serve-static'); - -/** - * Replace removed middleware with an appropriate error message. - */ - -[ - 'json', - 'urlencoded', - 'bodyParser', - 'compress', - 'cookieSession', - 'session', - 'logger', - 'cookieParser', - 'favicon', - 'responseTime', - 'errorHandler', - 'timeout', - 'methodOverride', - 'vhost', - 'csrf', - 'directory', - 'limit', - 'multipart', - 'staticCache', -].forEach(function (name) { - Object.defineProperty(exports, name, { - get: function () { - throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.'); - }, - configurable: true - }); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/init.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/init.js deleted file mode 100644 index c09cf0c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/init.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Initialization middleware, exposing the - * request and response to eachother, as well - * as defaulting the X-Powered-By header field. - * - * @param {Function} app - * @return {Function} - * @api private - */ - -exports.init = function(app){ - return function expressInit(req, res, next){ - if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); - req.res = res; - res.req = req; - req.next = next; - - req.__proto__ = app.request; - res.__proto__ = app.response; - - res.locals = res.locals || Object.create(null); - - next(); - }; -}; - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/query.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/query.js deleted file mode 100644 index 092bbd9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/query.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Module dependencies. - */ - -var parseUrl = require('parseurl'); -var qs = require('qs'); - -/** - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function query(options) { - var queryparse = qs.parse; - - if (typeof options === 'function') { - queryparse = options; - options = undefined; - } - - return function query(req, res, next){ - if (!req.query) { - var val = parseUrl(req).query; - req.query = queryparse(val, options); - } - - next(); - }; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/request.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/request.js deleted file mode 100644 index ea5d037..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/request.js +++ /dev/null @@ -1,454 +0,0 @@ -/** - * Module dependencies. - */ - -var accepts = require('accepts'); -var deprecate = require('depd')('express'); -var typeis = require('type-is'); -var http = require('http'); -var fresh = require('fresh'); -var parseRange = require('range-parser'); -var parse = require('parseurl'); -var proxyaddr = require('proxy-addr'); - -/** - * Request prototype. - */ - -var req = exports = module.exports = { - __proto__: http.IncomingMessage.prototype -}; - -/** - * Return request header. - * - * The `Referrer` header field is special-cased, - * both `Referrer` and `Referer` are interchangeable. - * - * Examples: - * - * req.get('Content-Type'); - * // => "text/plain" - * - * req.get('content-type'); - * // => "text/plain" - * - * req.get('Something'); - * // => undefined - * - * Aliased as `req.header()`. - * - * @param {String} name - * @return {String} - * @api public - */ - -req.get = -req.header = function(name){ - switch (name = name.toLowerCase()) { - case 'referer': - case 'referrer': - return this.headers.referrer - || this.headers.referer; - default: - return this.headers[name]; - } -}; - -/** - * To do: update docs. - * - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json", a comma-delimted list such as "json, html, text/plain", - * an argument list such as `"json", "html", "text/plain"`, - * or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * req.accepts('html'); - * // => "html" - * - * // Accept: text/*, application/json - * req.accepts('html'); - * // => "html" - * req.accepts('text/html'); - * // => "text/html" - * req.accepts('json, text'); - * // => "json" - * req.accepts('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * req.accepts('image/png'); - * req.accepts('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * req.accepts(['html', 'json']); - * req.accepts('html', 'json'); - * req.accepts('html, json'); - * // => "json" - * - * @param {String|Array} type(s) - * @return {String} - * @api public - */ - -req.accepts = function(){ - var accept = accepts(this); - return accept.types.apply(accept, arguments); -}; - -/** - * Check if the given `encoding`s are accepted. - * - * @param {String} ...encoding - * @return {Boolean} - * @api public - */ - -req.acceptsEncodings = function(){ - var accept = accepts(this); - return accept.encodings.apply(accept, arguments); -}; - -req.acceptsEncoding = deprecate.function(req.acceptsEncodings, - 'req.acceptsEncoding: Use acceptsEncodings instead'); - -/** - * Check if the given `charset`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...charset - * @return {Boolean} - * @api public - */ - -req.acceptsCharsets = function(){ - var accept = accepts(this); - return accept.charsets.apply(accept, arguments); -}; - -req.acceptsCharset = deprecate.function(req.acceptsCharsets, - 'req.acceptsCharset: Use acceptsCharsets instead'); - -/** - * Check if the given `lang`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...lang - * @return {Boolean} - * @api public - */ - -req.acceptsLanguages = function(){ - var accept = accepts(this); - return accept.languages.apply(accept, arguments); -}; - -req.acceptsLanguage = deprecate.function(req.acceptsLanguages, - 'req.acceptsLanguage: Use acceptsLanguages instead'); - -/** - * Parse Range header field, - * capping to the given `size`. - * - * Unspecified ranges such as "0-" require - * knowledge of your resource length. In - * the case of a byte range this is of course - * the total number of bytes. If the Range - * header field is not given `null` is returned, - * `-1` when unsatisfiable, `-2` when syntactically invalid. - * - * NOTE: remember that ranges are inclusive, so - * for example "Range: users=0-3" should respond - * with 4 users when available, not 3. - * - * @param {Number} size - * @return {Array} - * @api public - */ - -req.range = function(size){ - var range = this.get('Range'); - if (!range) return; - return parseRange(size, range); -}; - -/** - * Return the value of param `name` when present or `defaultValue`. - * - * - Checks route placeholders, ex: _/user/:id_ - * - Checks body params, ex: id=12, {"id":12} - * - Checks query string params, ex: ?id=12 - * - * To utilize request bodies, `req.body` - * should be an object. This can be done by using - * the `bodyParser()` middleware. - * - * @param {String} name - * @param {Mixed} [defaultValue] - * @return {String} - * @api public - */ - -req.param = function(name, defaultValue){ - var params = this.params || {}; - var body = this.body || {}; - var query = this.query || {}; - if (null != params[name] && params.hasOwnProperty(name)) return params[name]; - if (null != body[name]) return body[name]; - if (null != query[name]) return query[name]; - return defaultValue; -}; - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains the give mime `type`. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * req.is('html'); - * req.is('text/html'); - * req.is('text/*'); - * // => true - * - * // When Content-Type is application/json - * req.is('json'); - * req.is('application/json'); - * req.is('application/*'); - * // => true - * - * req.is('html'); - * // => false - * - * @param {String} type - * @return {Boolean} - * @api public - */ - -req.is = function(types){ - if (!Array.isArray(types)) types = [].slice.call(arguments); - return typeis(this, types); -}; - -/** - * Return the protocol string "http" or "https" - * when requested with TLS. When the "trust proxy" - * setting trusts the socket address, the - * "X-Forwarded-Proto" header field will be trusted - * and used if present. - * - * If you're running behind a reverse proxy that - * supplies https for you this may be enabled. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'protocol', function protocol(){ - var proto = this.connection.encrypted - ? 'https' - : 'http'; - var trust = this.app.get('trust proxy fn'); - - if (!trust(this.connection.remoteAddress)) { - return proto; - } - - // Note: X-Forwarded-Proto is normally only ever a - // single value, but this is to be safe. - proto = this.get('X-Forwarded-Proto') || proto; - return proto.split(/\s*,\s*/)[0]; -}); - -/** - * Short-hand for: - * - * req.protocol == 'https' - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'secure', function secure(){ - return 'https' == this.protocol; -}); - -/** - * Return the remote address from the trusted proxy. - * - * The is the remote address on the socket unless - * "trust proxy" is set. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'ip', function ip(){ - var trust = this.app.get('trust proxy fn'); - return proxyaddr(this, trust); -}); - -/** - * When "trust proxy" is set, trusted proxy addresses + client. - * - * For example if the value were "client, proxy1, proxy2" - * you would receive the array `["client", "proxy1", "proxy2"]` - * where "proxy2" is the furthest down-stream and "proxy1" and - * "proxy2" were trusted. - * - * @return {Array} - * @api public - */ - -defineGetter(req, 'ips', function ips() { - var trust = this.app.get('trust proxy fn'); - var addrs = proxyaddr.all(this, trust); - return addrs.slice(1).reverse(); -}); - -/** - * Return subdomains as an array. - * - * Subdomains are the dot-separated parts of the host before the main domain of - * the app. By default, the domain of the app is assumed to be the last two - * parts of the host. This can be changed by setting "subdomain offset". - * - * For example, if the domain is "tobi.ferrets.example.com": - * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. - * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. - * - * @return {Array} - * @api public - */ - -defineGetter(req, 'subdomains', function subdomains() { - var offset = this.app.get('subdomain offset'); - return (this.hostname || '') - .split('.') - .reverse() - .slice(offset); -}); - -/** - * Short-hand for `url.parse(req.url).pathname`. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'path', function path() { - return parse(this).pathname; -}); - -/** - * Parse the "Host" header field to a hostname. - * - * When the "trust proxy" setting trusts the socket - * address, the "X-Forwarded-Host" header field will - * be trusted. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'hostname', function hostname(){ - var trust = this.app.get('trust proxy fn'); - var host = this.get('X-Forwarded-Host'); - - if (!host || !trust(this.connection.remoteAddress)) { - host = this.get('Host'); - } - - if (!host) return; - - // IPv6 literal support - var offset = host[0] === '[' - ? host.indexOf(']') + 1 - : 0; - var index = host.indexOf(':', offset); - - return ~index - ? host.substring(0, index) - : host; -}); - -// TODO: change req.host to return host in next major - -defineGetter(req, 'host', deprecate.function(function host(){ - return this.hostname; -}, 'req.host: Use req.hostname instead')); - -/** - * Check if the request is fresh, aka - * Last-Modified and/or the ETag - * still match. - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'fresh', function(){ - var method = this.method; - var s = this.res.statusCode; - - // GET or HEAD for weak freshness validation only - if ('GET' != method && 'HEAD' != method) return false; - - // 2xx or 304 as per rfc2616 14.26 - if ((s >= 200 && s < 300) || 304 == s) { - return fresh(this.headers, this.res._headers); - } - - return false; -}); - -/** - * Check if the request is stale, aka - * "Last-Modified" and / or the "ETag" for the - * resource has changed. - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'stale', function stale(){ - return !this.fresh; -}); - -/** - * Check if the request was an _XMLHttpRequest_. - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'xhr', function xhr(){ - var val = this.get('X-Requested-With') || ''; - return 'xmlhttprequest' == val.toLowerCase(); -}); - -/** - * Helper function for creating a getter on an object. - * - * @param {Object} obj - * @param {String} name - * @param {Function} getter - * @api private - */ -function defineGetter(obj, name, getter) { - Object.defineProperty(obj, name, { - configurable: true, - enumerable: true, - get: getter - }); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/response.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/response.js deleted file mode 100644 index eff48d7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/response.js +++ /dev/null @@ -1,831 +0,0 @@ -/** - * Module dependencies. - */ - -var deprecate = require('depd')('express'); -var escapeHtml = require('escape-html'); -var http = require('http'); -var path = require('path'); -var mixin = require('utils-merge'); -var sign = require('cookie-signature').sign; -var normalizeType = require('./utils').normalizeType; -var normalizeTypes = require('./utils').normalizeTypes; -var setCharset = require('./utils').setCharset; -var contentDisposition = require('./utils').contentDisposition; -var statusCodes = http.STATUS_CODES; -var cookie = require('cookie'); -var send = require('send'); -var basename = path.basename; -var extname = path.extname; -var mime = send.mime; -var vary = require('vary'); - -/** - * Response prototype. - */ - -var res = module.exports = { - __proto__: http.ServerResponse.prototype -}; - -/** - * Set status `code`. - * - * @param {Number} code - * @return {ServerResponse} - * @api public - */ - -res.status = function(code){ - this.statusCode = code; - return this; -}; - -/** - * Set Link header field with the given `links`. - * - * Examples: - * - * res.links({ - * next: 'http://api.example.com/users?page=2', - * last: 'http://api.example.com/users?page=5' - * }); - * - * @param {Object} links - * @return {ServerResponse} - * @api public - */ - -res.links = function(links){ - var link = this.get('Link') || ''; - if (link) link += ', '; - return this.set('Link', link + Object.keys(links).map(function(rel){ - return '<' + links[rel] + '>; rel="' + rel + '"'; - }).join(', ')); -}; - -/** - * Send a response. - * - * Examples: - * - * res.send(new Buffer('wahoo')); - * res.send({ some: 'json' }); - * res.send('

some html

'); - * - * @param {string|number|boolean|object|Buffer} body - * @api public - */ - -res.send = function send(body) { - var chunk = body; - var encoding; - var len; - var req = this.req; - var type; - - // settings - var app = this.app; - - // allow status / body - if (arguments.length === 2) { - // res.send(body, status) backwards compat - if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') { - deprecate('res.send(body, status): Use res.status(status).send(body) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.send(status, body): Use res.status(status).send(body) instead'); - this.statusCode = arguments[0]; - chunk = arguments[1]; - } - } - - // disambiguate res.send(status) and res.send(status, num) - if (typeof chunk === 'number' && arguments.length === 1) { - // res.send(status) will set status message as text string - if (!this.get('Content-Type')) { - this.type('txt'); - } - - deprecate('res.send(status): Use res.status(status).end() instead'); - this.statusCode = chunk; - chunk = http.STATUS_CODES[chunk]; - } - - switch (typeof chunk) { - // string defaulting to html - case 'string': - if (!this.get('Content-Type')) { - this.type('html'); - } - break; - case 'boolean': - case 'number': - case 'object': - if (chunk === null) { - chunk = ''; - } else if (Buffer.isBuffer(chunk)) { - if (!this.get('Content-Type')) { - this.type('bin'); - } - } else { - return this.json(chunk); - } - break; - } - - // write strings in utf-8 - if (typeof chunk === 'string') { - encoding = 'utf8'; - type = this.get('Content-Type'); - - // reflect this in content-type - if (typeof type === 'string') { - this.set('Content-Type', setCharset(type, 'utf-8')); - } - } - - // populate Content-Length - if (chunk !== undefined) { - if (!Buffer.isBuffer(chunk)) { - // convert chunk to Buffer; saves later double conversions - chunk = new Buffer(chunk, encoding); - encoding = undefined; - } - - len = chunk.length; - this.set('Content-Length', len); - } - - // method check - var isHead = req.method === 'HEAD'; - - // ETag support - if (len !== undefined && (isHead || req.method === 'GET')) { - var etag = app.get('etag fn'); - if (etag && !this.get('ETag')) { - etag = etag(chunk, encoding); - etag && this.set('ETag', etag); - } - } - - // freshness - if (req.fresh) this.statusCode = 304; - - // strip irrelevant headers - if (204 == this.statusCode || 304 == this.statusCode) { - this.removeHeader('Content-Type'); - this.removeHeader('Content-Length'); - this.removeHeader('Transfer-Encoding'); - chunk = ''; - } - - // skip body for HEAD - if (isHead) { - this.end(); - } - - // respond - this.end(chunk, encoding); - - return this; -}; - -/** - * Send JSON response. - * - * Examples: - * - * res.json(null); - * res.json({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @api public - */ - -res.json = function json(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.json(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.json(status, obj): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(val, replacer, spaces); - - // content-type - if (!this.get('Content-Type')) { - this.set('Content-Type', 'application/json'); - } - - return this.send(body); -}; - -/** - * Send JSON response with JSONP callback support. - * - * Examples: - * - * res.jsonp(null); - * res.jsonp({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @api public - */ - -res.jsonp = function jsonp(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.jsonp(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(val, replacer, spaces); - var callback = this.req.query[app.get('jsonp callback name')]; - - // content-type - if (!this.get('Content-Type')) { - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'application/json'); - } - - // fixup callback - if (Array.isArray(callback)) { - callback = callback[0]; - } - - // jsonp - if (typeof callback === 'string' && callback.length !== 0) { - this.charset = 'utf-8'; - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'text/javascript'); - - // restrict callback charset - callback = callback.replace(/[^\[\]\w$.]/g, ''); - - // replace chars not allowed in JavaScript that are in JSON - body = body - .replace(/\u2028/g, '\\u2028') - .replace(/\u2029/g, '\\u2029'); - - // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse" - // the typeof check is just to reduce client error noise - body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');'; - } - - return this.send(body); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `fn(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.sentHeader` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 (can be string converted by `ms`) - * - `root` root directory for relative filenames - * - `headers` object of headers to serve with file - * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them - * - * Other options are passed along to `send`. - * - * Examples: - * - * The following example illustrates how `res.sendfile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendfile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendfile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @api public - */ - -res.sendfile = function(path, options, fn){ - options = options || {}; - var self = this; - var req = self.req; - var next = this.req.next; - var done; - - - // support function as second arg - if ('function' == typeof options) { - fn = options; - options = {}; - } - - // socket errors - req.socket.on('error', error); - - // errors - function error(err) { - if (done) return; - done = true; - - // clean up - cleanup(); - - // callback available - if (fn) return fn(err); - - // delegate - next(err); - } - - // streaming - function stream(stream) { - if (done) return; - cleanup(); - if (fn) stream.on('end', fn); - } - - // cleanup - function cleanup() { - req.socket.removeListener('error', error); - } - - // transfer - var file = send(req, path, options); - file.on('error', error); - file.on('directory', next); - file.on('stream', stream); - - if (options.headers) { - // set headers on successful transfer - file.on('headers', function headers(res) { - var obj = options.headers; - var keys = Object.keys(obj); - - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - res.setHeader(k, obj[k]); - } - }); - } - - // pipe - file.pipe(this); - this.on('finish', cleanup); -}; - -/** - * Transfer the file at the given `path` as an attachment. - * - * Optionally providing an alternate attachment `filename`, - * and optional callback `fn(err)`. The callback is invoked - * when the data transfer is complete, or when an error has - * ocurred. Be sure to check `res.headersSent` if you plan to respond. - * - * This method uses `res.sendfile()`. - * - * @api public - */ - -res.download = function(path, filename, fn){ - // support function as second arg - if ('function' == typeof filename) { - fn = filename; - filename = null; - } - - filename = filename || path; - - // set Content-Disposition when file is sent - var headers = { - 'Content-Disposition': contentDisposition(filename) - }; - - return this.sendfile(path, { headers: headers }, fn); -}; - -/** - * Set _Content-Type_ response header with `type` through `mime.lookup()` - * when it does not contain "/", or set the Content-Type to `type` otherwise. - * - * Examples: - * - * res.type('.html'); - * res.type('html'); - * res.type('json'); - * res.type('application/json'); - * res.type('png'); - * - * @param {String} type - * @return {ServerResponse} for chaining - * @api public - */ - -res.contentType = -res.type = function(type){ - return this.set('Content-Type', ~type.indexOf('/') - ? type - : mime.lookup(type)); -}; - -/** - * Respond to the Acceptable formats using an `obj` - * of mime-type callbacks. - * - * This method uses `req.accepted`, an array of - * acceptable types ordered by their quality values. - * When "Accept" is not present the _first_ callback - * is invoked, otherwise the first match is used. When - * no match is performed the server responds with - * 406 "Not Acceptable". - * - * Content-Type is set for you, however if you choose - * you may alter this within the callback using `res.type()` - * or `res.set('Content-Type', ...)`. - * - * res.format({ - * 'text/plain': function(){ - * res.send('hey'); - * }, - * - * 'text/html': function(){ - * res.send('

hey

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

hey

'); - * }, - * - * json: function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * By default Express passes an `Error` - * with a `.status` of 406 to `next(err)` - * if a match is not made. If you provide - * a `.default` callback it will be invoked - * instead. - * - * @param {Object} obj - * @return {ServerResponse} for chaining - * @api public - */ - -res.format = function(obj){ - var req = this.req; - var next = req.next; - - var fn = obj.default; - if (fn) delete obj.default; - var keys = Object.keys(obj); - - var key = req.accepts(keys); - - this.vary("Accept"); - - if (key) { - this.set('Content-Type', normalizeType(key).value); - obj[key](req, this, next); - } else if (fn) { - fn(); - } else { - var err = new Error('Not Acceptable'); - err.status = 406; - err.types = normalizeTypes(keys).map(function(o){ return o.value }); - next(err); - } - - return this; -}; - -/** - * Set _Content-Disposition_ header to _attachment_ with optional `filename`. - * - * @param {String} filename - * @return {ServerResponse} - * @api public - */ - -res.attachment = function(filename){ - if (filename) this.type(extname(filename)); - this.set('Content-Disposition', contentDisposition(filename)); - return this; -}; - -/** - * Set header `field` to `val`, or pass - * an object of header fields. - * - * Examples: - * - * res.set('Foo', ['bar', 'baz']); - * res.set('Accept', 'application/json'); - * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); - * - * Aliased as `res.header()`. - * - * @param {String|Object|Array} field - * @param {String} val - * @return {ServerResponse} for chaining - * @api public - */ - -res.set = -res.header = function header(field, val) { - if (arguments.length === 2) { - if (Array.isArray(val)) val = val.map(String); - else val = String(val); - if ('content-type' == field.toLowerCase() && !/;\s*charset\s*=/.test(val)) { - var charset = mime.charsets.lookup(val.split(';')[0]); - if (charset) val += '; charset=' + charset.toLowerCase(); - } - this.setHeader(field, val); - } else { - for (var key in field) { - this.set(key, field[key]); - } - } - return this; -}; - -/** - * Get value for header `field`. - * - * @param {String} field - * @return {String} - * @api public - */ - -res.get = function(field){ - return this.getHeader(field); -}; - -/** - * Clear cookie `name`. - * - * @param {String} name - * @param {Object} options - * @return {ServerResponse} for chaining - * @api public - */ - -res.clearCookie = function(name, options){ - var opts = { expires: new Date(1), path: '/' }; - return this.cookie(name, '', options - ? mixin(opts, options) - : opts); -}; - -/** - * Set cookie `name` to `val`, with the given `options`. - * - * Options: - * - * - `maxAge` max-age in milliseconds, converted to `expires` - * - `signed` sign the cookie - * - `path` defaults to "/" - * - * Examples: - * - * // "Remember Me" for 15 minutes - * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); - * - * // save as above - * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) - * - * @param {String} name - * @param {String|Object} val - * @param {Options} options - * @return {ServerResponse} for chaining - * @api public - */ - -res.cookie = function(name, val, options){ - options = mixin({}, options); - var secret = this.req.secret; - var signed = options.signed; - if (signed && !secret) throw new Error('cookieParser("secret") required for signed cookies'); - if ('number' == typeof val) val = val.toString(); - if ('object' == typeof val) val = 'j:' + JSON.stringify(val); - if (signed) val = 's:' + sign(val, secret); - if ('maxAge' in options) { - options.expires = new Date(Date.now() + options.maxAge); - options.maxAge /= 1000; - } - if (null == options.path) options.path = '/'; - var headerVal = cookie.serialize(name, String(val), options); - - // supports multiple 'res.cookie' calls by getting previous value - var prev = this.get('Set-Cookie'); - if (prev) { - if (Array.isArray(prev)) { - headerVal = prev.concat(headerVal); - } else { - headerVal = [prev, headerVal]; - } - } - this.set('Set-Cookie', headerVal); - return this; -}; - - -/** - * Set the location header to `url`. - * - * The given `url` can also be "back", which redirects - * to the _Referrer_ or _Referer_ headers or "/". - * - * Examples: - * - * res.location('/foo/bar').; - * res.location('http://example.com'); - * res.location('../login'); - * - * @param {String} url - * @return {ServerResponse} for chaining - * @api public - */ - -res.location = function(url){ - var req = this.req; - - // "back" is an alias for the referrer - if ('back' == url) url = req.get('Referrer') || '/'; - - // Respond - this.set('Location', url); - return this; -}; - -/** - * Redirect to the given `url` with optional response `status` - * defaulting to 302. - * - * The resulting `url` is determined by `res.location()`, so - * it will play nicely with mounted apps, relative paths, - * `"back"` etc. - * - * Examples: - * - * res.redirect('/foo/bar'); - * res.redirect('http://example.com'); - * res.redirect(301, 'http://example.com'); - * res.redirect('../login'); // /blog/post/1 -> /blog/login - * - * @api public - */ - -res.redirect = function redirect(url) { - var address = url; - var body; - var status = 302; - - // allow status / url - if (arguments.length === 2) { - if (typeof arguments[0] === 'number') { - status = arguments[0]; - address = arguments[1]; - } else { - deprecate('res.redirect(ur, status): Use res.redirect(status, url) instead'); - status = arguments[1]; - } - } - - // Set location header - this.location(address); - address = this.get('Location'); - - // Support text/{plain,html} by default - this.format({ - text: function(){ - body = statusCodes[status] + '. Redirecting to ' + encodeURI(url); - }, - - html: function(){ - var u = escapeHtml(url); - body = '

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

'; - }, - - default: function(){ - body = ''; - } - }); - - // Respond - this.statusCode = status; - this.set('Content-Length', Buffer.byteLength(body)); - - if (this.req.method === 'HEAD') { - this.end(); - } - - this.end(body); -}; - -/** - * Add `field` to Vary. If already present in the Vary set, then - * this call is simply ignored. - * - * @param {Array|String} field - * @return {ServerResponse} for chaining - * @api public - */ - -res.vary = function(field){ - // checks for back-compat - if (!field || (Array.isArray(field) && !field.length)) { - deprecate('res.vary(): Provide a field name'); - return this; - } - - vary(this, field); - - return this; -}; - -/** - * Render `view` with the given `options` and optional callback `fn`. - * When a callback function is given a response will _not_ be made - * automatically, otherwise a response of _200_ and _text/html_ is given. - * - * Options: - * - * - `cache` boolean hinting to the engine it should cache - * - `filename` filename of the view being rendered - * - * @api public - */ - -res.render = function(view, options, fn){ - options = options || {}; - var self = this; - var req = this.req; - var app = req.app; - - // support callback function as second arg - if ('function' == typeof options) { - fn = options, options = {}; - } - - // merge res.locals - options._locals = self.locals; - - // default callback to respond - fn = fn || function(err, str){ - if (err) return req.next(err); - self.send(str); - }; - - // render - app.render(view, options, fn); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/index.js deleted file mode 100644 index 4e63eb1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/index.js +++ /dev/null @@ -1,548 +0,0 @@ -/** - * Module dependencies. - */ - -var Route = require('./route'); -var Layer = require('./layer'); -var methods = require('methods'); -var mixin = require('utils-merge'); -var debug = require('debug')('express:router'); -var parseUrl = require('parseurl'); -var slice = Array.prototype.slice; -var toString = Object.prototype.toString; -var utils = require('../utils'); - -/** - * Initialize a new `Router` with the given `options`. - * - * @param {Object} options - * @return {Router} which is an callable function - * @api public - */ - -var proto = module.exports = function(options) { - options = options || {}; - - function router(req, res, next) { - router.handle(req, res, next); - } - - // mixin Router class functions - router.__proto__ = proto; - - router.params = {}; - router._params = []; - router.caseSensitive = options.caseSensitive; - router.mergeParams = options.mergeParams; - router.strict = options.strict; - router.stack = []; - - return router; -}; - -/** - * Map the given param placeholder `name`(s) to the given callback. - * - * Parameter mapping is used to provide pre-conditions to routes - * which use normalized placeholders. For example a _:user_id_ parameter - * could automatically load a user's information from the database without - * any additional code, - * - * The callback uses the same signature as middleware, the only difference - * being that the value of the placeholder is passed, in this case the _id_ - * of the user. Once the `next()` function is invoked, just like middleware - * it will continue on to execute the route, or subsequent parameter functions. - * - * Just like in middleware, you must either respond to the request or call next - * to avoid stalling the request. - * - * app.param('user_id', function(req, res, next, id){ - * User.find(id, function(err, user){ - * if (err) { - * return next(err); - * } else if (!user) { - * return next(new Error('failed to load user')); - * } - * req.user = user; - * next(); - * }); - * }); - * - * @param {String} name - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -proto.param = function(name, fn){ - // param logic - if ('function' == typeof name) { - this._params.push(name); - return; - } - - // apply param functions - var params = this._params; - var len = params.length; - var ret; - - if (name[0] === ':') { - name = name.substr(1); - } - - 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; -}; - -/** - * Dispatch a req, res into the router. - * - * @api private - */ - -proto.handle = function(req, res, done) { - var self = this; - - debug('dispatching %s %s', req.method, req.url); - - var search = 1 + req.url.indexOf('?'); - var pathlength = search ? search - 1 : req.url.length; - var fqdn = 1 + req.url.substr(0, pathlength).indexOf('://'); - var protohost = fqdn ? req.url.substr(0, req.url.indexOf('/', 2 + fqdn)) : ''; - var idx = 0; - var removed = ''; - var slashAdded = false; - var paramcalled = {}; - - // store options for OPTIONS request - // only used if OPTIONS request - var options = []; - - // middleware and routes - var stack = self.stack; - - // manage inter-router variables - var parentParams = req.params; - var parentUrl = req.baseUrl || ''; - done = restore(done, req, 'baseUrl', 'next', 'params'); - - // setup next layer - req.next = next; - - // for options requests, respond with a default if nothing else responds - if (req.method === 'OPTIONS') { - done = wrap(done, function(old, err) { - if (err || options.length === 0) return old(err); - - var body = options.join(','); - return res.set('Allow', body).send(body); - }); - } - - // setup basic req values - req.baseUrl = parentUrl; - req.originalUrl = req.originalUrl || req.url; - - next(); - - function next(err) { - var layerError = err === 'route' - ? null - : err; - - var layer = stack[idx++]; - - if (slashAdded) { - req.url = req.url.substr(1); - slashAdded = false; - } - - if (removed.length !== 0) { - req.baseUrl = parentUrl; - req.url = protohost + removed + req.url.substr(protohost.length); - removed = ''; - } - - if (!layer) { - return done(layerError); - } - - self.match_layer(layer, req, res, function (err, path) { - if (err || path === undefined) { - return next(layerError || err); - } - - // route object and not middleware - var route = layer.route; - - // if final route, then we support options - if (route) { - // we don't run any routes with error first - if (layerError) { - return next(layerError); - } - - var method = req.method; - var has_method = route._handles_method(method); - - // build up automatic options response - if (!has_method && method === 'OPTIONS') { - options.push.apply(options, route._options()); - } - - // don't even bother - if (!has_method && method !== 'HEAD') { - return next(); - } - - // we can now dispatch to the route - req.route = route; - } - - // Capture one-time layer values - req.params = self.mergeParams - ? mergeParams(layer.params, parentParams) - : layer.params; - var layerPath = layer.path; - - // this should be done for the layer - self.process_params(layer, paramcalled, req, res, function (err) { - if (err) { - return next(layerError || err); - } - - if (route) { - return layer.handle_request(req, res, next); - } - - trim_prefix(layer, layerError, layerPath, path); - }); - }); - } - - function trim_prefix(layer, layerError, layerPath, path) { - var c = path[layerPath.length]; - if (c && '/' !== c && '.' !== c) return next(layerError); - - // Trim off the part of the url that matches the route - // middleware (.use stuff) needs to have the path stripped - if (layerPath.length !== 0) { - debug('trim prefix (%s) from url %s', layerPath, req.url); - removed = layerPath; - req.url = protohost + req.url.substr(protohost.length + removed.length); - - // Ensure leading slash - if (!fqdn && req.url[0] !== '/') { - req.url = '/' + req.url; - slashAdded = true; - } - - // Setup base URL (no trailing slash) - req.baseUrl = parentUrl + (removed[removed.length - 1] === '/' - ? removed.substring(0, removed.length - 1) - : removed); - } - - debug('%s %s : %s', layer.name, layerPath, req.originalUrl); - - if (layerError) { - layer.handle_error(layerError, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Match request to a layer. - * - * @api private - */ - -proto.match_layer = function match_layer(layer, req, res, done) { - var error = null; - var path; - - try { - path = parseUrl(req).pathname; - - if (!layer.match(path)) { - path = undefined; - } - } catch (err) { - error = err; - } - - done(error, path); -}; - -/** - * Process any parameters for the layer. - * - * @api private - */ - -proto.process_params = function(layer, called, req, res, done) { - var params = this.params; - - // captured parameters from the layer, keys and values - var keys = layer.keys; - - // fast track - if (!keys || keys.length === 0) { - return done(); - } - - var i = 0; - var name; - var paramIndex = 0; - var key; - var paramVal; - var paramCallbacks; - var paramCalled; - - // process params in order - // param callbacks can be async - function param(err) { - if (err) { - return done(err); - } - - if (i >= keys.length ) { - return done(); - } - - paramIndex = 0; - key = keys[i++]; - - if (!key) { - return done(); - } - - name = key.name; - paramVal = req.params[name]; - paramCallbacks = params[name]; - paramCalled = called[name]; - - if (paramVal === undefined || !paramCallbacks) { - return param(); - } - - // param previously called with same value or error occurred - if (paramCalled && (paramCalled.error || paramCalled.match === paramVal)) { - // restore value - req.params[name] = paramCalled.value; - - // next param - return param(paramCalled.error); - } - - called[name] = paramCalled = { - error: null, - match: paramVal, - value: paramVal - }; - - paramCallback(); - } - - // single param callbacks - function paramCallback(err) { - var fn = paramCallbacks[paramIndex++]; - - // store updated value - paramCalled.value = req.params[key.name]; - - if (err) { - // store error - paramCalled.error = err; - param(err); - return; - } - - if (!fn) return param(); - - try { - fn(req, res, paramCallback, paramVal, key.name); - } catch (e) { - paramCallback(e); - } - } - - param(); -}; - -/** - * Use the given middleware function, with optional path, defaulting to "/". - * - * Use (like `.all`) will run for any http METHOD, but it will not add - * handlers for those methods so OPTIONS requests will not consider `.use` - * functions even if they could respond. - * - * The other difference is that _route_ path is stripped and not visible - * to the handler function. The main effect of this feature is that mounted - * handlers can operate without any code changes regardless of the "prefix" - * pathname. - * - * @api public - */ - -proto.use = function use(fn) { - var offset = 0; - var path = '/'; - var self = this; - - // default path to '/' - if (typeof fn !== 'function') { - offset = 1; - path = fn; - } - - var callbacks = utils.flatten(slice.call(arguments, offset)); - - if (callbacks.length === 0) { - throw new TypeError('Router.use() requires callback function'); - } - - callbacks.forEach(function (fn) { - if (typeof fn !== 'function') { - var type = toString.call(fn); - var msg = 'Router.use() requires callback function but got a ' + type; - throw new TypeError(msg); - } - - // add the middleware - debug('use %s %s', path, fn.name || ''); - - var layer = new Layer(path, { - sensitive: self.caseSensitive, - strict: false, - end: false - }, fn); - - layer.route = undefined; - - self.stack.push(layer); - }); - - return this; -}; - -/** - * Create a new Route for the given path. - * - * Each route contains a separate middleware stack and VERB handlers. - * - * See the Route api documentation for details on adding handlers - * and middleware to routes. - * - * @param {String} path - * @return {Route} - * @api public - */ - -proto.route = function(path){ - var route = new Route(path); - - var layer = new Layer(path, { - sensitive: this.caseSensitive, - strict: this.strict, - end: true - }, route.dispatch.bind(route)); - - layer.route = route; - - this.stack.push(layer); - return route; -}; - -// create Router#VERB functions -methods.concat('all').forEach(function(method){ - proto[method] = function(path){ - var route = this.route(path) - route[method].apply(route, slice.call(arguments, 1)); - return this; - }; -}); - -// merge params with parent params -function mergeParams(params, parent) { - if (typeof parent !== 'object' || !parent) { - return params; - } - - // make copy of parent for base - var obj = mixin({}, parent); - - // simple non-numeric merging - if (!(0 in params) || !(0 in parent)) { - return mixin(obj, params); - } - - var i = 0; - var o = 0; - - // determine numeric gaps - while (i === o || o in parent) { - if (i in params) i++; - if (o in parent) o++; - } - - // offset numeric indices in params before merge - for (i--; i >= 0; i--) { - params[i + o] = params[i]; - - // create holes for the merge when necessary - if (i < o) { - delete params[i]; - } - } - - return mixin(parent, params); -} - -// restore obj props after function -function restore(fn, obj) { - var props = new Array(arguments.length - 2); - var vals = new Array(arguments.length - 2); - - for (var i = 0; i < props.length; i++) { - props[i] = arguments[i + 2]; - vals[i] = obj[props[i]]; - } - - return function(err){ - // restore vals - for (var i = 0; i < props.length; i++) { - obj[props[i]] = vals[i]; - } - - return fn.apply(this, arguments); - }; -} - -// wrap a function -function wrap(old, fn) { - return function proxy() { - var args = new Array(arguments.length + 1); - - args[0] = old; - for (var i = 0, len = arguments.length; i < len; i++) { - args[i + 1] = arguments[i]; - } - - fn.apply(this, args); - }; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/layer.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/layer.js deleted file mode 100644 index e292a13..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/layer.js +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Module dependencies. - */ - -var pathRegexp = require('path-to-regexp'); -var debug = require('debug')('express:router:layer'); - -/** - * Expose `Layer`. - */ - -module.exports = Layer; - -function Layer(path, options, fn) { - if (!(this instanceof Layer)) { - return new Layer(path, options, fn); - } - - debug('new %s', path); - options = options || {}; - - this.handle = fn; - this.name = fn.name || ''; - this.params = undefined; - this.path = undefined; - this.regexp = pathRegexp(path, this.keys = [], options); - - if (path === '/' && options.end === false) { - this.regexp.fast_slash = true; - } -} - -/** - * Handle the error for the layer. - * - * @param {Error} error - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_error = function handle_error(error, req, res, next) { - var fn = this.handle; - - if (fn.length !== 4) { - // not a standard error handler - return next(error); - } - - try { - fn(error, req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Handle the request for the layer. - * - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_request = function handle(req, res, next) { - var fn = this.handle; - - if (fn.length > 3) { - // not a standard request handler - return next(); - } - - try { - fn(req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Check if this route matches `path`, if so - * populate `.params`. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -Layer.prototype.match = function match(path) { - if (this.regexp.fast_slash) { - // fast path non-ending match for / (everything matches) - this.params = {}; - this.path = ''; - return true; - } - - var m = this.regexp.exec(path); - - if (!m) { - this.params = undefined; - this.path = undefined; - return false; - } - - // store values - this.params = {}; - this.path = m[0]; - - var keys = this.keys; - var params = this.params; - var n = 0; - var key; - var val; - - for (var i = 1, len = m.length; i < len; ++i) { - key = keys[i - 1]; - val = decode_param(m[i]); - - if (key) { - params[key.name] = val; - } else { - params[n++] = val; - } - } - - return true; -}; - -/** - * Decode param value. - * - * @param {string} val - * @return {string} - * @api private - */ - -function decode_param(val){ - if (typeof val !== 'string') { - return val; - } - - try { - return decodeURIComponent(val); - } catch (e) { - var err = new TypeError("Failed to decode param '" + val + "'"); - err.status = 400; - throw err; - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/match.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/match.js deleted file mode 100644 index ce308c4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/match.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Module dependencies. - */ - -var pathRegexp = require('path-to-regexp'); - -/** - * Expose `Layer`. - */ - -module.exports = Match; - -function Match(layer, path, params) { - this.layer = layer; - this.params = {}; - this.path = path || ''; - - if (!params) { - return this; - } - - var keys = layer.keys; - var n = 0; - var prop; - var key; - var val; - - for (var i = 0; i < params.length; i++) { - key = keys[i]; - val = decode_param(params[i]); - prop = key - ? key.name - : n++; - - this.params[prop] = val; - } - - return this; -}; - -/** - * Decode param value. - * - * @param {string} val - * @return {string} - * @api private - */ - -function decode_param(val){ - if (typeof val !== 'string') { - return val; - } - - try { - return decodeURIComponent(val); - } catch (e) { - var err = new TypeError("Failed to decode param '" + val + "'"); - err.status = 400; - throw err; - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/route.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/route.js deleted file mode 100644 index 6b39211..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/route.js +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Module dependencies. - */ - -var debug = require('debug')('express:router:route'); -var Layer = require('./layer'); -var methods = require('methods'); -var utils = require('../utils'); - -/** - * Expose `Route`. - */ - -module.exports = Route; - -/** - * Initialize `Route` with the given `path`, - * - * @param {String} path - * @api private - */ - -function Route(path) { - debug('new %s', path); - this.path = path; - this.stack = []; - - // route handlers for various http methods - this.methods = {}; -} - -/** - * @api private - */ - -Route.prototype._handles_method = function _handles_method(method) { - if (this.methods._all) { - return true; - } - - method = method.toLowerCase(); - - if (method === 'head' && !this.methods['head']) { - method = 'get'; - } - - return Boolean(this.methods[method]); -}; - -/** - * @return {Array} supported HTTP methods - * @api private - */ - -Route.prototype._options = function(){ - return Object.keys(this.methods).map(function(method) { - return method.toUpperCase(); - }); -}; - -/** - * dispatch req, res into this route - * - * @api private - */ - -Route.prototype.dispatch = function(req, res, done){ - var idx = 0; - var stack = this.stack; - if (stack.length === 0) { - return done(); - } - - var method = req.method.toLowerCase(); - if (method === 'head' && !this.methods['head']) { - method = 'get'; - } - - req.route = this; - - next(); - - function next(err) { - if (err && err === 'route') { - return done(); - } - - var layer = stack[idx++]; - if (!layer) { - return done(err); - } - - if (layer.method && layer.method !== method) { - return next(err); - } - - if (err) { - layer.handle_error(err, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Add a handler for all HTTP verbs to this route. - * - * Behaves just like middleware and can respond or call `next` - * to continue processing. - * - * You can use multiple `.all` call to add multiple handlers. - * - * function check_something(req, res, next){ - * next(); - * }; - * - * function validate_user(req, res, next){ - * next(); - * }; - * - * route - * .all(validate_user) - * .all(check_something) - * .get(function(req, res, next){ - * res.send('hello world'); - * }); - * - * @param {function} handler - * @return {Route} for chaining - * @api public - */ - -Route.prototype.all = function(){ - var self = this; - var callbacks = utils.flatten([].slice.call(arguments)); - callbacks.forEach(function(fn) { - if (typeof fn !== 'function') { - var type = {}.toString.call(fn); - var msg = 'Route.all() requires callback functions but got a ' + type; - throw new Error(msg); - } - - var layer = Layer('/', {}, fn); - layer.method = undefined; - - self.methods._all = true; - self.stack.push(layer); - }); - - return self; -}; - -methods.forEach(function(method){ - Route.prototype[method] = function(){ - var self = this; - var callbacks = utils.flatten([].slice.call(arguments)); - - callbacks.forEach(function(fn) { - if (typeof fn !== 'function') { - var type = {}.toString.call(fn); - var msg = 'Route.' + method + '() requires callback functions but got a ' + type; - throw new Error(msg); - } - - debug('%s %s', method, self.path); - - var layer = Layer('/', {}, fn); - layer.method = method; - - self.methods[method] = true; - self.stack.push(layer); - }); - return self; - }; -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/utils.js deleted file mode 100644 index 9f9fdfd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/utils.js +++ /dev/null @@ -1,302 +0,0 @@ -/** - * Module dependencies. - */ - -var mime = require('send').mime; -var crc32 = require('buffer-crc32'); -var crypto = require('crypto'); -var basename = require('path').basename; -var proxyaddr = require('proxy-addr'); -var qs = require('qs'); -var querystring = require('querystring'); -var typer = require('media-typer'); - -/** - * Return strong ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.etag = function etag(body, encoding){ - if (body.length === 0) { - // fast-path empty body - return '"1B2M2Y8AsgTpgAmY7PhCfg=="' - } - - var hash = crypto - .createHash('md5') - .update(body, encoding) - .digest('base64') - return '"' + hash + '"' -}; - -/** - * Return weak ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.wetag = function wetag(body, encoding){ - if (body.length === 0) { - // fast-path empty body - return 'W/"0-0"' - } - - var buf = Buffer.isBuffer(body) - ? body - : new Buffer(body, encoding) - var len = buf.length - return 'W/"' + len.toString(16) + '-' + crc32.unsigned(buf) + '"' -}; - -/** - * 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; - if ('\\\\' == path.substring(0, 2)) return true; // Microsoft Azure absolute path -}; - -/** - * Flatten the given `arr`. - * - * @param {Array} arr - * @return {Array} - * @api private - */ - -exports.flatten = function(arr, ret){ - ret = ret || []; - var len = arr.length; - for (var i = 0; i < len; ++i) { - if (Array.isArray(arr[i])) { - exports.flatten(arr[i], ret); - } else { - ret.push(arr[i]); - } - } - return ret; -}; - -/** - * Normalize the given `type`, for example "html" becomes "text/html". - * - * @param {String} type - * @return {Object} - * @api private - */ - -exports.normalizeType = function(type){ - return ~type.indexOf('/') - ? acceptParams(type) - : { value: mime.lookup(type), params: {} }; -}; - -/** - * Normalize `types`, for example "html" becomes "text/html". - * - * @param {Array} types - * @return {Array} - * @api private - */ - -exports.normalizeTypes = function(types){ - var ret = []; - - for (var i = 0; i < types.length; ++i) { - ret.push(exports.normalizeType(types[i])); - } - - return ret; -}; - -/** - * Generate Content-Disposition header appropriate for the filename. - * non-ascii filenames are urlencoded and a filename* parameter is added - * - * @param {String} filename - * @return {String} - * @api private - */ - -exports.contentDisposition = function(filename){ - var ret = 'attachment'; - if (filename) { - filename = basename(filename); - // if filename contains non-ascii characters, add a utf-8 version ala RFC 5987 - ret = /[^\040-\176]/.test(filename) - ? 'attachment; filename="' + encodeURI(filename) + '"; filename*=UTF-8\'\'' + encodeURI(filename) - : 'attachment; filename="' + filename + '"'; - } - - return ret; -}; - -/** - * Parse accept params `str` returning an - * object with `.value`, `.quality` and `.params`. - * also includes `.originalIndex` for stable sorting - * - * @param {String} str - * @return {Object} - * @api private - */ - -function acceptParams(str, index) { - var parts = str.split(/ *; */); - var ret = { value: parts[0], quality: 1, params: {}, originalIndex: index }; - - for (var i = 1; i < parts.length; ++i) { - var pms = parts[i].split(/ *= */); - if ('q' == pms[0]) { - ret.quality = parseFloat(pms[1]); - } else { - ret.params[pms[0]] = pms[1]; - } - } - - return ret; -} - -/** - * Compile "etag" value to function. - * - * @param {Boolean|String|Function} val - * @return {Function} - * @api private - */ - -exports.compileETag = function(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = exports.wetag; - break; - case false: - break; - case 'strong': - fn = exports.etag; - break; - case 'weak': - fn = exports.wetag; - break; - default: - throw new TypeError('unknown value for etag function: ' + val); - } - - return fn; -} - -/** - * Compile "query parser" value to function. - * - * @param {String|Function} val - * @return {Function} - * @api private - */ - -exports.compileQueryParser = function compileQueryParser(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = querystring.parse; - break; - case false: - fn = newObject; - break; - case 'extended': - fn = qs.parse; - break; - case 'simple': - fn = querystring.parse; - break; - default: - throw new TypeError('unknown value for query parser function: ' + val); - } - - return fn; -} - -/** - * Compile "proxy trust" value to function. - * - * @param {Boolean|String|Number|Array|Function} val - * @return {Function} - * @api private - */ - -exports.compileTrust = function(val) { - if (typeof val === 'function') return val; - - if (val === true) { - // Support plain true/false - return function(){ return true }; - } - - if (typeof val === 'number') { - // Support trusting hop count - return function(a, i){ return i < val }; - } - - if (typeof val === 'string') { - // Support comma-separated values - val = val.split(/ *, */); - } - - return proxyaddr.compile(val || []); -} - -/** - * Set the charset in a given Content-Type string. - * - * @param {String} type - * @param {String} charset - * @return {String} - * @api private - */ - -exports.setCharset = function(type, charset){ - if (!type || !charset) return type; - - // parse type - var parsed = typer.parse(type); - - // set charset - parsed.parameters.charset = charset; - - // format type - return typer.format(parsed); -}; - -/** - * Return new empty objet. - * - * @return {Object} - * @api private - */ - -function newObject() { - return {}; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/view.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/view.js deleted file mode 100644 index 989e8bb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/view.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Module dependencies. - */ - -var path = require('path'); -var fs = require('fs'); -var utils = require('./utils'); -var dirname = path.dirname; -var basename = path.basename; -var extname = path.extname; -var exists = fs.existsSync || path.existsSync; -var join = path.join; - -/** - * Expose `View`. - */ - -module.exports = View; - -/** - * Initialize a new `View` with the given `name`. - * - * Options: - * - * - `defaultEngine` the default template engine name - * - `engines` template engine require() cache - * - `root` root path for view lookup - * - * @param {String} name - * @param {Object} options - * @api private - */ - -function View(name, options) { - options = options || {}; - this.name = name; - this.root = options.root; - var engines = options.engines; - this.defaultEngine = options.defaultEngine; - var ext = this.ext = extname(name); - if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no extension was provided.'); - if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') + this.defaultEngine); - this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express); - this.path = this.lookup(name); -} - -/** - * Lookup view by the given `path` - * - * @param {String} path - * @return {String} - * @api private - */ - -View.prototype.lookup = function(path){ - var ext = this.ext; - - // . - if (!utils.isAbsolute(path)) path = join(this.root, path); - if (exists(path)) return path; - - // /index. - path = join(dirname(path), basename(path, ext), 'index' + ext); - if (exists(path)) return path; -}; - -/** - * Render with the given `options` and callback `fn(err, str)`. - * - * @param {Object} options - * @param {Function} fn - * @api private - */ - -View.prototype.render = function(options, fn){ - this.engine(this.path, options, fn); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/History.md deleted file mode 100644 index 6403131..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/History.md +++ /dev/null @@ -1,42 +0,0 @@ -1.0.7 / 2014-07-04 -================== - - * Fix wrong type returned from `type` when match after unknown extension - -1.0.6 / 2014-06-24 -================== - - * deps: negotiator@0.4.7 - -1.0.5 / 2014-06-20 -================== - - * fix crash when unknown extension given - -1.0.4 / 2014-06-19 -================== - - * use `mime-types` - -1.0.3 / 2014-06-11 -================== - - * deps: negotiator@0.4.6 - - Order by specificity when quality is the same - -1.0.2 / 2014-05-29 -================== - - * Fix interpretation when header not in request - * deps: pin negotiator@0.4.5 - -1.0.1 / 2014-01-18 -================== - - * Identity encoding isn't always acceptable - * deps: negotiator@~0.4.0 - -1.0.0 / 2013-12-27 -================== - - * Genesis diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/README.md deleted file mode 100644 index f65596a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# Accepts - -[![NPM version](https://badge.fury.io/js/accepts.svg)](http://badge.fury.io/js/accepts) -[![Build Status](https://travis-ci.org/expressjs/accepts.svg?branch=master)](https://travis-ci.org/expressjs/accepts) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/accepts.svg?branch=master)](https://coveralls.io/r/expressjs/accepts) - -Higher level content negotation based on [negotiator](https://github.com/federomero/negotiator). Extracted from [koa](https://github.com/koajs/koa) for general use. - -In addition to negotatior, it allows: - -- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` as well as `('text/html', 'application/json')`. -- Allows type shorthands such as `json`. -- Returns `false` when no types match -- Treats non-existent headers as `*` - -## API - -### var accept = new Accepts(req) - -```js -var accepts = require('accepts') - -http.createServer(function (req, res) { - var accept = accepts(req) -}) -``` - -### accept\[property\]\(\) - -Returns all the explicitly accepted content property as an array in descending priority. - -- `accept.types()` -- `accept.encodings()` -- `accept.charsets()` -- `accept.languages()` - -They are also aliased in singular form such as `accept.type()`. `accept.languages()` is also aliased as `accept.langs()`, etc. - -Note: you should almost never do this in a real app as it defeats the purpose of content negotiation. - -Example: - -```js -// in Google Chrome -var encodings = accept.encodings() // -> ['sdch', 'gzip', 'deflate'] -``` - -Since you probably don't support `sdch`, you should just supply the encodings you support: - -```js -var encoding = accept.encodings('gzip', 'deflate') // -> 'gzip', probably -``` - -### accept\[property\]\(values, ...\) - -You can either have `values` be an array or have an argument list of values. - -If the client does not accept any `values`, `false` will be returned. -If the client accepts any `values`, the preferred `value` will be return. - -For `accept.types()`, shorthand mime types are allowed. - -Example: - -```js -// req.headers.accept = 'application/json' - -accept.types('json') // -> 'json' -accept.types('html', 'json') // -> 'json' -accept.types('html') // -> false - -// req.headers.accept = '' -// which is equivalent to `*` - -accept.types() // -> [], no explicit types -accept.types('text/html', 'text/json') // -> 'text/html', since it was first -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/index.js deleted file mode 100644 index 805e33a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/index.js +++ /dev/null @@ -1,160 +0,0 @@ -var Negotiator = require('negotiator') -var mime = require('mime-types') - -var slice = [].slice - -module.exports = Accepts - -function Accepts(req) { - if (!(this instanceof Accepts)) - return new Accepts(req) - - this.headers = req.headers - this.negotiator = Negotiator(req) -} - -/** - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json" or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * this.types('html'); - * // => "html" - * - * // Accept: text/*, application/json - * this.types('html'); - * // => "html" - * this.types('text/html'); - * // => "text/html" - * this.types('json', 'text'); - * // => "json" - * this.types('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * this.types('image/png'); - * this.types('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * this.types(['html', 'json']); - * this.types('html', 'json'); - * // => "json" - * - * @param {String|Array} type(s)... - * @return {String|Array|Boolean} - * @api public - */ - -Accepts.prototype.type = -Accepts.prototype.types = function (types) { - if (!Array.isArray(types)) types = slice.call(arguments); - var n = this.negotiator; - if (!types.length) return n.mediaTypes(); - if (!this.headers.accept) return types[0]; - var mimes = types.map(extToMime); - var accepts = n.mediaTypes(mimes.filter(validMime)); - var first = accepts[0]; - if (!first) return false; - return types[mimes.indexOf(first)]; -} - -/** - * Return accepted encodings or best fit based on `encodings`. - * - * Given `Accept-Encoding: gzip, deflate` - * an array sorted by quality is returned: - * - * ['gzip', 'deflate'] - * - * @param {String|Array} encoding(s)... - * @return {String|Array} - * @api public - */ - -Accepts.prototype.encoding = -Accepts.prototype.encodings = function (encodings) { - if (!Array.isArray(encodings)) encodings = slice.call(arguments); - var n = this.negotiator; - if (!encodings.length) return n.encodings(); - return n.encodings(encodings)[0] || false; -} - -/** - * Return accepted charsets or best fit based on `charsets`. - * - * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` - * an array sorted by quality is returned: - * - * ['utf-8', 'utf-7', 'iso-8859-1'] - * - * @param {String|Array} charset(s)... - * @return {String|Array} - * @api public - */ - -Accepts.prototype.charset = -Accepts.prototype.charsets = function (charsets) { - if (!Array.isArray(charsets)) charsets = [].slice.call(arguments); - var n = this.negotiator; - if (!charsets.length) return n.charsets(); - if (!this.headers['accept-charset']) return charsets[0]; - return n.charsets(charsets)[0] || false; -} - -/** - * Return accepted languages or best fit based on `langs`. - * - * Given `Accept-Language: en;q=0.8, es, pt` - * an array sorted by quality is returned: - * - * ['es', 'pt', 'en'] - * - * @param {String|Array} lang(s)... - * @return {Array|String} - * @api public - */ - -Accepts.prototype.lang = -Accepts.prototype.langs = -Accepts.prototype.language = -Accepts.prototype.languages = function (langs) { - if (!Array.isArray(langs)) langs = slice.call(arguments); - var n = this.negotiator; - if (!langs.length) return n.languages(); - if (!this.headers['accept-language']) return langs[0]; - return n.languages(langs)[0] || false; -} - -/** - * Convert extnames to mime. - * - * @param {String} type - * @return {String} - * @api private - */ - -function extToMime(type) { - if (~type.indexOf('/')) return type; - return mime.lookup(type); -} - -/** - * Check if mime is valid. - * - * @param {String} type - * @return {String} - * @api private - */ - -function validMime(type) { - return typeof type === 'string'; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore deleted file mode 100644 index 919d51b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -test -build.js - -# OS generated files # -###################### -.DS_Store* -# Icon? -ehthumbs.db -Thumbs.db - -# Node.js # -########### -node_modules -npm-debug.log diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml deleted file mode 100644 index 73c85c6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" - - "0.11" -matrix: - allow_failures: - - node_js: "0.11" - fast_finish: true -before_install: - # remove build script deps before install - - node -pe 'f="./package.json";p=require(f);d=p.devDependencies;for(k in d){if("co"===k.substr(0,2))delete d[k]}require("fs").writeFileSync(f,JSON.stringify(p,null,2))' diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile deleted file mode 100644 index ceaf011..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -build: - node --harmony-generators build.js - -test: - node test/mime.js - mocha --require should --reporter spec test/test.js - -.PHONY: build test diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md deleted file mode 100644 index 8e21ee1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# mime-types -[![NPM version](https://badge.fury.io/js/mime-types.svg)](https://badge.fury.io/js/mime-types) [![Build Status](https://travis-ci.org/expressjs/mime-types.svg?branch=master)](https://travis-ci.org/expressjs/mime-types) - -The ultimate javascript content-type utility. - -### Install - -```sh -$ npm install mime-types -``` - -#### Similar to [node-mime](https://github.com/broofa/node-mime), except: - -- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. -- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. -- Additional mime types are added such as jade and stylus. Feel free to add more! -- Browser support via Browserify and Component by converting lists to JSON files. - -Otherwise, the API is compatible. - -### Adding Types - -If you'd like to add additional types, -simply create a PR adding the type to `custom.json` and -a reference link to the [sources](SOURCES.md). - -Do __NOT__ edit `mime.json` or `node.json`. -Those are pulled using `build.js`. -You should only touch `custom.json`. - -## API - -```js -var mime = require('mime-types') -``` - -All functions return `false` if input is invalid or not found. - -### mime.lookup(path) - -Lookup the content-type associated with a file. - -```js -mime.lookup('json') // 'application/json' -mime.lookup('.md') // 'text/x-markdown' -mime.lookup('file.html') // 'text/html' -mime.lookup('folder/file.js') // 'application/javascript' - -mime.lookup('cats') // false -``` - -### mime.contentType(type) - -Create a full content-type header given a content-type or extension. - -```js -mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' -mime.contentType('file.json') // 'application/json; charset=utf-8' -``` - -### mime.extension(type) - -Get the default extension for a content-type. - -```js -mime.extension('application/octet-stream') // 'bin' -``` - -### mime.charset(type) - -Lookup the implied default charset of a content-type. - -```js -mime.charset('text/x-markdown') // 'UTF-8' -``` - -### mime.types[extension] = type - -A map of content-types by extension. - -### mime.extensions[type] = [extensions] - -A map of extensions by content-type. - -### mime.define(types) - -Globally add definitions. -`types` must be an object of the form: - -```js -{ - "": [extensions...], - "": [extensions...] -} -``` - -See the `.json` files in `lib/` for examples. - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md deleted file mode 100644 index 1d65012..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md +++ /dev/null @@ -1,17 +0,0 @@ - -### Sources for custom types - -This is a list of sources for any custom mime types. -When adding custom mime types, please link to where you found the mime type, -even if it's from an unofficial source. - -- `text/coffeescript` - http://coffeescript.org/#scripts -- `text/x-handlebars-template` - https://handlebarsjs.com/#getting-started -- `text/x-sass` & `text/x-scss` - https://github.com/janlelis/rubybuntu-mime/blob/master/sass.xml -- `text.jsx` - http://facebook.github.io/react/docs/getting-started.html [[2]](https://github.com/facebook/react/blob/f230e0a03154e6f8a616e0da1fb3d97ffa1a6472/vendor/browser-transforms.js#L210) - -[Sources for node.json types](https://github.com/broofa/node-mime/blob/master/types/node.types) - -### Notes on weird types - -- `font/opentype` - This type is technically invalid according to the spec. No valid types begin with `font/`. No-one uses the official type of `application/vnd.ms-opentype` as the community standardized `application/x-font-otf`. However, chrome logs nonsense warnings unless opentype fonts are served with `font/opentype`. [[1]](http://stackoverflow.com/questions/2871655/proper-mime-type-for-fonts) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json deleted file mode 100644 index fa67a6d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "0.1.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com", - "twitter": "https://twitter.com/jongleberry" - }, - "repository": "expressjs/mime-types", - "license": "MIT", - "main": "lib/index.js", - "scripts": ["lib/index.js"], - "json": ["mime.json", "node.json", "custom.json"] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json deleted file mode 100644 index 6137da3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "text/jade": [ - "jade" - ], - "text/stylus": [ - "stylus", - "styl" - ], - "text/less": [ - "less" - ], - "text/x-sass": [ - "sass" - ], - "text/x-scss": [ - "scss" - ], - "text/coffeescript": [ - "coffee" - ], - "text/x-handlebars-template": [ - "hbs" - ], - "text/jsx": [ - "jsx" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js deleted file mode 100644 index 27559ea..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js +++ /dev/null @@ -1,74 +0,0 @@ - -// types[extension] = type -exports.types = Object.create(null) -// extensions[type] = [extensions] -exports.extensions = Object.create(null) -// define more mime types -exports.define = define - -// store the json files -exports.json = { - mime: require('./mime.json'), - node: require('./node.json'), - custom: require('./custom.json'), -} - -exports.lookup = function (string) { - if (!string || typeof string !== "string") return false - string = string.replace(/.*[\.\/\\]/, '').toLowerCase() - if (!string) return false - return exports.types[string] || false -} - -exports.extension = function (type) { - if (!type || typeof type !== "string") return false - type = type.match(/^\s*([^;\s]*)(?:;|\s|$)/) - if (!type) return false - var exts = exports.extensions[type[1].toLowerCase()] - if (!exts || !exts.length) return false - return exts[0] -} - -// type has to be an exact mime type -exports.charset = function (type) { - // special cases - switch (type) { - case 'application/json': return 'UTF-8' - } - - // default text/* to utf-8 - if (/^text\//.test(type)) return 'UTF-8' - - return false -} - -// backwards compatibility -exports.charsets = { - lookup: exports.charset -} - -exports.contentType = function (type) { - if (!type || typeof type !== "string") return false - if (!~type.indexOf('/')) type = exports.lookup(type) - if (!type) return false - if (!~type.indexOf('charset')) { - var charset = exports.charset(type) - if (charset) type += '; charset=' + charset.toLowerCase() - } - return type -} - -define(exports.json.mime) -define(exports.json.node) -define(exports.json.custom) - -function define(json) { - Object.keys(json).forEach(function (type) { - var exts = json[type] || [] - exports.extensions[type] = exports.extensions[type] || [] - exts.forEach(function (ext) { - if (!~exports.extensions[type].indexOf(ext)) exports.extensions[type].push(ext) - exports.types[ext] = type - }) - }) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json deleted file mode 100644 index f445a86..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json +++ /dev/null @@ -1,3317 +0,0 @@ -{ - "application/1d-interleaved-parityfec": [], - "application/3gpp-ims+xml": [], - "application/activemessage": [], - "application/andrew-inset": [ - "ez" - ], - "application/applefile": [], - "application/applixware": [ - "aw" - ], - "application/atom+xml": [ - "atom" - ], - "application/atomcat+xml": [ - "atomcat" - ], - "application/atomicmail": [], - "application/atomsvc+xml": [ - "atomsvc" - ], - "application/auth-policy+xml": [], - "application/batch-smtp": [], - "application/beep+xml": [], - "application/calendar+xml": [], - "application/cals-1840": [], - "application/ccmp+xml": [], - "application/ccxml+xml": [ - "ccxml" - ], - "application/cdmi-capability": [ - "cdmia" - ], - "application/cdmi-container": [ - "cdmic" - ], - "application/cdmi-domain": [ - "cdmid" - ], - "application/cdmi-object": [ - "cdmio" - ], - "application/cdmi-queue": [ - "cdmiq" - ], - "application/cea-2018+xml": [], - "application/cellml+xml": [], - "application/cfw": [], - "application/cnrp+xml": [], - "application/commonground": [], - "application/conference-info+xml": [], - "application/cpl+xml": [], - "application/csta+xml": [], - "application/cstadata+xml": [], - "application/cu-seeme": [ - "cu" - ], - "application/cybercash": [], - "application/davmount+xml": [ - "davmount" - ], - "application/dca-rft": [], - "application/dec-dx": [], - "application/dialog-info+xml": [], - "application/dicom": [], - "application/dns": [], - "application/docbook+xml": [ - "dbk" - ], - "application/dskpp+xml": [], - "application/dssc+der": [ - "dssc" - ], - "application/dssc+xml": [ - "xdssc" - ], - "application/dvcs": [], - "application/ecmascript": [ - "ecma" - ], - "application/edi-consent": [], - "application/edi-x12": [], - "application/edifact": [], - "application/emma+xml": [ - "emma" - ], - "application/epp+xml": [], - "application/epub+zip": [ - "epub" - ], - "application/eshop": [], - "application/example": [], - "application/exi": [ - "exi" - ], - "application/fastinfoset": [], - "application/fastsoap": [], - "application/fits": [], - "application/font-tdpfr": [ - "pfr" - ], - "application/framework-attributes+xml": [], - "application/gml+xml": [ - "gml" - ], - "application/gpx+xml": [ - "gpx" - ], - "application/gxf": [ - "gxf" - ], - "application/h224": [], - "application/held+xml": [], - "application/http": [], - "application/hyperstudio": [ - "stk" - ], - "application/ibe-key-request+xml": [], - "application/ibe-pkg-reply+xml": [], - "application/ibe-pp-data": [], - "application/iges": [], - "application/im-iscomposing+xml": [], - "application/index": [], - "application/index.cmd": [], - "application/index.obj": [], - "application/index.response": [], - "application/index.vnd": [], - "application/inkml+xml": [ - "ink", - "inkml" - ], - "application/iotp": [], - "application/ipfix": [ - "ipfix" - ], - "application/ipp": [], - "application/isup": [], - "application/java-archive": [ - "jar" - ], - "application/java-serialized-object": [ - "ser" - ], - "application/java-vm": [ - "class" - ], - "application/javascript": [ - "js" - ], - "application/json": [ - "json" - ], - "application/jsonml+json": [ - "jsonml" - ], - "application/kpml-request+xml": [], - "application/kpml-response+xml": [], - "application/lost+xml": [ - "lostxml" - ], - "application/mac-binhex40": [ - "hqx" - ], - "application/mac-compactpro": [ - "cpt" - ], - "application/macwriteii": [], - "application/mads+xml": [ - "mads" - ], - "application/marc": [ - "mrc" - ], - "application/marcxml+xml": [ - "mrcx" - ], - "application/mathematica": [ - "ma", - "nb", - "mb" - ], - "application/mathml-content+xml": [], - "application/mathml-presentation+xml": [], - "application/mathml+xml": [ - "mathml" - ], - "application/mbms-associated-procedure-description+xml": [], - "application/mbms-deregister+xml": [], - "application/mbms-envelope+xml": [], - "application/mbms-msk+xml": [], - "application/mbms-msk-response+xml": [], - "application/mbms-protection-description+xml": [], - "application/mbms-reception-report+xml": [], - "application/mbms-register+xml": [], - "application/mbms-register-response+xml": [], - "application/mbms-user-service-description+xml": [], - "application/mbox": [ - "mbox" - ], - "application/media_control+xml": [], - "application/mediaservercontrol+xml": [ - "mscml" - ], - "application/metalink+xml": [ - "metalink" - ], - "application/metalink4+xml": [ - "meta4" - ], - "application/mets+xml": [ - "mets" - ], - "application/mikey": [], - "application/mods+xml": [ - "mods" - ], - "application/moss-keys": [], - "application/moss-signature": [], - "application/mosskey-data": [], - "application/mosskey-request": [], - "application/mp21": [ - "m21", - "mp21" - ], - "application/mp4": [ - "mp4s" - ], - "application/mpeg4-generic": [], - "application/mpeg4-iod": [], - "application/mpeg4-iod-xmt": [], - "application/msc-ivr+xml": [], - "application/msc-mixer+xml": [], - "application/msword": [ - "doc", - "dot" - ], - "application/mxf": [ - "mxf" - ], - "application/nasdata": [], - "application/news-checkgroups": [], - "application/news-groupinfo": [], - "application/news-transmission": [], - "application/nss": [], - "application/ocsp-request": [], - "application/ocsp-response": [], - "application/octet-stream": [ - "bin", - "dms", - "lrf", - "mar", - "so", - "dist", - "distz", - "pkg", - "bpk", - "dump", - "elc", - "deploy" - ], - "application/oda": [ - "oda" - ], - "application/oebps-package+xml": [ - "opf" - ], - "application/ogg": [ - "ogx" - ], - "application/omdoc+xml": [ - "omdoc" - ], - "application/onenote": [ - "onetoc", - "onetoc2", - "onetmp", - "onepkg" - ], - "application/oxps": [ - "oxps" - ], - "application/parityfec": [], - "application/patch-ops-error+xml": [ - "xer" - ], - "application/pdf": [ - "pdf" - ], - "application/pgp-encrypted": [ - "pgp" - ], - "application/pgp-keys": [], - "application/pgp-signature": [ - "asc", - "sig" - ], - "application/pics-rules": [ - "prf" - ], - "application/pidf+xml": [], - "application/pidf-diff+xml": [], - "application/pkcs10": [ - "p10" - ], - "application/pkcs7-mime": [ - "p7m", - "p7c" - ], - "application/pkcs7-signature": [ - "p7s" - ], - "application/pkcs8": [ - "p8" - ], - "application/pkix-attr-cert": [ - "ac" - ], - "application/pkix-cert": [ - "cer" - ], - "application/pkix-crl": [ - "crl" - ], - "application/pkix-pkipath": [ - "pkipath" - ], - "application/pkixcmp": [ - "pki" - ], - "application/pls+xml": [ - "pls" - ], - "application/poc-settings+xml": [], - "application/postscript": [ - "ai", - "eps", - "ps" - ], - "application/prs.alvestrand.titrax-sheet": [], - "application/prs.cww": [ - "cww" - ], - "application/prs.nprend": [], - "application/prs.plucker": [], - "application/prs.rdf-xml-crypt": [], - "application/prs.xsf+xml": [], - "application/pskc+xml": [ - "pskcxml" - ], - "application/qsig": [], - "application/rdf+xml": [ - "rdf" - ], - "application/reginfo+xml": [ - "rif" - ], - "application/relax-ng-compact-syntax": [ - "rnc" - ], - "application/remote-printing": [], - "application/resource-lists+xml": [ - "rl" - ], - "application/resource-lists-diff+xml": [ - "rld" - ], - "application/riscos": [], - "application/rlmi+xml": [], - "application/rls-services+xml": [ - "rs" - ], - "application/rpki-ghostbusters": [ - "gbr" - ], - "application/rpki-manifest": [ - "mft" - ], - "application/rpki-roa": [ - "roa" - ], - "application/rpki-updown": [], - "application/rsd+xml": [ - "rsd" - ], - "application/rss+xml": [ - "rss" - ], - "application/rtf": [ - "rtf" - ], - "application/rtx": [], - "application/samlassertion+xml": [], - "application/samlmetadata+xml": [], - "application/sbml+xml": [ - "sbml" - ], - "application/scvp-cv-request": [ - "scq" - ], - "application/scvp-cv-response": [ - "scs" - ], - "application/scvp-vp-request": [ - "spq" - ], - "application/scvp-vp-response": [ - "spp" - ], - "application/sdp": [ - "sdp" - ], - "application/set-payment": [], - "application/set-payment-initiation": [ - "setpay" - ], - "application/set-registration": [], - "application/set-registration-initiation": [ - "setreg" - ], - "application/sgml": [], - "application/sgml-open-catalog": [], - "application/shf+xml": [ - "shf" - ], - "application/sieve": [], - "application/simple-filter+xml": [], - "application/simple-message-summary": [], - "application/simplesymbolcontainer": [], - "application/slate": [], - "application/smil": [], - "application/smil+xml": [ - "smi", - "smil" - ], - "application/soap+fastinfoset": [], - "application/soap+xml": [], - "application/sparql-query": [ - "rq" - ], - "application/sparql-results+xml": [ - "srx" - ], - "application/spirits-event+xml": [], - "application/srgs": [ - "gram" - ], - "application/srgs+xml": [ - "grxml" - ], - "application/sru+xml": [ - "sru" - ], - "application/ssdl+xml": [ - "ssdl" - ], - "application/ssml+xml": [ - "ssml" - ], - "application/tamp-apex-update": [], - "application/tamp-apex-update-confirm": [], - "application/tamp-community-update": [], - "application/tamp-community-update-confirm": [], - "application/tamp-error": [], - "application/tamp-sequence-adjust": [], - "application/tamp-sequence-adjust-confirm": [], - "application/tamp-status-query": [], - "application/tamp-status-response": [], - "application/tamp-update": [], - "application/tamp-update-confirm": [], - "application/tei+xml": [ - "tei", - "teicorpus" - ], - "application/thraud+xml": [ - "tfi" - ], - "application/timestamp-query": [], - "application/timestamp-reply": [], - "application/timestamped-data": [ - "tsd" - ], - "application/tve-trigger": [], - "application/ulpfec": [], - "application/vcard+xml": [], - "application/vemmi": [], - "application/vividence.scriptfile": [], - "application/vnd.3gpp.bsf+xml": [], - "application/vnd.3gpp.pic-bw-large": [ - "plb" - ], - "application/vnd.3gpp.pic-bw-small": [ - "psb" - ], - "application/vnd.3gpp.pic-bw-var": [ - "pvb" - ], - "application/vnd.3gpp.sms": [], - "application/vnd.3gpp2.bcmcsinfo+xml": [], - "application/vnd.3gpp2.sms": [], - "application/vnd.3gpp2.tcap": [ - "tcap" - ], - "application/vnd.3m.post-it-notes": [ - "pwn" - ], - "application/vnd.accpac.simply.aso": [ - "aso" - ], - "application/vnd.accpac.simply.imp": [ - "imp" - ], - "application/vnd.acucobol": [ - "acu" - ], - "application/vnd.acucorp": [ - "atc", - "acutc" - ], - "application/vnd.adobe.air-application-installer-package+zip": [ - "air" - ], - "application/vnd.adobe.formscentral.fcdt": [ - "fcdt" - ], - "application/vnd.adobe.fxp": [ - "fxp", - "fxpl" - ], - "application/vnd.adobe.partial-upload": [], - "application/vnd.adobe.xdp+xml": [ - "xdp" - ], - "application/vnd.adobe.xfdf": [ - "xfdf" - ], - "application/vnd.aether.imp": [], - "application/vnd.ah-barcode": [], - "application/vnd.ahead.space": [ - "ahead" - ], - "application/vnd.airzip.filesecure.azf": [ - "azf" - ], - "application/vnd.airzip.filesecure.azs": [ - "azs" - ], - "application/vnd.amazon.ebook": [ - "azw" - ], - "application/vnd.americandynamics.acc": [ - "acc" - ], - "application/vnd.amiga.ami": [ - "ami" - ], - "application/vnd.amundsen.maze+xml": [], - "application/vnd.android.package-archive": [ - "apk" - ], - "application/vnd.anser-web-certificate-issue-initiation": [ - "cii" - ], - "application/vnd.anser-web-funds-transfer-initiation": [ - "fti" - ], - "application/vnd.antix.game-component": [ - "atx" - ], - "application/vnd.apple.installer+xml": [ - "mpkg" - ], - "application/vnd.apple.mpegurl": [ - "m3u8" - ], - "application/vnd.arastra.swi": [], - "application/vnd.aristanetworks.swi": [ - "swi" - ], - "application/vnd.astraea-software.iota": [ - "iota" - ], - "application/vnd.audiograph": [ - "aep" - ], - "application/vnd.autopackage": [], - "application/vnd.avistar+xml": [], - "application/vnd.blueice.multipass": [ - "mpm" - ], - "application/vnd.bluetooth.ep.oob": [], - "application/vnd.bmi": [ - "bmi" - ], - "application/vnd.businessobjects": [ - "rep" - ], - "application/vnd.cab-jscript": [], - "application/vnd.canon-cpdl": [], - "application/vnd.canon-lips": [], - "application/vnd.cendio.thinlinc.clientconf": [], - "application/vnd.chemdraw+xml": [ - "cdxml" - ], - "application/vnd.chipnuts.karaoke-mmd": [ - "mmd" - ], - "application/vnd.cinderella": [ - "cdy" - ], - "application/vnd.cirpack.isdn-ext": [], - "application/vnd.claymore": [ - "cla" - ], - "application/vnd.cloanto.rp9": [ - "rp9" - ], - "application/vnd.clonk.c4group": [ - "c4g", - "c4d", - "c4f", - "c4p", - "c4u" - ], - "application/vnd.cluetrust.cartomobile-config": [ - "c11amc" - ], - "application/vnd.cluetrust.cartomobile-config-pkg": [ - "c11amz" - ], - "application/vnd.collection+json": [], - "application/vnd.commerce-battelle": [], - "application/vnd.commonspace": [ - "csp" - ], - "application/vnd.contact.cmsg": [ - "cdbcmsg" - ], - "application/vnd.cosmocaller": [ - "cmc" - ], - "application/vnd.crick.clicker": [ - "clkx" - ], - "application/vnd.crick.clicker.keyboard": [ - "clkk" - ], - "application/vnd.crick.clicker.palette": [ - "clkp" - ], - "application/vnd.crick.clicker.template": [ - "clkt" - ], - "application/vnd.crick.clicker.wordbank": [ - "clkw" - ], - "application/vnd.criticaltools.wbs+xml": [ - "wbs" - ], - "application/vnd.ctc-posml": [ - "pml" - ], - "application/vnd.ctct.ws+xml": [], - "application/vnd.cups-pdf": [], - "application/vnd.cups-postscript": [], - "application/vnd.cups-ppd": [ - "ppd" - ], - "application/vnd.cups-raster": [], - "application/vnd.cups-raw": [], - "application/vnd.curl": [], - "application/vnd.curl.car": [ - "car" - ], - "application/vnd.curl.pcurl": [ - "pcurl" - ], - "application/vnd.cybank": [], - "application/vnd.dart": [ - "dart" - ], - "application/vnd.data-vision.rdz": [ - "rdz" - ], - "application/vnd.dece.data": [ - "uvf", - "uvvf", - "uvd", - "uvvd" - ], - "application/vnd.dece.ttml+xml": [ - "uvt", - "uvvt" - ], - "application/vnd.dece.unspecified": [ - "uvx", - "uvvx" - ], - "application/vnd.dece.zip": [ - "uvz", - "uvvz" - ], - "application/vnd.denovo.fcselayout-link": [ - "fe_launch" - ], - "application/vnd.dir-bi.plate-dl-nosuffix": [], - "application/vnd.dna": [ - "dna" - ], - "application/vnd.dolby.mlp": [ - "mlp" - ], - "application/vnd.dolby.mobile.1": [], - "application/vnd.dolby.mobile.2": [], - "application/vnd.dpgraph": [ - "dpg" - ], - "application/vnd.dreamfactory": [ - "dfac" - ], - "application/vnd.ds-keypoint": [ - "kpxx" - ], - "application/vnd.dvb.ait": [ - "ait" - ], - "application/vnd.dvb.dvbj": [], - "application/vnd.dvb.esgcontainer": [], - "application/vnd.dvb.ipdcdftnotifaccess": [], - "application/vnd.dvb.ipdcesgaccess": [], - "application/vnd.dvb.ipdcesgaccess2": [], - "application/vnd.dvb.ipdcesgpdd": [], - "application/vnd.dvb.ipdcroaming": [], - "application/vnd.dvb.iptv.alfec-base": [], - "application/vnd.dvb.iptv.alfec-enhancement": [], - "application/vnd.dvb.notif-aggregate-root+xml": [], - "application/vnd.dvb.notif-container+xml": [], - "application/vnd.dvb.notif-generic+xml": [], - "application/vnd.dvb.notif-ia-msglist+xml": [], - "application/vnd.dvb.notif-ia-registration-request+xml": [], - "application/vnd.dvb.notif-ia-registration-response+xml": [], - "application/vnd.dvb.notif-init+xml": [], - "application/vnd.dvb.pfr": [], - "application/vnd.dvb.service": [ - "svc" - ], - "application/vnd.dxr": [], - "application/vnd.dynageo": [ - "geo" - ], - "application/vnd.easykaraoke.cdgdownload": [], - "application/vnd.ecdis-update": [], - "application/vnd.ecowin.chart": [ - "mag" - ], - "application/vnd.ecowin.filerequest": [], - "application/vnd.ecowin.fileupdate": [], - "application/vnd.ecowin.series": [], - "application/vnd.ecowin.seriesrequest": [], - "application/vnd.ecowin.seriesupdate": [], - "application/vnd.emclient.accessrequest+xml": [], - "application/vnd.enliven": [ - "nml" - ], - "application/vnd.eprints.data+xml": [], - "application/vnd.epson.esf": [ - "esf" - ], - "application/vnd.epson.msf": [ - "msf" - ], - "application/vnd.epson.quickanime": [ - "qam" - ], - "application/vnd.epson.salt": [ - "slt" - ], - "application/vnd.epson.ssf": [ - "ssf" - ], - "application/vnd.ericsson.quickcall": [], - "application/vnd.eszigno3+xml": [ - "es3", - "et3" - ], - "application/vnd.etsi.aoc+xml": [], - "application/vnd.etsi.cug+xml": [], - "application/vnd.etsi.iptvcommand+xml": [], - "application/vnd.etsi.iptvdiscovery+xml": [], - "application/vnd.etsi.iptvprofile+xml": [], - "application/vnd.etsi.iptvsad-bc+xml": [], - "application/vnd.etsi.iptvsad-cod+xml": [], - "application/vnd.etsi.iptvsad-npvr+xml": [], - "application/vnd.etsi.iptvservice+xml": [], - "application/vnd.etsi.iptvsync+xml": [], - "application/vnd.etsi.iptvueprofile+xml": [], - "application/vnd.etsi.mcid+xml": [], - "application/vnd.etsi.overload-control-policy-dataset+xml": [], - "application/vnd.etsi.sci+xml": [], - "application/vnd.etsi.simservs+xml": [], - "application/vnd.etsi.tsl+xml": [], - "application/vnd.etsi.tsl.der": [], - "application/vnd.eudora.data": [], - "application/vnd.ezpix-album": [ - "ez2" - ], - "application/vnd.ezpix-package": [ - "ez3" - ], - "application/vnd.f-secure.mobile": [], - "application/vnd.fdf": [ - "fdf" - ], - "application/vnd.fdsn.mseed": [ - "mseed" - ], - "application/vnd.fdsn.seed": [ - "seed", - "dataless" - ], - "application/vnd.ffsns": [], - "application/vnd.fints": [], - "application/vnd.flographit": [ - "gph" - ], - "application/vnd.fluxtime.clip": [ - "ftc" - ], - "application/vnd.font-fontforge-sfd": [], - "application/vnd.framemaker": [ - "fm", - "frame", - "maker", - "book" - ], - "application/vnd.frogans.fnc": [ - "fnc" - ], - "application/vnd.frogans.ltf": [ - "ltf" - ], - "application/vnd.fsc.weblaunch": [ - "fsc" - ], - "application/vnd.fujitsu.oasys": [ - "oas" - ], - "application/vnd.fujitsu.oasys2": [ - "oa2" - ], - "application/vnd.fujitsu.oasys3": [ - "oa3" - ], - "application/vnd.fujitsu.oasysgp": [ - "fg5" - ], - "application/vnd.fujitsu.oasysprs": [ - "bh2" - ], - "application/vnd.fujixerox.art-ex": [], - "application/vnd.fujixerox.art4": [], - "application/vnd.fujixerox.hbpl": [], - "application/vnd.fujixerox.ddd": [ - "ddd" - ], - "application/vnd.fujixerox.docuworks": [ - "xdw" - ], - "application/vnd.fujixerox.docuworks.binder": [ - "xbd" - ], - "application/vnd.fut-misnet": [], - "application/vnd.fuzzysheet": [ - "fzs" - ], - "application/vnd.genomatix.tuxedo": [ - "txd" - ], - "application/vnd.geocube+xml": [], - "application/vnd.geogebra.file": [ - "ggb" - ], - "application/vnd.geogebra.tool": [ - "ggt" - ], - "application/vnd.geometry-explorer": [ - "gex", - "gre" - ], - "application/vnd.geonext": [ - "gxt" - ], - "application/vnd.geoplan": [ - "g2w" - ], - "application/vnd.geospace": [ - "g3w" - ], - "application/vnd.globalplatform.card-content-mgt": [], - "application/vnd.globalplatform.card-content-mgt-response": [], - "application/vnd.gmx": [ - "gmx" - ], - "application/vnd.google-earth.kml+xml": [ - "kml" - ], - "application/vnd.google-earth.kmz": [ - "kmz" - ], - "application/vnd.grafeq": [ - "gqf", - "gqs" - ], - "application/vnd.gridmp": [], - "application/vnd.groove-account": [ - "gac" - ], - "application/vnd.groove-help": [ - "ghf" - ], - "application/vnd.groove-identity-message": [ - "gim" - ], - "application/vnd.groove-injector": [ - "grv" - ], - "application/vnd.groove-tool-message": [ - "gtm" - ], - "application/vnd.groove-tool-template": [ - "tpl" - ], - "application/vnd.groove-vcard": [ - "vcg" - ], - "application/vnd.hal+json": [], - "application/vnd.hal+xml": [ - "hal" - ], - "application/vnd.handheld-entertainment+xml": [ - "zmm" - ], - "application/vnd.hbci": [ - "hbci" - ], - "application/vnd.hcl-bireports": [], - "application/vnd.hhe.lesson-player": [ - "les" - ], - "application/vnd.hp-hpgl": [ - "hpgl" - ], - "application/vnd.hp-hpid": [ - "hpid" - ], - "application/vnd.hp-hps": [ - "hps" - ], - "application/vnd.hp-jlyt": [ - "jlt" - ], - "application/vnd.hp-pcl": [ - "pcl" - ], - "application/vnd.hp-pclxl": [ - "pclxl" - ], - "application/vnd.httphone": [], - "application/vnd.hzn-3d-crossword": [], - "application/vnd.ibm.afplinedata": [], - "application/vnd.ibm.electronic-media": [], - "application/vnd.ibm.minipay": [ - "mpy" - ], - "application/vnd.ibm.modcap": [ - "afp", - "listafp", - "list3820" - ], - "application/vnd.ibm.rights-management": [ - "irm" - ], - "application/vnd.ibm.secure-container": [ - "sc" - ], - "application/vnd.iccprofile": [ - "icc", - "icm" - ], - "application/vnd.igloader": [ - "igl" - ], - "application/vnd.immervision-ivp": [ - "ivp" - ], - "application/vnd.immervision-ivu": [ - "ivu" - ], - "application/vnd.informedcontrol.rms+xml": [], - "application/vnd.informix-visionary": [], - "application/vnd.infotech.project": [], - "application/vnd.infotech.project+xml": [], - "application/vnd.innopath.wamp.notification": [], - "application/vnd.insors.igm": [ - "igm" - ], - "application/vnd.intercon.formnet": [ - "xpw", - "xpx" - ], - "application/vnd.intergeo": [ - "i2g" - ], - "application/vnd.intertrust.digibox": [], - "application/vnd.intertrust.nncp": [], - "application/vnd.intu.qbo": [ - "qbo" - ], - "application/vnd.intu.qfx": [ - "qfx" - ], - "application/vnd.iptc.g2.conceptitem+xml": [], - "application/vnd.iptc.g2.knowledgeitem+xml": [], - "application/vnd.iptc.g2.newsitem+xml": [], - "application/vnd.iptc.g2.newsmessage+xml": [], - "application/vnd.iptc.g2.packageitem+xml": [], - "application/vnd.iptc.g2.planningitem+xml": [], - "application/vnd.ipunplugged.rcprofile": [ - "rcprofile" - ], - "application/vnd.irepository.package+xml": [ - "irp" - ], - "application/vnd.is-xpr": [ - "xpr" - ], - "application/vnd.isac.fcs": [ - "fcs" - ], - "application/vnd.jam": [ - "jam" - ], - "application/vnd.japannet-directory-service": [], - "application/vnd.japannet-jpnstore-wakeup": [], - "application/vnd.japannet-payment-wakeup": [], - "application/vnd.japannet-registration": [], - "application/vnd.japannet-registration-wakeup": [], - "application/vnd.japannet-setstore-wakeup": [], - "application/vnd.japannet-verification": [], - "application/vnd.japannet-verification-wakeup": [], - "application/vnd.jcp.javame.midlet-rms": [ - "rms" - ], - "application/vnd.jisp": [ - "jisp" - ], - "application/vnd.joost.joda-archive": [ - "joda" - ], - "application/vnd.kahootz": [ - "ktz", - "ktr" - ], - "application/vnd.kde.karbon": [ - "karbon" - ], - "application/vnd.kde.kchart": [ - "chrt" - ], - "application/vnd.kde.kformula": [ - "kfo" - ], - "application/vnd.kde.kivio": [ - "flw" - ], - "application/vnd.kde.kontour": [ - "kon" - ], - "application/vnd.kde.kpresenter": [ - "kpr", - "kpt" - ], - "application/vnd.kde.kspread": [ - "ksp" - ], - "application/vnd.kde.kword": [ - "kwd", - "kwt" - ], - "application/vnd.kenameaapp": [ - "htke" - ], - "application/vnd.kidspiration": [ - "kia" - ], - "application/vnd.kinar": [ - "kne", - "knp" - ], - "application/vnd.koan": [ - "skp", - "skd", - "skt", - "skm" - ], - "application/vnd.kodak-descriptor": [ - "sse" - ], - "application/vnd.las.las+xml": [ - "lasxml" - ], - "application/vnd.liberty-request+xml": [], - "application/vnd.llamagraphics.life-balance.desktop": [ - "lbd" - ], - "application/vnd.llamagraphics.life-balance.exchange+xml": [ - "lbe" - ], - "application/vnd.lotus-1-2-3": [ - "123" - ], - "application/vnd.lotus-approach": [ - "apr" - ], - "application/vnd.lotus-freelance": [ - "pre" - ], - "application/vnd.lotus-notes": [ - "nsf" - ], - "application/vnd.lotus-organizer": [ - "org" - ], - "application/vnd.lotus-screencam": [ - "scm" - ], - "application/vnd.lotus-wordpro": [ - "lwp" - ], - "application/vnd.macports.portpkg": [ - "portpkg" - ], - "application/vnd.marlin.drm.actiontoken+xml": [], - "application/vnd.marlin.drm.conftoken+xml": [], - "application/vnd.marlin.drm.license+xml": [], - "application/vnd.marlin.drm.mdcf": [], - "application/vnd.mcd": [ - "mcd" - ], - "application/vnd.medcalcdata": [ - "mc1" - ], - "application/vnd.mediastation.cdkey": [ - "cdkey" - ], - "application/vnd.meridian-slingshot": [], - "application/vnd.mfer": [ - "mwf" - ], - "application/vnd.mfmp": [ - "mfm" - ], - "application/vnd.micrografx.flo": [ - "flo" - ], - "application/vnd.micrografx.igx": [ - "igx" - ], - "application/vnd.mif": [ - "mif" - ], - "application/vnd.minisoft-hp3000-save": [], - "application/vnd.mitsubishi.misty-guard.trustweb": [], - "application/vnd.mobius.daf": [ - "daf" - ], - "application/vnd.mobius.dis": [ - "dis" - ], - "application/vnd.mobius.mbk": [ - "mbk" - ], - "application/vnd.mobius.mqy": [ - "mqy" - ], - "application/vnd.mobius.msl": [ - "msl" - ], - "application/vnd.mobius.plc": [ - "plc" - ], - "application/vnd.mobius.txf": [ - "txf" - ], - "application/vnd.mophun.application": [ - "mpn" - ], - "application/vnd.mophun.certificate": [ - "mpc" - ], - "application/vnd.motorola.flexsuite": [], - "application/vnd.motorola.flexsuite.adsi": [], - "application/vnd.motorola.flexsuite.fis": [], - "application/vnd.motorola.flexsuite.gotap": [], - "application/vnd.motorola.flexsuite.kmr": [], - "application/vnd.motorola.flexsuite.ttc": [], - "application/vnd.motorola.flexsuite.wem": [], - "application/vnd.motorola.iprm": [], - "application/vnd.mozilla.xul+xml": [ - "xul" - ], - "application/vnd.ms-artgalry": [ - "cil" - ], - "application/vnd.ms-asf": [], - "application/vnd.ms-cab-compressed": [ - "cab" - ], - "application/vnd.ms-color.iccprofile": [], - "application/vnd.ms-excel": [ - "xls", - "xlm", - "xla", - "xlc", - "xlt", - "xlw" - ], - "application/vnd.ms-excel.addin.macroenabled.12": [ - "xlam" - ], - "application/vnd.ms-excel.sheet.binary.macroenabled.12": [ - "xlsb" - ], - "application/vnd.ms-excel.sheet.macroenabled.12": [ - "xlsm" - ], - "application/vnd.ms-excel.template.macroenabled.12": [ - "xltm" - ], - "application/vnd.ms-fontobject": [ - "eot" - ], - "application/vnd.ms-htmlhelp": [ - "chm" - ], - "application/vnd.ms-ims": [ - "ims" - ], - "application/vnd.ms-lrm": [ - "lrm" - ], - "application/vnd.ms-office.activex+xml": [], - "application/vnd.ms-officetheme": [ - "thmx" - ], - "application/vnd.ms-opentype": [], - "application/vnd.ms-package.obfuscated-opentype": [], - "application/vnd.ms-pki.seccat": [ - "cat" - ], - "application/vnd.ms-pki.stl": [ - "stl" - ], - "application/vnd.ms-playready.initiator+xml": [], - "application/vnd.ms-powerpoint": [ - "ppt", - "pps", - "pot" - ], - "application/vnd.ms-powerpoint.addin.macroenabled.12": [ - "ppam" - ], - "application/vnd.ms-powerpoint.presentation.macroenabled.12": [ - "pptm" - ], - "application/vnd.ms-powerpoint.slide.macroenabled.12": [ - "sldm" - ], - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": [ - "ppsm" - ], - "application/vnd.ms-powerpoint.template.macroenabled.12": [ - "potm" - ], - "application/vnd.ms-printing.printticket+xml": [], - "application/vnd.ms-project": [ - "mpp", - "mpt" - ], - "application/vnd.ms-tnef": [], - "application/vnd.ms-wmdrm.lic-chlg-req": [], - "application/vnd.ms-wmdrm.lic-resp": [], - "application/vnd.ms-wmdrm.meter-chlg-req": [], - "application/vnd.ms-wmdrm.meter-resp": [], - "application/vnd.ms-word.document.macroenabled.12": [ - "docm" - ], - "application/vnd.ms-word.template.macroenabled.12": [ - "dotm" - ], - "application/vnd.ms-works": [ - "wps", - "wks", - "wcm", - "wdb" - ], - "application/vnd.ms-wpl": [ - "wpl" - ], - "application/vnd.ms-xpsdocument": [ - "xps" - ], - "application/vnd.mseq": [ - "mseq" - ], - "application/vnd.msign": [], - "application/vnd.multiad.creator": [], - "application/vnd.multiad.creator.cif": [], - "application/vnd.music-niff": [], - "application/vnd.musician": [ - "mus" - ], - "application/vnd.muvee.style": [ - "msty" - ], - "application/vnd.mynfc": [ - "taglet" - ], - "application/vnd.ncd.control": [], - "application/vnd.ncd.reference": [], - "application/vnd.nervana": [], - "application/vnd.netfpx": [], - "application/vnd.neurolanguage.nlu": [ - "nlu" - ], - "application/vnd.nitf": [ - "ntf", - "nitf" - ], - "application/vnd.noblenet-directory": [ - "nnd" - ], - "application/vnd.noblenet-sealer": [ - "nns" - ], - "application/vnd.noblenet-web": [ - "nnw" - ], - "application/vnd.nokia.catalogs": [], - "application/vnd.nokia.conml+wbxml": [], - "application/vnd.nokia.conml+xml": [], - "application/vnd.nokia.isds-radio-presets": [], - "application/vnd.nokia.iptv.config+xml": [], - "application/vnd.nokia.landmark+wbxml": [], - "application/vnd.nokia.landmark+xml": [], - "application/vnd.nokia.landmarkcollection+xml": [], - "application/vnd.nokia.n-gage.ac+xml": [], - "application/vnd.nokia.n-gage.data": [ - "ngdat" - ], - "application/vnd.nokia.ncd": [], - "application/vnd.nokia.pcd+wbxml": [], - "application/vnd.nokia.pcd+xml": [], - "application/vnd.nokia.radio-preset": [ - "rpst" - ], - "application/vnd.nokia.radio-presets": [ - "rpss" - ], - "application/vnd.novadigm.edm": [ - "edm" - ], - "application/vnd.novadigm.edx": [ - "edx" - ], - "application/vnd.novadigm.ext": [ - "ext" - ], - "application/vnd.ntt-local.file-transfer": [], - "application/vnd.ntt-local.sip-ta_remote": [], - "application/vnd.ntt-local.sip-ta_tcp_stream": [], - "application/vnd.oasis.opendocument.chart": [ - "odc" - ], - "application/vnd.oasis.opendocument.chart-template": [ - "otc" - ], - "application/vnd.oasis.opendocument.database": [ - "odb" - ], - "application/vnd.oasis.opendocument.formula": [ - "odf" - ], - "application/vnd.oasis.opendocument.formula-template": [ - "odft" - ], - "application/vnd.oasis.opendocument.graphics": [ - "odg" - ], - "application/vnd.oasis.opendocument.graphics-template": [ - "otg" - ], - "application/vnd.oasis.opendocument.image": [ - "odi" - ], - "application/vnd.oasis.opendocument.image-template": [ - "oti" - ], - "application/vnd.oasis.opendocument.presentation": [ - "odp" - ], - "application/vnd.oasis.opendocument.presentation-template": [ - "otp" - ], - "application/vnd.oasis.opendocument.spreadsheet": [ - "ods" - ], - "application/vnd.oasis.opendocument.spreadsheet-template": [ - "ots" - ], - "application/vnd.oasis.opendocument.text": [ - "odt" - ], - "application/vnd.oasis.opendocument.text-master": [ - "odm" - ], - "application/vnd.oasis.opendocument.text-template": [ - "ott" - ], - "application/vnd.oasis.opendocument.text-web": [ - "oth" - ], - "application/vnd.obn": [], - "application/vnd.oftn.l10n+json": [], - "application/vnd.oipf.contentaccessdownload+xml": [], - "application/vnd.oipf.contentaccessstreaming+xml": [], - "application/vnd.oipf.cspg-hexbinary": [], - "application/vnd.oipf.dae.svg+xml": [], - "application/vnd.oipf.dae.xhtml+xml": [], - "application/vnd.oipf.mippvcontrolmessage+xml": [], - "application/vnd.oipf.pae.gem": [], - "application/vnd.oipf.spdiscovery+xml": [], - "application/vnd.oipf.spdlist+xml": [], - "application/vnd.oipf.ueprofile+xml": [], - "application/vnd.oipf.userprofile+xml": [], - "application/vnd.olpc-sugar": [ - "xo" - ], - "application/vnd.oma-scws-config": [], - "application/vnd.oma-scws-http-request": [], - "application/vnd.oma-scws-http-response": [], - "application/vnd.oma.bcast.associated-procedure-parameter+xml": [], - "application/vnd.oma.bcast.drm-trigger+xml": [], - "application/vnd.oma.bcast.imd+xml": [], - "application/vnd.oma.bcast.ltkm": [], - "application/vnd.oma.bcast.notification+xml": [], - "application/vnd.oma.bcast.provisioningtrigger": [], - "application/vnd.oma.bcast.sgboot": [], - "application/vnd.oma.bcast.sgdd+xml": [], - "application/vnd.oma.bcast.sgdu": [], - "application/vnd.oma.bcast.simple-symbol-container": [], - "application/vnd.oma.bcast.smartcard-trigger+xml": [], - "application/vnd.oma.bcast.sprov+xml": [], - "application/vnd.oma.bcast.stkm": [], - "application/vnd.oma.cab-address-book+xml": [], - "application/vnd.oma.cab-feature-handler+xml": [], - "application/vnd.oma.cab-pcc+xml": [], - "application/vnd.oma.cab-user-prefs+xml": [], - "application/vnd.oma.dcd": [], - "application/vnd.oma.dcdc": [], - "application/vnd.oma.dd2+xml": [ - "dd2" - ], - "application/vnd.oma.drm.risd+xml": [], - "application/vnd.oma.group-usage-list+xml": [], - "application/vnd.oma.pal+xml": [], - "application/vnd.oma.poc.detailed-progress-report+xml": [], - "application/vnd.oma.poc.final-report+xml": [], - "application/vnd.oma.poc.groups+xml": [], - "application/vnd.oma.poc.invocation-descriptor+xml": [], - "application/vnd.oma.poc.optimized-progress-report+xml": [], - "application/vnd.oma.push": [], - "application/vnd.oma.scidm.messages+xml": [], - "application/vnd.oma.xcap-directory+xml": [], - "application/vnd.omads-email+xml": [], - "application/vnd.omads-file+xml": [], - "application/vnd.omads-folder+xml": [], - "application/vnd.omaloc-supl-init": [], - "application/vnd.openofficeorg.extension": [ - "oxt" - ], - "application/vnd.openxmlformats-officedocument.custom-properties+xml": [], - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": [], - "application/vnd.openxmlformats-officedocument.drawing+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": [], - "application/vnd.openxmlformats-officedocument.extended-properties+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presentation": [ - "pptx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slide": [ - "sldx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [ - "ppsx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.template": [ - "potx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [ - "xlsx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [ - "xltx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": [], - "application/vnd.openxmlformats-officedocument.theme+xml": [], - "application/vnd.openxmlformats-officedocument.themeoverride+xml": [], - "application/vnd.openxmlformats-officedocument.vmldrawing": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [ - "docx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [ - "dotx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": [], - "application/vnd.openxmlformats-package.core-properties+xml": [], - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": [], - "application/vnd.openxmlformats-package.relationships+xml": [], - "application/vnd.quobject-quoxdocument": [], - "application/vnd.osa.netdeploy": [], - "application/vnd.osgeo.mapguide.package": [ - "mgp" - ], - "application/vnd.osgi.bundle": [], - "application/vnd.osgi.dp": [ - "dp" - ], - "application/vnd.osgi.subsystem": [ - "esa" - ], - "application/vnd.otps.ct-kip+xml": [], - "application/vnd.palm": [ - "pdb", - "pqa", - "oprc" - ], - "application/vnd.paos.xml": [], - "application/vnd.pawaafile": [ - "paw" - ], - "application/vnd.pg.format": [ - "str" - ], - "application/vnd.pg.osasli": [ - "ei6" - ], - "application/vnd.piaccess.application-licence": [], - "application/vnd.picsel": [ - "efif" - ], - "application/vnd.pmi.widget": [ - "wg" - ], - "application/vnd.poc.group-advertisement+xml": [], - "application/vnd.pocketlearn": [ - "plf" - ], - "application/vnd.powerbuilder6": [ - "pbd" - ], - "application/vnd.powerbuilder6-s": [], - "application/vnd.powerbuilder7": [], - "application/vnd.powerbuilder7-s": [], - "application/vnd.powerbuilder75": [], - "application/vnd.powerbuilder75-s": [], - "application/vnd.preminet": [], - "application/vnd.previewsystems.box": [ - "box" - ], - "application/vnd.proteus.magazine": [ - "mgz" - ], - "application/vnd.publishare-delta-tree": [ - "qps" - ], - "application/vnd.pvi.ptid1": [ - "ptid" - ], - "application/vnd.pwg-multiplexed": [], - "application/vnd.pwg-xhtml-print+xml": [], - "application/vnd.qualcomm.brew-app-res": [], - "application/vnd.quark.quarkxpress": [ - "qxd", - "qxt", - "qwd", - "qwt", - "qxl", - "qxb" - ], - "application/vnd.radisys.moml+xml": [], - "application/vnd.radisys.msml+xml": [], - "application/vnd.radisys.msml-audit+xml": [], - "application/vnd.radisys.msml-audit-conf+xml": [], - "application/vnd.radisys.msml-audit-conn+xml": [], - "application/vnd.radisys.msml-audit-dialog+xml": [], - "application/vnd.radisys.msml-audit-stream+xml": [], - "application/vnd.radisys.msml-conf+xml": [], - "application/vnd.radisys.msml-dialog+xml": [], - "application/vnd.radisys.msml-dialog-base+xml": [], - "application/vnd.radisys.msml-dialog-fax-detect+xml": [], - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": [], - "application/vnd.radisys.msml-dialog-group+xml": [], - "application/vnd.radisys.msml-dialog-speech+xml": [], - "application/vnd.radisys.msml-dialog-transform+xml": [], - "application/vnd.rainstor.data": [], - "application/vnd.rapid": [], - "application/vnd.realvnc.bed": [ - "bed" - ], - "application/vnd.recordare.musicxml": [ - "mxl" - ], - "application/vnd.recordare.musicxml+xml": [ - "musicxml" - ], - "application/vnd.renlearn.rlprint": [], - "application/vnd.rig.cryptonote": [ - "cryptonote" - ], - "application/vnd.rim.cod": [ - "cod" - ], - "application/vnd.rn-realmedia": [ - "rm" - ], - "application/vnd.rn-realmedia-vbr": [ - "rmvb" - ], - "application/vnd.route66.link66+xml": [ - "link66" - ], - "application/vnd.rs-274x": [], - "application/vnd.ruckus.download": [], - "application/vnd.s3sms": [], - "application/vnd.sailingtracker.track": [ - "st" - ], - "application/vnd.sbm.cid": [], - "application/vnd.sbm.mid2": [], - "application/vnd.scribus": [], - "application/vnd.sealed.3df": [], - "application/vnd.sealed.csf": [], - "application/vnd.sealed.doc": [], - "application/vnd.sealed.eml": [], - "application/vnd.sealed.mht": [], - "application/vnd.sealed.net": [], - "application/vnd.sealed.ppt": [], - "application/vnd.sealed.tiff": [], - "application/vnd.sealed.xls": [], - "application/vnd.sealedmedia.softseal.html": [], - "application/vnd.sealedmedia.softseal.pdf": [], - "application/vnd.seemail": [ - "see" - ], - "application/vnd.sema": [ - "sema" - ], - "application/vnd.semd": [ - "semd" - ], - "application/vnd.semf": [ - "semf" - ], - "application/vnd.shana.informed.formdata": [ - "ifm" - ], - "application/vnd.shana.informed.formtemplate": [ - "itp" - ], - "application/vnd.shana.informed.interchange": [ - "iif" - ], - "application/vnd.shana.informed.package": [ - "ipk" - ], - "application/vnd.simtech-mindmapper": [ - "twd", - "twds" - ], - "application/vnd.smaf": [ - "mmf" - ], - "application/vnd.smart.notebook": [], - "application/vnd.smart.teacher": [ - "teacher" - ], - "application/vnd.software602.filler.form+xml": [], - "application/vnd.software602.filler.form-xml-zip": [], - "application/vnd.solent.sdkm+xml": [ - "sdkm", - "sdkd" - ], - "application/vnd.spotfire.dxp": [ - "dxp" - ], - "application/vnd.spotfire.sfs": [ - "sfs" - ], - "application/vnd.sss-cod": [], - "application/vnd.sss-dtf": [], - "application/vnd.sss-ntf": [], - "application/vnd.stardivision.calc": [ - "sdc" - ], - "application/vnd.stardivision.draw": [ - "sda" - ], - "application/vnd.stardivision.impress": [ - "sdd" - ], - "application/vnd.stardivision.math": [ - "smf" - ], - "application/vnd.stardivision.writer": [ - "sdw", - "vor" - ], - "application/vnd.stardivision.writer-global": [ - "sgl" - ], - "application/vnd.stepmania.package": [ - "smzip" - ], - "application/vnd.stepmania.stepchart": [ - "sm" - ], - "application/vnd.street-stream": [], - "application/vnd.sun.xml.calc": [ - "sxc" - ], - "application/vnd.sun.xml.calc.template": [ - "stc" - ], - "application/vnd.sun.xml.draw": [ - "sxd" - ], - "application/vnd.sun.xml.draw.template": [ - "std" - ], - "application/vnd.sun.xml.impress": [ - "sxi" - ], - "application/vnd.sun.xml.impress.template": [ - "sti" - ], - "application/vnd.sun.xml.math": [ - "sxm" - ], - "application/vnd.sun.xml.writer": [ - "sxw" - ], - "application/vnd.sun.xml.writer.global": [ - "sxg" - ], - "application/vnd.sun.xml.writer.template": [ - "stw" - ], - "application/vnd.sun.wadl+xml": [], - "application/vnd.sus-calendar": [ - "sus", - "susp" - ], - "application/vnd.svd": [ - "svd" - ], - "application/vnd.swiftview-ics": [], - "application/vnd.symbian.install": [ - "sis", - "sisx" - ], - "application/vnd.syncml+xml": [ - "xsm" - ], - "application/vnd.syncml.dm+wbxml": [ - "bdm" - ], - "application/vnd.syncml.dm+xml": [ - "xdm" - ], - "application/vnd.syncml.dm.notification": [], - "application/vnd.syncml.ds.notification": [], - "application/vnd.tao.intent-module-archive": [ - "tao" - ], - "application/vnd.tcpdump.pcap": [ - "pcap", - "cap", - "dmp" - ], - "application/vnd.tmobile-livetv": [ - "tmo" - ], - "application/vnd.trid.tpt": [ - "tpt" - ], - "application/vnd.triscape.mxs": [ - "mxs" - ], - "application/vnd.trueapp": [ - "tra" - ], - "application/vnd.truedoc": [], - "application/vnd.ubisoft.webplayer": [], - "application/vnd.ufdl": [ - "ufd", - "ufdl" - ], - "application/vnd.uiq.theme": [ - "utz" - ], - "application/vnd.umajin": [ - "umj" - ], - "application/vnd.unity": [ - "unityweb" - ], - "application/vnd.uoml+xml": [ - "uoml" - ], - "application/vnd.uplanet.alert": [], - "application/vnd.uplanet.alert-wbxml": [], - "application/vnd.uplanet.bearer-choice": [], - "application/vnd.uplanet.bearer-choice-wbxml": [], - "application/vnd.uplanet.cacheop": [], - "application/vnd.uplanet.cacheop-wbxml": [], - "application/vnd.uplanet.channel": [], - "application/vnd.uplanet.channel-wbxml": [], - "application/vnd.uplanet.list": [], - "application/vnd.uplanet.list-wbxml": [], - "application/vnd.uplanet.listcmd": [], - "application/vnd.uplanet.listcmd-wbxml": [], - "application/vnd.uplanet.signal": [], - "application/vnd.vcx": [ - "vcx" - ], - "application/vnd.vd-study": [], - "application/vnd.vectorworks": [], - "application/vnd.verimatrix.vcas": [], - "application/vnd.vidsoft.vidconference": [], - "application/vnd.visio": [ - "vsd", - "vst", - "vss", - "vsw" - ], - "application/vnd.visionary": [ - "vis" - ], - "application/vnd.vividence.scriptfile": [], - "application/vnd.vsf": [ - "vsf" - ], - "application/vnd.wap.sic": [], - "application/vnd.wap.slc": [], - "application/vnd.wap.wbxml": [ - "wbxml" - ], - "application/vnd.wap.wmlc": [ - "wmlc" - ], - "application/vnd.wap.wmlscriptc": [ - "wmlsc" - ], - "application/vnd.webturbo": [ - "wtb" - ], - "application/vnd.wfa.wsc": [], - "application/vnd.wmc": [], - "application/vnd.wmf.bootstrap": [], - "application/vnd.wolfram.mathematica": [], - "application/vnd.wolfram.mathematica.package": [], - "application/vnd.wolfram.player": [ - "nbp" - ], - "application/vnd.wordperfect": [ - "wpd" - ], - "application/vnd.wqd": [ - "wqd" - ], - "application/vnd.wrq-hp3000-labelled": [], - "application/vnd.wt.stf": [ - "stf" - ], - "application/vnd.wv.csp+wbxml": [], - "application/vnd.wv.csp+xml": [], - "application/vnd.wv.ssp+xml": [], - "application/vnd.xara": [ - "xar" - ], - "application/vnd.xfdl": [ - "xfdl" - ], - "application/vnd.xfdl.webform": [], - "application/vnd.xmi+xml": [], - "application/vnd.xmpie.cpkg": [], - "application/vnd.xmpie.dpkg": [], - "application/vnd.xmpie.plan": [], - "application/vnd.xmpie.ppkg": [], - "application/vnd.xmpie.xlim": [], - "application/vnd.yamaha.hv-dic": [ - "hvd" - ], - "application/vnd.yamaha.hv-script": [ - "hvs" - ], - "application/vnd.yamaha.hv-voice": [ - "hvp" - ], - "application/vnd.yamaha.openscoreformat": [ - "osf" - ], - "application/vnd.yamaha.openscoreformat.osfpvg+xml": [ - "osfpvg" - ], - "application/vnd.yamaha.remote-setup": [], - "application/vnd.yamaha.smaf-audio": [ - "saf" - ], - "application/vnd.yamaha.smaf-phrase": [ - "spf" - ], - "application/vnd.yamaha.through-ngn": [], - "application/vnd.yamaha.tunnel-udpencap": [], - "application/vnd.yellowriver-custom-menu": [ - "cmp" - ], - "application/vnd.zul": [ - "zir", - "zirz" - ], - "application/vnd.zzazz.deck+xml": [ - "zaz" - ], - "application/voicexml+xml": [ - "vxml" - ], - "application/vq-rtcpxr": [], - "application/watcherinfo+xml": [], - "application/whoispp-query": [], - "application/whoispp-response": [], - "application/widget": [ - "wgt" - ], - "application/winhlp": [ - "hlp" - ], - "application/wita": [], - "application/wordperfect5.1": [], - "application/wsdl+xml": [ - "wsdl" - ], - "application/wspolicy+xml": [ - "wspolicy" - ], - "application/x-7z-compressed": [ - "7z" - ], - "application/x-abiword": [ - "abw" - ], - "application/x-ace-compressed": [ - "ace" - ], - "application/x-amf": [], - "application/x-apple-diskimage": [ - "dmg" - ], - "application/x-authorware-bin": [ - "aab", - "x32", - "u32", - "vox" - ], - "application/x-authorware-map": [ - "aam" - ], - "application/x-authorware-seg": [ - "aas" - ], - "application/x-bcpio": [ - "bcpio" - ], - "application/x-bittorrent": [ - "torrent" - ], - "application/x-blorb": [ - "blb", - "blorb" - ], - "application/x-bzip": [ - "bz" - ], - "application/x-bzip2": [ - "bz2", - "boz" - ], - "application/x-cbr": [ - "cbr", - "cba", - "cbt", - "cbz", - "cb7" - ], - "application/x-cdlink": [ - "vcd" - ], - "application/x-cfs-compressed": [ - "cfs" - ], - "application/x-chat": [ - "chat" - ], - "application/x-chess-pgn": [ - "pgn" - ], - "application/x-conference": [ - "nsc" - ], - "application/x-compress": [], - "application/x-cpio": [ - "cpio" - ], - "application/x-csh": [ - "csh" - ], - "application/x-debian-package": [ - "deb", - "udeb" - ], - "application/x-dgc-compressed": [ - "dgc" - ], - "application/x-director": [ - "dir", - "dcr", - "dxr", - "cst", - "cct", - "cxt", - "w3d", - "fgd", - "swa" - ], - "application/x-doom": [ - "wad" - ], - "application/x-dtbncx+xml": [ - "ncx" - ], - "application/x-dtbook+xml": [ - "dtb" - ], - "application/x-dtbresource+xml": [ - "res" - ], - "application/x-dvi": [ - "dvi" - ], - "application/x-envoy": [ - "evy" - ], - "application/x-eva": [ - "eva" - ], - "application/x-font-bdf": [ - "bdf" - ], - "application/x-font-dos": [], - "application/x-font-framemaker": [], - "application/x-font-ghostscript": [ - "gsf" - ], - "application/x-font-libgrx": [], - "application/x-font-linux-psf": [ - "psf" - ], - "application/x-font-otf": [ - "otf" - ], - "application/x-font-pcf": [ - "pcf" - ], - "application/x-font-snf": [ - "snf" - ], - "application/x-font-speedo": [], - "application/x-font-sunos-news": [], - "application/x-font-ttf": [ - "ttf", - "ttc" - ], - "application/x-font-type1": [ - "pfa", - "pfb", - "pfm", - "afm" - ], - "application/font-woff": [ - "woff" - ], - "application/x-font-vfont": [], - "application/x-freearc": [ - "arc" - ], - "application/x-futuresplash": [ - "spl" - ], - "application/x-gca-compressed": [ - "gca" - ], - "application/x-glulx": [ - "ulx" - ], - "application/x-gnumeric": [ - "gnumeric" - ], - "application/x-gramps-xml": [ - "gramps" - ], - "application/x-gtar": [ - "gtar" - ], - "application/x-gzip": [], - "application/x-hdf": [ - "hdf" - ], - "application/x-install-instructions": [ - "install" - ], - "application/x-iso9660-image": [ - "iso" - ], - "application/x-java-jnlp-file": [ - "jnlp" - ], - "application/x-latex": [ - "latex" - ], - "application/x-lzh-compressed": [ - "lzh", - "lha" - ], - "application/x-mie": [ - "mie" - ], - "application/x-mobipocket-ebook": [ - "prc", - "mobi" - ], - "application/x-ms-application": [ - "application" - ], - "application/x-ms-shortcut": [ - "lnk" - ], - "application/x-ms-wmd": [ - "wmd" - ], - "application/x-ms-wmz": [ - "wmz" - ], - "application/x-ms-xbap": [ - "xbap" - ], - "application/x-msaccess": [ - "mdb" - ], - "application/x-msbinder": [ - "obd" - ], - "application/x-mscardfile": [ - "crd" - ], - "application/x-msclip": [ - "clp" - ], - "application/x-msdownload": [ - "exe", - "dll", - "com", - "bat", - "msi" - ], - "application/x-msmediaview": [ - "mvb", - "m13", - "m14" - ], - "application/x-msmetafile": [ - "wmf", - "wmz", - "emf", - "emz" - ], - "application/x-msmoney": [ - "mny" - ], - "application/x-mspublisher": [ - "pub" - ], - "application/x-msschedule": [ - "scd" - ], - "application/x-msterminal": [ - "trm" - ], - "application/x-mswrite": [ - "wri" - ], - "application/x-netcdf": [ - "nc", - "cdf" - ], - "application/x-nzb": [ - "nzb" - ], - "application/x-pkcs12": [ - "p12", - "pfx" - ], - "application/x-pkcs7-certificates": [ - "p7b", - "spc" - ], - "application/x-pkcs7-certreqresp": [ - "p7r" - ], - "application/x-rar-compressed": [ - "rar" - ], - "application/x-research-info-systems": [ - "ris" - ], - "application/x-sh": [ - "sh" - ], - "application/x-shar": [ - "shar" - ], - "application/x-shockwave-flash": [ - "swf" - ], - "application/x-silverlight-app": [ - "xap" - ], - "application/x-sql": [ - "sql" - ], - "application/x-stuffit": [ - "sit" - ], - "application/x-stuffitx": [ - "sitx" - ], - "application/x-subrip": [ - "srt" - ], - "application/x-sv4cpio": [ - "sv4cpio" - ], - "application/x-sv4crc": [ - "sv4crc" - ], - "application/x-t3vm-image": [ - "t3" - ], - "application/x-tads": [ - "gam" - ], - "application/x-tar": [ - "tar" - ], - "application/x-tcl": [ - "tcl" - ], - "application/x-tex": [ - "tex" - ], - "application/x-tex-tfm": [ - "tfm" - ], - "application/x-texinfo": [ - "texinfo", - "texi" - ], - "application/x-tgif": [ - "obj" - ], - "application/x-ustar": [ - "ustar" - ], - "application/x-wais-source": [ - "src" - ], - "application/x-x509-ca-cert": [ - "der", - "crt" - ], - "application/x-xfig": [ - "fig" - ], - "application/x-xliff+xml": [ - "xlf" - ], - "application/x-xpinstall": [ - "xpi" - ], - "application/x-xz": [ - "xz" - ], - "application/x-zmachine": [ - "z1", - "z2", - "z3", - "z4", - "z5", - "z6", - "z7", - "z8" - ], - "application/x400-bp": [], - "application/xaml+xml": [ - "xaml" - ], - "application/xcap-att+xml": [], - "application/xcap-caps+xml": [], - "application/xcap-diff+xml": [ - "xdf" - ], - "application/xcap-el+xml": [], - "application/xcap-error+xml": [], - "application/xcap-ns+xml": [], - "application/xcon-conference-info-diff+xml": [], - "application/xcon-conference-info+xml": [], - "application/xenc+xml": [ - "xenc" - ], - "application/xhtml+xml": [ - "xhtml", - "xht" - ], - "application/xhtml-voice+xml": [], - "application/xml": [ - "xml", - "xsl" - ], - "application/xml-dtd": [ - "dtd" - ], - "application/xml-external-parsed-entity": [], - "application/xmpp+xml": [], - "application/xop+xml": [ - "xop" - ], - "application/xproc+xml": [ - "xpl" - ], - "application/xslt+xml": [ - "xslt" - ], - "application/xspf+xml": [ - "xspf" - ], - "application/xv+xml": [ - "mxml", - "xhvml", - "xvml", - "xvm" - ], - "application/yang": [ - "yang" - ], - "application/yin+xml": [ - "yin" - ], - "application/zip": [ - "zip" - ], - "audio/1d-interleaved-parityfec": [], - "audio/32kadpcm": [], - "audio/3gpp": [], - "audio/3gpp2": [], - "audio/ac3": [], - "audio/adpcm": [ - "adp" - ], - "audio/amr": [], - "audio/amr-wb": [], - "audio/amr-wb+": [], - "audio/asc": [], - "audio/atrac-advanced-lossless": [], - "audio/atrac-x": [], - "audio/atrac3": [], - "audio/basic": [ - "au", - "snd" - ], - "audio/bv16": [], - "audio/bv32": [], - "audio/clearmode": [], - "audio/cn": [], - "audio/dat12": [], - "audio/dls": [], - "audio/dsr-es201108": [], - "audio/dsr-es202050": [], - "audio/dsr-es202211": [], - "audio/dsr-es202212": [], - "audio/dv": [], - "audio/dvi4": [], - "audio/eac3": [], - "audio/evrc": [], - "audio/evrc-qcp": [], - "audio/evrc0": [], - "audio/evrc1": [], - "audio/evrcb": [], - "audio/evrcb0": [], - "audio/evrcb1": [], - "audio/evrcwb": [], - "audio/evrcwb0": [], - "audio/evrcwb1": [], - "audio/example": [], - "audio/fwdred": [], - "audio/g719": [], - "audio/g722": [], - "audio/g7221": [], - "audio/g723": [], - "audio/g726-16": [], - "audio/g726-24": [], - "audio/g726-32": [], - "audio/g726-40": [], - "audio/g728": [], - "audio/g729": [], - "audio/g7291": [], - "audio/g729d": [], - "audio/g729e": [], - "audio/gsm": [], - "audio/gsm-efr": [], - "audio/gsm-hr-08": [], - "audio/ilbc": [], - "audio/ip-mr_v2.5": [], - "audio/isac": [], - "audio/l16": [], - "audio/l20": [], - "audio/l24": [], - "audio/l8": [], - "audio/lpc": [], - "audio/midi": [ - "mid", - "midi", - "kar", - "rmi" - ], - "audio/mobile-xmf": [], - "audio/mp4": [ - "mp4a" - ], - "audio/mp4a-latm": [], - "audio/mpa": [], - "audio/mpa-robust": [], - "audio/mpeg": [ - "mpga", - "mp2", - "mp2a", - "mp3", - "m2a", - "m3a" - ], - "audio/mpeg4-generic": [], - "audio/musepack": [], - "audio/ogg": [ - "oga", - "ogg", - "spx" - ], - "audio/opus": [], - "audio/parityfec": [], - "audio/pcma": [], - "audio/pcma-wb": [], - "audio/pcmu-wb": [], - "audio/pcmu": [], - "audio/prs.sid": [], - "audio/qcelp": [], - "audio/red": [], - "audio/rtp-enc-aescm128": [], - "audio/rtp-midi": [], - "audio/rtx": [], - "audio/s3m": [ - "s3m" - ], - "audio/silk": [ - "sil" - ], - "audio/smv": [], - "audio/smv0": [], - "audio/smv-qcp": [], - "audio/sp-midi": [], - "audio/speex": [], - "audio/t140c": [], - "audio/t38": [], - "audio/telephone-event": [], - "audio/tone": [], - "audio/uemclip": [], - "audio/ulpfec": [], - "audio/vdvi": [], - "audio/vmr-wb": [], - "audio/vnd.3gpp.iufp": [], - "audio/vnd.4sb": [], - "audio/vnd.audiokoz": [], - "audio/vnd.celp": [], - "audio/vnd.cisco.nse": [], - "audio/vnd.cmles.radio-events": [], - "audio/vnd.cns.anp1": [], - "audio/vnd.cns.inf1": [], - "audio/vnd.dece.audio": [ - "uva", - "uvva" - ], - "audio/vnd.digital-winds": [ - "eol" - ], - "audio/vnd.dlna.adts": [], - "audio/vnd.dolby.heaac.1": [], - "audio/vnd.dolby.heaac.2": [], - "audio/vnd.dolby.mlp": [], - "audio/vnd.dolby.mps": [], - "audio/vnd.dolby.pl2": [], - "audio/vnd.dolby.pl2x": [], - "audio/vnd.dolby.pl2z": [], - "audio/vnd.dolby.pulse.1": [], - "audio/vnd.dra": [ - "dra" - ], - "audio/vnd.dts": [ - "dts" - ], - "audio/vnd.dts.hd": [ - "dtshd" - ], - "audio/vnd.dvb.file": [], - "audio/vnd.everad.plj": [], - "audio/vnd.hns.audio": [], - "audio/vnd.lucent.voice": [ - "lvp" - ], - "audio/vnd.ms-playready.media.pya": [ - "pya" - ], - "audio/vnd.nokia.mobile-xmf": [], - "audio/vnd.nortel.vbk": [], - "audio/vnd.nuera.ecelp4800": [ - "ecelp4800" - ], - "audio/vnd.nuera.ecelp7470": [ - "ecelp7470" - ], - "audio/vnd.nuera.ecelp9600": [ - "ecelp9600" - ], - "audio/vnd.octel.sbc": [], - "audio/vnd.qcelp": [], - "audio/vnd.rhetorex.32kadpcm": [], - "audio/vnd.rip": [ - "rip" - ], - "audio/vnd.sealedmedia.softseal.mpeg": [], - "audio/vnd.vmx.cvsd": [], - "audio/vorbis": [], - "audio/vorbis-config": [], - "audio/webm": [ - "weba" - ], - "audio/x-aac": [ - "aac" - ], - "audio/x-aiff": [ - "aif", - "aiff", - "aifc" - ], - "audio/x-caf": [ - "caf" - ], - "audio/x-flac": [ - "flac" - ], - "audio/x-matroska": [ - "mka" - ], - "audio/x-mpegurl": [ - "m3u" - ], - "audio/x-ms-wax": [ - "wax" - ], - "audio/x-ms-wma": [ - "wma" - ], - "audio/x-pn-realaudio": [ - "ram", - "ra" - ], - "audio/x-pn-realaudio-plugin": [ - "rmp" - ], - "audio/x-tta": [], - "audio/x-wav": [ - "wav" - ], - "audio/xm": [ - "xm" - ], - "chemical/x-cdx": [ - "cdx" - ], - "chemical/x-cif": [ - "cif" - ], - "chemical/x-cmdf": [ - "cmdf" - ], - "chemical/x-cml": [ - "cml" - ], - "chemical/x-csml": [ - "csml" - ], - "chemical/x-pdb": [], - "chemical/x-xyz": [ - "xyz" - ], - "image/bmp": [ - "bmp" - ], - "image/cgm": [ - "cgm" - ], - "image/example": [], - "image/fits": [], - "image/g3fax": [ - "g3" - ], - "image/gif": [ - "gif" - ], - "image/ief": [ - "ief" - ], - "image/jp2": [], - "image/jpeg": [ - "jpeg", - "jpg", - "jpe" - ], - "image/jpm": [], - "image/jpx": [], - "image/ktx": [ - "ktx" - ], - "image/naplps": [], - "image/png": [ - "png" - ], - "image/prs.btif": [ - "btif" - ], - "image/prs.pti": [], - "image/sgi": [ - "sgi" - ], - "image/svg+xml": [ - "svg", - "svgz" - ], - "image/t38": [], - "image/tiff": [ - "tiff", - "tif" - ], - "image/tiff-fx": [], - "image/vnd.adobe.photoshop": [ - "psd" - ], - "image/vnd.cns.inf2": [], - "image/vnd.dece.graphic": [ - "uvi", - "uvvi", - "uvg", - "uvvg" - ], - "image/vnd.dvb.subtitle": [ - "sub" - ], - "image/vnd.djvu": [ - "djvu", - "djv" - ], - "image/vnd.dwg": [ - "dwg" - ], - "image/vnd.dxf": [ - "dxf" - ], - "image/vnd.fastbidsheet": [ - "fbs" - ], - "image/vnd.fpx": [ - "fpx" - ], - "image/vnd.fst": [ - "fst" - ], - "image/vnd.fujixerox.edmics-mmr": [ - "mmr" - ], - "image/vnd.fujixerox.edmics-rlc": [ - "rlc" - ], - "image/vnd.globalgraphics.pgb": [], - "image/vnd.microsoft.icon": [], - "image/vnd.mix": [], - "image/vnd.ms-modi": [ - "mdi" - ], - "image/vnd.ms-photo": [ - "wdp" - ], - "image/vnd.net-fpx": [ - "npx" - ], - "image/vnd.radiance": [], - "image/vnd.sealed.png": [], - "image/vnd.sealedmedia.softseal.gif": [], - "image/vnd.sealedmedia.softseal.jpg": [], - "image/vnd.svf": [], - "image/vnd.wap.wbmp": [ - "wbmp" - ], - "image/vnd.xiff": [ - "xif" - ], - "image/webp": [ - "webp" - ], - "image/x-3ds": [ - "3ds" - ], - "image/x-cmu-raster": [ - "ras" - ], - "image/x-cmx": [ - "cmx" - ], - "image/x-freehand": [ - "fh", - "fhc", - "fh4", - "fh5", - "fh7" - ], - "image/x-icon": [ - "ico" - ], - "image/x-mrsid-image": [ - "sid" - ], - "image/x-pcx": [ - "pcx" - ], - "image/x-pict": [ - "pic", - "pct" - ], - "image/x-portable-anymap": [ - "pnm" - ], - "image/x-portable-bitmap": [ - "pbm" - ], - "image/x-portable-graymap": [ - "pgm" - ], - "image/x-portable-pixmap": [ - "ppm" - ], - "image/x-rgb": [ - "rgb" - ], - "image/x-tga": [ - "tga" - ], - "image/x-xbitmap": [ - "xbm" - ], - "image/x-xpixmap": [ - "xpm" - ], - "image/x-xwindowdump": [ - "xwd" - ], - "message/cpim": [], - "message/delivery-status": [], - "message/disposition-notification": [], - "message/example": [], - "message/external-body": [], - "message/feedback-report": [], - "message/global": [], - "message/global-delivery-status": [], - "message/global-disposition-notification": [], - "message/global-headers": [], - "message/http": [], - "message/imdn+xml": [], - "message/news": [], - "message/partial": [], - "message/rfc822": [ - "eml", - "mime" - ], - "message/s-http": [], - "message/sip": [], - "message/sipfrag": [], - "message/tracking-status": [], - "message/vnd.si.simp": [], - "model/example": [], - "model/iges": [ - "igs", - "iges" - ], - "model/mesh": [ - "msh", - "mesh", - "silo" - ], - "model/vnd.collada+xml": [ - "dae" - ], - "model/vnd.dwf": [ - "dwf" - ], - "model/vnd.flatland.3dml": [], - "model/vnd.gdl": [ - "gdl" - ], - "model/vnd.gs-gdl": [], - "model/vnd.gs.gdl": [], - "model/vnd.gtw": [ - "gtw" - ], - "model/vnd.moml+xml": [], - "model/vnd.mts": [ - "mts" - ], - "model/vnd.parasolid.transmit.binary": [], - "model/vnd.parasolid.transmit.text": [], - "model/vnd.vtu": [ - "vtu" - ], - "model/vrml": [ - "wrl", - "vrml" - ], - "model/x3d+binary": [ - "x3db", - "x3dbz" - ], - "model/x3d+vrml": [ - "x3dv", - "x3dvz" - ], - "model/x3d+xml": [ - "x3d", - "x3dz" - ], - "multipart/alternative": [], - "multipart/appledouble": [], - "multipart/byteranges": [], - "multipart/digest": [], - "multipart/encrypted": [], - "multipart/example": [], - "multipart/form-data": [], - "multipart/header-set": [], - "multipart/mixed": [], - "multipart/parallel": [], - "multipart/related": [], - "multipart/report": [], - "multipart/signed": [], - "multipart/voice-message": [], - "text/1d-interleaved-parityfec": [], - "text/cache-manifest": [ - "appcache" - ], - "text/calendar": [ - "ics", - "ifb" - ], - "text/css": [ - "css" - ], - "text/csv": [ - "csv" - ], - "text/directory": [], - "text/dns": [], - "text/ecmascript": [], - "text/enriched": [], - "text/example": [], - "text/fwdred": [], - "text/html": [ - "html", - "htm" - ], - "text/javascript": [], - "text/n3": [ - "n3" - ], - "text/parityfec": [], - "text/plain": [ - "txt", - "text", - "conf", - "def", - "list", - "log", - "in" - ], - "text/prs.fallenstein.rst": [], - "text/prs.lines.tag": [ - "dsc" - ], - "text/vnd.radisys.msml-basic-layout": [], - "text/red": [], - "text/rfc822-headers": [], - "text/richtext": [ - "rtx" - ], - "text/rtf": [], - "text/rtp-enc-aescm128": [], - "text/rtx": [], - "text/sgml": [ - "sgml", - "sgm" - ], - "text/t140": [], - "text/tab-separated-values": [ - "tsv" - ], - "text/troff": [ - "t", - "tr", - "roff", - "man", - "me", - "ms" - ], - "text/turtle": [ - "ttl" - ], - "text/ulpfec": [], - "text/uri-list": [ - "uri", - "uris", - "urls" - ], - "text/vcard": [ - "vcard" - ], - "text/vnd.abc": [], - "text/vnd.curl": [ - "curl" - ], - "text/vnd.curl.dcurl": [ - "dcurl" - ], - "text/vnd.curl.scurl": [ - "scurl" - ], - "text/vnd.curl.mcurl": [ - "mcurl" - ], - "text/vnd.dmclientscript": [], - "text/vnd.dvb.subtitle": [ - "sub" - ], - "text/vnd.esmertec.theme-descriptor": [], - "text/vnd.fly": [ - "fly" - ], - "text/vnd.fmi.flexstor": [ - "flx" - ], - "text/vnd.graphviz": [ - "gv" - ], - "text/vnd.in3d.3dml": [ - "3dml" - ], - "text/vnd.in3d.spot": [ - "spot" - ], - "text/vnd.iptc.newsml": [], - "text/vnd.iptc.nitf": [], - "text/vnd.latex-z": [], - "text/vnd.motorola.reflex": [], - "text/vnd.ms-mediapackage": [], - "text/vnd.net2phone.commcenter.command": [], - "text/vnd.si.uricatalogue": [], - "text/vnd.sun.j2me.app-descriptor": [ - "jad" - ], - "text/vnd.trolltech.linguist": [], - "text/vnd.wap.si": [], - "text/vnd.wap.sl": [], - "text/vnd.wap.wml": [ - "wml" - ], - "text/vnd.wap.wmlscript": [ - "wmls" - ], - "text/x-asm": [ - "s", - "asm" - ], - "text/x-c": [ - "c", - "cc", - "cxx", - "cpp", - "h", - "hh", - "dic" - ], - "text/x-fortran": [ - "f", - "for", - "f77", - "f90" - ], - "text/x-java-source": [ - "java" - ], - "text/x-opml": [ - "opml" - ], - "text/x-pascal": [ - "p", - "pas" - ], - "text/x-nfo": [ - "nfo" - ], - "text/x-setext": [ - "etx" - ], - "text/x-sfv": [ - "sfv" - ], - "text/x-uuencode": [ - "uu" - ], - "text/x-vcalendar": [ - "vcs" - ], - "text/x-vcard": [ - "vcf" - ], - "text/xml": [], - "text/xml-external-parsed-entity": [], - "video/1d-interleaved-parityfec": [], - "video/3gpp": [ - "3gp" - ], - "video/3gpp-tt": [], - "video/3gpp2": [ - "3g2" - ], - "video/bmpeg": [], - "video/bt656": [], - "video/celb": [], - "video/dv": [], - "video/example": [], - "video/h261": [ - "h261" - ], - "video/h263": [ - "h263" - ], - "video/h263-1998": [], - "video/h263-2000": [], - "video/h264": [ - "h264" - ], - "video/h264-rcdo": [], - "video/h264-svc": [], - "video/jpeg": [ - "jpgv" - ], - "video/jpeg2000": [], - "video/jpm": [ - "jpm", - "jpgm" - ], - "video/mj2": [ - "mj2", - "mjp2" - ], - "video/mp1s": [], - "video/mp2p": [], - "video/mp2t": [], - "video/mp4": [ - "mp4", - "mp4v", - "mpg4" - ], - "video/mp4v-es": [], - "video/mpeg": [ - "mpeg", - "mpg", - "mpe", - "m1v", - "m2v" - ], - "video/mpeg4-generic": [], - "video/mpv": [], - "video/nv": [], - "video/ogg": [ - "ogv" - ], - "video/parityfec": [], - "video/pointer": [], - "video/quicktime": [ - "qt", - "mov" - ], - "video/raw": [], - "video/rtp-enc-aescm128": [], - "video/rtx": [], - "video/smpte292m": [], - "video/ulpfec": [], - "video/vc1": [], - "video/vnd.cctv": [], - "video/vnd.dece.hd": [ - "uvh", - "uvvh" - ], - "video/vnd.dece.mobile": [ - "uvm", - "uvvm" - ], - "video/vnd.dece.mp4": [], - "video/vnd.dece.pd": [ - "uvp", - "uvvp" - ], - "video/vnd.dece.sd": [ - "uvs", - "uvvs" - ], - "video/vnd.dece.video": [ - "uvv", - "uvvv" - ], - "video/vnd.directv.mpeg": [], - "video/vnd.directv.mpeg-tts": [], - "video/vnd.dlna.mpeg-tts": [], - "video/vnd.dvb.file": [ - "dvb" - ], - "video/vnd.fvt": [ - "fvt" - ], - "video/vnd.hns.video": [], - "video/vnd.iptvforum.1dparityfec-1010": [], - "video/vnd.iptvforum.1dparityfec-2005": [], - "video/vnd.iptvforum.2dparityfec-1010": [], - "video/vnd.iptvforum.2dparityfec-2005": [], - "video/vnd.iptvforum.ttsavc": [], - "video/vnd.iptvforum.ttsmpeg2": [], - "video/vnd.motorola.video": [], - "video/vnd.motorola.videop": [], - "video/vnd.mpegurl": [ - "mxu", - "m4u" - ], - "video/vnd.ms-playready.media.pyv": [ - "pyv" - ], - "video/vnd.nokia.interleaved-multimedia": [], - "video/vnd.nokia.videovoip": [], - "video/vnd.objectvideo": [], - "video/vnd.sealed.mpeg1": [], - "video/vnd.sealed.mpeg4": [], - "video/vnd.sealed.swf": [], - "video/vnd.sealedmedia.softseal.mov": [], - "video/vnd.uvvu.mp4": [ - "uvu", - "uvvu" - ], - "video/vnd.vivo": [ - "viv" - ], - "video/webm": [ - "webm" - ], - "video/x-f4v": [ - "f4v" - ], - "video/x-fli": [ - "fli" - ], - "video/x-flv": [ - "flv" - ], - "video/x-m4v": [ - "m4v" - ], - "video/x-matroska": [ - "mkv", - "mk3d", - "mks" - ], - "video/x-mng": [ - "mng" - ], - "video/x-ms-asf": [ - "asf", - "asx" - ], - "video/x-ms-vob": [ - "vob" - ], - "video/x-ms-wm": [ - "wm" - ], - "video/x-ms-wmv": [ - "wmv" - ], - "video/x-ms-wmx": [ - "wmx" - ], - "video/x-ms-wvx": [ - "wvx" - ], - "video/x-msvideo": [ - "avi" - ], - "video/x-sgi-movie": [ - "movie" - ], - "video/x-smv": [ - "smv" - ], - "x-conference/x-cooltalk": [ - "ice" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json deleted file mode 100644 index ad50d61..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "text/vtt": [ - "vtt" - ], - "application/x-chrome-extension": [ - "crx" - ], - "text/x-component": [ - "htc" - ], - "text/cache-manifest": [ - "manifest" - ], - "application/octet-stream": [ - "buffer" - ], - "application/mp4": [ - "m4p" - ], - "audio/mp4": [ - "m4a" - ], - "video/MP2T": [ - "ts" - ], - "application/x-web-app-manifest+json": [ - "webapp" - ], - "text/x-lua": [ - "lua" - ], - "application/x-lua-bytecode": [ - "luac" - ], - "text/x-markdown": [ - "markdown", - "md", - "mkd" - ], - "text/plain": [ - "ini" - ], - "application/dash+xml": [ - "mdp" - ], - "font/opentype": [ - "otf" - ], - "application/json": [ - "map" - ], - "application/xml": [ - "xsd" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json deleted file mode 100644 index bd487f6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "1.0.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": "https://searchbeam.jit.su" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/mime-types" - }, - "license": "MIT", - "main": "lib", - "devDependencies": { - "co": "3", - "cogent": "0", - "mocha": "1", - "should": "3" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "make test" - }, - "bugs": { - "url": "https://github.com/expressjs/mime-types/issues" - }, - "homepage": "https://github.com/expressjs/mime-types", - "_id": "mime-types@1.0.1", - "_shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "_from": "mime-types@>=1.0.1-0 <1.1.0-0", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore deleted file mode 100644 index a6a8d17..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -examples -test -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE deleted file mode 100644 index 42ca2e7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Original "Negotiator" program Copyright Federico Romero -Port to JavaScript Copyright Isaac Z. Schlueter - -All rights reserved. - -MIT 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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js deleted file mode 100644 index d231291..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js +++ /dev/null @@ -1,90 +0,0 @@ -module.exports = preferredCharsets; -preferredCharsets.preferredCharsets = preferredCharsets; - -function parseAcceptCharset(accept) { - return accept.split(',').map(function(e) { - return parseCharset(e.trim()); - }).filter(function(e) { - return e; - }); -} - -function parseCharset(s) { - var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); - if (!match) return null; - - var charset = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - charset: charset, - q: q - }; -} - -function getCharsetPriority(charset, accepted) { - return (accepted.map(function(a) { - return specify(charset, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q:0}); -} - -function specify(charset, spec) { - var s = 0; - if(spec.charset === charset){ - s |= 1; - } else if (spec.charset !== '*' ) { - return null - } - - return { - s: s, - q: spec.q, - } -} - -function preferredCharsets(accept, provided) { - // RFC 2616 sec 14.2: no header = * - accept = parseAcceptCharset(accept === undefined ? '*' : accept || ''); - if (provided) { - return provided.map(function(type) { - return [type, getCharsetPriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type) { - return type.q > 0; - }).map(function(type) { - return type.charset; - }); - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js deleted file mode 100644 index 207291d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js +++ /dev/null @@ -1,120 +0,0 @@ -module.exports = preferredEncodings; -preferredEncodings.preferredEncodings = preferredEncodings; - -function parseAcceptEncoding(accept) { - var acceptableEncodings; - - if (accept) { - acceptableEncodings = accept.split(',').map(function(e) { - return parseEncoding(e.trim()); - }); - } else { - acceptableEncodings = []; - } - - if (!acceptableEncodings.some(function(e) { - return e && specify('identity', e); - })) { - /* - * If identity doesn't explicitly appear in the accept-encoding header, - * it's added to the list of acceptable encoding with the lowest q - * - */ - var lowestQ = 1; - - for(var i = 0; i < acceptableEncodings.length; i++){ - var e = acceptableEncodings[i]; - if(e && e.q < lowestQ){ - lowestQ = e.q; - } - } - acceptableEncodings.push({ - encoding: 'identity', - q: lowestQ / 2, - }); - } - - return acceptableEncodings.filter(function(e) { - return e; - }); -} - -function parseEncoding(s) { - var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); - - if (!match) return null; - - var encoding = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';'); - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - encoding: encoding, - q: q - }; -} - -function getEncodingPriority(encoding, accepted) { - return (accepted.map(function(a) { - return specify(encoding, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q: 0}); -} - -function specify(encoding, spec) { - var s = 0; - if(spec.encoding === encoding){ - s |= 1; - } else if (spec.encoding !== '*' ) { - return null - } - - return { - s: s, - q: spec.q, - } -}; - -function preferredEncodings(accept, provided) { - accept = parseAcceptEncoding(accept || ''); - if (provided) { - return provided.map(function(type) { - return [type, getEncodingPriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type){ - return type.q > 0; - }).map(function(type) { - return type.encoding; - }); - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js deleted file mode 100644 index 63036c7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js +++ /dev/null @@ -1,103 +0,0 @@ -module.exports = preferredLanguages; -preferredLanguages.preferredLanguages = preferredLanguages; - -function parseAcceptLanguage(accept) { - return accept.split(',').map(function(e) { - return parseLanguage(e.trim()); - }).filter(function(e) { - return e; - }); -} - -function parseLanguage(s) { - var match = s.match(/^\s*(\S+?)(?:-(\S+?))?\s*(?:;(.*))?$/); - if (!match) return null; - - var prefix = match[1], - suffix = match[2], - full = prefix; - - if (suffix) full += "-" + suffix; - - var q = 1; - if (match[3]) { - var params = match[3].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].split('='); - if (p[0] === 'q') q = parseFloat(p[1]); - } - } - - return { - prefix: prefix, - suffix: suffix, - q: q, - full: full - }; -} - -function getLanguagePriority(language, accepted) { - return (accepted.map(function(a){ - return specify(language, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q: 0}); -} - -function specify(language, spec) { - var p = parseLanguage(language) - if (!p) return null; - var s = 0; - if(spec.full === p.full){ - s |= 4; - } else if (spec.prefix === p.full) { - s |= 2; - } else if (spec.full === p.prefix) { - s |= 1; - } else if (spec.full !== '*' ) { - return null - } - - return { - s: s, - q: spec.q, - } -}; - -function preferredLanguages(accept, provided) { - // RFC 2616 sec 14.4: no header = * - accept = parseAcceptLanguage(accept === undefined ? '*' : accept || ''); - if (provided) { - - var ret = provided.map(function(type) { - return [type, getLanguagePriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - return ret; - - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type) { - return type.q > 0; - }).map(function(type) { - return type.full; - }); - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js deleted file mode 100644 index f4dc1ca..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js +++ /dev/null @@ -1,125 +0,0 @@ -module.exports = preferredMediaTypes; -preferredMediaTypes.preferredMediaTypes = preferredMediaTypes; - -function parseAccept(accept) { - return accept.split(',').map(function(e) { - return parseMediaType(e.trim()); - }).filter(function(e) { - return e; - }); -}; - -function parseMediaType(s) { - var match = s.match(/\s*(\S+?)\/([^;\s]+)\s*(?:;(.*))?/); - if (!match) return null; - - var type = match[1], - subtype = match[2], - full = "" + type + "/" + subtype, - params = {}, - q = 1; - - if (match[3]) { - params = match[3].split(';').map(function(s) { - return s.trim().split('='); - }).reduce(function (set, p) { - set[p[0]] = p[1]; - return set - }, params); - - if (params.q != null) { - q = parseFloat(params.q); - delete params.q; - } - } - - return { - type: type, - subtype: subtype, - params: params, - q: q, - full: full - }; -} - -function getMediaTypePriority(type, accepted) { - return (accepted.map(function(a) { - return specify(type, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q: 0}); -} - -function specify(type, spec) { - var p = parseMediaType(type); - var s = 0; - - if (!p) { - return null; - } - - if(spec.type == p.type) { - s |= 4 - } else if(spec.type != '*') { - return null; - } - - if(spec.subtype == p.subtype) { - s |= 2 - } else if(spec.subtype != '*') { - return null; - } - - var keys = Object.keys(spec.params); - if (keys.length > 0) { - if (keys.every(function (k) { - return spec.params[k] == '*' || spec.params[k] == p.params[k]; - })) { - s |= 1 - } else { - return null - } - } - - return { - q: spec.q, - s: s, - } - -} - -function preferredMediaTypes(accept, provided) { - // RFC 2616 sec 14.2: no header = */* - accept = parseAccept(accept === undefined ? '*/*' : accept || ''); - if (provided) { - return provided.map(function(type) { - return [type, getMediaTypePriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type) { - return type.q > 0; - }).map(function(type) { - return type.full; - }); - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js deleted file mode 100644 index ba0c48b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js +++ /dev/null @@ -1,37 +0,0 @@ -module.exports = Negotiator; -Negotiator.Negotiator = Negotiator; - -function Negotiator(request) { - if (!(this instanceof Negotiator)) return new Negotiator(request); - this.request = request; -} - -var set = { charset: 'accept-charset', - encoding: 'accept-encoding', - language: 'accept-language', - mediaType: 'accept' }; - - -function capitalize(string){ - return string.charAt(0).toUpperCase() + string.slice(1); -} - -Object.keys(set).forEach(function (k) { - var header = set[k], - method = require('./'+k+'.js'), - singular = k, - plural = k + 's'; - - Negotiator.prototype[plural] = function (available) { - return method(this.request.headers[header], available); - }; - - Negotiator.prototype[singular] = function(available) { - var set = this[plural](available); - if (set) return set[0]; - }; - - // Keep preferred* methods for legacy compatibility - Negotiator.prototype['preferred'+capitalize(plural)] = Negotiator.prototype[plural]; - Negotiator.prototype['preferred'+capitalize(singular)] = Negotiator.prototype[singular]; -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json deleted file mode 100644 index 0572f18..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "negotiator", - "description": "HTTP content negotiation", - "version": "0.4.7", - "author": { - "name": "Federico Romero", - "email": "federico.romero@outboxlabs.com" - }, - "contributors": [ - { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/federomero/negotiator.git" - }, - "keywords": [ - "http", - "content negotiation", - "accept", - "accept-language", - "accept-encoding", - "accept-charset" - ], - "engine": "node >= 0.6", - "license": "MIT", - "devDependencies": { - "nodeunit": "0.8.x" - }, - "scripts": { - "test": "nodeunit test" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "main": "lib/negotiator.js", - "bugs": { - "url": "https://github.com/federomero/negotiator/issues" - }, - "homepage": "https://github.com/federomero/negotiator", - "dependencies": {}, - "_id": "negotiator@0.4.7", - "dist": { - "shasum": "a4160f7177ec806738631d0d3052325da42abdc8", - "tarball": "http://registry.npmjs.org/negotiator/-/negotiator-0.4.7.tgz" - }, - "_from": "negotiator@0.4.7", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "federomero", - "email": "federomero@gmail.com" - }, - "maintainers": [ - { - "name": "federomero", - "email": "federomero@gmail.com" - } - ], - "directories": {}, - "_shasum": "a4160f7177ec806738631d0d3052325da42abdc8", - "_resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.7.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md deleted file mode 100644 index d982a9c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md +++ /dev/null @@ -1,132 +0,0 @@ -# Negotiator [![Build Status](https://travis-ci.org/federomero/negotiator.png)](https://travis-ci.org/federomero/negotiator) - -An HTTP content negotiator for node.js written in javascript. - -# Accept Negotiation - - Negotiator = require('negotiator') - - availableMediaTypes = ['text/html', 'text/plain', 'application/json'] - - // The negotiator constructor receives a request object - negotiator = new Negotiator(request) - - // Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8' - - negotiator.mediaTypes() - // -> ['text/html', 'image/jpeg', 'application/*'] - - negotiator.mediaTypes(availableMediaTypes) - // -> ['text/html', 'application/json'] - - negotiator.mediaType(availableMediaTypes) - // -> 'text/html' - -You can check a working example at `examples/accept.js`. - -## Methods - -`mediaTypes(availableMediaTypes)`: - -Returns an array of preferred media types ordered by priority from a list of available media types. - -`mediaType(availableMediaType)`: - -Returns the top preferred media type from a list of available media types. - -# Accept-Language Negotiation - - Negotiator = require('negotiator') - - negotiator = new Negotiator(request) - - availableLanguages = 'en', 'es', 'fr' - - // Let's say Accept-Language header is 'en;q=0.8, es, pt' - - negotiator.languages() - // -> ['es', 'pt', 'en'] - - negotiator.languages(availableLanguages) - // -> ['es', 'en'] - - language = negotiator.language(availableLanguages) - // -> 'es' - -You can check a working example at `examples/language.js`. - -## Methods - -`languages(availableLanguages)`: - -Returns an array of preferred languages ordered by priority from a list of available languages. - -`language(availableLanguages)`: - -Returns the top preferred language from a list of available languages. - -# Accept-Charset Negotiation - - Negotiator = require('negotiator') - - availableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5'] - - negotiator = new Negotiator(request) - - // Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2' - - negotiator.charsets() - // -> ['utf-8', 'iso-8859-1', 'utf-7'] - - negotiator.charsets(availableCharsets) - // -> ['utf-8', 'iso-8859-1'] - - negotiator.charset(availableCharsets) - // -> 'utf-8' - -You can check a working example at `examples/charset.js`. - -## Methods - -`charsets(availableCharsets)`: - -Returns an array of preferred charsets ordered by priority from a list of available charsets. - -`charset(availableCharsets)`: - -Returns the top preferred charset from a list of available charsets. - -# Accept-Encoding Negotiation - - Negotiator = require('negotiator').Negotiator - - availableEncodings = ['identity', 'gzip'] - - negotiator = new Negotiator(request) - - // Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5' - - negotiator.encodings() - // -> ['gzip', 'identity', 'compress'] - - negotiator.encodings(availableEncodings) - // -> ['gzip', 'identity'] - - negotiator.encoding(availableEncodings) - // -> 'gzip' - -You can check a working example at `examples/encoding.js`. - -## Methods - -`encodings(availableEncodings)`: - -Returns an array of preferred encodings ordered by priority from a list of available encodings. - -`encoding(availableEncodings)`: - -Returns the top preferred encoding from a list of available encodings. - -# License - -MIT diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/package.json deleted file mode 100644 index 0d8c5bb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "accepts", - "description": "Higher-level content negotiation", - "version": "1.0.7", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/accepts" - }, - "dependencies": { - "mime-types": "~1.0.0", - "negotiator": "0.4.7" - }, - "devDependencies": { - "istanbul": "0.2.11", - "mocha": "*", - "should": "*" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --require should --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require should --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require should --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/accepts/issues" - }, - "homepage": "https://github.com/expressjs/accepts", - "_id": "accepts@1.0.7", - "dist": { - "shasum": "5b501fb4f0704309964ccdb048172541208dab1a", - "tarball": "http://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz" - }, - "_from": "accepts@>=1.0.7-0 <1.1.0-0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "federomero", - "email": "federomero@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "5b501fb4f0704309964ccdb048172541208dab1a", - "_resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.npmignore deleted file mode 100644 index b512c09..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.travis.yml deleted file mode 100644 index 7a902e8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 -notifications: - email: - recipients: - - brianloveswords@gmail.com \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/LICENSE deleted file mode 100644 index caeb849..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/LICENSE +++ /dev/null @@ -1,17 +0,0 @@ -Copyright (c) 2013 Brian J. Brennan - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/README.md deleted file mode 100644 index 0d9d8b8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# buffer-crc32 - -[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32) - -crc32 that works with binary data and fancy character sets, outputs -buffer, signed or unsigned data and has tests. - -Derived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix - -# install -``` -npm install buffer-crc32 -``` - -# example -```js -var crc32 = require('buffer-crc32'); -// works with buffers -var buf = Buffer([0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) -crc32(buf) // -> - -// has convenience methods for getting signed or unsigned ints -crc32.signed(buf) // -> -1805997238 -crc32.unsigned(buf) // -> 2488970058 - -// will cast to buffer if given a string, so you can -// directly use foreign characters safely -crc32('自動販売機') // -> - -// and works in append mode too -var partialCrc = crc32('hey'); -var partialCrc = crc32(' ', partialCrc); -var partialCrc = crc32('sup', partialCrc); -var partialCrc = crc32(' ', partialCrc); -var finalCrc = crc32('bros', partialCrc); // -> -``` - -# tests -This was tested against the output of zlib's crc32 method. You can run -the tests with`npm test` (requires tap) - -# see also -https://github.com/alexgorbatchev/node-crc, `crc.buffer.crc32` also -supports buffer inputs and return unsigned ints (thanks @tjholowaychuk). - -# license -MIT/X11 diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/index.js deleted file mode 100644 index 8694c63..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/index.js +++ /dev/null @@ -1,91 +0,0 @@ -var Buffer = require('buffer').Buffer; - -var CRC_TABLE = [ - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, - 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, - 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, - 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, - 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, - 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, - 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, - 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, - 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, - 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, - 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, - 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, - 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, - 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, - 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, - 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, - 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, - 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, - 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, - 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, - 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, - 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, - 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, - 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, - 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, - 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, - 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, - 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, - 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, - 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, - 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, - 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, - 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, - 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, - 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, - 0x2d02ef8d -]; - -if (typeof Int32Array !== 'undefined') - CRC_TABLE = new Int32Array(CRC_TABLE); - -function bufferizeInt(num) { - var tmp = Buffer(4); - tmp.writeInt32BE(num, 0); - return tmp; -} - -function _crc32(buf, previous) { - if (!Buffer.isBuffer(buf)) { - buf = Buffer(buf); - } - if (Buffer.isBuffer(previous)) { - previous = previous.readUInt32BE(0); - } - var crc = ~~previous ^ -1; - for (var n = 0; n < buf.length; n++) { - crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); - } - return (crc ^ -1); -} - -function crc32() { - return bufferizeInt(_crc32.apply(null, arguments)); -} -crc32.signed = function () { - return _crc32.apply(null, arguments); -}; -crc32.unsigned = function () { - return _crc32.apply(null, arguments) >>> 0; -}; - -module.exports = crc32; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/package.json deleted file mode 100644 index e0d6377..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "author": { - "name": "Brian J. Brennan", - "email": "brianloveswords@gmail.com", - "url": "http://bjb.io" - }, - "name": "buffer-crc32", - "description": "A pure javascript CRC32 algorithm that plays nice with binary data", - "version": "0.2.3", - "contributors": [ - { - "name": "Vladimir Kuznetsov" - } - ], - "homepage": "https://github.com/brianloveswords/buffer-crc32", - "repository": { - "type": "git", - "url": "git://github.com/brianloveswords/buffer-crc32.git" - }, - "main": "index.js", - "scripts": { - "test": "tap tests/*.test.js" - }, - "dependencies": {}, - "devDependencies": { - "tap": "~0.2.5" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "gitHead": "f06dc30bccbad685af30666268c6fd2670805998", - "bugs": { - "url": "https://github.com/brianloveswords/buffer-crc32/issues" - }, - "_id": "buffer-crc32@0.2.3", - "_shasum": "bb54519e95d107cbd2400e76d0cab1467336d921", - "_from": "buffer-crc32@0.2.3", - "_npmVersion": "1.4.14", - "_npmUser": { - "name": "brianloveswords", - "email": "brianloveswords@gmail.com" - }, - "maintainers": [ - { - "name": "brianloveswords", - "email": "brian@nyhacker.org" - } - ], - "dist": { - "shasum": "bb54519e95d107cbd2400e76d0cab1467336d921", - "tarball": "http://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js deleted file mode 100644 index bb0f9ef..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js +++ /dev/null @@ -1,89 +0,0 @@ -var crc32 = require('..'); -var test = require('tap').test; - -test('simple crc32 is no problem', function (t) { - var input = Buffer('hey sup bros'); - var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); - t.same(crc32(input), expected); - t.end(); -}); - -test('another simple one', function (t) { - var input = Buffer('IEND'); - var expected = Buffer([0xae, 0x42, 0x60, 0x82]); - t.same(crc32(input), expected); - t.end(); -}); - -test('slightly more complex', function (t) { - var input = Buffer([0x00, 0x00, 0x00]); - var expected = Buffer([0xff, 0x41, 0xd9, 0x12]); - t.same(crc32(input), expected); - t.end(); -}); - -test('complex crc32 gets calculated like a champ', function (t) { - var input = Buffer('शीर्षक'); - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('casts to buffer if necessary', function (t) { - var input = 'शीर्षक'; - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('can do signed', function (t) { - var input = 'ham sandwich'; - var expected = -1891873021; - t.same(crc32.signed(input), expected); - t.end(); -}); - -test('can do unsigned', function (t) { - var input = 'bear sandwich'; - var expected = 3711466352; - t.same(crc32.unsigned(input), expected); - t.end(); -}); - - -test('simple crc32 in append mode', function (t) { - var input = [Buffer('hey'), Buffer(' '), Buffer('sup'), Buffer(' '), Buffer('bros')]; - var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); - for (var crc = 0, i = 0; i < input.length; i++) { - crc = crc32(input[i], crc); - } - t.same(crc, expected); - t.end(); -}); - - -test('can do signed in append mode', function (t) { - var input1 = 'ham'; - var input2 = ' '; - var input3 = 'sandwich'; - var expected = -1891873021; - - var crc = crc32.signed(input1); - crc = crc32.signed(input2, crc); - crc = crc32.signed(input3, crc); - - t.same(crc, expected); - t.end(); -}); - -test('can do unsigned in append mode', function (t) { - var input1 = 'bear san'; - var input2 = 'dwich'; - var expected = 3711466352; - - var crc = crc32.unsigned(input1); - crc = crc32.unsigned(input2, crc); - t.same(crc, expected); - t.end(); -}); - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/History.md deleted file mode 100644 index 2bbc4b3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/History.md +++ /dev/null @@ -1,27 +0,0 @@ -1.0.4 / 2014-06-25 -================== - - * corrected avoidance of timing attacks (thanks @tenbits!) - - -1.0.3 / 2014-01-28 -================== - - * [incorrect] fix for timing attacks - -1.0.2 / 2014-01-28 -================== - - * fix missing repository warning - * fix typo in test - -1.0.1 / 2013-04-15 -================== - - * Revert "Changed underlying HMAC algo. to sha512." - * Revert "Fix for timing attacks on MAC verification." - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Makefile deleted file mode 100644 index 4e9c8d3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --require should \ - --reporter spec - -.PHONY: test \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Readme.md deleted file mode 100644 index 2559e84..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Readme.md +++ /dev/null @@ -1,42 +0,0 @@ - -# cookie-signature - - Sign and unsign cookies. - -## Example - -```js -var cookie = require('cookie-signature'); - -var val = cookie.sign('hello', 'tobiiscool'); -val.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI'); - -var val = cookie.sign('hello', 'tobiiscool'); -cookie.unsign(val, 'tobiiscool').should.equal('hello'); -cookie.unsign(val, 'luna').should.be.false; -``` - -## License - -(The MIT License) - -Copyright (c) 2012 LearnBoost <tj@learnboost.com> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/index.js deleted file mode 100644 index b63bf84..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/index.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Sign the given `val` with `secret`. - * - * @param {String} val - * @param {String} secret - * @return {String} - * @api private - */ - -exports.sign = function(val, secret){ - if ('string' != typeof val) throw new TypeError('cookie required'); - if ('string' != typeof secret) throw new TypeError('secret required'); - return val + '.' + crypto - .createHmac('sha256', secret) - .update(val) - .digest('base64') - .replace(/\=+$/, ''); -}; - -/** - * Unsign and decode the given `val` with `secret`, - * returning `false` if the signature is invalid. - * - * @param {String} val - * @param {String} secret - * @return {String|Boolean} - * @api private - */ - -exports.unsign = function(val, secret){ - if ('string' != typeof val) throw new TypeError('cookie required'); - if ('string' != typeof secret) throw new TypeError('secret required'); - var str = val.slice(0, val.lastIndexOf('.')) - , mac = exports.sign(str, secret); - - return sha1(mac) == sha1(val) ? str : false; -}; - -/** - * Private - */ - -function sha1(str){ - return crypto.createHash('sha1').update(str).digest('hex'); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/package.json deleted file mode 100644 index c15a32d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "cookie-signature", - "version": "1.0.4", - "description": "Sign and unsign cookies", - "keywords": [ - "cookie", - "sign", - "unsign" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@learnboost.com" - }, - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-cookie-signature.git" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "main": "index", - "bugs": { - "url": "https://github.com/visionmedia/node-cookie-signature/issues" - }, - "homepage": "https://github.com/visionmedia/node-cookie-signature", - "_id": "cookie-signature@1.0.4", - "dist": { - "shasum": "0edd22286e3a111b9a2a70db363e925e867f6aca", - "tarball": "http://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.4.tgz" - }, - "_from": "cookie-signature@1.0.4", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "natevw", - "email": "natevw@yahoo.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "natevw", - "email": "natevw@yahoo.com" - } - ], - "directories": {}, - "_shasum": "0edd22286e3a111b9a2a70db363e925e867f6aca", - "_resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/.npmignore deleted file mode 100644 index efab07f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -test -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/LICENSE deleted file mode 100644 index 249d9de..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -// MIT License - -Copyright (C) Roman Shtylman - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/README.md deleted file mode 100644 index 3170b4b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# cookie [![Build Status](https://secure.travis-ci.org/defunctzombie/node-cookie.png?branch=master)](http://travis-ci.org/defunctzombie/node-cookie) # - -cookie is a basic cookie parser and serializer. It doesn't make assumptions about how you are going to deal with your cookies. It basically just provides a way to read and write the HTTP cookie headers. - -See [RFC6265](http://tools.ietf.org/html/rfc6265) for details about the http header for cookies. - -## how? - -``` -npm install cookie -``` - -```javascript -var cookie = require('cookie'); - -var hdr = cookie.serialize('foo', 'bar'); -// hdr = 'foo=bar'; - -var cookies = cookie.parse('foo=bar; cat=meow; dog=ruff'); -// cookies = { foo: 'bar', cat: 'meow', dog: 'ruff' }; -``` - -## more - -The serialize function takes a third parameter, an object, to set cookie options. See the RFC for valid values. - -### path -> cookie path - -### expires -> absolute expiration date for the cookie (Date object) - -### maxAge -> relative max age of the cookie from when the client receives it (seconds) - -### domain -> domain for the cookie - -### secure -> true or false - -### httpOnly -> true or false - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/index.js deleted file mode 100644 index 00d54a7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/index.js +++ /dev/null @@ -1,75 +0,0 @@ - -/// Serialize the a name value pair into a cookie string suitable for -/// http headers. An optional options object specified cookie parameters -/// -/// serialize('foo', 'bar', { httpOnly: true }) -/// => "foo=bar; httpOnly" -/// -/// @param {String} name -/// @param {String} val -/// @param {Object} options -/// @return {String} -var serialize = function(name, val, opt){ - opt = opt || {}; - var enc = opt.encode || encode; - var pairs = [name + '=' + enc(val)]; - - if (null != opt.maxAge) { - var maxAge = opt.maxAge - 0; - if (isNaN(maxAge)) throw new Error('maxAge should be a Number'); - pairs.push('Max-Age=' + maxAge); - } - - if (opt.domain) pairs.push('Domain=' + opt.domain); - if (opt.path) pairs.push('Path=' + opt.path); - if (opt.expires) pairs.push('Expires=' + opt.expires.toUTCString()); - if (opt.httpOnly) pairs.push('HttpOnly'); - if (opt.secure) pairs.push('Secure'); - - return pairs.join('; '); -}; - -/// Parse the given cookie header string into an object -/// The object has the various cookies as keys(names) => values -/// @param {String} str -/// @return {Object} -var parse = function(str, opt) { - opt = opt || {}; - var obj = {} - var pairs = str.split(/; */); - var dec = opt.decode || decode; - - pairs.forEach(function(pair) { - var eq_idx = pair.indexOf('=') - - // skip things that don't look like key=value - if (eq_idx < 0) { - return; - } - - var key = pair.substr(0, eq_idx).trim() - var val = pair.substr(++eq_idx, pair.length).trim(); - - // quoted values - if ('"' == val[0]) { - val = val.slice(1, -1); - } - - // only assign once - if (undefined == obj[key]) { - try { - obj[key] = dec(val); - } catch (e) { - obj[key] = val; - } - } - }); - - return obj; -}; - -var encode = encodeURIComponent; -var decode = decodeURIComponent; - -module.exports.serialize = serialize; -module.exports.parse = parse; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/package.json deleted file mode 100644 index 7dbb395..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "author": { - "name": "Roman Shtylman", - "email": "shtylman@gmail.com" - }, - "name": "cookie", - "description": "cookie parsing and serialization", - "version": "0.1.2", - "repository": { - "type": "git", - "url": "git://github.com/shtylman/node-cookie.git" - }, - "keywords": [ - "cookie", - "cookies" - ], - "main": "index.js", - "scripts": { - "test": "mocha" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "1.x.x" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "bugs": { - "url": "https://github.com/shtylman/node-cookie/issues" - }, - "homepage": "https://github.com/shtylman/node-cookie", - "_id": "cookie@0.1.2", - "dist": { - "shasum": "72fec3d24e48a3432073d90c12642005061004b1", - "tarball": "http://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz" - }, - "_from": "cookie@0.1.2", - "_npmVersion": "1.4.6", - "_npmUser": { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - "maintainers": [ - { - "name": "shtylman", - "email": "shtylman@gmail.com" - } - ], - "directories": {}, - "_shasum": "72fec3d24e48a3432073d90c12642005061004b1", - "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.jshintrc b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.jshintrc deleted file mode 100644 index 299877f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.jshintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "laxbreak": true -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.npmignore deleted file mode 100644 index 7e6163d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -support -test -examples -example -*.sock -dist diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/History.md deleted file mode 100644 index 3b96560..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/History.md +++ /dev/null @@ -1,144 +0,0 @@ - -1.0.4 / 2014-07-15 -================== - - * dist: recompile - * example: remove `console.info()` log usage - * example: add "Content-Type" UTF-8 header to browser example - * browser: place %c marker after the space character - * browser: reset the "content" color via `color: inherit` - * browser: add colors support for Firefox >= v31 - * debug: prefer an instance `log()` function over the global one (#119) - * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) - -1.0.3 / 2014-07-09 -================== - - * Add support for multiple wildcards in namespaces (#122, @seegno) - * browser: fix lint - -1.0.2 / 2014-06-10 -================== - - * browser: update color palette (#113, @gscottolson) - * common: make console logging function configurable (#108, @timoxley) - * node: fix %o colors on old node <= 0.8.x - * Makefile: find node path using shell/which (#109, @timoxley) - -1.0.1 / 2014-06-06 -================== - - * browser: use `removeItem()` to clear localStorage - * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) - * package: add "contributors" section - * node: fix comment typo - * README: list authors - -1.0.0 / 2014-06-04 -================== - - * make ms diff be global, not be scope - * debug: ignore empty strings in enable() - * node: make DEBUG_COLORS able to disable coloring - * *: export the `colors` array - * npmignore: don't publish the `dist` dir - * Makefile: refactor to use browserify - * package: add "browserify" as a dev dependency - * Readme: add Web Inspector Colors section - * node: reset terminal color for the debug content - * node: map "%o" to `util.inspect()` - * browser: map "%j" to `JSON.stringify()` - * debug: add custom "formatters" - * debug: use "ms" module for humanizing the diff - * Readme: add "bash" syntax highlighting - * browser: add Firebug color support - * browser: add colors for WebKit browsers - * node: apply log to `console` - * rewrite: abstract common logic for Node & browsers - * add .jshintrc file - -0.8.1 / 2014-04-14 -================== - - * package: re-add the "component" section - -0.8.0 / 2014-03-30 -================== - - * add `enable()` method for nodejs. Closes #27 - * change from stderr to stdout - * remove unnecessary index.js file - -0.7.4 / 2013-11-13 -================== - - * remove "browserify" key from package.json (fixes something in browserify) - -0.7.3 / 2013-10-30 -================== - - * fix: catch localStorage security error when cookies are blocked (Chrome) - * add debug(err) support. Closes #46 - * add .browser prop to package.json. Closes #42 - -0.7.2 / 2013-02-06 -================== - - * fix package.json - * fix: Mobile Safari (private mode) is broken with debug - * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript - -0.7.1 / 2013-02-05 -================== - - * add repository URL to package.json - * add DEBUG_COLORED to force colored output - * add browserify support - * fix component. Closes #24 - -0.7.0 / 2012-05-04 -================== - - * Added .component to package.json - * Added debug.component.js build - -0.6.0 / 2012-03-16 -================== - - * Added support for "-" prefix in DEBUG [Vinay Pulim] - * Added `.enabled` flag to the node version [TooTallNate] - -0.5.0 / 2012-02-02 -================== - - * Added: humanize diffs. Closes #8 - * Added `debug.disable()` to the CS variant - * Removed padding. Closes #10 - * Fixed: persist client-side variant again. Closes #9 - -0.4.0 / 2012-02-01 -================== - - * Added browser variant support for older browsers [TooTallNate] - * Added `debug.enable('project:*')` to browser variant [TooTallNate] - * Added padding to diff (moved it to the right) - -0.3.0 / 2012-01-26 -================== - - * Added millisecond diff when isatty, otherwise UTC string - -0.2.0 / 2012-01-22 -================== - - * Added wildcard support - -0.1.0 / 2011-12-02 -================== - - * Added: remove colors unless stderr isatty [TooTallNate] - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Makefile deleted file mode 100644 index b0bde6e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Makefile +++ /dev/null @@ -1,33 +0,0 @@ - -# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 -THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) -THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) - -# BIN directory -BIN := $(THIS_DIR)/node_modules/.bin - -# applications -NODE ?= $(shell which node) -NPM ?= $(NODE) $(shell which npm) -BROWSERIFY ?= $(NODE) $(BIN)/browserify - -all: dist/debug.js - -install: node_modules - -clean: - @rm -rf node_modules dist - -dist: - @mkdir -p $@ - -dist/debug.js: node_modules browser.js debug.js dist - @$(BROWSERIFY) \ - --standalone debug \ - . > $@ - -node_modules: package.json - @NODE_ENV= $(NPM) install - @touch node_modules - -.PHONY: all install clean diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Readme.md deleted file mode 100644 index e59b9ad..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Readme.md +++ /dev/null @@ -1,156 +0,0 @@ -# debug - - tiny node.js debugging utility modelled after node core's debugging technique. - -## Installation - -```bash -$ npm install debug -``` - -## Usage - - With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility. - -Example _app.js_: - -```js -var debug = require('debug')('http') - , http = require('http') - , name = 'My App'; - -// fake app - -debug('booting %s', name); - -http.createServer(function(req, res){ - debug(req.method + ' ' + req.url); - res.end('hello\n'); -}).listen(3000, function(){ - debug('listening'); -}); - -// fake worker of some kind - -require('./worker'); -``` - -Example _worker.js_: - -```js -var debug = require('debug')('worker'); - -setInterval(function(){ - debug('doing some work'); -}, 1000); -``` - - The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: - - ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) - - ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) - -## Millisecond diff - - When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. - - ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) - - When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: - - ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) - -## Conventions - - If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". - -## Wildcards - - The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect.compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. - - You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:". - -## Browser support - - Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. - -```js -a = debug('worker:a'); -b = debug('worker:b'); - -setInterval(function(){ - a('doing some work'); -}, 1000); - -setInterval(function(){ - b('doing some work'); -}, 1200); -``` - -#### Web Inspector Colors - - Colors are also enabled on "Web Inspectors" that understand the `%c` formatting - option. These are WebKit web inspectors, Firefox ([since version - 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) - and the Firebug plugin for Firefox (any version). - - Colored output looks something like: - - ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) - -### stderr vs stdout - -You can set an alternative logging method per-namespace by overriding the `log` method on a per-namespace or globally: - -Example _stderr.js_: - -```js -var debug = require('../'); -var log = debug('app:log'); - -// by default console.log is used -log('goes to stdout!'); - -var error = debug('app:error'); -// set this namespace to log via console.error -error.log = console.error.bind(console); // don't forget to bind to console! -error('goes to stderr'); -log('still goes to stdout!'); - -// set all output to go via console.warn -// overrides all per-namespace log settings -debug.log = console.warn.bind(console); -log('now goes to stderr via console.warn'); -error('still goes to stderr, but via console.warn now'); -``` - -## Authors - - - TJ Holowaychuk - - Nathan Rajlich - -## License - -(The MIT License) - -Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/browser.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/browser.js deleted file mode 100644 index ce6369f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/browser.js +++ /dev/null @@ -1,147 +0,0 @@ - -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // is webkit? http://stackoverflow.com/a/16459606/376773 - return ('WebkitAppearance' in document.documentElement.style) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (window.console && (console.firebug || (console.exception && console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - return JSON.stringify(v); -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs() { - var args = arguments; - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return args; - - var c = 'color: ' + this.color; - args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1)); - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); - return args; -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // This hackery is required for IE8, - // where the `console.log` function doesn't have 'apply' - return 'object' == typeof console - && 'function' == typeof console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - localStorage.removeItem('debug'); - } else { - localStorage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - var r; - try { - r = localStorage.debug; - } catch(e) {} - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/component.json deleted file mode 100644 index ab5f3ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/component.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "debug", - "repo": "visionmedia/debug", - "description": "small debugging utility", - "version": "1.0.4", - "keywords": [ - "debug", - "log", - "debugger" - ], - "main": "browser.js", - "scripts": [ - "browser.js", - "debug.js" - ], - "dependencies": { - "guille/ms.js": "0.6.1" - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/debug.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/debug.js deleted file mode 100644 index 7571a86..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/debug.js +++ /dev/null @@ -1,197 +0,0 @@ - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = debug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = require('ms'); - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lowercased letter, i.e. "n". - */ - -exports.formatters = {}; - -/** - * Previously assigned color. - */ - -var prevColor = 0; - -/** - * Previous log timestamp. - */ - -var prevTime; - -/** - * Select a color. - * - * @return {Number} - * @api private - */ - -function selectColor() { - return exports.colors[prevColor++ % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function debug(namespace) { - - // define the `disabled` version - function disabled() { - } - disabled.enabled = false; - - // define the `enabled` version - function enabled() { - - var self = enabled; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // add the `color` if not set - if (null == self.useColors) self.useColors = exports.useColors(); - if (null == self.color && self.useColors) self.color = selectColor(); - - var args = Array.prototype.slice.call(arguments); - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %o - args = ['%o'].concat(args); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - if ('function' === typeof exports.formatArgs) { - args = exports.formatArgs.apply(self, args); - } - var logFn = enabled.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - enabled.enabled = true; - - var fn = exports.enabled(namespace) ? enabled : disabled; - - fn.namespace = namespace; - - return fn; -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - var split = (namespaces || '').split(/[\s,]+/); - var len = split.length; - - for (var i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node.js deleted file mode 100644 index c94f7d1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node.js +++ /dev/null @@ -1,129 +0,0 @@ - -/** - * Module dependencies. - */ - -var tty = require('tty'); -var util = require('util'); - -/** - * This is the Node.js implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - var debugColors = (process.env.DEBUG_COLORS || '').trim().toLowerCase(); - if (0 === debugColors.length) { - return tty.isatty(1); - } else { - return '0' !== debugColors - && 'no' !== debugColors - && 'false' !== debugColors - && 'disabled' !== debugColors; - } -} - -/** - * Map %o to `util.inspect()`, since Node doesn't do that out of the box. - */ - -var inspect = (4 === util.inspect.length ? - // node <= 0.8.x - function (v, colors) { - return util.inspect(v, void 0, void 0, colors); - } : - // node > 0.8.x - function (v, colors) { - return util.inspect(v, { colors: colors }); - } -); - -exports.formatters.o = function(v) { - return inspect(v, this.useColors) - .replace(/\s*\n\s*/g, ' '); -}; - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs() { - var args = arguments; - var useColors = this.useColors; - var name = this.namespace; - - if (useColors) { - var c = this.color; - - args[0] = ' \u001b[9' + c + 'm' + name + ' ' - + '\u001b[0m' - + args[0] + '\u001b[3' + c + 'm' - + ' +' + exports.humanize(this.diff) + '\u001b[0m'; - } else { - args[0] = new Date().toUTCString() - + ' ' + name + ' ' + args[0]; - } - return args; -} - -/** - * Invokes `console.log()` with the specified arguments. - */ - -function log() { - return console.log.apply(console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ - -exports.enable(load()); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/README.md deleted file mode 100644 index d4ab12a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours', { long: true })) // "10 hours" -``` - -- Node/Browser compatible. Published as `ms` in NPM. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/index.js deleted file mode 100644 index c5847f8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/package.json deleted file mode 100644 index c4dd654..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "ms", - "version": "0.6.2", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "readme": "# ms.js: miliseconds conversion utility\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('100') // 100\n```\n\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(ms('10 hours', { long: true })) // \"10 hours\"\n```\n\n- Node/Browser compatible. Published as `ms` in NPM.\n- If a number is supplied to `ms`, a string with a unit is returned.\n- If a string that contains the number is supplied, it returns it as\na number (e.g: it returns `100` for `'100'`).\n- If you pass a string with a number and a valid unit, the number of\nequivalent ms is returned.\n\n## License\n\nMIT", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "_id": "ms@0.6.2", - "dist": { - "shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - }, - "_from": "ms@0.6.2", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "directories": {}, - "_shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "homepage": "https://github.com/guille/ms.js" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/package.json deleted file mode 100644 index 823c26d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "debug", - "version": "1.0.4", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/debug.git" - }, - "description": "small debugging utility", - "keywords": [ - "debug", - "log", - "debugger" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Nathan Rajlich", - "email": "nathan@tootallnate.net", - "url": "http://n8.io" - } - ], - "dependencies": { - "ms": "0.6.2" - }, - "devDependencies": { - "browserify": "4.1.6", - "mocha": "*" - }, - "main": "./node.js", - "browser": "./browser.js", - "component": { - "scripts": { - "debug/index.js": "browser.js", - "debug/debug.js": "debug.js" - } - }, - "gitHead": "abc10a5912f79d251752d18350e269fe0b0fbbf9", - "bugs": { - "url": "https://github.com/visionmedia/debug/issues" - }, - "homepage": "https://github.com/visionmedia/debug", - "_id": "debug@1.0.4", - "scripts": {}, - "_shasum": "5b9c256bd54b6ec02283176fa8a0ede6d154cbf8", - "_from": "debug@1.0.4", - "_npmVersion": "1.4.14", - "_npmUser": { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - } - ], - "dist": { - "shasum": "5b9c256bd54b6ec02283176fa8a0ede6d154cbf8", - "tarball": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/.npmignore deleted file mode 100644 index 0c7e391..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -coverage/ -files/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/History.md deleted file mode 100644 index ba1af12..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/History.md +++ /dev/null @@ -1,56 +0,0 @@ -0.4.4 / 2014-07-27 -================== - - * Work-around v8 generating empty stack traces - -0.4.3 / 2014-07-26 -================== - - * Fix exception when global `Error.stackTraceLimit` is too low - -0.4.2 / 2014-07-19 -================== - - * Correct call site for wrapped functions and properties - -0.4.1 / 2014-07-19 -================== - - * Improve automatic message generation for function properties - -0.4.0 / 2014-07-19 -================== - - * Add `TRACE_DEPRECATION` environment variable - * Remove non-standard grey color from color output - * Support `--no-deprecation` argument - * Support `--trace-deprecation` argument - * Support `deprecate.property(fn, prop, message)` - -0.3.0 / 2014-06-16 -================== - - * Add `NO_DEPRECATION` environment variable - -0.2.0 / 2014-06-15 -================== - - * Add `deprecate.property(obj, prop, message)` - * Remove `supports-color` dependency for node.js 0.8 - -0.1.0 / 2014-06-15 -================== - - * Add `deprecate.function(fn, message)` - * Add `process.on('deprecation', fn)` emitter - * Automatically generate message when omitted from `deprecate()` - -0.0.1 / 2014-06-15 -================== - - * Fix warning for dynamic calls at singe call site - -0.0.0 / 2014-06-15 -================== - - * Initial implementation diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/Readme.md deleted file mode 100644 index 47a53a1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/Readme.md +++ /dev/null @@ -1,272 +0,0 @@ -# depd - -[![NPM version](https://badge.fury.io/js/depd.svg)](http://badge.fury.io/js/depd) -[![Build Status](https://travis-ci.org/dougwilson/nodejs-depd.svg?branch=master)](https://travis-ci.org/dougwilson/nodejs-depd) -[![Coverage Status](https://img.shields.io/coveralls/dougwilson/nodejs-depd.svg?branch=master)](https://coveralls.io/r/dougwilson/nodejs-depd) -[![Gittip](http://img.shields.io/gittip/dougwilson.svg)](https://www.gittip.com/dougwilson/) - -Deprecate all the things - -> With great modules comes great responsibility; mark things deprecated! - -## Install - -```sh -$ npm install depd -``` - -## API - -```js -var deprecate = require('depd')('my-module') -``` - -This library allows you to display deprecation messages to your users. -This library goes above and beyond with deprecation warnings by -introspecting the call stack (but only the bits that it is interested -in). - -Instead of just warning on the first invocation of a deprecated -function and never again, this module will warn on the first invocation -of a deprecated function per unique call site, making it ideal to alert -users of all deprecated uses across the code base, rather than just -whatever happens to execute first. - -The deprecation warnings from this module also include the file and line -information for the call into the module that the deprecated function was -in. - -### depd(namespace) - -Create a new deprecate function that uses the given namespace name in the -messages and will display the call site prior to the stack entering the -file this function was called from. It is highly suggested you use the -name of your module as the namespace. - -### deprecate(message) - -Call this function from deprecated code to display a deprecation message. -This message will appear once per unique caller site. Caller site is the -first call site in the stack in a different file from the caller of this -function. - -If the message is omitted, a message is generated for you based on the site -of the `deprecate()` call and will display the name of the function called, -similar to the name displayed in a stack trace. - -### deprecate.function(fn, message) - -Call this function to wrap a given function in a deprecation message on any -call to the function. An optional message can be supplied to provide a custom -message. - -### deprecate.property(obj, prop, message) - -Call this function to wrap a given property on object in a deprecation message -on any accessing or setting of the property. An optional message can be supplied -to provide a custom message. - -The method must be called on the object where the property belongs (not -inherited from the prototype). - -If the property is a data descriptor, it will be converted to an accessor -descriptor in order to display the deprecation message. - -### process.on('deprecation', fn) - -This module will allow easy capturing of deprecation errors by emitting the -errors as the type "deprecation" on the global `process`. If there are no -listeners for this type, the errors are written to STDERR as normal, but if -there are any listeners, nothing will be written to STDERR and instead only -emitted. From there, you can write the errors in a different format or to a -logging source. - -The error represents the deprecation and is emitted only once with the same -rules as writing to STDERR. The error has the following properties: - - - `message` - This is the message given by the library - - `name` - This is always `'DeprecationError'` - - `namespace` - This is the namespace the deprecation came from - - `stack` - This is the stack of the call to the deprecated thing - -Example `error.stack` output: - -``` -DeprecationError: my-cool-module deprecated oldfunction - at Object. ([eval]-wrapper:6:22) - at Module._compile (module.js:456:26) - at evalScript (node.js:532:25) - at startup (node.js:80:7) - at node.js:902:3 -``` - -### process.env.NO_DEPRECATION - -As a user of modules that are deprecated, the environment variable `NO_DEPRECATION` -is provided as a quick solution to silencing deprecation warnings from being -output. The format of this is similar to that of `DEBUG`: - -```sh -$ NO_DEPRECATION=my-module,othermod node app.js -``` - -This will suppress deprecations from being output for "my-module" and "othermod". -The value is a list of comma-separated namespaces. To suppress every warning -across all namespaces, use the value `*` for a namespace. - -Providing the argument `--no-deprecation` to the `node` executable will suppress -all deprecations. - -**NOTE** This will not suppress the deperecations given to any "deprecation" -event listeners, just the output to STDERR. - -### process.env.TRACE_DEPRECATION - -As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION` -is provided as a solution to getting more detailed location information in deprecation -warnings by including the entire stack trace. The format of this is the same as -`NO_DEPRECATION`: - -```sh -$ TRACE_DEPRECATION=my-module,othermod node app.js -``` - -This will include stack traces for deprecations being output for "my-module" and -"othermod". The value is a list of comma-separated namespaces. To trace every -warning across all namespaces, use the value `*` for a namespace. - -Providing the argument `--trace-deprecation` to the `node` executable will trace -all deprecations. - -**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`. - -## Display - -![message](files/message.png) - -When a user calls a function in your library that you mark deprecated, they -will see the following written to STDERR (in the given colors, similar colors -and layout to the `debug` module): - -``` -bright cyan bright yellow -| | reset cyan -| | | | -▼ ▼ ▼ ▼ -my-cool-module deprecated oldfunction [eval]-wrapper:6:22 -▲ ▲ ▲ ▲ -| | | | -namespace | | location of mycoolmod.oldfunction() call - | deprecation message - the word "deprecated" -``` - -If the user redirects their STDERR to a file or somewhere that does not support -colors, they see (similar layout to the `debug` module): - -``` -Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22 -▲ ▲ ▲ ▲ ▲ -| | | | | -timestamp of message namespace | | location of mycoolmod.oldfunction() call - | deprecation message - the word "deprecated" -``` - -## Examples - -### Deprecating all calls to a function - -This will display a deprecated message about "oldfunction" being deprecated -from "my-module" on STDERR. - -```js -var deprecate = require('depd')('my-cool-module') - -// message automatically derived from function name -// Object.oldfunction -exports.oldfunction = deprecate.function(function oldfunction() { - // all calls to function are deprecated -}) - -// specific message -exports.oldfunction = deprecate.function(function () { - // all calls to function are deprecated -}, 'oldfunction') -``` - -### Conditionally deprecating a function call - -This will display a deprecated message about "weirdfunction" being deprecated -from "my-module" on STDERR when called with less than 2 arguments. - -```js -var deprecate = require('depd')('my-cool-module') - -exports.weirdfunction = function () { - if (arguments.length < 2) { - // calls with 0 or 1 args are deprecated - deprecate('weirdfunction args < 2') - } -} -``` - -When calling `deprecate` as a function, the warning is counted per call site -within your own module, so you can display different deprecations depending -on different situations and the users will still get all the warnings: - -```js -var deprecate = require('depd')('my-cool-module') - -exports.weirdfunction = function () { - if (arguments.length < 2) { - // calls with 0 or 1 args are deprecated - deprecate('weirdfunction args < 2') - } else if (typeof arguments[0] !== 'string') { - // calls with non-string first argument are deprecated - deprecate('weirdfunction non-string first arg') - } -} -``` - -### Deprecating property access - -This will display a deprecated message about "oldprop" being deprecated -from "my-module" on STDERR when accessed. A deprecation will be displayed -when setting the value and when getting the value. - -```js -var deprecate = require('depd')('my-cool-module') - -exports.oldprop = 'something' - -// message automatically derives from property name -deprecate.property(exports, 'oldprop') - -// explicit message -deprecate.property(exports, 'oldprop', 'oldprop >= 0.10') -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/index.js deleted file mode 100644 index a6fb372..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/index.js +++ /dev/null @@ -1,520 +0,0 @@ -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter -var relative = require('path').relative - -/** - * Module exports. - */ - -module.exports = depd - -/** - * Get the path to base files on. - */ - -var basePath = process.cwd() - -/** - * Get listener count on event emitter. - */ - -/*istanbul ignore next*/ -var eventListenerCount = EventEmitter.listenerCount - || function (emitter, type) { return emitter.listeners(type).length } - -/** - * Determine if namespace is contained in the string. - */ - -function containsNamespace(str, namespace) { - var val = str.split(/[ ,]+/) - - namespace = String(namespace).toLowerCase() - - for (var i = 0 ; i < val.length; i++) { - if (!(str = val[i])) continue; - - // namespace contained - if (str === '*' || str.toLowerCase() === namespace) { - return true - } - } - - return false -} - -/** - * Convert a data descriptor to accessor descriptor. - */ - -function convertDataDescriptorToAccessor(obj, prop, message) { - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - var value = descriptor.value - - descriptor.get = function getter() { return value } - - if (descriptor.writable) { - descriptor.set = function setter(val) { return value = val } - } - - delete descriptor.value - delete descriptor.writable - - Object.defineProperty(obj, prop, descriptor) - - return descriptor -} - -/** - * Create arguments string to keep arity. - */ - -function createArgumentsString(arity) { - var str = '' - - for (var i = 0; i < arity; i++) { - str += ', arg' + i - } - - return str.substr(2) -} - -/** - * Create stack string from stack. - */ - -function createStackString(stack) { - var str = this.name + ': ' + this.namespace - - if (this.message) { - str += ' deprecated ' + this.message - } - - for (var i = 0; i < stack.length; i++) { - str += '\n at ' + stack[i].toString() - } - - return str -} - -/** - * Create deprecate for namespace in caller. - */ - -function depd(namespace) { - if (!namespace) { - throw new TypeError('argument namespace is required') - } - - var stack = getStack() - var site = callSiteLocation(stack[1]) - var file = site[0] - - function deprecate(message) { - // call to self as log - log.call(deprecate, message) - } - - deprecate._file = file - deprecate._ignored = isignored(namespace) - deprecate._namespace = namespace - deprecate._traced = istraced(namespace) - deprecate._warned = Object.create(null) - - deprecate.function = wrapfunction - deprecate.property = wrapproperty - - return deprecate -} - -/** - * Determine if namespace is ignored. - */ - -function isignored(namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.noDeprecation) { - // --no-deprecation support - return true - } - - var str = process.env.NO_DEPRECATION || '' - - // namespace ignored - return containsNamespace(str, namespace) -} - -/** - * Determine if namespace is traced. - */ - -function istraced(namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.traceDeprecation) { - // --trace-deprecation support - return true - } - - var str = process.env.TRACE_DEPRECATION || '' - - // namespace traced - return containsNamespace(str, namespace) -} - -/** - * Display deprecation message. - */ - -function log(message, site) { - var haslisteners = eventListenerCount(process, 'deprecation') !== 0 - - // abort early if no destination - if (!haslisteners && this._ignored) { - return - } - - var caller - var callFile - var callSite - var i = 0 - var seen = false - var stack = getStack() - var file = this._file - - if (site) { - // provided site - callSite = callSiteLocation(stack[1]) - callSite.name = site.name - file = callSite[0] - } else { - // get call site - i = 2 - site = callSiteLocation(stack[i]) - callSite = site - } - - // get caller of deprecated thing in relation to file - for (; i < stack.length; i++) { - caller = callSiteLocation(stack[i]) - callFile = caller[0] - - if (callFile === file) { - seen = true - } else if (callFile === this._file) { - file = this._file - } else if (seen) { - break - } - } - - var key = caller - ? site.join(':') + '__' + caller.join(':') - : undefined - - if (key !== undefined && key in this._warned) { - // already warned - return - } - - this._warned[key] = true - - // generate automatic message from call site - if (!message) { - message = callSite === site || !callSite.name - ? defaultMessage(site) - : defaultMessage(callSite) - } - - // emit deprecation if listeners exist - if (haslisteners) { - var err = DeprecationError(this._namespace, message, stack.slice(i)) - process.emit('deprecation', err) - return - } - - // format and write message - var format = process.stderr.isTTY - ? formatColor - : formatPlain - var msg = format.call(this, message, caller, stack.slice(i)) - process.stderr.write(msg + '\n', 'utf8') - - return -} - -/** - * Get call site location as array. - */ - -function callSiteLocation(callSite) { - var file = callSite.getFileName() || '' - var line = callSite.getLineNumber() - var colm = callSite.getColumnNumber() - - if (callSite.isEval()) { - file = callSite.getEvalOrigin() + ', ' + file - } - - var site = [file, line, colm] - - site.callSite = callSite - site.name = callSite.getFunctionName() - - return site -} - -/** - * Generate a default message from the site. - */ - -function defaultMessage(site) { - var callSite = site.callSite - var funcName = site.name - var typeName = callSite.getTypeName() - - // make useful anonymous name - if (!funcName) { - funcName = '' - } - - // make useful type name - if (typeName === 'Function') { - typeName = callSite.getThis().name || typeName - } - - return callSite.getMethodName() - ? typeName + '.' + funcName - : funcName -} - -/** - * Format deprecation message without color. - */ - -function formatPlain(msg, caller, stack) { - var timestamp = new Date().toUTCString() - - var formatted = timestamp - + ' ' + this._namespace - + ' deprecated ' + msg - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n at ' + stack[i].toString() - } - - return formatted - } - - if (caller) { - formatted += ' at ' + formatLocation(caller) - } - - return formatted -} - -/** - * Format deprecation message with color. - */ - -function formatColor(msg, caller, stack) { - var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' // bold cyan - + ' \x1b[33;1mdeprecated\x1b[22;39m' // bold yellow - + ' \x1b[0m' + msg + '\x1b[39m' // reset - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n \x1b[36mat ' + stack[i].toString() + '\x1b[39m' // cyan - } - - return formatted - } - - if (caller) { - formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan - } - - return formatted -} - -/** - * Format call site location. - */ - -function formatLocation(callSite) { - return relative(basePath, callSite[0]) - + ':' + callSite[1] - + ':' + callSite[2] -} - -/** - * Get the stack as array of call sites. - */ - -function getStack() { - var limit = Error.stackTraceLimit - var obj = {} - var prep = Error.prepareStackTrace - - Error.prepareStackTrace = prepareObjectStackTrace - Error.stackTraceLimit = Math.max(10, limit) - - // capture the stack - Error.captureStackTrace(obj) - - // slice this function off the top - var stack = obj.stack.slice(1) - - Error.prepareStackTrace = prep - Error.stackTraceLimit = limit - - return stack -} - -/** - * Capture call site stack from v8. - */ - -function prepareObjectStackTrace(obj, stack) { - return stack -} - -/** - * Return a wrapped function in a deprecation message. - */ - -function wrapfunction(fn, message) { - if (typeof fn !== 'function') { - throw new TypeError('argument fn must be a function') - } - - var args = createArgumentsString(fn.length) - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - site.name = fn.name - - var deprecatedfn = eval('(function (' + args + ') {\n' - + 'log.call(deprecate, message, site)\n' - + 'return fn.apply(this, arguments)\n' - + '})') - - return deprecatedfn -} - -/** - * Wrap property in a deprecation message. - */ - -function wrapproperty(obj, prop, message) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - throw new TypeError('argument obj must be object') - } - - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - - if (!descriptor) { - throw new TypeError('must call property on owner object') - } - - if (!descriptor.configurable) { - throw new TypeError('property must be configurable') - } - - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - // set site name - site.name = prop - - // convert data descriptor - if ('value' in descriptor) { - descriptor = convertDataDescriptorToAccessor(obj, prop, message) - } - - var get = descriptor.get - var set = descriptor.set - - // wrap getter - if (typeof get === 'function') { - descriptor.get = function getter() { - log.call(deprecate, message, site) - return get.apply(this, arguments) - } - } - - // wrap setter - if (typeof set === 'function') { - descriptor.set = function setter() { - log.call(deprecate, message, site) - return set.apply(this, arguments) - } - } - - Object.defineProperty(obj, prop, descriptor) -} - -/** - * Create DeprecationError for deprecation - */ - -function DeprecationError(namespace, message, stack) { - var error = new Error() - var stackString - - Object.defineProperty(error, 'constructor', { - value: DeprecationError - }) - - Object.defineProperty(error, 'message', { - configurable: true, - enumerable: false, - value: message, - writable: true - }) - - Object.defineProperty(error, 'name', { - enumerable: false, - configurable: true, - value: 'DeprecationError', - writable: true - }) - - Object.defineProperty(error, 'namespace', { - configurable: true, - enumerable: false, - value: namespace, - writable: true - }) - - Object.defineProperty(error, 'stack', { - configurable: true, - enumerable: false, - get: function () { - if (stackString !== undefined) { - return stackString - } - - // prepare stack trace - return stackString = createStackString.call(this, stack) - }, - set: function setter(val) { - stackString = val - } - }) - - return error -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/package.json deleted file mode 100644 index 6935dc5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "depd", - "description": "Deprecate all the things", - "version": "0.4.4", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "deprecate", - "deprecated" - ], - "repository": { - "type": "git", - "url": "git://github.com/dougwilson/nodejs-depd" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.20.1", - "should": "~4.0.4" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec --bail --require should test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --require should test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --require should test/" - }, - "bugs": { - "url": "https://github.com/dougwilson/nodejs-depd/issues" - }, - "homepage": "https://github.com/dougwilson/nodejs-depd", - "_id": "depd@0.4.4", - "dist": { - "shasum": "07091fae75f97828d89b4a02a2d4778f0e7c0662", - "tarball": "http://registry.npmjs.org/depd/-/depd-0.4.4.tgz" - }, - "_from": "depd@0.4.4", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "07091fae75f97828d89b4a02a2d4778f0e7c0662", - "_resolved": "https://registry.npmjs.org/depd/-/depd-0.4.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/.npmignore deleted file mode 100644 index 48a2e24..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -components -build diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Makefile deleted file mode 100644 index 3f6119d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Makefile +++ /dev/null @@ -1,11 +0,0 @@ - -build: components index.js - @component build - -components: - @Component install - -clean: - rm -fr build components template.js - -.PHONY: clean diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Readme.md deleted file mode 100644 index 2cfcc99..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Readme.md +++ /dev/null @@ -1,15 +0,0 @@ - -# escape-html - - Escape HTML entities - -## Example - -```js -var escape = require('escape-html'); -escape(str); -``` - -## License - - MIT \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/component.json deleted file mode 100644 index cb9740f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/component.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "escape-html", - "description": "Escape HTML entities", - "version": "1.0.1", - "keywords": ["escape", "html", "utility"], - "dependencies": {}, - "scripts": [ - "index.js" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/index.js deleted file mode 100644 index 2765211..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/index.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Escape special characters in the given string of html. - * - * @param {String} html - * @return {String} - * @api private - */ - -module.exports = function(html) { - return String(html) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(//g, '>'); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/package.json deleted file mode 100644 index ee240f0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "escape-html", - "description": "Escape HTML entities", - "version": "1.0.1", - "keywords": [ - "escape", - "html", - "utility" - ], - "dependencies": {}, - "main": "index.js", - "component": { - "scripts": { - "escape-html/index.js": "index.js" - } - }, - "repository": { - "type": "git", - "url": "https://github.com/component/escape-html.git" - }, - "readme": "\n# escape-html\n\n Escape HTML entities\n\n## Example\n\n```js\nvar escape = require('escape-html');\nescape(str);\n```\n\n## License\n\n MIT", - "readmeFilename": "Readme.md", - "bugs": { - "url": "https://github.com/component/escape-html/issues" - }, - "homepage": "https://github.com/component/escape-html", - "_id": "escape-html@1.0.1", - "dist": { - "shasum": "181a286ead397a39a92857cfb1d43052e356bff0", - "tarball": "http://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz" - }, - "_from": "escape-html@1.0.1", - "_npmVersion": "1.3.15", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "181a286ead397a39a92857cfb1d43052e356bff0", - "_resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/HISTORY.md deleted file mode 100644 index 236e95e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/HISTORY.md +++ /dev/null @@ -1,27 +0,0 @@ -0.1.0 / 2014-07-16 -================== - - * Respond after request fully read - - prevents hung responses and socket hang ups - * deps: debug@1.0.4 - -0.0.3 / 2014-07-11 -================== - - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.0.2 / 2014-06-19 -================== - - * Handle invalid status codes - -0.0.1 / 2014-06-05 -================== - - * deps: debug@1.0.2 - -0.0.0 / 2014-06-05 -================== - - * Extracted from connect/express diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/README.md deleted file mode 100644 index c701e3a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/README.md +++ /dev/null @@ -1,140 +0,0 @@ -# finalhandler - -[![NPM version](https://badge.fury.io/js/finalhandler.svg)](https://badge.fury.io/js/finalhandler) -[![Build Status](https://travis-ci.org/expressjs/finalhandler.svg?branch=master)](https://travis-ci.org/expressjs/finalhandler) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/finalhandler.svg?branch=master)](https://coveralls.io/r/expressjs/finalhandler) - -Node.js function to invoke as the final step to respond to HTTP request. - -## Installation - -```sh -$ npm install finalhandler -``` - -## API - -```js -var finalhandler = require('finalhandler') -``` - -### finalhandler(req, res, [options]) - -Returns function to be invoked as the final step for the given `req` and `res`. -This function is to be invoked as `fn(err)`. If `err` is falsy, the handler will -write out a 404 response to the `res`. If it is truthy, an error response will -be written out to the `res`, and `res.statusCode` is set from `err.status`. - -The final handler will also unpipe anything from `req` when it is invoked. - -#### options.env - -By default, the environment is determined by `NODE_ENV` variable, but it can be -overridden by this option. - -#### options.onerror - -Provide a function to be called with the `err` when it exists. Can be used for -writing errors to a central location without excessive function generation. Called -as `onerror(err, req, res)`. - -## Examples - -### always 404 - -```js -var finalhandler = require('finalhandler') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - done() -}) - -server.listen(3000) -``` - -### perform simple action - -```js -var finalhandler = require('finalhandler') -var fs = require('fs') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - - fs.readFile('index.html', function (err, buf) { - if (err) return done(err) - res.setHeader('Content-Type', 'text/html') - res.end(buf) - }) -}) - -server.listen(3000) -``` - -### use with middleware-style functions - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -var serve = serveStatic('public') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - serve(req, res, done) -}) - -server.listen(3000) -``` - -### keep log of all errors - -```js -var finalhandler = require('finalhandler') -var fs = require('fs') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res, {onerror: logerror}) - - fs.readFile('index.html', function (err, buf) { - if (err) return done(err) - res.setHeader('Content-Type', 'text/html') - res.end(buf) - }) -}) - -server.listen(3000) - -function logerror(err) { - console.error(err.stack || err.toString()) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/index.js deleted file mode 100644 index 1ee90c6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/index.js +++ /dev/null @@ -1,158 +0,0 @@ -/*! - * finalhandler - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var debug = require('debug')('finalhandler') -var escapeHtml = require('escape-html') -var http = require('http') - -/** - * Variables. - */ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Module exports. - */ - -module.exports = finalhandler - -/** - * Final handler: - * - * @param {Request} req - * @param {Response} res - * @param {Object} [options] - * @return {Function} - * @api public - */ - -function finalhandler(req, res, options) { - options = options || {} - - // get environment - var env = options.env || process.env.NODE_ENV || 'development' - - // get error callback - var onerror = options.onerror - - return function (err) { - var msg - - // unhandled error - if (err) { - // default status code to 500 - if (!res.statusCode || res.statusCode < 400) { - res.statusCode = 500 - } - - // respect err.status - if (err.status) { - res.statusCode = err.status - } - - // production gets a basic error message - var msg = env === 'production' - ? http.STATUS_CODES[res.statusCode] - : err.stack || err.toString() - msg = escapeHtml(msg) - .replace(/\n/g, '
') - .replace(/ /g, '  ') + '\n' - } else { - res.statusCode = 404 - msg = 'Cannot ' + escapeHtml(req.method) + ' ' + escapeHtml(req.originalUrl || req.url) + '\n' - } - - debug('default %s', res.statusCode) - - // schedule onerror callback - if (err && onerror) { - defer(onerror, err, req, res) - } - - // cannot actually respond - if (res._header) { - return req.socket.destroy() - } - - send(req, res, res.statusCode, msg) - } -} - -/** - * Send response. - * - * @param {IncomingMessage} req - * @param {OutgoingMessage} res - * @param {number} status - * @param {string} body - * @api private - */ - -function send(req, res, status, body) { - function write() { - res.statusCode = status - res.setHeader('Content-Type', 'text/html; charset=utf-8') - res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8')) - - if (req.method === 'HEAD') { - res.end() - return - } - - res.end(body, 'utf8') - } - - if (!req.readable) { - write() - return - } - - // unpipe everything from the request - unpipe(req) - - // flush the request - req.once('end', write) - req.resume() -} - -/** - * Unpipe everything from a stream. - * - * @param {Object} stream - * @api private - */ - -/* istanbul ignore next: implementation differs between versions */ -function unpipe(stream) { - if (typeof stream.unpipe === 'function') { - // new-style - stream.unpipe() - return - } - - // Node.js 0.8 hack - var listener - var listeners = stream.listeners('close') - - for (var i = 0; i < listeners.length; i++) { - listener = listeners[i] - - if (listener.name !== 'cleanup' && listener.name !== 'onclose') { - continue - } - - // invoke the listener - listener.call(stream) - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/package.json deleted file mode 100644 index a690645..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "finalhandler", - "description": "Node.js final http responder", - "version": "0.1.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/finalhandler" - }, - "dependencies": { - "debug": "1.0.4", - "escape-html": "1.0.1" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.20.1", - "readable-stream": "~1.0.27", - "should": "~4.0.1", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/finalhandler/issues" - }, - "homepage": "https://github.com/expressjs/finalhandler", - "_id": "finalhandler@0.1.0", - "dist": { - "shasum": "da05bbc4f5f4a30c84ce1d91f3c154007c4e9daa", - "tarball": "http://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz" - }, - "_from": "finalhandler@0.1.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "da05bbc4f5f4a30c84ce1d91f3c154007c4e9daa", - "_resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/History.md deleted file mode 100644 index 12e1b3e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/History.md +++ /dev/null @@ -1,10 +0,0 @@ - -0.2.1 / 2014-01-29 -================== - - * fix: support max-age=0 for end-to-end revalidation - -0.2.0 / 2013-08-11 -================== - - * fix: return false for no-cache diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Readme.md deleted file mode 100644 index 61366c5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Readme.md +++ /dev/null @@ -1,57 +0,0 @@ - -# node-fresh - - HTTP response freshness testing - -## fresh(req, res) - - Check freshness of `req` and `res` headers. - - When the cache is "fresh" __true__ is returned, - otherwise __false__ is returned to indicate that - the cache is now stale. - -## Example: - -```js -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'luna' }; -fresh(req, res); -// => false - -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'tobi' }; -fresh(req, res); -// => true -``` - -## Installation - -``` -$ npm install fresh -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/index.js deleted file mode 100644 index 9c3f47d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/index.js +++ /dev/null @@ -1,53 +0,0 @@ - -/** - * Expose `fresh()`. - */ - -module.exports = fresh; - -/** - * Check freshness of `req` and `res` headers. - * - * When the cache is "fresh" __true__ is returned, - * otherwise __false__ is returned to indicate that - * the cache is now stale. - * - * @param {Object} req - * @param {Object} res - * @return {Boolean} - * @api public - */ - -function fresh(req, res) { - // defaults - var etagMatches = true; - var notModified = true; - - // fields - var modifiedSince = req['if-modified-since']; - var noneMatch = req['if-none-match']; - var lastModified = res['last-modified']; - var etag = res['etag']; - var cc = req['cache-control']; - - // unconditional request - if (!modifiedSince && !noneMatch) return false; - - // check for no-cache cache request directive - if (cc && cc.indexOf('no-cache') !== -1) return false; - - // parse if-none-match - if (noneMatch) noneMatch = noneMatch.split(/ *, */); - - // if-none-match - if (noneMatch) etagMatches = ~noneMatch.indexOf(etag) || '*' == noneMatch[0]; - - // if-modified-since - if (modifiedSince) { - modifiedSince = new Date(modifiedSince); - lastModified = new Date(lastModified); - notModified = lastModified <= modifiedSince; - } - - return !! (etagMatches && notModified); -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/package.json deleted file mode 100644 index bc9631a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "fresh", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "HTTP response freshness testing", - "version": "0.2.2", - "main": "index.js", - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-fresh.git" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/visionmedia/node-fresh/blob/master/Readme.md#license" - } - ], - "bugs": { - "url": "https://github.com/visionmedia/node-fresh/issues" - }, - "homepage": "https://github.com/visionmedia/node-fresh", - "_id": "fresh@0.2.2", - "dist": { - "shasum": "9731dcf5678c7faeb44fb903c4f72df55187fa77", - "tarball": "http://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz" - }, - "_from": "fresh@0.2.2", - "_npmVersion": "1.3.15", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "9731dcf5678c7faeb44fb903c4f72df55187fa77", - "_resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/HISTORY.md deleted file mode 100644 index 215cc22..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/HISTORY.md +++ /dev/null @@ -1,16 +0,0 @@ -0.2.0 / 2014-06-18 -================== - - * Add `typer.format()` to format media types - -0.1.0 / 2014-06-17 -================== - - * Accept `req` as argument to `parse` - * Accept `res` as argument to `parse` - * Parse media type with extra LWS between type and first parameter - -0.0.0 / 2014-06-13 -================== - - * Initial implementation diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/README.md deleted file mode 100644 index 338b7ce..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# media-typer - -[![NPM version](https://badge.fury.io/js/media-typer.svg)](https://badge.fury.io/js/media-typer) -[![Build Status](https://travis-ci.org/expressjs/media-typer.svg?branch=master)](https://travis-ci.org/expressjs/media-typer) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/media-typer.svg?branch=master)](https://coveralls.io/r/expressjs/media-typer) - -Simple RFC 6838 media type parser - -## Installation - -```sh -$ npm install media-typer -``` - -## API - -```js -var typer = require('media-typer') -``` - -### typer.parse(string) - -```js -var obj = typer.parse('image/svg+xml; charset=utf-8') -``` - -Parse a media type string. This will return an object with the following -properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`): - - - `type`: The type of the media type (always lower case). Example: `'image'` - - - `subtype`: The subtype of the media type (always lower case). Example: `'svg'` - - - `suffix`: The suffix of the media type (always lower case). Example: `'xml'` - - - `parameters`: An object of the parameters in the media type (name of parameter always lower case). Example: `{charset: 'utf-8'}` - -### typer.parse(req) - -```js -var obj = typer.parse(req) -``` - -Parse the `content-type` header from the given `req`. Short-cut for -`typer.parse(req.headers['content-type'])`. - -### typer.parse(res) - -```js -var obj = typer.parse(req) -``` - -Parse the `content-type` header set on the given `res`. Short-cut for -`typer.parse(res.getHeader('content-type'))`. - -### typer.format(obj) - -```js -var obj = typer.format({type: 'image', subtype: 'svg', suffix: 'xml'}) -``` - -Format an object into a media type string. This will return a string of the -mime type for the given object. For the properties of the object, see the -documentation for `typer.parse(string)`. - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/index.js deleted file mode 100644 index cbf2e17..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/index.js +++ /dev/null @@ -1,261 +0,0 @@ -/*! - * media-typer - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * RegExp to match *( ";" parameter ) in RFC 2616 sec 3.7 - * - * parameter = token "=" ( token | quoted-string ) - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) - * qdtext = > - * quoted-pair = "\" CHAR - * CHAR = - * TEXT = - * LWS = [CRLF] 1*( SP | HT ) - * CRLF = CR LF - * CR = - * LF = - * SP = - * SHT = - * CTL = - * OCTET = - */ -var paramRegExp = /; *([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *= *("(?:[ !\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u0020-\u007e])*"|[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) */g; -var textRegExp = /^[\u0020-\u007e\u0080-\u00ff]+$/ -var tokenRegExp = /^[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+$/ - -/** - * RegExp to match quoted-pair in RFC 2616 - * - * quoted-pair = "\" CHAR - * CHAR = - */ -var qescRegExp = /\\([\u0000-\u007f])/g; - -/** - * RegExp to match chars that must be quoted-pair in RFC 2616 - */ -var quoteRegExp = /([\\"])/g; - -/** - * RegExp to match type in RFC 6838 - * - * type-name = restricted-name - * subtype-name = restricted-name - * restricted-name = restricted-name-first *126restricted-name-chars - * restricted-name-first = ALPHA / DIGIT - * restricted-name-chars = ALPHA / DIGIT / "!" / "#" / - * "$" / "&" / "-" / "^" / "_" - * restricted-name-chars =/ "." ; Characters before first dot always - * ; specify a facet name - * restricted-name-chars =/ "+" ; Characters after last plus always - * ; specify a structured syntax suffix - * ALPHA = %x41-5A / %x61-7A ; A-Z / a-z - * DIGIT = %x30-39 ; 0-9 - */ -var subtypeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/ -var typeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/ -var typeRegExp = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/; - -/** - * Module exports. - */ - -exports.format = format -exports.parse = parse - -/** - * Format object to media type. - * - * @param {object} obj - * @return {string} - * @api public - */ - -function format(obj) { - if (!obj || typeof obj !== 'object') { - throw new TypeError('argument obj is required') - } - - var parameters = obj.parameters - var subtype = obj.subtype - var suffix = obj.suffix - var type = obj.type - - if (!type || !typeNameRegExp.test(type)) { - throw new TypeError('invalid type') - } - - if (!subtype || !subtypeNameRegExp.test(subtype)) { - throw new TypeError('invalid subtype') - } - - // format as type/subtype - var string = type + '/' + subtype - - // append +suffix - if (suffix) { - if (!typeNameRegExp.test(suffix)) { - throw new TypeError('invalid suffix') - } - - string += '+' + suffix - } - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - if (!tokenRegExp.test(param)) { - throw new TypeError('invalid parameter name') - } - - string += '; ' + param + '=' + qstring(parameters[param]) - } - } - - return string -} - -/** - * Parse media type to object. - * - * @param {string|object} string - * @return {Object} - * @api public - */ - -function parse(string) { - if (!string) { - throw new TypeError('argument string is required') - } - - // support req/res-like objects as argument - if (typeof string === 'object') { - string = getcontenttype(string) - } - - if (typeof string !== 'string') { - throw new TypeError('argument string is required to be a string') - } - - var index = string.indexOf(';') - var type = index !== -1 - ? string.substr(0, index) - : string - - var key - var match - var obj = splitType(type) - var params = {} - var value - - paramRegExp.lastIndex = index - - while (match = paramRegExp.exec(string)) { - key = match[1].toLowerCase() - value = match[2] - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(qescRegExp, '$1') - } - - params[key] = value - } - - obj.parameters = params - - return obj -} - -/** - * Get content-type from req/res objects. - * - * @param {object} - * @return {Object} - * @api private - */ - -function getcontenttype(obj) { - if (typeof obj.getHeader === 'function') { - // res-like - return obj.getHeader('content-type') - } - - if (typeof obj.headers === 'object') { - // req-like - return obj.headers && obj.headers['content-type'] - } -} - -/** - * Quote a string if necessary. - * - * @param {string} val - * @return {string} - * @api private - */ - -function qstring(val) { - var str = String(val) - - // no need to quote tokens - if (tokenRegExp.test(str)) { - return str - } - - if (str.length > 0 && !textRegExp.test(str)) { - throw new TypeError('invalid parameter value') - } - - return '"' + str.replace(quoteRegExp, '\\$1') + '"' -} - -/** - * Simply "type/subtype+siffx" into parts. - * - * @param {string} string - * @return {Object} - * @api private - */ - -function splitType(string) { - var match = typeRegExp.exec(string.toLowerCase()) - - if (!match) { - throw new TypeError('invalid media type') - } - - var type = match[1] - var subtype = match[2] - var suffix - - // suffix after last + - var index = subtype.lastIndexOf('+') - if (index !== -1) { - suffix = subtype.substr(index + 1) - subtype = subtype.substr(0, index) - } - - var obj = { - type: type, - subtype: subtype, - suffix: suffix - } - - return obj -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/package.json deleted file mode 100644 index 7ba61f9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "media-typer", - "description": "Simple RFC 6838 media type parser and formatter", - "version": "0.2.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/media-typer" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.1", - "should": "~4.0.4" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/media-typer/issues" - }, - "homepage": "https://github.com/expressjs/media-typer", - "_id": "media-typer@0.2.0", - "dist": { - "shasum": "d8a065213adfeaa2e76321a2b6dda36ff6335984", - "tarball": "http://registry.npmjs.org/media-typer/-/media-typer-0.2.0.tgz" - }, - "_from": "media-typer@0.2.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "d8a065213adfeaa2e76321a2b6dda36ff6335984", - "_resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/.npmignore deleted file mode 100644 index f62e605..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/.npmignore +++ /dev/null @@ -1,59 +0,0 @@ -# Compiled source # -################### -*.com -*.class -*.dll -*.exe -*.o -*.so - -# Packages # -############ -# it's better to unpack these files and commit the raw source -# git has its own built in compression methods -*.7z -*.dmg -*.gz -*.iso -*.jar -*.rar -*.tar -*.zip - -# Logs and databases # -###################### -*.log -*.sql -*.sqlite - -# OS generated files # -###################### -.DS_Store* -ehthumbs.db -Icon? -Thumbs.db - -# Node.js # -########### -lib-cov -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.gz - -pids -logs -results - -node_modules -npm-debug.log - -# Components # -############## - -/build -/components -/vendors \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/README.md deleted file mode 100644 index 50cf50c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Merge Descriptors [![Build Status](https://travis-ci.org/component/merge-descriptors.png)](https://travis-ci.org/component/merge-descriptors) - -Merge objects using descriptors. - -```js -var thing = { - get name() { - return 'jon' - } -} - -var animal = { - -} - -merge(animal, thing) - -animal.name === 'jon' -``` - -## API - -### merge(destination, source) - -Overwrites `destination`'s descriptors with `source`'s. - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/component.json deleted file mode 100644 index 7653906..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/component.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "merge-descriptors", - "description": "Merge objects using descriptors", - "version": "0.0.2", - "scripts": [ - "index.js" - ], - "repo": "component/merge-descriptors", - "license": "MIT" -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/index.js deleted file mode 100644 index e4e2379..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/index.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = function (dest, src) { - Object.getOwnPropertyNames(src).forEach(function (name) { - var descriptor = Object.getOwnPropertyDescriptor(src, name) - Object.defineProperty(dest, name, descriptor) - }) - - return dest -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/package.json deleted file mode 100644 index b1b83d4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "merge-descriptors", - "description": "Merge objects using descriptors", - "version": "0.0.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/component/merge-descriptors.git" - }, - "bugs": { - "url": "https://github.com/component/merge-descriptors/issues" - }, - "scripts": { - "test": "make test;" - }, - "homepage": "https://github.com/component/merge-descriptors", - "_id": "merge-descriptors@0.0.2", - "dist": { - "shasum": "c36a52a781437513c57275f39dd9d317514ac8c7", - "tarball": "http://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz" - }, - "_from": "merge-descriptors@0.0.2", - "_npmVersion": "1.3.17", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "directories": {}, - "_shasum": "c36a52a781437513c57275f39dd9d317514ac8c7", - "_resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/.npmignore deleted file mode 100644 index c2658d7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/History.md deleted file mode 100644 index d3996c2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/History.md +++ /dev/null @@ -1,20 +0,0 @@ - -1.1.0 / 2014-07-05 -================== - - * add CONNECT - -1.0.1 / 2014-06-02 -================== - - * fix index.js to work with harmony transform - -1.0.0 / 2014-05-08 -================== - - * add PURGE. Closes #9 - -0.1.0 / 2013-10-28 -================== - - * add http.METHODS support diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/LICENSE deleted file mode 100644 index 8bce401..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2013-2014 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. - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/Readme.md deleted file mode 100644 index ac0658e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/Readme.md +++ /dev/null @@ -1,4 +0,0 @@ - -# Methods - - HTTP verbs that node core's parser supports. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/index.js deleted file mode 100644 index f7e3c48..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/index.js +++ /dev/null @@ -1,41 +0,0 @@ - -var http = require('http'); - -if (http.METHODS) { - - module.exports = http.METHODS.map(function(method){ - return method.toLowerCase(); - }); - -} else { - - module.exports = [ - 'get', - 'post', - 'put', - 'head', - 'delete', - 'options', - 'trace', - 'copy', - 'lock', - 'mkcol', - 'move', - 'purge', - 'propfind', - 'proppatch', - 'unlock', - 'report', - 'mkactivity', - 'checkout', - 'merge', - 'm-search', - 'notify', - 'subscribe', - 'unsubscribe', - 'patch', - 'search', - 'connect' - ]; - -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/package.json deleted file mode 100644 index 8d1c198..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "methods", - "version": "1.1.0", - "description": "HTTP methods that node supports", - "main": "index.js", - "scripts": { - "test": "./node_modules/mocha/bin/mocha" - }, - "keywords": [ - "http", - "methods" - ], - "author": { - "name": "TJ Holowaychuk" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/node-methods.git" - }, - "devDependencies": { - "mocha": "1.17.x" - }, - "gitHead": "2a4dd325d18436c33356e6be19e32e08a7c877ab", - "bugs": { - "url": "https://github.com/visionmedia/node-methods/issues" - }, - "homepage": "https://github.com/visionmedia/node-methods", - "_id": "methods@1.1.0", - "_shasum": "5dca4ee12df52ff3b056145986a8f01cbc86436f", - "_from": "methods@1.1.0", - "_npmVersion": "1.4.16", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "5dca4ee12df52ff3b056145986a8f01cbc86436f", - "tarball": "http://registry.npmjs.org/methods/-/methods-1.1.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/test/methods.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/test/methods.js deleted file mode 100644 index 527beab..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/test/methods.js +++ /dev/null @@ -1,33 +0,0 @@ -var http = require('http'); -var assert = require('assert'); -var methods = require('..'); - -describe('methods', function() { - - if (http.METHODS) { - - it('is a lowercased http.METHODS', function() { - var lowercased = http.METHODS.map(function(method) { - return method.toLowerCase(); - }); - assert.deepEqual(lowercased, methods); - }); - - } else { - - it('contains GET, POST, PUT, and DELETE', function() { - assert.notEqual(methods.indexOf('get'), -1); - assert.notEqual(methods.indexOf('post'), -1); - assert.notEqual(methods.indexOf('put'), -1); - assert.notEqual(methods.indexOf('delete'), -1); - }); - - it('is all lowercase', function() { - for (var i = 0; i < methods.length; i ++) { - assert(methods[i], methods[i].toLowerCase(), methods[i] + " isn't all lowercase"); - } - }); - - } - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/.npmignore deleted file mode 100644 index 85c82a5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -benchmark/ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/HISTORY.md deleted file mode 100644 index cf36864..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/HISTORY.md +++ /dev/null @@ -1,36 +0,0 @@ -1.2.0 / 2014-07-21 -================== - - * Cache URLs based on original value - * Remove no-longer-needed URL mis-parse work-around - * Simplify the "fast-path" `RegExp` - -1.1.3 / 2014-07-08 -================== - - * Fix typo - -1.1.2 / 2014-07-08 -================== - - * Seriously fix Node.js 0.8 compatibility - -1.1.1 / 2014-07-08 -================== - - * Fix Node.js 0.8 compatibility - -1.1.0 / 2014-07-08 -================== - - * Incorporate URL href-only parse fast-path - -1.0.1 / 2014-03-08 -================== - - * Add missing `require` - -1.0.0 / 2014-03-08 -================== - - * Genesis from `connect` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/LICENSE deleted file mode 100644 index 991dc7d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ - -(The MIT License) - -Copyright (c) 2014 Jonathan Ong - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/README.md deleted file mode 100644 index 91a70db..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/README.md +++ /dev/null @@ -1,99 +0,0 @@ -# parseurl - -[![NPM version](https://badge.fury.io/js/parseurl.svg)](http://badge.fury.io/js/parseurl) -[![Build Status](https://travis-ci.org/expressjs/parseurl.svg?branch=master)](https://travis-ci.org/expressjs/parseurl) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/parseurl.svg?branch=master)](https://coveralls.io/r/expressjs/parseurl) - -Parse a URL with memoization. - -## Install - -```bash -$ npm install parseurl -``` - -## API - -```js -var parseurl = require('parseurl') -``` - -### parseurl(req) - -Parse the URL of the given request object (looks at the `req.url` property) -and return the result. The result is the same as `url.parse` in Node.js core. -Calling this function multiple times on the same `req` where `req.url` does -not change will return a cached parsed object, rather than parsing again. - -## Benchmark - -```bash -$ npm run-script bench - -> parseurl@1.2.0 bench nodejs-parseurl -> node benchmark/index.js - -> node benchmark/fullurl.js - - Parsing URL "http://localhost:8888/foo/bar?user=tj&pet=fluffy" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 1,290,780 ops/sec ±0.46% (195 runs sampled) - nativeurl x 56,401 ops/sec ±0.22% (196 runs sampled) - parseurl x 55,231 ops/sec ±0.22% (194 runs sampled) - -> node benchmark/pathquery.js - - Parsing URL "/foo/bar?user=tj&pet=fluffy" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 1,986,668 ops/sec ±0.27% (190 runs sampled) - nativeurl x 98,740 ops/sec ±0.21% (195 runs sampled) - parseurl x 2,628,171 ops/sec ±0.36% (195 runs sampled) - -> node benchmark/samerequest.js - - Parsing URL "/foo/bar?user=tj&pet=fluffy" on same request object - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 2,184,468 ops/sec ±0.40% (194 runs sampled) - nativeurl x 99,437 ops/sec ±0.71% (194 runs sampled) - parseurl x 10,498,005 ops/sec ±0.61% (186 runs sampled) - -> node benchmark/simplepath.js - - Parsing URL "/foo/bar" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 4,535,825 ops/sec ±0.27% (191 runs sampled) - nativeurl x 98,769 ops/sec ±0.54% (191 runs sampled) - parseurl x 4,164,865 ops/sec ±0.34% (192 runs sampled) - -> node benchmark/slash.js - - Parsing URL "/" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 4,908,405 ops/sec ±0.42% (191 runs sampled) - nativeurl x 100,945 ops/sec ±0.59% (188 runs sampled) - parseurl x 4,333,208 ops/sec ±0.27% (194 runs sampled) -``` - -## License - - [MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/index.js deleted file mode 100644 index 41e6d00..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/index.js +++ /dev/null @@ -1,87 +0,0 @@ - -/** - * Module dependencies. - */ - -var url = require('url') -var parse = url.parse -var Url = url.Url - -/** - * Pattern for a simple path case. - * See: https://github.com/joyent/node/pull/7878 - */ - -var simplePathRegExp = /^(\/\/?(?!\/)[^\?#\s]*)(\?[^#\s]*)?$/ - -/** - * Parse the `req` url with memoization. - * - * @param {ServerRequest} req - * @return {Object} - * @api public - */ - -module.exports = function parseUrl(req){ - var parsed = req._parsedUrl - var url = req.url - - if (fresh(url, parsed)) { - // Return cached URL parse - return parsed - } - - // Parse the URL - parsed = fastparse(url) - parsed._raw = url - - return req._parsedUrl = parsed -}; - -/** - * Parse the `str` url with fast-path short-cut. - * - * @param {string} str - * @return {Object} - * @api private - */ - -function fastparse(str) { - // Try fast path regexp - // See: https://github.com/joyent/node/pull/7878 - var simplePath = typeof str === 'string' && simplePathRegExp.exec(str) - - // Construct simple URL - if (simplePath) { - var pathname = simplePath[1] - var search = simplePath[2] || null - var url = Url !== undefined - ? new Url() - : {} - url.path = str - url.href = str - url.pathname = pathname - url.search = search - url.query = search && search.substr(1) - - return url - } - - return parse(str) -} - -/** - * Determine if parsed is still fresh for url. - * - * @param {string} url - * @param {object} parsedUrl - * @return {boolean} - * @api private - */ - -function fresh(url, parsedUrl) { - return typeof parsedUrl === 'object' - && parsedUrl !== null - && (Url === undefined || parsedUrl instanceof Url) - && parsedUrl._raw === url -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/package.json deleted file mode 100644 index 5c8e842..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "parseurl", - "description": "parse a url with memoization", - "version": "1.2.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/parseurl" - }, - "license": "MIT", - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "fast-url-parser": "~1.0.0", - "istanbul": "0.3.0", - "mocha": "~1.20.0" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --check-leaks --bail --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/parseurl/issues" - }, - "homepage": "https://github.com/expressjs/parseurl", - "_id": "parseurl@1.2.0", - "dist": { - "shasum": "be7df2d698eb49ffb10ea62939693e152991c008", - "tarball": "http://registry.npmjs.org/parseurl/-/parseurl-1.2.0.tgz" - }, - "_from": "parseurl@>=1.2.0-0 <1.3.0-0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "be7df2d698eb49ffb10ea62939693e152991c008", - "_resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/.npmignore deleted file mode 100644 index ba2a97b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -coverage diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/History.md deleted file mode 100644 index f962cfa..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/History.md +++ /dev/null @@ -1,16 +0,0 @@ -0.1.3 / 2014-07-06 -================== - - * Better array support - * Improved support for trailing slash in non-ending mode - -0.1.0 / 2014-03-06 -================== - - * add options.end - -0.0.2 / 2013-02-10 -================== - - * Update to match current express - * add .license property to component.json diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/Readme.md deleted file mode 100644 index 9199e38..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/Readme.md +++ /dev/null @@ -1,33 +0,0 @@ - -# Path-to-RegExp - - Turn an Express-style path string such as `/user/:name` into a regular expression. - -## Usage - -```javascript -var pathToRegexp = require('path-to-regexp'); -``` -### pathToRegexp(path, keys, options) - - - **path** A string in the express format, an array of such strings, or a regular expression - - **keys** An array to be populated with the keys present in the url. Once the function completes, this will be an array of strings. - - **options** - - **options.sensitive** Defaults to false, set this to true to make routes case sensitive - - **options.strict** Defaults to false, set this to true to make the trailing slash matter. - - **options.end** Defaults to true, set this to false to only match the prefix of the URL. - -```javascript -var keys = []; -var exp = pathToRegexp('/foo/:bar', keys); -//keys = ['bar'] -//exp = /^\/foo\/(?:([^\/]+?))\/?$/i -``` - -## Live Demo - -You can see a live demo of this library in use at [express-route-tester](http://forbeslindesay.github.com/express-route-tester/). - -## License - - MIT \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/component.json deleted file mode 100644 index 6ab37d3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/component.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "path-to-regexp", - "description": "Express style path to RegExp utility", - "version": "0.1.3", - "keywords": [ - "express", - "regexp", - "route", - "routing" - ], - "scripts": [ - "index.js" - ], - "license": "MIT" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/index.js deleted file mode 100644 index 2801f91..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/index.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Expose `pathtoRegexp`. - */ - -module.exports = pathtoRegexp; - -/** - * Normalize the given path string, - * returning a regular expression. - * - * An empty array should be passed, - * which will contain the placeholder - * key names. For example "/user/:id" will - * then contain ["id"]. - * - * @param {String|RegExp|Array} path - * @param {Array} keys - * @param {Object} options - * @return {RegExp} - * @api private - */ - -function pathtoRegexp(path, keys, options) { - options = options || {}; - var strict = options.strict; - var end = options.end !== false; - var flags = options.sensitive ? '' : 'i'; - keys = keys || []; - - if (path instanceof RegExp) { - return path; - } - - if (Array.isArray(path)) { - // Map array parts into regexps and return their source. We also pass - // the same keys and options instance into every generation to get - // consistent matching groups before we join the sources together. - path = path.map(function (value) { - return pathtoRegexp(value, keys, options).source; - }); - - return new RegExp('(?:' + path.join('|') + ')', flags); - } - - path = ('^' + path + (strict ? '' : path[path.length - 1] === '/' ? '?' : '/?')) - .replace(/\/\(/g, '/(?:') - .replace(/([\/\.])/g, '\\$1') - .replace(/(\\\/)?(\\\.)?:(\w+)(\(.*?\))?(\*)?(\?)?/g, function (match, slash, format, key, capture, star, optional) { - slash = slash || ''; - format = format || ''; - capture = capture || '([^\\/' + format + ']+?)'; - optional = optional || ''; - - keys.push({ name: key, optional: !!optional }); - - return '' - + (optional ? '' : slash) - + '(?:' - + format + (optional ? slash : '') + capture - + (star ? '((?:[\\/' + format + '].+?)?)' : '') - + ')' - + optional; - }) - .replace(/\*/g, '(.*)'); - - // If the path is non-ending, match until the end or a slash. - path += (end ? '$' : (path[path.length - 1] === '/' ? '' : '(?=\\/|$)')); - - return new RegExp(path, flags); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/package.json deleted file mode 100644 index bccfe25..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/package.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "name": "path-to-regexp", - "description": "Express style path to RegExp utility", - "version": "0.1.3", - "scripts": { - "test": "istanbul cover _mocha -- -R spec" - }, - "keywords": [ - "express", - "regexp" - ], - "component": { - "scripts": { - "path-to-regexp": "index.js" - } - }, - "repository": { - "type": "git", - "url": "https://github.com/component/path-to-regexp.git" - }, - "devDependencies": { - "mocha": "^1.17.1", - "istanbul": "^0.2.6" - }, - "bugs": { - "url": "https://github.com/component/path-to-regexp/issues" - }, - "homepage": "https://github.com/component/path-to-regexp", - "_id": "path-to-regexp@0.1.3", - "_shasum": "21b9ab82274279de25b156ea08fd12ca51b8aecb", - "_from": "path-to-regexp@0.1.3", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dominicbarnes", - "email": "dominic@dbarnes.info" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - { - "name": "retrofox", - "email": "rdsuarez@gmail.com" - }, - { - "name": "coreh", - "email": "thecoreh@gmail.com" - }, - { - "name": "forbeslindesay", - "email": "forbes@lindesay.co.uk" - }, - { - "name": "kelonye", - "email": "kelonyemitchel@gmail.com" - }, - { - "name": "mattmueller", - "email": "mattmuelle@gmail.com" - }, - { - "name": "yields", - "email": "yields@icloud.com" - }, - { - "name": "anthonyshort", - "email": "antshort@gmail.com" - }, - { - "name": "ianstormtaylor", - "email": "ian@ianstormtaylor.com" - }, - { - "name": "cristiandouce", - "email": "cristian@gravityonmars.com" - }, - { - "name": "swatinem", - "email": "arpad.borsos@googlemail.com" - }, - { - "name": "stagas", - "email": "gstagas@gmail.com" - }, - { - "name": "amasad", - "email": "amjad.masad@gmail.com" - }, - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "calvinfo", - "email": "calvin@calv.info" - }, - { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - { - "name": "timoxley", - "email": "secoif@gmail.com" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "queckezz", - "email": "fabian.eichenberger@gmail.com" - }, - { - "name": "nami-doc", - "email": "vendethiel@hotmail.fr" - }, - { - "name": "clintwood", - "email": "clint@anotherway.co.za" - }, - { - "name": "thehydroimpulse", - "email": "dnfagnan@gmail.com" - }, - { - "name": "stephenmathieson", - "email": "me@stephenmathieson.com" - }, - { - "name": "trevorgerhardt", - "email": "trevorgerhardt@gmail.com" - } - ], - "dist": { - "shasum": "21b9ab82274279de25b156ea08fd12ca51b8aecb", - "tarball": "http://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/test.js deleted file mode 100644 index 4a0c270..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/test.js +++ /dev/null @@ -1,616 +0,0 @@ -var pathToRegExp = require('./'); -var assert = require('assert'); - -describe('path-to-regexp', function () { - describe('strings', function () { - it('should match simple paths', function () { - var params = []; - var m = pathToRegExp('/test', params).exec('/test'); - - assert.equal(params.length, 0); - - assert.equal(m.length, 1); - assert.equal(m[0], '/test'); - }); - - it('should match express format params', function () { - var params = []; - var m = pathToRegExp('/:test', params).exec('/pathname'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/pathname'); - assert.equal(m[1], 'pathname'); - }); - - it('should do strict matches', function () { - var params = []; - var re = pathToRegExp('/:test', params, { strict: true }); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/route'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - - m = re.exec('/route/'); - - assert.ok(!m); - }); - - it('should do strict matches with trailing slashes', function () { - var params = []; - var re = pathToRegExp('/:test/', params, { strict: true }); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/route'); - - assert.ok(!m); - - m = re.exec('/route/'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route/'); - assert.equal(m[1], 'route'); - - m = re.exec('/route//'); - - assert.ok(!m); - }); - - it('should allow optional express format params', function () { - var params = []; - var re = pathToRegExp('/:test?', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, true); - - m = re.exec('/route'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - - m = re.exec('/'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/'); - assert.equal(m[1], undefined); - }); - - it('should allow express format param regexps', function () { - var params = []; - var m = pathToRegExp('/:page(\\d+)', params).exec('/56'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'page'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/56'); - assert.equal(m[1], '56'); - }); - - it('should match without a prefixed slash', function () { - var params = []; - var m = pathToRegExp(':test', params).exec('string'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], 'string'); - assert.equal(m[1], 'string'); - }); - - it('should not match format parts', function () { - var params = []; - var m = pathToRegExp('/:test.json', params).exec('/route.json'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - }); - - it('should match format parts', function () { - var params = []; - var re = pathToRegExp('/:test.:format', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, false); - - m = re.exec('/route.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - assert.equal(m[2], 'json'); - - m = re.exec('/route'); - - assert.ok(!m); - }); - - it('should match route parts with a trailing format', function () { - var params = []; - var m = pathToRegExp('/:test.json', params).exec('/route.json'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - }); - - it('should match optional trailing routes', function () { - var params = []; - var m = pathToRegExp('/test*', params).exec('/test/route'); - - assert.equal(params.length, 0); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test/route'); - assert.equal(m[1], '/route'); - }); - - it('should match optional trailing routes after a param', function () { - var params = []; - var re = pathToRegExp('/:test*', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/test/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/route'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - - m = re.exec('/testing'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/testing'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - }); - - it('should match optional trailing routes before a format', function () { - var params = []; - var re = pathToRegExp('/test*.json', params); - var m; - - assert.equal(params.length, 0); - - m = re.exec('/test.json'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test.json'); - assert.equal(m[1], ''); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'ing'); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], '/route'); - }); - - it('should match optional trailing routes after a param and before a format', function () { - var params = []; - var re = pathToRegExp('/:test*.json', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - - m = re.exec('.json'); - - assert.ok(!m); - }); - - it('should match optional trailing routes between a normal param and a format param', function () { - var params = []; - var re = pathToRegExp('/:test*.:format', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, false); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - assert.equal(m[3], 'json'); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - assert.equal(m[3], 'json'); - - m = re.exec('/test'); - - assert.ok(!m); - - m = re.exec('.json'); - - assert.ok(!m); - }); - - it('should match optional trailing routes after a param and before an optional format param', function () { - var params = []; - var re = pathToRegExp('/:test*.:format?', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, true); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - assert.equal(m[3], 'json'); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - assert.equal(m[3], 'json'); - - m = re.exec('/test'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/test'); - assert.equal(m[1], 'test'); - assert.equal(m[2], ''); - assert.equal(m[3], undefined); - - m = re.exec('.json'); - - assert.ok(!m); - }); - - it('should match optional trailing routes inside optional express param', function () { - var params = []; - var re = pathToRegExp('/:test*?', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, true); - - m = re.exec('/test/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/route'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - - m = re.exec('/test'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test'); - assert.equal(m[1], 'test'); - assert.equal(m[2], ''); - - m = re.exec('/'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/'); - assert.equal(m[1], undefined); - assert.equal(m[2], undefined); - }); - - it('should do case insensitive matches', function () { - var m = pathToRegExp('/test').exec('/TEST'); - - assert.equal(m[0], '/TEST'); - }); - - it('should do case sensitive matches', function () { - var re = pathToRegExp('/test', null, { sensitive: true }); - var m; - - m = re.exec('/test'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/test'); - - m = re.exec('/TEST'); - - assert.ok(!m); - }); - - it('should do non-ending matches', function () { - var params = []; - var m = pathToRegExp('/:test', params, { end: false }).exec('/test/route'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test'); - assert.equal(m[1], 'test'); - }); - - it('should match trailing slashes in non-ending non-strict mode', function () { - var params = []; - var re = pathToRegExp('/:test', params, { end: false }); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/test/'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test/'); - assert.equal(m[1], 'test'); - }); - - it('should match trailing slashes in non-ending non-strict mode', function () { - var params = []; - var re = pathToRegExp('/route/', params, { end: false }); - var m; - - assert.equal(params.length, 0); - - m = re.exec('/route/'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - - m = re.exec('/route/test'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route'); - - m = re.exec('/route'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route'); - - m = re.exec('/route//'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - }); - - it('should match trailing slashing in non-ending strict mode', function () { - var params = []; - var re = pathToRegExp('/route/', params, { end: false, strict: true }); - - assert.equal(params.length, 0); - - m = re.exec('/route/'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - - m = re.exec('/route/test'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - - m = re.exec('/route'); - - assert.ok(!m); - - m = re.exec('/route//'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - }); - - it('should not match trailing slashes in non-ending strict mode', function () { - var params = []; - var re = pathToRegExp('/route', params, { end: false, strict: true }); - - assert.equal(params.length, 0); - - m = re.exec('/route'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route'); - - m = re.exec('/route/'); - - assert.ok(m.length, 1); - assert.equal(m[0], '/route'); - }); - - it('should match text after an express param', function () { - var params = []; - var re = pathToRegExp('/(:test)route', params); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/route'); - - assert.ok(!m); - - m = re.exec('/testroute'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/testroute'); - assert.equal(m[1], 'test'); - - m = re.exec('testroute'); - - assert.ok(!m); - }); - - it('should match text after an optional express param', function () { - var params = []; - var re = pathToRegExp('/(:test?)route', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, true); - - m = re.exec('/route'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route'); - assert.equal(m[1], undefined); - - m = re.exec('/testroute'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/testroute'); - assert.equal(m[1], 'test'); - - m = re.exec('route'); - - assert.ok(!m); - }); - - it('should match optional formats', function () { - var params = []; - var re = pathToRegExp('/:test.:format?', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, true); - - m = re.exec('/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - assert.equal(m[2], undefined); - - m = re.exec('/route.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - assert.equal(m[2], 'json'); - }); - - it('should match full paths with format by default', function () { - var params = []; - var m = pathToRegExp('/:test', params).exec('/test.json'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test.json'); - assert.equal(m[1], 'test.json'); - }); - }); - - describe('regexps', function () { - it('should return the regexp', function () { - assert.deepEqual(pathToRegExp(/.*/), /.*/); - }); - }); - - describe('arrays', function () { - it('should join arrays parts', function () { - var re = pathToRegExp(['/test', '/route']); - - assert.ok(re.test('/test')); - assert.ok(re.test('/route')); - assert.ok(!re.test('/else')); - }); - - it('should match parts properly', function () { - var params = []; - var re = pathToRegExp(['/:test', '/test/:route'], params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'route'); - assert.equal(params[1].optional, false); - - m = re.exec('/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - assert.equal(m[2], undefined); - - m = re.exec('/test/path'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/path'); - assert.equal(m[1], undefined); - assert.equal(m[2], 'path'); - }); - }); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/.npmignore deleted file mode 100644 index 85c82a5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -benchmark/ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/History.md deleted file mode 100644 index 61a0d50..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/History.md +++ /dev/null @@ -1,27 +0,0 @@ -1.0.1 / 2014-06-03 -================== - - * Fix links in npm package - -1.0.0 / 2014-05-08 -================== - - * Add `trust` argument to determine proxy trust on - * Accepts custom function - * Accepts IPv4/IPv6 address(es) - * Accepts subnets - * Accepts pre-defined names - * Add optional `trust` argument to `proxyaddr.all` to - stop at first untrusted - * Add `proxyaddr.compile` to pre-compile `trust` function - to make subsequent calls faster - -0.0.1 / 2014-05-04 -================== - - * Fix bad npm publish - -0.0.0 / 2014-05-04 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/README.md deleted file mode 100644 index 4fe57d3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# proxy-addr - -[![NPM version](https://badge.fury.io/js/proxy-addr.svg)](http://badge.fury.io/js/proxy-addr) -[![Build Status](https://travis-ci.org/expressjs/proxy-addr.svg?branch=master)](https://travis-ci.org/expressjs/proxy-addr) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/proxy-addr.svg?branch=master)](https://coveralls.io/r/expressjs/proxy-addr) - -Determine address of proxied request - -## Install - -```sh -$ npm install proxy-addr -``` - -## API - -```js -var proxyaddr = require('proxy-addr') -``` - -### proxyaddr(req, trust) - -Return the address of the request, using the given `trust` parameter. - -The `trust` argument is a function that returns `true` if you trust -the address, `false` if you don't. The closest untrusted address is -returned. - -```js -proxyaddr(req, function(addr){ return addr === '127.0.0.1' }) -proxyaddr(req, function(addr, i){ return i < 1 }) -``` - -The `trust` arugment may also be a single IP address string or an -array of trusted addresses, as plain IP addresses, CIDR-formatted -strings, or IP/netmask strings. - -```js -proxyaddr(req, '127.0.0.1') -proxyaddr(req, ['127.0.0.0/8', '10.0.0.0/8']) -proxyaddr(req, ['127.0.0.0/255.0.0.0', '192.168.0.0/255.255.0.0']) -``` - -This module also supports IPv6. Your IPv6 addresses will be normalized -automatically (i.e. `fe80::00ed:1` equals `fe80:0:0:0:0:0:ed:1`). - -```js -proxyaddr(req, '::1') -proxyaddr(req, ['::1/128', 'fe80::/10']) -proxyaddr(req, ['fe80::/ffc0::']) -``` - -This module will automatically work with IPv4-mapped IPv6 addresses -as well to support node.js in IPv6-only mode. This means that you do -not have to specify both `::ffff:a00:1` and `10.0.0.1`. - -As a convenience, this module also takes certain pre-defined names -in addition to IP addresses, which expand into IP addresses: - -```js -proxyaddr(req, 'loopback') -proxyaddr(req, ['loopback', 'fc00:ac:1ab5:fff::1/64']) -``` - - * `loopback`: IPv4 and IPv6 loopback addresses (like `::1` and - `127.0.0.1`). - * `linklocal`: IPv4 and IPv6 link-local addresses (like - `fe80::1:1:1:1` and `169.254.0.1`). - * `uniquelocal`: IPv4 private addresses and IPv6 unique-local - addresses (like `fc00:ac:1ab5:fff::1` and `192.168.0.1`). - -When `trust` is specified as a function, it will be called for each -address to determine if it is a trusted address. The function is -given two arguments: `addr` and `i`, where `addr` is a string of -the address to check and `i` is a number that represents the distance -from the socket address. - -### proxyaddr.all(req, [trust]) - -Return all the addresses of the request, optionally stopping at the -first untrusted. This array is ordered from closest to furthest -(i.e. `arr[0] === req.connection.remoteAddress`). - -```js -proxyaddr.all(req) -``` - -The optional `trust` argument takes the same arguments as `trust` -does in `proxyaddr(req, trust)`. - -```js -proxyaddr.all(req, 'loopback') -``` - -### proxyaddr.compile(val) - -Compiles argument `val` into a `trust` function. This function takes -the same arguments as `trust` does in `proxyaddr(req, trust)` and -returns a function suitable for `proxyaddr(req, trust)`. - -```js -var trust = proxyaddr.compile('localhost') -var addr = proxyaddr(req, trust) -``` - -This function is meant to be optimized for use against every request. -It is recommend to compile a trust function up-front for the trusted -configuration and pass that to `proxyaddr(req, trust)` for each request. - -## Testing - -```sh -$ npm test -``` - -## Benchmarks - -```sh -$ npm run-script bench -``` - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/index.js deleted file mode 100644 index 75ee432..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/index.js +++ /dev/null @@ -1,353 +0,0 @@ -/*! - * proxy-addr - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = proxyaddr; -module.exports.all = alladdrs; -module.exports.compile = compile; - -/** - * Module dependencies. - */ - -var ipaddr = require('ipaddr.js'); - -/** - * Variables. - */ - -var digitre = /^[0-9]+$/; -var isip = ipaddr.isValid; -var parseip = ipaddr.parse; - -/** - * Pre-defined IP ranges. - */ - -var ipranges = { - linklocal: ['169.254.0.0/16', 'fe80::/10'], - loopback: ['127.0.0.1/8', '::1/128'], - uniquelocal: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fc00::/7'] -}; - -/** - * Get all addresses in the request, optionally stopping - * at the first untrusted. - * - * @param {Object} request - * @param {Function|Array|String} [trust] - * @api public - */ - -function alladdrs(req, trust) { - if (!req) { - throw new TypeError('req argument is required'); - } - - var proxyAddrs = (req.headers['x-forwarded-for'] || '') - .split(/ *, */) - .filter(Boolean) - .reverse(); - var socketAddr = req.connection.remoteAddress; - var addrs = [socketAddr].concat(proxyAddrs); - - if (!trust) { - // Return all addresses - return addrs; - } - - if (typeof trust !== 'function') { - trust = compile(trust); - } - - for (var i = 0; i < addrs.length - 1; i++) { - if (trust(addrs[i], i)) continue; - - addrs.length = i + 1; - } - - return addrs; -} - -/** - * Compile argument into trust function. - * - * @param {Array|String} val - * @api private - */ - -function compile(val) { - if (!val) { - throw new TypeError('argument is required'); - } - - var trust = typeof val === 'string' - ? [val] - : val; - - if (!Array.isArray(trust)) { - throw new TypeError('unsupported trust argument'); - } - - for (var i = 0; i < trust.length; i++) { - val = trust[i]; - - if (!ipranges.hasOwnProperty(val)) { - continue; - } - - // Splice in pre-defined range - val = ipranges[val]; - trust.splice.apply(trust, [i, 1].concat(val)); - i += val.length - 1; - } - - return compileTrust(compileRangeSubnets(trust)); -} - -/** - * Compile `arr` elements into range subnets. - * - * @param {Array} arr - * @api private - */ - -function compileRangeSubnets(arr) { - var rangeSubnets = new Array(arr.length); - - for (var i = 0; i < arr.length; i++) { - rangeSubnets[i] = parseipNotation(arr[i]); - } - - return rangeSubnets; -} - -/** - * Compile range subnet array into trust function. - * - * @param {Array} rangeSubnets - * @api private - */ - -function compileTrust(rangeSubnets) { - // Return optimized function based on length - var len = rangeSubnets.length; - return len === 0 - ? trustNone - : len === 1 - ? trustSingle(rangeSubnets[0]) - : trustMulti(rangeSubnets); -} - -/** - * Parse IP notation string into range subnet. - * - * @param {String} note - * @api private - */ - -function parseipNotation(note) { - var ip; - var kind; - var max; - var pos = note.lastIndexOf('/'); - var range; - - ip = pos !== -1 - ? note.substring(0, pos) - : note; - - if (!isip(ip)) { - throw new TypeError('invalid IP address: ' + ip); - } - - ip = parseip(ip); - - kind = ip.kind(); - max = kind === 'ipv4' ? 32 - : kind === 'ipv6' ? 128 - : 0; - - range = pos !== -1 - ? note.substring(pos + 1, note.length) - : max; - - if (typeof range !== 'number') { - range = digitre.test(range) - ? parseInt(range, 10) - : isip(range) - ? parseNetmask(range) - : 0; - } - - if (ip.kind() === 'ipv6' && ip.isIPv4MappedAddress()) { - // Store as IPv4 - ip = ip.toIPv4Address(); - range = range <= max - ? range - 96 - : range; - } - - if (range <= 0 || range > max) { - throw new TypeError('invalid range on address: ' + note); - } - - return [ip, range]; -} - -/** - * Parse netmask string into CIDR range. - * - * @param {String} note - * @api private - */ - -function parseNetmask(netmask) { - var ip = parseip(netmask); - var parts; - var size; - - switch (ip.kind()) { - case 'ipv4': - parts = ip.octets; - size = 8; - break; - case 'ipv6': - parts = ip.parts; - size = 16; - break; - default: - throw new TypeError('unknown netmask'); - } - - var max = Math.pow(2, size) - 1; - var part; - var range = 0; - - for (var i = 0; i < parts.length; i++) { - part = parts[i] & max; - - if (part === max) { - range += size; - continue; - } - - while (part) { - part = (part << 1) & max; - range += 1; - } - - break; - } - - return range; -} - -/** - * Determine address of proxied request. - * - * @param {Object} request - * @param {Function|Array|String} trust - * @api public - */ - -function proxyaddr(req, trust) { - if (!req) { - throw new TypeError('req argument is required'); - } - - if (!trust) { - throw new TypeError('trust argument is required'); - } - - var addrs = alladdrs(req, trust); - var addr = addrs[addrs.length - 1]; - - return addr; -} - -/** - * Static trust function to trust nothing. - * - * @api private - */ - -function trustNone() { - return false; -} - -/** - * Compile trust function for multiple subnets. - * - * @param {Array} subnets - * @api private - */ - -function trustMulti(subnets) { - return function trust(addr) { - if (!isip(addr)) return false; - - var ip = parseip(addr); - var ipv4; - var kind = ip.kind(); - var subnet; - var subnetip; - var subnetkind; - var trusted; - - for (var i = 0; i < subnets.length; i++) { - subnet = subnets[i]; - subnetip = subnet[0]; - subnetkind = subnetip.kind(); - subnetrange = subnet[1]; - trusted = ip; - - if (kind !== subnetkind) { - if (kind !== 'ipv6' || subnetkind !== 'ipv4' || !ip.isIPv4MappedAddress()) { - continue; - } - - // Store addr as IPv4 - ipv4 = ipv4 || ip.toIPv4Address(); - trusted = ipv4; - } - - if (trusted.match(subnetip, subnetrange)) return true; - } - - return false; - }; -} - -/** - * Compile trust function for single subnet. - * - * @param {Object} subnet - * @api private - */ - -function trustSingle(subnet) { - var subnetip = subnet[0]; - var subnetkind = subnetip.kind(); - var subnetisipv4 = subnetkind === 'ipv4'; - var subnetrange = subnet[1]; - - return function trust(addr) { - if (!isip(addr)) return false; - - var ip = parseip(addr); - var kind = ip.kind(); - - return kind === subnetkind - ? ip.match(subnetip, subnetrange) - : subnetisipv4 && kind === 'ipv6' && ip.isIPv4MappedAddress() - ? ip.toIPv4Address().match(subnetip, subnetrange) - : false; - }; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore deleted file mode 100644 index 7a1537b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.idea -node_modules diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile deleted file mode 100644 index 7fd355a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile +++ /dev/null @@ -1,18 +0,0 @@ -fs = require 'fs' -CoffeeScript = require 'coffee-script' -nodeunit = require 'nodeunit' -UglifyJS = require 'uglify-js' - -task 'build', 'build the JavaScript files from CoffeeScript source', build = (cb) -> - source = fs.readFileSync 'src/ipaddr.coffee' - fs.writeFileSync 'lib/ipaddr.js', CoffeeScript.compile source.toString() - - invoke 'test' - invoke 'compress' - -task 'test', 'run the bundled tests', (cb) -> - nodeunit.reporters.default.run ['test'] - -task 'compress', 'uglify the resulting javascript', (cb) -> - result = UglifyJS.minify('lib/ipaddr.js') - fs.writeFileSync('ipaddr.min.js', result.code) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE deleted file mode 100644 index 3493f0d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2011 Peter Zotov - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md deleted file mode 100644 index a816672..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md +++ /dev/null @@ -1,149 +0,0 @@ -# ipaddr.js — an IPv6 and IPv4 address manipulation library - -ipaddr.js is a small (1.9K minified and gzipped) library for manipulating -IP addresses in JavaScript environments. It runs on both CommonJS runtimes -(e.g. [nodejs]) and in a web browser. - -ipaddr.js allows you to verify and parse string representation of an IP -address, match it against a CIDR range or range list, determine if it falls -into some reserved ranges (examples include loopback and private ranges), -and convert between IPv4 and IPv4-mapped IPv6 addresses. - -[nodejs]: http://nodejs.org - -## Installation - -`npm install ipaddr.js` - -## API - -ipaddr.js defines one object in the global scope: `ipaddr`. In CommonJS, -it is exported from the module: - -```js -var ipaddr = require('ipaddr.js'); -``` - -The API consists of several global methods and two classes: ipaddr.IPv6 and ipaddr.IPv4. - -### Global methods - -There are three global methods defined: `ipaddr.isValid`, `ipaddr.parse` and -`ipaddr.process`. All of them receive a string as a single parameter. - -The `ipaddr.isValid` method returns `true` if the address is a valid IPv4 or -IPv6 address, and `false` otherwise. It does not throw any exceptions. - -The `ipaddr.parse` method returns an object representing the IP address, -or throws an `Error` if the passed string is not a valid representation of an -IP address. - -The `ipaddr.process` method works just like the `ipaddr.parse` one, but it -automatically converts IPv4-mapped IPv6 addresses to their IPv4 couterparts -before returning. It is useful when you have a Node.js instance listening -on an IPv6 socket, and the `net.ivp6.bindv6only` sysctl parameter (or its -equivalent on non-Linux OS) is set to 0. In this case, you can accept IPv4 -connections on your IPv6-only socket, but the remote address will be mangled. -Use `ipaddr.process` method to automatically demangle it. - -### Object representation - -Parsing methods return an object which descends from `ipaddr.IPv6` or -`ipaddr.IPv4`. These objects share some properties, but most of them differ. - -#### Shared properties - -One can determine the type of address by calling `addr.kind()`. It will return -either `"ipv6"` or `"ipv4"`. - -An address can be converted back to its string representation with `addr.toString()`. -Note that this method: - * does not return the original string used to create the object (in fact, there is - no way of getting that string) - * returns a compact representation (when it is applicable) - -A `match(range, bits)` method can be used to check if the address falls into a -certain CIDR range. -Note that an address can be (obviously) matched only against an address of the same type. - -For example: - -```js -var addr = ipaddr.parse("2001:db8:1234::1"); -var range = ipaddr.parse("2001:db8::"); - -addr.match(range, 32); // => true -``` - -A `range()` method returns one of predefined names for several special ranges defined -by IP protocols. The exact names (and their respective CIDR ranges) can be looked up -in the source: [IPv6 ranges] and [IPv4 ranges]. Some common ones include `"unicast"` -(the default one) and `"reserved"`. - -You can match against your own range list by using -`ipaddr.subnetMatch(address, rangeList, defaultName)` method. It can work with both -IPv6 and IPv4 addresses, and accepts a name-to-subnet map as the range list. For example: - -```js -var rangeList = { - documentationOnly: [ ipaddr.parse('2001:db8::'), 32 ], - tunnelProviders: [ - [ ipaddr.parse('2001:470::'), 32 ], // he.net - [ ipaddr.parse('2001:5c0::'), 32 ] // freenet6 - ] -}; -ipaddr.subnetMatch(ipaddr.parse('2001:470:8:66::1'), rangeList, 'unknown'); // => "he.net" -``` - -The addresses can be converted to their byte representation with `toByteArray()`. -(Actually, JavaScript mostly does not know about byte buffers. They are emulated with -arrays of numbers, each in range of 0..255.) - -```js -var bytes = ipaddr.parse('2a00:1450:8007::68').toByteArray(); // ipv6.google.com -bytes // => [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, , 0x00, 0x68 ] -``` - -The `ipaddr.IPv4` and `ipaddr.IPv6` objects have some methods defined, too. All of them -have the same interface for both protocols, and are similar to global methods. - -`ipaddr.IPvX.isValid(string)` can be used to check if the string is a valid address -for particular protocol, and `ipaddr.IPvX.parse(string)` is the error-throwing parser. - -[IPv6 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L186 -[IPv4 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L71 - -#### IPv6 properties - -Sometimes you will want to convert IPv6 not to a compact string representation (with -the `::` substitution); the `toNormalizedString()` method will return an address where -all zeroes are explicit. - -For example: - -```js -var addr = ipaddr.parse("2001:0db8::0001"); -addr.toString(); // => "2001:db8::1" -addr.toNormalizedString(); // => "2001:db8:0:0:0:0:0:1" -``` - -The `isIPv4MappedAddress()` method will return `true` if this address is an IPv4-mapped -one, and `toIPv4Address()` will return an IPv4 object address. - -To access the underlying binary representation of the address, use `addr.parts`. - -```js -var addr = ipaddr.parse("2001:db8:10::1234:DEAD"); -addr.parts // => [0x2001, 0xdb8, 0x10, 0, 0, 0, 0x1234, 0xdead] -``` - -#### IPv4 properties - -`toIPv4MappedAddress()` will return a corresponding IPv4-mapped IPv6 address. - -To access the underlying representation of the address, use `addr.octets`. - -```js -var addr = ipaddr.parse("192.168.1.1"); -addr.octets // => [192, 168, 1, 1] -``` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js deleted file mode 100644 index 528d48b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var t,r,n,e,i,o,a,s;r={},s=this,"undefined"!=typeof module&&null!==module&&module.exports?module.exports=r:s.ipaddr=r,a=function(t,r,n,e){var i,o;if(t.length!==r.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;e>0;){if(o=n-e,0>o&&(o=0),t[i]>>o!==r[i]>>o)return!1;e-=n,i+=1}return!0},r.subnetMatch=function(t,r,n){var e,i,o,a,s;null==n&&(n="unicast");for(e in r)for(i=r[e],"[object Array]"!==toString.call(i[0])&&(i=[i]),a=0,s=i.length;s>a;a++)if(o=i[a],t.match.apply(t,o))return e;return n},r.IPv4=function(){function t(t){var r,n,e;if(4!==t.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(n=0,e=t.length;e>n;n++)if(r=t[n],!(r>=0&&255>=r))throw new Error("ipaddr: ipv4 octet is a byte");this.octets=t}return t.prototype.kind=function(){return"ipv4"},t.prototype.toString=function(){return this.octets.join(".")},t.prototype.toByteArray=function(){return this.octets.slice(0)},t.prototype.match=function(t,r){if("ipv4"!==t.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return a(this.octets,t.octets,8,r)},t.prototype.SpecialRanges={broadcast:[[new t([255,255,255,255]),32]],multicast:[[new t([224,0,0,0]),4]],linkLocal:[[new t([169,254,0,0]),16]],loopback:[[new t([127,0,0,0]),8]],"private":[[new t([10,0,0,0]),8],[new t([172,16,0,0]),12],[new t([192,168,0,0]),16]],reserved:[[new t([192,0,0,0]),24],[new t([192,0,2,0]),24],[new t([192,88,99,0]),24],[new t([198,51,100,0]),24],[new t([203,0,113,0]),24],[new t([240,0,0,0]),4]]},t.prototype.range=function(){return r.subnetMatch(this,this.SpecialRanges)},t.prototype.toIPv4MappedAddress=function(){return r.IPv6.parse("::ffff:"+this.toString())},t}(),n="(0?\\d+|0x[a-f0-9]+)",e={fourOctet:new RegExp("^"+n+"\\."+n+"\\."+n+"\\."+n+"$","i"),longValue:new RegExp("^"+n+"$","i")},r.IPv4.parser=function(t){var r,n,i,o,a;return n=function(t){return"0"===t[0]&&"x"!==t[1]?parseInt(t,8):parseInt(t)},(r=t.match(e.fourOctet))?function(){var t,e,o,a;for(o=r.slice(1,6),a=[],t=0,e=o.length;e>t;t++)i=o[t],a.push(n(i));return a}():(r=t.match(e.longValue))?(a=n(r[1]),function(){var t,r;for(r=[],o=t=0;24>=t;o=t+=8)r.push(a>>o&255);return r}().reverse()):null},r.IPv6=function(){function t(t){var r,n,e;if(8!==t.length)throw new Error("ipaddr: ipv6 part count should be 8");for(n=0,e=t.length;e>n;n++)if(r=t[n],!(r>=0&&65535>=r))throw new Error("ipaddr: ipv6 part should fit to two octets");this.parts=t}return t.prototype.kind=function(){return"ipv6"},t.prototype.toString=function(){var t,r,n,e,i,o,a;for(i=function(){var t,n,e,i;for(e=this.parts,i=[],t=0,n=e.length;n>t;t++)r=e[t],i.push(r.toString(16));return i}.call(this),t=[],n=function(r){return t.push(r)},e=0,o=0,a=i.length;a>o;o++)switch(r=i[o],e){case 0:"0"===r?n(""):n(r),e=1;break;case 1:"0"===r?e=2:n(r);break;case 2:"0"!==r&&(n(""),n(r),e=3);break;case 3:n(r)}return 2===e&&(n(""),n("")),t.join(":")},t.prototype.toByteArray=function(){var t,r,n,e,i;for(t=[],i=this.parts,n=0,e=i.length;e>n;n++)r=i[n],t.push(r>>8),t.push(255&r);return t},t.prototype.toNormalizedString=function(){var t;return function(){var r,n,e,i;for(e=this.parts,i=[],r=0,n=e.length;n>r;r++)t=e[r],i.push(t.toString(16));return i}.call(this).join(":")},t.prototype.match=function(t,r){if("ipv6"!==t.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return a(this.parts,t.parts,16,r)},t.prototype.SpecialRanges={unspecified:[new t([0,0,0,0,0,0,0,0]),128],linkLocal:[new t([65152,0,0,0,0,0,0,0]),10],multicast:[new t([65280,0,0,0,0,0,0,0]),8],loopback:[new t([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new t([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new t([0,0,0,0,0,65535,0,0]),96],rfc6145:[new t([0,0,0,0,65535,0,0,0]),96],rfc6052:[new t([100,65435,0,0,0,0,0,0]),96],"6to4":[new t([8194,0,0,0,0,0,0,0]),16],teredo:[new t([8193,0,0,0,0,0,0,0]),32],reserved:[[new t([8193,3512,0,0,0,0,0,0]),32]]},t.prototype.range=function(){return r.subnetMatch(this,this.SpecialRanges)},t.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},t.prototype.toIPv4Address=function(){var t,n,e;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return e=this.parts.slice(-2),t=e[0],n=e[1],new r.IPv4([t>>8,255&t,n>>8,255&n])},t}(),i="(?:[0-9a-f]+::?)+",o={"native":new RegExp("^(::)?("+i+")?([0-9a-f]+)?(::)?$","i"),transitional:new RegExp("^((?:"+i+")|(?:::)(?:"+i+")?)"+(""+n+"\\."+n+"\\."+n+"\\."+n+"$"),"i")},t=function(t,r){var n,e,i,o,a;if(t.indexOf("::")!==t.lastIndexOf("::"))return null;for(n=0,e=-1;(e=t.indexOf(":",e+1))>=0;)n++;for(":"===t[0]&&n--,":"===t[t.length-1]&&n--,a=r-n,o=":";a--;)o+="0:";return t=t.replace("::",o),":"===t[0]&&(t=t.slice(1)),":"===t[t.length-1]&&(t=t.slice(0,-1)),function(){var r,n,e,o;for(e=t.split(":"),o=[],r=0,n=e.length;n>r;r++)i=e[r],o.push(parseInt(i,16));return o}()},r.IPv6.parser=function(r){var n,e;return r.match(o["native"])?t(r,8):(n=r.match(o.transitional))&&(e=t(n[1].slice(0,-1),6))?(e.push(parseInt(n[2])<<8|parseInt(n[3])),e.push(parseInt(n[4])<<8|parseInt(n[5])),e):null},r.IPv4.isIPv4=r.IPv6.isIPv6=function(t){return null!==this.parser(t)},r.IPv4.isValid=r.IPv6.isValid=function(t){var r;try{return new this(this.parser(t)),!0}catch(n){return r=n,!1}},r.IPv4.parse=r.IPv6.parse=function(t){var r;if(r=this.parser(t),null===r)throw new Error("ipaddr: string is not formatted like ip address");return new this(r)},r.isValid=function(t){return r.IPv6.isValid(t)||r.IPv4.isValid(t)},r.parse=function(t){if(r.IPv6.isIPv6(t))return r.IPv6.parse(t);if(r.IPv4.isIPv4(t))return r.IPv4.parse(t);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},r.process=function(t){var r;return r=this.parse(t),"ipv6"===r.kind()&&r.isIPv4MappedAddress()?r.toIPv4Address():r}}).call(this); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js deleted file mode 100644 index 2319737..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js +++ /dev/null @@ -1,401 +0,0 @@ -(function() { - var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root; - - ipaddr = {}; - - root = this; - - if ((typeof module !== "undefined" && module !== null) && module.exports) { - module.exports = ipaddr; - } else { - root['ipaddr'] = ipaddr; - } - - matchCIDR = function(first, second, partSize, cidrBits) { - var part, shift; - if (first.length !== second.length) { - throw new Error("ipaddr: cannot match CIDR for objects with different lengths"); - } - part = 0; - while (cidrBits > 0) { - shift = partSize - cidrBits; - if (shift < 0) { - shift = 0; - } - if (first[part] >> shift !== second[part] >> shift) { - return false; - } - cidrBits -= partSize; - part += 1; - } - return true; - }; - - ipaddr.subnetMatch = function(address, rangeList, defaultName) { - var rangeName, rangeSubnets, subnet, _i, _len; - if (defaultName == null) { - defaultName = 'unicast'; - } - for (rangeName in rangeList) { - rangeSubnets = rangeList[rangeName]; - if (toString.call(rangeSubnets[0]) !== '[object Array]') { - rangeSubnets = [rangeSubnets]; - } - for (_i = 0, _len = rangeSubnets.length; _i < _len; _i++) { - subnet = rangeSubnets[_i]; - if (address.match.apply(address, subnet)) { - return rangeName; - } - } - } - return defaultName; - }; - - ipaddr.IPv4 = (function() { - function IPv4(octets) { - var octet, _i, _len; - if (octets.length !== 4) { - throw new Error("ipaddr: ipv4 octet count should be 4"); - } - for (_i = 0, _len = octets.length; _i < _len; _i++) { - octet = octets[_i]; - if (!((0 <= octet && octet <= 255))) { - throw new Error("ipaddr: ipv4 octet is a byte"); - } - } - this.octets = octets; - } - - IPv4.prototype.kind = function() { - return 'ipv4'; - }; - - IPv4.prototype.toString = function() { - return this.octets.join("."); - }; - - IPv4.prototype.toByteArray = function() { - return this.octets.slice(0); - }; - - IPv4.prototype.match = function(other, cidrRange) { - if (other.kind() !== 'ipv4') { - throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one"); - } - return matchCIDR(this.octets, other.octets, 8, cidrRange); - }; - - IPv4.prototype.SpecialRanges = { - broadcast: [[new IPv4([255, 255, 255, 255]), 32]], - multicast: [[new IPv4([224, 0, 0, 0]), 4]], - linkLocal: [[new IPv4([169, 254, 0, 0]), 16]], - loopback: [[new IPv4([127, 0, 0, 0]), 8]], - "private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]], - reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]] - }; - - IPv4.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv4.prototype.toIPv4MappedAddress = function() { - return ipaddr.IPv6.parse("::ffff:" + (this.toString())); - }; - - return IPv4; - - })(); - - ipv4Part = "(0?\\d+|0x[a-f0-9]+)"; - - ipv4Regexes = { - fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'), - longValue: new RegExp("^" + ipv4Part + "$", 'i') - }; - - ipaddr.IPv4.parser = function(string) { - var match, parseIntAuto, part, shift, value; - parseIntAuto = function(string) { - if (string[0] === "0" && string[1] !== "x") { - return parseInt(string, 8); - } else { - return parseInt(string); - } - }; - if (match = string.match(ipv4Regexes.fourOctet)) { - return (function() { - var _i, _len, _ref, _results; - _ref = match.slice(1, 6); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(parseIntAuto(part)); - } - return _results; - })(); - } else if (match = string.match(ipv4Regexes.longValue)) { - value = parseIntAuto(match[1]); - return ((function() { - var _i, _results; - _results = []; - for (shift = _i = 0; _i <= 24; shift = _i += 8) { - _results.push((value >> shift) & 0xff); - } - return _results; - })()).reverse(); - } else { - return null; - } - }; - - ipaddr.IPv6 = (function() { - function IPv6(parts) { - var part, _i, _len; - if (parts.length !== 8) { - throw new Error("ipaddr: ipv6 part count should be 8"); - } - for (_i = 0, _len = parts.length; _i < _len; _i++) { - part = parts[_i]; - if (!((0 <= part && part <= 0xffff))) { - throw new Error("ipaddr: ipv6 part should fit to two octets"); - } - } - this.parts = parts; - } - - IPv6.prototype.kind = function() { - return 'ipv6'; - }; - - IPv6.prototype.toString = function() { - var compactStringParts, part, pushPart, state, stringParts, _i, _len; - stringParts = (function() { - var _i, _len, _ref, _results; - _ref = this.parts; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(part.toString(16)); - } - return _results; - }).call(this); - compactStringParts = []; - pushPart = function(part) { - return compactStringParts.push(part); - }; - state = 0; - for (_i = 0, _len = stringParts.length; _i < _len; _i++) { - part = stringParts[_i]; - switch (state) { - case 0: - if (part === '0') { - pushPart(''); - } else { - pushPart(part); - } - state = 1; - break; - case 1: - if (part === '0') { - state = 2; - } else { - pushPart(part); - } - break; - case 2: - if (part !== '0') { - pushPart(''); - pushPart(part); - state = 3; - } - break; - case 3: - pushPart(part); - } - } - if (state === 2) { - pushPart(''); - pushPart(''); - } - return compactStringParts.join(":"); - }; - - IPv6.prototype.toByteArray = function() { - var bytes, part, _i, _len, _ref; - bytes = []; - _ref = this.parts; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - bytes.push(part >> 8); - bytes.push(part & 0xff); - } - return bytes; - }; - - IPv6.prototype.toNormalizedString = function() { - var part; - return ((function() { - var _i, _len, _ref, _results; - _ref = this.parts; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(part.toString(16)); - } - return _results; - }).call(this)).join(":"); - }; - - IPv6.prototype.match = function(other, cidrRange) { - if (other.kind() !== 'ipv6') { - throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one"); - } - return matchCIDR(this.parts, other.parts, 16, cidrRange); - }; - - IPv6.prototype.SpecialRanges = { - unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128], - linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10], - multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8], - loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128], - uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7], - ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96], - rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96], - rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96], - '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16], - teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32], - reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]] - }; - - IPv6.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv6.prototype.isIPv4MappedAddress = function() { - return this.range() === 'ipv4Mapped'; - }; - - IPv6.prototype.toIPv4Address = function() { - var high, low, _ref; - if (!this.isIPv4MappedAddress()) { - throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4"); - } - _ref = this.parts.slice(-2), high = _ref[0], low = _ref[1]; - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]); - }; - - return IPv6; - - })(); - - ipv6Part = "(?:[0-9a-f]+::?)+"; - - ipv6Regexes = { - "native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?$", 'i'), - transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + ("" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$"), 'i') - }; - - expandIPv6 = function(string, parts) { - var colonCount, lastColon, part, replacement, replacementCount; - if (string.indexOf('::') !== string.lastIndexOf('::')) { - return null; - } - colonCount = 0; - lastColon = -1; - while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) { - colonCount++; - } - if (string[0] === ':') { - colonCount--; - } - if (string[string.length - 1] === ':') { - colonCount--; - } - replacementCount = parts - colonCount; - replacement = ':'; - while (replacementCount--) { - replacement += '0:'; - } - string = string.replace('::', replacement); - if (string[0] === ':') { - string = string.slice(1); - } - if (string[string.length - 1] === ':') { - string = string.slice(0, -1); - } - return (function() { - var _i, _len, _ref, _results; - _ref = string.split(":"); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(parseInt(part, 16)); - } - return _results; - })(); - }; - - ipaddr.IPv6.parser = function(string) { - var match, parts; - if (string.match(ipv6Regexes['native'])) { - return expandIPv6(string, 8); - } else if (match = string.match(ipv6Regexes['transitional'])) { - parts = expandIPv6(match[1].slice(0, -1), 6); - if (parts) { - parts.push(parseInt(match[2]) << 8 | parseInt(match[3])); - parts.push(parseInt(match[4]) << 8 | parseInt(match[5])); - return parts; - } - } - return null; - }; - - ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) { - return this.parser(string) !== null; - }; - - ipaddr.IPv4.isValid = ipaddr.IPv6.isValid = function(string) { - var e; - try { - new this(this.parser(string)); - return true; - } catch (_error) { - e = _error; - return false; - } - }; - - ipaddr.IPv4.parse = ipaddr.IPv6.parse = function(string) { - var parts; - parts = this.parser(string); - if (parts === null) { - throw new Error("ipaddr: string is not formatted like ip address"); - } - return new this(parts); - }; - - ipaddr.isValid = function(string) { - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string); - }; - - ipaddr.parse = function(string) { - if (ipaddr.IPv6.isIPv6(string)) { - return ipaddr.IPv6.parse(string); - } else if (ipaddr.IPv4.isIPv4(string)) { - return ipaddr.IPv4.parse(string); - } else { - throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format"); - } - }; - - ipaddr.process = function(string) { - var addr; - addr = this.parse(string); - if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) { - return addr.toIPv4Address(); - } else { - return addr; - } - }; - -}).call(this); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json deleted file mode 100644 index f375304..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "ipaddr.js", - "description": "A library for manipulating IPv4 and IPv6 addresses in JavaScript.", - "version": "0.1.2", - "author": { - "name": "Peter Zotov", - "email": "whitequark@whitequark.org" - }, - "directories": { - "lib": "./lib" - }, - "dependencies": {}, - "devDependencies": { - "coffee-script": "~1.6", - "nodeunit": "~0.5.3", - "uglify-js": "latest" - }, - "scripts": { - "test": "cake build test" - }, - "keywords": [ - "ip", - "ipv4", - "ipv6" - ], - "repository": { - "type": "git", - "url": "git://github.com/whitequark/ipaddr.js" - }, - "main": "./lib/ipaddr", - "engines": { - "node": ">= 0.2.5" - }, - "bugs": { - "url": "https://github.com/whitequark/ipaddr.js/issues" - }, - "_id": "ipaddr.js@0.1.2", - "dist": { - "shasum": "6a1fd3d854f5002965c34d7bbcd9b4a8d4b0467e", - "tarball": "http://registry.npmjs.org/ipaddr.js/-/ipaddr.js-0.1.2.tgz" - }, - "_from": "ipaddr.js@0.1.2", - "_npmVersion": "1.3.10", - "_npmUser": { - "name": "whitequark", - "email": "whitequark@whitequark.org" - }, - "maintainers": [ - { - "name": "whitequark", - "email": "whitequark@whitequark.org" - } - ], - "_shasum": "6a1fd3d854f5002965c34d7bbcd9b4a8d4b0467e", - "_resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-0.1.2.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/whitequark/ipaddr.js" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee deleted file mode 100644 index 4c89ded..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee +++ /dev/null @@ -1,344 +0,0 @@ -# Define the main object -ipaddr = {} - -root = this - -# Export for both the CommonJS and browser-like environment -if module? && module.exports - module.exports = ipaddr -else - root['ipaddr'] = ipaddr - -# A generic CIDR (Classless Inter-Domain Routing) RFC1518 range matcher. -matchCIDR = (first, second, partSize, cidrBits) -> - if first.length != second.length - throw new Error "ipaddr: cannot match CIDR for objects with different lengths" - - part = 0 - while cidrBits > 0 - shift = partSize - cidrBits - shift = 0 if shift < 0 - - if first[part] >> shift != second[part] >> shift - return false - - cidrBits -= partSize - part += 1 - - return true - -# An utility function to ease named range matching. See examples below. -ipaddr.subnetMatch = (address, rangeList, defaultName='unicast') -> - for rangeName, rangeSubnets of rangeList - # ECMA5 Array.isArray isn't available everywhere - if toString.call(rangeSubnets[0]) != '[object Array]' - rangeSubnets = [ rangeSubnets ] - - for subnet in rangeSubnets - return rangeName if address.match.apply(address, subnet) - - return defaultName - -# An IPv4 address (RFC791). -class ipaddr.IPv4 - # Constructs a new IPv4 address from an array of four octets. - # Verifies the input. - constructor: (octets) -> - if octets.length != 4 - throw new Error "ipaddr: ipv4 octet count should be 4" - - for octet in octets - if !(0 <= octet <= 255) - throw new Error "ipaddr: ipv4 octet is a byte" - - @octets = octets - - # The 'kind' method exists on both IPv4 and IPv6 classes. - kind: -> - return 'ipv4' - - # Returns the address in convenient, decimal-dotted format. - toString: -> - return @octets.join "." - - # Returns an array of byte-sized values in network order - toByteArray: -> - return @octets.slice(0) # octets.clone - - # Checks if this address matches other one within given CIDR range. - match: (other, cidrRange) -> - if other.kind() != 'ipv4' - throw new Error "ipaddr: cannot match ipv4 address with non-ipv4 one" - - return matchCIDR(this.octets, other.octets, 8, cidrRange) - - # Special IPv4 address ranges. - SpecialRanges: - broadcast: [ - [ new IPv4([255, 255, 255, 255]), 32 ] - ] - multicast: [ # RFC3171 - [ new IPv4([224, 0, 0, 0]), 4 ] - ] - linkLocal: [ # RFC3927 - [ new IPv4([169, 254, 0, 0]), 16 ] - ] - loopback: [ # RFC5735 - [ new IPv4([127, 0, 0, 0]), 8 ] - ] - private: [ # RFC1918 - [ new IPv4([10, 0, 0, 0]), 8 ] - [ new IPv4([172, 16, 0, 0]), 12 ] - [ new IPv4([192, 168, 0, 0]), 16 ] - ] - reserved: [ # Reserved and testing-only ranges; RFCs 5735, 5737, 2544, 1700 - [ new IPv4([192, 0, 0, 0]), 24 ] - [ new IPv4([192, 0, 2, 0]), 24 ] - [ new IPv4([192, 88, 99, 0]), 24 ] - [ new IPv4([198, 51, 100, 0]), 24 ] - [ new IPv4([203, 0, 113, 0]), 24 ] - [ new IPv4([240, 0, 0, 0]), 4 ] - ] - - # Checks if the address corresponds to one of the special ranges. - range: -> - return ipaddr.subnetMatch(this, @SpecialRanges) - - # Convrets this IPv4 address to an IPv4-mapped IPv6 address. - toIPv4MappedAddress: -> - return ipaddr.IPv6.parse "::ffff:#{@toString()}" - -# A list of regular expressions that match arbitrary IPv4 addresses, -# for which a number of weird notations exist. -# Note that an address like 0010.0xa5.1.1 is considered legal. -ipv4Part = "(0?\\d+|0x[a-f0-9]+)" -ipv4Regexes = - fourOctet: new RegExp "^#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}$", 'i' - longValue: new RegExp "^#{ipv4Part}$", 'i' - -# Classful variants (like a.b, where a is an octet, and b is a 24-bit -# value representing last three octets; this corresponds to a class C -# address) are omitted due to classless nature of modern Internet. -ipaddr.IPv4.parser = (string) -> - parseIntAuto = (string) -> - if string[0] == "0" && string[1] != "x" - parseInt(string, 8) - else - parseInt(string) - - # parseInt recognizes all that octal & hexadecimal weirdness for us - if match = string.match(ipv4Regexes.fourOctet) - return (parseIntAuto(part) for part in match[1..5]) - else if match = string.match(ipv4Regexes.longValue) - value = parseIntAuto(match[1]) - return ((value >> shift) & 0xff for shift in [0..24] by 8).reverse() - else - return null - -# An IPv6 address (RFC2460) -class ipaddr.IPv6 - # Constructs an IPv6 address from an array of eight 16-bit parts. - # Throws an error if the input is invalid. - constructor: (parts) -> - if parts.length != 8 - throw new Error "ipaddr: ipv6 part count should be 8" - - for part in parts - if !(0 <= part <= 0xffff) - throw new Error "ipaddr: ipv6 part should fit to two octets" - - @parts = parts - - # The 'kind' method exists on both IPv4 and IPv6 classes. - kind: -> - return 'ipv6' - - # Returns the address in compact, human-readable format like - # 2001:db8:8:66::1 - toString: -> - stringParts = (part.toString(16) for part in @parts) - - compactStringParts = [] - pushPart = (part) -> compactStringParts.push part - - state = 0 - for part in stringParts - switch state - when 0 - if part == '0' - pushPart('') - else - pushPart(part) - - state = 1 - when 1 - if part == '0' - state = 2 - else - pushPart(part) - when 2 - unless part == '0' - pushPart('') - pushPart(part) - state = 3 - when 3 - pushPart(part) - - if state == 2 - pushPart('') - pushPart('') - - return compactStringParts.join ":" - - # Returns an array of byte-sized values in network order - toByteArray: -> - bytes = [] - for part in @parts - bytes.push(part >> 8) - bytes.push(part & 0xff) - - return bytes - - # Returns the address in expanded format with all zeroes included, like - # 2001:db8:8:66:0:0:0:1 - toNormalizedString: -> - return (part.toString(16) for part in @parts).join ":" - - # Checks if this address matches other one within given CIDR range. - match: (other, cidrRange) -> - if other.kind() != 'ipv6' - throw new Error "ipaddr: cannot match ipv6 address with non-ipv6 one" - - return matchCIDR(this.parts, other.parts, 16, cidrRange) - - # Special IPv6 ranges - SpecialRanges: - unspecified: [ new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128 ] # RFC4291, here and after - linkLocal: [ new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10 ] - multicast: [ new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8 ] - loopback: [ new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128 ] - uniqueLocal: [ new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7 ] - ipv4Mapped: [ new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96 ] - rfc6145: [ new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96 ] # RFC6145 - rfc6052: [ new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96 ] # RFC6052 - '6to4': [ new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16 ] # RFC3056 - teredo: [ new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32 ] # RFC6052, RFC6146 - reserved: [ - [ new IPv6([ 0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32 ] # RFC4291 - ] - - # Checks if the address corresponds to one of the special ranges. - range: -> - return ipaddr.subnetMatch(this, @SpecialRanges) - - # Checks if this address is an IPv4-mapped IPv6 address. - isIPv4MappedAddress: -> - return @range() == 'ipv4Mapped' - - # Converts this address to IPv4 address if it is an IPv4-mapped IPv6 address. - # Throws an error otherwise. - toIPv4Address: -> - unless @isIPv4MappedAddress() - throw new Error "ipaddr: trying to convert a generic ipv6 address to ipv4" - - [high, low] = @parts[-2..-1] - - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]) - -# IPv6-matching regular expressions. -# For IPv6, the task is simpler: it is enough to match the colon-delimited -# hexadecimal IPv6 and a transitional variant with dotted-decimal IPv4 at -# the end. -ipv6Part = "(?:[0-9a-f]+::?)+" -ipv6Regexes = - native: new RegExp "^(::)?(#{ipv6Part})?([0-9a-f]+)?(::)?$", 'i' - transitional: new RegExp "^((?:#{ipv6Part})|(?:::)(?:#{ipv6Part})?)" + - "#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}$", 'i' - -# Expand :: in an IPv6 address or address part consisting of `parts` groups. -expandIPv6 = (string, parts) -> - # More than one '::' means invalid adddress - if string.indexOf('::') != string.lastIndexOf('::') - return null - - # How many parts do we already have? - colonCount = 0 - lastColon = -1 - while (lastColon = string.indexOf(':', lastColon + 1)) >= 0 - colonCount++ - - # 0::0 is two parts more than :: - colonCount-- if string[0] == ':' - colonCount-- if string[string.length-1] == ':' - - # replacement = ':' + '0:' * (parts - colonCount) - replacementCount = parts - colonCount - replacement = ':' - while replacementCount-- - replacement += '0:' - - # Insert the missing zeroes - string = string.replace('::', replacement) - - # Trim any garbage which may be hanging around if :: was at the edge in - # the source string - string = string[1..-1] if string[0] == ':' - string = string[0..-2] if string[string.length-1] == ':' - - return (parseInt(part, 16) for part in string.split(":")) - -# Parse an IPv6 address. -ipaddr.IPv6.parser = (string) -> - if string.match(ipv6Regexes['native']) - return expandIPv6(string, 8) - - else if match = string.match(ipv6Regexes['transitional']) - parts = expandIPv6(match[1][0..-2], 6) - if parts - parts.push(parseInt(match[2]) << 8 | parseInt(match[3])) - parts.push(parseInt(match[4]) << 8 | parseInt(match[5])) - return parts - - return null - -# Checks if a given string is formatted like IPv4/IPv6 address. -ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = (string) -> - return @parser(string) != null - -# Checks if a given string is a valid IPv4/IPv6 address. -ipaddr.IPv4.isValid = ipaddr.IPv6.isValid = (string) -> - try - new this(@parser(string)) - return true - catch e - return false - -# Tries to parse and validate a string with IPv4/IPv6 address. -# Throws an error if it fails. -ipaddr.IPv4.parse = ipaddr.IPv6.parse = (string) -> - parts = @parser(string) - if parts == null - throw new Error "ipaddr: string is not formatted like ip address" - - return new this(parts) - -# Checks if the address is valid IP address -ipaddr.isValid = (string) -> - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string) - -# Try to parse an address and throw an error if it is impossible -ipaddr.parse = (string) -> - if ipaddr.IPv6.isIPv6(string) - return ipaddr.IPv6.parse(string) - else if ipaddr.IPv4.isIPv4(string) - return ipaddr.IPv4.parse(string) - else - throw new Error "ipaddr: the address has neither IPv6 nor IPv4 format" - -# Parse an address and return plain IPv4 address if it is an IPv4-mapped address -ipaddr.process = (string) -> - addr = @parse(string) - if addr.kind() == 'ipv6' && addr.isIPv4MappedAddress() - return addr.toIPv4Address() - else - return addr diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee deleted file mode 100644 index 56751da..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee +++ /dev/null @@ -1,209 +0,0 @@ -ipaddr = require '../lib/ipaddr' - -module.exports = - 'should define main classes': (test) -> - test.ok(ipaddr.IPv4?, 'defines IPv4 class') - test.ok(ipaddr.IPv6?, 'defines IPv6 class') - test.done() - - 'can construct IPv4 from octets': (test) -> - test.doesNotThrow -> - new ipaddr.IPv4([192, 168, 1, 2]) - test.done() - - 'refuses to construct invalid IPv4': (test) -> - test.throws -> - new ipaddr.IPv4([300, 1, 2, 3]) - test.throws -> - new ipaddr.IPv4([8, 8, 8]) - test.done() - - 'converts IPv4 to string correctly': (test) -> - addr = new ipaddr.IPv4([192, 168, 1, 1]) - test.equal(addr.toString(), '192.168.1.1') - test.done() - - 'returns correct kind for IPv4': (test) -> - addr = new ipaddr.IPv4([1, 2, 3, 4]) - test.equal(addr.kind(), 'ipv4') - test.done() - - 'allows to access IPv4 octets': (test) -> - addr = new ipaddr.IPv4([42, 0, 0, 0]) - test.equal(addr.octets[0], 42) - test.done() - - 'checks IPv4 address format': (test) -> - test.equal(ipaddr.IPv4.isIPv4('192.168.007.0xa'), true) - test.equal(ipaddr.IPv4.isIPv4('1024.0.0.1'), true) - test.equal(ipaddr.IPv4.isIPv4('8.0xa.wtf.6'), false) - test.done() - - 'validates IPv4 addresses': (test) -> - test.equal(ipaddr.IPv4.isValid('192.168.007.0xa'), true) - test.equal(ipaddr.IPv4.isValid('1024.0.0.1'), false) - test.equal(ipaddr.IPv4.isValid('8.0xa.wtf.6'), false) - test.done() - - 'parses IPv4 in several weird formats': (test) -> - test.deepEqual(ipaddr.IPv4.parse('192.168.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('0xc0.168.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('192.0250.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('0xc0a80101').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('030052000401').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('3232235777').octets, [192, 168, 1, 1]) - test.done() - - 'barfs at invalid IPv4': (test) -> - test.throws -> - ipaddr.IPv4.parse('10.0.0.wtf') - test.done() - - 'matches IPv4 CIDR correctly': (test) -> - addr = new ipaddr.IPv4([10, 5, 0, 1]) - test.equal(addr.match(ipaddr.IPv4.parse('0.0.0.0'), 0), true) - test.equal(addr.match(ipaddr.IPv4.parse('11.0.0.0'), 8), false) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.0'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.1'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.10'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.5.5.0'), 16), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 16), false) - test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 15), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.5.0.2'), 32), false) - test.equal(addr.match(addr, 32), true) - test.done() - - 'detects reserved IPv4 networks': (test) -> - test.equal(ipaddr.IPv4.parse('10.1.0.1').range(), 'private') - test.equal(ipaddr.IPv4.parse('192.168.2.1').range(), 'private') - test.equal(ipaddr.IPv4.parse('224.100.0.1').range(), 'multicast') - test.equal(ipaddr.IPv4.parse('169.254.15.0').range(), 'linkLocal') - test.equal(ipaddr.IPv4.parse('127.1.1.1').range(), 'loopback') - test.equal(ipaddr.IPv4.parse('255.255.255.255').range(), 'broadcast') - test.equal(ipaddr.IPv4.parse('240.1.2.3').range(), 'reserved') - test.equal(ipaddr.IPv4.parse('8.8.8.8').range(), 'unicast') - test.done() - - 'can construct IPv6 from parts': (test) -> - test.doesNotThrow -> - new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.done() - - 'refuses to construct invalid IPv6': (test) -> - test.throws -> - new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 0, 1]) - test.throws -> - new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 1]) - test.done() - - 'converts IPv6 to string correctly': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.equal(addr.toNormalizedString(), '2001:db8:f53a:0:0:0:0:1') - test.equal(addr.toString(), '2001:db8:f53a::1') - test.equal(new ipaddr.IPv6([0, 0, 0, 0, 0, 0, 0, 1]).toString(), '::1') - test.equal(new ipaddr.IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]).toString(), '2001:db8::') - test.done() - - 'returns correct kind for IPv6': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.equal(addr.kind(), 'ipv6') - test.done() - - 'allows to access IPv6 address parts': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 42, 0, 1]) - test.equal(addr.parts[5], 42) - test.done() - - 'checks IPv6 address format': (test) -> - test.equal(ipaddr.IPv6.isIPv6('2001:db8:F53A::1'), true) - test.equal(ipaddr.IPv6.isIPv6('200001::1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:192.168.1.1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1:0'), false) - test.equal(ipaddr.IPv6.isIPv6('fe80::wtf'), false) - test.done() - - 'validates IPv6 addresses': (test) -> - test.equal(ipaddr.IPv6.isValid('2001:db8:F53A::1'), true) - test.equal(ipaddr.IPv6.isValid('200001::1'), false) - test.equal(ipaddr.IPv6.isValid('::ffff:192.168.1.1'), true) - test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1'), false) - test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1:0'), false) - test.equal(ipaddr.IPv6.isValid('2001:db8::F53A::1'), false) - test.equal(ipaddr.IPv6.isValid('fe80::wtf'), false) - test.done() - - 'parses IPv6 in different formats': (test) -> - test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A:0:0:0:0:1').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.deepEqual(ipaddr.IPv6.parse('fe80::10').parts, [0xfe80, 0, 0, 0, 0, 0, 0, 0x10]) - test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A::').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 0]) - test.deepEqual(ipaddr.IPv6.parse('::1').parts, [0, 0, 0, 0, 0, 0, 0, 1]) - test.deepEqual(ipaddr.IPv6.parse('::').parts, [0, 0, 0, 0, 0, 0, 0, 0]) - test.done() - - 'barfs at invalid IPv6': (test) -> - test.throws -> - ipaddr.IPv6.parse('fe80::0::1') - test.done() - - 'matches IPv6 CIDR correctly': (test) -> - addr = ipaddr.IPv6.parse('2001:db8:f53a::1') - test.equal(addr.match(ipaddr.IPv6.parse('::'), 0), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53a::1:1'), 64), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53b::1:1'), 48), false) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f531::1:1'), 44), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f500::1'), 40), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db9:f500::1'), 40), false) - test.equal(addr.match(addr, 128), true) - test.done() - - 'converts between IPv4-mapped IPv6 addresses and IPv4 addresses': (test) -> - addr = ipaddr.IPv4.parse('77.88.21.11') - mapped = addr.toIPv4MappedAddress() - test.deepEqual(mapped.parts, [0, 0, 0, 0, 0, 0xffff, 0x4d58, 0x150b]) - test.deepEqual(mapped.toIPv4Address().octets, addr.octets) - test.done() - - 'refuses to convert non-IPv4-mapped IPv6 address to IPv4 address': (test) -> - test.throws -> - ipaddr.IPv6.parse('2001:db8::1').toIPv4Address() - test.done() - - 'detects reserved IPv6 networks': (test) -> - test.equal(ipaddr.IPv6.parse('::').range(), 'unspecified') - test.equal(ipaddr.IPv6.parse('fe80::1234:5678:abcd:0123').range(), 'linkLocal') - test.equal(ipaddr.IPv6.parse('ff00::1234').range(), 'multicast') - test.equal(ipaddr.IPv6.parse('::1').range(), 'loopback') - test.equal(ipaddr.IPv6.parse('fc00::').range(), 'uniqueLocal') - test.equal(ipaddr.IPv6.parse('::ffff:192.168.1.10').range(), 'ipv4Mapped') - test.equal(ipaddr.IPv6.parse('::ffff:0:192.168.1.10').range(), 'rfc6145') - test.equal(ipaddr.IPv6.parse('64:ff9b::1234').range(), 'rfc6052') - test.equal(ipaddr.IPv6.parse('2002:1f63:45e8::1').range(), '6to4') - test.equal(ipaddr.IPv6.parse('2001::4242').range(), 'teredo') - test.equal(ipaddr.IPv6.parse('2001:db8::3210').range(), 'reserved') - test.equal(ipaddr.IPv6.parse('2001:470:8:66::1').range(), 'unicast') - test.done() - - 'is able to determine IP address type': (test) -> - test.equal(ipaddr.parse('8.8.8.8').kind(), 'ipv4') - test.equal(ipaddr.parse('2001:db8:3312::1').kind(), 'ipv6') - test.done() - - 'throws an error if tried to parse an invalid address': (test) -> - test.throws -> - ipaddr.parse('::some.nonsense') - test.done() - - 'correctly processes IPv4-mapped addresses': (test) -> - test.equal(ipaddr.process('8.8.8.8').kind(), 'ipv4') - test.equal(ipaddr.process('2001:db8:3312::1').kind(), 'ipv6') - test.equal(ipaddr.process('::ffff:192.168.1.1').kind(), 'ipv4') - test.done() - - 'correctly converts IPv6 and IPv4 addresses to byte arrays': (test) -> - test.deepEqual(ipaddr.parse('1.2.3.4').toByteArray(), - [0x1, 0x2, 0x3, 0x4]); - # Fuck yeah. The first byte of Google's IPv6 address is 42. 42! - test.deepEqual(ipaddr.parse('2a00:1450:8007::68').toByteArray(), - [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68 ]) - test.done() diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/package.json deleted file mode 100644 index e5dfcb6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "proxy-addr", - "description": "Determine address of proxied request", - "version": "1.0.1", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "ip", - "proxy", - "x-forwarded-for" - ], - "repository": { - "type": "git", - "url": "https://github.com/expressjs/proxy-addr.git" - }, - "bugs": { - "url": "https://github.com/expressjs/proxy-addr/issues" - }, - "dependencies": { - "ipaddr.js": "0.1.2" - }, - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "istanbul": "0.2.10", - "mocha": "~1.20.0", - "should": "~4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "homepage": "https://github.com/expressjs/proxy-addr", - "_id": "proxy-addr@1.0.1", - "dist": { - "shasum": "c7c566d5eb4e3fad67eeb9c77c5558ccc39b88a8", - "tarball": "http://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.1.tgz" - }, - "_from": "proxy-addr@1.0.1", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "c7c566d5eb4e3fad67eeb9c77c5558ccc39b88a8", - "_resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.gitmodules b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.gitmodules deleted file mode 100644 index 49e31da..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "support/expresso"] - path = support/expresso - url = git://github.com/visionmedia/expresso.git -[submodule "support/should"] - path = support/should - url = git://github.com/visionmedia/should.js.git diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.npmignore deleted file mode 100644 index e85ce2a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -test -.travis.yml -benchmark.js -component.json -examples.js -History.md -Makefile diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/Readme.md deleted file mode 100644 index 27e54a4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/Readme.md +++ /dev/null @@ -1,58 +0,0 @@ -# node-querystring - - query string parser for node and the browser supporting nesting, as it was removed from `0.3.x`, so this library provides the previous and commonly desired behaviour (and twice as fast). Used by [express](http://expressjs.com), [connect](http://senchalabs.github.com/connect) and others. - -## Installation - - $ npm install qs - -## Examples - -```js -var qs = require('qs'); - -qs.parse('user[name][first]=Tobi&user[email]=tobi@learnboost.com'); -// => { user: { name: { first: 'Tobi' }, email: 'tobi@learnboost.com' } } - -qs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }}) -// => user[name]=Tobi&user[email]=tobi%40learnboost.com -``` - -## Testing - -Install dev dependencies: - - $ npm install -d - -and execute: - - $ make test - -browser: - - $ open test/browser/index.html - -## License - -(The MIT License) - -Copyright (c) 2010 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/index.js deleted file mode 100644 index b05938a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/index.js +++ /dev/null @@ -1,366 +0,0 @@ -/** - * Object#toString() ref for stringify(). - */ - -var toString = Object.prototype.toString; - -/** - * Object#hasOwnProperty ref - */ - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -/** - * Array#indexOf shim. - */ - -var indexOf = typeof Array.prototype.indexOf === 'function' - ? function(arr, el) { return arr.indexOf(el); } - : function(arr, el) { - for (var i = 0; i < arr.length; i++) { - if (arr[i] === el) return i; - } - return -1; - }; - -/** - * Array.isArray shim. - */ - -var isArray = Array.isArray || function(arr) { - return toString.call(arr) == '[object Array]'; -}; - -/** - * Object.keys shim. - */ - -var objectKeys = Object.keys || function(obj) { - var ret = []; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - ret.push(key); - } - } - return ret; -}; - -/** - * Array#forEach shim. - */ - -var forEach = typeof Array.prototype.forEach === 'function' - ? function(arr, fn) { return arr.forEach(fn); } - : function(arr, fn) { - for (var i = 0; i < arr.length; i++) fn(arr[i]); - }; - -/** - * Array#reduce shim. - */ - -var reduce = function(arr, fn, initial) { - if (typeof arr.reduce === 'function') return arr.reduce(fn, initial); - var res = initial; - for (var i = 0; i < arr.length; i++) res = fn(res, arr[i]); - return res; -}; - -/** - * 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]) { - if (hasOwnProperty.call(parent[key], i)) { - t[i] = parent[key][i]; - } - } - parent[key] = t; - return t; -} - -function parse(parts, parent, key, val) { - var part = parts.shift(); - - // illegal - if (Object.getOwnPropertyDescriptor(Object.prototype, key)) return; - - // end - if (!part) { - if (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 (isArray(obj)) { - if ('' != val) obj.push(val); - } else if ('object' == typeof obj) { - obj[objectKeys(obj).length] = val; - } else { - obj = parent[key] = [parent[key], val]; - } - // prop - } else if (~indexOf(part, ']')) { - part = part.substr(0, part.length - 1); - if (!isint.test(part) && isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - // key - } else { - if (!isint.test(part) && isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - } - } -} - -/** - * Merge parent key/val pair. - */ - -function merge(parent, key, val){ - if (~indexOf(key, ']')) { - var parts = key.split('[') - , len = parts.length - , last = len - 1; - parse(parts, parent, 'base', val); - // optimize - } else { - if (!isint.test(key) && 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; -} - -/** - * Compact sparse arrays. - */ - -function compact(obj) { - if ('object' != typeof obj) return obj; - - if (isArray(obj)) { - var ret = []; - - for (var i in obj) { - if (hasOwnProperty.call(obj, i)) { - ret.push(obj[i]); - } - } - - return ret; - } - - for (var key in obj) { - obj[key] = compact(obj[key]); - } - - return obj; -} - -/** - * Parse the given obj. - */ - -function parseObject(obj){ - var ret = { base: {} }; - - forEach(objectKeys(obj), function(name){ - merge(ret, name, obj[name]); - }); - - return compact(ret.base); -} - -/** - * Parse the given str. - */ - -function parseString(str){ - var ret = reduce(String(str).split('&'), function(ret, pair){ - var eql = indexOf(pair, '=') - , brace = lastBraceInKey(pair) - , key = pair.substr(0, brace || eql) - , val = pair.substr(brace || eql, pair.length) - , val = val.substr(indexOf(val, '=') + 1, val.length); - - // ?foo - if ('' == key) key = pair, val = ''; - if ('' == key) return ret; - - return merge(ret, decode(key), decode(val)); - }, { base: {} }).base; - - return compact(ret); -} - -/** - * 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 (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 + '=' + encodeURIComponent(String(obj)); - } -}; - -/** - * Stringify the given `str`. - * - * @param {String} str - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyString(str, prefix) { - if (!prefix) throw new TypeError('stringify expects an object'); - return prefix + '=' + encodeURIComponent(str); -} - -/** - * Stringify the given `arr`. - * - * @param {Array} arr - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyArray(arr, prefix) { - var ret = []; - if (!prefix) throw new TypeError('stringify expects an object'); - for (var i = 0; i < arr.length; i++) { - ret.push(stringify(arr[i], prefix + '[' + i + ']')); - } - return ret.join('&'); -} - -/** - * Stringify the given `obj`. - * - * @param {Object} obj - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyObject(obj, prefix) { - var ret = [] - , keys = objectKeys(obj) - , key; - - for (var i = 0, len = keys.length; i < len; ++i) { - key = keys[i]; - if ('' == key) continue; - if (null == obj[key]) { - ret.push(encodeURIComponent(key) + '='); - } else { - 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 (Object.getOwnPropertyDescriptor(Object.prototype, key)) return; - if (undefined === v) { - obj[key] = val; - } else if (isArray(v)) { - v.push(val); - } else { - obj[key] = [v, val]; - } -} - -/** - * Locate last brace in `str` within the key. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function lastBraceInKey(str) { - var len = str.length - , brace - , c; - for (var i = 0; i < len; ++i) { - c = str[i]; - if (']' == c) brace = false; - if ('[' == c) brace = true; - if ('=' == c && !brace) return i; - } -} - -/** - * Decode `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -function decode(str) { - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (err) { - return str; - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/package.json deleted file mode 100644 index 3568353..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "qs", - "description": "querystring parser", - "version": "0.6.6", - "keywords": [ - "query string", - "parser", - "component" - ], - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/node-querystring.git" - }, - "devDependencies": { - "mocha": "*", - "expect.js": "*" - }, - "scripts": { - "test": "make test" - }, - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "main": "index", - "engines": { - "node": "*" - }, - "bugs": { - "url": "https://github.com/visionmedia/node-querystring/issues" - }, - "_id": "qs@0.6.6", - "dist": { - "shasum": "6e015098ff51968b8a3c819001d5f2c89bc4b107", - "tarball": "http://registry.npmjs.org/qs/-/qs-0.6.6.tgz" - }, - "_from": "qs@0.6.6", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "6e015098ff51968b8a3c819001d5f2c89bc4b107", - "_resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/visionmedia/node-querystring" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/History.md deleted file mode 100644 index b35ba51..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/History.md +++ /dev/null @@ -1,21 +0,0 @@ - -1.0.0 / 2013-12-11 -================== - - * add repository to package.json - * add MIT license - -0.0.4 / 2012-06-17 -================== - - * changed: ret -1 for unsatisfiable and -2 when invalid - -0.0.3 / 2012-06-17 -================== - - * fix last-byte-pos default to len - 1 - -0.0.2 / 2012-06-14 -================== - - * add `.type` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Readme.md deleted file mode 100644 index cb30a5a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Readme.md +++ /dev/null @@ -1,53 +0,0 @@ - -# node-range-parser - - Range header field parser. - -## Example: - -```js -assert(-1 == parse(200, 'bytes=500-20')); -assert(-2 == parse(200, 'bytes=malformed')); -parse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }])); -parse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }])); -parse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }])); -parse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }])); -parse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }])); -parse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }])); -parse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }])); -parse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }])); -parse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }])); -``` - -## Installation - -``` -$ npm install range-parser -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/index.js deleted file mode 100644 index 9b0f7a8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/index.js +++ /dev/null @@ -1,49 +0,0 @@ - -/** - * Parse "Range" header `str` relative to the given file `size`. - * - * @param {Number} size - * @param {String} str - * @return {Array} - * @api public - */ - -module.exports = function(size, str){ - var valid = true; - var i = str.indexOf('='); - - if (-1 == i) return -2; - - var arr = str.slice(i + 1).split(',').map(function(range){ - var range = range.split('-') - , start = parseInt(range[0], 10) - , end = parseInt(range[1], 10); - - // -nnn - if (isNaN(start)) { - start = size - end; - end = size - 1; - // nnn- - } else if (isNaN(end)) { - end = size - 1; - } - - // limit last-byte-pos to current length - if (end > size - 1) end = size - 1; - - // invalid - if (isNaN(start) - || isNaN(end) - || start > end - || start < 0) valid = false; - - return { - start: start, - end: end - }; - }); - - arr.type = str.slice(0, i); - - return valid ? arr : -1; -}; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/package.json deleted file mode 100644 index 568c0f1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "range-parser", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "Range header field string parser", - "version": "1.0.0", - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-range-parser.git" - }, - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/visionmedia/node-range-parser#license" - } - ], - "bugs": { - "url": "https://github.com/visionmedia/node-range-parser/issues" - }, - "_id": "range-parser@1.0.0", - "dist": { - "shasum": "a4b264cfe0be5ce36abe3765ac9c2a248746dbc0", - "tarball": "http://registry.npmjs.org/range-parser/-/range-parser-1.0.0.tgz" - }, - "_from": "range-parser@1.0.0", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "a4b264cfe0be5ce36abe3765ac9c2a248746dbc0", - "_resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.0.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/visionmedia/node-range-parser" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/.npmignore deleted file mode 100644 index 223570e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -coverage -test -examples -.travis.yml -*.sock diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/History.md deleted file mode 100644 index 9cf4069..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/History.md +++ /dev/null @@ -1,137 +0,0 @@ -0.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -0.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -0.7.0 / 2014-07-20 -================== - - * Deprecate `hidden` option; use `dotfiles` option - * Add `dotfiles` option - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - -0.6.0 / 2014-07-11 -================== - - * Deprecate `from` option; use `root` option - * Deprecate `send.etag()` -- use `etag` in `options` - * Deprecate `send.hidden()` -- use `hidden` in `options` - * Deprecate `send.index()` -- use `index` in `options` - * Deprecate `send.maxage()` -- use `maxAge` in `options` - * Deprecate `send.root()` -- use `root` in `options` - * Cap `maxAge` value to 1 year - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.5.0 / 2014-06-28 -================== - - * Accept string for `maxAge` (converted by `ms`) - * Add `headers` event - * Include link in default redirect response - * Use `EventEmitter.listenerCount` to count listeners - -0.4.3 / 2014-06-11 -================== - - * Do not throw un-catchable error on file open race condition - * Use `escape-html` for HTML escaping - * deps: debug@1.0.2 - - fix some debugging output colors on node.js 0.8 - * deps: finished@1.2.2 - * deps: fresh@0.2.2 - -0.4.2 / 2014-06-09 -================== - - * fix "event emitter leak" warnings - * deps: debug@1.0.1 - * deps: finished@1.2.1 - -0.4.1 / 2014-06-02 -================== - - * Send `max-age` in `Cache-Control` in correct format - -0.4.0 / 2014-05-27 -================== - - * Calculate ETag with md5 for reduced collisions - * Fix wrong behavior when index file matches directory - * Ignore stream errors after request ends - - Goodbye `EBADF, read` - * Skip directories in index file search - * deps: debug@0.8.1 - -0.3.0 / 2014-04-24 -================== - - * Fix sending files with dots without root set - * Coerce option types - * Accept API options in options object - * Set etags to "weak" - * Include file path in etag - * Make "Can't set headers after they are sent." catchable - * Send full entity-body for multi range requests - * Default directory access to 403 when index disabled - * Support multiple index paths - * Support "If-Range" header - * Control whether to generate etags - * deps: mime@1.2.11 - -0.2.0 / 2014-01-29 -================== - - * update range-parser and fresh - -0.1.4 / 2013-08-11 -================== - - * update fresh - -0.1.3 / 2013-07-08 -================== - - * Revert "Fix fd leak" - -0.1.2 / 2013-07-03 -================== - - * Fix fd leak - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/Readme.md deleted file mode 100644 index 5eceeef..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/Readme.md +++ /dev/null @@ -1,159 +0,0 @@ -# send - -[![NPM version](https://badge.fury.io/js/send.svg)](https://badge.fury.io/js/send) -[![Build Status](https://travis-ci.org/visionmedia/send.svg?branch=master)](https://travis-ci.org/visionmedia/send) -[![Coverage Status](https://img.shields.io/coveralls/visionmedia/send.svg?branch=master)](https://coveralls.io/r/visionmedia/send) - - Send is Connect's `static()` extracted for generalized use, a streaming static file - server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework. - -## Installation - - $ npm install send - -## Examples - - Small: - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - send(req, req.url).pipe(res); -}).listen(3000); -``` - - Serving from a root directory with custom error-handling: - -```js -var http = require('http'); -var send = require('send'); -var url = require('url'); - -var app = http.createServer(function(req, res){ - // your custom error-handling logic: - function error(err) { - res.statusCode = err.status || 500; - res.end(err.message); - } - - // your custom headers - function headers(res, path, stat) { - // serve all files for download - res.setHeader('Content-Disposition', 'attachment'); - } - - // your custom directory handling logic: - function redirect() { - res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, url.parse(req.url).pathname, {root: '/www/example.com/public'}) - .on('error', error) - .on('directory', redirect) - .on('headers', headers) - .pipe(res); -}).listen(3000); -``` - -## API - -### Options - -#### etag - - Enable or disable etag generation, defaults to true. - -#### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file - or directory that begins with a dot ("."). Note this check is done on - the path itself without checking if the path actually exists on the - disk. If `root` is specified, only the dotfiles above the root are - checked (i.e. the root itself can be within a dotfile when when set - to "deny"). - - The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and 404. - -#### index - - By default send supports "index.html" files, to disable this - set `false` or to supply a new index pass a string or an array - in preferred order. - -#### maxAge - - Provide a max-age in milliseconds for http caching, defaults to 0. - This can also be a string accepted by the - [ms](https://www.npmjs.org/package/ms#readme) module. - -#### root - - Serve files relative to `path`. - -### Events - - - `error` an error occurred `(err)` - - `directory` a directory was requested - - `file` a file was requested `(path, stat)` - - `headers` the headers are about to be set on a file `(res, path, stat)` - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -## Error-handling - - By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc. - -## Caching - - It does _not_ perform internal caching, you should use a reverse proxy cache such - as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;). - -## Debugging - - To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ npm test -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/index.js deleted file mode 100644 index 51b2b57..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/send'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/send.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/send.js deleted file mode 100644 index 1e71b58..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/send.js +++ /dev/null @@ -1,711 +0,0 @@ - -/** - * Module dependencies. - */ - -var debug = require('debug')('send') -var deprecate = require('depd')('send') -var escapeHtml = require('escape-html') - , parseRange = require('range-parser') - , Stream = require('stream') - , mime = require('mime') - , fresh = require('fresh') - , path = require('path') - , http = require('http') - , onFinished = require('finished') - , fs = require('fs') - , normalize = path.normalize - , join = path.join - , utils = require('./utils'); -var EventEmitter = require('events').EventEmitter; -var ms = require('ms'); - -/** - * Variables. - */ -var maxMaxAge = 60 * 60 * 24 * 365 * 1000; // 1 year -var resolve = path.resolve -var sep = path.sep -var upPathRegexp = /(?:^|[\\\/])\.\.(?:[\\\/]|$)/ - -/** - * Expose `send`. - */ - -exports = module.exports = send; - -/** - * Expose mime module. - */ - -exports.mime = mime; - -/** - * Shim EventEmitter.listenerCount for node.js < 0.10 - */ - -/* istanbul ignore next */ -var listenerCount = EventEmitter.listenerCount - || function(emitter, type){ return emitter.listeners(type).length; }; - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @return {SendStream} - * @api public - */ - -function send(req, path, options) { - return new SendStream(req, path, options); -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @api private - */ - -function SendStream(req, path, options) { - var self = this; - options = options || {}; - this.req = req; - this.path = path; - this.options = options; - - this._etag = options.etag !== undefined - ? Boolean(options.etag) - : true - - this._dotfiles = options.dotfiles !== undefined - ? options.dotfiles - : 'ignore' - - if (['allow', 'deny', 'ignore'].indexOf(this._dotfiles) === -1) { - throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') - } - - this._hidden = Boolean(options.hidden) - - if ('hidden' in options) { - deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') - } - - // legacy support - if (!('dotfiles' in options)) { - this._dotfiles = undefined - } - - this._index = options.index !== undefined - ? normalizeIndex(options.index) - : ['index.html'] - - this._maxage = options.maxAge || options.maxage - this._maxage = typeof this._maxage === 'string' - ? ms(this._maxage) - : Number(this._maxage) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), maxMaxAge) - : 0 - - this._root = options.root - ? resolve(options.root) - : null - - if (!this._root && options.from) { - this.from(options.from); - } -} - -/** - * Inherits from `Stream.prototype`. - */ - -SendStream.prototype.__proto__ = Stream.prototype; - -/** - * Enable or disable etag generation. - * - * @param {Boolean} val - * @return {SendStream} - * @api public - */ - -SendStream.prototype.etag = deprecate.function(function etag(val) { - val = Boolean(val); - debug('etag %s', val); - this._etag = val; - return this; -}, 'send.etag: pass etag as option'); - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = deprecate.function(function hidden(val) { - val = Boolean(val); - debug('hidden %s', val); - this._hidden = val; - this._dotfiles = undefined - return this; -}, 'send.hidden: use dotfiles option'); - -/** - * Set index `paths`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean|Array} paths - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = deprecate.function(function index(paths) { - var index = !paths ? [] : normalizeIndex(paths); - debug('index %o', paths); - this._index = index; - return this; -}, 'send.index: pass index as option'); - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = function(path){ - path = String(path); - this._root = resolve(path) - return this; -}; - -SendStream.prototype.from = deprecate.function(SendStream.prototype.root, - 'send.from: pass root as option'); - -SendStream.prototype.root = deprecate.function(SendStream.prototype.root, - 'send.root: pass root as option'); - -/** - * Set max-age to `maxAge`. - * - * @param {Number} maxAge - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = deprecate.function(function maxage(maxAge) { - maxAge = typeof maxAge === 'string' - ? ms(maxAge) - : Number(maxAge); - if (isNaN(maxAge)) maxAge = 0; - if (Infinity == maxAge) maxAge = 60 * 60 * 24 * 365 * 1000; - debug('max-age %d', maxAge); - this._maxage = maxAge; - return this; -}, 'send.maxage: pass maxAge as option'); - -/** - * Emit error with `status`. - * - * @param {Number} status - * @api private - */ - -SendStream.prototype.error = function(status, err){ - var res = this.res; - var msg = http.STATUS_CODES[status]; - - err = err || new Error(msg); - err.status = status; - - // emit if listeners instead of responding - if (listenerCount(this, 'error') !== 0) { - return this.emit('error', err); - } - - // wipe all existing headers - res._headers = undefined; - - res.statusCode = err.status; - res.end(msg); -}; - -/** - * Check if the pathname ends with "/". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasTrailingSlash = function(){ - return '/' == this.path[this.path.length - 1]; -}; - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function(){ - return this.req.headers['if-none-match'] - || this.req.headers['if-modified-since']; -}; - -/** - * Strip content-* header fields. - * - * @api private - */ - -SendStream.prototype.removeContentHeaderFields = function(){ - var res = this.res; - Object.keys(res._headers).forEach(function(field){ - if (0 == field.indexOf('content')) { - res.removeHeader(field); - } - }); -}; - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function(){ - var res = this.res; - debug('not modified'); - this.removeContentHeaderFields(); - res.statusCode = 304; - res.end(); -}; - -/** - * Raise error that headers already sent. - * - * @api private - */ - -SendStream.prototype.headersAlreadySent = function headersAlreadySent(){ - var err = new Error('Can\'t set headers after they are sent.'); - debug('headers already sent'); - this.error(500, err); -}; - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function(){ - var res = this.res; - return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; -}; - -/** - * Handle stat() error. - * - * @param {Error} err - * @api private - */ - -SendStream.prototype.onStatError = function(err){ - var notfound = ['ENOENT', 'ENAMETOOLONG', 'ENOTDIR']; - if (~notfound.indexOf(err.code)) return this.error(404, err); - this.error(500, err); -}; - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function(){ - return fresh(this.req.headers, this.res._headers); -}; - -/** - * Check if the range is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isRangeFresh = function isRangeFresh(){ - var ifRange = this.req.headers['if-range']; - - if (!ifRange) return true; - - return ~ifRange.indexOf('"') - ? ~ifRange.indexOf(this.res._headers['etag']) - : Date.parse(this.res._headers['last-modified']) <= Date.parse(ifRange); -}; - -/** - * Redirect to `path`. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.redirect = function(path){ - if (listenerCount(this, 'directory') !== 0) { - return this.emit('directory'); - } - - if (this.hasTrailingSlash()) return this.error(403); - var res = this.res; - path += '/'; - res.statusCode = 301; - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.setHeader('Location', path); - res.end('Redirecting to ' + escapeHtml(path) + '\n'); -}; - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function(res){ - var self = this - , args = arguments - , root = this._root; - - // references - this.res = res; - - // decode the path - var path = utils.decode(this.path) - if (path === -1) return this.error(400) - - // null byte(s) - if (~path.indexOf('\0')) return this.error(400); - - var parts - if (root !== null) { - // join / normalize from optional root dir - path = normalize(join(root, path)) - - // malicious path - if (path.substr(0, root.length) !== root) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = path.substr(root.length + 1).split(sep) - } else { - // ".." is malicious without "root" - if (upPathRegexp.test(path)) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = normalize(path).split(sep) - - // resolve the path - path = resolve(path) - } - - // dotfile handling - if (containsDotFile(parts)) { - var access = this._dotfiles - - // legacy support - if (access === undefined) { - access = parts[parts.length - 1][0] === '.' - ? (this._hidden ? 'allow' : 'ignore') - : 'allow' - } - - debug('%s dotfile "%s"', access, path) - switch (access) { - case 'allow': - break - case 'deny': - return this.error(403) - case 'ignore': - default: - return this.error(404) - } - } - - // index file support - if (this._index.length && this.hasTrailingSlash()) { - this.sendIndex(path); - return res; - } - - debug('stat "%s"', path); - fs.stat(path, function(err, stat){ - if (err) return self.onStatError(err); - if (stat.isDirectory()) return self.redirect(self.path); - self.emit('file', path, stat); - self.send(path, stat); - }); - - return res; -}; - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function(path, stat){ - var options = this.options; - var len = stat.size; - var res = this.res; - var req = this.req; - var ranges = req.headers.range; - var offset = options.start || 0; - - if (res._header) { - // impossible to send now - return this.headersAlreadySent(); - } - - debug('pipe "%s"', path) - - // set header fields - this.setHeader(path, stat); - - // set content-type - this.type(path); - - // conditional GET support - if (this.isConditionalGET() - && this.isCachable() - && this.isFresh()) { - return this.notModified(); - } - - // adjust len to start/end options - len = Math.max(0, len - offset); - if (options.end !== undefined) { - var bytes = options.end - offset + 1; - if (len > bytes) len = bytes; - } - - // Range support - if (ranges) { - ranges = parseRange(len, ranges); - - // If-Range support - if (!this.isRangeFresh()) { - debug('range stale'); - ranges = -2; - } - - // unsatisfiable - if (-1 == ranges) { - debug('range unsatisfiable'); - res.setHeader('Content-Range', 'bytes */' + stat.size); - return this.error(416); - } - - // valid (syntactically invalid/multiple ranges are treated as a regular response) - if (-2 != ranges && ranges.length === 1) { - debug('range %j', ranges); - - options.start = offset + ranges[0].start; - options.end = offset + ranges[0].end; - - // Content-Range - res.statusCode = 206; - res.setHeader('Content-Range', 'bytes ' - + ranges[0].start - + '-' - + ranges[0].end - + '/' - + len); - len = options.end - options.start + 1; - } - } - - // content-length - res.setHeader('Content-Length', len); - - // HEAD support - if ('HEAD' == req.method) return res.end(); - - this.stream(path, options); -}; - -/** - * Transfer index for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendIndex = function sendIndex(path){ - var i = -1; - var self = this; - - function next(err){ - if (++i >= self._index.length) { - if (err) return self.onStatError(err); - return self.error(404); - } - - var p = path + self._index[i]; - - debug('stat "%s"', p); - fs.stat(p, function(err, stat){ - if (err) return next(err); - if (stat.isDirectory()) return next(); - self.emit('file', p, stat); - self.send(p, stat); - }); - } - - if (!this.hasTrailingSlash()) path += '/'; - - next(); -}; - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function(path, options){ - // TODO: this is all lame, refactor meeee - var finished = false; - var self = this; - var res = this.res; - var req = this.req; - - // pipe - var stream = fs.createReadStream(path, options); - this.emit('stream', stream); - stream.pipe(res); - - // response finished, done with the fd - onFinished(res, function onfinished(){ - finished = true; - stream.destroy(); - }); - - // error handling code-smell - stream.on('error', function onerror(err){ - // request already finished - if (finished) return; - - // clean up stream - finished = true; - stream.destroy(); - - // no hope in responding - if (res._header) { - console.error(err.stack); - req.destroy(); - return; - } - - // error - self.onStatError(err); - }); - - // end - stream.on('end', function onend(){ - self.emit('end'); - }); -}; - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function(path){ - var res = this.res; - if (res.getHeader('Content-Type')) return; - var type = mime.lookup(path); - var charset = mime.charsets.lookup(type); - debug('content-type %s', type); - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); -}; - -/** - * Set response header fields, most - * fields may be pre-defined. - * - * @param {String} path - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function setHeader(path, stat){ - var res = this.res; - - this.emit('headers', res, path, stat); - - if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); - if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString()); - if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + Math.floor(this._maxage / 1000)); - if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString()); - - if (this._etag && !res.getHeader('ETag')) { - var etag = utils.etag(path, stat); - debug('etag %s', etag); - res.setHeader('ETag', etag); - } -}; - -/** - * Determine if path parts contain a dotfile. - * - * @api private - */ - -function containsDotFile(parts) { - for (var i = 0; i < parts.length; i++) { - if (parts[i][0] === '.') { - return true - } - } - - return false -} - -/** - * Normalize the index option into an array. - * - * @param {boolean|string|array} val - * @api private - */ - -function normalizeIndex(val){ - return [].concat(val || []) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/utils.js deleted file mode 100644 index 3a88bf9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/utils.js +++ /dev/null @@ -1,42 +0,0 @@ - -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Return a weak ETag from the given `path` and `stat`. - * - * @param {String} path - * @param {Object} stat - * @return {String} - * @api private - */ - -exports.etag = function etag(path, stat) { - var tag = String(stat.mtime.getTime()) + ':' + String(stat.size) + ':' + path; - var str = crypto - .createHash('md5') - .update(tag, 'utf8') - .digest('base64'); - return 'W/"' + str + '"'; -}; - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -exports.decode = function(path){ - try { - return decodeURIComponent(path); - } catch (err) { - return -1; - } -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md deleted file mode 100644 index 8937250..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md +++ /dev/null @@ -1,50 +0,0 @@ -1.2.2 / 2014-06-10 -========== - - * reduce listeners added to emitters - - avoids "event emitter leak" warnings when used multiple times on same request - -1.2.1 / 2014-06-08 -================== - - * fix returned value when already finished - -1.2.0 / 2014-06-05 -================== - - * call callback when called on already-finished socket - -1.1.4 / 2014-05-27 -================== - - * support node.js 0.8 - -1.1.3 / 2014-04-30 -================== - - * make sure errors passed as instanceof `Error` - -1.1.2 / 2014-04-18 -================== - - * default the `socket` to passed-in object - -1.1.1 / 2014-01-16 -================== - - * rename module to `finished` - -1.1.0 / 2013-12-25 -================== - - * call callback when called on already-errored socket - -1.0.1 / 2013-12-20 -================== - - * actually pass the error to the callback - -1.0.0 / 2013-12-20 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/README.md deleted file mode 100644 index 79facd5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# finished - -[![NPM Version](https://badge.fury.io/js/finished.svg)](http://badge.fury.io/js/finished) -[![Build Status](https://travis-ci.org/expressjs/finished.svg?branch=master)](https://travis-ci.org/expressjs/finished) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/finished.svg?branch=master)](https://coveralls.io/r/expressjs/finished) - -Execute a callback when a request closes, finishes, or errors. - -#### Install - -```sh -$ npm install finished -``` - -#### Uses - -This is useful for cleaning up streams. For example, you want to destroy any file streams you create on socket errors otherwise you will leak file descriptors. - -This is required to fix what many perceive as issues with node's streams. Relevant: - -- [node#6041](https://github.com/joyent/node/issues/6041) -- [koa#184](https://github.com/koajs/koa/issues/184) -- [koa#165](https://github.com/koajs/koa/issues/165) - -## API - -### finished(response, callback) - -```js -var onFinished = require('finished') - -onFinished(res, function (err) { - // do something maybe -}) -``` - -### Examples - -The following code ensures that file descriptors are always closed once the response finishes. - -#### Node / Connect / Express - -```js -var onFinished = require('finished') - -function (req, res, next) { - var stream = fs.createReadStream('thingie.json') - stream.pipe(res) - onFinished(res, function (err) { - stream.destroy() - }) -} -``` - -#### Koa - -```js -function* () { - var stream = this.body = fs.createReadStream('thingie.json') - onFinished(this, function (err) { - stream.destroy() - }) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/index.js deleted file mode 100644 index 90709d4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/index.js +++ /dev/null @@ -1,62 +0,0 @@ -/*! - * finished - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** -* Module dependencies. -*/ - -var first = require('ee-first') - -/** -* Variables. -*/ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Invoke callback when the response has finished, useful for - * cleaning up resources afterwards. - * - * @param {object} thingie - * @param {function} callback - * @return {object} - * @api public - */ - -module.exports = function finished(thingie, callback) { - var socket = thingie.socket || thingie - var res = thingie.res || thingie - - if (res.finished || !socket.writable) { - defer(callback) - return thingie - } - - var listener = res.__onFinished - - // create a private single listener with queue - if (!listener || !listener.queue) { - listener = res.__onFinished = function onFinished(err) { - if (res.__onFinished === listener) res.__onFinished = null - var queue = listener.queue || [] - while (queue.length) queue.shift()(err) - } - listener.queue = [] - - // finished on first event - first([ - [socket, 'error', 'close'], - [res, 'finish'], - ], listener) - } - - listener.queue.push(callback) - - return thingie -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore deleted file mode 100644 index 72921ab..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.DS_Store* -node_modules diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md deleted file mode 100644 index 7eae173..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -# EE First - -Get the first event in a set of event emitters and event pairs, -then clean up after itself. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js deleted file mode 100644 index d0c48c9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js +++ /dev/null @@ -1,60 +0,0 @@ - -module.exports = function first(stuff, done) { - if (!Array.isArray(stuff)) - throw new TypeError('arg must be an array of [ee, events...] arrays') - - var cleanups = [] - - for (var i = 0; i < stuff.length; i++) { - var arr = stuff[i] - - if (!Array.isArray(arr) || arr.length < 2) - throw new TypeError('each array member must be [ee, events...]') - - var ee = arr[0] - - for (var j = 1; j < arr.length; j++) { - var event = arr[j] - var fn = listener(event, cleanup) - - // listen to the event - ee.on(event, fn) - // push this listener to the list of cleanups - cleanups.push({ - ee: ee, - event: event, - fn: fn, - }) - } - } - - return function (fn) { - done = fn - } - - function cleanup() { - var x - for (var i = 0; i < cleanups.length; i++) { - x = cleanups[i] - x.ee.removeListener(x.event, x.fn) - } - done.apply(null, arguments) - } -} - -function listener(event, done) { - return function onevent(arg1) { - var args = new Array(arguments.length) - var ee = this - var err = event === 'error' - ? arg1 - : null - - // copy args to prevent arguments escaping scope - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - done(err, ee, event, args) - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json deleted file mode 100644 index 1f82e3e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "ee-first", - "description": "return the first event in a set of ee/event pairs", - "version": "1.0.3", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/jonathanong/ee-first" - }, - "devDependencies": { - "mocha": "1" - }, - "scripts": { - "test": "mocha --reporter spec" - }, - "bugs": { - "url": "https://github.com/jonathanong/ee-first/issues" - }, - "homepage": "https://github.com/jonathanong/ee-first", - "_id": "ee-first@1.0.3", - "_shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "_from": "ee-first@1.0.3", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "tarball": "http://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js deleted file mode 100644 index adff984..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js +++ /dev/null @@ -1,60 +0,0 @@ - -var EventEmitter = require('events').EventEmitter -var assert = require('assert') - -var first = require('./') - -describe('first', function () { - var ee1 = new EventEmitter() - var ee2 = new EventEmitter() - var ee3 = new EventEmitter() - - it('should emit the first event', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - assert.equal(ee, ee2) - assert.equal(event, 'b') - assert.deepEqual(args, [1, 2, 3]) - done() - }) - - ee2.emit('b', 1, 2, 3) - }) - - it('it should return an error if event === error', function (done) { - first([ - [ee1, 'error', 'b', 'c'], - [ee2, 'error', 'b', 'c'], - [ee3, 'error', 'b', 'c'], - ], function (err, ee, event, args) { - assert.equal(err.message, 'boom') - assert.equal(ee, ee3) - assert.equal(event, 'error') - done() - }) - - ee3.emit('error', new Error('boom')) - }) - - it('should cleanup after itself', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - ;[ee1, ee2, ee3].forEach(function (ee) { - ['a', 'b', 'c'].forEach(function (event) { - assert(!ee.listeners(event).length) - }) - }) - done() - }) - - ee1.emit('a') - }) -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/package.json deleted file mode 100644 index b645a74..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "finished", - "description": "Execute a callback when a request closes, finishes, or errors", - "version": "1.2.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/finished" - }, - "dependencies": { - "ee-first": "1.0.3" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.1", - "should": "~4.0.1" - }, - "engine": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/finished/issues" - }, - "homepage": "https://github.com/expressjs/finished", - "_id": "finished@1.2.2", - "_shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "_from": "finished@1.2.2", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "tarball": "http://registry.npmjs.org/finished/-/finished-1.2.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/README.md deleted file mode 100644 index 6ca19bd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.default_type -Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/mime.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/mime.js deleted file mode 100644 index 48be0c5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/mime.js +++ /dev/null @@ -1,114 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - if (process.env.DEBUG_MIME && this.types[exts]) { - console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + - this.types[exts] + ' to ' + type); - } - - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - - this._loading = file; - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); - - this._loading = null; -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); - return this.extensions[type]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -}; - -module.exports = mime; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/package.json deleted file mode 100644 index 917e6af..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.2.11", - "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g.\n\n var mime = require('mime');\n\n mime.lookup('/path/to/file.txt'); // => 'text/plain'\n mime.lookup('file.txt'); // => 'text/plain'\n mime.lookup('.TXT'); // => 'text/plain'\n mime.lookup('htm'); // => 'text/html'\n\n### mime.default_type\nSets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)\n\n### mime.extension(type)\nGet the default extension for `type`\n\n mime.extension('text/html'); // => 'html'\n mime.extension('application/octet-stream'); // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n mime.charsets.lookup('text/plain'); // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n mime.define({\n 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n 'application/x-my-type': ['x-mt', 'x-mtt'],\n // etc ...\n });\n\n mime.lookup('x-sft'); // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n mime.load('./my_project.types');\n\nThe .types file format is simple - See the `types` dir for examples.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/broofa/node-mime/issues" - }, - "_id": "mime@1.2.11", - "dist": { - "shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "tarball": "http://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - }, - "_from": "mime@1.2.11", - "_npmVersion": "1.3.6", - "_npmUser": { - "name": "broofa", - "email": "robert@broofa.com" - }, - "maintainers": [ - { - "name": "broofa", - "email": "robert@broofa.com" - }, - { - "name": "bentomas", - "email": "benjamin@benjaminthomas.org" - } - ], - "directories": {}, - "_shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "_resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "homepage": "https://github.com/broofa/node-mime" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/test.js deleted file mode 100644 index 2cda1c7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/test.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); -var path = require('path'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); // normal file -eq('text/plain', mime.lookup('TEXT.TXT')); // uppercase -eq('text/plain', mime.lookup('dir/text.txt')); // dir + file -eq('text/plain', mime.lookup('.text.txt')); // hidden file -eq('text/plain', mime.lookup('.txt')); // nameless -eq('text/plain', mime.lookup('txt')); // extension-only -eq('text/plain', mime.lookup('/txt')); // extension-less () -eq('text/plain', mime.lookup('\\txt')); // Windows, extension-less -eq('application/octet-stream', mime.lookup('text.nope')); // unrecognized -eq('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq('bin', mime.extension('application/octet-stream ')); -eq('html', mime.extension(' text/html; charset=UTF-8')); -eq('html', mime.extension('text/html; charset=UTF-8 ')); -eq('html', mime.extension('text/html; charset=UTF-8')); -eq('html', mime.extension('text/html ; charset=UTF-8')); -eq('html', mime.extension('text/html;charset=UTF-8')); -eq('html', mime.extension('text/Html;charset=UTF-8')); -eq(undefined, mime.extension('unrecognized')); - -// -// Test node.types lookups -// - -eq('application/font-woff', mime.lookup('file.woff')); -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); -eq('font/opentype', mime.lookup('file.otf')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -// -// Test for overlaps between mime.types and node.types -// - -var apacheTypes = new mime.Mime(), nodeTypes = new mime.Mime(); -apacheTypes.load(path.join(__dirname, 'types/mime.types')); -nodeTypes.load(path.join(__dirname, 'types/node.types')); - -var keys = [].concat(Object.keys(apacheTypes.types)) - .concat(Object.keys(nodeTypes.types)); -keys.sort(); -for (var i = 1; i < keys.length; i++) { - if (keys[i] == keys[i-1]) { - console.warn('Warning: ' + - 'node.types defines ' + keys[i] + '->' + nodeTypes.types[keys[i]] + - ', mime.types defines ' + keys[i] + '->' + apacheTypes.types[keys[i]]); - } -} - -console.log('\nOK'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/mime.types b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/mime.types deleted file mode 100644 index da8cd69..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/node.types b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/node.types deleted file mode 100644 index 55b2cf7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/node.types +++ /dev/null @@ -1,77 +0,0 @@ -# What: WebVTT -# Why: To allow formats intended for marking up external text track resources. -# http://dev.w3.org/html5/webvtt/ -# Added by: niftylettuce -text/vtt vtt - -# 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: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifes ('.manifest' extension) -# 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 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: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp - -# What: Lua file types -# Why: Googling around shows de-facto consensus on these -# Added by: creationix (Issue #45) -text/x-lua lua -application/x-lua-bytecode luac - -# What: Markdown files, as per http://daringfireball.net/projects/markdown/syntax -# Why: http://stackoverflow.com/questions/10701983/what-is-the-mime-type-for-markdown -# Added by: avoidwork -text/x-markdown markdown md mkd - -# What: ini files -# Why: because they're just text files -# Added by: Matthew Kastor -text/plain ini - -# What: DASH Adaptive Streaming manifest -# Why: https://developer.mozilla.org/en-US/docs/DASH_Adaptive_Streaming_for_HTML_5_Video -# Added by: eelcocramer -application/dash+xml mdp - -# What: OpenType font files - http://www.microsoft.com/typography/otspec/ -# Why: Browsers usually ignore the font MIME types and sniff the content, -# but Chrome, shows a warning if OpenType fonts aren't served with -# the `font/opentype` MIME type: http://i.imgur.com/8c5RN8M.png. -# Added by: alrra -font/opentype otf diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/README.md deleted file mode 100644 index d4ab12a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours', { long: true })) // "10 hours" -``` - -- Node/Browser compatible. Published as `ms` in NPM. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/index.js deleted file mode 100644 index c5847f8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/package.json deleted file mode 100644 index c4dd654..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "ms", - "version": "0.6.2", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "readme": "# ms.js: miliseconds conversion utility\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('100') // 100\n```\n\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(ms('10 hours', { long: true })) // \"10 hours\"\n```\n\n- Node/Browser compatible. Published as `ms` in NPM.\n- If a number is supplied to `ms`, a string with a unit is returned.\n- If a string that contains the number is supplied, it returns it as\na number (e.g: it returns `100` for `'100'`).\n- If you pass a string with a number and a valid unit, the number of\nequivalent ms is returned.\n\n## License\n\nMIT", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "_id": "ms@0.6.2", - "dist": { - "shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - }, - "_from": "ms@0.6.2", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "directories": {}, - "_shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "homepage": "https://github.com/guille/ms.js" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/package.json deleted file mode 100644 index bb1dd7a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "send", - "description": "Better streaming static file server with Range and conditional-GET support", - "version": "0.7.2", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/send" - }, - "keywords": [ - "static", - "file", - "server" - ], - "dependencies": { - "debug": "1.0.4", - "depd": "0.4.4", - "escape-html": "1.0.1", - "finished": "1.2.2", - "fresh": "0.2.2", - "mime": "1.2.11", - "ms": "0.6.2", - "range-parser": "~1.0.0" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.0", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --check-leaks --reporter spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec" - }, - "bugs": { - "url": "https://github.com/visionmedia/send/issues" - }, - "homepage": "https://github.com/visionmedia/send", - "_id": "send@0.7.2", - "dist": { - "shasum": "3b5f696f701d56fe115b860cc6b3f0cdbfbf7804", - "tarball": "http://registry.npmjs.org/send/-/send-0.7.2.tgz" - }, - "_from": "send@0.7.2", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "3b5f696f701d56fe115b860cc6b3f0cdbfbf7804", - "_resolved": "https://registry.npmjs.org/send/-/send-0.7.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/History.md deleted file mode 100644 index 36f430d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/History.md +++ /dev/null @@ -1,117 +0,0 @@ -1.4.3 / 2014-07-29 -================== - - * deps: send@0.7.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - -1.4.2 / 2014-07-27 -================== - - * deps: send@0.7.2 - - deps: depd@0.4.4 - -1.4.1 / 2014-07-26 -================== - - * deps: send@0.7.1 - - deps: depd@0.4.3 - -1.4.0 / 2014-07-21 -================== - - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -1.3.2 / 2014-07-11 -================== - - * deps: send@0.6.0 - - Cap `maxAge` value to 1 year - - deps: debug@1.0.3 - -1.3.1 / 2014-07-09 -================== - - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -1.3.0 / 2014-06-28 -================== - - * Add `setHeaders` option - * Include HTML link in redirect response - * deps: send@0.5.0 - - Accept string for `maxAge` (converted by `ms`) - -1.2.3 / 2014-06-11 -================== - - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -1.2.2 / 2014-06-09 -================== - - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - -1.2.1 / 2014-06-02 -================== - - * use `escape-html` for escaping - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -1.2.0 / 2014-05-29 -================== - - * deps: send@0.4.0 - - Calculate ETag with md5 for reduced collisions - - Fix wrong behavior when index file matches directory - - Ignore stream errors after request ends - - Skip directories in index file search - - deps: debug@0.8.1 - -1.1.0 / 2014-04-24 -================== - - * Accept options directly to `send` module - * deps: send@0.3.0 - -1.0.4 / 2014-04-07 -================== - - * Resolve relative paths at middleware setup - * Use parseurl to parse the URL from request - -1.0.3 / 2014-03-20 -================== - - * Do not rely on connect-like environments - -1.0.2 / 2014-03-06 -================== - - * deps: send@0.2.0 - -1.0.1 / 2014-03-05 -================== - - * Add mime export for back-compat - -1.0.0 / 2014-03-05 -================== - - * Genesis from `connect` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/LICENSE deleted file mode 100644 index b7bc085..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -(The MIT License) - -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 LearnBoost -Copyright (c) 2011 TJ Holowaychuk -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/Readme.md deleted file mode 100644 index 11dbc01..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/Readme.md +++ /dev/null @@ -1,144 +0,0 @@ -# serve-static - -[![NPM version](https://badge.fury.io/js/serve-static.svg)](http://badge.fury.io/js/serve-static) -[![Build Status](https://travis-ci.org/expressjs/serve-static.svg?branch=master)](https://travis-ci.org/expressjs/serve-static) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/serve-static.svg?branch=master)](https://coveralls.io/r/expressjs/serve-static) -[![Gittip](http://img.shields.io/gittip/dougwilson.svg)](https://www.gittip.com/dougwilson/) - -## Install - -```sh -$ npm install serve-static -``` - -## API - -```js -var serveStatic = require('serve-static') -``` - -### serveStatic(root, options) - -Create a new middleware function to serve files from within a given root -directory. The file to serve will be determined by combining `req.url` -with the provided root directory. When a file is not found, instead of -sending a 404 response, this module will instead call `next()` to move on -to the next middleware, allowing for stacking and fall-backs. - -#### Options - -##### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file -or directory that begins with a dot ("."). Note this check is done on -the path itself without checking if the path actually exists on the -disk. If `root` is specified, only the dotfiles above the root are -checked (i.e. the root itself can be within a dotfile when when set -to "deny"). - -The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and call `next()`. - -##### etag - -Enable or disable etag generation, defaults to true. - -##### index - -By default this module will send "index.html" files in response to a request -on a directory. To disable this set `false` or to supply a new index pass a -string or an array in preferred order. - -##### maxAge - -Provide a max-age in milliseconds for http caching, defaults to 0. This -can also be a string accepted by the [ms](https://www.npmjs.org/package/ms#readme) -module. - -##### redirect - -Redirect to trailing "/" when the pathname is a dir. Defaults to `true`. - -##### setHeaders - -Function to set custom headers on response. - -## Examples - -### Serve files with vanilla node.js http server - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -// Serve up public/ftp folder -var serve = serveStatic('public/ftp', {'index': ['index.html', 'index.htm']}) - -// Create server -var server = http.createServer(function(req, res){ - var done = finalhandler(req, res) - serve(req, res, done) -}) - -// Listen -server.listen(3000) -``` - -### Serve all files from ftp folder - -```js -var connect = require('connect') -var serveStatic = require('serve-static') - -var app = connect() - -app.use(serveStatic('public/ftp', {'index': ['default.html', 'default.htm']})) -app.listen(3000) -``` - -### Serve all files as downloads - -```js -var express = require('express') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic('public/ftp', { - 'index': false, - 'setHeaders': setHeaders -})) -app.listen(3000) - -function setHeaders(res, path) { - res.attachment(path) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/index.js deleted file mode 100644 index caa3acb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/index.js +++ /dev/null @@ -1,122 +0,0 @@ -/*! - * serve-static - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var escapeHtml = require('escape-html'); -var parseurl = require('parseurl'); -var resolve = require('path').resolve; -var send = require('send'); -var url = require('url'); - -/** - * @param {String} root - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function(root, options){ - options = extend({}, options); - - // root required - if (!root) throw new TypeError('root path required'); - - // resolve root to absolute - root = resolve(root); - - // default redirect - var redirect = false !== options.redirect; - - // headers listener - var setHeaders = options.setHeaders - delete options.setHeaders - - if (setHeaders && typeof setHeaders !== 'function') { - throw new TypeError('option setHeaders must be function') - } - - // setup options for send - options.maxage = options.maxage || options.maxAge || 0; - options.root = root; - - return function staticMiddleware(req, res, next) { - if ('GET' != req.method && 'HEAD' != req.method) return next(); - var opts = extend({}, options); - var originalUrl = url.parse(req.originalUrl || req.url); - var path = parseurl(req).pathname; - - if (path === '/' && originalUrl.pathname[originalUrl.pathname.length - 1] !== '/') { - // make sure redirect occurs at mount - path = '' - } - - // create send stream - var stream = send(req, path, opts) - - if (redirect) { - // redirect relative to originalUrl - stream.on('directory', function redirect() { - originalUrl.pathname += '/' - - var target = url.format(originalUrl) - - res.statusCode = 303 - res.setHeader('Content-Type', 'text/html; charset=utf-8') - res.setHeader('Location', target) - res.end('Redirecting to ' + escapeHtml(target) + '\n') - }) - } else { - // forward to next middleware on directory - stream.on('directory', next) - } - - // add headers listener - if (setHeaders) { - stream.on('headers', setHeaders) - } - - // forward non-404 errors - stream.on('error', function error(err) { - next(err.status === 404 ? null : err) - }) - - // pipe - stream.pipe(res) - }; -}; - -/** - * Expose mime module. - * - * If you wish to extend the mime table use this - * reference to the "mime" module in the npm registry. - */ - -exports.mime = send.mime; - -/** - * Shallow clone a single object. - * - * @param {Object} obj - * @param {Object} source - * @return {Object} - * @api private - */ - -function extend(obj, source) { - if (!source) return obj; - - for (var prop in source) { - obj[prop] = source[prop]; - } - - return obj; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore deleted file mode 100644 index 223570e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -coverage -test -examples -.travis.yml -*.sock diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/History.md deleted file mode 100644 index 2b3de42..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/History.md +++ /dev/null @@ -1,142 +0,0 @@ -0.7.3 / 2014-07-29 -================== - - * Fix incorrect 403 on Windows and Node.js 0.11 - -0.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -0.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -0.7.0 / 2014-07-20 -================== - - * Deprecate `hidden` option; use `dotfiles` option - * Add `dotfiles` option - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - -0.6.0 / 2014-07-11 -================== - - * Deprecate `from` option; use `root` option - * Deprecate `send.etag()` -- use `etag` in `options` - * Deprecate `send.hidden()` -- use `hidden` in `options` - * Deprecate `send.index()` -- use `index` in `options` - * Deprecate `send.maxage()` -- use `maxAge` in `options` - * Deprecate `send.root()` -- use `root` in `options` - * Cap `maxAge` value to 1 year - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.5.0 / 2014-06-28 -================== - - * Accept string for `maxAge` (converted by `ms`) - * Add `headers` event - * Include link in default redirect response - * Use `EventEmitter.listenerCount` to count listeners - -0.4.3 / 2014-06-11 -================== - - * Do not throw un-catchable error on file open race condition - * Use `escape-html` for HTML escaping - * deps: debug@1.0.2 - - fix some debugging output colors on node.js 0.8 - * deps: finished@1.2.2 - * deps: fresh@0.2.2 - -0.4.2 / 2014-06-09 -================== - - * fix "event emitter leak" warnings - * deps: debug@1.0.1 - * deps: finished@1.2.1 - -0.4.1 / 2014-06-02 -================== - - * Send `max-age` in `Cache-Control` in correct format - -0.4.0 / 2014-05-27 -================== - - * Calculate ETag with md5 for reduced collisions - * Fix wrong behavior when index file matches directory - * Ignore stream errors after request ends - - Goodbye `EBADF, read` - * Skip directories in index file search - * deps: debug@0.8.1 - -0.3.0 / 2014-04-24 -================== - - * Fix sending files with dots without root set - * Coerce option types - * Accept API options in options object - * Set etags to "weak" - * Include file path in etag - * Make "Can't set headers after they are sent." catchable - * Send full entity-body for multi range requests - * Default directory access to 403 when index disabled - * Support multiple index paths - * Support "If-Range" header - * Control whether to generate etags - * deps: mime@1.2.11 - -0.2.0 / 2014-01-29 -================== - - * update range-parser and fresh - -0.1.4 / 2013-08-11 -================== - - * update fresh - -0.1.3 / 2013-07-08 -================== - - * Revert "Fix fd leak" - -0.1.2 / 2013-07-03 -================== - - * Fix fd leak - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md deleted file mode 100644 index 5eceeef..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md +++ /dev/null @@ -1,159 +0,0 @@ -# send - -[![NPM version](https://badge.fury.io/js/send.svg)](https://badge.fury.io/js/send) -[![Build Status](https://travis-ci.org/visionmedia/send.svg?branch=master)](https://travis-ci.org/visionmedia/send) -[![Coverage Status](https://img.shields.io/coveralls/visionmedia/send.svg?branch=master)](https://coveralls.io/r/visionmedia/send) - - Send is Connect's `static()` extracted for generalized use, a streaming static file - server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework. - -## Installation - - $ npm install send - -## Examples - - Small: - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - send(req, req.url).pipe(res); -}).listen(3000); -``` - - Serving from a root directory with custom error-handling: - -```js -var http = require('http'); -var send = require('send'); -var url = require('url'); - -var app = http.createServer(function(req, res){ - // your custom error-handling logic: - function error(err) { - res.statusCode = err.status || 500; - res.end(err.message); - } - - // your custom headers - function headers(res, path, stat) { - // serve all files for download - res.setHeader('Content-Disposition', 'attachment'); - } - - // your custom directory handling logic: - function redirect() { - res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, url.parse(req.url).pathname, {root: '/www/example.com/public'}) - .on('error', error) - .on('directory', redirect) - .on('headers', headers) - .pipe(res); -}).listen(3000); -``` - -## API - -### Options - -#### etag - - Enable or disable etag generation, defaults to true. - -#### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file - or directory that begins with a dot ("."). Note this check is done on - the path itself without checking if the path actually exists on the - disk. If `root` is specified, only the dotfiles above the root are - checked (i.e. the root itself can be within a dotfile when when set - to "deny"). - - The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and 404. - -#### index - - By default send supports "index.html" files, to disable this - set `false` or to supply a new index pass a string or an array - in preferred order. - -#### maxAge - - Provide a max-age in milliseconds for http caching, defaults to 0. - This can also be a string accepted by the - [ms](https://www.npmjs.org/package/ms#readme) module. - -#### root - - Serve files relative to `path`. - -### Events - - - `error` an error occurred `(err)` - - `directory` a directory was requested - - `file` a file was requested `(path, stat)` - - `headers` the headers are about to be set on a file `(res, path, stat)` - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -## Error-handling - - By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc. - -## Caching - - It does _not_ perform internal caching, you should use a reverse proxy cache such - as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;). - -## Debugging - - To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ npm test -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/index.js deleted file mode 100644 index 51b2b57..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/send'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js deleted file mode 100644 index 4bdd001..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js +++ /dev/null @@ -1,712 +0,0 @@ - -/** - * Module dependencies. - */ - -var debug = require('debug')('send') -var deprecate = require('depd')('send') -var escapeHtml = require('escape-html') - , parseRange = require('range-parser') - , Stream = require('stream') - , mime = require('mime') - , fresh = require('fresh') - , path = require('path') - , http = require('http') - , onFinished = require('finished') - , fs = require('fs') - , normalize = path.normalize - , join = path.join - , utils = require('./utils'); -var EventEmitter = require('events').EventEmitter; -var ms = require('ms'); - -/** - * Variables. - */ -var maxMaxAge = 60 * 60 * 24 * 365 * 1000; // 1 year -var resolve = path.resolve -var sep = path.sep -var upPathRegexp = /(?:^|[\\\/])\.\.(?:[\\\/]|$)/ - -/** - * Expose `send`. - */ - -exports = module.exports = send; - -/** - * Expose mime module. - */ - -exports.mime = mime; - -/** - * Shim EventEmitter.listenerCount for node.js < 0.10 - */ - -/* istanbul ignore next */ -var listenerCount = EventEmitter.listenerCount - || function(emitter, type){ return emitter.listeners(type).length; }; - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @return {SendStream} - * @api public - */ - -function send(req, path, options) { - return new SendStream(req, path, options); -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @api private - */ - -function SendStream(req, path, options) { - var self = this; - options = options || {}; - this.req = req; - this.path = path; - this.options = options; - - this._etag = options.etag !== undefined - ? Boolean(options.etag) - : true - - this._dotfiles = options.dotfiles !== undefined - ? options.dotfiles - : 'ignore' - - if (['allow', 'deny', 'ignore'].indexOf(this._dotfiles) === -1) { - throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') - } - - this._hidden = Boolean(options.hidden) - - if ('hidden' in options) { - deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') - } - - // legacy support - if (!('dotfiles' in options)) { - this._dotfiles = undefined - } - - this._index = options.index !== undefined - ? normalizeIndex(options.index) - : ['index.html'] - - this._maxage = options.maxAge || options.maxage - this._maxage = typeof this._maxage === 'string' - ? ms(this._maxage) - : Number(this._maxage) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), maxMaxAge) - : 0 - - this._root = options.root - ? resolve(options.root) - : null - - if (!this._root && options.from) { - this.from(options.from); - } -} - -/** - * Inherits from `Stream.prototype`. - */ - -SendStream.prototype.__proto__ = Stream.prototype; - -/** - * Enable or disable etag generation. - * - * @param {Boolean} val - * @return {SendStream} - * @api public - */ - -SendStream.prototype.etag = deprecate.function(function etag(val) { - val = Boolean(val); - debug('etag %s', val); - this._etag = val; - return this; -}, 'send.etag: pass etag as option'); - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = deprecate.function(function hidden(val) { - val = Boolean(val); - debug('hidden %s', val); - this._hidden = val; - this._dotfiles = undefined - return this; -}, 'send.hidden: use dotfiles option'); - -/** - * Set index `paths`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean|Array} paths - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = deprecate.function(function index(paths) { - var index = !paths ? [] : normalizeIndex(paths); - debug('index %o', paths); - this._index = index; - return this; -}, 'send.index: pass index as option'); - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = function(path){ - path = String(path); - this._root = resolve(path) - return this; -}; - -SendStream.prototype.from = deprecate.function(SendStream.prototype.root, - 'send.from: pass root as option'); - -SendStream.prototype.root = deprecate.function(SendStream.prototype.root, - 'send.root: pass root as option'); - -/** - * Set max-age to `maxAge`. - * - * @param {Number} maxAge - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = deprecate.function(function maxage(maxAge) { - maxAge = typeof maxAge === 'string' - ? ms(maxAge) - : Number(maxAge); - if (isNaN(maxAge)) maxAge = 0; - if (Infinity == maxAge) maxAge = 60 * 60 * 24 * 365 * 1000; - debug('max-age %d', maxAge); - this._maxage = maxAge; - return this; -}, 'send.maxage: pass maxAge as option'); - -/** - * Emit error with `status`. - * - * @param {Number} status - * @api private - */ - -SendStream.prototype.error = function(status, err){ - var res = this.res; - var msg = http.STATUS_CODES[status]; - - err = err || new Error(msg); - err.status = status; - - // emit if listeners instead of responding - if (listenerCount(this, 'error') !== 0) { - return this.emit('error', err); - } - - // wipe all existing headers - res._headers = undefined; - - res.statusCode = err.status; - res.end(msg); -}; - -/** - * Check if the pathname ends with "/". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasTrailingSlash = function(){ - return '/' == this.path[this.path.length - 1]; -}; - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function(){ - return this.req.headers['if-none-match'] - || this.req.headers['if-modified-since']; -}; - -/** - * Strip content-* header fields. - * - * @api private - */ - -SendStream.prototype.removeContentHeaderFields = function(){ - var res = this.res; - Object.keys(res._headers).forEach(function(field){ - if (0 == field.indexOf('content')) { - res.removeHeader(field); - } - }); -}; - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function(){ - var res = this.res; - debug('not modified'); - this.removeContentHeaderFields(); - res.statusCode = 304; - res.end(); -}; - -/** - * Raise error that headers already sent. - * - * @api private - */ - -SendStream.prototype.headersAlreadySent = function headersAlreadySent(){ - var err = new Error('Can\'t set headers after they are sent.'); - debug('headers already sent'); - this.error(500, err); -}; - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function(){ - var res = this.res; - return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; -}; - -/** - * Handle stat() error. - * - * @param {Error} err - * @api private - */ - -SendStream.prototype.onStatError = function(err){ - var notfound = ['ENOENT', 'ENAMETOOLONG', 'ENOTDIR']; - if (~notfound.indexOf(err.code)) return this.error(404, err); - this.error(500, err); -}; - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function(){ - return fresh(this.req.headers, this.res._headers); -}; - -/** - * Check if the range is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isRangeFresh = function isRangeFresh(){ - var ifRange = this.req.headers['if-range']; - - if (!ifRange) return true; - - return ~ifRange.indexOf('"') - ? ~ifRange.indexOf(this.res._headers['etag']) - : Date.parse(this.res._headers['last-modified']) <= Date.parse(ifRange); -}; - -/** - * Redirect to `path`. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.redirect = function(path){ - if (listenerCount(this, 'directory') !== 0) { - return this.emit('directory'); - } - - if (this.hasTrailingSlash()) return this.error(403); - var res = this.res; - path += '/'; - res.statusCode = 301; - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.setHeader('Location', path); - res.end('Redirecting to ' + escapeHtml(path) + '\n'); -}; - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function(res){ - var self = this - , args = arguments - , root = this._root; - - // references - this.res = res; - - // decode the path - var path = utils.decode(this.path) - if (path === -1) return this.error(400) - - // null byte(s) - if (~path.indexOf('\0')) return this.error(400); - - var parts - if (root !== null) { - // join / normalize from optional root dir - path = normalize(join(root, path)) - root = normalize(root) - - // malicious path - if (path.substr(0, root.length) !== root) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = path.substr(root.length + 1).split(sep) - } else { - // ".." is malicious without "root" - if (upPathRegexp.test(path)) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = normalize(path).split(sep) - - // resolve the path - path = resolve(path) - } - - // dotfile handling - if (containsDotFile(parts)) { - var access = this._dotfiles - - // legacy support - if (access === undefined) { - access = parts[parts.length - 1][0] === '.' - ? (this._hidden ? 'allow' : 'ignore') - : 'allow' - } - - debug('%s dotfile "%s"', access, path) - switch (access) { - case 'allow': - break - case 'deny': - return this.error(403) - case 'ignore': - default: - return this.error(404) - } - } - - // index file support - if (this._index.length && this.hasTrailingSlash()) { - this.sendIndex(path); - return res; - } - - debug('stat "%s"', path); - fs.stat(path, function(err, stat){ - if (err) return self.onStatError(err); - if (stat.isDirectory()) return self.redirect(self.path); - self.emit('file', path, stat); - self.send(path, stat); - }); - - return res; -}; - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function(path, stat){ - var options = this.options; - var len = stat.size; - var res = this.res; - var req = this.req; - var ranges = req.headers.range; - var offset = options.start || 0; - - if (res._header) { - // impossible to send now - return this.headersAlreadySent(); - } - - debug('pipe "%s"', path) - - // set header fields - this.setHeader(path, stat); - - // set content-type - this.type(path); - - // conditional GET support - if (this.isConditionalGET() - && this.isCachable() - && this.isFresh()) { - return this.notModified(); - } - - // adjust len to start/end options - len = Math.max(0, len - offset); - if (options.end !== undefined) { - var bytes = options.end - offset + 1; - if (len > bytes) len = bytes; - } - - // Range support - if (ranges) { - ranges = parseRange(len, ranges); - - // If-Range support - if (!this.isRangeFresh()) { - debug('range stale'); - ranges = -2; - } - - // unsatisfiable - if (-1 == ranges) { - debug('range unsatisfiable'); - res.setHeader('Content-Range', 'bytes */' + stat.size); - return this.error(416); - } - - // valid (syntactically invalid/multiple ranges are treated as a regular response) - if (-2 != ranges && ranges.length === 1) { - debug('range %j', ranges); - - options.start = offset + ranges[0].start; - options.end = offset + ranges[0].end; - - // Content-Range - res.statusCode = 206; - res.setHeader('Content-Range', 'bytes ' - + ranges[0].start - + '-' - + ranges[0].end - + '/' - + len); - len = options.end - options.start + 1; - } - } - - // content-length - res.setHeader('Content-Length', len); - - // HEAD support - if ('HEAD' == req.method) return res.end(); - - this.stream(path, options); -}; - -/** - * Transfer index for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendIndex = function sendIndex(path){ - var i = -1; - var self = this; - - function next(err){ - if (++i >= self._index.length) { - if (err) return self.onStatError(err); - return self.error(404); - } - - var p = path + self._index[i]; - - debug('stat "%s"', p); - fs.stat(p, function(err, stat){ - if (err) return next(err); - if (stat.isDirectory()) return next(); - self.emit('file', p, stat); - self.send(p, stat); - }); - } - - if (!this.hasTrailingSlash()) path += '/'; - - next(); -}; - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function(path, options){ - // TODO: this is all lame, refactor meeee - var finished = false; - var self = this; - var res = this.res; - var req = this.req; - - // pipe - var stream = fs.createReadStream(path, options); - this.emit('stream', stream); - stream.pipe(res); - - // response finished, done with the fd - onFinished(res, function onfinished(){ - finished = true; - stream.destroy(); - }); - - // error handling code-smell - stream.on('error', function onerror(err){ - // request already finished - if (finished) return; - - // clean up stream - finished = true; - stream.destroy(); - - // no hope in responding - if (res._header) { - console.error(err.stack); - req.destroy(); - return; - } - - // error - self.onStatError(err); - }); - - // end - stream.on('end', function onend(){ - self.emit('end'); - }); -}; - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function(path){ - var res = this.res; - if (res.getHeader('Content-Type')) return; - var type = mime.lookup(path); - var charset = mime.charsets.lookup(type); - debug('content-type %s', type); - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); -}; - -/** - * Set response header fields, most - * fields may be pre-defined. - * - * @param {String} path - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function setHeader(path, stat){ - var res = this.res; - - this.emit('headers', res, path, stat); - - if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); - if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString()); - if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + Math.floor(this._maxage / 1000)); - if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString()); - - if (this._etag && !res.getHeader('ETag')) { - var etag = utils.etag(path, stat); - debug('etag %s', etag); - res.setHeader('ETag', etag); - } -}; - -/** - * Determine if path parts contain a dotfile. - * - * @api private - */ - -function containsDotFile(parts) { - for (var i = 0; i < parts.length; i++) { - if (parts[i][0] === '.') { - return true - } - } - - return false -} - -/** - * Normalize the index option into an array. - * - * @param {boolean|string|array} val - * @api private - */ - -function normalizeIndex(val){ - return [].concat(val || []) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js deleted file mode 100644 index 3a88bf9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js +++ /dev/null @@ -1,42 +0,0 @@ - -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Return a weak ETag from the given `path` and `stat`. - * - * @param {String} path - * @param {Object} stat - * @return {String} - * @api private - */ - -exports.etag = function etag(path, stat) { - var tag = String(stat.mtime.getTime()) + ':' + String(stat.size) + ':' + path; - var str = crypto - .createHash('md5') - .update(tag, 'utf8') - .digest('base64'); - return 'W/"' + str + '"'; -}; - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -exports.decode = function(path){ - try { - return decodeURIComponent(path); - } catch (err) { - return -1; - } -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md deleted file mode 100644 index 8937250..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md +++ /dev/null @@ -1,50 +0,0 @@ -1.2.2 / 2014-06-10 -========== - - * reduce listeners added to emitters - - avoids "event emitter leak" warnings when used multiple times on same request - -1.2.1 / 2014-06-08 -================== - - * fix returned value when already finished - -1.2.0 / 2014-06-05 -================== - - * call callback when called on already-finished socket - -1.1.4 / 2014-05-27 -================== - - * support node.js 0.8 - -1.1.3 / 2014-04-30 -================== - - * make sure errors passed as instanceof `Error` - -1.1.2 / 2014-04-18 -================== - - * default the `socket` to passed-in object - -1.1.1 / 2014-01-16 -================== - - * rename module to `finished` - -1.1.0 / 2013-12-25 -================== - - * call callback when called on already-errored socket - -1.0.1 / 2013-12-20 -================== - - * actually pass the error to the callback - -1.0.0 / 2013-12-20 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md deleted file mode 100644 index 79facd5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# finished - -[![NPM Version](https://badge.fury.io/js/finished.svg)](http://badge.fury.io/js/finished) -[![Build Status](https://travis-ci.org/expressjs/finished.svg?branch=master)](https://travis-ci.org/expressjs/finished) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/finished.svg?branch=master)](https://coveralls.io/r/expressjs/finished) - -Execute a callback when a request closes, finishes, or errors. - -#### Install - -```sh -$ npm install finished -``` - -#### Uses - -This is useful for cleaning up streams. For example, you want to destroy any file streams you create on socket errors otherwise you will leak file descriptors. - -This is required to fix what many perceive as issues with node's streams. Relevant: - -- [node#6041](https://github.com/joyent/node/issues/6041) -- [koa#184](https://github.com/koajs/koa/issues/184) -- [koa#165](https://github.com/koajs/koa/issues/165) - -## API - -### finished(response, callback) - -```js -var onFinished = require('finished') - -onFinished(res, function (err) { - // do something maybe -}) -``` - -### Examples - -The following code ensures that file descriptors are always closed once the response finishes. - -#### Node / Connect / Express - -```js -var onFinished = require('finished') - -function (req, res, next) { - var stream = fs.createReadStream('thingie.json') - stream.pipe(res) - onFinished(res, function (err) { - stream.destroy() - }) -} -``` - -#### Koa - -```js -function* () { - var stream = this.body = fs.createReadStream('thingie.json') - onFinished(this, function (err) { - stream.destroy() - }) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js deleted file mode 100644 index 90709d4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js +++ /dev/null @@ -1,62 +0,0 @@ -/*! - * finished - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** -* Module dependencies. -*/ - -var first = require('ee-first') - -/** -* Variables. -*/ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Invoke callback when the response has finished, useful for - * cleaning up resources afterwards. - * - * @param {object} thingie - * @param {function} callback - * @return {object} - * @api public - */ - -module.exports = function finished(thingie, callback) { - var socket = thingie.socket || thingie - var res = thingie.res || thingie - - if (res.finished || !socket.writable) { - defer(callback) - return thingie - } - - var listener = res.__onFinished - - // create a private single listener with queue - if (!listener || !listener.queue) { - listener = res.__onFinished = function onFinished(err) { - if (res.__onFinished === listener) res.__onFinished = null - var queue = listener.queue || [] - while (queue.length) queue.shift()(err) - } - listener.queue = [] - - // finished on first event - first([ - [socket, 'error', 'close'], - [res, 'finish'], - ], listener) - } - - listener.queue.push(callback) - - return thingie -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore deleted file mode 100644 index 72921ab..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.DS_Store* -node_modules diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md deleted file mode 100644 index 7eae173..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -# EE First - -Get the first event in a set of event emitters and event pairs, -then clean up after itself. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js deleted file mode 100644 index d0c48c9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js +++ /dev/null @@ -1,60 +0,0 @@ - -module.exports = function first(stuff, done) { - if (!Array.isArray(stuff)) - throw new TypeError('arg must be an array of [ee, events...] arrays') - - var cleanups = [] - - for (var i = 0; i < stuff.length; i++) { - var arr = stuff[i] - - if (!Array.isArray(arr) || arr.length < 2) - throw new TypeError('each array member must be [ee, events...]') - - var ee = arr[0] - - for (var j = 1; j < arr.length; j++) { - var event = arr[j] - var fn = listener(event, cleanup) - - // listen to the event - ee.on(event, fn) - // push this listener to the list of cleanups - cleanups.push({ - ee: ee, - event: event, - fn: fn, - }) - } - } - - return function (fn) { - done = fn - } - - function cleanup() { - var x - for (var i = 0; i < cleanups.length; i++) { - x = cleanups[i] - x.ee.removeListener(x.event, x.fn) - } - done.apply(null, arguments) - } -} - -function listener(event, done) { - return function onevent(arg1) { - var args = new Array(arguments.length) - var ee = this - var err = event === 'error' - ? arg1 - : null - - // copy args to prevent arguments escaping scope - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - done(err, ee, event, args) - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json deleted file mode 100644 index 1f82e3e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "ee-first", - "description": "return the first event in a set of ee/event pairs", - "version": "1.0.3", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/jonathanong/ee-first" - }, - "devDependencies": { - "mocha": "1" - }, - "scripts": { - "test": "mocha --reporter spec" - }, - "bugs": { - "url": "https://github.com/jonathanong/ee-first/issues" - }, - "homepage": "https://github.com/jonathanong/ee-first", - "_id": "ee-first@1.0.3", - "_shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "_from": "ee-first@1.0.3", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "tarball": "http://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js deleted file mode 100644 index adff984..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js +++ /dev/null @@ -1,60 +0,0 @@ - -var EventEmitter = require('events').EventEmitter -var assert = require('assert') - -var first = require('./') - -describe('first', function () { - var ee1 = new EventEmitter() - var ee2 = new EventEmitter() - var ee3 = new EventEmitter() - - it('should emit the first event', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - assert.equal(ee, ee2) - assert.equal(event, 'b') - assert.deepEqual(args, [1, 2, 3]) - done() - }) - - ee2.emit('b', 1, 2, 3) - }) - - it('it should return an error if event === error', function (done) { - first([ - [ee1, 'error', 'b', 'c'], - [ee2, 'error', 'b', 'c'], - [ee3, 'error', 'b', 'c'], - ], function (err, ee, event, args) { - assert.equal(err.message, 'boom') - assert.equal(ee, ee3) - assert.equal(event, 'error') - done() - }) - - ee3.emit('error', new Error('boom')) - }) - - it('should cleanup after itself', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - ;[ee1, ee2, ee3].forEach(function (ee) { - ['a', 'b', 'c'].forEach(function (event) { - assert(!ee.listeners(event).length) - }) - }) - done() - }) - - ee1.emit('a') - }) -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json deleted file mode 100644 index b645a74..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "finished", - "description": "Execute a callback when a request closes, finishes, or errors", - "version": "1.2.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/finished" - }, - "dependencies": { - "ee-first": "1.0.3" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.1", - "should": "~4.0.1" - }, - "engine": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/finished/issues" - }, - "homepage": "https://github.com/expressjs/finished", - "_id": "finished@1.2.2", - "_shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "_from": "finished@1.2.2", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "tarball": "http://registry.npmjs.org/finished/-/finished-1.2.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md deleted file mode 100644 index 6ca19bd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.default_type -Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js deleted file mode 100644 index 48be0c5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js +++ /dev/null @@ -1,114 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - if (process.env.DEBUG_MIME && this.types[exts]) { - console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + - this.types[exts] + ' to ' + type); - } - - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - - this._loading = file; - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); - - this._loading = null; -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); - return this.extensions[type]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -}; - -module.exports = mime; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json deleted file mode 100644 index 917e6af..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.2.11", - "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g.\n\n var mime = require('mime');\n\n mime.lookup('/path/to/file.txt'); // => 'text/plain'\n mime.lookup('file.txt'); // => 'text/plain'\n mime.lookup('.TXT'); // => 'text/plain'\n mime.lookup('htm'); // => 'text/html'\n\n### mime.default_type\nSets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)\n\n### mime.extension(type)\nGet the default extension for `type`\n\n mime.extension('text/html'); // => 'html'\n mime.extension('application/octet-stream'); // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n mime.charsets.lookup('text/plain'); // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n mime.define({\n 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n 'application/x-my-type': ['x-mt', 'x-mtt'],\n // etc ...\n });\n\n mime.lookup('x-sft'); // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n mime.load('./my_project.types');\n\nThe .types file format is simple - See the `types` dir for examples.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/broofa/node-mime/issues" - }, - "_id": "mime@1.2.11", - "dist": { - "shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "tarball": "http://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - }, - "_from": "mime@1.2.11", - "_npmVersion": "1.3.6", - "_npmUser": { - "name": "broofa", - "email": "robert@broofa.com" - }, - "maintainers": [ - { - "name": "broofa", - "email": "robert@broofa.com" - }, - { - "name": "bentomas", - "email": "benjamin@benjaminthomas.org" - } - ], - "directories": {}, - "_shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "_resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "homepage": "https://github.com/broofa/node-mime" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js deleted file mode 100644 index 2cda1c7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); -var path = require('path'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); // normal file -eq('text/plain', mime.lookup('TEXT.TXT')); // uppercase -eq('text/plain', mime.lookup('dir/text.txt')); // dir + file -eq('text/plain', mime.lookup('.text.txt')); // hidden file -eq('text/plain', mime.lookup('.txt')); // nameless -eq('text/plain', mime.lookup('txt')); // extension-only -eq('text/plain', mime.lookup('/txt')); // extension-less () -eq('text/plain', mime.lookup('\\txt')); // Windows, extension-less -eq('application/octet-stream', mime.lookup('text.nope')); // unrecognized -eq('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq('bin', mime.extension('application/octet-stream ')); -eq('html', mime.extension(' text/html; charset=UTF-8')); -eq('html', mime.extension('text/html; charset=UTF-8 ')); -eq('html', mime.extension('text/html; charset=UTF-8')); -eq('html', mime.extension('text/html ; charset=UTF-8')); -eq('html', mime.extension('text/html;charset=UTF-8')); -eq('html', mime.extension('text/Html;charset=UTF-8')); -eq(undefined, mime.extension('unrecognized')); - -// -// Test node.types lookups -// - -eq('application/font-woff', mime.lookup('file.woff')); -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); -eq('font/opentype', mime.lookup('file.otf')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -// -// Test for overlaps between mime.types and node.types -// - -var apacheTypes = new mime.Mime(), nodeTypes = new mime.Mime(); -apacheTypes.load(path.join(__dirname, 'types/mime.types')); -nodeTypes.load(path.join(__dirname, 'types/node.types')); - -var keys = [].concat(Object.keys(apacheTypes.types)) - .concat(Object.keys(nodeTypes.types)); -keys.sort(); -for (var i = 1; i < keys.length; i++) { - if (keys[i] == keys[i-1]) { - console.warn('Warning: ' + - 'node.types defines ' + keys[i] + '->' + nodeTypes.types[keys[i]] + - ', mime.types defines ' + keys[i] + '->' + apacheTypes.types[keys[i]]); - } -} - -console.log('\nOK'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types deleted file mode 100644 index da8cd69..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types deleted file mode 100644 index 55b2cf7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types +++ /dev/null @@ -1,77 +0,0 @@ -# What: WebVTT -# Why: To allow formats intended for marking up external text track resources. -# http://dev.w3.org/html5/webvtt/ -# Added by: niftylettuce -text/vtt vtt - -# 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: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifes ('.manifest' extension) -# 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 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: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp - -# What: Lua file types -# Why: Googling around shows de-facto consensus on these -# Added by: creationix (Issue #45) -text/x-lua lua -application/x-lua-bytecode luac - -# What: Markdown files, as per http://daringfireball.net/projects/markdown/syntax -# Why: http://stackoverflow.com/questions/10701983/what-is-the-mime-type-for-markdown -# Added by: avoidwork -text/x-markdown markdown md mkd - -# What: ini files -# Why: because they're just text files -# Added by: Matthew Kastor -text/plain ini - -# What: DASH Adaptive Streaming manifest -# Why: https://developer.mozilla.org/en-US/docs/DASH_Adaptive_Streaming_for_HTML_5_Video -# Added by: eelcocramer -application/dash+xml mdp - -# What: OpenType font files - http://www.microsoft.com/typography/otspec/ -# Why: Browsers usually ignore the font MIME types and sniff the content, -# but Chrome, shows a warning if OpenType fonts aren't served with -# the `font/opentype` MIME type: http://i.imgur.com/8c5RN8M.png. -# Added by: alrra -font/opentype otf diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md deleted file mode 100644 index d4ab12a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours', { long: true })) // "10 hours" -``` - -- Node/Browser compatible. Published as `ms` in NPM. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js deleted file mode 100644 index c5847f8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json deleted file mode 100644 index c4dd654..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "ms", - "version": "0.6.2", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "readme": "# ms.js: miliseconds conversion utility\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('100') // 100\n```\n\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(ms('10 hours', { long: true })) // \"10 hours\"\n```\n\n- Node/Browser compatible. Published as `ms` in NPM.\n- If a number is supplied to `ms`, a string with a unit is returned.\n- If a string that contains the number is supplied, it returns it as\na number (e.g: it returns `100` for `'100'`).\n- If you pass a string with a number and a valid unit, the number of\nequivalent ms is returned.\n\n## License\n\nMIT", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "_id": "ms@0.6.2", - "dist": { - "shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - }, - "_from": "ms@0.6.2", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "directories": {}, - "_shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "homepage": "https://github.com/guille/ms.js" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/package.json deleted file mode 100644 index bb5e8b4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "send", - "description": "Better streaming static file server with Range and conditional-GET support", - "version": "0.7.3", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/send" - }, - "keywords": [ - "static", - "file", - "server" - ], - "dependencies": { - "debug": "1.0.4", - "depd": "0.4.4", - "escape-html": "1.0.1", - "finished": "1.2.2", - "fresh": "0.2.2", - "mime": "1.2.11", - "ms": "0.6.2", - "range-parser": "~1.0.0" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.0", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --check-leaks --reporter spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec" - }, - "bugs": { - "url": "https://github.com/visionmedia/send/issues" - }, - "homepage": "https://github.com/visionmedia/send", - "_id": "send@0.7.3", - "dist": { - "shasum": "2caa2e2627d2f9c2d109d3f5c2942935480aa993", - "tarball": "http://registry.npmjs.org/send/-/send-0.7.3.tgz" - }, - "_from": "send@0.7.3", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "2caa2e2627d2f9c2d109d3f5c2942935480aa993", - "_resolved": "https://registry.npmjs.org/send/-/send-0.7.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/package.json deleted file mode 100644 index 7345a3c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "serve-static", - "description": "Serve static files", - "version": "1.4.3", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/serve-static" - }, - "dependencies": { - "escape-html": "1.0.1", - "parseurl": "~1.2.0", - "send": "0.7.3" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.0", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks --require should test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks --require should test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks --require should test/" - }, - "bugs": { - "url": "https://github.com/expressjs/serve-static/issues" - }, - "homepage": "https://github.com/expressjs/serve-static", - "_id": "serve-static@1.4.3", - "dist": { - "shasum": "9f08c7dea1b15e2eb1382ae0e12b8a0de295de52", - "tarball": "http://registry.npmjs.org/serve-static/-/serve-static-1.4.3.tgz" - }, - "_from": "serve-static@>=1.4.2-0 <1.5.0-0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "9f08c7dea1b15e2eb1382ae0e12b8a0de295de52", - "_resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.4.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/HISTORY.md deleted file mode 100644 index b4c94be..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/HISTORY.md +++ /dev/null @@ -1,54 +0,0 @@ - -1.3.2 / 2014-06-24 -================== - - * use `~` range on mime-types - -1.3.1 / 2014-06-19 -================== - - * fix global variable leak - -1.3.0 / 2014-06-19 -================== - - * improve type parsing - - - invalid media type never matches - - media type not case-sensitive - - extra LWS does not affect results - -1.2.2 / 2014-06-19 -================== - - * fix behavior on unknown type argument - -1.2.1 / 2014-06-03 -================== - - * switch dependency from `mime` to `mime-types@1.0.0` - -1.2.0 / 2014-05-11 -================== - - * support suffix matching: - - - `+json` matches `application/vnd+json` - - `*/vnd+json` matches `application/vnd+json` - - `application/*+json` matches `application/vnd+json` - -1.1.0 / 2014-04-12 -================== - - * add non-array values support - * expose internal utilities: - - - `.is()` - - `.hasBody()` - - `.normalize()` - - `.match()` - -1.0.1 / 2014-03-30 -================== - - * add `multipart` as a shorthand diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/README.md deleted file mode 100644 index 5d8b166..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# type-is - -[![NPM version](https://badge.fury.io/js/type-is.svg)](https://badge.fury.io/js/type-is) -[![Build Status](https://travis-ci.org/expressjs/type-is.svg?branch=master)](https://travis-ci.org/expressjs/type-is) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/type-is.svg?branch=master)](https://coveralls.io/r/expressjs/type-is) - -Infer the content-type of a request. - -### Install - -```sh -$ npm install type-is -``` - -## API - -```js -var http = require('http') -var is = require('type-is') - -http.createServer(function (req, res) { - var istext = is(req, ['text/*']) - res.end('you ' + (istext ? 'sent' : 'did not send') + ' me text') -}) -``` - -### type = is(request, types) - -`request` is the node HTTP request. `types` is an array of types. - -```js -// req.headers.content-type = 'application/json' - -is(req, ['json']) // 'json' -is(req, ['html', 'json']) // 'json' -is(req, ['application/*']) // 'application/json' -is(req, ['application/json']) // 'application/json' - -is(req, ['html']) // false -``` - -#### Each type can be: - -- An extension name such as `json`. This name will be returned if matched. -- A mime type such as `application/json`. -- A mime type with a wildcard such as `*/json` or `application/*`. The full mime type will be returned if matched -- A suffix such as `+json`. This can be combined with a wildcard such as `*/vnd+json` or `application/*+json`. The full mime type will be returned if matched. - -`false` will be returned if no type matches. - -## Examples - -#### Example body parser - -```js -var is = require('type-is'); -var parse = require('body'); -var busboy = require('busboy'); - -function bodyParser(req, res, next) { - if (!is.hasBody(req)) return next(); - - switch (is(req, ['urlencoded', 'json', 'multipart'])) { - case 'urlencoded': - // parse urlencoded body - break - case 'json': - // parse json body - break - case 'multipart': - // parse multipart body - break - default: - // 415 error code - } -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/index.js deleted file mode 100644 index 315907a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/index.js +++ /dev/null @@ -1,230 +0,0 @@ - -var typer = require('media-typer') -var mime = require('mime-types') - -module.exports = typeofrequest; -typeofrequest.is = typeis; -typeofrequest.hasBody = hasbody; -typeofrequest.normalize = normalize; -typeofrequest.match = mimeMatch; - -/** - * Compare a `value` content-type with `types`. - * Each `type` can be an extension like `html`, - * a special shortcut like `multipart` or `urlencoded`, - * or a mime type. - * - * If no types match, `false` is returned. - * Otherwise, the first `type` that matches is returned. - * - * @param {String} value - * @param {Array} types - * @return String - */ - -function typeis(value, types_) { - var i - var types = types_ - - // remove parameters and normalize - value = typenormalize(value) - - // no type or invalid - if (!value) { - return false - } - - // support flattened arguments - if (types && !Array.isArray(types)) { - types = new Array(arguments.length - 1) - for (i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // no types, return the content type - if (!types || !types.length) return value; - - var type - for (i = 0; i < types.length; i++) { - if (mimeMatch(normalize(type = types[i]), value)) { - return type[0] === '+' || ~type.indexOf('*') - ? value - : type - } - } - - // no matches - return false; -} - -/** - * Check if a request has a request body. - * A request with a body __must__ either have `transfer-encoding` - * or `content-length` headers set. - * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 - * - * @param {Object} request - * @return {Boolean} - * @api public - */ - -function hasbody(req) { - var headers = req.headers; - if ('transfer-encoding' in headers) return true; - var length = headers['content-length']; - if (!length) return false; - // no idea when this would happen, but `isNaN(null) === false` - if (isNaN(length)) return false; - return !!parseInt(length, 10); -} - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains any of the give mime `type`s. - * If there is no request body, `null` is returned. - * If there is no content type, `false` is returned. - * Otherwise, it returns the first `type` that matches. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * this.is('html'); // => 'html' - * this.is('text/html'); // => 'text/html' - * this.is('text/*', 'application/json'); // => 'text/html' - * - * // When Content-Type is application/json - * this.is('json', 'urlencoded'); // => 'json' - * this.is('application/json'); // => 'application/json' - * this.is('html', 'application/*'); // => 'application/json' - * - * this.is('html'); // => false - * - * @param {String|Array} types... - * @return {String|false|null} - * @api public - */ - -function typeofrequest(req, types_) { - var types = types_ - - // no body - if (!hasbody(req)) { - return null - } - - // support flattened arguments - if (arguments.length > 2) { - types = new Array(arguments.length - 1) - for (var i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // request content type - var value = req.headers['content-type'] - - return typeis(value, types); -} - -/** - * Normalize a mime type. - * If it's a shorthand, expand it to a valid mime type. - * - * In general, you probably want: - * - * var type = is(req, ['urlencoded', 'json', 'multipart']); - * - * Then use the appropriate body parsers. - * These three are the most common request body types - * and are thus ensured to work. - * - * @param {String} type - * @api private - */ - -function normalize(type) { - switch (type) { - case 'urlencoded': return 'application/x-www-form-urlencoded'; - case 'multipart': - type = 'multipart/*'; - break; - } - - return type[0] === '+' || ~type.indexOf('/') - ? type - : mime.lookup(type) -} - -/** - * Check if `exected` mime type - * matches `actual` mime type with - * wildcard and +suffix support. - * - * @param {String} expected - * @param {String} actual - * @return {Boolean} - * @api private - */ - -function mimeMatch(expected, actual) { - // invalid type - if (expected === false) { - return false - } - - // exact match - if (expected === actual) { - return true - } - - actual = actual.split('/'); - - if (expected[0] === '+') { - // support +suffix - return Boolean(actual[1]) - && expected.length <= actual[1].length - && expected === actual[1].substr(0 - expected.length) - } - - if (!~expected.indexOf('*')) return false; - - expected = expected.split('/'); - - if (expected[0] === '*') { - // support */yyy - return expected[1] === actual[1] - } - - if (expected[1] === '*') { - // support xxx/* - return expected[0] === actual[0] - } - - if (expected[1][0] === '*' && expected[1][1] === '+') { - // support xxx/*+zzz - return expected[0] === actual[0] - && expected[1].length <= actual[1].length + 1 - && expected[1].substr(1) === actual[1].substr(1 - expected[1].length) - } - - return false -} - -/** - * Normalize a type and remove parameters. - * - * @param {string} value - * @return {string} - * @api private - */ - -function typenormalize(value) { - try { - var type = typer.parse(value) - delete type.parameters - return typer.format(type) - } catch (err) { - return null - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore deleted file mode 100644 index 919d51b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -test -build.js - -# OS generated files # -###################### -.DS_Store* -# Icon? -ehthumbs.db -Thumbs.db - -# Node.js # -########### -node_modules -npm-debug.log diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml deleted file mode 100644 index 73c85c6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" - - "0.11" -matrix: - allow_failures: - - node_js: "0.11" - fast_finish: true -before_install: - # remove build script deps before install - - node -pe 'f="./package.json";p=require(f);d=p.devDependencies;for(k in d){if("co"===k.substr(0,2))delete d[k]}require("fs").writeFileSync(f,JSON.stringify(p,null,2))' diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile deleted file mode 100644 index ceaf011..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -build: - node --harmony-generators build.js - -test: - node test/mime.js - mocha --require should --reporter spec test/test.js - -.PHONY: build test diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md deleted file mode 100644 index 8e21ee1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# mime-types -[![NPM version](https://badge.fury.io/js/mime-types.svg)](https://badge.fury.io/js/mime-types) [![Build Status](https://travis-ci.org/expressjs/mime-types.svg?branch=master)](https://travis-ci.org/expressjs/mime-types) - -The ultimate javascript content-type utility. - -### Install - -```sh -$ npm install mime-types -``` - -#### Similar to [node-mime](https://github.com/broofa/node-mime), except: - -- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. -- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. -- Additional mime types are added such as jade and stylus. Feel free to add more! -- Browser support via Browserify and Component by converting lists to JSON files. - -Otherwise, the API is compatible. - -### Adding Types - -If you'd like to add additional types, -simply create a PR adding the type to `custom.json` and -a reference link to the [sources](SOURCES.md). - -Do __NOT__ edit `mime.json` or `node.json`. -Those are pulled using `build.js`. -You should only touch `custom.json`. - -## API - -```js -var mime = require('mime-types') -``` - -All functions return `false` if input is invalid or not found. - -### mime.lookup(path) - -Lookup the content-type associated with a file. - -```js -mime.lookup('json') // 'application/json' -mime.lookup('.md') // 'text/x-markdown' -mime.lookup('file.html') // 'text/html' -mime.lookup('folder/file.js') // 'application/javascript' - -mime.lookup('cats') // false -``` - -### mime.contentType(type) - -Create a full content-type header given a content-type or extension. - -```js -mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' -mime.contentType('file.json') // 'application/json; charset=utf-8' -``` - -### mime.extension(type) - -Get the default extension for a content-type. - -```js -mime.extension('application/octet-stream') // 'bin' -``` - -### mime.charset(type) - -Lookup the implied default charset of a content-type. - -```js -mime.charset('text/x-markdown') // 'UTF-8' -``` - -### mime.types[extension] = type - -A map of content-types by extension. - -### mime.extensions[type] = [extensions] - -A map of extensions by content-type. - -### mime.define(types) - -Globally add definitions. -`types` must be an object of the form: - -```js -{ - "": [extensions...], - "": [extensions...] -} -``` - -See the `.json` files in `lib/` for examples. - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md deleted file mode 100644 index 1d65012..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md +++ /dev/null @@ -1,17 +0,0 @@ - -### Sources for custom types - -This is a list of sources for any custom mime types. -When adding custom mime types, please link to where you found the mime type, -even if it's from an unofficial source. - -- `text/coffeescript` - http://coffeescript.org/#scripts -- `text/x-handlebars-template` - https://handlebarsjs.com/#getting-started -- `text/x-sass` & `text/x-scss` - https://github.com/janlelis/rubybuntu-mime/blob/master/sass.xml -- `text.jsx` - http://facebook.github.io/react/docs/getting-started.html [[2]](https://github.com/facebook/react/blob/f230e0a03154e6f8a616e0da1fb3d97ffa1a6472/vendor/browser-transforms.js#L210) - -[Sources for node.json types](https://github.com/broofa/node-mime/blob/master/types/node.types) - -### Notes on weird types - -- `font/opentype` - This type is technically invalid according to the spec. No valid types begin with `font/`. No-one uses the official type of `application/vnd.ms-opentype` as the community standardized `application/x-font-otf`. However, chrome logs nonsense warnings unless opentype fonts are served with `font/opentype`. [[1]](http://stackoverflow.com/questions/2871655/proper-mime-type-for-fonts) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json deleted file mode 100644 index fa67a6d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "0.1.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com", - "twitter": "https://twitter.com/jongleberry" - }, - "repository": "expressjs/mime-types", - "license": "MIT", - "main": "lib/index.js", - "scripts": ["lib/index.js"], - "json": ["mime.json", "node.json", "custom.json"] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json deleted file mode 100644 index 6137da3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "text/jade": [ - "jade" - ], - "text/stylus": [ - "stylus", - "styl" - ], - "text/less": [ - "less" - ], - "text/x-sass": [ - "sass" - ], - "text/x-scss": [ - "scss" - ], - "text/coffeescript": [ - "coffee" - ], - "text/x-handlebars-template": [ - "hbs" - ], - "text/jsx": [ - "jsx" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js deleted file mode 100644 index 27559ea..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js +++ /dev/null @@ -1,74 +0,0 @@ - -// types[extension] = type -exports.types = Object.create(null) -// extensions[type] = [extensions] -exports.extensions = Object.create(null) -// define more mime types -exports.define = define - -// store the json files -exports.json = { - mime: require('./mime.json'), - node: require('./node.json'), - custom: require('./custom.json'), -} - -exports.lookup = function (string) { - if (!string || typeof string !== "string") return false - string = string.replace(/.*[\.\/\\]/, '').toLowerCase() - if (!string) return false - return exports.types[string] || false -} - -exports.extension = function (type) { - if (!type || typeof type !== "string") return false - type = type.match(/^\s*([^;\s]*)(?:;|\s|$)/) - if (!type) return false - var exts = exports.extensions[type[1].toLowerCase()] - if (!exts || !exts.length) return false - return exts[0] -} - -// type has to be an exact mime type -exports.charset = function (type) { - // special cases - switch (type) { - case 'application/json': return 'UTF-8' - } - - // default text/* to utf-8 - if (/^text\//.test(type)) return 'UTF-8' - - return false -} - -// backwards compatibility -exports.charsets = { - lookup: exports.charset -} - -exports.contentType = function (type) { - if (!type || typeof type !== "string") return false - if (!~type.indexOf('/')) type = exports.lookup(type) - if (!type) return false - if (!~type.indexOf('charset')) { - var charset = exports.charset(type) - if (charset) type += '; charset=' + charset.toLowerCase() - } - return type -} - -define(exports.json.mime) -define(exports.json.node) -define(exports.json.custom) - -function define(json) { - Object.keys(json).forEach(function (type) { - var exts = json[type] || [] - exports.extensions[type] = exports.extensions[type] || [] - exts.forEach(function (ext) { - if (!~exports.extensions[type].indexOf(ext)) exports.extensions[type].push(ext) - exports.types[ext] = type - }) - }) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json deleted file mode 100644 index f445a86..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json +++ /dev/null @@ -1,3317 +0,0 @@ -{ - "application/1d-interleaved-parityfec": [], - "application/3gpp-ims+xml": [], - "application/activemessage": [], - "application/andrew-inset": [ - "ez" - ], - "application/applefile": [], - "application/applixware": [ - "aw" - ], - "application/atom+xml": [ - "atom" - ], - "application/atomcat+xml": [ - "atomcat" - ], - "application/atomicmail": [], - "application/atomsvc+xml": [ - "atomsvc" - ], - "application/auth-policy+xml": [], - "application/batch-smtp": [], - "application/beep+xml": [], - "application/calendar+xml": [], - "application/cals-1840": [], - "application/ccmp+xml": [], - "application/ccxml+xml": [ - "ccxml" - ], - "application/cdmi-capability": [ - "cdmia" - ], - "application/cdmi-container": [ - "cdmic" - ], - "application/cdmi-domain": [ - "cdmid" - ], - "application/cdmi-object": [ - "cdmio" - ], - "application/cdmi-queue": [ - "cdmiq" - ], - "application/cea-2018+xml": [], - "application/cellml+xml": [], - "application/cfw": [], - "application/cnrp+xml": [], - "application/commonground": [], - "application/conference-info+xml": [], - "application/cpl+xml": [], - "application/csta+xml": [], - "application/cstadata+xml": [], - "application/cu-seeme": [ - "cu" - ], - "application/cybercash": [], - "application/davmount+xml": [ - "davmount" - ], - "application/dca-rft": [], - "application/dec-dx": [], - "application/dialog-info+xml": [], - "application/dicom": [], - "application/dns": [], - "application/docbook+xml": [ - "dbk" - ], - "application/dskpp+xml": [], - "application/dssc+der": [ - "dssc" - ], - "application/dssc+xml": [ - "xdssc" - ], - "application/dvcs": [], - "application/ecmascript": [ - "ecma" - ], - "application/edi-consent": [], - "application/edi-x12": [], - "application/edifact": [], - "application/emma+xml": [ - "emma" - ], - "application/epp+xml": [], - "application/epub+zip": [ - "epub" - ], - "application/eshop": [], - "application/example": [], - "application/exi": [ - "exi" - ], - "application/fastinfoset": [], - "application/fastsoap": [], - "application/fits": [], - "application/font-tdpfr": [ - "pfr" - ], - "application/framework-attributes+xml": [], - "application/gml+xml": [ - "gml" - ], - "application/gpx+xml": [ - "gpx" - ], - "application/gxf": [ - "gxf" - ], - "application/h224": [], - "application/held+xml": [], - "application/http": [], - "application/hyperstudio": [ - "stk" - ], - "application/ibe-key-request+xml": [], - "application/ibe-pkg-reply+xml": [], - "application/ibe-pp-data": [], - "application/iges": [], - "application/im-iscomposing+xml": [], - "application/index": [], - "application/index.cmd": [], - "application/index.obj": [], - "application/index.response": [], - "application/index.vnd": [], - "application/inkml+xml": [ - "ink", - "inkml" - ], - "application/iotp": [], - "application/ipfix": [ - "ipfix" - ], - "application/ipp": [], - "application/isup": [], - "application/java-archive": [ - "jar" - ], - "application/java-serialized-object": [ - "ser" - ], - "application/java-vm": [ - "class" - ], - "application/javascript": [ - "js" - ], - "application/json": [ - "json" - ], - "application/jsonml+json": [ - "jsonml" - ], - "application/kpml-request+xml": [], - "application/kpml-response+xml": [], - "application/lost+xml": [ - "lostxml" - ], - "application/mac-binhex40": [ - "hqx" - ], - "application/mac-compactpro": [ - "cpt" - ], - "application/macwriteii": [], - "application/mads+xml": [ - "mads" - ], - "application/marc": [ - "mrc" - ], - "application/marcxml+xml": [ - "mrcx" - ], - "application/mathematica": [ - "ma", - "nb", - "mb" - ], - "application/mathml-content+xml": [], - "application/mathml-presentation+xml": [], - "application/mathml+xml": [ - "mathml" - ], - "application/mbms-associated-procedure-description+xml": [], - "application/mbms-deregister+xml": [], - "application/mbms-envelope+xml": [], - "application/mbms-msk+xml": [], - "application/mbms-msk-response+xml": [], - "application/mbms-protection-description+xml": [], - "application/mbms-reception-report+xml": [], - "application/mbms-register+xml": [], - "application/mbms-register-response+xml": [], - "application/mbms-user-service-description+xml": [], - "application/mbox": [ - "mbox" - ], - "application/media_control+xml": [], - "application/mediaservercontrol+xml": [ - "mscml" - ], - "application/metalink+xml": [ - "metalink" - ], - "application/metalink4+xml": [ - "meta4" - ], - "application/mets+xml": [ - "mets" - ], - "application/mikey": [], - "application/mods+xml": [ - "mods" - ], - "application/moss-keys": [], - "application/moss-signature": [], - "application/mosskey-data": [], - "application/mosskey-request": [], - "application/mp21": [ - "m21", - "mp21" - ], - "application/mp4": [ - "mp4s" - ], - "application/mpeg4-generic": [], - "application/mpeg4-iod": [], - "application/mpeg4-iod-xmt": [], - "application/msc-ivr+xml": [], - "application/msc-mixer+xml": [], - "application/msword": [ - "doc", - "dot" - ], - "application/mxf": [ - "mxf" - ], - "application/nasdata": [], - "application/news-checkgroups": [], - "application/news-groupinfo": [], - "application/news-transmission": [], - "application/nss": [], - "application/ocsp-request": [], - "application/ocsp-response": [], - "application/octet-stream": [ - "bin", - "dms", - "lrf", - "mar", - "so", - "dist", - "distz", - "pkg", - "bpk", - "dump", - "elc", - "deploy" - ], - "application/oda": [ - "oda" - ], - "application/oebps-package+xml": [ - "opf" - ], - "application/ogg": [ - "ogx" - ], - "application/omdoc+xml": [ - "omdoc" - ], - "application/onenote": [ - "onetoc", - "onetoc2", - "onetmp", - "onepkg" - ], - "application/oxps": [ - "oxps" - ], - "application/parityfec": [], - "application/patch-ops-error+xml": [ - "xer" - ], - "application/pdf": [ - "pdf" - ], - "application/pgp-encrypted": [ - "pgp" - ], - "application/pgp-keys": [], - "application/pgp-signature": [ - "asc", - "sig" - ], - "application/pics-rules": [ - "prf" - ], - "application/pidf+xml": [], - "application/pidf-diff+xml": [], - "application/pkcs10": [ - "p10" - ], - "application/pkcs7-mime": [ - "p7m", - "p7c" - ], - "application/pkcs7-signature": [ - "p7s" - ], - "application/pkcs8": [ - "p8" - ], - "application/pkix-attr-cert": [ - "ac" - ], - "application/pkix-cert": [ - "cer" - ], - "application/pkix-crl": [ - "crl" - ], - "application/pkix-pkipath": [ - "pkipath" - ], - "application/pkixcmp": [ - "pki" - ], - "application/pls+xml": [ - "pls" - ], - "application/poc-settings+xml": [], - "application/postscript": [ - "ai", - "eps", - "ps" - ], - "application/prs.alvestrand.titrax-sheet": [], - "application/prs.cww": [ - "cww" - ], - "application/prs.nprend": [], - "application/prs.plucker": [], - "application/prs.rdf-xml-crypt": [], - "application/prs.xsf+xml": [], - "application/pskc+xml": [ - "pskcxml" - ], - "application/qsig": [], - "application/rdf+xml": [ - "rdf" - ], - "application/reginfo+xml": [ - "rif" - ], - "application/relax-ng-compact-syntax": [ - "rnc" - ], - "application/remote-printing": [], - "application/resource-lists+xml": [ - "rl" - ], - "application/resource-lists-diff+xml": [ - "rld" - ], - "application/riscos": [], - "application/rlmi+xml": [], - "application/rls-services+xml": [ - "rs" - ], - "application/rpki-ghostbusters": [ - "gbr" - ], - "application/rpki-manifest": [ - "mft" - ], - "application/rpki-roa": [ - "roa" - ], - "application/rpki-updown": [], - "application/rsd+xml": [ - "rsd" - ], - "application/rss+xml": [ - "rss" - ], - "application/rtf": [ - "rtf" - ], - "application/rtx": [], - "application/samlassertion+xml": [], - "application/samlmetadata+xml": [], - "application/sbml+xml": [ - "sbml" - ], - "application/scvp-cv-request": [ - "scq" - ], - "application/scvp-cv-response": [ - "scs" - ], - "application/scvp-vp-request": [ - "spq" - ], - "application/scvp-vp-response": [ - "spp" - ], - "application/sdp": [ - "sdp" - ], - "application/set-payment": [], - "application/set-payment-initiation": [ - "setpay" - ], - "application/set-registration": [], - "application/set-registration-initiation": [ - "setreg" - ], - "application/sgml": [], - "application/sgml-open-catalog": [], - "application/shf+xml": [ - "shf" - ], - "application/sieve": [], - "application/simple-filter+xml": [], - "application/simple-message-summary": [], - "application/simplesymbolcontainer": [], - "application/slate": [], - "application/smil": [], - "application/smil+xml": [ - "smi", - "smil" - ], - "application/soap+fastinfoset": [], - "application/soap+xml": [], - "application/sparql-query": [ - "rq" - ], - "application/sparql-results+xml": [ - "srx" - ], - "application/spirits-event+xml": [], - "application/srgs": [ - "gram" - ], - "application/srgs+xml": [ - "grxml" - ], - "application/sru+xml": [ - "sru" - ], - "application/ssdl+xml": [ - "ssdl" - ], - "application/ssml+xml": [ - "ssml" - ], - "application/tamp-apex-update": [], - "application/tamp-apex-update-confirm": [], - "application/tamp-community-update": [], - "application/tamp-community-update-confirm": [], - "application/tamp-error": [], - "application/tamp-sequence-adjust": [], - "application/tamp-sequence-adjust-confirm": [], - "application/tamp-status-query": [], - "application/tamp-status-response": [], - "application/tamp-update": [], - "application/tamp-update-confirm": [], - "application/tei+xml": [ - "tei", - "teicorpus" - ], - "application/thraud+xml": [ - "tfi" - ], - "application/timestamp-query": [], - "application/timestamp-reply": [], - "application/timestamped-data": [ - "tsd" - ], - "application/tve-trigger": [], - "application/ulpfec": [], - "application/vcard+xml": [], - "application/vemmi": [], - "application/vividence.scriptfile": [], - "application/vnd.3gpp.bsf+xml": [], - "application/vnd.3gpp.pic-bw-large": [ - "plb" - ], - "application/vnd.3gpp.pic-bw-small": [ - "psb" - ], - "application/vnd.3gpp.pic-bw-var": [ - "pvb" - ], - "application/vnd.3gpp.sms": [], - "application/vnd.3gpp2.bcmcsinfo+xml": [], - "application/vnd.3gpp2.sms": [], - "application/vnd.3gpp2.tcap": [ - "tcap" - ], - "application/vnd.3m.post-it-notes": [ - "pwn" - ], - "application/vnd.accpac.simply.aso": [ - "aso" - ], - "application/vnd.accpac.simply.imp": [ - "imp" - ], - "application/vnd.acucobol": [ - "acu" - ], - "application/vnd.acucorp": [ - "atc", - "acutc" - ], - "application/vnd.adobe.air-application-installer-package+zip": [ - "air" - ], - "application/vnd.adobe.formscentral.fcdt": [ - "fcdt" - ], - "application/vnd.adobe.fxp": [ - "fxp", - "fxpl" - ], - "application/vnd.adobe.partial-upload": [], - "application/vnd.adobe.xdp+xml": [ - "xdp" - ], - "application/vnd.adobe.xfdf": [ - "xfdf" - ], - "application/vnd.aether.imp": [], - "application/vnd.ah-barcode": [], - "application/vnd.ahead.space": [ - "ahead" - ], - "application/vnd.airzip.filesecure.azf": [ - "azf" - ], - "application/vnd.airzip.filesecure.azs": [ - "azs" - ], - "application/vnd.amazon.ebook": [ - "azw" - ], - "application/vnd.americandynamics.acc": [ - "acc" - ], - "application/vnd.amiga.ami": [ - "ami" - ], - "application/vnd.amundsen.maze+xml": [], - "application/vnd.android.package-archive": [ - "apk" - ], - "application/vnd.anser-web-certificate-issue-initiation": [ - "cii" - ], - "application/vnd.anser-web-funds-transfer-initiation": [ - "fti" - ], - "application/vnd.antix.game-component": [ - "atx" - ], - "application/vnd.apple.installer+xml": [ - "mpkg" - ], - "application/vnd.apple.mpegurl": [ - "m3u8" - ], - "application/vnd.arastra.swi": [], - "application/vnd.aristanetworks.swi": [ - "swi" - ], - "application/vnd.astraea-software.iota": [ - "iota" - ], - "application/vnd.audiograph": [ - "aep" - ], - "application/vnd.autopackage": [], - "application/vnd.avistar+xml": [], - "application/vnd.blueice.multipass": [ - "mpm" - ], - "application/vnd.bluetooth.ep.oob": [], - "application/vnd.bmi": [ - "bmi" - ], - "application/vnd.businessobjects": [ - "rep" - ], - "application/vnd.cab-jscript": [], - "application/vnd.canon-cpdl": [], - "application/vnd.canon-lips": [], - "application/vnd.cendio.thinlinc.clientconf": [], - "application/vnd.chemdraw+xml": [ - "cdxml" - ], - "application/vnd.chipnuts.karaoke-mmd": [ - "mmd" - ], - "application/vnd.cinderella": [ - "cdy" - ], - "application/vnd.cirpack.isdn-ext": [], - "application/vnd.claymore": [ - "cla" - ], - "application/vnd.cloanto.rp9": [ - "rp9" - ], - "application/vnd.clonk.c4group": [ - "c4g", - "c4d", - "c4f", - "c4p", - "c4u" - ], - "application/vnd.cluetrust.cartomobile-config": [ - "c11amc" - ], - "application/vnd.cluetrust.cartomobile-config-pkg": [ - "c11amz" - ], - "application/vnd.collection+json": [], - "application/vnd.commerce-battelle": [], - "application/vnd.commonspace": [ - "csp" - ], - "application/vnd.contact.cmsg": [ - "cdbcmsg" - ], - "application/vnd.cosmocaller": [ - "cmc" - ], - "application/vnd.crick.clicker": [ - "clkx" - ], - "application/vnd.crick.clicker.keyboard": [ - "clkk" - ], - "application/vnd.crick.clicker.palette": [ - "clkp" - ], - "application/vnd.crick.clicker.template": [ - "clkt" - ], - "application/vnd.crick.clicker.wordbank": [ - "clkw" - ], - "application/vnd.criticaltools.wbs+xml": [ - "wbs" - ], - "application/vnd.ctc-posml": [ - "pml" - ], - "application/vnd.ctct.ws+xml": [], - "application/vnd.cups-pdf": [], - "application/vnd.cups-postscript": [], - "application/vnd.cups-ppd": [ - "ppd" - ], - "application/vnd.cups-raster": [], - "application/vnd.cups-raw": [], - "application/vnd.curl": [], - "application/vnd.curl.car": [ - "car" - ], - "application/vnd.curl.pcurl": [ - "pcurl" - ], - "application/vnd.cybank": [], - "application/vnd.dart": [ - "dart" - ], - "application/vnd.data-vision.rdz": [ - "rdz" - ], - "application/vnd.dece.data": [ - "uvf", - "uvvf", - "uvd", - "uvvd" - ], - "application/vnd.dece.ttml+xml": [ - "uvt", - "uvvt" - ], - "application/vnd.dece.unspecified": [ - "uvx", - "uvvx" - ], - "application/vnd.dece.zip": [ - "uvz", - "uvvz" - ], - "application/vnd.denovo.fcselayout-link": [ - "fe_launch" - ], - "application/vnd.dir-bi.plate-dl-nosuffix": [], - "application/vnd.dna": [ - "dna" - ], - "application/vnd.dolby.mlp": [ - "mlp" - ], - "application/vnd.dolby.mobile.1": [], - "application/vnd.dolby.mobile.2": [], - "application/vnd.dpgraph": [ - "dpg" - ], - "application/vnd.dreamfactory": [ - "dfac" - ], - "application/vnd.ds-keypoint": [ - "kpxx" - ], - "application/vnd.dvb.ait": [ - "ait" - ], - "application/vnd.dvb.dvbj": [], - "application/vnd.dvb.esgcontainer": [], - "application/vnd.dvb.ipdcdftnotifaccess": [], - "application/vnd.dvb.ipdcesgaccess": [], - "application/vnd.dvb.ipdcesgaccess2": [], - "application/vnd.dvb.ipdcesgpdd": [], - "application/vnd.dvb.ipdcroaming": [], - "application/vnd.dvb.iptv.alfec-base": [], - "application/vnd.dvb.iptv.alfec-enhancement": [], - "application/vnd.dvb.notif-aggregate-root+xml": [], - "application/vnd.dvb.notif-container+xml": [], - "application/vnd.dvb.notif-generic+xml": [], - "application/vnd.dvb.notif-ia-msglist+xml": [], - "application/vnd.dvb.notif-ia-registration-request+xml": [], - "application/vnd.dvb.notif-ia-registration-response+xml": [], - "application/vnd.dvb.notif-init+xml": [], - "application/vnd.dvb.pfr": [], - "application/vnd.dvb.service": [ - "svc" - ], - "application/vnd.dxr": [], - "application/vnd.dynageo": [ - "geo" - ], - "application/vnd.easykaraoke.cdgdownload": [], - "application/vnd.ecdis-update": [], - "application/vnd.ecowin.chart": [ - "mag" - ], - "application/vnd.ecowin.filerequest": [], - "application/vnd.ecowin.fileupdate": [], - "application/vnd.ecowin.series": [], - "application/vnd.ecowin.seriesrequest": [], - "application/vnd.ecowin.seriesupdate": [], - "application/vnd.emclient.accessrequest+xml": [], - "application/vnd.enliven": [ - "nml" - ], - "application/vnd.eprints.data+xml": [], - "application/vnd.epson.esf": [ - "esf" - ], - "application/vnd.epson.msf": [ - "msf" - ], - "application/vnd.epson.quickanime": [ - "qam" - ], - "application/vnd.epson.salt": [ - "slt" - ], - "application/vnd.epson.ssf": [ - "ssf" - ], - "application/vnd.ericsson.quickcall": [], - "application/vnd.eszigno3+xml": [ - "es3", - "et3" - ], - "application/vnd.etsi.aoc+xml": [], - "application/vnd.etsi.cug+xml": [], - "application/vnd.etsi.iptvcommand+xml": [], - "application/vnd.etsi.iptvdiscovery+xml": [], - "application/vnd.etsi.iptvprofile+xml": [], - "application/vnd.etsi.iptvsad-bc+xml": [], - "application/vnd.etsi.iptvsad-cod+xml": [], - "application/vnd.etsi.iptvsad-npvr+xml": [], - "application/vnd.etsi.iptvservice+xml": [], - "application/vnd.etsi.iptvsync+xml": [], - "application/vnd.etsi.iptvueprofile+xml": [], - "application/vnd.etsi.mcid+xml": [], - "application/vnd.etsi.overload-control-policy-dataset+xml": [], - "application/vnd.etsi.sci+xml": [], - "application/vnd.etsi.simservs+xml": [], - "application/vnd.etsi.tsl+xml": [], - "application/vnd.etsi.tsl.der": [], - "application/vnd.eudora.data": [], - "application/vnd.ezpix-album": [ - "ez2" - ], - "application/vnd.ezpix-package": [ - "ez3" - ], - "application/vnd.f-secure.mobile": [], - "application/vnd.fdf": [ - "fdf" - ], - "application/vnd.fdsn.mseed": [ - "mseed" - ], - "application/vnd.fdsn.seed": [ - "seed", - "dataless" - ], - "application/vnd.ffsns": [], - "application/vnd.fints": [], - "application/vnd.flographit": [ - "gph" - ], - "application/vnd.fluxtime.clip": [ - "ftc" - ], - "application/vnd.font-fontforge-sfd": [], - "application/vnd.framemaker": [ - "fm", - "frame", - "maker", - "book" - ], - "application/vnd.frogans.fnc": [ - "fnc" - ], - "application/vnd.frogans.ltf": [ - "ltf" - ], - "application/vnd.fsc.weblaunch": [ - "fsc" - ], - "application/vnd.fujitsu.oasys": [ - "oas" - ], - "application/vnd.fujitsu.oasys2": [ - "oa2" - ], - "application/vnd.fujitsu.oasys3": [ - "oa3" - ], - "application/vnd.fujitsu.oasysgp": [ - "fg5" - ], - "application/vnd.fujitsu.oasysprs": [ - "bh2" - ], - "application/vnd.fujixerox.art-ex": [], - "application/vnd.fujixerox.art4": [], - "application/vnd.fujixerox.hbpl": [], - "application/vnd.fujixerox.ddd": [ - "ddd" - ], - "application/vnd.fujixerox.docuworks": [ - "xdw" - ], - "application/vnd.fujixerox.docuworks.binder": [ - "xbd" - ], - "application/vnd.fut-misnet": [], - "application/vnd.fuzzysheet": [ - "fzs" - ], - "application/vnd.genomatix.tuxedo": [ - "txd" - ], - "application/vnd.geocube+xml": [], - "application/vnd.geogebra.file": [ - "ggb" - ], - "application/vnd.geogebra.tool": [ - "ggt" - ], - "application/vnd.geometry-explorer": [ - "gex", - "gre" - ], - "application/vnd.geonext": [ - "gxt" - ], - "application/vnd.geoplan": [ - "g2w" - ], - "application/vnd.geospace": [ - "g3w" - ], - "application/vnd.globalplatform.card-content-mgt": [], - "application/vnd.globalplatform.card-content-mgt-response": [], - "application/vnd.gmx": [ - "gmx" - ], - "application/vnd.google-earth.kml+xml": [ - "kml" - ], - "application/vnd.google-earth.kmz": [ - "kmz" - ], - "application/vnd.grafeq": [ - "gqf", - "gqs" - ], - "application/vnd.gridmp": [], - "application/vnd.groove-account": [ - "gac" - ], - "application/vnd.groove-help": [ - "ghf" - ], - "application/vnd.groove-identity-message": [ - "gim" - ], - "application/vnd.groove-injector": [ - "grv" - ], - "application/vnd.groove-tool-message": [ - "gtm" - ], - "application/vnd.groove-tool-template": [ - "tpl" - ], - "application/vnd.groove-vcard": [ - "vcg" - ], - "application/vnd.hal+json": [], - "application/vnd.hal+xml": [ - "hal" - ], - "application/vnd.handheld-entertainment+xml": [ - "zmm" - ], - "application/vnd.hbci": [ - "hbci" - ], - "application/vnd.hcl-bireports": [], - "application/vnd.hhe.lesson-player": [ - "les" - ], - "application/vnd.hp-hpgl": [ - "hpgl" - ], - "application/vnd.hp-hpid": [ - "hpid" - ], - "application/vnd.hp-hps": [ - "hps" - ], - "application/vnd.hp-jlyt": [ - "jlt" - ], - "application/vnd.hp-pcl": [ - "pcl" - ], - "application/vnd.hp-pclxl": [ - "pclxl" - ], - "application/vnd.httphone": [], - "application/vnd.hzn-3d-crossword": [], - "application/vnd.ibm.afplinedata": [], - "application/vnd.ibm.electronic-media": [], - "application/vnd.ibm.minipay": [ - "mpy" - ], - "application/vnd.ibm.modcap": [ - "afp", - "listafp", - "list3820" - ], - "application/vnd.ibm.rights-management": [ - "irm" - ], - "application/vnd.ibm.secure-container": [ - "sc" - ], - "application/vnd.iccprofile": [ - "icc", - "icm" - ], - "application/vnd.igloader": [ - "igl" - ], - "application/vnd.immervision-ivp": [ - "ivp" - ], - "application/vnd.immervision-ivu": [ - "ivu" - ], - "application/vnd.informedcontrol.rms+xml": [], - "application/vnd.informix-visionary": [], - "application/vnd.infotech.project": [], - "application/vnd.infotech.project+xml": [], - "application/vnd.innopath.wamp.notification": [], - "application/vnd.insors.igm": [ - "igm" - ], - "application/vnd.intercon.formnet": [ - "xpw", - "xpx" - ], - "application/vnd.intergeo": [ - "i2g" - ], - "application/vnd.intertrust.digibox": [], - "application/vnd.intertrust.nncp": [], - "application/vnd.intu.qbo": [ - "qbo" - ], - "application/vnd.intu.qfx": [ - "qfx" - ], - "application/vnd.iptc.g2.conceptitem+xml": [], - "application/vnd.iptc.g2.knowledgeitem+xml": [], - "application/vnd.iptc.g2.newsitem+xml": [], - "application/vnd.iptc.g2.newsmessage+xml": [], - "application/vnd.iptc.g2.packageitem+xml": [], - "application/vnd.iptc.g2.planningitem+xml": [], - "application/vnd.ipunplugged.rcprofile": [ - "rcprofile" - ], - "application/vnd.irepository.package+xml": [ - "irp" - ], - "application/vnd.is-xpr": [ - "xpr" - ], - "application/vnd.isac.fcs": [ - "fcs" - ], - "application/vnd.jam": [ - "jam" - ], - "application/vnd.japannet-directory-service": [], - "application/vnd.japannet-jpnstore-wakeup": [], - "application/vnd.japannet-payment-wakeup": [], - "application/vnd.japannet-registration": [], - "application/vnd.japannet-registration-wakeup": [], - "application/vnd.japannet-setstore-wakeup": [], - "application/vnd.japannet-verification": [], - "application/vnd.japannet-verification-wakeup": [], - "application/vnd.jcp.javame.midlet-rms": [ - "rms" - ], - "application/vnd.jisp": [ - "jisp" - ], - "application/vnd.joost.joda-archive": [ - "joda" - ], - "application/vnd.kahootz": [ - "ktz", - "ktr" - ], - "application/vnd.kde.karbon": [ - "karbon" - ], - "application/vnd.kde.kchart": [ - "chrt" - ], - "application/vnd.kde.kformula": [ - "kfo" - ], - "application/vnd.kde.kivio": [ - "flw" - ], - "application/vnd.kde.kontour": [ - "kon" - ], - "application/vnd.kde.kpresenter": [ - "kpr", - "kpt" - ], - "application/vnd.kde.kspread": [ - "ksp" - ], - "application/vnd.kde.kword": [ - "kwd", - "kwt" - ], - "application/vnd.kenameaapp": [ - "htke" - ], - "application/vnd.kidspiration": [ - "kia" - ], - "application/vnd.kinar": [ - "kne", - "knp" - ], - "application/vnd.koan": [ - "skp", - "skd", - "skt", - "skm" - ], - "application/vnd.kodak-descriptor": [ - "sse" - ], - "application/vnd.las.las+xml": [ - "lasxml" - ], - "application/vnd.liberty-request+xml": [], - "application/vnd.llamagraphics.life-balance.desktop": [ - "lbd" - ], - "application/vnd.llamagraphics.life-balance.exchange+xml": [ - "lbe" - ], - "application/vnd.lotus-1-2-3": [ - "123" - ], - "application/vnd.lotus-approach": [ - "apr" - ], - "application/vnd.lotus-freelance": [ - "pre" - ], - "application/vnd.lotus-notes": [ - "nsf" - ], - "application/vnd.lotus-organizer": [ - "org" - ], - "application/vnd.lotus-screencam": [ - "scm" - ], - "application/vnd.lotus-wordpro": [ - "lwp" - ], - "application/vnd.macports.portpkg": [ - "portpkg" - ], - "application/vnd.marlin.drm.actiontoken+xml": [], - "application/vnd.marlin.drm.conftoken+xml": [], - "application/vnd.marlin.drm.license+xml": [], - "application/vnd.marlin.drm.mdcf": [], - "application/vnd.mcd": [ - "mcd" - ], - "application/vnd.medcalcdata": [ - "mc1" - ], - "application/vnd.mediastation.cdkey": [ - "cdkey" - ], - "application/vnd.meridian-slingshot": [], - "application/vnd.mfer": [ - "mwf" - ], - "application/vnd.mfmp": [ - "mfm" - ], - "application/vnd.micrografx.flo": [ - "flo" - ], - "application/vnd.micrografx.igx": [ - "igx" - ], - "application/vnd.mif": [ - "mif" - ], - "application/vnd.minisoft-hp3000-save": [], - "application/vnd.mitsubishi.misty-guard.trustweb": [], - "application/vnd.mobius.daf": [ - "daf" - ], - "application/vnd.mobius.dis": [ - "dis" - ], - "application/vnd.mobius.mbk": [ - "mbk" - ], - "application/vnd.mobius.mqy": [ - "mqy" - ], - "application/vnd.mobius.msl": [ - "msl" - ], - "application/vnd.mobius.plc": [ - "plc" - ], - "application/vnd.mobius.txf": [ - "txf" - ], - "application/vnd.mophun.application": [ - "mpn" - ], - "application/vnd.mophun.certificate": [ - "mpc" - ], - "application/vnd.motorola.flexsuite": [], - "application/vnd.motorola.flexsuite.adsi": [], - "application/vnd.motorola.flexsuite.fis": [], - "application/vnd.motorola.flexsuite.gotap": [], - "application/vnd.motorola.flexsuite.kmr": [], - "application/vnd.motorola.flexsuite.ttc": [], - "application/vnd.motorola.flexsuite.wem": [], - "application/vnd.motorola.iprm": [], - "application/vnd.mozilla.xul+xml": [ - "xul" - ], - "application/vnd.ms-artgalry": [ - "cil" - ], - "application/vnd.ms-asf": [], - "application/vnd.ms-cab-compressed": [ - "cab" - ], - "application/vnd.ms-color.iccprofile": [], - "application/vnd.ms-excel": [ - "xls", - "xlm", - "xla", - "xlc", - "xlt", - "xlw" - ], - "application/vnd.ms-excel.addin.macroenabled.12": [ - "xlam" - ], - "application/vnd.ms-excel.sheet.binary.macroenabled.12": [ - "xlsb" - ], - "application/vnd.ms-excel.sheet.macroenabled.12": [ - "xlsm" - ], - "application/vnd.ms-excel.template.macroenabled.12": [ - "xltm" - ], - "application/vnd.ms-fontobject": [ - "eot" - ], - "application/vnd.ms-htmlhelp": [ - "chm" - ], - "application/vnd.ms-ims": [ - "ims" - ], - "application/vnd.ms-lrm": [ - "lrm" - ], - "application/vnd.ms-office.activex+xml": [], - "application/vnd.ms-officetheme": [ - "thmx" - ], - "application/vnd.ms-opentype": [], - "application/vnd.ms-package.obfuscated-opentype": [], - "application/vnd.ms-pki.seccat": [ - "cat" - ], - "application/vnd.ms-pki.stl": [ - "stl" - ], - "application/vnd.ms-playready.initiator+xml": [], - "application/vnd.ms-powerpoint": [ - "ppt", - "pps", - "pot" - ], - "application/vnd.ms-powerpoint.addin.macroenabled.12": [ - "ppam" - ], - "application/vnd.ms-powerpoint.presentation.macroenabled.12": [ - "pptm" - ], - "application/vnd.ms-powerpoint.slide.macroenabled.12": [ - "sldm" - ], - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": [ - "ppsm" - ], - "application/vnd.ms-powerpoint.template.macroenabled.12": [ - "potm" - ], - "application/vnd.ms-printing.printticket+xml": [], - "application/vnd.ms-project": [ - "mpp", - "mpt" - ], - "application/vnd.ms-tnef": [], - "application/vnd.ms-wmdrm.lic-chlg-req": [], - "application/vnd.ms-wmdrm.lic-resp": [], - "application/vnd.ms-wmdrm.meter-chlg-req": [], - "application/vnd.ms-wmdrm.meter-resp": [], - "application/vnd.ms-word.document.macroenabled.12": [ - "docm" - ], - "application/vnd.ms-word.template.macroenabled.12": [ - "dotm" - ], - "application/vnd.ms-works": [ - "wps", - "wks", - "wcm", - "wdb" - ], - "application/vnd.ms-wpl": [ - "wpl" - ], - "application/vnd.ms-xpsdocument": [ - "xps" - ], - "application/vnd.mseq": [ - "mseq" - ], - "application/vnd.msign": [], - "application/vnd.multiad.creator": [], - "application/vnd.multiad.creator.cif": [], - "application/vnd.music-niff": [], - "application/vnd.musician": [ - "mus" - ], - "application/vnd.muvee.style": [ - "msty" - ], - "application/vnd.mynfc": [ - "taglet" - ], - "application/vnd.ncd.control": [], - "application/vnd.ncd.reference": [], - "application/vnd.nervana": [], - "application/vnd.netfpx": [], - "application/vnd.neurolanguage.nlu": [ - "nlu" - ], - "application/vnd.nitf": [ - "ntf", - "nitf" - ], - "application/vnd.noblenet-directory": [ - "nnd" - ], - "application/vnd.noblenet-sealer": [ - "nns" - ], - "application/vnd.noblenet-web": [ - "nnw" - ], - "application/vnd.nokia.catalogs": [], - "application/vnd.nokia.conml+wbxml": [], - "application/vnd.nokia.conml+xml": [], - "application/vnd.nokia.isds-radio-presets": [], - "application/vnd.nokia.iptv.config+xml": [], - "application/vnd.nokia.landmark+wbxml": [], - "application/vnd.nokia.landmark+xml": [], - "application/vnd.nokia.landmarkcollection+xml": [], - "application/vnd.nokia.n-gage.ac+xml": [], - "application/vnd.nokia.n-gage.data": [ - "ngdat" - ], - "application/vnd.nokia.ncd": [], - "application/vnd.nokia.pcd+wbxml": [], - "application/vnd.nokia.pcd+xml": [], - "application/vnd.nokia.radio-preset": [ - "rpst" - ], - "application/vnd.nokia.radio-presets": [ - "rpss" - ], - "application/vnd.novadigm.edm": [ - "edm" - ], - "application/vnd.novadigm.edx": [ - "edx" - ], - "application/vnd.novadigm.ext": [ - "ext" - ], - "application/vnd.ntt-local.file-transfer": [], - "application/vnd.ntt-local.sip-ta_remote": [], - "application/vnd.ntt-local.sip-ta_tcp_stream": [], - "application/vnd.oasis.opendocument.chart": [ - "odc" - ], - "application/vnd.oasis.opendocument.chart-template": [ - "otc" - ], - "application/vnd.oasis.opendocument.database": [ - "odb" - ], - "application/vnd.oasis.opendocument.formula": [ - "odf" - ], - "application/vnd.oasis.opendocument.formula-template": [ - "odft" - ], - "application/vnd.oasis.opendocument.graphics": [ - "odg" - ], - "application/vnd.oasis.opendocument.graphics-template": [ - "otg" - ], - "application/vnd.oasis.opendocument.image": [ - "odi" - ], - "application/vnd.oasis.opendocument.image-template": [ - "oti" - ], - "application/vnd.oasis.opendocument.presentation": [ - "odp" - ], - "application/vnd.oasis.opendocument.presentation-template": [ - "otp" - ], - "application/vnd.oasis.opendocument.spreadsheet": [ - "ods" - ], - "application/vnd.oasis.opendocument.spreadsheet-template": [ - "ots" - ], - "application/vnd.oasis.opendocument.text": [ - "odt" - ], - "application/vnd.oasis.opendocument.text-master": [ - "odm" - ], - "application/vnd.oasis.opendocument.text-template": [ - "ott" - ], - "application/vnd.oasis.opendocument.text-web": [ - "oth" - ], - "application/vnd.obn": [], - "application/vnd.oftn.l10n+json": [], - "application/vnd.oipf.contentaccessdownload+xml": [], - "application/vnd.oipf.contentaccessstreaming+xml": [], - "application/vnd.oipf.cspg-hexbinary": [], - "application/vnd.oipf.dae.svg+xml": [], - "application/vnd.oipf.dae.xhtml+xml": [], - "application/vnd.oipf.mippvcontrolmessage+xml": [], - "application/vnd.oipf.pae.gem": [], - "application/vnd.oipf.spdiscovery+xml": [], - "application/vnd.oipf.spdlist+xml": [], - "application/vnd.oipf.ueprofile+xml": [], - "application/vnd.oipf.userprofile+xml": [], - "application/vnd.olpc-sugar": [ - "xo" - ], - "application/vnd.oma-scws-config": [], - "application/vnd.oma-scws-http-request": [], - "application/vnd.oma-scws-http-response": [], - "application/vnd.oma.bcast.associated-procedure-parameter+xml": [], - "application/vnd.oma.bcast.drm-trigger+xml": [], - "application/vnd.oma.bcast.imd+xml": [], - "application/vnd.oma.bcast.ltkm": [], - "application/vnd.oma.bcast.notification+xml": [], - "application/vnd.oma.bcast.provisioningtrigger": [], - "application/vnd.oma.bcast.sgboot": [], - "application/vnd.oma.bcast.sgdd+xml": [], - "application/vnd.oma.bcast.sgdu": [], - "application/vnd.oma.bcast.simple-symbol-container": [], - "application/vnd.oma.bcast.smartcard-trigger+xml": [], - "application/vnd.oma.bcast.sprov+xml": [], - "application/vnd.oma.bcast.stkm": [], - "application/vnd.oma.cab-address-book+xml": [], - "application/vnd.oma.cab-feature-handler+xml": [], - "application/vnd.oma.cab-pcc+xml": [], - "application/vnd.oma.cab-user-prefs+xml": [], - "application/vnd.oma.dcd": [], - "application/vnd.oma.dcdc": [], - "application/vnd.oma.dd2+xml": [ - "dd2" - ], - "application/vnd.oma.drm.risd+xml": [], - "application/vnd.oma.group-usage-list+xml": [], - "application/vnd.oma.pal+xml": [], - "application/vnd.oma.poc.detailed-progress-report+xml": [], - "application/vnd.oma.poc.final-report+xml": [], - "application/vnd.oma.poc.groups+xml": [], - "application/vnd.oma.poc.invocation-descriptor+xml": [], - "application/vnd.oma.poc.optimized-progress-report+xml": [], - "application/vnd.oma.push": [], - "application/vnd.oma.scidm.messages+xml": [], - "application/vnd.oma.xcap-directory+xml": [], - "application/vnd.omads-email+xml": [], - "application/vnd.omads-file+xml": [], - "application/vnd.omads-folder+xml": [], - "application/vnd.omaloc-supl-init": [], - "application/vnd.openofficeorg.extension": [ - "oxt" - ], - "application/vnd.openxmlformats-officedocument.custom-properties+xml": [], - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": [], - "application/vnd.openxmlformats-officedocument.drawing+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": [], - "application/vnd.openxmlformats-officedocument.extended-properties+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presentation": [ - "pptx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slide": [ - "sldx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [ - "ppsx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.template": [ - "potx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [ - "xlsx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [ - "xltx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": [], - "application/vnd.openxmlformats-officedocument.theme+xml": [], - "application/vnd.openxmlformats-officedocument.themeoverride+xml": [], - "application/vnd.openxmlformats-officedocument.vmldrawing": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [ - "docx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [ - "dotx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": [], - "application/vnd.openxmlformats-package.core-properties+xml": [], - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": [], - "application/vnd.openxmlformats-package.relationships+xml": [], - "application/vnd.quobject-quoxdocument": [], - "application/vnd.osa.netdeploy": [], - "application/vnd.osgeo.mapguide.package": [ - "mgp" - ], - "application/vnd.osgi.bundle": [], - "application/vnd.osgi.dp": [ - "dp" - ], - "application/vnd.osgi.subsystem": [ - "esa" - ], - "application/vnd.otps.ct-kip+xml": [], - "application/vnd.palm": [ - "pdb", - "pqa", - "oprc" - ], - "application/vnd.paos.xml": [], - "application/vnd.pawaafile": [ - "paw" - ], - "application/vnd.pg.format": [ - "str" - ], - "application/vnd.pg.osasli": [ - "ei6" - ], - "application/vnd.piaccess.application-licence": [], - "application/vnd.picsel": [ - "efif" - ], - "application/vnd.pmi.widget": [ - "wg" - ], - "application/vnd.poc.group-advertisement+xml": [], - "application/vnd.pocketlearn": [ - "plf" - ], - "application/vnd.powerbuilder6": [ - "pbd" - ], - "application/vnd.powerbuilder6-s": [], - "application/vnd.powerbuilder7": [], - "application/vnd.powerbuilder7-s": [], - "application/vnd.powerbuilder75": [], - "application/vnd.powerbuilder75-s": [], - "application/vnd.preminet": [], - "application/vnd.previewsystems.box": [ - "box" - ], - "application/vnd.proteus.magazine": [ - "mgz" - ], - "application/vnd.publishare-delta-tree": [ - "qps" - ], - "application/vnd.pvi.ptid1": [ - "ptid" - ], - "application/vnd.pwg-multiplexed": [], - "application/vnd.pwg-xhtml-print+xml": [], - "application/vnd.qualcomm.brew-app-res": [], - "application/vnd.quark.quarkxpress": [ - "qxd", - "qxt", - "qwd", - "qwt", - "qxl", - "qxb" - ], - "application/vnd.radisys.moml+xml": [], - "application/vnd.radisys.msml+xml": [], - "application/vnd.radisys.msml-audit+xml": [], - "application/vnd.radisys.msml-audit-conf+xml": [], - "application/vnd.radisys.msml-audit-conn+xml": [], - "application/vnd.radisys.msml-audit-dialog+xml": [], - "application/vnd.radisys.msml-audit-stream+xml": [], - "application/vnd.radisys.msml-conf+xml": [], - "application/vnd.radisys.msml-dialog+xml": [], - "application/vnd.radisys.msml-dialog-base+xml": [], - "application/vnd.radisys.msml-dialog-fax-detect+xml": [], - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": [], - "application/vnd.radisys.msml-dialog-group+xml": [], - "application/vnd.radisys.msml-dialog-speech+xml": [], - "application/vnd.radisys.msml-dialog-transform+xml": [], - "application/vnd.rainstor.data": [], - "application/vnd.rapid": [], - "application/vnd.realvnc.bed": [ - "bed" - ], - "application/vnd.recordare.musicxml": [ - "mxl" - ], - "application/vnd.recordare.musicxml+xml": [ - "musicxml" - ], - "application/vnd.renlearn.rlprint": [], - "application/vnd.rig.cryptonote": [ - "cryptonote" - ], - "application/vnd.rim.cod": [ - "cod" - ], - "application/vnd.rn-realmedia": [ - "rm" - ], - "application/vnd.rn-realmedia-vbr": [ - "rmvb" - ], - "application/vnd.route66.link66+xml": [ - "link66" - ], - "application/vnd.rs-274x": [], - "application/vnd.ruckus.download": [], - "application/vnd.s3sms": [], - "application/vnd.sailingtracker.track": [ - "st" - ], - "application/vnd.sbm.cid": [], - "application/vnd.sbm.mid2": [], - "application/vnd.scribus": [], - "application/vnd.sealed.3df": [], - "application/vnd.sealed.csf": [], - "application/vnd.sealed.doc": [], - "application/vnd.sealed.eml": [], - "application/vnd.sealed.mht": [], - "application/vnd.sealed.net": [], - "application/vnd.sealed.ppt": [], - "application/vnd.sealed.tiff": [], - "application/vnd.sealed.xls": [], - "application/vnd.sealedmedia.softseal.html": [], - "application/vnd.sealedmedia.softseal.pdf": [], - "application/vnd.seemail": [ - "see" - ], - "application/vnd.sema": [ - "sema" - ], - "application/vnd.semd": [ - "semd" - ], - "application/vnd.semf": [ - "semf" - ], - "application/vnd.shana.informed.formdata": [ - "ifm" - ], - "application/vnd.shana.informed.formtemplate": [ - "itp" - ], - "application/vnd.shana.informed.interchange": [ - "iif" - ], - "application/vnd.shana.informed.package": [ - "ipk" - ], - "application/vnd.simtech-mindmapper": [ - "twd", - "twds" - ], - "application/vnd.smaf": [ - "mmf" - ], - "application/vnd.smart.notebook": [], - "application/vnd.smart.teacher": [ - "teacher" - ], - "application/vnd.software602.filler.form+xml": [], - "application/vnd.software602.filler.form-xml-zip": [], - "application/vnd.solent.sdkm+xml": [ - "sdkm", - "sdkd" - ], - "application/vnd.spotfire.dxp": [ - "dxp" - ], - "application/vnd.spotfire.sfs": [ - "sfs" - ], - "application/vnd.sss-cod": [], - "application/vnd.sss-dtf": [], - "application/vnd.sss-ntf": [], - "application/vnd.stardivision.calc": [ - "sdc" - ], - "application/vnd.stardivision.draw": [ - "sda" - ], - "application/vnd.stardivision.impress": [ - "sdd" - ], - "application/vnd.stardivision.math": [ - "smf" - ], - "application/vnd.stardivision.writer": [ - "sdw", - "vor" - ], - "application/vnd.stardivision.writer-global": [ - "sgl" - ], - "application/vnd.stepmania.package": [ - "smzip" - ], - "application/vnd.stepmania.stepchart": [ - "sm" - ], - "application/vnd.street-stream": [], - "application/vnd.sun.xml.calc": [ - "sxc" - ], - "application/vnd.sun.xml.calc.template": [ - "stc" - ], - "application/vnd.sun.xml.draw": [ - "sxd" - ], - "application/vnd.sun.xml.draw.template": [ - "std" - ], - "application/vnd.sun.xml.impress": [ - "sxi" - ], - "application/vnd.sun.xml.impress.template": [ - "sti" - ], - "application/vnd.sun.xml.math": [ - "sxm" - ], - "application/vnd.sun.xml.writer": [ - "sxw" - ], - "application/vnd.sun.xml.writer.global": [ - "sxg" - ], - "application/vnd.sun.xml.writer.template": [ - "stw" - ], - "application/vnd.sun.wadl+xml": [], - "application/vnd.sus-calendar": [ - "sus", - "susp" - ], - "application/vnd.svd": [ - "svd" - ], - "application/vnd.swiftview-ics": [], - "application/vnd.symbian.install": [ - "sis", - "sisx" - ], - "application/vnd.syncml+xml": [ - "xsm" - ], - "application/vnd.syncml.dm+wbxml": [ - "bdm" - ], - "application/vnd.syncml.dm+xml": [ - "xdm" - ], - "application/vnd.syncml.dm.notification": [], - "application/vnd.syncml.ds.notification": [], - "application/vnd.tao.intent-module-archive": [ - "tao" - ], - "application/vnd.tcpdump.pcap": [ - "pcap", - "cap", - "dmp" - ], - "application/vnd.tmobile-livetv": [ - "tmo" - ], - "application/vnd.trid.tpt": [ - "tpt" - ], - "application/vnd.triscape.mxs": [ - "mxs" - ], - "application/vnd.trueapp": [ - "tra" - ], - "application/vnd.truedoc": [], - "application/vnd.ubisoft.webplayer": [], - "application/vnd.ufdl": [ - "ufd", - "ufdl" - ], - "application/vnd.uiq.theme": [ - "utz" - ], - "application/vnd.umajin": [ - "umj" - ], - "application/vnd.unity": [ - "unityweb" - ], - "application/vnd.uoml+xml": [ - "uoml" - ], - "application/vnd.uplanet.alert": [], - "application/vnd.uplanet.alert-wbxml": [], - "application/vnd.uplanet.bearer-choice": [], - "application/vnd.uplanet.bearer-choice-wbxml": [], - "application/vnd.uplanet.cacheop": [], - "application/vnd.uplanet.cacheop-wbxml": [], - "application/vnd.uplanet.channel": [], - "application/vnd.uplanet.channel-wbxml": [], - "application/vnd.uplanet.list": [], - "application/vnd.uplanet.list-wbxml": [], - "application/vnd.uplanet.listcmd": [], - "application/vnd.uplanet.listcmd-wbxml": [], - "application/vnd.uplanet.signal": [], - "application/vnd.vcx": [ - "vcx" - ], - "application/vnd.vd-study": [], - "application/vnd.vectorworks": [], - "application/vnd.verimatrix.vcas": [], - "application/vnd.vidsoft.vidconference": [], - "application/vnd.visio": [ - "vsd", - "vst", - "vss", - "vsw" - ], - "application/vnd.visionary": [ - "vis" - ], - "application/vnd.vividence.scriptfile": [], - "application/vnd.vsf": [ - "vsf" - ], - "application/vnd.wap.sic": [], - "application/vnd.wap.slc": [], - "application/vnd.wap.wbxml": [ - "wbxml" - ], - "application/vnd.wap.wmlc": [ - "wmlc" - ], - "application/vnd.wap.wmlscriptc": [ - "wmlsc" - ], - "application/vnd.webturbo": [ - "wtb" - ], - "application/vnd.wfa.wsc": [], - "application/vnd.wmc": [], - "application/vnd.wmf.bootstrap": [], - "application/vnd.wolfram.mathematica": [], - "application/vnd.wolfram.mathematica.package": [], - "application/vnd.wolfram.player": [ - "nbp" - ], - "application/vnd.wordperfect": [ - "wpd" - ], - "application/vnd.wqd": [ - "wqd" - ], - "application/vnd.wrq-hp3000-labelled": [], - "application/vnd.wt.stf": [ - "stf" - ], - "application/vnd.wv.csp+wbxml": [], - "application/vnd.wv.csp+xml": [], - "application/vnd.wv.ssp+xml": [], - "application/vnd.xara": [ - "xar" - ], - "application/vnd.xfdl": [ - "xfdl" - ], - "application/vnd.xfdl.webform": [], - "application/vnd.xmi+xml": [], - "application/vnd.xmpie.cpkg": [], - "application/vnd.xmpie.dpkg": [], - "application/vnd.xmpie.plan": [], - "application/vnd.xmpie.ppkg": [], - "application/vnd.xmpie.xlim": [], - "application/vnd.yamaha.hv-dic": [ - "hvd" - ], - "application/vnd.yamaha.hv-script": [ - "hvs" - ], - "application/vnd.yamaha.hv-voice": [ - "hvp" - ], - "application/vnd.yamaha.openscoreformat": [ - "osf" - ], - "application/vnd.yamaha.openscoreformat.osfpvg+xml": [ - "osfpvg" - ], - "application/vnd.yamaha.remote-setup": [], - "application/vnd.yamaha.smaf-audio": [ - "saf" - ], - "application/vnd.yamaha.smaf-phrase": [ - "spf" - ], - "application/vnd.yamaha.through-ngn": [], - "application/vnd.yamaha.tunnel-udpencap": [], - "application/vnd.yellowriver-custom-menu": [ - "cmp" - ], - "application/vnd.zul": [ - "zir", - "zirz" - ], - "application/vnd.zzazz.deck+xml": [ - "zaz" - ], - "application/voicexml+xml": [ - "vxml" - ], - "application/vq-rtcpxr": [], - "application/watcherinfo+xml": [], - "application/whoispp-query": [], - "application/whoispp-response": [], - "application/widget": [ - "wgt" - ], - "application/winhlp": [ - "hlp" - ], - "application/wita": [], - "application/wordperfect5.1": [], - "application/wsdl+xml": [ - "wsdl" - ], - "application/wspolicy+xml": [ - "wspolicy" - ], - "application/x-7z-compressed": [ - "7z" - ], - "application/x-abiword": [ - "abw" - ], - "application/x-ace-compressed": [ - "ace" - ], - "application/x-amf": [], - "application/x-apple-diskimage": [ - "dmg" - ], - "application/x-authorware-bin": [ - "aab", - "x32", - "u32", - "vox" - ], - "application/x-authorware-map": [ - "aam" - ], - "application/x-authorware-seg": [ - "aas" - ], - "application/x-bcpio": [ - "bcpio" - ], - "application/x-bittorrent": [ - "torrent" - ], - "application/x-blorb": [ - "blb", - "blorb" - ], - "application/x-bzip": [ - "bz" - ], - "application/x-bzip2": [ - "bz2", - "boz" - ], - "application/x-cbr": [ - "cbr", - "cba", - "cbt", - "cbz", - "cb7" - ], - "application/x-cdlink": [ - "vcd" - ], - "application/x-cfs-compressed": [ - "cfs" - ], - "application/x-chat": [ - "chat" - ], - "application/x-chess-pgn": [ - "pgn" - ], - "application/x-conference": [ - "nsc" - ], - "application/x-compress": [], - "application/x-cpio": [ - "cpio" - ], - "application/x-csh": [ - "csh" - ], - "application/x-debian-package": [ - "deb", - "udeb" - ], - "application/x-dgc-compressed": [ - "dgc" - ], - "application/x-director": [ - "dir", - "dcr", - "dxr", - "cst", - "cct", - "cxt", - "w3d", - "fgd", - "swa" - ], - "application/x-doom": [ - "wad" - ], - "application/x-dtbncx+xml": [ - "ncx" - ], - "application/x-dtbook+xml": [ - "dtb" - ], - "application/x-dtbresource+xml": [ - "res" - ], - "application/x-dvi": [ - "dvi" - ], - "application/x-envoy": [ - "evy" - ], - "application/x-eva": [ - "eva" - ], - "application/x-font-bdf": [ - "bdf" - ], - "application/x-font-dos": [], - "application/x-font-framemaker": [], - "application/x-font-ghostscript": [ - "gsf" - ], - "application/x-font-libgrx": [], - "application/x-font-linux-psf": [ - "psf" - ], - "application/x-font-otf": [ - "otf" - ], - "application/x-font-pcf": [ - "pcf" - ], - "application/x-font-snf": [ - "snf" - ], - "application/x-font-speedo": [], - "application/x-font-sunos-news": [], - "application/x-font-ttf": [ - "ttf", - "ttc" - ], - "application/x-font-type1": [ - "pfa", - "pfb", - "pfm", - "afm" - ], - "application/font-woff": [ - "woff" - ], - "application/x-font-vfont": [], - "application/x-freearc": [ - "arc" - ], - "application/x-futuresplash": [ - "spl" - ], - "application/x-gca-compressed": [ - "gca" - ], - "application/x-glulx": [ - "ulx" - ], - "application/x-gnumeric": [ - "gnumeric" - ], - "application/x-gramps-xml": [ - "gramps" - ], - "application/x-gtar": [ - "gtar" - ], - "application/x-gzip": [], - "application/x-hdf": [ - "hdf" - ], - "application/x-install-instructions": [ - "install" - ], - "application/x-iso9660-image": [ - "iso" - ], - "application/x-java-jnlp-file": [ - "jnlp" - ], - "application/x-latex": [ - "latex" - ], - "application/x-lzh-compressed": [ - "lzh", - "lha" - ], - "application/x-mie": [ - "mie" - ], - "application/x-mobipocket-ebook": [ - "prc", - "mobi" - ], - "application/x-ms-application": [ - "application" - ], - "application/x-ms-shortcut": [ - "lnk" - ], - "application/x-ms-wmd": [ - "wmd" - ], - "application/x-ms-wmz": [ - "wmz" - ], - "application/x-ms-xbap": [ - "xbap" - ], - "application/x-msaccess": [ - "mdb" - ], - "application/x-msbinder": [ - "obd" - ], - "application/x-mscardfile": [ - "crd" - ], - "application/x-msclip": [ - "clp" - ], - "application/x-msdownload": [ - "exe", - "dll", - "com", - "bat", - "msi" - ], - "application/x-msmediaview": [ - "mvb", - "m13", - "m14" - ], - "application/x-msmetafile": [ - "wmf", - "wmz", - "emf", - "emz" - ], - "application/x-msmoney": [ - "mny" - ], - "application/x-mspublisher": [ - "pub" - ], - "application/x-msschedule": [ - "scd" - ], - "application/x-msterminal": [ - "trm" - ], - "application/x-mswrite": [ - "wri" - ], - "application/x-netcdf": [ - "nc", - "cdf" - ], - "application/x-nzb": [ - "nzb" - ], - "application/x-pkcs12": [ - "p12", - "pfx" - ], - "application/x-pkcs7-certificates": [ - "p7b", - "spc" - ], - "application/x-pkcs7-certreqresp": [ - "p7r" - ], - "application/x-rar-compressed": [ - "rar" - ], - "application/x-research-info-systems": [ - "ris" - ], - "application/x-sh": [ - "sh" - ], - "application/x-shar": [ - "shar" - ], - "application/x-shockwave-flash": [ - "swf" - ], - "application/x-silverlight-app": [ - "xap" - ], - "application/x-sql": [ - "sql" - ], - "application/x-stuffit": [ - "sit" - ], - "application/x-stuffitx": [ - "sitx" - ], - "application/x-subrip": [ - "srt" - ], - "application/x-sv4cpio": [ - "sv4cpio" - ], - "application/x-sv4crc": [ - "sv4crc" - ], - "application/x-t3vm-image": [ - "t3" - ], - "application/x-tads": [ - "gam" - ], - "application/x-tar": [ - "tar" - ], - "application/x-tcl": [ - "tcl" - ], - "application/x-tex": [ - "tex" - ], - "application/x-tex-tfm": [ - "tfm" - ], - "application/x-texinfo": [ - "texinfo", - "texi" - ], - "application/x-tgif": [ - "obj" - ], - "application/x-ustar": [ - "ustar" - ], - "application/x-wais-source": [ - "src" - ], - "application/x-x509-ca-cert": [ - "der", - "crt" - ], - "application/x-xfig": [ - "fig" - ], - "application/x-xliff+xml": [ - "xlf" - ], - "application/x-xpinstall": [ - "xpi" - ], - "application/x-xz": [ - "xz" - ], - "application/x-zmachine": [ - "z1", - "z2", - "z3", - "z4", - "z5", - "z6", - "z7", - "z8" - ], - "application/x400-bp": [], - "application/xaml+xml": [ - "xaml" - ], - "application/xcap-att+xml": [], - "application/xcap-caps+xml": [], - "application/xcap-diff+xml": [ - "xdf" - ], - "application/xcap-el+xml": [], - "application/xcap-error+xml": [], - "application/xcap-ns+xml": [], - "application/xcon-conference-info-diff+xml": [], - "application/xcon-conference-info+xml": [], - "application/xenc+xml": [ - "xenc" - ], - "application/xhtml+xml": [ - "xhtml", - "xht" - ], - "application/xhtml-voice+xml": [], - "application/xml": [ - "xml", - "xsl" - ], - "application/xml-dtd": [ - "dtd" - ], - "application/xml-external-parsed-entity": [], - "application/xmpp+xml": [], - "application/xop+xml": [ - "xop" - ], - "application/xproc+xml": [ - "xpl" - ], - "application/xslt+xml": [ - "xslt" - ], - "application/xspf+xml": [ - "xspf" - ], - "application/xv+xml": [ - "mxml", - "xhvml", - "xvml", - "xvm" - ], - "application/yang": [ - "yang" - ], - "application/yin+xml": [ - "yin" - ], - "application/zip": [ - "zip" - ], - "audio/1d-interleaved-parityfec": [], - "audio/32kadpcm": [], - "audio/3gpp": [], - "audio/3gpp2": [], - "audio/ac3": [], - "audio/adpcm": [ - "adp" - ], - "audio/amr": [], - "audio/amr-wb": [], - "audio/amr-wb+": [], - "audio/asc": [], - "audio/atrac-advanced-lossless": [], - "audio/atrac-x": [], - "audio/atrac3": [], - "audio/basic": [ - "au", - "snd" - ], - "audio/bv16": [], - "audio/bv32": [], - "audio/clearmode": [], - "audio/cn": [], - "audio/dat12": [], - "audio/dls": [], - "audio/dsr-es201108": [], - "audio/dsr-es202050": [], - "audio/dsr-es202211": [], - "audio/dsr-es202212": [], - "audio/dv": [], - "audio/dvi4": [], - "audio/eac3": [], - "audio/evrc": [], - "audio/evrc-qcp": [], - "audio/evrc0": [], - "audio/evrc1": [], - "audio/evrcb": [], - "audio/evrcb0": [], - "audio/evrcb1": [], - "audio/evrcwb": [], - "audio/evrcwb0": [], - "audio/evrcwb1": [], - "audio/example": [], - "audio/fwdred": [], - "audio/g719": [], - "audio/g722": [], - "audio/g7221": [], - "audio/g723": [], - "audio/g726-16": [], - "audio/g726-24": [], - "audio/g726-32": [], - "audio/g726-40": [], - "audio/g728": [], - "audio/g729": [], - "audio/g7291": [], - "audio/g729d": [], - "audio/g729e": [], - "audio/gsm": [], - "audio/gsm-efr": [], - "audio/gsm-hr-08": [], - "audio/ilbc": [], - "audio/ip-mr_v2.5": [], - "audio/isac": [], - "audio/l16": [], - "audio/l20": [], - "audio/l24": [], - "audio/l8": [], - "audio/lpc": [], - "audio/midi": [ - "mid", - "midi", - "kar", - "rmi" - ], - "audio/mobile-xmf": [], - "audio/mp4": [ - "mp4a" - ], - "audio/mp4a-latm": [], - "audio/mpa": [], - "audio/mpa-robust": [], - "audio/mpeg": [ - "mpga", - "mp2", - "mp2a", - "mp3", - "m2a", - "m3a" - ], - "audio/mpeg4-generic": [], - "audio/musepack": [], - "audio/ogg": [ - "oga", - "ogg", - "spx" - ], - "audio/opus": [], - "audio/parityfec": [], - "audio/pcma": [], - "audio/pcma-wb": [], - "audio/pcmu-wb": [], - "audio/pcmu": [], - "audio/prs.sid": [], - "audio/qcelp": [], - "audio/red": [], - "audio/rtp-enc-aescm128": [], - "audio/rtp-midi": [], - "audio/rtx": [], - "audio/s3m": [ - "s3m" - ], - "audio/silk": [ - "sil" - ], - "audio/smv": [], - "audio/smv0": [], - "audio/smv-qcp": [], - "audio/sp-midi": [], - "audio/speex": [], - "audio/t140c": [], - "audio/t38": [], - "audio/telephone-event": [], - "audio/tone": [], - "audio/uemclip": [], - "audio/ulpfec": [], - "audio/vdvi": [], - "audio/vmr-wb": [], - "audio/vnd.3gpp.iufp": [], - "audio/vnd.4sb": [], - "audio/vnd.audiokoz": [], - "audio/vnd.celp": [], - "audio/vnd.cisco.nse": [], - "audio/vnd.cmles.radio-events": [], - "audio/vnd.cns.anp1": [], - "audio/vnd.cns.inf1": [], - "audio/vnd.dece.audio": [ - "uva", - "uvva" - ], - "audio/vnd.digital-winds": [ - "eol" - ], - "audio/vnd.dlna.adts": [], - "audio/vnd.dolby.heaac.1": [], - "audio/vnd.dolby.heaac.2": [], - "audio/vnd.dolby.mlp": [], - "audio/vnd.dolby.mps": [], - "audio/vnd.dolby.pl2": [], - "audio/vnd.dolby.pl2x": [], - "audio/vnd.dolby.pl2z": [], - "audio/vnd.dolby.pulse.1": [], - "audio/vnd.dra": [ - "dra" - ], - "audio/vnd.dts": [ - "dts" - ], - "audio/vnd.dts.hd": [ - "dtshd" - ], - "audio/vnd.dvb.file": [], - "audio/vnd.everad.plj": [], - "audio/vnd.hns.audio": [], - "audio/vnd.lucent.voice": [ - "lvp" - ], - "audio/vnd.ms-playready.media.pya": [ - "pya" - ], - "audio/vnd.nokia.mobile-xmf": [], - "audio/vnd.nortel.vbk": [], - "audio/vnd.nuera.ecelp4800": [ - "ecelp4800" - ], - "audio/vnd.nuera.ecelp7470": [ - "ecelp7470" - ], - "audio/vnd.nuera.ecelp9600": [ - "ecelp9600" - ], - "audio/vnd.octel.sbc": [], - "audio/vnd.qcelp": [], - "audio/vnd.rhetorex.32kadpcm": [], - "audio/vnd.rip": [ - "rip" - ], - "audio/vnd.sealedmedia.softseal.mpeg": [], - "audio/vnd.vmx.cvsd": [], - "audio/vorbis": [], - "audio/vorbis-config": [], - "audio/webm": [ - "weba" - ], - "audio/x-aac": [ - "aac" - ], - "audio/x-aiff": [ - "aif", - "aiff", - "aifc" - ], - "audio/x-caf": [ - "caf" - ], - "audio/x-flac": [ - "flac" - ], - "audio/x-matroska": [ - "mka" - ], - "audio/x-mpegurl": [ - "m3u" - ], - "audio/x-ms-wax": [ - "wax" - ], - "audio/x-ms-wma": [ - "wma" - ], - "audio/x-pn-realaudio": [ - "ram", - "ra" - ], - "audio/x-pn-realaudio-plugin": [ - "rmp" - ], - "audio/x-tta": [], - "audio/x-wav": [ - "wav" - ], - "audio/xm": [ - "xm" - ], - "chemical/x-cdx": [ - "cdx" - ], - "chemical/x-cif": [ - "cif" - ], - "chemical/x-cmdf": [ - "cmdf" - ], - "chemical/x-cml": [ - "cml" - ], - "chemical/x-csml": [ - "csml" - ], - "chemical/x-pdb": [], - "chemical/x-xyz": [ - "xyz" - ], - "image/bmp": [ - "bmp" - ], - "image/cgm": [ - "cgm" - ], - "image/example": [], - "image/fits": [], - "image/g3fax": [ - "g3" - ], - "image/gif": [ - "gif" - ], - "image/ief": [ - "ief" - ], - "image/jp2": [], - "image/jpeg": [ - "jpeg", - "jpg", - "jpe" - ], - "image/jpm": [], - "image/jpx": [], - "image/ktx": [ - "ktx" - ], - "image/naplps": [], - "image/png": [ - "png" - ], - "image/prs.btif": [ - "btif" - ], - "image/prs.pti": [], - "image/sgi": [ - "sgi" - ], - "image/svg+xml": [ - "svg", - "svgz" - ], - "image/t38": [], - "image/tiff": [ - "tiff", - "tif" - ], - "image/tiff-fx": [], - "image/vnd.adobe.photoshop": [ - "psd" - ], - "image/vnd.cns.inf2": [], - "image/vnd.dece.graphic": [ - "uvi", - "uvvi", - "uvg", - "uvvg" - ], - "image/vnd.dvb.subtitle": [ - "sub" - ], - "image/vnd.djvu": [ - "djvu", - "djv" - ], - "image/vnd.dwg": [ - "dwg" - ], - "image/vnd.dxf": [ - "dxf" - ], - "image/vnd.fastbidsheet": [ - "fbs" - ], - "image/vnd.fpx": [ - "fpx" - ], - "image/vnd.fst": [ - "fst" - ], - "image/vnd.fujixerox.edmics-mmr": [ - "mmr" - ], - "image/vnd.fujixerox.edmics-rlc": [ - "rlc" - ], - "image/vnd.globalgraphics.pgb": [], - "image/vnd.microsoft.icon": [], - "image/vnd.mix": [], - "image/vnd.ms-modi": [ - "mdi" - ], - "image/vnd.ms-photo": [ - "wdp" - ], - "image/vnd.net-fpx": [ - "npx" - ], - "image/vnd.radiance": [], - "image/vnd.sealed.png": [], - "image/vnd.sealedmedia.softseal.gif": [], - "image/vnd.sealedmedia.softseal.jpg": [], - "image/vnd.svf": [], - "image/vnd.wap.wbmp": [ - "wbmp" - ], - "image/vnd.xiff": [ - "xif" - ], - "image/webp": [ - "webp" - ], - "image/x-3ds": [ - "3ds" - ], - "image/x-cmu-raster": [ - "ras" - ], - "image/x-cmx": [ - "cmx" - ], - "image/x-freehand": [ - "fh", - "fhc", - "fh4", - "fh5", - "fh7" - ], - "image/x-icon": [ - "ico" - ], - "image/x-mrsid-image": [ - "sid" - ], - "image/x-pcx": [ - "pcx" - ], - "image/x-pict": [ - "pic", - "pct" - ], - "image/x-portable-anymap": [ - "pnm" - ], - "image/x-portable-bitmap": [ - "pbm" - ], - "image/x-portable-graymap": [ - "pgm" - ], - "image/x-portable-pixmap": [ - "ppm" - ], - "image/x-rgb": [ - "rgb" - ], - "image/x-tga": [ - "tga" - ], - "image/x-xbitmap": [ - "xbm" - ], - "image/x-xpixmap": [ - "xpm" - ], - "image/x-xwindowdump": [ - "xwd" - ], - "message/cpim": [], - "message/delivery-status": [], - "message/disposition-notification": [], - "message/example": [], - "message/external-body": [], - "message/feedback-report": [], - "message/global": [], - "message/global-delivery-status": [], - "message/global-disposition-notification": [], - "message/global-headers": [], - "message/http": [], - "message/imdn+xml": [], - "message/news": [], - "message/partial": [], - "message/rfc822": [ - "eml", - "mime" - ], - "message/s-http": [], - "message/sip": [], - "message/sipfrag": [], - "message/tracking-status": [], - "message/vnd.si.simp": [], - "model/example": [], - "model/iges": [ - "igs", - "iges" - ], - "model/mesh": [ - "msh", - "mesh", - "silo" - ], - "model/vnd.collada+xml": [ - "dae" - ], - "model/vnd.dwf": [ - "dwf" - ], - "model/vnd.flatland.3dml": [], - "model/vnd.gdl": [ - "gdl" - ], - "model/vnd.gs-gdl": [], - "model/vnd.gs.gdl": [], - "model/vnd.gtw": [ - "gtw" - ], - "model/vnd.moml+xml": [], - "model/vnd.mts": [ - "mts" - ], - "model/vnd.parasolid.transmit.binary": [], - "model/vnd.parasolid.transmit.text": [], - "model/vnd.vtu": [ - "vtu" - ], - "model/vrml": [ - "wrl", - "vrml" - ], - "model/x3d+binary": [ - "x3db", - "x3dbz" - ], - "model/x3d+vrml": [ - "x3dv", - "x3dvz" - ], - "model/x3d+xml": [ - "x3d", - "x3dz" - ], - "multipart/alternative": [], - "multipart/appledouble": [], - "multipart/byteranges": [], - "multipart/digest": [], - "multipart/encrypted": [], - "multipart/example": [], - "multipart/form-data": [], - "multipart/header-set": [], - "multipart/mixed": [], - "multipart/parallel": [], - "multipart/related": [], - "multipart/report": [], - "multipart/signed": [], - "multipart/voice-message": [], - "text/1d-interleaved-parityfec": [], - "text/cache-manifest": [ - "appcache" - ], - "text/calendar": [ - "ics", - "ifb" - ], - "text/css": [ - "css" - ], - "text/csv": [ - "csv" - ], - "text/directory": [], - "text/dns": [], - "text/ecmascript": [], - "text/enriched": [], - "text/example": [], - "text/fwdred": [], - "text/html": [ - "html", - "htm" - ], - "text/javascript": [], - "text/n3": [ - "n3" - ], - "text/parityfec": [], - "text/plain": [ - "txt", - "text", - "conf", - "def", - "list", - "log", - "in" - ], - "text/prs.fallenstein.rst": [], - "text/prs.lines.tag": [ - "dsc" - ], - "text/vnd.radisys.msml-basic-layout": [], - "text/red": [], - "text/rfc822-headers": [], - "text/richtext": [ - "rtx" - ], - "text/rtf": [], - "text/rtp-enc-aescm128": [], - "text/rtx": [], - "text/sgml": [ - "sgml", - "sgm" - ], - "text/t140": [], - "text/tab-separated-values": [ - "tsv" - ], - "text/troff": [ - "t", - "tr", - "roff", - "man", - "me", - "ms" - ], - "text/turtle": [ - "ttl" - ], - "text/ulpfec": [], - "text/uri-list": [ - "uri", - "uris", - "urls" - ], - "text/vcard": [ - "vcard" - ], - "text/vnd.abc": [], - "text/vnd.curl": [ - "curl" - ], - "text/vnd.curl.dcurl": [ - "dcurl" - ], - "text/vnd.curl.scurl": [ - "scurl" - ], - "text/vnd.curl.mcurl": [ - "mcurl" - ], - "text/vnd.dmclientscript": [], - "text/vnd.dvb.subtitle": [ - "sub" - ], - "text/vnd.esmertec.theme-descriptor": [], - "text/vnd.fly": [ - "fly" - ], - "text/vnd.fmi.flexstor": [ - "flx" - ], - "text/vnd.graphviz": [ - "gv" - ], - "text/vnd.in3d.3dml": [ - "3dml" - ], - "text/vnd.in3d.spot": [ - "spot" - ], - "text/vnd.iptc.newsml": [], - "text/vnd.iptc.nitf": [], - "text/vnd.latex-z": [], - "text/vnd.motorola.reflex": [], - "text/vnd.ms-mediapackage": [], - "text/vnd.net2phone.commcenter.command": [], - "text/vnd.si.uricatalogue": [], - "text/vnd.sun.j2me.app-descriptor": [ - "jad" - ], - "text/vnd.trolltech.linguist": [], - "text/vnd.wap.si": [], - "text/vnd.wap.sl": [], - "text/vnd.wap.wml": [ - "wml" - ], - "text/vnd.wap.wmlscript": [ - "wmls" - ], - "text/x-asm": [ - "s", - "asm" - ], - "text/x-c": [ - "c", - "cc", - "cxx", - "cpp", - "h", - "hh", - "dic" - ], - "text/x-fortran": [ - "f", - "for", - "f77", - "f90" - ], - "text/x-java-source": [ - "java" - ], - "text/x-opml": [ - "opml" - ], - "text/x-pascal": [ - "p", - "pas" - ], - "text/x-nfo": [ - "nfo" - ], - "text/x-setext": [ - "etx" - ], - "text/x-sfv": [ - "sfv" - ], - "text/x-uuencode": [ - "uu" - ], - "text/x-vcalendar": [ - "vcs" - ], - "text/x-vcard": [ - "vcf" - ], - "text/xml": [], - "text/xml-external-parsed-entity": [], - "video/1d-interleaved-parityfec": [], - "video/3gpp": [ - "3gp" - ], - "video/3gpp-tt": [], - "video/3gpp2": [ - "3g2" - ], - "video/bmpeg": [], - "video/bt656": [], - "video/celb": [], - "video/dv": [], - "video/example": [], - "video/h261": [ - "h261" - ], - "video/h263": [ - "h263" - ], - "video/h263-1998": [], - "video/h263-2000": [], - "video/h264": [ - "h264" - ], - "video/h264-rcdo": [], - "video/h264-svc": [], - "video/jpeg": [ - "jpgv" - ], - "video/jpeg2000": [], - "video/jpm": [ - "jpm", - "jpgm" - ], - "video/mj2": [ - "mj2", - "mjp2" - ], - "video/mp1s": [], - "video/mp2p": [], - "video/mp2t": [], - "video/mp4": [ - "mp4", - "mp4v", - "mpg4" - ], - "video/mp4v-es": [], - "video/mpeg": [ - "mpeg", - "mpg", - "mpe", - "m1v", - "m2v" - ], - "video/mpeg4-generic": [], - "video/mpv": [], - "video/nv": [], - "video/ogg": [ - "ogv" - ], - "video/parityfec": [], - "video/pointer": [], - "video/quicktime": [ - "qt", - "mov" - ], - "video/raw": [], - "video/rtp-enc-aescm128": [], - "video/rtx": [], - "video/smpte292m": [], - "video/ulpfec": [], - "video/vc1": [], - "video/vnd.cctv": [], - "video/vnd.dece.hd": [ - "uvh", - "uvvh" - ], - "video/vnd.dece.mobile": [ - "uvm", - "uvvm" - ], - "video/vnd.dece.mp4": [], - "video/vnd.dece.pd": [ - "uvp", - "uvvp" - ], - "video/vnd.dece.sd": [ - "uvs", - "uvvs" - ], - "video/vnd.dece.video": [ - "uvv", - "uvvv" - ], - "video/vnd.directv.mpeg": [], - "video/vnd.directv.mpeg-tts": [], - "video/vnd.dlna.mpeg-tts": [], - "video/vnd.dvb.file": [ - "dvb" - ], - "video/vnd.fvt": [ - "fvt" - ], - "video/vnd.hns.video": [], - "video/vnd.iptvforum.1dparityfec-1010": [], - "video/vnd.iptvforum.1dparityfec-2005": [], - "video/vnd.iptvforum.2dparityfec-1010": [], - "video/vnd.iptvforum.2dparityfec-2005": [], - "video/vnd.iptvforum.ttsavc": [], - "video/vnd.iptvforum.ttsmpeg2": [], - "video/vnd.motorola.video": [], - "video/vnd.motorola.videop": [], - "video/vnd.mpegurl": [ - "mxu", - "m4u" - ], - "video/vnd.ms-playready.media.pyv": [ - "pyv" - ], - "video/vnd.nokia.interleaved-multimedia": [], - "video/vnd.nokia.videovoip": [], - "video/vnd.objectvideo": [], - "video/vnd.sealed.mpeg1": [], - "video/vnd.sealed.mpeg4": [], - "video/vnd.sealed.swf": [], - "video/vnd.sealedmedia.softseal.mov": [], - "video/vnd.uvvu.mp4": [ - "uvu", - "uvvu" - ], - "video/vnd.vivo": [ - "viv" - ], - "video/webm": [ - "webm" - ], - "video/x-f4v": [ - "f4v" - ], - "video/x-fli": [ - "fli" - ], - "video/x-flv": [ - "flv" - ], - "video/x-m4v": [ - "m4v" - ], - "video/x-matroska": [ - "mkv", - "mk3d", - "mks" - ], - "video/x-mng": [ - "mng" - ], - "video/x-ms-asf": [ - "asf", - "asx" - ], - "video/x-ms-vob": [ - "vob" - ], - "video/x-ms-wm": [ - "wm" - ], - "video/x-ms-wmv": [ - "wmv" - ], - "video/x-ms-wmx": [ - "wmx" - ], - "video/x-ms-wvx": [ - "wvx" - ], - "video/x-msvideo": [ - "avi" - ], - "video/x-sgi-movie": [ - "movie" - ], - "video/x-smv": [ - "smv" - ], - "x-conference/x-cooltalk": [ - "ice" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json deleted file mode 100644 index ad50d61..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "text/vtt": [ - "vtt" - ], - "application/x-chrome-extension": [ - "crx" - ], - "text/x-component": [ - "htc" - ], - "text/cache-manifest": [ - "manifest" - ], - "application/octet-stream": [ - "buffer" - ], - "application/mp4": [ - "m4p" - ], - "audio/mp4": [ - "m4a" - ], - "video/MP2T": [ - "ts" - ], - "application/x-web-app-manifest+json": [ - "webapp" - ], - "text/x-lua": [ - "lua" - ], - "application/x-lua-bytecode": [ - "luac" - ], - "text/x-markdown": [ - "markdown", - "md", - "mkd" - ], - "text/plain": [ - "ini" - ], - "application/dash+xml": [ - "mdp" - ], - "font/opentype": [ - "otf" - ], - "application/json": [ - "map" - ], - "application/xml": [ - "xsd" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json deleted file mode 100644 index bd487f6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "1.0.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": "https://searchbeam.jit.su" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/mime-types" - }, - "license": "MIT", - "main": "lib", - "devDependencies": { - "co": "3", - "cogent": "0", - "mocha": "1", - "should": "3" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "make test" - }, - "bugs": { - "url": "https://github.com/expressjs/mime-types/issues" - }, - "homepage": "https://github.com/expressjs/mime-types", - "_id": "mime-types@1.0.1", - "_shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "_from": "mime-types@>=1.0.1-0 <1.1.0-0", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/package.json deleted file mode 100644 index 6cdddee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "type-is", - "description": "Infer the content-type of a request.", - "version": "1.3.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/expressjs/type-is" - }, - "dependencies": { - "media-typer": "0.2.0", - "mime-types": "~1.0.1" - }, - "devDependencies": { - "istanbul": "0.2.11", - "mocha": "*", - "should": "*" - }, - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "test": "mocha --require should --reporter spec --check-leaks --bail test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "d76790909638d4cf1785e09858db5576f91f710f", - "bugs": { - "url": "https://github.com/expressjs/type-is/issues" - }, - "homepage": "https://github.com/expressjs/type-is", - "_id": "type-is@1.3.2", - "_shasum": "4f2a5dc58775ca1630250afc7186f8b36309d1bb", - "_from": "type-is@>=1.3.2-0 <1.4.0-0", - "_npmVersion": "1.4.16", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "4f2a5dc58775ca1630250afc7186f8b36309d1bb", - "tarball": "http://registry.npmjs.org/type-is/-/type-is-1.3.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/type-is/-/type-is-1.3.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/.travis.yml deleted file mode 100644 index af92b02..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: "node_js" -node_js: - - "0.4" - - "0.6" - - "0.8" - - "0.10" diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/LICENSE deleted file mode 100644 index e33bd10..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -(The MIT License) - -Copyright (c) 2013 Jared Hanson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/README.md deleted file mode 100644 index 2f94e9b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# utils-merge - -Merges the properties from a source object into a destination object. - -## Install - - $ npm install utils-merge - -## Usage - -```javascript -var a = { foo: 'bar' } - , b = { bar: 'baz' }; - -merge(a, b); -// => { foo: 'bar', bar: 'baz' } -``` - -## Tests - - $ npm install - $ npm test - -[![Build Status](https://secure.travis-ci.org/jaredhanson/utils-merge.png)](http://travis-ci.org/jaredhanson/utils-merge) - -## Credits - - - [Jared Hanson](http://github.com/jaredhanson) - -## License - -[The MIT License](http://opensource.org/licenses/MIT) - -Copyright (c) 2013 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/index.js deleted file mode 100644 index 4265c69..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/index.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Merge object b with object a. - * - * var a = { foo: 'bar' } - * , b = { bar: 'baz' }; - * - * merge(a, b); - * // => { foo: 'bar', bar: 'baz' } - * - * @param {Object} a - * @param {Object} b - * @return {Object} - * @api public - */ - -exports = module.exports = function(a, b){ - if (a && b) { - for (var key in b) { - a[key] = b[key]; - } - } - return a; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/package.json deleted file mode 100644 index e655383..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "utils-merge", - "version": "1.0.0", - "description": "merge() utility function", - "keywords": [ - "util" - ], - "repository": { - "type": "git", - "url": "git://github.com/jaredhanson/utils-merge.git" - }, - "bugs": { - "url": "http://github.com/jaredhanson/utils-merge/issues" - }, - "author": { - "name": "Jared Hanson", - "email": "jaredhanson@gmail.com", - "url": "http://www.jaredhanson.net/" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://www.opensource.org/licenses/MIT" - } - ], - "main": "./index", - "dependencies": {}, - "devDependencies": { - "mocha": "1.x.x", - "chai": "1.x.x" - }, - "scripts": { - "test": "mocha --reporter spec --require test/bootstrap/node test/*.test.js" - }, - "engines": { - "node": ">= 0.4.0" - }, - "readme": "# utils-merge\n\nMerges the properties from a source object into a destination object.\n\n## Install\n\n $ npm install utils-merge\n\n## Usage\n\n```javascript\nvar a = { foo: 'bar' }\n , b = { bar: 'baz' };\n\nmerge(a, b);\n// => { foo: 'bar', bar: 'baz' }\n```\n\n## Tests\n\n $ npm install\n $ npm test\n\n[![Build Status](https://secure.travis-ci.org/jaredhanson/utils-merge.png)](http://travis-ci.org/jaredhanson/utils-merge)\n\n## Credits\n\n - [Jared Hanson](http://github.com/jaredhanson)\n\n## License\n\n[The MIT License](http://opensource.org/licenses/MIT)\n\nCopyright (c) 2013 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)>\n", - "readmeFilename": "README.md", - "_id": "utils-merge@1.0.0", - "dist": { - "shasum": "0294fb922bb9375153541c4f7096231f287c8af8", - "tarball": "http://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" - }, - "_from": "utils-merge@1.0.0", - "_npmVersion": "1.2.25", - "_npmUser": { - "name": "jaredhanson", - "email": "jaredhanson@gmail.com" - }, - "maintainers": [ - { - "name": "jaredhanson", - "email": "jaredhanson@gmail.com" - } - ], - "directories": {}, - "_shasum": "0294fb922bb9375153541c4f7096231f287c8af8", - "_resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "homepage": "https://github.com/jaredhanson/utils-merge" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/History.md deleted file mode 100644 index 10fb1db..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/History.md +++ /dev/null @@ -1,9 +0,0 @@ -0.1.0 / 2014-06-05 -================== - - * Support array of fields to set - -0.0.0 / 2014-06-04 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/README.md deleted file mode 100644 index 6ed2825..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# vary - -[![NPM version](https://badge.fury.io/js/vary.svg)](http://badge.fury.io/js/vary) -[![Build Status](https://travis-ci.org/expressjs/vary.svg?branch=master)](https://travis-ci.org/expressjs/vary) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/vary.svg?branch=master)](https://coveralls.io/r/expressjs/vary) - -Update the Vary header of a response - -## Install - -```sh -$ npm install vary -``` - -## API - -```js -var vary = require('vary') -``` - -### vary(res, field) - -Adds the given header `field` to the `Vary` response header of `res`. -This can be a string of a single field or an array of multiple fields. - -This will append the header if not already listed, otherwise leaves -it listed in the current location. - -```js -vary(res, 'Origin') -vary(res, 'User-Agent') -vary(res, ['Accept', 'Accept-Language', 'Accept-Encoding']) -``` - -## Testing - -```sh -$ npm test -``` - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/index.js deleted file mode 100644 index 6f52730..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/index.js +++ /dev/null @@ -1,79 +0,0 @@ -/*! - * vary - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = vary; - -/** - * Variables. - */ - -var separators = /[\(\)<>@,;:\\"\/\[\]\?=\{\}\u0020\u0009]/; - -/** - * Mark that a request is varied on a header field. - * - * @param {Object} res - * @param {String|Array} field - * @api public - */ - -function vary(res, field) { - if (!res || !res.getHeader || !res.setHeader) { - // quack quack - throw new TypeError('res argument is required'); - } - - if (!field) { - throw new TypeError('field argument is required'); - } - - var fields = !Array.isArray(field) - ? [String(field)] - : field; - - for (var i = 0; i < fields.length; i++) { - if (separators.test(fields[i])) { - throw new TypeError('field argument contains an invalid header'); - } - } - - var val = res.getHeader('Vary') || '' - var headers = Array.isArray(val) - ? val.join(', ') - : String(val); - - // existing unspecified vary - if (headers === '*') { - return; - } - - // enumerate current values - var vals = headers.toLowerCase().split(/ *, */); - - // unspecified vary - if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { - res.setHeader('Vary', '*'); - return; - } - - for (var i = 0; i < fields.length; i++) { - field = fields[i].toLowerCase(); - - // append value (case-preserving) - if (vals.indexOf(field) === -1) { - vals.push(field); - headers = headers - ? headers + ', ' + fields[i] - : fields[i]; - } - } - - res.setHeader('Vary', headers); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/package.json deleted file mode 100644 index c4937fe..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "vary", - "description": "Update the Vary header of a response", - "version": "0.1.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "http", - "res", - "vary" - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/vary" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.0", - "should": "~4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/vary/issues" - }, - "homepage": "https://github.com/expressjs/vary", - "_id": "vary@0.1.0", - "dist": { - "shasum": "df0945899e93c0cc5bd18cc8321d9d21e74f6176", - "tarball": "http://registry.npmjs.org/vary/-/vary-0.1.0.tgz" - }, - "_from": "vary@0.1.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "df0945899e93c0cc5bd18cc8321d9d21e74f6176", - "_resolved": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/package.json deleted file mode 100644 index 65ea6d1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/package.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "name": "express", - "description": "Fast, unopinionated, minimalist web framework", - "version": "4.7.2", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Aaron Heckmann", - "email": "aaron.heckmann+github@gmail.com" - }, - { - "name": "Ciaran Jessup", - "email": "ciaranj@gmail.com" - }, - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Guillermo Rauch", - "email": "rauchg@gmail.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com" - }, - { - "name": "Roman Shtylman", - "email": "shtylman+expressjs@gmail.com" - }, - { - "name": "Young Jae Sim", - "email": "hanul@hanul.me" - } - ], - "keywords": [ - "express", - "framework", - "sinatra", - "web", - "rest", - "restful", - "router", - "app", - "api" - ], - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/express" - }, - "license": "MIT", - "dependencies": { - "accepts": "~1.0.7", - "buffer-crc32": "0.2.3", - "debug": "1.0.4", - "depd": "0.4.4", - "escape-html": "1.0.1", - "finalhandler": "0.1.0", - "media-typer": "0.2.0", - "methods": "1.1.0", - "parseurl": "~1.2.0", - "path-to-regexp": "0.1.3", - "proxy-addr": "1.0.1", - "range-parser": "1.0.0", - "send": "0.7.2", - "serve-static": "~1.4.2", - "type-is": "~1.3.2", - "vary": "0.1.0", - "cookie": "0.1.2", - "fresh": "0.2.2", - "cookie-signature": "1.0.4", - "merge-descriptors": "0.0.2", - "qs": "0.6.6", - "utils-merge": "1.0.0" - }, - "devDependencies": { - "after": "0.8.1", - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.4", - "supertest": "~0.13.0", - "connect-redis": "~2.0.0", - "ejs": "~1.0.0", - "marked": "0.3.2", - "hjs": "~0.0.6", - "body-parser": "~1.5.2", - "cookie-parser": "~1.3.1", - "express-session": "~1.7.2", - "jade": "~1.5.0", - "method-override": "~2.1.1", - "morgan": "~1.2.2", - "multiparty": "~3.3.1", - "vhost": "2.0.0" - }, - "engines": { - "node": ">= 0.10.0" - }, - "scripts": { - "prepublish": "npm prune", - "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/" - }, - "bugs": { - "url": "https://github.com/visionmedia/express/issues" - }, - "homepage": "https://github.com/visionmedia/express", - "_id": "express@4.7.2", - "dist": { - "shasum": "2cbae61efab6c2db72a547ff3bf380e637c08590", - "tarball": "http://registry.npmjs.org/express/-/express-4.7.2.tgz" - }, - "_from": "express@latest", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "aredridel", - "email": "aredridel@nbtsc.org" - } - ], - "directories": {}, - "_shasum": "2cbae61efab6c2db72a547ff3bf380e637c08590", - "_resolved": "https://registry.npmjs.org/express/-/express-4.7.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/test.js deleted file mode 100644 index cacd7a3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/node_modules/express/test.js +++ /dev/null @@ -1,8 +0,0 @@ -var app = require('./index')() -app.get('/iamaverylongcomponent/in_a_url/you_said_didnt_work', function (req, res) { - res.send('got long url') -}) -app.get('/IamUSINGcaps', function (req, res) { - res.send('got caps matching') -}) -app.listen(3333) \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/public/echo.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/public/echo.js deleted file mode 100644 index df03189..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/public/echo.js +++ /dev/null @@ -1,14 +0,0 @@ -// The client-side "app" which leverages the shared Handlebars "echo" template. -// This will prompt the user for a message, then echo it out by rendering the -// message using the shared template which was exposed by the server. -(function () { - var button = document.getElementById('say'); - - button.addEventListener('click', function (e) { - var message = prompt('Say Something:', 'Yo yo'), - echo = document.createElement('div'); - - echo.innerHTML = Handlebars.templates.echo({message: message}); - document.body.appendChild(echo); - }, false); -}()); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/shared/templates/echo.handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/shared/templates/echo.handlebars deleted file mode 100644 index 8e5a71c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/shared/templates/echo.handlebars +++ /dev/null @@ -1 +0,0 @@ -

echo: {{message}}

diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/echo.handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/echo.handlebars deleted file mode 100644 index e486a8d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/echo.handlebars +++ /dev/null @@ -1,8 +0,0 @@ -

{{> page/title}}

- -{{> page/nav}} - - -{{> echo}} - - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/home.handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/home.handlebars deleted file mode 100644 index 1270893..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/home.handlebars +++ /dev/null @@ -1,3 +0,0 @@ -

{{> page/title}}

- -{{> page/nav}} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/layouts/main.handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/layouts/main.handlebars deleted file mode 100644 index 6ea95a5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/layouts/main.handlebars +++ /dev/null @@ -1,12 +0,0 @@ - - - - - {{> page/title}} - - - - {{{body}}} - - - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/layouts/shared-templates.handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/layouts/shared-templates.handlebars deleted file mode 100644 index d4396ae..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/layouts/shared-templates.handlebars +++ /dev/null @@ -1,25 +0,0 @@ - - - - - {{> page/title}} - - - - {{{body}}} - - {{! Only needs the Handlebars Runtime, because the exposed templates are precompiled. }} - - - - - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/partials/page/nav.handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/partials/page/nav.handlebars deleted file mode 100644 index 545e85e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/partials/page/nav.handlebars +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/partials/page/title.handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/partials/page/title.handlebars deleted file mode 100644 index 4c9a4e9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/partials/page/title.handlebars +++ /dev/null @@ -1 +0,0 @@ -Example App: {{title}} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/yell.handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/yell.handlebars deleted file mode 100644 index b5272c3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/advanced/views/yell.handlebars +++ /dev/null @@ -1,5 +0,0 @@ -

{{> page/title}}

- -{{> page/nav}} - -

{{yell message}}

diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/app.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/app.js deleted file mode 100644 index f13855c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/app.js +++ /dev/null @@ -1,15 +0,0 @@ -var express = require('express'), - exphbs = require('../../'), // "express3-handlebars" - - app = express(); - -app.engine('handlebars', exphbs({defaultLayout: 'main'})); -app.set('view engine', 'handlebars'); - -app.get('/', function (req, res) { - res.render('home'); -}); - -app.listen(3000); - -console.log('express3-handlebars example server listening on: 3000'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/.npmignore deleted file mode 100644 index 52fcd60..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/.npmignore +++ /dev/null @@ -1,11 +0,0 @@ -.git* -benchmarks/ -coverage/ -docs/ -examples/ -support/ -test/ -testing.js -.DS_Store -.travis.yml -Contributing.md diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/History.md deleted file mode 100644 index ad56b36..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/History.md +++ /dev/null @@ -1,1924 +0,0 @@ -4.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - * deps: serve-static@~1.4.2 - -4.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - * deps: serve-static@~1.4.1 - -4.7.0 / 2014-07-25 -================== - - * fix `req.protocol` for proxy-direct connections - * configurable query parser with `app.set('query parser', parser)` - - `app.set('query parser', 'extended')` parse with "qs" module - - `app.set('query parser', 'simple')` parse with "querystring" core module - - `app.set('query parser', false)` disable query string parsing - - `app.set('query parser', true)` enable simple parsing - * deprecate `res.json(status, obj)` -- use `res.status(status).json(obj)` instead - * deprecate `res.jsonp(status, obj)` -- use `res.status(status).jsonp(obj)` instead - * deprecate `res.send(status, body)` -- use `res.status(status).send(body)` instead - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: finalhandler@0.1.0 - - Respond after request fully read - - deps: debug@1.0.4 - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - * deps: serve-static@~1.4.0 - - deps: parseurl@~1.2.0 - - deps: send@0.7.0 - * perf: prevent multiple `Buffer` creation in `res.send` - -4.6.1 / 2014-07-12 -================== - - * fix `subapp.mountpath` regression for `app.use(subapp)` - -4.6.0 / 2014-07-11 -================== - - * accept multiple callbacks to `app.use()` - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * catch errors in multiple `req.param(name, fn)` handlers - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * support non-string `path` in `app.use(path, fn)` - - supports array of paths - - supports `RegExp` - * router: fix optimization on router exit - * router: refactor location of `try` blocks - * router: speed up standard `app.use(fn)` - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: finalhandler@0.0.3 - - deps: debug@1.0.3 - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - * deps: path-to-regexp@0.1.3 - * deps: send@0.6.0 - - deps: debug@1.0.3 - * deps: serve-static@~1.3.2 - - deps: parseurl@~1.1.3 - - deps: send@0.6.0 - * perf: fix arguments reassign deopt in some `res` methods - -4.5.1 / 2014-07-06 -================== - - * fix routing regression when altering `req.method` - -4.5.0 / 2014-07-04 -================== - - * add deprecation message to non-plural `req.accepts*` - * add deprecation message to `res.send(body, status)` - * add deprecation message to `res.vary()` - * add `headers` option to `res.sendfile` - - use to set headers on successful file transfer - * add `mergeParams` option to `Router` - - merges `req.params` from parent routes - * add `req.hostname` -- correct name for what `req.host` returns - * deprecate things with `depd` module - * deprecate `req.host` -- use `req.hostname` instead - * fix behavior when handling request without routes - * fix handling when `route.all` is only route - * invoke `router.param()` only when route matches - * restore `req.params` after invoking router - * use `finalhandler` for final response handling - * use `media-typer` to alter content-type charset - * deps: accepts@~1.0.7 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - * deps: serve-static@~1.3.0 - - Accept string for `maxAge` (converted by `ms`) - - Add `setHeaders` option - - Include HTML link in redirect response - - deps: send@0.5.0 - * deps: type-is@~1.3.2 - -4.4.5 / 2014-06-26 -================== - - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -4.4.4 / 2014-06-20 -================== - - * fix `res.attachment` Unicode filenames in Safari - * fix "trim prefix" debug message in `express:router` - * deps: accepts@~1.0.5 - * deps: buffer-crc32@0.2.3 - -4.4.3 / 2014-06-11 -================== - - * fix persistence of modified `req.params[name]` from `app.param()` - * deps: accepts@1.0.3 - - deps: negotiator@0.4.6 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - * deps: serve-static@1.2.3 - - Do not throw un-catchable error on file open race condition - - deps: send@0.4.3 - -4.4.2 / 2014-06-09 -================== - - * fix catching errors from top-level handlers - * use `vary` module for `res.vary` - * deps: debug@1.0.1 - * deps: proxy-addr@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - * deps: serve-static@1.2.2 - - fix "event emitter leak" warnings - - deps: send@0.4.2 - * deps: type-is@1.2.1 - -4.4.1 / 2014-06-02 -================== - - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - * deps: serve-static@1.2.1 - - use `escape-html` for escaping - - deps: send@0.4.1 - -4.4.0 / 2014-05-30 -================== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * mark `res.send` ETag as weak and reduce collisions - * update accepts to 1.0.2 - - Fix interpretation when header not in request - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - * update serve-static to 1.2.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: send@0.4.0 - -4.3.2 / 2014-05-28 -================== - - * fix handling of errors from `router.param()` callbacks - -4.3.1 / 2014-05-23 -================== - - * revert "fix behavior of multiple `app.VERB` for the same path" - - this caused a regression in the order of route execution - -4.3.0 / 2014-05-21 -================== - - * add `req.baseUrl` to access the path stripped from `req.url` in routes - * fix behavior of multiple `app.VERB` for the same path - * fix issue routing requests among sub routers - * invoke `router.param()` only when necessary instead of every match - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * set proper `charset` in `Content-Type` for `res.send` - * update type-is to 1.2.0 - - support suffix matching - -4.2.0 / 2014-05-11 -================== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * fix `req.next` when inside router instance - * include `ETag` header in `HEAD` requests - * keep previous `Content-Type` for `res.jsonp` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update debug to 0.8.0 - - add `enable()` method - - change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - -4.1.2 / 2014-05-08 -================== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -4.1.1 / 2014-04-27 -================== - - * fix package.json to reflect supported node version - -4.1.0 / 2014-04-24 -================== - - * pass options from `res.sendfile` to `send` - * preserve casing of headers in `res.header` and `res.set` - * support unicode file names in `res.attachment` and `res.download` - * update accepts to 1.0.1 - - deps: negotiator@0.4.0 - * update cookie to 0.1.2 - - Fix for maxAge == 0 - - made compat with expires field - * update send to 0.3.0 - - Accept API options in options object - - Coerce option types - - Control whether to generate etags - - Default directory access to 403 when index disabled - - Fix sending files with dots without root set - - Include file path in etag - - Make "Can't set headers after they are sent." catchable - - Send full entity-body for multi range requests - - Set etags to "weak" - - Support "If-Range" header - - Support multiple index paths - - deps: mime@1.2.11 - * update serve-static to 1.1.0 - - Accept options directly to `send` module - - Resolve relative paths at middleware setup - - Use parseurl to parse the URL from request - - deps: send@0.3.0 - * update type-is to 1.1.0 - - add non-array values support - - add `multipart` as a shorthand - -4.0.0 / 2014-04-09 -================== - - * remove: - - node 0.8 support - - connect and connect's patches except for charset handling - - express(1) - moved to [express-generator](https://github.com/expressjs/generator) - - `express.createServer()` - it has been deprecated for a long time. Use `express()` - - `app.configure` - use logic in your own app code - - `app.router` - is removed - - `req.auth` - use `basic-auth` instead - - `req.accepted*` - use `req.accepts*()` instead - - `res.location` - relative URL resolution is removed - - `res.charset` - include the charset in the content type when using `res.set()` - - all bundled middleware except `static` - * change: - - `app.route` -> `app.mountpath` when mounting an express app in another express app - - `json spaces` no longer enabled by default in development - - `req.accepts*` -> `req.accepts*s` - i.e. `req.acceptsEncoding` -> `req.acceptsEncodings` - - `req.params` is now an object instead of an array - - `res.locals` is no longer a function. It is a plain js object. Treat it as such. - - `res.headerSent` -> `res.headersSent` to match node.js ServerResponse object - * refactor: - - `req.accepts*` with [accepts](https://github.com/expressjs/accepts) - - `req.is` with [type-is](https://github.com/expressjs/type-is) - - [path-to-regexp](https://github.com/component/path-to-regexp) - * add: - - `app.router()` - returns the app Router instance - - `app.route()` - Proxy to the app's `Router#route()` method to create a new route - - Router & Route - public API - -3.15.2 / 2014-07-27 -=================== - - * deps: connect@2.24.2 - - deps: body-parser@~1.5.2 - - deps: depd@0.4.4 - - deps: express-session@~1.7.2 - - deps: morgan@~1.2.2 - - deps: serve-static@~1.4.2 - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - -3.15.1 / 2014-07-26 -=================== - - * deps: connect@2.24.1 - - deps: body-parser@~1.5.1 - - deps: depd@0.4.3 - - deps: express-session@~1.7.1 - - deps: morgan@~1.2.1 - - deps: serve-index@~1.1.4 - - deps: serve-static@~1.4.1 - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - -3.15.0 / 2014-07-22 -=================== - - * Fix `req.protocol` for proxy-direct connections - * Pass options from `res.sendfile` to `send` - * deps: connect@2.24.0 - - deps: body-parser@~1.5.0 - - deps: compression@~1.0.9 - - deps: connect-timeout@~1.2.1 - - deps: debug@1.0.4 - - deps: depd@0.4.2 - - deps: express-session@~1.7.0 - - deps: finalhandler@0.1.0 - - deps: method-override@~2.1.2 - - deps: morgan@~1.2.0 - - deps: multiparty@3.3.1 - - deps: parseurl@~1.2.0 - - deps: serve-static@~1.4.0 - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -3.14.0 / 2014-07-11 -=================== - - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * deps: basic-auth@1.0.0 - - support empty password - - support empty username - * deps: connect@2.23.0 - - deps: debug@1.0.3 - - deps: express-session@~1.6.4 - - deps: method-override@~2.1.0 - - deps: parseurl@~1.1.3 - - deps: serve-static@~1.3.1 - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -3.13.0 / 2014-07-03 -=================== - - * add deprecation message to `app.configure` - * add deprecation message to `req.auth` - * use `basic-auth` to parse `Authorization` header - * deps: connect@2.22.0 - - deps: csurf@~1.3.0 - - deps: express-session@~1.6.1 - - deps: multiparty@3.3.0 - - deps: serve-static@~1.3.0 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - -3.12.1 / 2014-06-26 -=================== - - * deps: connect@2.21.1 - - deps: cookie-parser@1.3.2 - - deps: cookie-signature@1.0.4 - - deps: express-session@~1.5.2 - - deps: type-is@~1.3.2 - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -3.12.0 / 2014-06-21 -=================== - - * use `media-typer` to alter content-type charset - * deps: connect@2.21.0 - - deprecate `connect(middleware)` -- use `app.use(middleware)` instead - - deprecate `connect.createServer()` -- use `connect()` instead - - fix `res.setHeader()` patch to work with with get -> append -> set pattern - - deps: compression@~1.0.8 - - deps: errorhandler@~1.1.1 - - deps: express-session@~1.5.0 - - deps: serve-index@~1.1.3 - -3.11.0 / 2014-06-19 -=================== - - * deprecate things with `depd` module - * deps: buffer-crc32@0.2.3 - * deps: connect@2.20.2 - - deprecate `verify` option to `json` -- use `body-parser` npm module instead - - deprecate `verify` option to `urlencoded` -- use `body-parser` npm module instead - - deprecate things with `depd` module - - use `finalhandler` for final response handling - - use `media-typer` to parse `content-type` for charset - - deps: body-parser@1.4.3 - - deps: connect-timeout@1.1.1 - - deps: cookie-parser@1.3.1 - - deps: csurf@1.2.2 - - deps: errorhandler@1.1.0 - - deps: express-session@1.4.0 - - deps: multiparty@3.2.9 - - deps: serve-index@1.1.2 - - deps: type-is@1.3.1 - - deps: vhost@2.0.0 - -3.10.5 / 2014-06-11 -=================== - - * deps: connect@2.19.6 - - deps: body-parser@1.3.1 - - deps: compression@1.0.7 - - deps: debug@1.0.2 - - deps: serve-index@1.1.1 - - deps: serve-static@1.2.3 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -3.10.4 / 2014-06-09 -=================== - - * deps: connect@2.19.5 - - fix "event emitter leak" warnings - - deps: csurf@1.2.1 - - deps: debug@1.0.1 - - deps: serve-static@1.2.2 - - deps: type-is@1.2.1 - * deps: debug@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: finished@1.2.1 - - deps: debug@1.0.1 - -3.10.3 / 2014-06-05 -=================== - - * use `vary` module for `res.vary` - * deps: connect@2.19.4 - - deps: errorhandler@1.0.2 - - deps: method-override@2.0.2 - - deps: serve-favicon@2.0.1 - * deps: debug@1.0.0 - -3.10.2 / 2014-06-03 -=================== - - * deps: connect@2.19.3 - - deps: compression@1.0.6 - -3.10.1 / 2014-06-03 -=================== - - * deps: connect@2.19.2 - - deps: compression@1.0.4 - * deps: proxy-addr@1.0.1 - -3.10.0 / 2014-06-02 -=================== - - * deps: connect@2.19.1 - - deprecate `methodOverride()` -- use `method-override` npm module instead - - deps: body-parser@1.3.0 - - deps: method-override@2.0.1 - - deps: multiparty@3.2.8 - - deps: response-time@2.0.0 - - deps: serve-static@1.2.1 - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -3.9.0 / 2014-05-30 -================== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * Include ETag in HEAD requests - * mark `res.send` ETag as weak and reduce collisions - * update connect to 2.18.0 - - deps: compression@1.0.3 - - deps: serve-index@1.1.0 - - deps: serve-static@1.2.0 - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - -3.8.1 / 2014-05-27 -================== - - * update connect to 2.17.3 - - deps: body-parser@1.2.2 - - deps: express-session@1.2.1 - - deps: method-override@1.0.2 - -3.8.0 / 2014-05-21 -================== - - * keep previous `Content-Type` for `res.jsonp` - * set proper `charset` in `Content-Type` for `res.send` - * update connect to 2.17.1 - - fix `res.charset` appending charset when `content-type` has one - - deps: express-session@1.2.0 - - deps: morgan@1.1.1 - - deps: serve-index@1.0.3 - -3.7.0 / 2014-05-18 -================== - - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * update connect to 2.16.2 - - deprecate `res.headerSent` -- use `res.headersSent` - - deprecate `res.on("header")` -- use on-headers module instead - - fix edge-case in `res.appendHeader` that would append in wrong order - - json: use body-parser - - urlencoded: use body-parser - - dep: bytes@1.0.0 - - dep: cookie-parser@1.1.0 - - dep: csurf@1.2.0 - - dep: express-session@1.1.0 - - dep: method-override@1.0.1 - -3.6.0 / 2014-05-09 -================== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update connect to 2.15.0 - * Add `res.appendHeader` - * Call error stack even when response has been sent - * Patch `res.headerSent` to return Boolean - * Patch `res.headersSent` for node.js 0.8 - * Prevent default 404 handler after response sent - * dep: compression@1.0.2 - * dep: connect-timeout@1.1.0 - * dep: debug@^0.8.0 - * dep: errorhandler@1.0.1 - * dep: express-session@1.0.4 - * dep: morgan@1.0.1 - * dep: serve-favicon@2.0.0 - * dep: serve-index@1.0.2 - * update debug to 0.8.0 - * add `enable()` method - * change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - * update mkdirp to 0.5.0 - -3.5.3 / 2014-05-08 -================== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -3.5.2 / 2014-04-24 -================== - - * update connect to 2.14.5 - * update cookie to 0.1.2 - * update mkdirp to 0.4.0 - * update send to 0.3.0 - -3.5.1 / 2014-03-25 -================== - - * pin less-middleware in generated app - -3.5.0 / 2014-03-06 -================== - - * bump deps - -3.4.8 / 2014-01-13 -================== - - * prevent incorrect automatic OPTIONS responses #1868 @dpatti - * update binary and examples for jade 1.0 #1876 @yossi, #1877 @reqshark, #1892 @matheusazzi - * throw 400 in case of malformed paths @rlidwka - -3.4.7 / 2013-12-10 -================== - - * update connect - -3.4.6 / 2013-12-01 -================== - - * update connect (raw-body) - -3.4.5 / 2013-11-27 -================== - - * update connect - * res.location: remove leading ./ #1802 @kapouer - * res.redirect: fix `res.redirect('toString') #1829 @michaelficarra - * res.send: always send ETag when content-length > 0 - * router: add Router.all() method - -3.4.4 / 2013-10-29 -================== - - * update connect - * update supertest - * update methods - * express(1): replace bodyParser() with urlencoded() and json() #1795 @chirag04 - -3.4.3 / 2013-10-23 -================== - - * update connect - -3.4.2 / 2013-10-18 -================== - - * update connect - * downgrade commander - -3.4.1 / 2013-10-15 -================== - - * update connect - * update commander - * jsonp: check if callback is a function - * router: wrap encodeURIComponent in a try/catch #1735 (@lxe) - * res.format: now includes chraset @1747 (@sorribas) - * res.links: allow multiple calls @1746 (@sorribas) - -3.4.0 / 2013-09-07 -================== - - * add res.vary(). Closes #1682 - * update connect - -3.3.8 / 2013-09-02 -================== - - * update connect - -3.3.7 / 2013-08-28 -================== - - * update connect - -3.3.6 / 2013-08-27 -================== - - * Revert "remove charset from json responses. Closes #1631" (causes issues in some clients) - * add: req.accepts take an argument list - -3.3.4 / 2013-07-08 -================== - - * update send and connect - -3.3.3 / 2013-07-04 -================== - - * update connect - -3.3.2 / 2013-07-03 -================== - - * update connect - * update send - * remove .version export - -3.3.1 / 2013-06-27 -================== - - * update connect - -3.3.0 / 2013-06-26 -================== - - * update connect - * add support for multiple X-Forwarded-Proto values. Closes #1646 - * change: remove charset from json responses. Closes #1631 - * change: return actual booleans from req.accept* functions - * fix jsonp callback array throw - -3.2.6 / 2013-06-02 -================== - - * update connect - -3.2.5 / 2013-05-21 -================== - - * update connect - * update node-cookie - * add: throw a meaningful error when there is no default engine - * change generation of ETags with res.send() to GET requests only. Closes #1619 - -3.2.4 / 2013-05-09 -================== - - * fix `req.subdomains` when no Host is present - * fix `req.host` when no Host is present, return undefined - -3.2.3 / 2013-05-07 -================== - - * update connect / qs - -3.2.2 / 2013-05-03 -================== - - * update qs - -3.2.1 / 2013-04-29 -================== - - * add app.VERB() paths array deprecation warning - * update connect - * update qs and remove all ~ semver crap - * fix: accept number as value of Signed Cookie - -3.2.0 / 2013-04-15 -================== - - * add "view" constructor setting to override view behaviour - * add req.acceptsEncoding(name) - * add req.acceptedEncodings - * revert cookie signature change causing session race conditions - * fix sorting of Accept values of the same quality - -3.1.2 / 2013-04-12 -================== - - * add support for custom Accept parameters - * update cookie-signature - -3.1.1 / 2013-04-01 -================== - - * add X-Forwarded-Host support to `req.host` - * fix relative redirects - * update mkdirp - * update buffer-crc32 - * remove legacy app.configure() method from app template. - -3.1.0 / 2013-01-25 -================== - - * add support for leading "." in "view engine" setting - * add array support to `res.set()` - * add node 0.8.x to travis.yml - * add "subdomain offset" setting for tweaking `req.subdomains` - * add `res.location(url)` implementing `res.redirect()`-like setting of Location - * use app.get() for x-powered-by setting for inheritance - * fix colons in passwords for `req.auth` - -3.0.6 / 2013-01-04 -================== - - * add http verb methods to Router - * update connect - * fix mangling of the `res.cookie()` options object - * fix jsonp whitespace escape. Closes #1132 - -3.0.5 / 2012-12-19 -================== - - * add throwing when a non-function is passed to a route - * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses - * revert "add 'etag' option" - -3.0.4 / 2012-12-05 -================== - - * add 'etag' option to disable `res.send()` Etags - * add escaping of urls in text/plain in `res.redirect()` - for old browsers interpreting as html - * change crc32 module for a more liberal license - * update connect - -3.0.3 / 2012-11-13 -================== - - * update connect - * update cookie module - * fix cookie max-age - -3.0.2 / 2012-11-08 -================== - - * add OPTIONS to cors example. Closes #1398 - * fix route chaining regression. Closes #1397 - -3.0.1 / 2012-11-01 -================== - - * update connect - -3.0.0 / 2012-10-23 -================== - - * add `make clean` - * add "Basic" check to req.auth - * add `req.auth` test coverage - * add cb && cb(payload) to `res.jsonp()`. Closes #1374 - * add backwards compat for `res.redirect()` status. Closes #1336 - * add support for `res.json()` to retain previously defined Content-Types. Closes #1349 - * update connect - * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382 - * remove non-primitive string support for `res.send()` - * fix view-locals example. Closes #1370 - * fix route-separation example - -3.0.0rc5 / 2012-09-18 -================== - - * update connect - * add redis search example - * add static-files example - * add "x-powered-by" setting (`app.disable('x-powered-by')`) - * add "application/octet-stream" redirect Accept test case. Closes #1317 - -3.0.0rc4 / 2012-08-30 -================== - - * add `res.jsonp()`. Closes #1307 - * add "verbose errors" option to error-pages example - * add another route example to express(1) so people are not so confused - * add redis online user activity tracking example - * update connect dep - * fix etag quoting. Closes #1310 - * fix error-pages 404 status - * fix jsonp callback char restrictions - * remove old OPTIONS default response - -3.0.0rc3 / 2012-08-13 -================== - - * update connect dep - * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds] - * fix `res.render()` clobbering of "locals" - -3.0.0rc2 / 2012-08-03 -================== - - * add CORS example - * update connect dep - * deprecate `.createServer()` & remove old stale examples - * fix: escape `res.redirect()` link - * fix vhost example - -3.0.0rc1 / 2012-07-24 -================== - - * add more examples to view-locals - * add scheme-relative redirects (`res.redirect("//foo.com")`) support - * update cookie dep - * update connect dep - * update send dep - * fix `express(1)` -h flag, use -H for hogan. Closes #1245 - * fix `res.sendfile()` socket error handling regression - -3.0.0beta7 / 2012-07-16 -================== - - * update connect dep for `send()` root normalization regression - -3.0.0beta6 / 2012-07-13 -================== - - * add `err.view` property for view errors. Closes #1226 - * add "jsonp callback name" setting - * add support for "/foo/:bar*" non-greedy matches - * change `res.sendfile()` to use `send()` module - * change `res.send` to use "response-send" module - * remove `app.locals.use` and `res.locals.use`, use regular middleware - -3.0.0beta5 / 2012-07-03 -================== - - * add "make check" support - * add route-map example - * add `res.json(obj, status)` support back for BC - * add "methods" dep, remove internal methods module - * update connect dep - * update auth example to utilize cores pbkdf2 - * updated tests to use "supertest" - -3.0.0beta4 / 2012-06-25 -================== - - * Added `req.auth` - * Added `req.range(size)` - * Added `res.links(obj)` - * Added `res.send(body, status)` support back for backwards compat - * Added `.default()` support to `res.format()` - * Added 2xx / 304 check to `req.fresh` - * Revert "Added + support to the router" - * Fixed `res.send()` freshness check, respect res.statusCode - -3.0.0beta3 / 2012-06-15 -================== - - * Added hogan `--hjs` to express(1) [nullfirm] - * Added another example to content-negotiation - * Added `fresh` dep - * Changed: `res.send()` always checks freshness - * Fixed: expose connects mime module. Cloases #1165 - -3.0.0beta2 / 2012-06-06 -================== - - * Added `+` support to the router - * Added `req.host` - * Changed `req.param()` to check route first - * Update connect dep - -3.0.0beta1 / 2012-06-01 -================== - - * Added `res.format()` callback to override default 406 behaviour - * Fixed `res.redirect()` 406. Closes #1154 - -3.0.0alpha5 / 2012-05-30 -================== - - * Added `req.ip` - * Added `{ signed: true }` option to `res.cookie()` - * Removed `res.signedCookie()` - * Changed: dont reverse `req.ips` - * Fixed "trust proxy" setting check for `req.ips` - -3.0.0alpha4 / 2012-05-09 -================== - - * Added: allow `[]` in jsonp callback. Closes #1128 - * Added `PORT` env var support in generated template. Closes #1118 [benatkin] - * Updated: connect 2.2.2 - -3.0.0alpha3 / 2012-05-04 -================== - - * Added public `app.routes`. Closes #887 - * Added _view-locals_ example - * Added _mvc_ example - * Added `res.locals.use()`. Closes #1120 - * Added conditional-GET support to `res.send()` - * Added: coerce `res.set()` values to strings - * Changed: moved `static()` in generated apps below router - * Changed: `res.send()` only set ETag when not previously set - * Changed connect 2.2.1 dep - * Changed: `make test` now runs unit / acceptance tests - * Fixed req/res proto inheritance - -3.0.0alpha2 / 2012-04-26 -================== - - * Added `make benchmark` back - * Added `res.send()` support for `String` objects - * Added client-side data exposing example - * Added `res.header()` and `req.header()` aliases for BC - * Added `express.createServer()` for BC - * Perf: memoize parsed urls - * Perf: connect 2.2.0 dep - * Changed: make `expressInit()` middleware self-aware - * Fixed: use app.get() for all core settings - * Fixed redis session example - * Fixed session example. Closes #1105 - * Fixed generated express dep. Closes #1078 - -3.0.0alpha1 / 2012-04-15 -================== - - * Added `app.locals.use(callback)` - * Added `app.locals` object - * Added `app.locals(obj)` - * Added `res.locals` object - * Added `res.locals(obj)` - * Added `res.format()` for content-negotiation - * Added `app.engine()` - * Added `res.cookie()` JSON cookie support - * Added "trust proxy" setting - * Added `req.subdomains` - * Added `req.protocol` - * Added `req.secure` - * Added `req.path` - * Added `req.ips` - * Added `req.fresh` - * Added `req.stale` - * Added comma-delmited / array support for `req.accepts()` - * Added debug instrumentation - * Added `res.set(obj)` - * Added `res.set(field, value)` - * Added `res.get(field)` - * Added `app.get(setting)`. Closes #842 - * Added `req.acceptsLanguage()` - * Added `req.acceptsCharset()` - * Added `req.accepted` - * Added `req.acceptedLanguages` - * Added `req.acceptedCharsets` - * Added "json replacer" setting - * Added "json spaces" setting - * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92 - * Added `--less` support to express(1) - * Added `express.response` prototype - * Added `express.request` prototype - * Added `express.application` prototype - * Added `app.path()` - * Added `app.render()` - * Added `res.type()` to replace `res.contentType()` - * Changed: `res.redirect()` to add relative support - * Changed: enable "jsonp callback" by default - * Changed: renamed "case sensitive routes" to "case sensitive routing" - * Rewrite of all tests with mocha - * Removed "root" setting - * Removed `res.redirect('home')` support - * Removed `req.notify()` - * Removed `app.register()` - * Removed `app.redirect()` - * Removed `app.is()` - * Removed `app.helpers()` - * Removed `app.dynamicHelpers()` - * Fixed `res.sendfile()` with non-GET. Closes #723 - * Fixed express(1) public dir for windows. Closes #866 - -2.5.9/ 2012-04-02 -================== - - * Added support for PURGE request method [pbuyle] - * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki] - -2.5.8 / 2012-02-08 -================== - - * Update mkdirp dep. Closes #991 - -2.5.7 / 2012-02-06 -================== - - * Fixed `app.all` duplicate DELETE requests [mscdex] - -2.5.6 / 2012-01-13 -================== - - * Updated hamljs dev dep. Closes #953 - -2.5.5 / 2012-01-08 -================== - - * Fixed: set `filename` on cached templates [matthewleon] - -2.5.4 / 2012-01-02 -================== - - * Fixed `express(1)` eol on 0.4.x. Closes #947 - -2.5.3 / 2011-12-30 -================== - - * Fixed `req.is()` when a charset is present - -2.5.2 / 2011-12-10 -================== - - * Fixed: express(1) LF -> CRLF for windows - -2.5.1 / 2011-11-17 -================== - - * Changed: updated connect to 1.8.x - * Removed sass.js support from express(1) - -2.5.0 / 2011-10-24 -================== - - * Added ./routes dir for generated app by default - * Added npm install reminder to express(1) app gen - * Added 0.5.x support - * Removed `make test-cov` since it wont work with node 0.5.x - * Fixed express(1) public dir for windows. Closes #866 - -2.4.7 / 2011-10-05 -================== - - * Added mkdirp to express(1). Closes #795 - * Added simple _json-config_ example - * Added shorthand for the parsed request's pathname via `req.path` - * Changed connect dep to 1.7.x to fix npm issue... - * Fixed `res.redirect()` __HEAD__ support. [reported by xerox] - * Fixed `req.flash()`, only escape args - * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie] - -2.4.6 / 2011-08-22 -================== - - * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode] - -2.4.5 / 2011-08-19 -================== - - * Added support for routes to handle errors. Closes #809 - * Added `app.routes.all()`. Closes #803 - * Added "basepath" setting to work in conjunction with reverse proxies etc. - * Refactored `Route` to use a single array of callbacks - * Added support for multiple callbacks for `app.param()`. Closes #801 -Closes #805 - * Changed: removed .call(self) for route callbacks - * Dependency: `qs >= 0.3.1` - * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808 - -2.4.4 / 2011-08-05 -================== - - * Fixed `res.header()` intention of a set, even when `undefined` - * Fixed `*`, value no longer required - * Fixed `res.send(204)` support. Closes #771 - -2.4.3 / 2011-07-14 -================== - - * Added docs for `status` option special-case. Closes #739 - * Fixed `options.filename`, exposing the view path to template engines - -2.4.2. / 2011-07-06 -================== - - * Revert "removed jsonp stripping" for XSS - -2.4.1 / 2011-07-06 -================== - - * Added `res.json()` JSONP support. Closes #737 - * Added _extending-templates_ example. Closes #730 - * Added "strict routing" setting for trailing slashes - * Added support for multiple envs in `app.configure()` calls. Closes #735 - * Changed: `res.send()` using `res.json()` - * Changed: when cookie `path === null` don't default it - * Changed; default cookie path to "home" setting. Closes #731 - * Removed _pids/logs_ creation from express(1) - -2.4.0 / 2011-06-28 -================== - - * Added chainable `res.status(code)` - * Added `res.json()`, an explicit version of `res.send(obj)` - * Added simple web-service example - -2.3.12 / 2011-06-22 -================== - - * \#express is now on freenode! come join! - * Added `req.get(field, param)` - * Added links to Japanese documentation, thanks @hideyukisaito! - * Added; the `express(1)` generated app outputs the env - * Added `content-negotiation` example - * Dependency: connect >= 1.5.1 < 2.0.0 - * Fixed view layout bug. Closes #720 - * Fixed; ignore body on 304. Closes #701 - -2.3.11 / 2011-06-04 -================== - - * Added `npm test` - * Removed generation of dummy test file from `express(1)` - * Fixed; `express(1)` adds express as a dep - * Fixed; prune on `prepublish` - -2.3.10 / 2011-05-27 -================== - - * Added `req.route`, exposing the current route - * Added _package.json_ generation support to `express(1)` - * Fixed call to `app.param()` function for optional params. Closes #682 - -2.3.9 / 2011-05-25 -================== - - * Fixed bug-ish with `../' in `res.partial()` calls - -2.3.8 / 2011-05-24 -================== - - * Fixed `app.options()` - -2.3.7 / 2011-05-23 -================== - - * Added route `Collection`, ex: `app.get('/user/:id').remove();` - * Added support for `app.param(fn)` to define param logic - * Removed `app.param()` support for callback with return value - * Removed module.parent check from express(1) generated app. Closes #670 - * Refactored router. Closes #639 - -2.3.6 / 2011-05-20 -================== - - * Changed; using devDependencies instead of git submodules - * Fixed redis session example - * Fixed markdown example - * Fixed view caching, should not be enabled in development - -2.3.5 / 2011-05-20 -================== - - * Added export `.view` as alias for `.View` - -2.3.4 / 2011-05-08 -================== - - * Added `./examples/say` - * Fixed `res.sendfile()` bug preventing the transfer of files with spaces - -2.3.3 / 2011-05-03 -================== - - * Added "case sensitive routes" option. - * Changed; split methods supported per rfc [slaskis] - * Fixed route-specific middleware when using the same callback function several times - -2.3.2 / 2011-04-27 -================== - - * Fixed view hints - -2.3.1 / 2011-04-26 -================== - - * Added `app.match()` as `app.match.all()` - * Added `app.lookup()` as `app.lookup.all()` - * Added `app.remove()` for `app.remove.all()` - * Added `app.remove.VERB()` - * Fixed template caching collision issue. Closes #644 - * Moved router over from connect and started refactor - -2.3.0 / 2011-04-25 -================== - - * Added options support to `res.clearCookie()` - * Added `res.helpers()` as alias of `res.locals()` - * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0` - * Changed; auto set Content-Type in res.attachement [Aaron Heckmann] - * Renamed "cache views" to "view cache". Closes #628 - * Fixed caching of views when using several apps. Closes #637 - * Fixed gotcha invoking `app.param()` callbacks once per route middleware. -Closes #638 - * Fixed partial lookup precedence. Closes #631 -Shaw] - -2.2.2 / 2011-04-12 -================== - - * Added second callback support for `res.download()` connection errors - * Fixed `filename` option passing to template engine - -2.2.1 / 2011-04-04 -================== - - * Added `layout(path)` helper to change the layout within a view. Closes #610 - * Fixed `partial()` collection object support. - Previously only anything with `.length` would work. - When `.length` is present one must still be aware of holes, - however now `{ collection: {foo: 'bar'}}` is valid, exposes - `keyInCollection` and `keysInCollection`. - - * Performance improved with better view caching - * Removed `request` and `response` locals - * Changed; errorHandler page title is now `Express` instead of `Connect` - -2.2.0 / 2011-03-30 -================== - - * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606 - * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606 - * Added `app.VERB(path)` as alias of `app.lookup.VERB()`. - * Dependency `connect >= 1.2.0` - -2.1.1 / 2011-03-29 -================== - - * Added; expose `err.view` object when failing to locate a view - * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann] - * Fixed; `res.send(undefined)` responds with 204 [aheckmann] - -2.1.0 / 2011-03-24 -================== - - * Added `/_?` partial lookup support. Closes #447 - * Added `request`, `response`, and `app` local variables - * Added `settings` local variable, containing the app's settings - * Added `req.flash()` exception if `req.session` is not available - * Added `res.send(bool)` support (json response) - * Fixed stylus example for latest version - * Fixed; wrap try/catch around `res.render()` - -2.0.0 / 2011-03-17 -================== - - * Fixed up index view path alternative. - * Changed; `res.locals()` without object returns the locals - -2.0.0rc3 / 2011-03-17 -================== - - * Added `res.locals(obj)` to compliment `res.local(key, val)` - * Added `res.partial()` callback support - * Fixed recursive error reporting issue in `res.render()` - -2.0.0rc2 / 2011-03-17 -================== - - * Changed; `partial()` "locals" are now optional - * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01] - * Fixed .filename view engine option [reported by drudge] - * Fixed blog example - * Fixed `{req,res}.app` reference when mounting [Ben Weaver] - -2.0.0rc / 2011-03-14 -================== - - * Fixed; expose `HTTPSServer` constructor - * Fixed express(1) default test charset. Closes #579 [reported by secoif] - * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP] - -2.0.0beta3 / 2011-03-09 -================== - - * Added support for `res.contentType()` literal - The original `res.contentType('.json')`, - `res.contentType('application/json')`, and `res.contentType('json')` - will work now. - * Added `res.render()` status option support back - * Added charset option for `res.render()` - * Added `.charset` support (via connect 1.0.4) - * Added view resolution hints when in development and a lookup fails - * Added layout lookup support relative to the page view. - For example while rendering `./views/user/index.jade` if you create - `./views/user/layout.jade` it will be used in favour of the root layout. - * Fixed `res.redirect()`. RFC states absolute url [reported by unlink] - * Fixed; default `res.send()` string charset to utf8 - * Removed `Partial` constructor (not currently used) - -2.0.0beta2 / 2011-03-07 -================== - - * Added res.render() `.locals` support back to aid in migration process - * Fixed flash example - -2.0.0beta / 2011-03-03 -================== - - * Added HTTPS support - * Added `res.cookie()` maxAge support - * Added `req.header()` _Referrer_ / _Referer_ special-case, either works - * Added mount support for `res.redirect()`, now respects the mount-point - * Added `union()` util, taking place of `merge(clone())` combo - * Added stylus support to express(1) generated app - * Added secret to session middleware used in examples and generated app - * Added `res.local(name, val)` for progressive view locals - * Added default param support to `req.param(name, default)` - * Added `app.disabled()` and `app.enabled()` - * Added `app.register()` support for omitting leading ".", either works - * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539 - * Added `app.param()` to map route params to async/sync logic - * Added; aliased `app.helpers()` as `app.locals()`. Closes #481 - * Added extname with no leading "." support to `res.contentType()` - * Added `cache views` setting, defaulting to enabled in "production" env - * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_. - * Added `req.accepts()` support for extensions - * Changed; `res.download()` and `res.sendfile()` now utilize Connect's - static file server `connect.static.send()`. - * Changed; replaced `connect.utils.mime()` with npm _mime_ module - * Changed; allow `req.query` to be pre-defined (via middleware or other parent - * Changed view partial resolution, now relative to parent view - * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`. - * Fixed `req.param()` bug returning Array.prototype methods. Closes #552 - * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()` - * Fixed; using _qs_ module instead of _querystring_ - * Fixed; strip unsafe chars from jsonp callbacks - * Removed "stream threshold" setting - -1.0.8 / 2011-03-01 -================== - - * Allow `req.query` to be pre-defined (via middleware or other parent app) - * "connect": ">= 0.5.0 < 1.0.0". Closes #547 - * Removed the long deprecated __EXPRESS_ENV__ support - -1.0.7 / 2011-02-07 -================== - - * Fixed `render()` setting inheritance. - Mounted apps would not inherit "view engine" - -1.0.6 / 2011-02-07 -================== - - * Fixed `view engine` setting bug when period is in dirname - -1.0.5 / 2011-02-05 -================== - - * Added secret to generated app `session()` call - -1.0.4 / 2011-02-05 -================== - - * Added `qs` dependency to _package.json_ - * Fixed namespaced `require()`s for latest connect support - -1.0.3 / 2011-01-13 -================== - - * Remove unsafe characters from JSONP callback names [Ryan Grove] - -1.0.2 / 2011-01-10 -================== - - * Removed nested require, using `connect.router` - -1.0.1 / 2010-12-29 -================== - - * Fixed for middleware stacked via `createServer()` - previously the `foo` middleware passed to `createServer(foo)` - would not have access to Express methods such as `res.send()` - or props like `req.query` etc. - -1.0.0 / 2010-11-16 -================== - - * Added; deduce partial object names from the last segment. - For example by default `partial('forum/post', postObject)` will - give you the _post_ object, providing a meaningful default. - * Added http status code string representation to `res.redirect()` body - * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__. - * Added `req.is()` to aid in content negotiation - * Added partial local inheritance [suggested by masylum]. Closes #102 - providing access to parent template locals. - * Added _-s, --session[s]_ flag to express(1) to add session related middleware - * Added _--template_ flag to express(1) to specify the - template engine to use. - * Added _--css_ flag to express(1) to specify the - stylesheet engine to use (or just plain css by default). - * Added `app.all()` support [thanks aheckmann] - * Added partial direct object support. - You may now `partial('user', user)` providing the "user" local, - vs previously `partial('user', { object: user })`. - * Added _route-separation_ example since many people question ways - to do this with CommonJS modules. Also view the _blog_ example for - an alternative. - * Performance; caching view path derived partial object names - * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454 - * Fixed jsonp support; _text/javascript_ as per mailinglist discussion - -1.0.0rc4 / 2010-10-14 -================== - - * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0 - * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware)) - * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass] - * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass] - * Added `partial()` support for array-like collections. Closes #434 - * Added support for swappable querystring parsers - * Added session usage docs. Closes #443 - * Added dynamic helper caching. Closes #439 [suggested by maritz] - * Added authentication example - * Added basic Range support to `res.sendfile()` (and `res.download()` etc) - * Changed; `express(1)` generated app using 2 spaces instead of 4 - * Default env to "development" again [aheckmann] - * Removed _context_ option is no more, use "scope" - * Fixed; exposing _./support_ libs to examples so they can run without installs - * Fixed mvc example - -1.0.0rc3 / 2010-09-20 -================== - - * Added confirmation for `express(1)` app generation. Closes #391 - * Added extending of flash formatters via `app.flashFormatters` - * Added flash formatter support. Closes #411 - * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold" - * Added _stream threshold_ setting for `res.sendfile()` - * Added `res.send()` __HEAD__ support - * Added `res.clearCookie()` - * Added `res.cookie()` - * Added `res.render()` headers option - * Added `res.redirect()` response bodies - * Added `res.render()` status option support. Closes #425 [thanks aheckmann] - * Fixed `res.sendfile()` responding with 403 on malicious path - * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_ - * Fixed; mounted apps settings now inherit from parent app [aheckmann] - * Fixed; stripping Content-Length / Content-Type when 204 - * Fixed `res.send()` 204. Closes #419 - * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402 - * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo] - - -1.0.0rc2 / 2010-08-17 -================== - - * Added `app.register()` for template engine mapping. Closes #390 - * Added `res.render()` callback support as second argument (no options) - * Added callback support to `res.download()` - * Added callback support for `res.sendfile()` - * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()` - * Added "partials" setting to docs - * Added default expresso tests to `express(1)` generated app. Closes #384 - * Fixed `res.sendfile()` error handling, defer via `next()` - * Fixed `res.render()` callback when a layout is used [thanks guillermo] - * Fixed; `make install` creating ~/.node_libraries when not present - * Fixed issue preventing error handlers from being defined anywhere. Closes #387 - -1.0.0rc / 2010-07-28 -================== - - * Added mounted hook. Closes #369 - * Added connect dependency to _package.json_ - - * Removed "reload views" setting and support code - development env never caches, production always caches. - - * Removed _param_ in route callbacks, signature is now - simply (req, res, next), previously (req, res, params, next). - Use _req.params_ for path captures, _req.query_ for GET params. - - * Fixed "home" setting - * Fixed middleware/router precedence issue. Closes #366 - * Fixed; _configure()_ callbacks called immediately. Closes #368 - -1.0.0beta2 / 2010-07-23 -================== - - * Added more examples - * Added; exporting `Server` constructor - * Added `Server#helpers()` for view locals - * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349 - * Added support for absolute view paths - * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363 - * Added Guillermo Rauch to the contributor list - * Added support for "as" for non-collection partials. Closes #341 - * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf] - * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo] - * Fixed instanceof `Array` checks, now `Array.isArray()` - * Fixed express(1) expansion of public dirs. Closes #348 - * Fixed middleware precedence. Closes #345 - * Fixed view watcher, now async [thanks aheckmann] - -1.0.0beta / 2010-07-15 -================== - - * Re-write - - much faster - - much lighter - - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs - -0.14.0 / 2010-06-15 -================== - - * Utilize relative requires - * Added Static bufferSize option [aheckmann] - * Fixed caching of view and partial subdirectories [aheckmann] - * Fixed mime.type() comments now that ".ext" is not supported - * Updated haml submodule - * Updated class submodule - * Removed bin/express - -0.13.0 / 2010-06-01 -================== - - * Added node v0.1.97 compatibility - * Added support for deleting cookies via Request#cookie('key', null) - * Updated haml submodule - * Fixed not-found page, now using using charset utf-8 - * Fixed show-exceptions page, now using using charset utf-8 - * Fixed view support due to fs.readFile Buffers - * Changed; mime.type() no longer accepts ".type" due to node extname() changes - -0.12.0 / 2010-05-22 -================== - - * Added node v0.1.96 compatibility - * Added view `helpers` export which act as additional local variables - * Updated haml submodule - * Changed ETag; removed inode, modified time only - * Fixed LF to CRLF for setting multiple cookies - * Fixed cookie complation; values are now urlencoded - * Fixed cookies parsing; accepts quoted values and url escaped cookies - -0.11.0 / 2010-05-06 -================== - - * Added support for layouts using different engines - - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' }) - - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml' - - this.render('page.html.haml', { layout: false }) // no layout - * Updated ext submodule - * Updated haml submodule - * Fixed EJS partial support by passing along the context. Issue #307 - -0.10.1 / 2010-05-03 -================== - - * Fixed binary uploads. - -0.10.0 / 2010-04-30 -================== - - * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s - encoding is set to 'utf8' or 'utf-8'. - * Added "encoding" option to Request#render(). Closes #299 - * Added "dump exceptions" setting, which is enabled by default. - * Added simple ejs template engine support - * Added error reponse support for text/plain, application/json. Closes #297 - * Added callback function param to Request#error() - * Added Request#sendHead() - * Added Request#stream() - * Added support for Request#respond(304, null) for empty response bodies - * Added ETag support to Request#sendfile() - * Added options to Request#sendfile(), passed to fs.createReadStream() - * Added filename arg to Request#download() - * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request - * Performance enhanced by preventing several calls to toLowerCase() in Router#match() - * Changed; Request#sendfile() now streams - * Changed; Renamed Request#halt() to Request#respond(). Closes #289 - * Changed; Using sys.inspect() instead of JSON.encode() for error output - * Changed; run() returns the http.Server instance. Closes #298 - * Changed; Defaulting Server#host to null (INADDR_ANY) - * Changed; Logger "common" format scale of 0.4f - * Removed Logger "request" format - * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found - * Fixed several issues with http client - * Fixed Logger Content-Length output - * Fixed bug preventing Opera from retaining the generated session id. Closes #292 - -0.9.0 / 2010-04-14 -================== - - * Added DSL level error() route support - * Added DSL level notFound() route support - * Added Request#error() - * Added Request#notFound() - * Added Request#render() callback function. Closes #258 - * Added "max upload size" setting - * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254 - * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js - * Added callback function support to Request#halt() as 3rd/4th arg - * Added preprocessing of route param wildcards using param(). Closes #251 - * Added view partial support (with collections etc) - * Fixed bug preventing falsey params (such as ?page=0). Closes #286 - * Fixed setting of multiple cookies. Closes #199 - * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml) - * Changed; session cookie is now httpOnly - * Changed; Request is no longer global - * Changed; Event is no longer global - * Changed; "sys" module is no longer global - * Changed; moved Request#download to Static plugin where it belongs - * Changed; Request instance created before body parsing. Closes #262 - * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253 - * Changed; Pre-caching view partials in memory when "cache view partials" is enabled - * Updated support to node --version 0.1.90 - * Updated dependencies - * Removed set("session cookie") in favour of use(Session, { cookie: { ... }}) - * Removed utils.mixin(); use Object#mergeDeep() - -0.8.0 / 2010-03-19 -================== - - * Added coffeescript example app. Closes #242 - * Changed; cache api now async friendly. Closes #240 - * Removed deprecated 'express/static' support. Use 'express/plugins/static' - -0.7.6 / 2010-03-19 -================== - - * Added Request#isXHR. Closes #229 - * Added `make install` (for the executable) - * Added `express` executable for setting up simple app templates - * Added "GET /public/*" to Static plugin, defaulting to /public - * Added Static plugin - * Fixed; Request#render() only calls cache.get() once - * Fixed; Namespacing View caches with "view:" - * Fixed; Namespacing Static caches with "static:" - * Fixed; Both example apps now use the Static plugin - * Fixed set("views"). Closes #239 - * Fixed missing space for combined log format - * Deprecated Request#sendfile() and 'express/static' - * Removed Server#running - -0.7.5 / 2010-03-16 -================== - - * Added Request#flash() support without args, now returns all flashes - * Updated ext submodule - -0.7.4 / 2010-03-16 -================== - - * Fixed session reaper - * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft) - -0.7.3 / 2010-03-16 -================== - - * Added package.json - * Fixed requiring of haml / sass due to kiwi removal - -0.7.2 / 2010-03-16 -================== - - * Fixed GIT submodules (HAH!) - -0.7.1 / 2010-03-16 -================== - - * Changed; Express now using submodules again until a PM is adopted - * Changed; chat example using millisecond conversions from ext - -0.7.0 / 2010-03-15 -================== - - * Added Request#pass() support (finds the next matching route, or the given path) - * Added Logger plugin (default "common" format replaces CommonLogger) - * Removed Profiler plugin - * Removed CommonLogger plugin - -0.6.0 / 2010-03-11 -================== - - * Added seed.yml for kiwi package management support - * Added HTTP client query string support when method is GET. Closes #205 - - * Added support for arbitrary view engines. - For example "foo.engine.html" will now require('engine'), - the exports from this module are cached after the first require(). - - * Added async plugin support - - * Removed usage of RESTful route funcs as http client - get() etc, use http.get() and friends - - * Removed custom exceptions - -0.5.0 / 2010-03-10 -================== - - * Added ext dependency (library of js extensions) - * Removed extname() / basename() utils. Use path module - * Removed toArray() util. Use arguments.values - * Removed escapeRegexp() util. Use RegExp.escape() - * Removed process.mixin() dependency. Use utils.mixin() - * Removed Collection - * Removed ElementCollection - * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com) ;) - -0.4.0 / 2010-02-11 -================== - - * Added flash() example to sample upload app - * Added high level restful http client module (express/http) - * Changed; RESTful route functions double as HTTP clients. Closes #69 - * Changed; throwing error when routes are added at runtime - * Changed; defaulting render() context to the current Request. Closes #197 - * Updated haml submodule - -0.3.0 / 2010-02-11 -================== - - * Updated haml / sass submodules. Closes #200 - * Added flash message support. Closes #64 - * Added accepts() now allows multiple args. fixes #117 - * Added support for plugins to halt. Closes #189 - * Added alternate layout support. Closes #119 - * Removed Route#run(). Closes #188 - * Fixed broken specs due to use(Cookie) missing - -0.2.1 / 2010-02-05 -================== - - * Added "plot" format option for Profiler (for gnuplot processing) - * Added request number to Profiler plugin - * Fixed binary encoding for multi-part file uploads, was previously defaulting to UTF8 - * Fixed issue with routes not firing when not files are present. Closes #184 - * Fixed process.Promise -> events.Promise - -0.2.0 / 2010-02-03 -================== - - * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180 - * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174 - * Added expiration support to cache api with reaper. Closes #133 - * Added cache Store.Memory#reap() - * Added Cache; cache api now uses first class Cache instances - * Added abstract session Store. Closes #172 - * Changed; cache Memory.Store#get() utilizing Collection - * Renamed MemoryStore -> Store.Memory - * Fixed use() of the same plugin several time will always use latest options. Closes #176 - -0.1.0 / 2010-02-03 -================== - - * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context - * Updated node support to 0.1.27 Closes #169 - * Updated dirname(__filename) -> __dirname - * Updated libxmljs support to v0.2.0 - * Added session support with memory store / reaping - * Added quick uid() helper - * Added multi-part upload support - * Added Sass.js support / submodule - * Added production env caching view contents and static files - * Added static file caching. Closes #136 - * Added cache plugin with memory stores - * Added support to StaticFile so that it works with non-textual files. - * Removed dirname() helper - * Removed several globals (now their modules must be required) - -0.0.2 / 2010-01-10 -================== - - * Added view benchmarks; currently haml vs ejs - * Added Request#attachment() specs. Closes #116 - * Added use of node's parseQuery() util. Closes #123 - * Added `make init` for submodules - * Updated Haml - * Updated sample chat app to show messages on load - * Updated libxmljs parseString -> parseHtmlString - * Fixed `make init` to work with older versions of git - * Fixed specs can now run independant specs for those who cant build deps. Closes #127 - * Fixed issues introduced by the node url module changes. Closes 126. - * Fixed two assertions failing due to Collection#keys() returning strings - * Fixed faulty Collection#toArray() spec due to keys() returning strings - * Fixed `make test` now builds libxmljs.node before testing - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/LICENSE deleted file mode 100644 index 0f3c767..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2009-2014 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. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/Readme.md deleted file mode 100644 index 8abbcc4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/Readme.md +++ /dev/null @@ -1,128 +0,0 @@ -[![Express Logo](https://i.cloudup.com/zfY6lL7eFa-3000x3000.png)](https://expressjs.com/) - - Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). - - [![NPM Version](https://badge.fury.io/js/express.svg)](https://badge.fury.io/js/express) - [![Build Status](https://travis-ci.org/visionmedia/express.svg?branch=master)](https://travis-ci.org/visionmedia/express) - [![Coverage Status](https://img.shields.io/coveralls/visionmedia/express.svg)](https://coveralls.io/r/visionmedia/express) - [![Gittip](http://img.shields.io/gittip/dougwilson.svg)](https://www.gittip.com/dougwilson/) - -```js -var express = require('express') -var app = express() - -app.get('/', function (req, res) { - res.send('Hello World') -}) - -app.listen(3000) -``` - - **PROTIP** Be sure to read [Migrating from 3.x to 4.x](https://github.com/visionmedia/express/wiki/Migrating-from-3.x-to-4.x) as well as [New features in 4.x](https://github.com/visionmedia/express/wiki/New-features-in-4.x). - -### Installation - -```bash -$ npm install express -``` - -## Quick Start - - The quickest way to get started with express is to utilize the executable [`express(1)`](https://github.com/expressjs/generator) to generate an application as shown below: - - Install the executable. The executable's major version will match Express's: - -```bash -$ npm install -g express-generator@4 -``` - - Create the app: - -```bash -$ express /tmp/foo && cd /tmp/foo -``` - - Install dependencies: - -```bash -$ npm install -``` - - Start the server: - -```bash -$ npm start -``` - -## Features - - * Robust routing - * HTTP helpers (redirection, caching, etc) - * View system supporting 14+ template engines - * Content negotiation - * Focus on high performance - * Executable for generating applications quickly - * High test coverage - -## Philosophy - - The Express philosophy is to provide small, robust tooling for HTTP servers, making - it a great solution for single page applications, web sites, hybrids, or public - HTTP APIs. - - Express does not force you to use any specific ORM or template engine. With support for over - 14 template engines via [Consolidate.js](https://github.com/visionmedia/consolidate.js), - you can quickly craft your perfect framework. - -## More Information - - * [Website and Documentation](http://expressjs.com/) - [[website repo](https://github.com/visionmedia/expressjs.com)] - * [Github Organization](https://github.com/expressjs) for Official Middleware & Modules - * [#express](https://webchat.freenode.net/?channels=express) on freenode IRC - * Visit the [Wiki](https://github.com/visionmedia/express/wiki) - * [Google Group](https://groups.google.com/group/express-js) for discussion - * [Русскоязычная документация](http://jsman.ru/express/) - * [한국어 문서](http://expressjs.kr) - [[website repo](https://github.com/Hanul/expressjs.kr)] - * Run express examples [online](https://runnable.com/express) - -## Viewing Examples - - Clone the Express repo, then install the dev dependencies to install all the example / test suite dependencies: - -```bash -$ git clone git://github.com/visionmedia/express.git --depth 1 -$ cd express -$ npm install -``` - - Then run whichever example you want: - - $ node examples/content-negotiation - - You can also view live examples here: - - - -## Running Tests - - To run the test suite, first invoke the following command within the repo, installing the development dependencies: - -```bash -$ npm install -``` - - Then run the tests: - -```bash -$ npm test -``` - -### Contributors - - * Author: [TJ Holowaychuk](https://github.com/visionmedia) - * Lead Maintainer: [Douglas Christopher Wilson](https://github.com/dougwilson) - * [All Contributors](https://github.com/visionmedia/express/graphs/contributors) - -### License - - [MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/index.js deleted file mode 100644 index 3da3378..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/express'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/application.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/application.js deleted file mode 100644 index b8b69c0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/application.js +++ /dev/null @@ -1,554 +0,0 @@ -/** - * Module dependencies. - */ - -var finalhandler = require('finalhandler'); -var mixin = require('utils-merge'); -var Router = require('./router'); -var methods = require('methods'); -var middleware = require('./middleware/init'); -var query = require('./middleware/query'); -var debug = require('debug')('express:application'); -var View = require('./view'); -var http = require('http'); -var compileETag = require('./utils').compileETag; -var compileQueryParser = require('./utils').compileQueryParser; -var compileTrust = require('./utils').compileTrust; -var deprecate = require('depd')('express'); -var resolve = require('path').resolve; - -/** - * Application prototype. - */ - -var app = exports = module.exports = {}; - -/** - * Initialize the server. - * - * - setup default configuration - * - setup default middleware - * - setup route reflection methods - * - * @api private - */ - -app.init = function(){ - this.cache = {}; - this.settings = {}; - this.engines = {}; - this.defaultConfiguration(); -}; - -/** - * Initialize application configuration. - * - * @api private - */ - -app.defaultConfiguration = function(){ - // default settings - this.enable('x-powered-by'); - this.set('etag', 'weak'); - var env = process.env.NODE_ENV || 'development'; - this.set('env', env); - this.set('query parser', 'extended'); - this.set('subdomain offset', 2); - this.set('trust proxy', false); - - debug('booting in %s mode', env); - - // inherit protos - this.on('mount', function(parent){ - this.request.__proto__ = parent.request; - this.response.__proto__ = parent.response; - this.engines.__proto__ = parent.engines; - this.settings.__proto__ = parent.settings; - }); - - // setup locals - this.locals = Object.create(null); - - // top-most app is mounted at / - this.mountpath = '/'; - - // default locals - this.locals.settings = this.settings; - - // default configuration - this.set('view', View); - this.set('views', resolve('views')); - this.set('jsonp callback name', 'callback'); - - if (env === 'production') { - this.enable('view cache'); - } - - Object.defineProperty(this, 'router', { - get: function() { - throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.'); - } - }); -}; - -/** - * lazily adds the base router if it has not yet been added. - * - * We cannot add the base router in the defaultConfiguration because - * it reads app settings which might be set after that has run. - * - * @api private - */ -app.lazyrouter = function() { - if (!this._router) { - this._router = new Router({ - caseSensitive: this.enabled('case sensitive routing'), - strict: this.enabled('strict routing') - }); - - this._router.use(query(this.get('query parser fn'))); - this._router.use(middleware.init(this)); - } -}; - -/** - * Dispatch a req, res pair into the application. Starts pipeline processing. - * - * If no _done_ callback is provided, then default error handlers will respond - * in the event of an error bubbling through the stack. - * - * @api private - */ - -app.handle = function(req, res, done) { - var router = this._router; - - // final handler - done = done || finalhandler(req, res, { - env: this.get('env'), - onerror: logerror.bind(this) - }); - - // no routes - if (!router) { - debug('no routes defined on app'); - done(); - return; - } - - router.handle(req, res, done); -}; - -/** - * Proxy `Router#use()` to add middleware to the app router. - * See Router#use() documentation for details. - * - * If the _fn_ parameter is an express app, then it will be - * mounted at the _route_ specified. - * - * @api public - */ - -app.use = function use(path, fn) { - var mount_app; - var mount_path; - - // check for .use(path, app) or .use(app) signature - if (arguments.length <= 2) { - mount_path = typeof path === 'string' - ? path - : '/'; - mount_app = typeof path === 'function' - ? path - : fn; - } - - // setup router - this.lazyrouter(); - var router = this._router; - - // express app - if (mount_app && mount_app.handle && mount_app.set) { - debug('.use app under %s', mount_path); - mount_app.mountpath = mount_path; - mount_app.parent = this; - - // restore .app property on req and res - router.use(mount_path, function mounted_app(req, res, next) { - var orig = req.app; - mount_app.handle(req, res, function(err) { - req.__proto__ = orig.request; - res.__proto__ = orig.response; - next(err); - }); - }); - - // mounted an app - mount_app.emit('mount', this); - - return this; - } - - // pass-through use - router.use.apply(router, arguments); - - return this; -}; - -/** - * Proxy to the app `Router#route()` - * Returns a new `Route` instance for the _path_. - * - * Routes are isolated middleware stacks for specific paths. - * See the Route api docs for details. - * - * @api public - */ - -app.route = function(path){ - this.lazyrouter(); - return this._router.route(path); -}; - -/** - * Register the given template engine callback `fn` - * as `ext`. - * - * By default will `require()` the engine based on the - * file extension. For example if you try to render - * a "foo.jade" file Express will invoke the following internally: - * - * app.engine('jade', require('jade').__express); - * - * For engines that do not provide `.__express` out of the box, - * or if you wish to "map" a different extension to the template engine - * you may use this method. For example mapping the EJS template engine to - * ".html" files: - * - * app.engine('html', require('ejs').renderFile); - * - * In this case EJS provides a `.renderFile()` method with - * the same signature that Express expects: `(path, options, callback)`, - * though note that it aliases this method as `ejs.__express` internally - * so if you're using ".ejs" extensions you dont need to do anything. - * - * Some template engines do not follow this convention, the - * [Consolidate.js](https://github.com/visionmedia/consolidate.js) - * library was created to map all of node's popular template - * engines to follow this convention, thus allowing them to - * work seamlessly within Express. - * - * @param {String} ext - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.engine = function(ext, fn){ - if ('function' != typeof fn) throw new Error('callback function required'); - if ('.' != ext[0]) ext = '.' + ext; - this.engines[ext] = fn; - return this; -}; - -/** - * Proxy to `Router#param()` with one added api feature. The _name_ parameter - * can be an array of names. - * - * See the Router#param() docs for more details. - * - * @param {String|Array} name - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.param = function(name, fn){ - var self = this; - self.lazyrouter(); - - if (Array.isArray(name)) { - name.forEach(function(key) { - self.param(key, fn); - }); - return this; - } - - self._router.param(name, fn); - return this; -}; - -/** - * Assign `setting` to `val`, or return `setting`'s value. - * - * app.set('foo', 'bar'); - * app.get('foo'); - * // => "bar" - * - * Mounted servers inherit their parent server's settings. - * - * @param {String} setting - * @param {*} [val] - * @return {Server} for chaining - * @api public - */ - -app.set = function(setting, val){ - if (arguments.length === 1) { - // app.get(setting) - return this.settings[setting]; - } - - // set value - this.settings[setting] = val; - - // trigger matched settings - switch (setting) { - case 'etag': - debug('compile etag %s', val); - this.set('etag fn', compileETag(val)); - break; - case 'query parser': - debug('compile query parser %s', val); - this.set('query parser fn', compileQueryParser(val)); - break; - case 'trust proxy': - debug('compile trust proxy %s', val); - this.set('trust proxy fn', compileTrust(val)); - break; - } - - return this; -}; - -/** - * Return the app's absolute pathname - * based on the parent(s) that have - * mounted it. - * - * For example if the application was - * mounted as "/admin", which itself - * was mounted as "/blog" then the - * return value would be "/blog/admin". - * - * @return {String} - * @api private - */ - -app.path = function(){ - return this.parent - ? this.parent.path() + this.mountpath - : ''; -}; - -/** - * Check if `setting` is enabled (truthy). - * - * app.enabled('foo') - * // => false - * - * app.enable('foo') - * app.enabled('foo') - * // => true - * - * @param {String} setting - * @return {Boolean} - * @api public - */ - -app.enabled = function(setting){ - return !!this.set(setting); -}; - -/** - * Check if `setting` is disabled. - * - * app.disabled('foo') - * // => true - * - * app.enable('foo') - * app.disabled('foo') - * // => false - * - * @param {String} setting - * @return {Boolean} - * @api public - */ - -app.disabled = function(setting){ - return !this.set(setting); -}; - -/** - * Enable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @api public - */ - -app.enable = function(setting){ - return this.set(setting, true); -}; - -/** - * Disable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @api public - */ - -app.disable = function(setting){ - return this.set(setting, false); -}; - -/** - * Delegate `.VERB(...)` calls to `router.VERB(...)`. - */ - -methods.forEach(function(method){ - app[method] = function(path){ - if ('get' == method && 1 == arguments.length) return this.set(path); - - this.lazyrouter(); - - var route = this._router.route(path); - route[method].apply(route, [].slice.call(arguments, 1)); - return this; - }; -}); - -/** - * Special-cased "all" method, applying the given route `path`, - * middleware, and callback to _every_ HTTP method. - * - * @param {String} path - * @param {Function} ... - * @return {app} for chaining - * @api public - */ - -app.all = function(path){ - this.lazyrouter(); - - var route = this._router.route(path); - var args = [].slice.call(arguments, 1); - methods.forEach(function(method){ - route[method].apply(route, args); - }); - - return this; -}; - -// del -> delete alias - -app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead'); - -/** - * Render the given view `name` name with `options` - * and a callback accepting an error and the - * rendered template string. - * - * Example: - * - * app.render('email', { name: 'Tobi' }, function(err, html){ - * // ... - * }) - * - * @param {String} name - * @param {String|Function} options or fn - * @param {Function} fn - * @api public - */ - -app.render = function(name, options, fn){ - var opts = {}; - var cache = this.cache; - var engines = this.engines; - var view; - - // support callback function as second arg - if ('function' == typeof options) { - fn = options, options = {}; - } - - // merge app.locals - mixin(opts, this.locals); - - // merge options._locals - if (options._locals) mixin(opts, options._locals); - - // merge options - mixin(opts, options); - - // set .cache unless explicitly provided - opts.cache = null == opts.cache - ? this.enabled('view cache') - : opts.cache; - - // primed cache - if (opts.cache) view = cache[name]; - - // view - if (!view) { - view = new (this.get('view'))(name, { - defaultEngine: this.get('view engine'), - root: this.get('views'), - engines: engines - }); - - if (!view.path) { - var err = new Error('Failed to lookup view "' + name + '" in views directory "' + view.root + '"'); - err.view = view; - return fn(err); - } - - // prime the cache - if (opts.cache) cache[name] = view; - } - - // render - try { - view.render(opts, fn); - } catch (err) { - fn(err); - } -}; - -/** - * Listen for connections. - * - * A node `http.Server` is returned, with this - * application (which is a `Function`) as its - * callback. If you wish to create both an HTTP - * and HTTPS server you may do so with the "http" - * and "https" modules as shown here: - * - * var http = require('http') - * , https = require('https') - * , express = require('express') - * , app = express(); - * - * http.createServer(app).listen(80); - * https.createServer({ ... }, app).listen(443); - * - * @return {http.Server} - * @api public - */ - -app.listen = function(){ - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; - -/** -* Log error using console.error. -* -* @param {Error} err -* @api public -*/ - -function logerror(err){ - if (this.get('env') !== 'test') console.error(err.stack || err.toString()); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/express.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/express.js deleted file mode 100644 index 7be6832..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/express.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter; -var mixin = require('utils-merge'); -var proto = require('./application'); -var Route = require('./router/route'); -var Router = require('./router'); -var req = require('./request'); -var res = require('./response'); - -/** - * Expose `createApplication()`. - */ - -exports = module.exports = createApplication; - -/** - * Create an express application. - * - * @return {Function} - * @api public - */ - -function createApplication() { - var app = function(req, res, next) { - app.handle(req, res, next); - }; - - mixin(app, proto); - mixin(app, EventEmitter.prototype); - - app.request = { __proto__: req, app: app }; - app.response = { __proto__: res, app: app }; - app.init(); - return app; -} - -/** - * Expose the prototypes. - */ - -exports.application = proto; -exports.request = req; -exports.response = res; - -/** - * Expose constructors. - */ - -exports.Route = Route; -exports.Router = Router; - -/** - * Expose middleware - */ - -exports.query = require('./middleware/query'); -exports.static = require('serve-static'); - -/** - * Replace removed middleware with an appropriate error message. - */ - -[ - 'json', - 'urlencoded', - 'bodyParser', - 'compress', - 'cookieSession', - 'session', - 'logger', - 'cookieParser', - 'favicon', - 'responseTime', - 'errorHandler', - 'timeout', - 'methodOverride', - 'vhost', - 'csrf', - 'directory', - 'limit', - 'multipart', - 'staticCache', -].forEach(function (name) { - Object.defineProperty(exports, name, { - get: function () { - throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.'); - }, - configurable: true - }); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/init.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/init.js deleted file mode 100644 index c09cf0c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/init.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Initialization middleware, exposing the - * request and response to eachother, as well - * as defaulting the X-Powered-By header field. - * - * @param {Function} app - * @return {Function} - * @api private - */ - -exports.init = function(app){ - return function expressInit(req, res, next){ - if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); - req.res = res; - res.req = req; - req.next = next; - - req.__proto__ = app.request; - res.__proto__ = app.response; - - res.locals = res.locals || Object.create(null); - - next(); - }; -}; - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/query.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/query.js deleted file mode 100644 index 092bbd9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/query.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Module dependencies. - */ - -var parseUrl = require('parseurl'); -var qs = require('qs'); - -/** - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function query(options) { - var queryparse = qs.parse; - - if (typeof options === 'function') { - queryparse = options; - options = undefined; - } - - return function query(req, res, next){ - if (!req.query) { - var val = parseUrl(req).query; - req.query = queryparse(val, options); - } - - next(); - }; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/request.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/request.js deleted file mode 100644 index ea5d037..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/request.js +++ /dev/null @@ -1,454 +0,0 @@ -/** - * Module dependencies. - */ - -var accepts = require('accepts'); -var deprecate = require('depd')('express'); -var typeis = require('type-is'); -var http = require('http'); -var fresh = require('fresh'); -var parseRange = require('range-parser'); -var parse = require('parseurl'); -var proxyaddr = require('proxy-addr'); - -/** - * Request prototype. - */ - -var req = exports = module.exports = { - __proto__: http.IncomingMessage.prototype -}; - -/** - * Return request header. - * - * The `Referrer` header field is special-cased, - * both `Referrer` and `Referer` are interchangeable. - * - * Examples: - * - * req.get('Content-Type'); - * // => "text/plain" - * - * req.get('content-type'); - * // => "text/plain" - * - * req.get('Something'); - * // => undefined - * - * Aliased as `req.header()`. - * - * @param {String} name - * @return {String} - * @api public - */ - -req.get = -req.header = function(name){ - switch (name = name.toLowerCase()) { - case 'referer': - case 'referrer': - return this.headers.referrer - || this.headers.referer; - default: - return this.headers[name]; - } -}; - -/** - * To do: update docs. - * - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json", a comma-delimted list such as "json, html, text/plain", - * an argument list such as `"json", "html", "text/plain"`, - * or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * req.accepts('html'); - * // => "html" - * - * // Accept: text/*, application/json - * req.accepts('html'); - * // => "html" - * req.accepts('text/html'); - * // => "text/html" - * req.accepts('json, text'); - * // => "json" - * req.accepts('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * req.accepts('image/png'); - * req.accepts('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * req.accepts(['html', 'json']); - * req.accepts('html', 'json'); - * req.accepts('html, json'); - * // => "json" - * - * @param {String|Array} type(s) - * @return {String} - * @api public - */ - -req.accepts = function(){ - var accept = accepts(this); - return accept.types.apply(accept, arguments); -}; - -/** - * Check if the given `encoding`s are accepted. - * - * @param {String} ...encoding - * @return {Boolean} - * @api public - */ - -req.acceptsEncodings = function(){ - var accept = accepts(this); - return accept.encodings.apply(accept, arguments); -}; - -req.acceptsEncoding = deprecate.function(req.acceptsEncodings, - 'req.acceptsEncoding: Use acceptsEncodings instead'); - -/** - * Check if the given `charset`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...charset - * @return {Boolean} - * @api public - */ - -req.acceptsCharsets = function(){ - var accept = accepts(this); - return accept.charsets.apply(accept, arguments); -}; - -req.acceptsCharset = deprecate.function(req.acceptsCharsets, - 'req.acceptsCharset: Use acceptsCharsets instead'); - -/** - * Check if the given `lang`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...lang - * @return {Boolean} - * @api public - */ - -req.acceptsLanguages = function(){ - var accept = accepts(this); - return accept.languages.apply(accept, arguments); -}; - -req.acceptsLanguage = deprecate.function(req.acceptsLanguages, - 'req.acceptsLanguage: Use acceptsLanguages instead'); - -/** - * Parse Range header field, - * capping to the given `size`. - * - * Unspecified ranges such as "0-" require - * knowledge of your resource length. In - * the case of a byte range this is of course - * the total number of bytes. If the Range - * header field is not given `null` is returned, - * `-1` when unsatisfiable, `-2` when syntactically invalid. - * - * NOTE: remember that ranges are inclusive, so - * for example "Range: users=0-3" should respond - * with 4 users when available, not 3. - * - * @param {Number} size - * @return {Array} - * @api public - */ - -req.range = function(size){ - var range = this.get('Range'); - if (!range) return; - return parseRange(size, range); -}; - -/** - * Return the value of param `name` when present or `defaultValue`. - * - * - Checks route placeholders, ex: _/user/:id_ - * - Checks body params, ex: id=12, {"id":12} - * - Checks query string params, ex: ?id=12 - * - * To utilize request bodies, `req.body` - * should be an object. This can be done by using - * the `bodyParser()` middleware. - * - * @param {String} name - * @param {Mixed} [defaultValue] - * @return {String} - * @api public - */ - -req.param = function(name, defaultValue){ - var params = this.params || {}; - var body = this.body || {}; - var query = this.query || {}; - if (null != params[name] && params.hasOwnProperty(name)) return params[name]; - if (null != body[name]) return body[name]; - if (null != query[name]) return query[name]; - return defaultValue; -}; - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains the give mime `type`. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * req.is('html'); - * req.is('text/html'); - * req.is('text/*'); - * // => true - * - * // When Content-Type is application/json - * req.is('json'); - * req.is('application/json'); - * req.is('application/*'); - * // => true - * - * req.is('html'); - * // => false - * - * @param {String} type - * @return {Boolean} - * @api public - */ - -req.is = function(types){ - if (!Array.isArray(types)) types = [].slice.call(arguments); - return typeis(this, types); -}; - -/** - * Return the protocol string "http" or "https" - * when requested with TLS. When the "trust proxy" - * setting trusts the socket address, the - * "X-Forwarded-Proto" header field will be trusted - * and used if present. - * - * If you're running behind a reverse proxy that - * supplies https for you this may be enabled. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'protocol', function protocol(){ - var proto = this.connection.encrypted - ? 'https' - : 'http'; - var trust = this.app.get('trust proxy fn'); - - if (!trust(this.connection.remoteAddress)) { - return proto; - } - - // Note: X-Forwarded-Proto is normally only ever a - // single value, but this is to be safe. - proto = this.get('X-Forwarded-Proto') || proto; - return proto.split(/\s*,\s*/)[0]; -}); - -/** - * Short-hand for: - * - * req.protocol == 'https' - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'secure', function secure(){ - return 'https' == this.protocol; -}); - -/** - * Return the remote address from the trusted proxy. - * - * The is the remote address on the socket unless - * "trust proxy" is set. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'ip', function ip(){ - var trust = this.app.get('trust proxy fn'); - return proxyaddr(this, trust); -}); - -/** - * When "trust proxy" is set, trusted proxy addresses + client. - * - * For example if the value were "client, proxy1, proxy2" - * you would receive the array `["client", "proxy1", "proxy2"]` - * where "proxy2" is the furthest down-stream and "proxy1" and - * "proxy2" were trusted. - * - * @return {Array} - * @api public - */ - -defineGetter(req, 'ips', function ips() { - var trust = this.app.get('trust proxy fn'); - var addrs = proxyaddr.all(this, trust); - return addrs.slice(1).reverse(); -}); - -/** - * Return subdomains as an array. - * - * Subdomains are the dot-separated parts of the host before the main domain of - * the app. By default, the domain of the app is assumed to be the last two - * parts of the host. This can be changed by setting "subdomain offset". - * - * For example, if the domain is "tobi.ferrets.example.com": - * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. - * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. - * - * @return {Array} - * @api public - */ - -defineGetter(req, 'subdomains', function subdomains() { - var offset = this.app.get('subdomain offset'); - return (this.hostname || '') - .split('.') - .reverse() - .slice(offset); -}); - -/** - * Short-hand for `url.parse(req.url).pathname`. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'path', function path() { - return parse(this).pathname; -}); - -/** - * Parse the "Host" header field to a hostname. - * - * When the "trust proxy" setting trusts the socket - * address, the "X-Forwarded-Host" header field will - * be trusted. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'hostname', function hostname(){ - var trust = this.app.get('trust proxy fn'); - var host = this.get('X-Forwarded-Host'); - - if (!host || !trust(this.connection.remoteAddress)) { - host = this.get('Host'); - } - - if (!host) return; - - // IPv6 literal support - var offset = host[0] === '[' - ? host.indexOf(']') + 1 - : 0; - var index = host.indexOf(':', offset); - - return ~index - ? host.substring(0, index) - : host; -}); - -// TODO: change req.host to return host in next major - -defineGetter(req, 'host', deprecate.function(function host(){ - return this.hostname; -}, 'req.host: Use req.hostname instead')); - -/** - * Check if the request is fresh, aka - * Last-Modified and/or the ETag - * still match. - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'fresh', function(){ - var method = this.method; - var s = this.res.statusCode; - - // GET or HEAD for weak freshness validation only - if ('GET' != method && 'HEAD' != method) return false; - - // 2xx or 304 as per rfc2616 14.26 - if ((s >= 200 && s < 300) || 304 == s) { - return fresh(this.headers, this.res._headers); - } - - return false; -}); - -/** - * Check if the request is stale, aka - * "Last-Modified" and / or the "ETag" for the - * resource has changed. - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'stale', function stale(){ - return !this.fresh; -}); - -/** - * Check if the request was an _XMLHttpRequest_. - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'xhr', function xhr(){ - var val = this.get('X-Requested-With') || ''; - return 'xmlhttprequest' == val.toLowerCase(); -}); - -/** - * Helper function for creating a getter on an object. - * - * @param {Object} obj - * @param {String} name - * @param {Function} getter - * @api private - */ -function defineGetter(obj, name, getter) { - Object.defineProperty(obj, name, { - configurable: true, - enumerable: true, - get: getter - }); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/response.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/response.js deleted file mode 100644 index eff48d7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/response.js +++ /dev/null @@ -1,831 +0,0 @@ -/** - * Module dependencies. - */ - -var deprecate = require('depd')('express'); -var escapeHtml = require('escape-html'); -var http = require('http'); -var path = require('path'); -var mixin = require('utils-merge'); -var sign = require('cookie-signature').sign; -var normalizeType = require('./utils').normalizeType; -var normalizeTypes = require('./utils').normalizeTypes; -var setCharset = require('./utils').setCharset; -var contentDisposition = require('./utils').contentDisposition; -var statusCodes = http.STATUS_CODES; -var cookie = require('cookie'); -var send = require('send'); -var basename = path.basename; -var extname = path.extname; -var mime = send.mime; -var vary = require('vary'); - -/** - * Response prototype. - */ - -var res = module.exports = { - __proto__: http.ServerResponse.prototype -}; - -/** - * Set status `code`. - * - * @param {Number} code - * @return {ServerResponse} - * @api public - */ - -res.status = function(code){ - this.statusCode = code; - return this; -}; - -/** - * Set Link header field with the given `links`. - * - * Examples: - * - * res.links({ - * next: 'http://api.example.com/users?page=2', - * last: 'http://api.example.com/users?page=5' - * }); - * - * @param {Object} links - * @return {ServerResponse} - * @api public - */ - -res.links = function(links){ - var link = this.get('Link') || ''; - if (link) link += ', '; - return this.set('Link', link + Object.keys(links).map(function(rel){ - return '<' + links[rel] + '>; rel="' + rel + '"'; - }).join(', ')); -}; - -/** - * Send a response. - * - * Examples: - * - * res.send(new Buffer('wahoo')); - * res.send({ some: 'json' }); - * res.send('

some html

'); - * - * @param {string|number|boolean|object|Buffer} body - * @api public - */ - -res.send = function send(body) { - var chunk = body; - var encoding; - var len; - var req = this.req; - var type; - - // settings - var app = this.app; - - // allow status / body - if (arguments.length === 2) { - // res.send(body, status) backwards compat - if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') { - deprecate('res.send(body, status): Use res.status(status).send(body) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.send(status, body): Use res.status(status).send(body) instead'); - this.statusCode = arguments[0]; - chunk = arguments[1]; - } - } - - // disambiguate res.send(status) and res.send(status, num) - if (typeof chunk === 'number' && arguments.length === 1) { - // res.send(status) will set status message as text string - if (!this.get('Content-Type')) { - this.type('txt'); - } - - deprecate('res.send(status): Use res.status(status).end() instead'); - this.statusCode = chunk; - chunk = http.STATUS_CODES[chunk]; - } - - switch (typeof chunk) { - // string defaulting to html - case 'string': - if (!this.get('Content-Type')) { - this.type('html'); - } - break; - case 'boolean': - case 'number': - case 'object': - if (chunk === null) { - chunk = ''; - } else if (Buffer.isBuffer(chunk)) { - if (!this.get('Content-Type')) { - this.type('bin'); - } - } else { - return this.json(chunk); - } - break; - } - - // write strings in utf-8 - if (typeof chunk === 'string') { - encoding = 'utf8'; - type = this.get('Content-Type'); - - // reflect this in content-type - if (typeof type === 'string') { - this.set('Content-Type', setCharset(type, 'utf-8')); - } - } - - // populate Content-Length - if (chunk !== undefined) { - if (!Buffer.isBuffer(chunk)) { - // convert chunk to Buffer; saves later double conversions - chunk = new Buffer(chunk, encoding); - encoding = undefined; - } - - len = chunk.length; - this.set('Content-Length', len); - } - - // method check - var isHead = req.method === 'HEAD'; - - // ETag support - if (len !== undefined && (isHead || req.method === 'GET')) { - var etag = app.get('etag fn'); - if (etag && !this.get('ETag')) { - etag = etag(chunk, encoding); - etag && this.set('ETag', etag); - } - } - - // freshness - if (req.fresh) this.statusCode = 304; - - // strip irrelevant headers - if (204 == this.statusCode || 304 == this.statusCode) { - this.removeHeader('Content-Type'); - this.removeHeader('Content-Length'); - this.removeHeader('Transfer-Encoding'); - chunk = ''; - } - - // skip body for HEAD - if (isHead) { - this.end(); - } - - // respond - this.end(chunk, encoding); - - return this; -}; - -/** - * Send JSON response. - * - * Examples: - * - * res.json(null); - * res.json({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @api public - */ - -res.json = function json(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.json(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.json(status, obj): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(val, replacer, spaces); - - // content-type - if (!this.get('Content-Type')) { - this.set('Content-Type', 'application/json'); - } - - return this.send(body); -}; - -/** - * Send JSON response with JSONP callback support. - * - * Examples: - * - * res.jsonp(null); - * res.jsonp({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @api public - */ - -res.jsonp = function jsonp(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.jsonp(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(val, replacer, spaces); - var callback = this.req.query[app.get('jsonp callback name')]; - - // content-type - if (!this.get('Content-Type')) { - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'application/json'); - } - - // fixup callback - if (Array.isArray(callback)) { - callback = callback[0]; - } - - // jsonp - if (typeof callback === 'string' && callback.length !== 0) { - this.charset = 'utf-8'; - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'text/javascript'); - - // restrict callback charset - callback = callback.replace(/[^\[\]\w$.]/g, ''); - - // replace chars not allowed in JavaScript that are in JSON - body = body - .replace(/\u2028/g, '\\u2028') - .replace(/\u2029/g, '\\u2029'); - - // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse" - // the typeof check is just to reduce client error noise - body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');'; - } - - return this.send(body); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `fn(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.sentHeader` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 (can be string converted by `ms`) - * - `root` root directory for relative filenames - * - `headers` object of headers to serve with file - * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them - * - * Other options are passed along to `send`. - * - * Examples: - * - * The following example illustrates how `res.sendfile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendfile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendfile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @api public - */ - -res.sendfile = function(path, options, fn){ - options = options || {}; - var self = this; - var req = self.req; - var next = this.req.next; - var done; - - - // support function as second arg - if ('function' == typeof options) { - fn = options; - options = {}; - } - - // socket errors - req.socket.on('error', error); - - // errors - function error(err) { - if (done) return; - done = true; - - // clean up - cleanup(); - - // callback available - if (fn) return fn(err); - - // delegate - next(err); - } - - // streaming - function stream(stream) { - if (done) return; - cleanup(); - if (fn) stream.on('end', fn); - } - - // cleanup - function cleanup() { - req.socket.removeListener('error', error); - } - - // transfer - var file = send(req, path, options); - file.on('error', error); - file.on('directory', next); - file.on('stream', stream); - - if (options.headers) { - // set headers on successful transfer - file.on('headers', function headers(res) { - var obj = options.headers; - var keys = Object.keys(obj); - - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - res.setHeader(k, obj[k]); - } - }); - } - - // pipe - file.pipe(this); - this.on('finish', cleanup); -}; - -/** - * Transfer the file at the given `path` as an attachment. - * - * Optionally providing an alternate attachment `filename`, - * and optional callback `fn(err)`. The callback is invoked - * when the data transfer is complete, or when an error has - * ocurred. Be sure to check `res.headersSent` if you plan to respond. - * - * This method uses `res.sendfile()`. - * - * @api public - */ - -res.download = function(path, filename, fn){ - // support function as second arg - if ('function' == typeof filename) { - fn = filename; - filename = null; - } - - filename = filename || path; - - // set Content-Disposition when file is sent - var headers = { - 'Content-Disposition': contentDisposition(filename) - }; - - return this.sendfile(path, { headers: headers }, fn); -}; - -/** - * Set _Content-Type_ response header with `type` through `mime.lookup()` - * when it does not contain "/", or set the Content-Type to `type` otherwise. - * - * Examples: - * - * res.type('.html'); - * res.type('html'); - * res.type('json'); - * res.type('application/json'); - * res.type('png'); - * - * @param {String} type - * @return {ServerResponse} for chaining - * @api public - */ - -res.contentType = -res.type = function(type){ - return this.set('Content-Type', ~type.indexOf('/') - ? type - : mime.lookup(type)); -}; - -/** - * Respond to the Acceptable formats using an `obj` - * of mime-type callbacks. - * - * This method uses `req.accepted`, an array of - * acceptable types ordered by their quality values. - * When "Accept" is not present the _first_ callback - * is invoked, otherwise the first match is used. When - * no match is performed the server responds with - * 406 "Not Acceptable". - * - * Content-Type is set for you, however if you choose - * you may alter this within the callback using `res.type()` - * or `res.set('Content-Type', ...)`. - * - * res.format({ - * 'text/plain': function(){ - * res.send('hey'); - * }, - * - * 'text/html': function(){ - * res.send('

hey

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

hey

'); - * }, - * - * json: function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * By default Express passes an `Error` - * with a `.status` of 406 to `next(err)` - * if a match is not made. If you provide - * a `.default` callback it will be invoked - * instead. - * - * @param {Object} obj - * @return {ServerResponse} for chaining - * @api public - */ - -res.format = function(obj){ - var req = this.req; - var next = req.next; - - var fn = obj.default; - if (fn) delete obj.default; - var keys = Object.keys(obj); - - var key = req.accepts(keys); - - this.vary("Accept"); - - if (key) { - this.set('Content-Type', normalizeType(key).value); - obj[key](req, this, next); - } else if (fn) { - fn(); - } else { - var err = new Error('Not Acceptable'); - err.status = 406; - err.types = normalizeTypes(keys).map(function(o){ return o.value }); - next(err); - } - - return this; -}; - -/** - * Set _Content-Disposition_ header to _attachment_ with optional `filename`. - * - * @param {String} filename - * @return {ServerResponse} - * @api public - */ - -res.attachment = function(filename){ - if (filename) this.type(extname(filename)); - this.set('Content-Disposition', contentDisposition(filename)); - return this; -}; - -/** - * Set header `field` to `val`, or pass - * an object of header fields. - * - * Examples: - * - * res.set('Foo', ['bar', 'baz']); - * res.set('Accept', 'application/json'); - * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); - * - * Aliased as `res.header()`. - * - * @param {String|Object|Array} field - * @param {String} val - * @return {ServerResponse} for chaining - * @api public - */ - -res.set = -res.header = function header(field, val) { - if (arguments.length === 2) { - if (Array.isArray(val)) val = val.map(String); - else val = String(val); - if ('content-type' == field.toLowerCase() && !/;\s*charset\s*=/.test(val)) { - var charset = mime.charsets.lookup(val.split(';')[0]); - if (charset) val += '; charset=' + charset.toLowerCase(); - } - this.setHeader(field, val); - } else { - for (var key in field) { - this.set(key, field[key]); - } - } - return this; -}; - -/** - * Get value for header `field`. - * - * @param {String} field - * @return {String} - * @api public - */ - -res.get = function(field){ - return this.getHeader(field); -}; - -/** - * Clear cookie `name`. - * - * @param {String} name - * @param {Object} options - * @return {ServerResponse} for chaining - * @api public - */ - -res.clearCookie = function(name, options){ - var opts = { expires: new Date(1), path: '/' }; - return this.cookie(name, '', options - ? mixin(opts, options) - : opts); -}; - -/** - * Set cookie `name` to `val`, with the given `options`. - * - * Options: - * - * - `maxAge` max-age in milliseconds, converted to `expires` - * - `signed` sign the cookie - * - `path` defaults to "/" - * - * Examples: - * - * // "Remember Me" for 15 minutes - * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); - * - * // save as above - * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) - * - * @param {String} name - * @param {String|Object} val - * @param {Options} options - * @return {ServerResponse} for chaining - * @api public - */ - -res.cookie = function(name, val, options){ - options = mixin({}, options); - var secret = this.req.secret; - var signed = options.signed; - if (signed && !secret) throw new Error('cookieParser("secret") required for signed cookies'); - if ('number' == typeof val) val = val.toString(); - if ('object' == typeof val) val = 'j:' + JSON.stringify(val); - if (signed) val = 's:' + sign(val, secret); - if ('maxAge' in options) { - options.expires = new Date(Date.now() + options.maxAge); - options.maxAge /= 1000; - } - if (null == options.path) options.path = '/'; - var headerVal = cookie.serialize(name, String(val), options); - - // supports multiple 'res.cookie' calls by getting previous value - var prev = this.get('Set-Cookie'); - if (prev) { - if (Array.isArray(prev)) { - headerVal = prev.concat(headerVal); - } else { - headerVal = [prev, headerVal]; - } - } - this.set('Set-Cookie', headerVal); - return this; -}; - - -/** - * Set the location header to `url`. - * - * The given `url` can also be "back", which redirects - * to the _Referrer_ or _Referer_ headers or "/". - * - * Examples: - * - * res.location('/foo/bar').; - * res.location('http://example.com'); - * res.location('../login'); - * - * @param {String} url - * @return {ServerResponse} for chaining - * @api public - */ - -res.location = function(url){ - var req = this.req; - - // "back" is an alias for the referrer - if ('back' == url) url = req.get('Referrer') || '/'; - - // Respond - this.set('Location', url); - return this; -}; - -/** - * Redirect to the given `url` with optional response `status` - * defaulting to 302. - * - * The resulting `url` is determined by `res.location()`, so - * it will play nicely with mounted apps, relative paths, - * `"back"` etc. - * - * Examples: - * - * res.redirect('/foo/bar'); - * res.redirect('http://example.com'); - * res.redirect(301, 'http://example.com'); - * res.redirect('../login'); // /blog/post/1 -> /blog/login - * - * @api public - */ - -res.redirect = function redirect(url) { - var address = url; - var body; - var status = 302; - - // allow status / url - if (arguments.length === 2) { - if (typeof arguments[0] === 'number') { - status = arguments[0]; - address = arguments[1]; - } else { - deprecate('res.redirect(ur, status): Use res.redirect(status, url) instead'); - status = arguments[1]; - } - } - - // Set location header - this.location(address); - address = this.get('Location'); - - // Support text/{plain,html} by default - this.format({ - text: function(){ - body = statusCodes[status] + '. Redirecting to ' + encodeURI(url); - }, - - html: function(){ - var u = escapeHtml(url); - body = '

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

'; - }, - - default: function(){ - body = ''; - } - }); - - // Respond - this.statusCode = status; - this.set('Content-Length', Buffer.byteLength(body)); - - if (this.req.method === 'HEAD') { - this.end(); - } - - this.end(body); -}; - -/** - * Add `field` to Vary. If already present in the Vary set, then - * this call is simply ignored. - * - * @param {Array|String} field - * @return {ServerResponse} for chaining - * @api public - */ - -res.vary = function(field){ - // checks for back-compat - if (!field || (Array.isArray(field) && !field.length)) { - deprecate('res.vary(): Provide a field name'); - return this; - } - - vary(this, field); - - return this; -}; - -/** - * Render `view` with the given `options` and optional callback `fn`. - * When a callback function is given a response will _not_ be made - * automatically, otherwise a response of _200_ and _text/html_ is given. - * - * Options: - * - * - `cache` boolean hinting to the engine it should cache - * - `filename` filename of the view being rendered - * - * @api public - */ - -res.render = function(view, options, fn){ - options = options || {}; - var self = this; - var req = this.req; - var app = req.app; - - // support callback function as second arg - if ('function' == typeof options) { - fn = options, options = {}; - } - - // merge res.locals - options._locals = self.locals; - - // default callback to respond - fn = fn || function(err, str){ - if (err) return req.next(err); - self.send(str); - }; - - // render - app.render(view, options, fn); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/index.js deleted file mode 100644 index 4e63eb1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/index.js +++ /dev/null @@ -1,548 +0,0 @@ -/** - * Module dependencies. - */ - -var Route = require('./route'); -var Layer = require('./layer'); -var methods = require('methods'); -var mixin = require('utils-merge'); -var debug = require('debug')('express:router'); -var parseUrl = require('parseurl'); -var slice = Array.prototype.slice; -var toString = Object.prototype.toString; -var utils = require('../utils'); - -/** - * Initialize a new `Router` with the given `options`. - * - * @param {Object} options - * @return {Router} which is an callable function - * @api public - */ - -var proto = module.exports = function(options) { - options = options || {}; - - function router(req, res, next) { - router.handle(req, res, next); - } - - // mixin Router class functions - router.__proto__ = proto; - - router.params = {}; - router._params = []; - router.caseSensitive = options.caseSensitive; - router.mergeParams = options.mergeParams; - router.strict = options.strict; - router.stack = []; - - return router; -}; - -/** - * Map the given param placeholder `name`(s) to the given callback. - * - * Parameter mapping is used to provide pre-conditions to routes - * which use normalized placeholders. For example a _:user_id_ parameter - * could automatically load a user's information from the database without - * any additional code, - * - * The callback uses the same signature as middleware, the only difference - * being that the value of the placeholder is passed, in this case the _id_ - * of the user. Once the `next()` function is invoked, just like middleware - * it will continue on to execute the route, or subsequent parameter functions. - * - * Just like in middleware, you must either respond to the request or call next - * to avoid stalling the request. - * - * app.param('user_id', function(req, res, next, id){ - * User.find(id, function(err, user){ - * if (err) { - * return next(err); - * } else if (!user) { - * return next(new Error('failed to load user')); - * } - * req.user = user; - * next(); - * }); - * }); - * - * @param {String} name - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -proto.param = function(name, fn){ - // param logic - if ('function' == typeof name) { - this._params.push(name); - return; - } - - // apply param functions - var params = this._params; - var len = params.length; - var ret; - - if (name[0] === ':') { - name = name.substr(1); - } - - 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; -}; - -/** - * Dispatch a req, res into the router. - * - * @api private - */ - -proto.handle = function(req, res, done) { - var self = this; - - debug('dispatching %s %s', req.method, req.url); - - var search = 1 + req.url.indexOf('?'); - var pathlength = search ? search - 1 : req.url.length; - var fqdn = 1 + req.url.substr(0, pathlength).indexOf('://'); - var protohost = fqdn ? req.url.substr(0, req.url.indexOf('/', 2 + fqdn)) : ''; - var idx = 0; - var removed = ''; - var slashAdded = false; - var paramcalled = {}; - - // store options for OPTIONS request - // only used if OPTIONS request - var options = []; - - // middleware and routes - var stack = self.stack; - - // manage inter-router variables - var parentParams = req.params; - var parentUrl = req.baseUrl || ''; - done = restore(done, req, 'baseUrl', 'next', 'params'); - - // setup next layer - req.next = next; - - // for options requests, respond with a default if nothing else responds - if (req.method === 'OPTIONS') { - done = wrap(done, function(old, err) { - if (err || options.length === 0) return old(err); - - var body = options.join(','); - return res.set('Allow', body).send(body); - }); - } - - // setup basic req values - req.baseUrl = parentUrl; - req.originalUrl = req.originalUrl || req.url; - - next(); - - function next(err) { - var layerError = err === 'route' - ? null - : err; - - var layer = stack[idx++]; - - if (slashAdded) { - req.url = req.url.substr(1); - slashAdded = false; - } - - if (removed.length !== 0) { - req.baseUrl = parentUrl; - req.url = protohost + removed + req.url.substr(protohost.length); - removed = ''; - } - - if (!layer) { - return done(layerError); - } - - self.match_layer(layer, req, res, function (err, path) { - if (err || path === undefined) { - return next(layerError || err); - } - - // route object and not middleware - var route = layer.route; - - // if final route, then we support options - if (route) { - // we don't run any routes with error first - if (layerError) { - return next(layerError); - } - - var method = req.method; - var has_method = route._handles_method(method); - - // build up automatic options response - if (!has_method && method === 'OPTIONS') { - options.push.apply(options, route._options()); - } - - // don't even bother - if (!has_method && method !== 'HEAD') { - return next(); - } - - // we can now dispatch to the route - req.route = route; - } - - // Capture one-time layer values - req.params = self.mergeParams - ? mergeParams(layer.params, parentParams) - : layer.params; - var layerPath = layer.path; - - // this should be done for the layer - self.process_params(layer, paramcalled, req, res, function (err) { - if (err) { - return next(layerError || err); - } - - if (route) { - return layer.handle_request(req, res, next); - } - - trim_prefix(layer, layerError, layerPath, path); - }); - }); - } - - function trim_prefix(layer, layerError, layerPath, path) { - var c = path[layerPath.length]; - if (c && '/' !== c && '.' !== c) return next(layerError); - - // Trim off the part of the url that matches the route - // middleware (.use stuff) needs to have the path stripped - if (layerPath.length !== 0) { - debug('trim prefix (%s) from url %s', layerPath, req.url); - removed = layerPath; - req.url = protohost + req.url.substr(protohost.length + removed.length); - - // Ensure leading slash - if (!fqdn && req.url[0] !== '/') { - req.url = '/' + req.url; - slashAdded = true; - } - - // Setup base URL (no trailing slash) - req.baseUrl = parentUrl + (removed[removed.length - 1] === '/' - ? removed.substring(0, removed.length - 1) - : removed); - } - - debug('%s %s : %s', layer.name, layerPath, req.originalUrl); - - if (layerError) { - layer.handle_error(layerError, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Match request to a layer. - * - * @api private - */ - -proto.match_layer = function match_layer(layer, req, res, done) { - var error = null; - var path; - - try { - path = parseUrl(req).pathname; - - if (!layer.match(path)) { - path = undefined; - } - } catch (err) { - error = err; - } - - done(error, path); -}; - -/** - * Process any parameters for the layer. - * - * @api private - */ - -proto.process_params = function(layer, called, req, res, done) { - var params = this.params; - - // captured parameters from the layer, keys and values - var keys = layer.keys; - - // fast track - if (!keys || keys.length === 0) { - return done(); - } - - var i = 0; - var name; - var paramIndex = 0; - var key; - var paramVal; - var paramCallbacks; - var paramCalled; - - // process params in order - // param callbacks can be async - function param(err) { - if (err) { - return done(err); - } - - if (i >= keys.length ) { - return done(); - } - - paramIndex = 0; - key = keys[i++]; - - if (!key) { - return done(); - } - - name = key.name; - paramVal = req.params[name]; - paramCallbacks = params[name]; - paramCalled = called[name]; - - if (paramVal === undefined || !paramCallbacks) { - return param(); - } - - // param previously called with same value or error occurred - if (paramCalled && (paramCalled.error || paramCalled.match === paramVal)) { - // restore value - req.params[name] = paramCalled.value; - - // next param - return param(paramCalled.error); - } - - called[name] = paramCalled = { - error: null, - match: paramVal, - value: paramVal - }; - - paramCallback(); - } - - // single param callbacks - function paramCallback(err) { - var fn = paramCallbacks[paramIndex++]; - - // store updated value - paramCalled.value = req.params[key.name]; - - if (err) { - // store error - paramCalled.error = err; - param(err); - return; - } - - if (!fn) return param(); - - try { - fn(req, res, paramCallback, paramVal, key.name); - } catch (e) { - paramCallback(e); - } - } - - param(); -}; - -/** - * Use the given middleware function, with optional path, defaulting to "/". - * - * Use (like `.all`) will run for any http METHOD, but it will not add - * handlers for those methods so OPTIONS requests will not consider `.use` - * functions even if they could respond. - * - * The other difference is that _route_ path is stripped and not visible - * to the handler function. The main effect of this feature is that mounted - * handlers can operate without any code changes regardless of the "prefix" - * pathname. - * - * @api public - */ - -proto.use = function use(fn) { - var offset = 0; - var path = '/'; - var self = this; - - // default path to '/' - if (typeof fn !== 'function') { - offset = 1; - path = fn; - } - - var callbacks = utils.flatten(slice.call(arguments, offset)); - - if (callbacks.length === 0) { - throw new TypeError('Router.use() requires callback function'); - } - - callbacks.forEach(function (fn) { - if (typeof fn !== 'function') { - var type = toString.call(fn); - var msg = 'Router.use() requires callback function but got a ' + type; - throw new TypeError(msg); - } - - // add the middleware - debug('use %s %s', path, fn.name || ''); - - var layer = new Layer(path, { - sensitive: self.caseSensitive, - strict: false, - end: false - }, fn); - - layer.route = undefined; - - self.stack.push(layer); - }); - - return this; -}; - -/** - * Create a new Route for the given path. - * - * Each route contains a separate middleware stack and VERB handlers. - * - * See the Route api documentation for details on adding handlers - * and middleware to routes. - * - * @param {String} path - * @return {Route} - * @api public - */ - -proto.route = function(path){ - var route = new Route(path); - - var layer = new Layer(path, { - sensitive: this.caseSensitive, - strict: this.strict, - end: true - }, route.dispatch.bind(route)); - - layer.route = route; - - this.stack.push(layer); - return route; -}; - -// create Router#VERB functions -methods.concat('all').forEach(function(method){ - proto[method] = function(path){ - var route = this.route(path) - route[method].apply(route, slice.call(arguments, 1)); - return this; - }; -}); - -// merge params with parent params -function mergeParams(params, parent) { - if (typeof parent !== 'object' || !parent) { - return params; - } - - // make copy of parent for base - var obj = mixin({}, parent); - - // simple non-numeric merging - if (!(0 in params) || !(0 in parent)) { - return mixin(obj, params); - } - - var i = 0; - var o = 0; - - // determine numeric gaps - while (i === o || o in parent) { - if (i in params) i++; - if (o in parent) o++; - } - - // offset numeric indices in params before merge - for (i--; i >= 0; i--) { - params[i + o] = params[i]; - - // create holes for the merge when necessary - if (i < o) { - delete params[i]; - } - } - - return mixin(parent, params); -} - -// restore obj props after function -function restore(fn, obj) { - var props = new Array(arguments.length - 2); - var vals = new Array(arguments.length - 2); - - for (var i = 0; i < props.length; i++) { - props[i] = arguments[i + 2]; - vals[i] = obj[props[i]]; - } - - return function(err){ - // restore vals - for (var i = 0; i < props.length; i++) { - obj[props[i]] = vals[i]; - } - - return fn.apply(this, arguments); - }; -} - -// wrap a function -function wrap(old, fn) { - return function proxy() { - var args = new Array(arguments.length + 1); - - args[0] = old; - for (var i = 0, len = arguments.length; i < len; i++) { - args[i + 1] = arguments[i]; - } - - fn.apply(this, args); - }; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/layer.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/layer.js deleted file mode 100644 index e292a13..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/layer.js +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Module dependencies. - */ - -var pathRegexp = require('path-to-regexp'); -var debug = require('debug')('express:router:layer'); - -/** - * Expose `Layer`. - */ - -module.exports = Layer; - -function Layer(path, options, fn) { - if (!(this instanceof Layer)) { - return new Layer(path, options, fn); - } - - debug('new %s', path); - options = options || {}; - - this.handle = fn; - this.name = fn.name || ''; - this.params = undefined; - this.path = undefined; - this.regexp = pathRegexp(path, this.keys = [], options); - - if (path === '/' && options.end === false) { - this.regexp.fast_slash = true; - } -} - -/** - * Handle the error for the layer. - * - * @param {Error} error - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_error = function handle_error(error, req, res, next) { - var fn = this.handle; - - if (fn.length !== 4) { - // not a standard error handler - return next(error); - } - - try { - fn(error, req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Handle the request for the layer. - * - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_request = function handle(req, res, next) { - var fn = this.handle; - - if (fn.length > 3) { - // not a standard request handler - return next(); - } - - try { - fn(req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Check if this route matches `path`, if so - * populate `.params`. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -Layer.prototype.match = function match(path) { - if (this.regexp.fast_slash) { - // fast path non-ending match for / (everything matches) - this.params = {}; - this.path = ''; - return true; - } - - var m = this.regexp.exec(path); - - if (!m) { - this.params = undefined; - this.path = undefined; - return false; - } - - // store values - this.params = {}; - this.path = m[0]; - - var keys = this.keys; - var params = this.params; - var n = 0; - var key; - var val; - - for (var i = 1, len = m.length; i < len; ++i) { - key = keys[i - 1]; - val = decode_param(m[i]); - - if (key) { - params[key.name] = val; - } else { - params[n++] = val; - } - } - - return true; -}; - -/** - * Decode param value. - * - * @param {string} val - * @return {string} - * @api private - */ - -function decode_param(val){ - if (typeof val !== 'string') { - return val; - } - - try { - return decodeURIComponent(val); - } catch (e) { - var err = new TypeError("Failed to decode param '" + val + "'"); - err.status = 400; - throw err; - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/match.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/match.js deleted file mode 100644 index ce308c4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/match.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Module dependencies. - */ - -var pathRegexp = require('path-to-regexp'); - -/** - * Expose `Layer`. - */ - -module.exports = Match; - -function Match(layer, path, params) { - this.layer = layer; - this.params = {}; - this.path = path || ''; - - if (!params) { - return this; - } - - var keys = layer.keys; - var n = 0; - var prop; - var key; - var val; - - for (var i = 0; i < params.length; i++) { - key = keys[i]; - val = decode_param(params[i]); - prop = key - ? key.name - : n++; - - this.params[prop] = val; - } - - return this; -}; - -/** - * Decode param value. - * - * @param {string} val - * @return {string} - * @api private - */ - -function decode_param(val){ - if (typeof val !== 'string') { - return val; - } - - try { - return decodeURIComponent(val); - } catch (e) { - var err = new TypeError("Failed to decode param '" + val + "'"); - err.status = 400; - throw err; - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/route.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/route.js deleted file mode 100644 index 6b39211..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/route.js +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Module dependencies. - */ - -var debug = require('debug')('express:router:route'); -var Layer = require('./layer'); -var methods = require('methods'); -var utils = require('../utils'); - -/** - * Expose `Route`. - */ - -module.exports = Route; - -/** - * Initialize `Route` with the given `path`, - * - * @param {String} path - * @api private - */ - -function Route(path) { - debug('new %s', path); - this.path = path; - this.stack = []; - - // route handlers for various http methods - this.methods = {}; -} - -/** - * @api private - */ - -Route.prototype._handles_method = function _handles_method(method) { - if (this.methods._all) { - return true; - } - - method = method.toLowerCase(); - - if (method === 'head' && !this.methods['head']) { - method = 'get'; - } - - return Boolean(this.methods[method]); -}; - -/** - * @return {Array} supported HTTP methods - * @api private - */ - -Route.prototype._options = function(){ - return Object.keys(this.methods).map(function(method) { - return method.toUpperCase(); - }); -}; - -/** - * dispatch req, res into this route - * - * @api private - */ - -Route.prototype.dispatch = function(req, res, done){ - var idx = 0; - var stack = this.stack; - if (stack.length === 0) { - return done(); - } - - var method = req.method.toLowerCase(); - if (method === 'head' && !this.methods['head']) { - method = 'get'; - } - - req.route = this; - - next(); - - function next(err) { - if (err && err === 'route') { - return done(); - } - - var layer = stack[idx++]; - if (!layer) { - return done(err); - } - - if (layer.method && layer.method !== method) { - return next(err); - } - - if (err) { - layer.handle_error(err, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Add a handler for all HTTP verbs to this route. - * - * Behaves just like middleware and can respond or call `next` - * to continue processing. - * - * You can use multiple `.all` call to add multiple handlers. - * - * function check_something(req, res, next){ - * next(); - * }; - * - * function validate_user(req, res, next){ - * next(); - * }; - * - * route - * .all(validate_user) - * .all(check_something) - * .get(function(req, res, next){ - * res.send('hello world'); - * }); - * - * @param {function} handler - * @return {Route} for chaining - * @api public - */ - -Route.prototype.all = function(){ - var self = this; - var callbacks = utils.flatten([].slice.call(arguments)); - callbacks.forEach(function(fn) { - if (typeof fn !== 'function') { - var type = {}.toString.call(fn); - var msg = 'Route.all() requires callback functions but got a ' + type; - throw new Error(msg); - } - - var layer = Layer('/', {}, fn); - layer.method = undefined; - - self.methods._all = true; - self.stack.push(layer); - }); - - return self; -}; - -methods.forEach(function(method){ - Route.prototype[method] = function(){ - var self = this; - var callbacks = utils.flatten([].slice.call(arguments)); - - callbacks.forEach(function(fn) { - if (typeof fn !== 'function') { - var type = {}.toString.call(fn); - var msg = 'Route.' + method + '() requires callback functions but got a ' + type; - throw new Error(msg); - } - - debug('%s %s', method, self.path); - - var layer = Layer('/', {}, fn); - layer.method = method; - - self.methods[method] = true; - self.stack.push(layer); - }); - return self; - }; -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/utils.js deleted file mode 100644 index 9f9fdfd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/utils.js +++ /dev/null @@ -1,302 +0,0 @@ -/** - * Module dependencies. - */ - -var mime = require('send').mime; -var crc32 = require('buffer-crc32'); -var crypto = require('crypto'); -var basename = require('path').basename; -var proxyaddr = require('proxy-addr'); -var qs = require('qs'); -var querystring = require('querystring'); -var typer = require('media-typer'); - -/** - * Return strong ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.etag = function etag(body, encoding){ - if (body.length === 0) { - // fast-path empty body - return '"1B2M2Y8AsgTpgAmY7PhCfg=="' - } - - var hash = crypto - .createHash('md5') - .update(body, encoding) - .digest('base64') - return '"' + hash + '"' -}; - -/** - * Return weak ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.wetag = function wetag(body, encoding){ - if (body.length === 0) { - // fast-path empty body - return 'W/"0-0"' - } - - var buf = Buffer.isBuffer(body) - ? body - : new Buffer(body, encoding) - var len = buf.length - return 'W/"' + len.toString(16) + '-' + crc32.unsigned(buf) + '"' -}; - -/** - * 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; - if ('\\\\' == path.substring(0, 2)) return true; // Microsoft Azure absolute path -}; - -/** - * Flatten the given `arr`. - * - * @param {Array} arr - * @return {Array} - * @api private - */ - -exports.flatten = function(arr, ret){ - ret = ret || []; - var len = arr.length; - for (var i = 0; i < len; ++i) { - if (Array.isArray(arr[i])) { - exports.flatten(arr[i], ret); - } else { - ret.push(arr[i]); - } - } - return ret; -}; - -/** - * Normalize the given `type`, for example "html" becomes "text/html". - * - * @param {String} type - * @return {Object} - * @api private - */ - -exports.normalizeType = function(type){ - return ~type.indexOf('/') - ? acceptParams(type) - : { value: mime.lookup(type), params: {} }; -}; - -/** - * Normalize `types`, for example "html" becomes "text/html". - * - * @param {Array} types - * @return {Array} - * @api private - */ - -exports.normalizeTypes = function(types){ - var ret = []; - - for (var i = 0; i < types.length; ++i) { - ret.push(exports.normalizeType(types[i])); - } - - return ret; -}; - -/** - * Generate Content-Disposition header appropriate for the filename. - * non-ascii filenames are urlencoded and a filename* parameter is added - * - * @param {String} filename - * @return {String} - * @api private - */ - -exports.contentDisposition = function(filename){ - var ret = 'attachment'; - if (filename) { - filename = basename(filename); - // if filename contains non-ascii characters, add a utf-8 version ala RFC 5987 - ret = /[^\040-\176]/.test(filename) - ? 'attachment; filename="' + encodeURI(filename) + '"; filename*=UTF-8\'\'' + encodeURI(filename) - : 'attachment; filename="' + filename + '"'; - } - - return ret; -}; - -/** - * Parse accept params `str` returning an - * object with `.value`, `.quality` and `.params`. - * also includes `.originalIndex` for stable sorting - * - * @param {String} str - * @return {Object} - * @api private - */ - -function acceptParams(str, index) { - var parts = str.split(/ *; */); - var ret = { value: parts[0], quality: 1, params: {}, originalIndex: index }; - - for (var i = 1; i < parts.length; ++i) { - var pms = parts[i].split(/ *= */); - if ('q' == pms[0]) { - ret.quality = parseFloat(pms[1]); - } else { - ret.params[pms[0]] = pms[1]; - } - } - - return ret; -} - -/** - * Compile "etag" value to function. - * - * @param {Boolean|String|Function} val - * @return {Function} - * @api private - */ - -exports.compileETag = function(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = exports.wetag; - break; - case false: - break; - case 'strong': - fn = exports.etag; - break; - case 'weak': - fn = exports.wetag; - break; - default: - throw new TypeError('unknown value for etag function: ' + val); - } - - return fn; -} - -/** - * Compile "query parser" value to function. - * - * @param {String|Function} val - * @return {Function} - * @api private - */ - -exports.compileQueryParser = function compileQueryParser(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = querystring.parse; - break; - case false: - fn = newObject; - break; - case 'extended': - fn = qs.parse; - break; - case 'simple': - fn = querystring.parse; - break; - default: - throw new TypeError('unknown value for query parser function: ' + val); - } - - return fn; -} - -/** - * Compile "proxy trust" value to function. - * - * @param {Boolean|String|Number|Array|Function} val - * @return {Function} - * @api private - */ - -exports.compileTrust = function(val) { - if (typeof val === 'function') return val; - - if (val === true) { - // Support plain true/false - return function(){ return true }; - } - - if (typeof val === 'number') { - // Support trusting hop count - return function(a, i){ return i < val }; - } - - if (typeof val === 'string') { - // Support comma-separated values - val = val.split(/ *, */); - } - - return proxyaddr.compile(val || []); -} - -/** - * Set the charset in a given Content-Type string. - * - * @param {String} type - * @param {String} charset - * @return {String} - * @api private - */ - -exports.setCharset = function(type, charset){ - if (!type || !charset) return type; - - // parse type - var parsed = typer.parse(type); - - // set charset - parsed.parameters.charset = charset; - - // format type - return typer.format(parsed); -}; - -/** - * Return new empty objet. - * - * @return {Object} - * @api private - */ - -function newObject() { - return {}; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/view.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/view.js deleted file mode 100644 index 989e8bb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/lib/view.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Module dependencies. - */ - -var path = require('path'); -var fs = require('fs'); -var utils = require('./utils'); -var dirname = path.dirname; -var basename = path.basename; -var extname = path.extname; -var exists = fs.existsSync || path.existsSync; -var join = path.join; - -/** - * Expose `View`. - */ - -module.exports = View; - -/** - * Initialize a new `View` with the given `name`. - * - * Options: - * - * - `defaultEngine` the default template engine name - * - `engines` template engine require() cache - * - `root` root path for view lookup - * - * @param {String} name - * @param {Object} options - * @api private - */ - -function View(name, options) { - options = options || {}; - this.name = name; - this.root = options.root; - var engines = options.engines; - this.defaultEngine = options.defaultEngine; - var ext = this.ext = extname(name); - if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no extension was provided.'); - if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') + this.defaultEngine); - this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express); - this.path = this.lookup(name); -} - -/** - * Lookup view by the given `path` - * - * @param {String} path - * @return {String} - * @api private - */ - -View.prototype.lookup = function(path){ - var ext = this.ext; - - // . - if (!utils.isAbsolute(path)) path = join(this.root, path); - if (exists(path)) return path; - - // /index. - path = join(dirname(path), basename(path, ext), 'index' + ext); - if (exists(path)) return path; -}; - -/** - * Render with the given `options` and callback `fn(err, str)`. - * - * @param {Object} options - * @param {Function} fn - * @api private - */ - -View.prototype.render = function(options, fn){ - this.engine(this.path, options, fn); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/History.md deleted file mode 100644 index 6403131..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/History.md +++ /dev/null @@ -1,42 +0,0 @@ -1.0.7 / 2014-07-04 -================== - - * Fix wrong type returned from `type` when match after unknown extension - -1.0.6 / 2014-06-24 -================== - - * deps: negotiator@0.4.7 - -1.0.5 / 2014-06-20 -================== - - * fix crash when unknown extension given - -1.0.4 / 2014-06-19 -================== - - * use `mime-types` - -1.0.3 / 2014-06-11 -================== - - * deps: negotiator@0.4.6 - - Order by specificity when quality is the same - -1.0.2 / 2014-05-29 -================== - - * Fix interpretation when header not in request - * deps: pin negotiator@0.4.5 - -1.0.1 / 2014-01-18 -================== - - * Identity encoding isn't always acceptable - * deps: negotiator@~0.4.0 - -1.0.0 / 2013-12-27 -================== - - * Genesis diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/README.md deleted file mode 100644 index f65596a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# Accepts - -[![NPM version](https://badge.fury.io/js/accepts.svg)](http://badge.fury.io/js/accepts) -[![Build Status](https://travis-ci.org/expressjs/accepts.svg?branch=master)](https://travis-ci.org/expressjs/accepts) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/accepts.svg?branch=master)](https://coveralls.io/r/expressjs/accepts) - -Higher level content negotation based on [negotiator](https://github.com/federomero/negotiator). Extracted from [koa](https://github.com/koajs/koa) for general use. - -In addition to negotatior, it allows: - -- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` as well as `('text/html', 'application/json')`. -- Allows type shorthands such as `json`. -- Returns `false` when no types match -- Treats non-existent headers as `*` - -## API - -### var accept = new Accepts(req) - -```js -var accepts = require('accepts') - -http.createServer(function (req, res) { - var accept = accepts(req) -}) -``` - -### accept\[property\]\(\) - -Returns all the explicitly accepted content property as an array in descending priority. - -- `accept.types()` -- `accept.encodings()` -- `accept.charsets()` -- `accept.languages()` - -They are also aliased in singular form such as `accept.type()`. `accept.languages()` is also aliased as `accept.langs()`, etc. - -Note: you should almost never do this in a real app as it defeats the purpose of content negotiation. - -Example: - -```js -// in Google Chrome -var encodings = accept.encodings() // -> ['sdch', 'gzip', 'deflate'] -``` - -Since you probably don't support `sdch`, you should just supply the encodings you support: - -```js -var encoding = accept.encodings('gzip', 'deflate') // -> 'gzip', probably -``` - -### accept\[property\]\(values, ...\) - -You can either have `values` be an array or have an argument list of values. - -If the client does not accept any `values`, `false` will be returned. -If the client accepts any `values`, the preferred `value` will be return. - -For `accept.types()`, shorthand mime types are allowed. - -Example: - -```js -// req.headers.accept = 'application/json' - -accept.types('json') // -> 'json' -accept.types('html', 'json') // -> 'json' -accept.types('html') // -> false - -// req.headers.accept = '' -// which is equivalent to `*` - -accept.types() // -> [], no explicit types -accept.types('text/html', 'text/json') // -> 'text/html', since it was first -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/index.js deleted file mode 100644 index 805e33a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/index.js +++ /dev/null @@ -1,160 +0,0 @@ -var Negotiator = require('negotiator') -var mime = require('mime-types') - -var slice = [].slice - -module.exports = Accepts - -function Accepts(req) { - if (!(this instanceof Accepts)) - return new Accepts(req) - - this.headers = req.headers - this.negotiator = Negotiator(req) -} - -/** - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json" or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * this.types('html'); - * // => "html" - * - * // Accept: text/*, application/json - * this.types('html'); - * // => "html" - * this.types('text/html'); - * // => "text/html" - * this.types('json', 'text'); - * // => "json" - * this.types('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * this.types('image/png'); - * this.types('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * this.types(['html', 'json']); - * this.types('html', 'json'); - * // => "json" - * - * @param {String|Array} type(s)... - * @return {String|Array|Boolean} - * @api public - */ - -Accepts.prototype.type = -Accepts.prototype.types = function (types) { - if (!Array.isArray(types)) types = slice.call(arguments); - var n = this.negotiator; - if (!types.length) return n.mediaTypes(); - if (!this.headers.accept) return types[0]; - var mimes = types.map(extToMime); - var accepts = n.mediaTypes(mimes.filter(validMime)); - var first = accepts[0]; - if (!first) return false; - return types[mimes.indexOf(first)]; -} - -/** - * Return accepted encodings or best fit based on `encodings`. - * - * Given `Accept-Encoding: gzip, deflate` - * an array sorted by quality is returned: - * - * ['gzip', 'deflate'] - * - * @param {String|Array} encoding(s)... - * @return {String|Array} - * @api public - */ - -Accepts.prototype.encoding = -Accepts.prototype.encodings = function (encodings) { - if (!Array.isArray(encodings)) encodings = slice.call(arguments); - var n = this.negotiator; - if (!encodings.length) return n.encodings(); - return n.encodings(encodings)[0] || false; -} - -/** - * Return accepted charsets or best fit based on `charsets`. - * - * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` - * an array sorted by quality is returned: - * - * ['utf-8', 'utf-7', 'iso-8859-1'] - * - * @param {String|Array} charset(s)... - * @return {String|Array} - * @api public - */ - -Accepts.prototype.charset = -Accepts.prototype.charsets = function (charsets) { - if (!Array.isArray(charsets)) charsets = [].slice.call(arguments); - var n = this.negotiator; - if (!charsets.length) return n.charsets(); - if (!this.headers['accept-charset']) return charsets[0]; - return n.charsets(charsets)[0] || false; -} - -/** - * Return accepted languages or best fit based on `langs`. - * - * Given `Accept-Language: en;q=0.8, es, pt` - * an array sorted by quality is returned: - * - * ['es', 'pt', 'en'] - * - * @param {String|Array} lang(s)... - * @return {Array|String} - * @api public - */ - -Accepts.prototype.lang = -Accepts.prototype.langs = -Accepts.prototype.language = -Accepts.prototype.languages = function (langs) { - if (!Array.isArray(langs)) langs = slice.call(arguments); - var n = this.negotiator; - if (!langs.length) return n.languages(); - if (!this.headers['accept-language']) return langs[0]; - return n.languages(langs)[0] || false; -} - -/** - * Convert extnames to mime. - * - * @param {String} type - * @return {String} - * @api private - */ - -function extToMime(type) { - if (~type.indexOf('/')) return type; - return mime.lookup(type); -} - -/** - * Check if mime is valid. - * - * @param {String} type - * @return {String} - * @api private - */ - -function validMime(type) { - return typeof type === 'string'; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore deleted file mode 100644 index 919d51b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -test -build.js - -# OS generated files # -###################### -.DS_Store* -# Icon? -ehthumbs.db -Thumbs.db - -# Node.js # -########### -node_modules -npm-debug.log diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml deleted file mode 100644 index 73c85c6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" - - "0.11" -matrix: - allow_failures: - - node_js: "0.11" - fast_finish: true -before_install: - # remove build script deps before install - - node -pe 'f="./package.json";p=require(f);d=p.devDependencies;for(k in d){if("co"===k.substr(0,2))delete d[k]}require("fs").writeFileSync(f,JSON.stringify(p,null,2))' diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile deleted file mode 100644 index ceaf011..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -build: - node --harmony-generators build.js - -test: - node test/mime.js - mocha --require should --reporter spec test/test.js - -.PHONY: build test diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md deleted file mode 100644 index 8e21ee1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# mime-types -[![NPM version](https://badge.fury.io/js/mime-types.svg)](https://badge.fury.io/js/mime-types) [![Build Status](https://travis-ci.org/expressjs/mime-types.svg?branch=master)](https://travis-ci.org/expressjs/mime-types) - -The ultimate javascript content-type utility. - -### Install - -```sh -$ npm install mime-types -``` - -#### Similar to [node-mime](https://github.com/broofa/node-mime), except: - -- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. -- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. -- Additional mime types are added such as jade and stylus. Feel free to add more! -- Browser support via Browserify and Component by converting lists to JSON files. - -Otherwise, the API is compatible. - -### Adding Types - -If you'd like to add additional types, -simply create a PR adding the type to `custom.json` and -a reference link to the [sources](SOURCES.md). - -Do __NOT__ edit `mime.json` or `node.json`. -Those are pulled using `build.js`. -You should only touch `custom.json`. - -## API - -```js -var mime = require('mime-types') -``` - -All functions return `false` if input is invalid or not found. - -### mime.lookup(path) - -Lookup the content-type associated with a file. - -```js -mime.lookup('json') // 'application/json' -mime.lookup('.md') // 'text/x-markdown' -mime.lookup('file.html') // 'text/html' -mime.lookup('folder/file.js') // 'application/javascript' - -mime.lookup('cats') // false -``` - -### mime.contentType(type) - -Create a full content-type header given a content-type or extension. - -```js -mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' -mime.contentType('file.json') // 'application/json; charset=utf-8' -``` - -### mime.extension(type) - -Get the default extension for a content-type. - -```js -mime.extension('application/octet-stream') // 'bin' -``` - -### mime.charset(type) - -Lookup the implied default charset of a content-type. - -```js -mime.charset('text/x-markdown') // 'UTF-8' -``` - -### mime.types[extension] = type - -A map of content-types by extension. - -### mime.extensions[type] = [extensions] - -A map of extensions by content-type. - -### mime.define(types) - -Globally add definitions. -`types` must be an object of the form: - -```js -{ - "": [extensions...], - "": [extensions...] -} -``` - -See the `.json` files in `lib/` for examples. - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md deleted file mode 100644 index 1d65012..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md +++ /dev/null @@ -1,17 +0,0 @@ - -### Sources for custom types - -This is a list of sources for any custom mime types. -When adding custom mime types, please link to where you found the mime type, -even if it's from an unofficial source. - -- `text/coffeescript` - http://coffeescript.org/#scripts -- `text/x-handlebars-template` - https://handlebarsjs.com/#getting-started -- `text/x-sass` & `text/x-scss` - https://github.com/janlelis/rubybuntu-mime/blob/master/sass.xml -- `text.jsx` - http://facebook.github.io/react/docs/getting-started.html [[2]](https://github.com/facebook/react/blob/f230e0a03154e6f8a616e0da1fb3d97ffa1a6472/vendor/browser-transforms.js#L210) - -[Sources for node.json types](https://github.com/broofa/node-mime/blob/master/types/node.types) - -### Notes on weird types - -- `font/opentype` - This type is technically invalid according to the spec. No valid types begin with `font/`. No-one uses the official type of `application/vnd.ms-opentype` as the community standardized `application/x-font-otf`. However, chrome logs nonsense warnings unless opentype fonts are served with `font/opentype`. [[1]](http://stackoverflow.com/questions/2871655/proper-mime-type-for-fonts) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json deleted file mode 100644 index fa67a6d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "0.1.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com", - "twitter": "https://twitter.com/jongleberry" - }, - "repository": "expressjs/mime-types", - "license": "MIT", - "main": "lib/index.js", - "scripts": ["lib/index.js"], - "json": ["mime.json", "node.json", "custom.json"] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json deleted file mode 100644 index 6137da3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "text/jade": [ - "jade" - ], - "text/stylus": [ - "stylus", - "styl" - ], - "text/less": [ - "less" - ], - "text/x-sass": [ - "sass" - ], - "text/x-scss": [ - "scss" - ], - "text/coffeescript": [ - "coffee" - ], - "text/x-handlebars-template": [ - "hbs" - ], - "text/jsx": [ - "jsx" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js deleted file mode 100644 index 27559ea..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js +++ /dev/null @@ -1,74 +0,0 @@ - -// types[extension] = type -exports.types = Object.create(null) -// extensions[type] = [extensions] -exports.extensions = Object.create(null) -// define more mime types -exports.define = define - -// store the json files -exports.json = { - mime: require('./mime.json'), - node: require('./node.json'), - custom: require('./custom.json'), -} - -exports.lookup = function (string) { - if (!string || typeof string !== "string") return false - string = string.replace(/.*[\.\/\\]/, '').toLowerCase() - if (!string) return false - return exports.types[string] || false -} - -exports.extension = function (type) { - if (!type || typeof type !== "string") return false - type = type.match(/^\s*([^;\s]*)(?:;|\s|$)/) - if (!type) return false - var exts = exports.extensions[type[1].toLowerCase()] - if (!exts || !exts.length) return false - return exts[0] -} - -// type has to be an exact mime type -exports.charset = function (type) { - // special cases - switch (type) { - case 'application/json': return 'UTF-8' - } - - // default text/* to utf-8 - if (/^text\//.test(type)) return 'UTF-8' - - return false -} - -// backwards compatibility -exports.charsets = { - lookup: exports.charset -} - -exports.contentType = function (type) { - if (!type || typeof type !== "string") return false - if (!~type.indexOf('/')) type = exports.lookup(type) - if (!type) return false - if (!~type.indexOf('charset')) { - var charset = exports.charset(type) - if (charset) type += '; charset=' + charset.toLowerCase() - } - return type -} - -define(exports.json.mime) -define(exports.json.node) -define(exports.json.custom) - -function define(json) { - Object.keys(json).forEach(function (type) { - var exts = json[type] || [] - exports.extensions[type] = exports.extensions[type] || [] - exts.forEach(function (ext) { - if (!~exports.extensions[type].indexOf(ext)) exports.extensions[type].push(ext) - exports.types[ext] = type - }) - }) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json deleted file mode 100644 index f445a86..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json +++ /dev/null @@ -1,3317 +0,0 @@ -{ - "application/1d-interleaved-parityfec": [], - "application/3gpp-ims+xml": [], - "application/activemessage": [], - "application/andrew-inset": [ - "ez" - ], - "application/applefile": [], - "application/applixware": [ - "aw" - ], - "application/atom+xml": [ - "atom" - ], - "application/atomcat+xml": [ - "atomcat" - ], - "application/atomicmail": [], - "application/atomsvc+xml": [ - "atomsvc" - ], - "application/auth-policy+xml": [], - "application/batch-smtp": [], - "application/beep+xml": [], - "application/calendar+xml": [], - "application/cals-1840": [], - "application/ccmp+xml": [], - "application/ccxml+xml": [ - "ccxml" - ], - "application/cdmi-capability": [ - "cdmia" - ], - "application/cdmi-container": [ - "cdmic" - ], - "application/cdmi-domain": [ - "cdmid" - ], - "application/cdmi-object": [ - "cdmio" - ], - "application/cdmi-queue": [ - "cdmiq" - ], - "application/cea-2018+xml": [], - "application/cellml+xml": [], - "application/cfw": [], - "application/cnrp+xml": [], - "application/commonground": [], - "application/conference-info+xml": [], - "application/cpl+xml": [], - "application/csta+xml": [], - "application/cstadata+xml": [], - "application/cu-seeme": [ - "cu" - ], - "application/cybercash": [], - "application/davmount+xml": [ - "davmount" - ], - "application/dca-rft": [], - "application/dec-dx": [], - "application/dialog-info+xml": [], - "application/dicom": [], - "application/dns": [], - "application/docbook+xml": [ - "dbk" - ], - "application/dskpp+xml": [], - "application/dssc+der": [ - "dssc" - ], - "application/dssc+xml": [ - "xdssc" - ], - "application/dvcs": [], - "application/ecmascript": [ - "ecma" - ], - "application/edi-consent": [], - "application/edi-x12": [], - "application/edifact": [], - "application/emma+xml": [ - "emma" - ], - "application/epp+xml": [], - "application/epub+zip": [ - "epub" - ], - "application/eshop": [], - "application/example": [], - "application/exi": [ - "exi" - ], - "application/fastinfoset": [], - "application/fastsoap": [], - "application/fits": [], - "application/font-tdpfr": [ - "pfr" - ], - "application/framework-attributes+xml": [], - "application/gml+xml": [ - "gml" - ], - "application/gpx+xml": [ - "gpx" - ], - "application/gxf": [ - "gxf" - ], - "application/h224": [], - "application/held+xml": [], - "application/http": [], - "application/hyperstudio": [ - "stk" - ], - "application/ibe-key-request+xml": [], - "application/ibe-pkg-reply+xml": [], - "application/ibe-pp-data": [], - "application/iges": [], - "application/im-iscomposing+xml": [], - "application/index": [], - "application/index.cmd": [], - "application/index.obj": [], - "application/index.response": [], - "application/index.vnd": [], - "application/inkml+xml": [ - "ink", - "inkml" - ], - "application/iotp": [], - "application/ipfix": [ - "ipfix" - ], - "application/ipp": [], - "application/isup": [], - "application/java-archive": [ - "jar" - ], - "application/java-serialized-object": [ - "ser" - ], - "application/java-vm": [ - "class" - ], - "application/javascript": [ - "js" - ], - "application/json": [ - "json" - ], - "application/jsonml+json": [ - "jsonml" - ], - "application/kpml-request+xml": [], - "application/kpml-response+xml": [], - "application/lost+xml": [ - "lostxml" - ], - "application/mac-binhex40": [ - "hqx" - ], - "application/mac-compactpro": [ - "cpt" - ], - "application/macwriteii": [], - "application/mads+xml": [ - "mads" - ], - "application/marc": [ - "mrc" - ], - "application/marcxml+xml": [ - "mrcx" - ], - "application/mathematica": [ - "ma", - "nb", - "mb" - ], - "application/mathml-content+xml": [], - "application/mathml-presentation+xml": [], - "application/mathml+xml": [ - "mathml" - ], - "application/mbms-associated-procedure-description+xml": [], - "application/mbms-deregister+xml": [], - "application/mbms-envelope+xml": [], - "application/mbms-msk+xml": [], - "application/mbms-msk-response+xml": [], - "application/mbms-protection-description+xml": [], - "application/mbms-reception-report+xml": [], - "application/mbms-register+xml": [], - "application/mbms-register-response+xml": [], - "application/mbms-user-service-description+xml": [], - "application/mbox": [ - "mbox" - ], - "application/media_control+xml": [], - "application/mediaservercontrol+xml": [ - "mscml" - ], - "application/metalink+xml": [ - "metalink" - ], - "application/metalink4+xml": [ - "meta4" - ], - "application/mets+xml": [ - "mets" - ], - "application/mikey": [], - "application/mods+xml": [ - "mods" - ], - "application/moss-keys": [], - "application/moss-signature": [], - "application/mosskey-data": [], - "application/mosskey-request": [], - "application/mp21": [ - "m21", - "mp21" - ], - "application/mp4": [ - "mp4s" - ], - "application/mpeg4-generic": [], - "application/mpeg4-iod": [], - "application/mpeg4-iod-xmt": [], - "application/msc-ivr+xml": [], - "application/msc-mixer+xml": [], - "application/msword": [ - "doc", - "dot" - ], - "application/mxf": [ - "mxf" - ], - "application/nasdata": [], - "application/news-checkgroups": [], - "application/news-groupinfo": [], - "application/news-transmission": [], - "application/nss": [], - "application/ocsp-request": [], - "application/ocsp-response": [], - "application/octet-stream": [ - "bin", - "dms", - "lrf", - "mar", - "so", - "dist", - "distz", - "pkg", - "bpk", - "dump", - "elc", - "deploy" - ], - "application/oda": [ - "oda" - ], - "application/oebps-package+xml": [ - "opf" - ], - "application/ogg": [ - "ogx" - ], - "application/omdoc+xml": [ - "omdoc" - ], - "application/onenote": [ - "onetoc", - "onetoc2", - "onetmp", - "onepkg" - ], - "application/oxps": [ - "oxps" - ], - "application/parityfec": [], - "application/patch-ops-error+xml": [ - "xer" - ], - "application/pdf": [ - "pdf" - ], - "application/pgp-encrypted": [ - "pgp" - ], - "application/pgp-keys": [], - "application/pgp-signature": [ - "asc", - "sig" - ], - "application/pics-rules": [ - "prf" - ], - "application/pidf+xml": [], - "application/pidf-diff+xml": [], - "application/pkcs10": [ - "p10" - ], - "application/pkcs7-mime": [ - "p7m", - "p7c" - ], - "application/pkcs7-signature": [ - "p7s" - ], - "application/pkcs8": [ - "p8" - ], - "application/pkix-attr-cert": [ - "ac" - ], - "application/pkix-cert": [ - "cer" - ], - "application/pkix-crl": [ - "crl" - ], - "application/pkix-pkipath": [ - "pkipath" - ], - "application/pkixcmp": [ - "pki" - ], - "application/pls+xml": [ - "pls" - ], - "application/poc-settings+xml": [], - "application/postscript": [ - "ai", - "eps", - "ps" - ], - "application/prs.alvestrand.titrax-sheet": [], - "application/prs.cww": [ - "cww" - ], - "application/prs.nprend": [], - "application/prs.plucker": [], - "application/prs.rdf-xml-crypt": [], - "application/prs.xsf+xml": [], - "application/pskc+xml": [ - "pskcxml" - ], - "application/qsig": [], - "application/rdf+xml": [ - "rdf" - ], - "application/reginfo+xml": [ - "rif" - ], - "application/relax-ng-compact-syntax": [ - "rnc" - ], - "application/remote-printing": [], - "application/resource-lists+xml": [ - "rl" - ], - "application/resource-lists-diff+xml": [ - "rld" - ], - "application/riscos": [], - "application/rlmi+xml": [], - "application/rls-services+xml": [ - "rs" - ], - "application/rpki-ghostbusters": [ - "gbr" - ], - "application/rpki-manifest": [ - "mft" - ], - "application/rpki-roa": [ - "roa" - ], - "application/rpki-updown": [], - "application/rsd+xml": [ - "rsd" - ], - "application/rss+xml": [ - "rss" - ], - "application/rtf": [ - "rtf" - ], - "application/rtx": [], - "application/samlassertion+xml": [], - "application/samlmetadata+xml": [], - "application/sbml+xml": [ - "sbml" - ], - "application/scvp-cv-request": [ - "scq" - ], - "application/scvp-cv-response": [ - "scs" - ], - "application/scvp-vp-request": [ - "spq" - ], - "application/scvp-vp-response": [ - "spp" - ], - "application/sdp": [ - "sdp" - ], - "application/set-payment": [], - "application/set-payment-initiation": [ - "setpay" - ], - "application/set-registration": [], - "application/set-registration-initiation": [ - "setreg" - ], - "application/sgml": [], - "application/sgml-open-catalog": [], - "application/shf+xml": [ - "shf" - ], - "application/sieve": [], - "application/simple-filter+xml": [], - "application/simple-message-summary": [], - "application/simplesymbolcontainer": [], - "application/slate": [], - "application/smil": [], - "application/smil+xml": [ - "smi", - "smil" - ], - "application/soap+fastinfoset": [], - "application/soap+xml": [], - "application/sparql-query": [ - "rq" - ], - "application/sparql-results+xml": [ - "srx" - ], - "application/spirits-event+xml": [], - "application/srgs": [ - "gram" - ], - "application/srgs+xml": [ - "grxml" - ], - "application/sru+xml": [ - "sru" - ], - "application/ssdl+xml": [ - "ssdl" - ], - "application/ssml+xml": [ - "ssml" - ], - "application/tamp-apex-update": [], - "application/tamp-apex-update-confirm": [], - "application/tamp-community-update": [], - "application/tamp-community-update-confirm": [], - "application/tamp-error": [], - "application/tamp-sequence-adjust": [], - "application/tamp-sequence-adjust-confirm": [], - "application/tamp-status-query": [], - "application/tamp-status-response": [], - "application/tamp-update": [], - "application/tamp-update-confirm": [], - "application/tei+xml": [ - "tei", - "teicorpus" - ], - "application/thraud+xml": [ - "tfi" - ], - "application/timestamp-query": [], - "application/timestamp-reply": [], - "application/timestamped-data": [ - "tsd" - ], - "application/tve-trigger": [], - "application/ulpfec": [], - "application/vcard+xml": [], - "application/vemmi": [], - "application/vividence.scriptfile": [], - "application/vnd.3gpp.bsf+xml": [], - "application/vnd.3gpp.pic-bw-large": [ - "plb" - ], - "application/vnd.3gpp.pic-bw-small": [ - "psb" - ], - "application/vnd.3gpp.pic-bw-var": [ - "pvb" - ], - "application/vnd.3gpp.sms": [], - "application/vnd.3gpp2.bcmcsinfo+xml": [], - "application/vnd.3gpp2.sms": [], - "application/vnd.3gpp2.tcap": [ - "tcap" - ], - "application/vnd.3m.post-it-notes": [ - "pwn" - ], - "application/vnd.accpac.simply.aso": [ - "aso" - ], - "application/vnd.accpac.simply.imp": [ - "imp" - ], - "application/vnd.acucobol": [ - "acu" - ], - "application/vnd.acucorp": [ - "atc", - "acutc" - ], - "application/vnd.adobe.air-application-installer-package+zip": [ - "air" - ], - "application/vnd.adobe.formscentral.fcdt": [ - "fcdt" - ], - "application/vnd.adobe.fxp": [ - "fxp", - "fxpl" - ], - "application/vnd.adobe.partial-upload": [], - "application/vnd.adobe.xdp+xml": [ - "xdp" - ], - "application/vnd.adobe.xfdf": [ - "xfdf" - ], - "application/vnd.aether.imp": [], - "application/vnd.ah-barcode": [], - "application/vnd.ahead.space": [ - "ahead" - ], - "application/vnd.airzip.filesecure.azf": [ - "azf" - ], - "application/vnd.airzip.filesecure.azs": [ - "azs" - ], - "application/vnd.amazon.ebook": [ - "azw" - ], - "application/vnd.americandynamics.acc": [ - "acc" - ], - "application/vnd.amiga.ami": [ - "ami" - ], - "application/vnd.amundsen.maze+xml": [], - "application/vnd.android.package-archive": [ - "apk" - ], - "application/vnd.anser-web-certificate-issue-initiation": [ - "cii" - ], - "application/vnd.anser-web-funds-transfer-initiation": [ - "fti" - ], - "application/vnd.antix.game-component": [ - "atx" - ], - "application/vnd.apple.installer+xml": [ - "mpkg" - ], - "application/vnd.apple.mpegurl": [ - "m3u8" - ], - "application/vnd.arastra.swi": [], - "application/vnd.aristanetworks.swi": [ - "swi" - ], - "application/vnd.astraea-software.iota": [ - "iota" - ], - "application/vnd.audiograph": [ - "aep" - ], - "application/vnd.autopackage": [], - "application/vnd.avistar+xml": [], - "application/vnd.blueice.multipass": [ - "mpm" - ], - "application/vnd.bluetooth.ep.oob": [], - "application/vnd.bmi": [ - "bmi" - ], - "application/vnd.businessobjects": [ - "rep" - ], - "application/vnd.cab-jscript": [], - "application/vnd.canon-cpdl": [], - "application/vnd.canon-lips": [], - "application/vnd.cendio.thinlinc.clientconf": [], - "application/vnd.chemdraw+xml": [ - "cdxml" - ], - "application/vnd.chipnuts.karaoke-mmd": [ - "mmd" - ], - "application/vnd.cinderella": [ - "cdy" - ], - "application/vnd.cirpack.isdn-ext": [], - "application/vnd.claymore": [ - "cla" - ], - "application/vnd.cloanto.rp9": [ - "rp9" - ], - "application/vnd.clonk.c4group": [ - "c4g", - "c4d", - "c4f", - "c4p", - "c4u" - ], - "application/vnd.cluetrust.cartomobile-config": [ - "c11amc" - ], - "application/vnd.cluetrust.cartomobile-config-pkg": [ - "c11amz" - ], - "application/vnd.collection+json": [], - "application/vnd.commerce-battelle": [], - "application/vnd.commonspace": [ - "csp" - ], - "application/vnd.contact.cmsg": [ - "cdbcmsg" - ], - "application/vnd.cosmocaller": [ - "cmc" - ], - "application/vnd.crick.clicker": [ - "clkx" - ], - "application/vnd.crick.clicker.keyboard": [ - "clkk" - ], - "application/vnd.crick.clicker.palette": [ - "clkp" - ], - "application/vnd.crick.clicker.template": [ - "clkt" - ], - "application/vnd.crick.clicker.wordbank": [ - "clkw" - ], - "application/vnd.criticaltools.wbs+xml": [ - "wbs" - ], - "application/vnd.ctc-posml": [ - "pml" - ], - "application/vnd.ctct.ws+xml": [], - "application/vnd.cups-pdf": [], - "application/vnd.cups-postscript": [], - "application/vnd.cups-ppd": [ - "ppd" - ], - "application/vnd.cups-raster": [], - "application/vnd.cups-raw": [], - "application/vnd.curl": [], - "application/vnd.curl.car": [ - "car" - ], - "application/vnd.curl.pcurl": [ - "pcurl" - ], - "application/vnd.cybank": [], - "application/vnd.dart": [ - "dart" - ], - "application/vnd.data-vision.rdz": [ - "rdz" - ], - "application/vnd.dece.data": [ - "uvf", - "uvvf", - "uvd", - "uvvd" - ], - "application/vnd.dece.ttml+xml": [ - "uvt", - "uvvt" - ], - "application/vnd.dece.unspecified": [ - "uvx", - "uvvx" - ], - "application/vnd.dece.zip": [ - "uvz", - "uvvz" - ], - "application/vnd.denovo.fcselayout-link": [ - "fe_launch" - ], - "application/vnd.dir-bi.plate-dl-nosuffix": [], - "application/vnd.dna": [ - "dna" - ], - "application/vnd.dolby.mlp": [ - "mlp" - ], - "application/vnd.dolby.mobile.1": [], - "application/vnd.dolby.mobile.2": [], - "application/vnd.dpgraph": [ - "dpg" - ], - "application/vnd.dreamfactory": [ - "dfac" - ], - "application/vnd.ds-keypoint": [ - "kpxx" - ], - "application/vnd.dvb.ait": [ - "ait" - ], - "application/vnd.dvb.dvbj": [], - "application/vnd.dvb.esgcontainer": [], - "application/vnd.dvb.ipdcdftnotifaccess": [], - "application/vnd.dvb.ipdcesgaccess": [], - "application/vnd.dvb.ipdcesgaccess2": [], - "application/vnd.dvb.ipdcesgpdd": [], - "application/vnd.dvb.ipdcroaming": [], - "application/vnd.dvb.iptv.alfec-base": [], - "application/vnd.dvb.iptv.alfec-enhancement": [], - "application/vnd.dvb.notif-aggregate-root+xml": [], - "application/vnd.dvb.notif-container+xml": [], - "application/vnd.dvb.notif-generic+xml": [], - "application/vnd.dvb.notif-ia-msglist+xml": [], - "application/vnd.dvb.notif-ia-registration-request+xml": [], - "application/vnd.dvb.notif-ia-registration-response+xml": [], - "application/vnd.dvb.notif-init+xml": [], - "application/vnd.dvb.pfr": [], - "application/vnd.dvb.service": [ - "svc" - ], - "application/vnd.dxr": [], - "application/vnd.dynageo": [ - "geo" - ], - "application/vnd.easykaraoke.cdgdownload": [], - "application/vnd.ecdis-update": [], - "application/vnd.ecowin.chart": [ - "mag" - ], - "application/vnd.ecowin.filerequest": [], - "application/vnd.ecowin.fileupdate": [], - "application/vnd.ecowin.series": [], - "application/vnd.ecowin.seriesrequest": [], - "application/vnd.ecowin.seriesupdate": [], - "application/vnd.emclient.accessrequest+xml": [], - "application/vnd.enliven": [ - "nml" - ], - "application/vnd.eprints.data+xml": [], - "application/vnd.epson.esf": [ - "esf" - ], - "application/vnd.epson.msf": [ - "msf" - ], - "application/vnd.epson.quickanime": [ - "qam" - ], - "application/vnd.epson.salt": [ - "slt" - ], - "application/vnd.epson.ssf": [ - "ssf" - ], - "application/vnd.ericsson.quickcall": [], - "application/vnd.eszigno3+xml": [ - "es3", - "et3" - ], - "application/vnd.etsi.aoc+xml": [], - "application/vnd.etsi.cug+xml": [], - "application/vnd.etsi.iptvcommand+xml": [], - "application/vnd.etsi.iptvdiscovery+xml": [], - "application/vnd.etsi.iptvprofile+xml": [], - "application/vnd.etsi.iptvsad-bc+xml": [], - "application/vnd.etsi.iptvsad-cod+xml": [], - "application/vnd.etsi.iptvsad-npvr+xml": [], - "application/vnd.etsi.iptvservice+xml": [], - "application/vnd.etsi.iptvsync+xml": [], - "application/vnd.etsi.iptvueprofile+xml": [], - "application/vnd.etsi.mcid+xml": [], - "application/vnd.etsi.overload-control-policy-dataset+xml": [], - "application/vnd.etsi.sci+xml": [], - "application/vnd.etsi.simservs+xml": [], - "application/vnd.etsi.tsl+xml": [], - "application/vnd.etsi.tsl.der": [], - "application/vnd.eudora.data": [], - "application/vnd.ezpix-album": [ - "ez2" - ], - "application/vnd.ezpix-package": [ - "ez3" - ], - "application/vnd.f-secure.mobile": [], - "application/vnd.fdf": [ - "fdf" - ], - "application/vnd.fdsn.mseed": [ - "mseed" - ], - "application/vnd.fdsn.seed": [ - "seed", - "dataless" - ], - "application/vnd.ffsns": [], - "application/vnd.fints": [], - "application/vnd.flographit": [ - "gph" - ], - "application/vnd.fluxtime.clip": [ - "ftc" - ], - "application/vnd.font-fontforge-sfd": [], - "application/vnd.framemaker": [ - "fm", - "frame", - "maker", - "book" - ], - "application/vnd.frogans.fnc": [ - "fnc" - ], - "application/vnd.frogans.ltf": [ - "ltf" - ], - "application/vnd.fsc.weblaunch": [ - "fsc" - ], - "application/vnd.fujitsu.oasys": [ - "oas" - ], - "application/vnd.fujitsu.oasys2": [ - "oa2" - ], - "application/vnd.fujitsu.oasys3": [ - "oa3" - ], - "application/vnd.fujitsu.oasysgp": [ - "fg5" - ], - "application/vnd.fujitsu.oasysprs": [ - "bh2" - ], - "application/vnd.fujixerox.art-ex": [], - "application/vnd.fujixerox.art4": [], - "application/vnd.fujixerox.hbpl": [], - "application/vnd.fujixerox.ddd": [ - "ddd" - ], - "application/vnd.fujixerox.docuworks": [ - "xdw" - ], - "application/vnd.fujixerox.docuworks.binder": [ - "xbd" - ], - "application/vnd.fut-misnet": [], - "application/vnd.fuzzysheet": [ - "fzs" - ], - "application/vnd.genomatix.tuxedo": [ - "txd" - ], - "application/vnd.geocube+xml": [], - "application/vnd.geogebra.file": [ - "ggb" - ], - "application/vnd.geogebra.tool": [ - "ggt" - ], - "application/vnd.geometry-explorer": [ - "gex", - "gre" - ], - "application/vnd.geonext": [ - "gxt" - ], - "application/vnd.geoplan": [ - "g2w" - ], - "application/vnd.geospace": [ - "g3w" - ], - "application/vnd.globalplatform.card-content-mgt": [], - "application/vnd.globalplatform.card-content-mgt-response": [], - "application/vnd.gmx": [ - "gmx" - ], - "application/vnd.google-earth.kml+xml": [ - "kml" - ], - "application/vnd.google-earth.kmz": [ - "kmz" - ], - "application/vnd.grafeq": [ - "gqf", - "gqs" - ], - "application/vnd.gridmp": [], - "application/vnd.groove-account": [ - "gac" - ], - "application/vnd.groove-help": [ - "ghf" - ], - "application/vnd.groove-identity-message": [ - "gim" - ], - "application/vnd.groove-injector": [ - "grv" - ], - "application/vnd.groove-tool-message": [ - "gtm" - ], - "application/vnd.groove-tool-template": [ - "tpl" - ], - "application/vnd.groove-vcard": [ - "vcg" - ], - "application/vnd.hal+json": [], - "application/vnd.hal+xml": [ - "hal" - ], - "application/vnd.handheld-entertainment+xml": [ - "zmm" - ], - "application/vnd.hbci": [ - "hbci" - ], - "application/vnd.hcl-bireports": [], - "application/vnd.hhe.lesson-player": [ - "les" - ], - "application/vnd.hp-hpgl": [ - "hpgl" - ], - "application/vnd.hp-hpid": [ - "hpid" - ], - "application/vnd.hp-hps": [ - "hps" - ], - "application/vnd.hp-jlyt": [ - "jlt" - ], - "application/vnd.hp-pcl": [ - "pcl" - ], - "application/vnd.hp-pclxl": [ - "pclxl" - ], - "application/vnd.httphone": [], - "application/vnd.hzn-3d-crossword": [], - "application/vnd.ibm.afplinedata": [], - "application/vnd.ibm.electronic-media": [], - "application/vnd.ibm.minipay": [ - "mpy" - ], - "application/vnd.ibm.modcap": [ - "afp", - "listafp", - "list3820" - ], - "application/vnd.ibm.rights-management": [ - "irm" - ], - "application/vnd.ibm.secure-container": [ - "sc" - ], - "application/vnd.iccprofile": [ - "icc", - "icm" - ], - "application/vnd.igloader": [ - "igl" - ], - "application/vnd.immervision-ivp": [ - "ivp" - ], - "application/vnd.immervision-ivu": [ - "ivu" - ], - "application/vnd.informedcontrol.rms+xml": [], - "application/vnd.informix-visionary": [], - "application/vnd.infotech.project": [], - "application/vnd.infotech.project+xml": [], - "application/vnd.innopath.wamp.notification": [], - "application/vnd.insors.igm": [ - "igm" - ], - "application/vnd.intercon.formnet": [ - "xpw", - "xpx" - ], - "application/vnd.intergeo": [ - "i2g" - ], - "application/vnd.intertrust.digibox": [], - "application/vnd.intertrust.nncp": [], - "application/vnd.intu.qbo": [ - "qbo" - ], - "application/vnd.intu.qfx": [ - "qfx" - ], - "application/vnd.iptc.g2.conceptitem+xml": [], - "application/vnd.iptc.g2.knowledgeitem+xml": [], - "application/vnd.iptc.g2.newsitem+xml": [], - "application/vnd.iptc.g2.newsmessage+xml": [], - "application/vnd.iptc.g2.packageitem+xml": [], - "application/vnd.iptc.g2.planningitem+xml": [], - "application/vnd.ipunplugged.rcprofile": [ - "rcprofile" - ], - "application/vnd.irepository.package+xml": [ - "irp" - ], - "application/vnd.is-xpr": [ - "xpr" - ], - "application/vnd.isac.fcs": [ - "fcs" - ], - "application/vnd.jam": [ - "jam" - ], - "application/vnd.japannet-directory-service": [], - "application/vnd.japannet-jpnstore-wakeup": [], - "application/vnd.japannet-payment-wakeup": [], - "application/vnd.japannet-registration": [], - "application/vnd.japannet-registration-wakeup": [], - "application/vnd.japannet-setstore-wakeup": [], - "application/vnd.japannet-verification": [], - "application/vnd.japannet-verification-wakeup": [], - "application/vnd.jcp.javame.midlet-rms": [ - "rms" - ], - "application/vnd.jisp": [ - "jisp" - ], - "application/vnd.joost.joda-archive": [ - "joda" - ], - "application/vnd.kahootz": [ - "ktz", - "ktr" - ], - "application/vnd.kde.karbon": [ - "karbon" - ], - "application/vnd.kde.kchart": [ - "chrt" - ], - "application/vnd.kde.kformula": [ - "kfo" - ], - "application/vnd.kde.kivio": [ - "flw" - ], - "application/vnd.kde.kontour": [ - "kon" - ], - "application/vnd.kde.kpresenter": [ - "kpr", - "kpt" - ], - "application/vnd.kde.kspread": [ - "ksp" - ], - "application/vnd.kde.kword": [ - "kwd", - "kwt" - ], - "application/vnd.kenameaapp": [ - "htke" - ], - "application/vnd.kidspiration": [ - "kia" - ], - "application/vnd.kinar": [ - "kne", - "knp" - ], - "application/vnd.koan": [ - "skp", - "skd", - "skt", - "skm" - ], - "application/vnd.kodak-descriptor": [ - "sse" - ], - "application/vnd.las.las+xml": [ - "lasxml" - ], - "application/vnd.liberty-request+xml": [], - "application/vnd.llamagraphics.life-balance.desktop": [ - "lbd" - ], - "application/vnd.llamagraphics.life-balance.exchange+xml": [ - "lbe" - ], - "application/vnd.lotus-1-2-3": [ - "123" - ], - "application/vnd.lotus-approach": [ - "apr" - ], - "application/vnd.lotus-freelance": [ - "pre" - ], - "application/vnd.lotus-notes": [ - "nsf" - ], - "application/vnd.lotus-organizer": [ - "org" - ], - "application/vnd.lotus-screencam": [ - "scm" - ], - "application/vnd.lotus-wordpro": [ - "lwp" - ], - "application/vnd.macports.portpkg": [ - "portpkg" - ], - "application/vnd.marlin.drm.actiontoken+xml": [], - "application/vnd.marlin.drm.conftoken+xml": [], - "application/vnd.marlin.drm.license+xml": [], - "application/vnd.marlin.drm.mdcf": [], - "application/vnd.mcd": [ - "mcd" - ], - "application/vnd.medcalcdata": [ - "mc1" - ], - "application/vnd.mediastation.cdkey": [ - "cdkey" - ], - "application/vnd.meridian-slingshot": [], - "application/vnd.mfer": [ - "mwf" - ], - "application/vnd.mfmp": [ - "mfm" - ], - "application/vnd.micrografx.flo": [ - "flo" - ], - "application/vnd.micrografx.igx": [ - "igx" - ], - "application/vnd.mif": [ - "mif" - ], - "application/vnd.minisoft-hp3000-save": [], - "application/vnd.mitsubishi.misty-guard.trustweb": [], - "application/vnd.mobius.daf": [ - "daf" - ], - "application/vnd.mobius.dis": [ - "dis" - ], - "application/vnd.mobius.mbk": [ - "mbk" - ], - "application/vnd.mobius.mqy": [ - "mqy" - ], - "application/vnd.mobius.msl": [ - "msl" - ], - "application/vnd.mobius.plc": [ - "plc" - ], - "application/vnd.mobius.txf": [ - "txf" - ], - "application/vnd.mophun.application": [ - "mpn" - ], - "application/vnd.mophun.certificate": [ - "mpc" - ], - "application/vnd.motorola.flexsuite": [], - "application/vnd.motorola.flexsuite.adsi": [], - "application/vnd.motorola.flexsuite.fis": [], - "application/vnd.motorola.flexsuite.gotap": [], - "application/vnd.motorola.flexsuite.kmr": [], - "application/vnd.motorola.flexsuite.ttc": [], - "application/vnd.motorola.flexsuite.wem": [], - "application/vnd.motorola.iprm": [], - "application/vnd.mozilla.xul+xml": [ - "xul" - ], - "application/vnd.ms-artgalry": [ - "cil" - ], - "application/vnd.ms-asf": [], - "application/vnd.ms-cab-compressed": [ - "cab" - ], - "application/vnd.ms-color.iccprofile": [], - "application/vnd.ms-excel": [ - "xls", - "xlm", - "xla", - "xlc", - "xlt", - "xlw" - ], - "application/vnd.ms-excel.addin.macroenabled.12": [ - "xlam" - ], - "application/vnd.ms-excel.sheet.binary.macroenabled.12": [ - "xlsb" - ], - "application/vnd.ms-excel.sheet.macroenabled.12": [ - "xlsm" - ], - "application/vnd.ms-excel.template.macroenabled.12": [ - "xltm" - ], - "application/vnd.ms-fontobject": [ - "eot" - ], - "application/vnd.ms-htmlhelp": [ - "chm" - ], - "application/vnd.ms-ims": [ - "ims" - ], - "application/vnd.ms-lrm": [ - "lrm" - ], - "application/vnd.ms-office.activex+xml": [], - "application/vnd.ms-officetheme": [ - "thmx" - ], - "application/vnd.ms-opentype": [], - "application/vnd.ms-package.obfuscated-opentype": [], - "application/vnd.ms-pki.seccat": [ - "cat" - ], - "application/vnd.ms-pki.stl": [ - "stl" - ], - "application/vnd.ms-playready.initiator+xml": [], - "application/vnd.ms-powerpoint": [ - "ppt", - "pps", - "pot" - ], - "application/vnd.ms-powerpoint.addin.macroenabled.12": [ - "ppam" - ], - "application/vnd.ms-powerpoint.presentation.macroenabled.12": [ - "pptm" - ], - "application/vnd.ms-powerpoint.slide.macroenabled.12": [ - "sldm" - ], - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": [ - "ppsm" - ], - "application/vnd.ms-powerpoint.template.macroenabled.12": [ - "potm" - ], - "application/vnd.ms-printing.printticket+xml": [], - "application/vnd.ms-project": [ - "mpp", - "mpt" - ], - "application/vnd.ms-tnef": [], - "application/vnd.ms-wmdrm.lic-chlg-req": [], - "application/vnd.ms-wmdrm.lic-resp": [], - "application/vnd.ms-wmdrm.meter-chlg-req": [], - "application/vnd.ms-wmdrm.meter-resp": [], - "application/vnd.ms-word.document.macroenabled.12": [ - "docm" - ], - "application/vnd.ms-word.template.macroenabled.12": [ - "dotm" - ], - "application/vnd.ms-works": [ - "wps", - "wks", - "wcm", - "wdb" - ], - "application/vnd.ms-wpl": [ - "wpl" - ], - "application/vnd.ms-xpsdocument": [ - "xps" - ], - "application/vnd.mseq": [ - "mseq" - ], - "application/vnd.msign": [], - "application/vnd.multiad.creator": [], - "application/vnd.multiad.creator.cif": [], - "application/vnd.music-niff": [], - "application/vnd.musician": [ - "mus" - ], - "application/vnd.muvee.style": [ - "msty" - ], - "application/vnd.mynfc": [ - "taglet" - ], - "application/vnd.ncd.control": [], - "application/vnd.ncd.reference": [], - "application/vnd.nervana": [], - "application/vnd.netfpx": [], - "application/vnd.neurolanguage.nlu": [ - "nlu" - ], - "application/vnd.nitf": [ - "ntf", - "nitf" - ], - "application/vnd.noblenet-directory": [ - "nnd" - ], - "application/vnd.noblenet-sealer": [ - "nns" - ], - "application/vnd.noblenet-web": [ - "nnw" - ], - "application/vnd.nokia.catalogs": [], - "application/vnd.nokia.conml+wbxml": [], - "application/vnd.nokia.conml+xml": [], - "application/vnd.nokia.isds-radio-presets": [], - "application/vnd.nokia.iptv.config+xml": [], - "application/vnd.nokia.landmark+wbxml": [], - "application/vnd.nokia.landmark+xml": [], - "application/vnd.nokia.landmarkcollection+xml": [], - "application/vnd.nokia.n-gage.ac+xml": [], - "application/vnd.nokia.n-gage.data": [ - "ngdat" - ], - "application/vnd.nokia.ncd": [], - "application/vnd.nokia.pcd+wbxml": [], - "application/vnd.nokia.pcd+xml": [], - "application/vnd.nokia.radio-preset": [ - "rpst" - ], - "application/vnd.nokia.radio-presets": [ - "rpss" - ], - "application/vnd.novadigm.edm": [ - "edm" - ], - "application/vnd.novadigm.edx": [ - "edx" - ], - "application/vnd.novadigm.ext": [ - "ext" - ], - "application/vnd.ntt-local.file-transfer": [], - "application/vnd.ntt-local.sip-ta_remote": [], - "application/vnd.ntt-local.sip-ta_tcp_stream": [], - "application/vnd.oasis.opendocument.chart": [ - "odc" - ], - "application/vnd.oasis.opendocument.chart-template": [ - "otc" - ], - "application/vnd.oasis.opendocument.database": [ - "odb" - ], - "application/vnd.oasis.opendocument.formula": [ - "odf" - ], - "application/vnd.oasis.opendocument.formula-template": [ - "odft" - ], - "application/vnd.oasis.opendocument.graphics": [ - "odg" - ], - "application/vnd.oasis.opendocument.graphics-template": [ - "otg" - ], - "application/vnd.oasis.opendocument.image": [ - "odi" - ], - "application/vnd.oasis.opendocument.image-template": [ - "oti" - ], - "application/vnd.oasis.opendocument.presentation": [ - "odp" - ], - "application/vnd.oasis.opendocument.presentation-template": [ - "otp" - ], - "application/vnd.oasis.opendocument.spreadsheet": [ - "ods" - ], - "application/vnd.oasis.opendocument.spreadsheet-template": [ - "ots" - ], - "application/vnd.oasis.opendocument.text": [ - "odt" - ], - "application/vnd.oasis.opendocument.text-master": [ - "odm" - ], - "application/vnd.oasis.opendocument.text-template": [ - "ott" - ], - "application/vnd.oasis.opendocument.text-web": [ - "oth" - ], - "application/vnd.obn": [], - "application/vnd.oftn.l10n+json": [], - "application/vnd.oipf.contentaccessdownload+xml": [], - "application/vnd.oipf.contentaccessstreaming+xml": [], - "application/vnd.oipf.cspg-hexbinary": [], - "application/vnd.oipf.dae.svg+xml": [], - "application/vnd.oipf.dae.xhtml+xml": [], - "application/vnd.oipf.mippvcontrolmessage+xml": [], - "application/vnd.oipf.pae.gem": [], - "application/vnd.oipf.spdiscovery+xml": [], - "application/vnd.oipf.spdlist+xml": [], - "application/vnd.oipf.ueprofile+xml": [], - "application/vnd.oipf.userprofile+xml": [], - "application/vnd.olpc-sugar": [ - "xo" - ], - "application/vnd.oma-scws-config": [], - "application/vnd.oma-scws-http-request": [], - "application/vnd.oma-scws-http-response": [], - "application/vnd.oma.bcast.associated-procedure-parameter+xml": [], - "application/vnd.oma.bcast.drm-trigger+xml": [], - "application/vnd.oma.bcast.imd+xml": [], - "application/vnd.oma.bcast.ltkm": [], - "application/vnd.oma.bcast.notification+xml": [], - "application/vnd.oma.bcast.provisioningtrigger": [], - "application/vnd.oma.bcast.sgboot": [], - "application/vnd.oma.bcast.sgdd+xml": [], - "application/vnd.oma.bcast.sgdu": [], - "application/vnd.oma.bcast.simple-symbol-container": [], - "application/vnd.oma.bcast.smartcard-trigger+xml": [], - "application/vnd.oma.bcast.sprov+xml": [], - "application/vnd.oma.bcast.stkm": [], - "application/vnd.oma.cab-address-book+xml": [], - "application/vnd.oma.cab-feature-handler+xml": [], - "application/vnd.oma.cab-pcc+xml": [], - "application/vnd.oma.cab-user-prefs+xml": [], - "application/vnd.oma.dcd": [], - "application/vnd.oma.dcdc": [], - "application/vnd.oma.dd2+xml": [ - "dd2" - ], - "application/vnd.oma.drm.risd+xml": [], - "application/vnd.oma.group-usage-list+xml": [], - "application/vnd.oma.pal+xml": [], - "application/vnd.oma.poc.detailed-progress-report+xml": [], - "application/vnd.oma.poc.final-report+xml": [], - "application/vnd.oma.poc.groups+xml": [], - "application/vnd.oma.poc.invocation-descriptor+xml": [], - "application/vnd.oma.poc.optimized-progress-report+xml": [], - "application/vnd.oma.push": [], - "application/vnd.oma.scidm.messages+xml": [], - "application/vnd.oma.xcap-directory+xml": [], - "application/vnd.omads-email+xml": [], - "application/vnd.omads-file+xml": [], - "application/vnd.omads-folder+xml": [], - "application/vnd.omaloc-supl-init": [], - "application/vnd.openofficeorg.extension": [ - "oxt" - ], - "application/vnd.openxmlformats-officedocument.custom-properties+xml": [], - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": [], - "application/vnd.openxmlformats-officedocument.drawing+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": [], - "application/vnd.openxmlformats-officedocument.extended-properties+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presentation": [ - "pptx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slide": [ - "sldx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [ - "ppsx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.template": [ - "potx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [ - "xlsx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [ - "xltx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": [], - "application/vnd.openxmlformats-officedocument.theme+xml": [], - "application/vnd.openxmlformats-officedocument.themeoverride+xml": [], - "application/vnd.openxmlformats-officedocument.vmldrawing": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [ - "docx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [ - "dotx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": [], - "application/vnd.openxmlformats-package.core-properties+xml": [], - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": [], - "application/vnd.openxmlformats-package.relationships+xml": [], - "application/vnd.quobject-quoxdocument": [], - "application/vnd.osa.netdeploy": [], - "application/vnd.osgeo.mapguide.package": [ - "mgp" - ], - "application/vnd.osgi.bundle": [], - "application/vnd.osgi.dp": [ - "dp" - ], - "application/vnd.osgi.subsystem": [ - "esa" - ], - "application/vnd.otps.ct-kip+xml": [], - "application/vnd.palm": [ - "pdb", - "pqa", - "oprc" - ], - "application/vnd.paos.xml": [], - "application/vnd.pawaafile": [ - "paw" - ], - "application/vnd.pg.format": [ - "str" - ], - "application/vnd.pg.osasli": [ - "ei6" - ], - "application/vnd.piaccess.application-licence": [], - "application/vnd.picsel": [ - "efif" - ], - "application/vnd.pmi.widget": [ - "wg" - ], - "application/vnd.poc.group-advertisement+xml": [], - "application/vnd.pocketlearn": [ - "plf" - ], - "application/vnd.powerbuilder6": [ - "pbd" - ], - "application/vnd.powerbuilder6-s": [], - "application/vnd.powerbuilder7": [], - "application/vnd.powerbuilder7-s": [], - "application/vnd.powerbuilder75": [], - "application/vnd.powerbuilder75-s": [], - "application/vnd.preminet": [], - "application/vnd.previewsystems.box": [ - "box" - ], - "application/vnd.proteus.magazine": [ - "mgz" - ], - "application/vnd.publishare-delta-tree": [ - "qps" - ], - "application/vnd.pvi.ptid1": [ - "ptid" - ], - "application/vnd.pwg-multiplexed": [], - "application/vnd.pwg-xhtml-print+xml": [], - "application/vnd.qualcomm.brew-app-res": [], - "application/vnd.quark.quarkxpress": [ - "qxd", - "qxt", - "qwd", - "qwt", - "qxl", - "qxb" - ], - "application/vnd.radisys.moml+xml": [], - "application/vnd.radisys.msml+xml": [], - "application/vnd.radisys.msml-audit+xml": [], - "application/vnd.radisys.msml-audit-conf+xml": [], - "application/vnd.radisys.msml-audit-conn+xml": [], - "application/vnd.radisys.msml-audit-dialog+xml": [], - "application/vnd.radisys.msml-audit-stream+xml": [], - "application/vnd.radisys.msml-conf+xml": [], - "application/vnd.radisys.msml-dialog+xml": [], - "application/vnd.radisys.msml-dialog-base+xml": [], - "application/vnd.radisys.msml-dialog-fax-detect+xml": [], - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": [], - "application/vnd.radisys.msml-dialog-group+xml": [], - "application/vnd.radisys.msml-dialog-speech+xml": [], - "application/vnd.radisys.msml-dialog-transform+xml": [], - "application/vnd.rainstor.data": [], - "application/vnd.rapid": [], - "application/vnd.realvnc.bed": [ - "bed" - ], - "application/vnd.recordare.musicxml": [ - "mxl" - ], - "application/vnd.recordare.musicxml+xml": [ - "musicxml" - ], - "application/vnd.renlearn.rlprint": [], - "application/vnd.rig.cryptonote": [ - "cryptonote" - ], - "application/vnd.rim.cod": [ - "cod" - ], - "application/vnd.rn-realmedia": [ - "rm" - ], - "application/vnd.rn-realmedia-vbr": [ - "rmvb" - ], - "application/vnd.route66.link66+xml": [ - "link66" - ], - "application/vnd.rs-274x": [], - "application/vnd.ruckus.download": [], - "application/vnd.s3sms": [], - "application/vnd.sailingtracker.track": [ - "st" - ], - "application/vnd.sbm.cid": [], - "application/vnd.sbm.mid2": [], - "application/vnd.scribus": [], - "application/vnd.sealed.3df": [], - "application/vnd.sealed.csf": [], - "application/vnd.sealed.doc": [], - "application/vnd.sealed.eml": [], - "application/vnd.sealed.mht": [], - "application/vnd.sealed.net": [], - "application/vnd.sealed.ppt": [], - "application/vnd.sealed.tiff": [], - "application/vnd.sealed.xls": [], - "application/vnd.sealedmedia.softseal.html": [], - "application/vnd.sealedmedia.softseal.pdf": [], - "application/vnd.seemail": [ - "see" - ], - "application/vnd.sema": [ - "sema" - ], - "application/vnd.semd": [ - "semd" - ], - "application/vnd.semf": [ - "semf" - ], - "application/vnd.shana.informed.formdata": [ - "ifm" - ], - "application/vnd.shana.informed.formtemplate": [ - "itp" - ], - "application/vnd.shana.informed.interchange": [ - "iif" - ], - "application/vnd.shana.informed.package": [ - "ipk" - ], - "application/vnd.simtech-mindmapper": [ - "twd", - "twds" - ], - "application/vnd.smaf": [ - "mmf" - ], - "application/vnd.smart.notebook": [], - "application/vnd.smart.teacher": [ - "teacher" - ], - "application/vnd.software602.filler.form+xml": [], - "application/vnd.software602.filler.form-xml-zip": [], - "application/vnd.solent.sdkm+xml": [ - "sdkm", - "sdkd" - ], - "application/vnd.spotfire.dxp": [ - "dxp" - ], - "application/vnd.spotfire.sfs": [ - "sfs" - ], - "application/vnd.sss-cod": [], - "application/vnd.sss-dtf": [], - "application/vnd.sss-ntf": [], - "application/vnd.stardivision.calc": [ - "sdc" - ], - "application/vnd.stardivision.draw": [ - "sda" - ], - "application/vnd.stardivision.impress": [ - "sdd" - ], - "application/vnd.stardivision.math": [ - "smf" - ], - "application/vnd.stardivision.writer": [ - "sdw", - "vor" - ], - "application/vnd.stardivision.writer-global": [ - "sgl" - ], - "application/vnd.stepmania.package": [ - "smzip" - ], - "application/vnd.stepmania.stepchart": [ - "sm" - ], - "application/vnd.street-stream": [], - "application/vnd.sun.xml.calc": [ - "sxc" - ], - "application/vnd.sun.xml.calc.template": [ - "stc" - ], - "application/vnd.sun.xml.draw": [ - "sxd" - ], - "application/vnd.sun.xml.draw.template": [ - "std" - ], - "application/vnd.sun.xml.impress": [ - "sxi" - ], - "application/vnd.sun.xml.impress.template": [ - "sti" - ], - "application/vnd.sun.xml.math": [ - "sxm" - ], - "application/vnd.sun.xml.writer": [ - "sxw" - ], - "application/vnd.sun.xml.writer.global": [ - "sxg" - ], - "application/vnd.sun.xml.writer.template": [ - "stw" - ], - "application/vnd.sun.wadl+xml": [], - "application/vnd.sus-calendar": [ - "sus", - "susp" - ], - "application/vnd.svd": [ - "svd" - ], - "application/vnd.swiftview-ics": [], - "application/vnd.symbian.install": [ - "sis", - "sisx" - ], - "application/vnd.syncml+xml": [ - "xsm" - ], - "application/vnd.syncml.dm+wbxml": [ - "bdm" - ], - "application/vnd.syncml.dm+xml": [ - "xdm" - ], - "application/vnd.syncml.dm.notification": [], - "application/vnd.syncml.ds.notification": [], - "application/vnd.tao.intent-module-archive": [ - "tao" - ], - "application/vnd.tcpdump.pcap": [ - "pcap", - "cap", - "dmp" - ], - "application/vnd.tmobile-livetv": [ - "tmo" - ], - "application/vnd.trid.tpt": [ - "tpt" - ], - "application/vnd.triscape.mxs": [ - "mxs" - ], - "application/vnd.trueapp": [ - "tra" - ], - "application/vnd.truedoc": [], - "application/vnd.ubisoft.webplayer": [], - "application/vnd.ufdl": [ - "ufd", - "ufdl" - ], - "application/vnd.uiq.theme": [ - "utz" - ], - "application/vnd.umajin": [ - "umj" - ], - "application/vnd.unity": [ - "unityweb" - ], - "application/vnd.uoml+xml": [ - "uoml" - ], - "application/vnd.uplanet.alert": [], - "application/vnd.uplanet.alert-wbxml": [], - "application/vnd.uplanet.bearer-choice": [], - "application/vnd.uplanet.bearer-choice-wbxml": [], - "application/vnd.uplanet.cacheop": [], - "application/vnd.uplanet.cacheop-wbxml": [], - "application/vnd.uplanet.channel": [], - "application/vnd.uplanet.channel-wbxml": [], - "application/vnd.uplanet.list": [], - "application/vnd.uplanet.list-wbxml": [], - "application/vnd.uplanet.listcmd": [], - "application/vnd.uplanet.listcmd-wbxml": [], - "application/vnd.uplanet.signal": [], - "application/vnd.vcx": [ - "vcx" - ], - "application/vnd.vd-study": [], - "application/vnd.vectorworks": [], - "application/vnd.verimatrix.vcas": [], - "application/vnd.vidsoft.vidconference": [], - "application/vnd.visio": [ - "vsd", - "vst", - "vss", - "vsw" - ], - "application/vnd.visionary": [ - "vis" - ], - "application/vnd.vividence.scriptfile": [], - "application/vnd.vsf": [ - "vsf" - ], - "application/vnd.wap.sic": [], - "application/vnd.wap.slc": [], - "application/vnd.wap.wbxml": [ - "wbxml" - ], - "application/vnd.wap.wmlc": [ - "wmlc" - ], - "application/vnd.wap.wmlscriptc": [ - "wmlsc" - ], - "application/vnd.webturbo": [ - "wtb" - ], - "application/vnd.wfa.wsc": [], - "application/vnd.wmc": [], - "application/vnd.wmf.bootstrap": [], - "application/vnd.wolfram.mathematica": [], - "application/vnd.wolfram.mathematica.package": [], - "application/vnd.wolfram.player": [ - "nbp" - ], - "application/vnd.wordperfect": [ - "wpd" - ], - "application/vnd.wqd": [ - "wqd" - ], - "application/vnd.wrq-hp3000-labelled": [], - "application/vnd.wt.stf": [ - "stf" - ], - "application/vnd.wv.csp+wbxml": [], - "application/vnd.wv.csp+xml": [], - "application/vnd.wv.ssp+xml": [], - "application/vnd.xara": [ - "xar" - ], - "application/vnd.xfdl": [ - "xfdl" - ], - "application/vnd.xfdl.webform": [], - "application/vnd.xmi+xml": [], - "application/vnd.xmpie.cpkg": [], - "application/vnd.xmpie.dpkg": [], - "application/vnd.xmpie.plan": [], - "application/vnd.xmpie.ppkg": [], - "application/vnd.xmpie.xlim": [], - "application/vnd.yamaha.hv-dic": [ - "hvd" - ], - "application/vnd.yamaha.hv-script": [ - "hvs" - ], - "application/vnd.yamaha.hv-voice": [ - "hvp" - ], - "application/vnd.yamaha.openscoreformat": [ - "osf" - ], - "application/vnd.yamaha.openscoreformat.osfpvg+xml": [ - "osfpvg" - ], - "application/vnd.yamaha.remote-setup": [], - "application/vnd.yamaha.smaf-audio": [ - "saf" - ], - "application/vnd.yamaha.smaf-phrase": [ - "spf" - ], - "application/vnd.yamaha.through-ngn": [], - "application/vnd.yamaha.tunnel-udpencap": [], - "application/vnd.yellowriver-custom-menu": [ - "cmp" - ], - "application/vnd.zul": [ - "zir", - "zirz" - ], - "application/vnd.zzazz.deck+xml": [ - "zaz" - ], - "application/voicexml+xml": [ - "vxml" - ], - "application/vq-rtcpxr": [], - "application/watcherinfo+xml": [], - "application/whoispp-query": [], - "application/whoispp-response": [], - "application/widget": [ - "wgt" - ], - "application/winhlp": [ - "hlp" - ], - "application/wita": [], - "application/wordperfect5.1": [], - "application/wsdl+xml": [ - "wsdl" - ], - "application/wspolicy+xml": [ - "wspolicy" - ], - "application/x-7z-compressed": [ - "7z" - ], - "application/x-abiword": [ - "abw" - ], - "application/x-ace-compressed": [ - "ace" - ], - "application/x-amf": [], - "application/x-apple-diskimage": [ - "dmg" - ], - "application/x-authorware-bin": [ - "aab", - "x32", - "u32", - "vox" - ], - "application/x-authorware-map": [ - "aam" - ], - "application/x-authorware-seg": [ - "aas" - ], - "application/x-bcpio": [ - "bcpio" - ], - "application/x-bittorrent": [ - "torrent" - ], - "application/x-blorb": [ - "blb", - "blorb" - ], - "application/x-bzip": [ - "bz" - ], - "application/x-bzip2": [ - "bz2", - "boz" - ], - "application/x-cbr": [ - "cbr", - "cba", - "cbt", - "cbz", - "cb7" - ], - "application/x-cdlink": [ - "vcd" - ], - "application/x-cfs-compressed": [ - "cfs" - ], - "application/x-chat": [ - "chat" - ], - "application/x-chess-pgn": [ - "pgn" - ], - "application/x-conference": [ - "nsc" - ], - "application/x-compress": [], - "application/x-cpio": [ - "cpio" - ], - "application/x-csh": [ - "csh" - ], - "application/x-debian-package": [ - "deb", - "udeb" - ], - "application/x-dgc-compressed": [ - "dgc" - ], - "application/x-director": [ - "dir", - "dcr", - "dxr", - "cst", - "cct", - "cxt", - "w3d", - "fgd", - "swa" - ], - "application/x-doom": [ - "wad" - ], - "application/x-dtbncx+xml": [ - "ncx" - ], - "application/x-dtbook+xml": [ - "dtb" - ], - "application/x-dtbresource+xml": [ - "res" - ], - "application/x-dvi": [ - "dvi" - ], - "application/x-envoy": [ - "evy" - ], - "application/x-eva": [ - "eva" - ], - "application/x-font-bdf": [ - "bdf" - ], - "application/x-font-dos": [], - "application/x-font-framemaker": [], - "application/x-font-ghostscript": [ - "gsf" - ], - "application/x-font-libgrx": [], - "application/x-font-linux-psf": [ - "psf" - ], - "application/x-font-otf": [ - "otf" - ], - "application/x-font-pcf": [ - "pcf" - ], - "application/x-font-snf": [ - "snf" - ], - "application/x-font-speedo": [], - "application/x-font-sunos-news": [], - "application/x-font-ttf": [ - "ttf", - "ttc" - ], - "application/x-font-type1": [ - "pfa", - "pfb", - "pfm", - "afm" - ], - "application/font-woff": [ - "woff" - ], - "application/x-font-vfont": [], - "application/x-freearc": [ - "arc" - ], - "application/x-futuresplash": [ - "spl" - ], - "application/x-gca-compressed": [ - "gca" - ], - "application/x-glulx": [ - "ulx" - ], - "application/x-gnumeric": [ - "gnumeric" - ], - "application/x-gramps-xml": [ - "gramps" - ], - "application/x-gtar": [ - "gtar" - ], - "application/x-gzip": [], - "application/x-hdf": [ - "hdf" - ], - "application/x-install-instructions": [ - "install" - ], - "application/x-iso9660-image": [ - "iso" - ], - "application/x-java-jnlp-file": [ - "jnlp" - ], - "application/x-latex": [ - "latex" - ], - "application/x-lzh-compressed": [ - "lzh", - "lha" - ], - "application/x-mie": [ - "mie" - ], - "application/x-mobipocket-ebook": [ - "prc", - "mobi" - ], - "application/x-ms-application": [ - "application" - ], - "application/x-ms-shortcut": [ - "lnk" - ], - "application/x-ms-wmd": [ - "wmd" - ], - "application/x-ms-wmz": [ - "wmz" - ], - "application/x-ms-xbap": [ - "xbap" - ], - "application/x-msaccess": [ - "mdb" - ], - "application/x-msbinder": [ - "obd" - ], - "application/x-mscardfile": [ - "crd" - ], - "application/x-msclip": [ - "clp" - ], - "application/x-msdownload": [ - "exe", - "dll", - "com", - "bat", - "msi" - ], - "application/x-msmediaview": [ - "mvb", - "m13", - "m14" - ], - "application/x-msmetafile": [ - "wmf", - "wmz", - "emf", - "emz" - ], - "application/x-msmoney": [ - "mny" - ], - "application/x-mspublisher": [ - "pub" - ], - "application/x-msschedule": [ - "scd" - ], - "application/x-msterminal": [ - "trm" - ], - "application/x-mswrite": [ - "wri" - ], - "application/x-netcdf": [ - "nc", - "cdf" - ], - "application/x-nzb": [ - "nzb" - ], - "application/x-pkcs12": [ - "p12", - "pfx" - ], - "application/x-pkcs7-certificates": [ - "p7b", - "spc" - ], - "application/x-pkcs7-certreqresp": [ - "p7r" - ], - "application/x-rar-compressed": [ - "rar" - ], - "application/x-research-info-systems": [ - "ris" - ], - "application/x-sh": [ - "sh" - ], - "application/x-shar": [ - "shar" - ], - "application/x-shockwave-flash": [ - "swf" - ], - "application/x-silverlight-app": [ - "xap" - ], - "application/x-sql": [ - "sql" - ], - "application/x-stuffit": [ - "sit" - ], - "application/x-stuffitx": [ - "sitx" - ], - "application/x-subrip": [ - "srt" - ], - "application/x-sv4cpio": [ - "sv4cpio" - ], - "application/x-sv4crc": [ - "sv4crc" - ], - "application/x-t3vm-image": [ - "t3" - ], - "application/x-tads": [ - "gam" - ], - "application/x-tar": [ - "tar" - ], - "application/x-tcl": [ - "tcl" - ], - "application/x-tex": [ - "tex" - ], - "application/x-tex-tfm": [ - "tfm" - ], - "application/x-texinfo": [ - "texinfo", - "texi" - ], - "application/x-tgif": [ - "obj" - ], - "application/x-ustar": [ - "ustar" - ], - "application/x-wais-source": [ - "src" - ], - "application/x-x509-ca-cert": [ - "der", - "crt" - ], - "application/x-xfig": [ - "fig" - ], - "application/x-xliff+xml": [ - "xlf" - ], - "application/x-xpinstall": [ - "xpi" - ], - "application/x-xz": [ - "xz" - ], - "application/x-zmachine": [ - "z1", - "z2", - "z3", - "z4", - "z5", - "z6", - "z7", - "z8" - ], - "application/x400-bp": [], - "application/xaml+xml": [ - "xaml" - ], - "application/xcap-att+xml": [], - "application/xcap-caps+xml": [], - "application/xcap-diff+xml": [ - "xdf" - ], - "application/xcap-el+xml": [], - "application/xcap-error+xml": [], - "application/xcap-ns+xml": [], - "application/xcon-conference-info-diff+xml": [], - "application/xcon-conference-info+xml": [], - "application/xenc+xml": [ - "xenc" - ], - "application/xhtml+xml": [ - "xhtml", - "xht" - ], - "application/xhtml-voice+xml": [], - "application/xml": [ - "xml", - "xsl" - ], - "application/xml-dtd": [ - "dtd" - ], - "application/xml-external-parsed-entity": [], - "application/xmpp+xml": [], - "application/xop+xml": [ - "xop" - ], - "application/xproc+xml": [ - "xpl" - ], - "application/xslt+xml": [ - "xslt" - ], - "application/xspf+xml": [ - "xspf" - ], - "application/xv+xml": [ - "mxml", - "xhvml", - "xvml", - "xvm" - ], - "application/yang": [ - "yang" - ], - "application/yin+xml": [ - "yin" - ], - "application/zip": [ - "zip" - ], - "audio/1d-interleaved-parityfec": [], - "audio/32kadpcm": [], - "audio/3gpp": [], - "audio/3gpp2": [], - "audio/ac3": [], - "audio/adpcm": [ - "adp" - ], - "audio/amr": [], - "audio/amr-wb": [], - "audio/amr-wb+": [], - "audio/asc": [], - "audio/atrac-advanced-lossless": [], - "audio/atrac-x": [], - "audio/atrac3": [], - "audio/basic": [ - "au", - "snd" - ], - "audio/bv16": [], - "audio/bv32": [], - "audio/clearmode": [], - "audio/cn": [], - "audio/dat12": [], - "audio/dls": [], - "audio/dsr-es201108": [], - "audio/dsr-es202050": [], - "audio/dsr-es202211": [], - "audio/dsr-es202212": [], - "audio/dv": [], - "audio/dvi4": [], - "audio/eac3": [], - "audio/evrc": [], - "audio/evrc-qcp": [], - "audio/evrc0": [], - "audio/evrc1": [], - "audio/evrcb": [], - "audio/evrcb0": [], - "audio/evrcb1": [], - "audio/evrcwb": [], - "audio/evrcwb0": [], - "audio/evrcwb1": [], - "audio/example": [], - "audio/fwdred": [], - "audio/g719": [], - "audio/g722": [], - "audio/g7221": [], - "audio/g723": [], - "audio/g726-16": [], - "audio/g726-24": [], - "audio/g726-32": [], - "audio/g726-40": [], - "audio/g728": [], - "audio/g729": [], - "audio/g7291": [], - "audio/g729d": [], - "audio/g729e": [], - "audio/gsm": [], - "audio/gsm-efr": [], - "audio/gsm-hr-08": [], - "audio/ilbc": [], - "audio/ip-mr_v2.5": [], - "audio/isac": [], - "audio/l16": [], - "audio/l20": [], - "audio/l24": [], - "audio/l8": [], - "audio/lpc": [], - "audio/midi": [ - "mid", - "midi", - "kar", - "rmi" - ], - "audio/mobile-xmf": [], - "audio/mp4": [ - "mp4a" - ], - "audio/mp4a-latm": [], - "audio/mpa": [], - "audio/mpa-robust": [], - "audio/mpeg": [ - "mpga", - "mp2", - "mp2a", - "mp3", - "m2a", - "m3a" - ], - "audio/mpeg4-generic": [], - "audio/musepack": [], - "audio/ogg": [ - "oga", - "ogg", - "spx" - ], - "audio/opus": [], - "audio/parityfec": [], - "audio/pcma": [], - "audio/pcma-wb": [], - "audio/pcmu-wb": [], - "audio/pcmu": [], - "audio/prs.sid": [], - "audio/qcelp": [], - "audio/red": [], - "audio/rtp-enc-aescm128": [], - "audio/rtp-midi": [], - "audio/rtx": [], - "audio/s3m": [ - "s3m" - ], - "audio/silk": [ - "sil" - ], - "audio/smv": [], - "audio/smv0": [], - "audio/smv-qcp": [], - "audio/sp-midi": [], - "audio/speex": [], - "audio/t140c": [], - "audio/t38": [], - "audio/telephone-event": [], - "audio/tone": [], - "audio/uemclip": [], - "audio/ulpfec": [], - "audio/vdvi": [], - "audio/vmr-wb": [], - "audio/vnd.3gpp.iufp": [], - "audio/vnd.4sb": [], - "audio/vnd.audiokoz": [], - "audio/vnd.celp": [], - "audio/vnd.cisco.nse": [], - "audio/vnd.cmles.radio-events": [], - "audio/vnd.cns.anp1": [], - "audio/vnd.cns.inf1": [], - "audio/vnd.dece.audio": [ - "uva", - "uvva" - ], - "audio/vnd.digital-winds": [ - "eol" - ], - "audio/vnd.dlna.adts": [], - "audio/vnd.dolby.heaac.1": [], - "audio/vnd.dolby.heaac.2": [], - "audio/vnd.dolby.mlp": [], - "audio/vnd.dolby.mps": [], - "audio/vnd.dolby.pl2": [], - "audio/vnd.dolby.pl2x": [], - "audio/vnd.dolby.pl2z": [], - "audio/vnd.dolby.pulse.1": [], - "audio/vnd.dra": [ - "dra" - ], - "audio/vnd.dts": [ - "dts" - ], - "audio/vnd.dts.hd": [ - "dtshd" - ], - "audio/vnd.dvb.file": [], - "audio/vnd.everad.plj": [], - "audio/vnd.hns.audio": [], - "audio/vnd.lucent.voice": [ - "lvp" - ], - "audio/vnd.ms-playready.media.pya": [ - "pya" - ], - "audio/vnd.nokia.mobile-xmf": [], - "audio/vnd.nortel.vbk": [], - "audio/vnd.nuera.ecelp4800": [ - "ecelp4800" - ], - "audio/vnd.nuera.ecelp7470": [ - "ecelp7470" - ], - "audio/vnd.nuera.ecelp9600": [ - "ecelp9600" - ], - "audio/vnd.octel.sbc": [], - "audio/vnd.qcelp": [], - "audio/vnd.rhetorex.32kadpcm": [], - "audio/vnd.rip": [ - "rip" - ], - "audio/vnd.sealedmedia.softseal.mpeg": [], - "audio/vnd.vmx.cvsd": [], - "audio/vorbis": [], - "audio/vorbis-config": [], - "audio/webm": [ - "weba" - ], - "audio/x-aac": [ - "aac" - ], - "audio/x-aiff": [ - "aif", - "aiff", - "aifc" - ], - "audio/x-caf": [ - "caf" - ], - "audio/x-flac": [ - "flac" - ], - "audio/x-matroska": [ - "mka" - ], - "audio/x-mpegurl": [ - "m3u" - ], - "audio/x-ms-wax": [ - "wax" - ], - "audio/x-ms-wma": [ - "wma" - ], - "audio/x-pn-realaudio": [ - "ram", - "ra" - ], - "audio/x-pn-realaudio-plugin": [ - "rmp" - ], - "audio/x-tta": [], - "audio/x-wav": [ - "wav" - ], - "audio/xm": [ - "xm" - ], - "chemical/x-cdx": [ - "cdx" - ], - "chemical/x-cif": [ - "cif" - ], - "chemical/x-cmdf": [ - "cmdf" - ], - "chemical/x-cml": [ - "cml" - ], - "chemical/x-csml": [ - "csml" - ], - "chemical/x-pdb": [], - "chemical/x-xyz": [ - "xyz" - ], - "image/bmp": [ - "bmp" - ], - "image/cgm": [ - "cgm" - ], - "image/example": [], - "image/fits": [], - "image/g3fax": [ - "g3" - ], - "image/gif": [ - "gif" - ], - "image/ief": [ - "ief" - ], - "image/jp2": [], - "image/jpeg": [ - "jpeg", - "jpg", - "jpe" - ], - "image/jpm": [], - "image/jpx": [], - "image/ktx": [ - "ktx" - ], - "image/naplps": [], - "image/png": [ - "png" - ], - "image/prs.btif": [ - "btif" - ], - "image/prs.pti": [], - "image/sgi": [ - "sgi" - ], - "image/svg+xml": [ - "svg", - "svgz" - ], - "image/t38": [], - "image/tiff": [ - "tiff", - "tif" - ], - "image/tiff-fx": [], - "image/vnd.adobe.photoshop": [ - "psd" - ], - "image/vnd.cns.inf2": [], - "image/vnd.dece.graphic": [ - "uvi", - "uvvi", - "uvg", - "uvvg" - ], - "image/vnd.dvb.subtitle": [ - "sub" - ], - "image/vnd.djvu": [ - "djvu", - "djv" - ], - "image/vnd.dwg": [ - "dwg" - ], - "image/vnd.dxf": [ - "dxf" - ], - "image/vnd.fastbidsheet": [ - "fbs" - ], - "image/vnd.fpx": [ - "fpx" - ], - "image/vnd.fst": [ - "fst" - ], - "image/vnd.fujixerox.edmics-mmr": [ - "mmr" - ], - "image/vnd.fujixerox.edmics-rlc": [ - "rlc" - ], - "image/vnd.globalgraphics.pgb": [], - "image/vnd.microsoft.icon": [], - "image/vnd.mix": [], - "image/vnd.ms-modi": [ - "mdi" - ], - "image/vnd.ms-photo": [ - "wdp" - ], - "image/vnd.net-fpx": [ - "npx" - ], - "image/vnd.radiance": [], - "image/vnd.sealed.png": [], - "image/vnd.sealedmedia.softseal.gif": [], - "image/vnd.sealedmedia.softseal.jpg": [], - "image/vnd.svf": [], - "image/vnd.wap.wbmp": [ - "wbmp" - ], - "image/vnd.xiff": [ - "xif" - ], - "image/webp": [ - "webp" - ], - "image/x-3ds": [ - "3ds" - ], - "image/x-cmu-raster": [ - "ras" - ], - "image/x-cmx": [ - "cmx" - ], - "image/x-freehand": [ - "fh", - "fhc", - "fh4", - "fh5", - "fh7" - ], - "image/x-icon": [ - "ico" - ], - "image/x-mrsid-image": [ - "sid" - ], - "image/x-pcx": [ - "pcx" - ], - "image/x-pict": [ - "pic", - "pct" - ], - "image/x-portable-anymap": [ - "pnm" - ], - "image/x-portable-bitmap": [ - "pbm" - ], - "image/x-portable-graymap": [ - "pgm" - ], - "image/x-portable-pixmap": [ - "ppm" - ], - "image/x-rgb": [ - "rgb" - ], - "image/x-tga": [ - "tga" - ], - "image/x-xbitmap": [ - "xbm" - ], - "image/x-xpixmap": [ - "xpm" - ], - "image/x-xwindowdump": [ - "xwd" - ], - "message/cpim": [], - "message/delivery-status": [], - "message/disposition-notification": [], - "message/example": [], - "message/external-body": [], - "message/feedback-report": [], - "message/global": [], - "message/global-delivery-status": [], - "message/global-disposition-notification": [], - "message/global-headers": [], - "message/http": [], - "message/imdn+xml": [], - "message/news": [], - "message/partial": [], - "message/rfc822": [ - "eml", - "mime" - ], - "message/s-http": [], - "message/sip": [], - "message/sipfrag": [], - "message/tracking-status": [], - "message/vnd.si.simp": [], - "model/example": [], - "model/iges": [ - "igs", - "iges" - ], - "model/mesh": [ - "msh", - "mesh", - "silo" - ], - "model/vnd.collada+xml": [ - "dae" - ], - "model/vnd.dwf": [ - "dwf" - ], - "model/vnd.flatland.3dml": [], - "model/vnd.gdl": [ - "gdl" - ], - "model/vnd.gs-gdl": [], - "model/vnd.gs.gdl": [], - "model/vnd.gtw": [ - "gtw" - ], - "model/vnd.moml+xml": [], - "model/vnd.mts": [ - "mts" - ], - "model/vnd.parasolid.transmit.binary": [], - "model/vnd.parasolid.transmit.text": [], - "model/vnd.vtu": [ - "vtu" - ], - "model/vrml": [ - "wrl", - "vrml" - ], - "model/x3d+binary": [ - "x3db", - "x3dbz" - ], - "model/x3d+vrml": [ - "x3dv", - "x3dvz" - ], - "model/x3d+xml": [ - "x3d", - "x3dz" - ], - "multipart/alternative": [], - "multipart/appledouble": [], - "multipart/byteranges": [], - "multipart/digest": [], - "multipart/encrypted": [], - "multipart/example": [], - "multipart/form-data": [], - "multipart/header-set": [], - "multipart/mixed": [], - "multipart/parallel": [], - "multipart/related": [], - "multipart/report": [], - "multipart/signed": [], - "multipart/voice-message": [], - "text/1d-interleaved-parityfec": [], - "text/cache-manifest": [ - "appcache" - ], - "text/calendar": [ - "ics", - "ifb" - ], - "text/css": [ - "css" - ], - "text/csv": [ - "csv" - ], - "text/directory": [], - "text/dns": [], - "text/ecmascript": [], - "text/enriched": [], - "text/example": [], - "text/fwdred": [], - "text/html": [ - "html", - "htm" - ], - "text/javascript": [], - "text/n3": [ - "n3" - ], - "text/parityfec": [], - "text/plain": [ - "txt", - "text", - "conf", - "def", - "list", - "log", - "in" - ], - "text/prs.fallenstein.rst": [], - "text/prs.lines.tag": [ - "dsc" - ], - "text/vnd.radisys.msml-basic-layout": [], - "text/red": [], - "text/rfc822-headers": [], - "text/richtext": [ - "rtx" - ], - "text/rtf": [], - "text/rtp-enc-aescm128": [], - "text/rtx": [], - "text/sgml": [ - "sgml", - "sgm" - ], - "text/t140": [], - "text/tab-separated-values": [ - "tsv" - ], - "text/troff": [ - "t", - "tr", - "roff", - "man", - "me", - "ms" - ], - "text/turtle": [ - "ttl" - ], - "text/ulpfec": [], - "text/uri-list": [ - "uri", - "uris", - "urls" - ], - "text/vcard": [ - "vcard" - ], - "text/vnd.abc": [], - "text/vnd.curl": [ - "curl" - ], - "text/vnd.curl.dcurl": [ - "dcurl" - ], - "text/vnd.curl.scurl": [ - "scurl" - ], - "text/vnd.curl.mcurl": [ - "mcurl" - ], - "text/vnd.dmclientscript": [], - "text/vnd.dvb.subtitle": [ - "sub" - ], - "text/vnd.esmertec.theme-descriptor": [], - "text/vnd.fly": [ - "fly" - ], - "text/vnd.fmi.flexstor": [ - "flx" - ], - "text/vnd.graphviz": [ - "gv" - ], - "text/vnd.in3d.3dml": [ - "3dml" - ], - "text/vnd.in3d.spot": [ - "spot" - ], - "text/vnd.iptc.newsml": [], - "text/vnd.iptc.nitf": [], - "text/vnd.latex-z": [], - "text/vnd.motorola.reflex": [], - "text/vnd.ms-mediapackage": [], - "text/vnd.net2phone.commcenter.command": [], - "text/vnd.si.uricatalogue": [], - "text/vnd.sun.j2me.app-descriptor": [ - "jad" - ], - "text/vnd.trolltech.linguist": [], - "text/vnd.wap.si": [], - "text/vnd.wap.sl": [], - "text/vnd.wap.wml": [ - "wml" - ], - "text/vnd.wap.wmlscript": [ - "wmls" - ], - "text/x-asm": [ - "s", - "asm" - ], - "text/x-c": [ - "c", - "cc", - "cxx", - "cpp", - "h", - "hh", - "dic" - ], - "text/x-fortran": [ - "f", - "for", - "f77", - "f90" - ], - "text/x-java-source": [ - "java" - ], - "text/x-opml": [ - "opml" - ], - "text/x-pascal": [ - "p", - "pas" - ], - "text/x-nfo": [ - "nfo" - ], - "text/x-setext": [ - "etx" - ], - "text/x-sfv": [ - "sfv" - ], - "text/x-uuencode": [ - "uu" - ], - "text/x-vcalendar": [ - "vcs" - ], - "text/x-vcard": [ - "vcf" - ], - "text/xml": [], - "text/xml-external-parsed-entity": [], - "video/1d-interleaved-parityfec": [], - "video/3gpp": [ - "3gp" - ], - "video/3gpp-tt": [], - "video/3gpp2": [ - "3g2" - ], - "video/bmpeg": [], - "video/bt656": [], - "video/celb": [], - "video/dv": [], - "video/example": [], - "video/h261": [ - "h261" - ], - "video/h263": [ - "h263" - ], - "video/h263-1998": [], - "video/h263-2000": [], - "video/h264": [ - "h264" - ], - "video/h264-rcdo": [], - "video/h264-svc": [], - "video/jpeg": [ - "jpgv" - ], - "video/jpeg2000": [], - "video/jpm": [ - "jpm", - "jpgm" - ], - "video/mj2": [ - "mj2", - "mjp2" - ], - "video/mp1s": [], - "video/mp2p": [], - "video/mp2t": [], - "video/mp4": [ - "mp4", - "mp4v", - "mpg4" - ], - "video/mp4v-es": [], - "video/mpeg": [ - "mpeg", - "mpg", - "mpe", - "m1v", - "m2v" - ], - "video/mpeg4-generic": [], - "video/mpv": [], - "video/nv": [], - "video/ogg": [ - "ogv" - ], - "video/parityfec": [], - "video/pointer": [], - "video/quicktime": [ - "qt", - "mov" - ], - "video/raw": [], - "video/rtp-enc-aescm128": [], - "video/rtx": [], - "video/smpte292m": [], - "video/ulpfec": [], - "video/vc1": [], - "video/vnd.cctv": [], - "video/vnd.dece.hd": [ - "uvh", - "uvvh" - ], - "video/vnd.dece.mobile": [ - "uvm", - "uvvm" - ], - "video/vnd.dece.mp4": [], - "video/vnd.dece.pd": [ - "uvp", - "uvvp" - ], - "video/vnd.dece.sd": [ - "uvs", - "uvvs" - ], - "video/vnd.dece.video": [ - "uvv", - "uvvv" - ], - "video/vnd.directv.mpeg": [], - "video/vnd.directv.mpeg-tts": [], - "video/vnd.dlna.mpeg-tts": [], - "video/vnd.dvb.file": [ - "dvb" - ], - "video/vnd.fvt": [ - "fvt" - ], - "video/vnd.hns.video": [], - "video/vnd.iptvforum.1dparityfec-1010": [], - "video/vnd.iptvforum.1dparityfec-2005": [], - "video/vnd.iptvforum.2dparityfec-1010": [], - "video/vnd.iptvforum.2dparityfec-2005": [], - "video/vnd.iptvforum.ttsavc": [], - "video/vnd.iptvforum.ttsmpeg2": [], - "video/vnd.motorola.video": [], - "video/vnd.motorola.videop": [], - "video/vnd.mpegurl": [ - "mxu", - "m4u" - ], - "video/vnd.ms-playready.media.pyv": [ - "pyv" - ], - "video/vnd.nokia.interleaved-multimedia": [], - "video/vnd.nokia.videovoip": [], - "video/vnd.objectvideo": [], - "video/vnd.sealed.mpeg1": [], - "video/vnd.sealed.mpeg4": [], - "video/vnd.sealed.swf": [], - "video/vnd.sealedmedia.softseal.mov": [], - "video/vnd.uvvu.mp4": [ - "uvu", - "uvvu" - ], - "video/vnd.vivo": [ - "viv" - ], - "video/webm": [ - "webm" - ], - "video/x-f4v": [ - "f4v" - ], - "video/x-fli": [ - "fli" - ], - "video/x-flv": [ - "flv" - ], - "video/x-m4v": [ - "m4v" - ], - "video/x-matroska": [ - "mkv", - "mk3d", - "mks" - ], - "video/x-mng": [ - "mng" - ], - "video/x-ms-asf": [ - "asf", - "asx" - ], - "video/x-ms-vob": [ - "vob" - ], - "video/x-ms-wm": [ - "wm" - ], - "video/x-ms-wmv": [ - "wmv" - ], - "video/x-ms-wmx": [ - "wmx" - ], - "video/x-ms-wvx": [ - "wvx" - ], - "video/x-msvideo": [ - "avi" - ], - "video/x-sgi-movie": [ - "movie" - ], - "video/x-smv": [ - "smv" - ], - "x-conference/x-cooltalk": [ - "ice" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json deleted file mode 100644 index ad50d61..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "text/vtt": [ - "vtt" - ], - "application/x-chrome-extension": [ - "crx" - ], - "text/x-component": [ - "htc" - ], - "text/cache-manifest": [ - "manifest" - ], - "application/octet-stream": [ - "buffer" - ], - "application/mp4": [ - "m4p" - ], - "audio/mp4": [ - "m4a" - ], - "video/MP2T": [ - "ts" - ], - "application/x-web-app-manifest+json": [ - "webapp" - ], - "text/x-lua": [ - "lua" - ], - "application/x-lua-bytecode": [ - "luac" - ], - "text/x-markdown": [ - "markdown", - "md", - "mkd" - ], - "text/plain": [ - "ini" - ], - "application/dash+xml": [ - "mdp" - ], - "font/opentype": [ - "otf" - ], - "application/json": [ - "map" - ], - "application/xml": [ - "xsd" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json deleted file mode 100644 index bd487f6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "1.0.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": "https://searchbeam.jit.su" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/mime-types" - }, - "license": "MIT", - "main": "lib", - "devDependencies": { - "co": "3", - "cogent": "0", - "mocha": "1", - "should": "3" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "make test" - }, - "bugs": { - "url": "https://github.com/expressjs/mime-types/issues" - }, - "homepage": "https://github.com/expressjs/mime-types", - "_id": "mime-types@1.0.1", - "_shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "_from": "mime-types@>=1.0.1-0 <1.1.0-0", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore deleted file mode 100644 index a6a8d17..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -examples -test -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE deleted file mode 100644 index 42ca2e7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Original "Negotiator" program Copyright Federico Romero -Port to JavaScript Copyright Isaac Z. Schlueter - -All rights reserved. - -MIT 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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js deleted file mode 100644 index d231291..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js +++ /dev/null @@ -1,90 +0,0 @@ -module.exports = preferredCharsets; -preferredCharsets.preferredCharsets = preferredCharsets; - -function parseAcceptCharset(accept) { - return accept.split(',').map(function(e) { - return parseCharset(e.trim()); - }).filter(function(e) { - return e; - }); -} - -function parseCharset(s) { - var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); - if (!match) return null; - - var charset = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - charset: charset, - q: q - }; -} - -function getCharsetPriority(charset, accepted) { - return (accepted.map(function(a) { - return specify(charset, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q:0}); -} - -function specify(charset, spec) { - var s = 0; - if(spec.charset === charset){ - s |= 1; - } else if (spec.charset !== '*' ) { - return null - } - - return { - s: s, - q: spec.q, - } -} - -function preferredCharsets(accept, provided) { - // RFC 2616 sec 14.2: no header = * - accept = parseAcceptCharset(accept === undefined ? '*' : accept || ''); - if (provided) { - return provided.map(function(type) { - return [type, getCharsetPriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type) { - return type.q > 0; - }).map(function(type) { - return type.charset; - }); - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js deleted file mode 100644 index 207291d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js +++ /dev/null @@ -1,120 +0,0 @@ -module.exports = preferredEncodings; -preferredEncodings.preferredEncodings = preferredEncodings; - -function parseAcceptEncoding(accept) { - var acceptableEncodings; - - if (accept) { - acceptableEncodings = accept.split(',').map(function(e) { - return parseEncoding(e.trim()); - }); - } else { - acceptableEncodings = []; - } - - if (!acceptableEncodings.some(function(e) { - return e && specify('identity', e); - })) { - /* - * If identity doesn't explicitly appear in the accept-encoding header, - * it's added to the list of acceptable encoding with the lowest q - * - */ - var lowestQ = 1; - - for(var i = 0; i < acceptableEncodings.length; i++){ - var e = acceptableEncodings[i]; - if(e && e.q < lowestQ){ - lowestQ = e.q; - } - } - acceptableEncodings.push({ - encoding: 'identity', - q: lowestQ / 2, - }); - } - - return acceptableEncodings.filter(function(e) { - return e; - }); -} - -function parseEncoding(s) { - var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); - - if (!match) return null; - - var encoding = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';'); - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - encoding: encoding, - q: q - }; -} - -function getEncodingPriority(encoding, accepted) { - return (accepted.map(function(a) { - return specify(encoding, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q: 0}); -} - -function specify(encoding, spec) { - var s = 0; - if(spec.encoding === encoding){ - s |= 1; - } else if (spec.encoding !== '*' ) { - return null - } - - return { - s: s, - q: spec.q, - } -}; - -function preferredEncodings(accept, provided) { - accept = parseAcceptEncoding(accept || ''); - if (provided) { - return provided.map(function(type) { - return [type, getEncodingPriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type){ - return type.q > 0; - }).map(function(type) { - return type.encoding; - }); - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js deleted file mode 100644 index 63036c7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js +++ /dev/null @@ -1,103 +0,0 @@ -module.exports = preferredLanguages; -preferredLanguages.preferredLanguages = preferredLanguages; - -function parseAcceptLanguage(accept) { - return accept.split(',').map(function(e) { - return parseLanguage(e.trim()); - }).filter(function(e) { - return e; - }); -} - -function parseLanguage(s) { - var match = s.match(/^\s*(\S+?)(?:-(\S+?))?\s*(?:;(.*))?$/); - if (!match) return null; - - var prefix = match[1], - suffix = match[2], - full = prefix; - - if (suffix) full += "-" + suffix; - - var q = 1; - if (match[3]) { - var params = match[3].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].split('='); - if (p[0] === 'q') q = parseFloat(p[1]); - } - } - - return { - prefix: prefix, - suffix: suffix, - q: q, - full: full - }; -} - -function getLanguagePriority(language, accepted) { - return (accepted.map(function(a){ - return specify(language, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q: 0}); -} - -function specify(language, spec) { - var p = parseLanguage(language) - if (!p) return null; - var s = 0; - if(spec.full === p.full){ - s |= 4; - } else if (spec.prefix === p.full) { - s |= 2; - } else if (spec.full === p.prefix) { - s |= 1; - } else if (spec.full !== '*' ) { - return null - } - - return { - s: s, - q: spec.q, - } -}; - -function preferredLanguages(accept, provided) { - // RFC 2616 sec 14.4: no header = * - accept = parseAcceptLanguage(accept === undefined ? '*' : accept || ''); - if (provided) { - - var ret = provided.map(function(type) { - return [type, getLanguagePriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - return ret; - - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type) { - return type.q > 0; - }).map(function(type) { - return type.full; - }); - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js deleted file mode 100644 index f4dc1ca..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js +++ /dev/null @@ -1,125 +0,0 @@ -module.exports = preferredMediaTypes; -preferredMediaTypes.preferredMediaTypes = preferredMediaTypes; - -function parseAccept(accept) { - return accept.split(',').map(function(e) { - return parseMediaType(e.trim()); - }).filter(function(e) { - return e; - }); -}; - -function parseMediaType(s) { - var match = s.match(/\s*(\S+?)\/([^;\s]+)\s*(?:;(.*))?/); - if (!match) return null; - - var type = match[1], - subtype = match[2], - full = "" + type + "/" + subtype, - params = {}, - q = 1; - - if (match[3]) { - params = match[3].split(';').map(function(s) { - return s.trim().split('='); - }).reduce(function (set, p) { - set[p[0]] = p[1]; - return set - }, params); - - if (params.q != null) { - q = parseFloat(params.q); - delete params.q; - } - } - - return { - type: type, - subtype: subtype, - params: params, - q: q, - full: full - }; -} - -function getMediaTypePriority(type, accepted) { - return (accepted.map(function(a) { - return specify(type, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q: 0}); -} - -function specify(type, spec) { - var p = parseMediaType(type); - var s = 0; - - if (!p) { - return null; - } - - if(spec.type == p.type) { - s |= 4 - } else if(spec.type != '*') { - return null; - } - - if(spec.subtype == p.subtype) { - s |= 2 - } else if(spec.subtype != '*') { - return null; - } - - var keys = Object.keys(spec.params); - if (keys.length > 0) { - if (keys.every(function (k) { - return spec.params[k] == '*' || spec.params[k] == p.params[k]; - })) { - s |= 1 - } else { - return null - } - } - - return { - q: spec.q, - s: s, - } - -} - -function preferredMediaTypes(accept, provided) { - // RFC 2616 sec 14.2: no header = */* - accept = parseAccept(accept === undefined ? '*/*' : accept || ''); - if (provided) { - return provided.map(function(type) { - return [type, getMediaTypePriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type) { - return type.q > 0; - }).map(function(type) { - return type.full; - }); - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js deleted file mode 100644 index ba0c48b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js +++ /dev/null @@ -1,37 +0,0 @@ -module.exports = Negotiator; -Negotiator.Negotiator = Negotiator; - -function Negotiator(request) { - if (!(this instanceof Negotiator)) return new Negotiator(request); - this.request = request; -} - -var set = { charset: 'accept-charset', - encoding: 'accept-encoding', - language: 'accept-language', - mediaType: 'accept' }; - - -function capitalize(string){ - return string.charAt(0).toUpperCase() + string.slice(1); -} - -Object.keys(set).forEach(function (k) { - var header = set[k], - method = require('./'+k+'.js'), - singular = k, - plural = k + 's'; - - Negotiator.prototype[plural] = function (available) { - return method(this.request.headers[header], available); - }; - - Negotiator.prototype[singular] = function(available) { - var set = this[plural](available); - if (set) return set[0]; - }; - - // Keep preferred* methods for legacy compatibility - Negotiator.prototype['preferred'+capitalize(plural)] = Negotiator.prototype[plural]; - Negotiator.prototype['preferred'+capitalize(singular)] = Negotiator.prototype[singular]; -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json deleted file mode 100644 index 0572f18..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "negotiator", - "description": "HTTP content negotiation", - "version": "0.4.7", - "author": { - "name": "Federico Romero", - "email": "federico.romero@outboxlabs.com" - }, - "contributors": [ - { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/federomero/negotiator.git" - }, - "keywords": [ - "http", - "content negotiation", - "accept", - "accept-language", - "accept-encoding", - "accept-charset" - ], - "engine": "node >= 0.6", - "license": "MIT", - "devDependencies": { - "nodeunit": "0.8.x" - }, - "scripts": { - "test": "nodeunit test" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "main": "lib/negotiator.js", - "bugs": { - "url": "https://github.com/federomero/negotiator/issues" - }, - "homepage": "https://github.com/federomero/negotiator", - "dependencies": {}, - "_id": "negotiator@0.4.7", - "dist": { - "shasum": "a4160f7177ec806738631d0d3052325da42abdc8", - "tarball": "http://registry.npmjs.org/negotiator/-/negotiator-0.4.7.tgz" - }, - "_from": "negotiator@0.4.7", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "federomero", - "email": "federomero@gmail.com" - }, - "maintainers": [ - { - "name": "federomero", - "email": "federomero@gmail.com" - } - ], - "directories": {}, - "_shasum": "a4160f7177ec806738631d0d3052325da42abdc8", - "_resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.7.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md deleted file mode 100644 index d982a9c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md +++ /dev/null @@ -1,132 +0,0 @@ -# Negotiator [![Build Status](https://travis-ci.org/federomero/negotiator.png)](https://travis-ci.org/federomero/negotiator) - -An HTTP content negotiator for node.js written in javascript. - -# Accept Negotiation - - Negotiator = require('negotiator') - - availableMediaTypes = ['text/html', 'text/plain', 'application/json'] - - // The negotiator constructor receives a request object - negotiator = new Negotiator(request) - - // Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8' - - negotiator.mediaTypes() - // -> ['text/html', 'image/jpeg', 'application/*'] - - negotiator.mediaTypes(availableMediaTypes) - // -> ['text/html', 'application/json'] - - negotiator.mediaType(availableMediaTypes) - // -> 'text/html' - -You can check a working example at `examples/accept.js`. - -## Methods - -`mediaTypes(availableMediaTypes)`: - -Returns an array of preferred media types ordered by priority from a list of available media types. - -`mediaType(availableMediaType)`: - -Returns the top preferred media type from a list of available media types. - -# Accept-Language Negotiation - - Negotiator = require('negotiator') - - negotiator = new Negotiator(request) - - availableLanguages = 'en', 'es', 'fr' - - // Let's say Accept-Language header is 'en;q=0.8, es, pt' - - negotiator.languages() - // -> ['es', 'pt', 'en'] - - negotiator.languages(availableLanguages) - // -> ['es', 'en'] - - language = negotiator.language(availableLanguages) - // -> 'es' - -You can check a working example at `examples/language.js`. - -## Methods - -`languages(availableLanguages)`: - -Returns an array of preferred languages ordered by priority from a list of available languages. - -`language(availableLanguages)`: - -Returns the top preferred language from a list of available languages. - -# Accept-Charset Negotiation - - Negotiator = require('negotiator') - - availableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5'] - - negotiator = new Negotiator(request) - - // Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2' - - negotiator.charsets() - // -> ['utf-8', 'iso-8859-1', 'utf-7'] - - negotiator.charsets(availableCharsets) - // -> ['utf-8', 'iso-8859-1'] - - negotiator.charset(availableCharsets) - // -> 'utf-8' - -You can check a working example at `examples/charset.js`. - -## Methods - -`charsets(availableCharsets)`: - -Returns an array of preferred charsets ordered by priority from a list of available charsets. - -`charset(availableCharsets)`: - -Returns the top preferred charset from a list of available charsets. - -# Accept-Encoding Negotiation - - Negotiator = require('negotiator').Negotiator - - availableEncodings = ['identity', 'gzip'] - - negotiator = new Negotiator(request) - - // Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5' - - negotiator.encodings() - // -> ['gzip', 'identity', 'compress'] - - negotiator.encodings(availableEncodings) - // -> ['gzip', 'identity'] - - negotiator.encoding(availableEncodings) - // -> 'gzip' - -You can check a working example at `examples/encoding.js`. - -## Methods - -`encodings(availableEncodings)`: - -Returns an array of preferred encodings ordered by priority from a list of available encodings. - -`encoding(availableEncodings)`: - -Returns the top preferred encoding from a list of available encodings. - -# License - -MIT diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/package.json deleted file mode 100644 index 0d8c5bb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "accepts", - "description": "Higher-level content negotiation", - "version": "1.0.7", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/accepts" - }, - "dependencies": { - "mime-types": "~1.0.0", - "negotiator": "0.4.7" - }, - "devDependencies": { - "istanbul": "0.2.11", - "mocha": "*", - "should": "*" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --require should --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require should --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require should --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/accepts/issues" - }, - "homepage": "https://github.com/expressjs/accepts", - "_id": "accepts@1.0.7", - "dist": { - "shasum": "5b501fb4f0704309964ccdb048172541208dab1a", - "tarball": "http://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz" - }, - "_from": "accepts@>=1.0.7-0 <1.1.0-0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "federomero", - "email": "federomero@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "5b501fb4f0704309964ccdb048172541208dab1a", - "_resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.npmignore deleted file mode 100644 index b512c09..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.travis.yml deleted file mode 100644 index 7a902e8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 -notifications: - email: - recipients: - - brianloveswords@gmail.com \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/LICENSE deleted file mode 100644 index caeb849..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/LICENSE +++ /dev/null @@ -1,17 +0,0 @@ -Copyright (c) 2013 Brian J. Brennan - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/README.md deleted file mode 100644 index 0d9d8b8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# buffer-crc32 - -[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32) - -crc32 that works with binary data and fancy character sets, outputs -buffer, signed or unsigned data and has tests. - -Derived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix - -# install -``` -npm install buffer-crc32 -``` - -# example -```js -var crc32 = require('buffer-crc32'); -// works with buffers -var buf = Buffer([0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) -crc32(buf) // -> - -// has convenience methods for getting signed or unsigned ints -crc32.signed(buf) // -> -1805997238 -crc32.unsigned(buf) // -> 2488970058 - -// will cast to buffer if given a string, so you can -// directly use foreign characters safely -crc32('自動販売機') // -> - -// and works in append mode too -var partialCrc = crc32('hey'); -var partialCrc = crc32(' ', partialCrc); -var partialCrc = crc32('sup', partialCrc); -var partialCrc = crc32(' ', partialCrc); -var finalCrc = crc32('bros', partialCrc); // -> -``` - -# tests -This was tested against the output of zlib's crc32 method. You can run -the tests with`npm test` (requires tap) - -# see also -https://github.com/alexgorbatchev/node-crc, `crc.buffer.crc32` also -supports buffer inputs and return unsigned ints (thanks @tjholowaychuk). - -# license -MIT/X11 diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/index.js deleted file mode 100644 index 8694c63..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/index.js +++ /dev/null @@ -1,91 +0,0 @@ -var Buffer = require('buffer').Buffer; - -var CRC_TABLE = [ - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, - 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, - 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, - 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, - 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, - 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, - 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, - 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, - 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, - 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, - 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, - 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, - 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, - 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, - 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, - 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, - 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, - 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, - 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, - 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, - 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, - 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, - 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, - 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, - 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, - 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, - 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, - 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, - 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, - 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, - 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, - 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, - 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, - 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, - 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, - 0x2d02ef8d -]; - -if (typeof Int32Array !== 'undefined') - CRC_TABLE = new Int32Array(CRC_TABLE); - -function bufferizeInt(num) { - var tmp = Buffer(4); - tmp.writeInt32BE(num, 0); - return tmp; -} - -function _crc32(buf, previous) { - if (!Buffer.isBuffer(buf)) { - buf = Buffer(buf); - } - if (Buffer.isBuffer(previous)) { - previous = previous.readUInt32BE(0); - } - var crc = ~~previous ^ -1; - for (var n = 0; n < buf.length; n++) { - crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); - } - return (crc ^ -1); -} - -function crc32() { - return bufferizeInt(_crc32.apply(null, arguments)); -} -crc32.signed = function () { - return _crc32.apply(null, arguments); -}; -crc32.unsigned = function () { - return _crc32.apply(null, arguments) >>> 0; -}; - -module.exports = crc32; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/package.json deleted file mode 100644 index e0d6377..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "author": { - "name": "Brian J. Brennan", - "email": "brianloveswords@gmail.com", - "url": "http://bjb.io" - }, - "name": "buffer-crc32", - "description": "A pure javascript CRC32 algorithm that plays nice with binary data", - "version": "0.2.3", - "contributors": [ - { - "name": "Vladimir Kuznetsov" - } - ], - "homepage": "https://github.com/brianloveswords/buffer-crc32", - "repository": { - "type": "git", - "url": "git://github.com/brianloveswords/buffer-crc32.git" - }, - "main": "index.js", - "scripts": { - "test": "tap tests/*.test.js" - }, - "dependencies": {}, - "devDependencies": { - "tap": "~0.2.5" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "gitHead": "f06dc30bccbad685af30666268c6fd2670805998", - "bugs": { - "url": "https://github.com/brianloveswords/buffer-crc32/issues" - }, - "_id": "buffer-crc32@0.2.3", - "_shasum": "bb54519e95d107cbd2400e76d0cab1467336d921", - "_from": "buffer-crc32@0.2.3", - "_npmVersion": "1.4.14", - "_npmUser": { - "name": "brianloveswords", - "email": "brianloveswords@gmail.com" - }, - "maintainers": [ - { - "name": "brianloveswords", - "email": "brian@nyhacker.org" - } - ], - "dist": { - "shasum": "bb54519e95d107cbd2400e76d0cab1467336d921", - "tarball": "http://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js deleted file mode 100644 index bb0f9ef..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js +++ /dev/null @@ -1,89 +0,0 @@ -var crc32 = require('..'); -var test = require('tap').test; - -test('simple crc32 is no problem', function (t) { - var input = Buffer('hey sup bros'); - var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); - t.same(crc32(input), expected); - t.end(); -}); - -test('another simple one', function (t) { - var input = Buffer('IEND'); - var expected = Buffer([0xae, 0x42, 0x60, 0x82]); - t.same(crc32(input), expected); - t.end(); -}); - -test('slightly more complex', function (t) { - var input = Buffer([0x00, 0x00, 0x00]); - var expected = Buffer([0xff, 0x41, 0xd9, 0x12]); - t.same(crc32(input), expected); - t.end(); -}); - -test('complex crc32 gets calculated like a champ', function (t) { - var input = Buffer('शीर्षक'); - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('casts to buffer if necessary', function (t) { - var input = 'शीर्षक'; - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('can do signed', function (t) { - var input = 'ham sandwich'; - var expected = -1891873021; - t.same(crc32.signed(input), expected); - t.end(); -}); - -test('can do unsigned', function (t) { - var input = 'bear sandwich'; - var expected = 3711466352; - t.same(crc32.unsigned(input), expected); - t.end(); -}); - - -test('simple crc32 in append mode', function (t) { - var input = [Buffer('hey'), Buffer(' '), Buffer('sup'), Buffer(' '), Buffer('bros')]; - var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); - for (var crc = 0, i = 0; i < input.length; i++) { - crc = crc32(input[i], crc); - } - t.same(crc, expected); - t.end(); -}); - - -test('can do signed in append mode', function (t) { - var input1 = 'ham'; - var input2 = ' '; - var input3 = 'sandwich'; - var expected = -1891873021; - - var crc = crc32.signed(input1); - crc = crc32.signed(input2, crc); - crc = crc32.signed(input3, crc); - - t.same(crc, expected); - t.end(); -}); - -test('can do unsigned in append mode', function (t) { - var input1 = 'bear san'; - var input2 = 'dwich'; - var expected = 3711466352; - - var crc = crc32.unsigned(input1); - crc = crc32.unsigned(input2, crc); - t.same(crc, expected); - t.end(); -}); - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/History.md deleted file mode 100644 index 2bbc4b3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/History.md +++ /dev/null @@ -1,27 +0,0 @@ -1.0.4 / 2014-06-25 -================== - - * corrected avoidance of timing attacks (thanks @tenbits!) - - -1.0.3 / 2014-01-28 -================== - - * [incorrect] fix for timing attacks - -1.0.2 / 2014-01-28 -================== - - * fix missing repository warning - * fix typo in test - -1.0.1 / 2013-04-15 -================== - - * Revert "Changed underlying HMAC algo. to sha512." - * Revert "Fix for timing attacks on MAC verification." - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Makefile deleted file mode 100644 index 4e9c8d3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --require should \ - --reporter spec - -.PHONY: test \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Readme.md deleted file mode 100644 index 2559e84..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Readme.md +++ /dev/null @@ -1,42 +0,0 @@ - -# cookie-signature - - Sign and unsign cookies. - -## Example - -```js -var cookie = require('cookie-signature'); - -var val = cookie.sign('hello', 'tobiiscool'); -val.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI'); - -var val = cookie.sign('hello', 'tobiiscool'); -cookie.unsign(val, 'tobiiscool').should.equal('hello'); -cookie.unsign(val, 'luna').should.be.false; -``` - -## License - -(The MIT License) - -Copyright (c) 2012 LearnBoost <tj@learnboost.com> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/index.js deleted file mode 100644 index b63bf84..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/index.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Sign the given `val` with `secret`. - * - * @param {String} val - * @param {String} secret - * @return {String} - * @api private - */ - -exports.sign = function(val, secret){ - if ('string' != typeof val) throw new TypeError('cookie required'); - if ('string' != typeof secret) throw new TypeError('secret required'); - return val + '.' + crypto - .createHmac('sha256', secret) - .update(val) - .digest('base64') - .replace(/\=+$/, ''); -}; - -/** - * Unsign and decode the given `val` with `secret`, - * returning `false` if the signature is invalid. - * - * @param {String} val - * @param {String} secret - * @return {String|Boolean} - * @api private - */ - -exports.unsign = function(val, secret){ - if ('string' != typeof val) throw new TypeError('cookie required'); - if ('string' != typeof secret) throw new TypeError('secret required'); - var str = val.slice(0, val.lastIndexOf('.')) - , mac = exports.sign(str, secret); - - return sha1(mac) == sha1(val) ? str : false; -}; - -/** - * Private - */ - -function sha1(str){ - return crypto.createHash('sha1').update(str).digest('hex'); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/package.json deleted file mode 100644 index c15a32d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "cookie-signature", - "version": "1.0.4", - "description": "Sign and unsign cookies", - "keywords": [ - "cookie", - "sign", - "unsign" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@learnboost.com" - }, - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-cookie-signature.git" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "main": "index", - "bugs": { - "url": "https://github.com/visionmedia/node-cookie-signature/issues" - }, - "homepage": "https://github.com/visionmedia/node-cookie-signature", - "_id": "cookie-signature@1.0.4", - "dist": { - "shasum": "0edd22286e3a111b9a2a70db363e925e867f6aca", - "tarball": "http://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.4.tgz" - }, - "_from": "cookie-signature@1.0.4", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "natevw", - "email": "natevw@yahoo.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "natevw", - "email": "natevw@yahoo.com" - } - ], - "directories": {}, - "_shasum": "0edd22286e3a111b9a2a70db363e925e867f6aca", - "_resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/.npmignore deleted file mode 100644 index efab07f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -test -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/LICENSE deleted file mode 100644 index 249d9de..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -// MIT License - -Copyright (C) Roman Shtylman - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/README.md deleted file mode 100644 index 3170b4b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# cookie [![Build Status](https://secure.travis-ci.org/defunctzombie/node-cookie.png?branch=master)](http://travis-ci.org/defunctzombie/node-cookie) # - -cookie is a basic cookie parser and serializer. It doesn't make assumptions about how you are going to deal with your cookies. It basically just provides a way to read and write the HTTP cookie headers. - -See [RFC6265](http://tools.ietf.org/html/rfc6265) for details about the http header for cookies. - -## how? - -``` -npm install cookie -``` - -```javascript -var cookie = require('cookie'); - -var hdr = cookie.serialize('foo', 'bar'); -// hdr = 'foo=bar'; - -var cookies = cookie.parse('foo=bar; cat=meow; dog=ruff'); -// cookies = { foo: 'bar', cat: 'meow', dog: 'ruff' }; -``` - -## more - -The serialize function takes a third parameter, an object, to set cookie options. See the RFC for valid values. - -### path -> cookie path - -### expires -> absolute expiration date for the cookie (Date object) - -### maxAge -> relative max age of the cookie from when the client receives it (seconds) - -### domain -> domain for the cookie - -### secure -> true or false - -### httpOnly -> true or false - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/index.js deleted file mode 100644 index 00d54a7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/index.js +++ /dev/null @@ -1,75 +0,0 @@ - -/// Serialize the a name value pair into a cookie string suitable for -/// http headers. An optional options object specified cookie parameters -/// -/// serialize('foo', 'bar', { httpOnly: true }) -/// => "foo=bar; httpOnly" -/// -/// @param {String} name -/// @param {String} val -/// @param {Object} options -/// @return {String} -var serialize = function(name, val, opt){ - opt = opt || {}; - var enc = opt.encode || encode; - var pairs = [name + '=' + enc(val)]; - - if (null != opt.maxAge) { - var maxAge = opt.maxAge - 0; - if (isNaN(maxAge)) throw new Error('maxAge should be a Number'); - pairs.push('Max-Age=' + maxAge); - } - - if (opt.domain) pairs.push('Domain=' + opt.domain); - if (opt.path) pairs.push('Path=' + opt.path); - if (opt.expires) pairs.push('Expires=' + opt.expires.toUTCString()); - if (opt.httpOnly) pairs.push('HttpOnly'); - if (opt.secure) pairs.push('Secure'); - - return pairs.join('; '); -}; - -/// Parse the given cookie header string into an object -/// The object has the various cookies as keys(names) => values -/// @param {String} str -/// @return {Object} -var parse = function(str, opt) { - opt = opt || {}; - var obj = {} - var pairs = str.split(/; */); - var dec = opt.decode || decode; - - pairs.forEach(function(pair) { - var eq_idx = pair.indexOf('=') - - // skip things that don't look like key=value - if (eq_idx < 0) { - return; - } - - var key = pair.substr(0, eq_idx).trim() - var val = pair.substr(++eq_idx, pair.length).trim(); - - // quoted values - if ('"' == val[0]) { - val = val.slice(1, -1); - } - - // only assign once - if (undefined == obj[key]) { - try { - obj[key] = dec(val); - } catch (e) { - obj[key] = val; - } - } - }); - - return obj; -}; - -var encode = encodeURIComponent; -var decode = decodeURIComponent; - -module.exports.serialize = serialize; -module.exports.parse = parse; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/package.json deleted file mode 100644 index 7dbb395..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "author": { - "name": "Roman Shtylman", - "email": "shtylman@gmail.com" - }, - "name": "cookie", - "description": "cookie parsing and serialization", - "version": "0.1.2", - "repository": { - "type": "git", - "url": "git://github.com/shtylman/node-cookie.git" - }, - "keywords": [ - "cookie", - "cookies" - ], - "main": "index.js", - "scripts": { - "test": "mocha" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "1.x.x" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "bugs": { - "url": "https://github.com/shtylman/node-cookie/issues" - }, - "homepage": "https://github.com/shtylman/node-cookie", - "_id": "cookie@0.1.2", - "dist": { - "shasum": "72fec3d24e48a3432073d90c12642005061004b1", - "tarball": "http://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz" - }, - "_from": "cookie@0.1.2", - "_npmVersion": "1.4.6", - "_npmUser": { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - "maintainers": [ - { - "name": "shtylman", - "email": "shtylman@gmail.com" - } - ], - "directories": {}, - "_shasum": "72fec3d24e48a3432073d90c12642005061004b1", - "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.jshintrc b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.jshintrc deleted file mode 100644 index 299877f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.jshintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "laxbreak": true -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.npmignore deleted file mode 100644 index 7e6163d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -support -test -examples -example -*.sock -dist diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/History.md deleted file mode 100644 index 3b96560..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/History.md +++ /dev/null @@ -1,144 +0,0 @@ - -1.0.4 / 2014-07-15 -================== - - * dist: recompile - * example: remove `console.info()` log usage - * example: add "Content-Type" UTF-8 header to browser example - * browser: place %c marker after the space character - * browser: reset the "content" color via `color: inherit` - * browser: add colors support for Firefox >= v31 - * debug: prefer an instance `log()` function over the global one (#119) - * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) - -1.0.3 / 2014-07-09 -================== - - * Add support for multiple wildcards in namespaces (#122, @seegno) - * browser: fix lint - -1.0.2 / 2014-06-10 -================== - - * browser: update color palette (#113, @gscottolson) - * common: make console logging function configurable (#108, @timoxley) - * node: fix %o colors on old node <= 0.8.x - * Makefile: find node path using shell/which (#109, @timoxley) - -1.0.1 / 2014-06-06 -================== - - * browser: use `removeItem()` to clear localStorage - * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) - * package: add "contributors" section - * node: fix comment typo - * README: list authors - -1.0.0 / 2014-06-04 -================== - - * make ms diff be global, not be scope - * debug: ignore empty strings in enable() - * node: make DEBUG_COLORS able to disable coloring - * *: export the `colors` array - * npmignore: don't publish the `dist` dir - * Makefile: refactor to use browserify - * package: add "browserify" as a dev dependency - * Readme: add Web Inspector Colors section - * node: reset terminal color for the debug content - * node: map "%o" to `util.inspect()` - * browser: map "%j" to `JSON.stringify()` - * debug: add custom "formatters" - * debug: use "ms" module for humanizing the diff - * Readme: add "bash" syntax highlighting - * browser: add Firebug color support - * browser: add colors for WebKit browsers - * node: apply log to `console` - * rewrite: abstract common logic for Node & browsers - * add .jshintrc file - -0.8.1 / 2014-04-14 -================== - - * package: re-add the "component" section - -0.8.0 / 2014-03-30 -================== - - * add `enable()` method for nodejs. Closes #27 - * change from stderr to stdout - * remove unnecessary index.js file - -0.7.4 / 2013-11-13 -================== - - * remove "browserify" key from package.json (fixes something in browserify) - -0.7.3 / 2013-10-30 -================== - - * fix: catch localStorage security error when cookies are blocked (Chrome) - * add debug(err) support. Closes #46 - * add .browser prop to package.json. Closes #42 - -0.7.2 / 2013-02-06 -================== - - * fix package.json - * fix: Mobile Safari (private mode) is broken with debug - * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript - -0.7.1 / 2013-02-05 -================== - - * add repository URL to package.json - * add DEBUG_COLORED to force colored output - * add browserify support - * fix component. Closes #24 - -0.7.0 / 2012-05-04 -================== - - * Added .component to package.json - * Added debug.component.js build - -0.6.0 / 2012-03-16 -================== - - * Added support for "-" prefix in DEBUG [Vinay Pulim] - * Added `.enabled` flag to the node version [TooTallNate] - -0.5.0 / 2012-02-02 -================== - - * Added: humanize diffs. Closes #8 - * Added `debug.disable()` to the CS variant - * Removed padding. Closes #10 - * Fixed: persist client-side variant again. Closes #9 - -0.4.0 / 2012-02-01 -================== - - * Added browser variant support for older browsers [TooTallNate] - * Added `debug.enable('project:*')` to browser variant [TooTallNate] - * Added padding to diff (moved it to the right) - -0.3.0 / 2012-01-26 -================== - - * Added millisecond diff when isatty, otherwise UTC string - -0.2.0 / 2012-01-22 -================== - - * Added wildcard support - -0.1.0 / 2011-12-02 -================== - - * Added: remove colors unless stderr isatty [TooTallNate] - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Makefile deleted file mode 100644 index b0bde6e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Makefile +++ /dev/null @@ -1,33 +0,0 @@ - -# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 -THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) -THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) - -# BIN directory -BIN := $(THIS_DIR)/node_modules/.bin - -# applications -NODE ?= $(shell which node) -NPM ?= $(NODE) $(shell which npm) -BROWSERIFY ?= $(NODE) $(BIN)/browserify - -all: dist/debug.js - -install: node_modules - -clean: - @rm -rf node_modules dist - -dist: - @mkdir -p $@ - -dist/debug.js: node_modules browser.js debug.js dist - @$(BROWSERIFY) \ - --standalone debug \ - . > $@ - -node_modules: package.json - @NODE_ENV= $(NPM) install - @touch node_modules - -.PHONY: all install clean diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Readme.md deleted file mode 100644 index e59b9ad..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Readme.md +++ /dev/null @@ -1,156 +0,0 @@ -# debug - - tiny node.js debugging utility modelled after node core's debugging technique. - -## Installation - -```bash -$ npm install debug -``` - -## Usage - - With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility. - -Example _app.js_: - -```js -var debug = require('debug')('http') - , http = require('http') - , name = 'My App'; - -// fake app - -debug('booting %s', name); - -http.createServer(function(req, res){ - debug(req.method + ' ' + req.url); - res.end('hello\n'); -}).listen(3000, function(){ - debug('listening'); -}); - -// fake worker of some kind - -require('./worker'); -``` - -Example _worker.js_: - -```js -var debug = require('debug')('worker'); - -setInterval(function(){ - debug('doing some work'); -}, 1000); -``` - - The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: - - ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) - - ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) - -## Millisecond diff - - When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. - - ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) - - When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: - - ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) - -## Conventions - - If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". - -## Wildcards - - The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect.compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. - - You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:". - -## Browser support - - Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. - -```js -a = debug('worker:a'); -b = debug('worker:b'); - -setInterval(function(){ - a('doing some work'); -}, 1000); - -setInterval(function(){ - b('doing some work'); -}, 1200); -``` - -#### Web Inspector Colors - - Colors are also enabled on "Web Inspectors" that understand the `%c` formatting - option. These are WebKit web inspectors, Firefox ([since version - 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) - and the Firebug plugin for Firefox (any version). - - Colored output looks something like: - - ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) - -### stderr vs stdout - -You can set an alternative logging method per-namespace by overriding the `log` method on a per-namespace or globally: - -Example _stderr.js_: - -```js -var debug = require('../'); -var log = debug('app:log'); - -// by default console.log is used -log('goes to stdout!'); - -var error = debug('app:error'); -// set this namespace to log via console.error -error.log = console.error.bind(console); // don't forget to bind to console! -error('goes to stderr'); -log('still goes to stdout!'); - -// set all output to go via console.warn -// overrides all per-namespace log settings -debug.log = console.warn.bind(console); -log('now goes to stderr via console.warn'); -error('still goes to stderr, but via console.warn now'); -``` - -## Authors - - - TJ Holowaychuk - - Nathan Rajlich - -## License - -(The MIT License) - -Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/browser.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/browser.js deleted file mode 100644 index ce6369f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/browser.js +++ /dev/null @@ -1,147 +0,0 @@ - -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // is webkit? http://stackoverflow.com/a/16459606/376773 - return ('WebkitAppearance' in document.documentElement.style) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (window.console && (console.firebug || (console.exception && console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - return JSON.stringify(v); -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs() { - var args = arguments; - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return args; - - var c = 'color: ' + this.color; - args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1)); - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); - return args; -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // This hackery is required for IE8, - // where the `console.log` function doesn't have 'apply' - return 'object' == typeof console - && 'function' == typeof console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - localStorage.removeItem('debug'); - } else { - localStorage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - var r; - try { - r = localStorage.debug; - } catch(e) {} - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/component.json deleted file mode 100644 index ab5f3ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/component.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "debug", - "repo": "visionmedia/debug", - "description": "small debugging utility", - "version": "1.0.4", - "keywords": [ - "debug", - "log", - "debugger" - ], - "main": "browser.js", - "scripts": [ - "browser.js", - "debug.js" - ], - "dependencies": { - "guille/ms.js": "0.6.1" - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/debug.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/debug.js deleted file mode 100644 index 7571a86..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/debug.js +++ /dev/null @@ -1,197 +0,0 @@ - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = debug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = require('ms'); - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lowercased letter, i.e. "n". - */ - -exports.formatters = {}; - -/** - * Previously assigned color. - */ - -var prevColor = 0; - -/** - * Previous log timestamp. - */ - -var prevTime; - -/** - * Select a color. - * - * @return {Number} - * @api private - */ - -function selectColor() { - return exports.colors[prevColor++ % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function debug(namespace) { - - // define the `disabled` version - function disabled() { - } - disabled.enabled = false; - - // define the `enabled` version - function enabled() { - - var self = enabled; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // add the `color` if not set - if (null == self.useColors) self.useColors = exports.useColors(); - if (null == self.color && self.useColors) self.color = selectColor(); - - var args = Array.prototype.slice.call(arguments); - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %o - args = ['%o'].concat(args); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - if ('function' === typeof exports.formatArgs) { - args = exports.formatArgs.apply(self, args); - } - var logFn = enabled.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - enabled.enabled = true; - - var fn = exports.enabled(namespace) ? enabled : disabled; - - fn.namespace = namespace; - - return fn; -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - var split = (namespaces || '').split(/[\s,]+/); - var len = split.length; - - for (var i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node.js deleted file mode 100644 index c94f7d1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node.js +++ /dev/null @@ -1,129 +0,0 @@ - -/** - * Module dependencies. - */ - -var tty = require('tty'); -var util = require('util'); - -/** - * This is the Node.js implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - var debugColors = (process.env.DEBUG_COLORS || '').trim().toLowerCase(); - if (0 === debugColors.length) { - return tty.isatty(1); - } else { - return '0' !== debugColors - && 'no' !== debugColors - && 'false' !== debugColors - && 'disabled' !== debugColors; - } -} - -/** - * Map %o to `util.inspect()`, since Node doesn't do that out of the box. - */ - -var inspect = (4 === util.inspect.length ? - // node <= 0.8.x - function (v, colors) { - return util.inspect(v, void 0, void 0, colors); - } : - // node > 0.8.x - function (v, colors) { - return util.inspect(v, { colors: colors }); - } -); - -exports.formatters.o = function(v) { - return inspect(v, this.useColors) - .replace(/\s*\n\s*/g, ' '); -}; - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs() { - var args = arguments; - var useColors = this.useColors; - var name = this.namespace; - - if (useColors) { - var c = this.color; - - args[0] = ' \u001b[9' + c + 'm' + name + ' ' - + '\u001b[0m' - + args[0] + '\u001b[3' + c + 'm' - + ' +' + exports.humanize(this.diff) + '\u001b[0m'; - } else { - args[0] = new Date().toUTCString() - + ' ' + name + ' ' + args[0]; - } - return args; -} - -/** - * Invokes `console.log()` with the specified arguments. - */ - -function log() { - return console.log.apply(console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ - -exports.enable(load()); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/README.md deleted file mode 100644 index d4ab12a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours', { long: true })) // "10 hours" -``` - -- Node/Browser compatible. Published as `ms` in NPM. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/index.js deleted file mode 100644 index c5847f8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/package.json deleted file mode 100644 index c4dd654..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "ms", - "version": "0.6.2", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "readme": "# ms.js: miliseconds conversion utility\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('100') // 100\n```\n\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(ms('10 hours', { long: true })) // \"10 hours\"\n```\n\n- Node/Browser compatible. Published as `ms` in NPM.\n- If a number is supplied to `ms`, a string with a unit is returned.\n- If a string that contains the number is supplied, it returns it as\na number (e.g: it returns `100` for `'100'`).\n- If you pass a string with a number and a valid unit, the number of\nequivalent ms is returned.\n\n## License\n\nMIT", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "_id": "ms@0.6.2", - "dist": { - "shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - }, - "_from": "ms@0.6.2", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "directories": {}, - "_shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "homepage": "https://github.com/guille/ms.js" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/package.json deleted file mode 100644 index 823c26d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "debug", - "version": "1.0.4", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/debug.git" - }, - "description": "small debugging utility", - "keywords": [ - "debug", - "log", - "debugger" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Nathan Rajlich", - "email": "nathan@tootallnate.net", - "url": "http://n8.io" - } - ], - "dependencies": { - "ms": "0.6.2" - }, - "devDependencies": { - "browserify": "4.1.6", - "mocha": "*" - }, - "main": "./node.js", - "browser": "./browser.js", - "component": { - "scripts": { - "debug/index.js": "browser.js", - "debug/debug.js": "debug.js" - } - }, - "gitHead": "abc10a5912f79d251752d18350e269fe0b0fbbf9", - "bugs": { - "url": "https://github.com/visionmedia/debug/issues" - }, - "homepage": "https://github.com/visionmedia/debug", - "_id": "debug@1.0.4", - "scripts": {}, - "_shasum": "5b9c256bd54b6ec02283176fa8a0ede6d154cbf8", - "_from": "debug@1.0.4", - "_npmVersion": "1.4.14", - "_npmUser": { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - } - ], - "dist": { - "shasum": "5b9c256bd54b6ec02283176fa8a0ede6d154cbf8", - "tarball": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/.npmignore deleted file mode 100644 index 0c7e391..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -coverage/ -files/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/History.md deleted file mode 100644 index ba1af12..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/History.md +++ /dev/null @@ -1,56 +0,0 @@ -0.4.4 / 2014-07-27 -================== - - * Work-around v8 generating empty stack traces - -0.4.3 / 2014-07-26 -================== - - * Fix exception when global `Error.stackTraceLimit` is too low - -0.4.2 / 2014-07-19 -================== - - * Correct call site for wrapped functions and properties - -0.4.1 / 2014-07-19 -================== - - * Improve automatic message generation for function properties - -0.4.0 / 2014-07-19 -================== - - * Add `TRACE_DEPRECATION` environment variable - * Remove non-standard grey color from color output - * Support `--no-deprecation` argument - * Support `--trace-deprecation` argument - * Support `deprecate.property(fn, prop, message)` - -0.3.0 / 2014-06-16 -================== - - * Add `NO_DEPRECATION` environment variable - -0.2.0 / 2014-06-15 -================== - - * Add `deprecate.property(obj, prop, message)` - * Remove `supports-color` dependency for node.js 0.8 - -0.1.0 / 2014-06-15 -================== - - * Add `deprecate.function(fn, message)` - * Add `process.on('deprecation', fn)` emitter - * Automatically generate message when omitted from `deprecate()` - -0.0.1 / 2014-06-15 -================== - - * Fix warning for dynamic calls at singe call site - -0.0.0 / 2014-06-15 -================== - - * Initial implementation diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/Readme.md deleted file mode 100644 index 47a53a1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/Readme.md +++ /dev/null @@ -1,272 +0,0 @@ -# depd - -[![NPM version](https://badge.fury.io/js/depd.svg)](http://badge.fury.io/js/depd) -[![Build Status](https://travis-ci.org/dougwilson/nodejs-depd.svg?branch=master)](https://travis-ci.org/dougwilson/nodejs-depd) -[![Coverage Status](https://img.shields.io/coveralls/dougwilson/nodejs-depd.svg?branch=master)](https://coveralls.io/r/dougwilson/nodejs-depd) -[![Gittip](http://img.shields.io/gittip/dougwilson.svg)](https://www.gittip.com/dougwilson/) - -Deprecate all the things - -> With great modules comes great responsibility; mark things deprecated! - -## Install - -```sh -$ npm install depd -``` - -## API - -```js -var deprecate = require('depd')('my-module') -``` - -This library allows you to display deprecation messages to your users. -This library goes above and beyond with deprecation warnings by -introspecting the call stack (but only the bits that it is interested -in). - -Instead of just warning on the first invocation of a deprecated -function and never again, this module will warn on the first invocation -of a deprecated function per unique call site, making it ideal to alert -users of all deprecated uses across the code base, rather than just -whatever happens to execute first. - -The deprecation warnings from this module also include the file and line -information for the call into the module that the deprecated function was -in. - -### depd(namespace) - -Create a new deprecate function that uses the given namespace name in the -messages and will display the call site prior to the stack entering the -file this function was called from. It is highly suggested you use the -name of your module as the namespace. - -### deprecate(message) - -Call this function from deprecated code to display a deprecation message. -This message will appear once per unique caller site. Caller site is the -first call site in the stack in a different file from the caller of this -function. - -If the message is omitted, a message is generated for you based on the site -of the `deprecate()` call and will display the name of the function called, -similar to the name displayed in a stack trace. - -### deprecate.function(fn, message) - -Call this function to wrap a given function in a deprecation message on any -call to the function. An optional message can be supplied to provide a custom -message. - -### deprecate.property(obj, prop, message) - -Call this function to wrap a given property on object in a deprecation message -on any accessing or setting of the property. An optional message can be supplied -to provide a custom message. - -The method must be called on the object where the property belongs (not -inherited from the prototype). - -If the property is a data descriptor, it will be converted to an accessor -descriptor in order to display the deprecation message. - -### process.on('deprecation', fn) - -This module will allow easy capturing of deprecation errors by emitting the -errors as the type "deprecation" on the global `process`. If there are no -listeners for this type, the errors are written to STDERR as normal, but if -there are any listeners, nothing will be written to STDERR and instead only -emitted. From there, you can write the errors in a different format or to a -logging source. - -The error represents the deprecation and is emitted only once with the same -rules as writing to STDERR. The error has the following properties: - - - `message` - This is the message given by the library - - `name` - This is always `'DeprecationError'` - - `namespace` - This is the namespace the deprecation came from - - `stack` - This is the stack of the call to the deprecated thing - -Example `error.stack` output: - -``` -DeprecationError: my-cool-module deprecated oldfunction - at Object. ([eval]-wrapper:6:22) - at Module._compile (module.js:456:26) - at evalScript (node.js:532:25) - at startup (node.js:80:7) - at node.js:902:3 -``` - -### process.env.NO_DEPRECATION - -As a user of modules that are deprecated, the environment variable `NO_DEPRECATION` -is provided as a quick solution to silencing deprecation warnings from being -output. The format of this is similar to that of `DEBUG`: - -```sh -$ NO_DEPRECATION=my-module,othermod node app.js -``` - -This will suppress deprecations from being output for "my-module" and "othermod". -The value is a list of comma-separated namespaces. To suppress every warning -across all namespaces, use the value `*` for a namespace. - -Providing the argument `--no-deprecation` to the `node` executable will suppress -all deprecations. - -**NOTE** This will not suppress the deperecations given to any "deprecation" -event listeners, just the output to STDERR. - -### process.env.TRACE_DEPRECATION - -As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION` -is provided as a solution to getting more detailed location information in deprecation -warnings by including the entire stack trace. The format of this is the same as -`NO_DEPRECATION`: - -```sh -$ TRACE_DEPRECATION=my-module,othermod node app.js -``` - -This will include stack traces for deprecations being output for "my-module" and -"othermod". The value is a list of comma-separated namespaces. To trace every -warning across all namespaces, use the value `*` for a namespace. - -Providing the argument `--trace-deprecation` to the `node` executable will trace -all deprecations. - -**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`. - -## Display - -![message](files/message.png) - -When a user calls a function in your library that you mark deprecated, they -will see the following written to STDERR (in the given colors, similar colors -and layout to the `debug` module): - -``` -bright cyan bright yellow -| | reset cyan -| | | | -▼ ▼ ▼ ▼ -my-cool-module deprecated oldfunction [eval]-wrapper:6:22 -▲ ▲ ▲ ▲ -| | | | -namespace | | location of mycoolmod.oldfunction() call - | deprecation message - the word "deprecated" -``` - -If the user redirects their STDERR to a file or somewhere that does not support -colors, they see (similar layout to the `debug` module): - -``` -Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22 -▲ ▲ ▲ ▲ ▲ -| | | | | -timestamp of message namespace | | location of mycoolmod.oldfunction() call - | deprecation message - the word "deprecated" -``` - -## Examples - -### Deprecating all calls to a function - -This will display a deprecated message about "oldfunction" being deprecated -from "my-module" on STDERR. - -```js -var deprecate = require('depd')('my-cool-module') - -// message automatically derived from function name -// Object.oldfunction -exports.oldfunction = deprecate.function(function oldfunction() { - // all calls to function are deprecated -}) - -// specific message -exports.oldfunction = deprecate.function(function () { - // all calls to function are deprecated -}, 'oldfunction') -``` - -### Conditionally deprecating a function call - -This will display a deprecated message about "weirdfunction" being deprecated -from "my-module" on STDERR when called with less than 2 arguments. - -```js -var deprecate = require('depd')('my-cool-module') - -exports.weirdfunction = function () { - if (arguments.length < 2) { - // calls with 0 or 1 args are deprecated - deprecate('weirdfunction args < 2') - } -} -``` - -When calling `deprecate` as a function, the warning is counted per call site -within your own module, so you can display different deprecations depending -on different situations and the users will still get all the warnings: - -```js -var deprecate = require('depd')('my-cool-module') - -exports.weirdfunction = function () { - if (arguments.length < 2) { - // calls with 0 or 1 args are deprecated - deprecate('weirdfunction args < 2') - } else if (typeof arguments[0] !== 'string') { - // calls with non-string first argument are deprecated - deprecate('weirdfunction non-string first arg') - } -} -``` - -### Deprecating property access - -This will display a deprecated message about "oldprop" being deprecated -from "my-module" on STDERR when accessed. A deprecation will be displayed -when setting the value and when getting the value. - -```js -var deprecate = require('depd')('my-cool-module') - -exports.oldprop = 'something' - -// message automatically derives from property name -deprecate.property(exports, 'oldprop') - -// explicit message -deprecate.property(exports, 'oldprop', 'oldprop >= 0.10') -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/index.js deleted file mode 100644 index a6fb372..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/index.js +++ /dev/null @@ -1,520 +0,0 @@ -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter -var relative = require('path').relative - -/** - * Module exports. - */ - -module.exports = depd - -/** - * Get the path to base files on. - */ - -var basePath = process.cwd() - -/** - * Get listener count on event emitter. - */ - -/*istanbul ignore next*/ -var eventListenerCount = EventEmitter.listenerCount - || function (emitter, type) { return emitter.listeners(type).length } - -/** - * Determine if namespace is contained in the string. - */ - -function containsNamespace(str, namespace) { - var val = str.split(/[ ,]+/) - - namespace = String(namespace).toLowerCase() - - for (var i = 0 ; i < val.length; i++) { - if (!(str = val[i])) continue; - - // namespace contained - if (str === '*' || str.toLowerCase() === namespace) { - return true - } - } - - return false -} - -/** - * Convert a data descriptor to accessor descriptor. - */ - -function convertDataDescriptorToAccessor(obj, prop, message) { - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - var value = descriptor.value - - descriptor.get = function getter() { return value } - - if (descriptor.writable) { - descriptor.set = function setter(val) { return value = val } - } - - delete descriptor.value - delete descriptor.writable - - Object.defineProperty(obj, prop, descriptor) - - return descriptor -} - -/** - * Create arguments string to keep arity. - */ - -function createArgumentsString(arity) { - var str = '' - - for (var i = 0; i < arity; i++) { - str += ', arg' + i - } - - return str.substr(2) -} - -/** - * Create stack string from stack. - */ - -function createStackString(stack) { - var str = this.name + ': ' + this.namespace - - if (this.message) { - str += ' deprecated ' + this.message - } - - for (var i = 0; i < stack.length; i++) { - str += '\n at ' + stack[i].toString() - } - - return str -} - -/** - * Create deprecate for namespace in caller. - */ - -function depd(namespace) { - if (!namespace) { - throw new TypeError('argument namespace is required') - } - - var stack = getStack() - var site = callSiteLocation(stack[1]) - var file = site[0] - - function deprecate(message) { - // call to self as log - log.call(deprecate, message) - } - - deprecate._file = file - deprecate._ignored = isignored(namespace) - deprecate._namespace = namespace - deprecate._traced = istraced(namespace) - deprecate._warned = Object.create(null) - - deprecate.function = wrapfunction - deprecate.property = wrapproperty - - return deprecate -} - -/** - * Determine if namespace is ignored. - */ - -function isignored(namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.noDeprecation) { - // --no-deprecation support - return true - } - - var str = process.env.NO_DEPRECATION || '' - - // namespace ignored - return containsNamespace(str, namespace) -} - -/** - * Determine if namespace is traced. - */ - -function istraced(namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.traceDeprecation) { - // --trace-deprecation support - return true - } - - var str = process.env.TRACE_DEPRECATION || '' - - // namespace traced - return containsNamespace(str, namespace) -} - -/** - * Display deprecation message. - */ - -function log(message, site) { - var haslisteners = eventListenerCount(process, 'deprecation') !== 0 - - // abort early if no destination - if (!haslisteners && this._ignored) { - return - } - - var caller - var callFile - var callSite - var i = 0 - var seen = false - var stack = getStack() - var file = this._file - - if (site) { - // provided site - callSite = callSiteLocation(stack[1]) - callSite.name = site.name - file = callSite[0] - } else { - // get call site - i = 2 - site = callSiteLocation(stack[i]) - callSite = site - } - - // get caller of deprecated thing in relation to file - for (; i < stack.length; i++) { - caller = callSiteLocation(stack[i]) - callFile = caller[0] - - if (callFile === file) { - seen = true - } else if (callFile === this._file) { - file = this._file - } else if (seen) { - break - } - } - - var key = caller - ? site.join(':') + '__' + caller.join(':') - : undefined - - if (key !== undefined && key in this._warned) { - // already warned - return - } - - this._warned[key] = true - - // generate automatic message from call site - if (!message) { - message = callSite === site || !callSite.name - ? defaultMessage(site) - : defaultMessage(callSite) - } - - // emit deprecation if listeners exist - if (haslisteners) { - var err = DeprecationError(this._namespace, message, stack.slice(i)) - process.emit('deprecation', err) - return - } - - // format and write message - var format = process.stderr.isTTY - ? formatColor - : formatPlain - var msg = format.call(this, message, caller, stack.slice(i)) - process.stderr.write(msg + '\n', 'utf8') - - return -} - -/** - * Get call site location as array. - */ - -function callSiteLocation(callSite) { - var file = callSite.getFileName() || '' - var line = callSite.getLineNumber() - var colm = callSite.getColumnNumber() - - if (callSite.isEval()) { - file = callSite.getEvalOrigin() + ', ' + file - } - - var site = [file, line, colm] - - site.callSite = callSite - site.name = callSite.getFunctionName() - - return site -} - -/** - * Generate a default message from the site. - */ - -function defaultMessage(site) { - var callSite = site.callSite - var funcName = site.name - var typeName = callSite.getTypeName() - - // make useful anonymous name - if (!funcName) { - funcName = '' - } - - // make useful type name - if (typeName === 'Function') { - typeName = callSite.getThis().name || typeName - } - - return callSite.getMethodName() - ? typeName + '.' + funcName - : funcName -} - -/** - * Format deprecation message without color. - */ - -function formatPlain(msg, caller, stack) { - var timestamp = new Date().toUTCString() - - var formatted = timestamp - + ' ' + this._namespace - + ' deprecated ' + msg - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n at ' + stack[i].toString() - } - - return formatted - } - - if (caller) { - formatted += ' at ' + formatLocation(caller) - } - - return formatted -} - -/** - * Format deprecation message with color. - */ - -function formatColor(msg, caller, stack) { - var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' // bold cyan - + ' \x1b[33;1mdeprecated\x1b[22;39m' // bold yellow - + ' \x1b[0m' + msg + '\x1b[39m' // reset - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n \x1b[36mat ' + stack[i].toString() + '\x1b[39m' // cyan - } - - return formatted - } - - if (caller) { - formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan - } - - return formatted -} - -/** - * Format call site location. - */ - -function formatLocation(callSite) { - return relative(basePath, callSite[0]) - + ':' + callSite[1] - + ':' + callSite[2] -} - -/** - * Get the stack as array of call sites. - */ - -function getStack() { - var limit = Error.stackTraceLimit - var obj = {} - var prep = Error.prepareStackTrace - - Error.prepareStackTrace = prepareObjectStackTrace - Error.stackTraceLimit = Math.max(10, limit) - - // capture the stack - Error.captureStackTrace(obj) - - // slice this function off the top - var stack = obj.stack.slice(1) - - Error.prepareStackTrace = prep - Error.stackTraceLimit = limit - - return stack -} - -/** - * Capture call site stack from v8. - */ - -function prepareObjectStackTrace(obj, stack) { - return stack -} - -/** - * Return a wrapped function in a deprecation message. - */ - -function wrapfunction(fn, message) { - if (typeof fn !== 'function') { - throw new TypeError('argument fn must be a function') - } - - var args = createArgumentsString(fn.length) - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - site.name = fn.name - - var deprecatedfn = eval('(function (' + args + ') {\n' - + 'log.call(deprecate, message, site)\n' - + 'return fn.apply(this, arguments)\n' - + '})') - - return deprecatedfn -} - -/** - * Wrap property in a deprecation message. - */ - -function wrapproperty(obj, prop, message) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - throw new TypeError('argument obj must be object') - } - - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - - if (!descriptor) { - throw new TypeError('must call property on owner object') - } - - if (!descriptor.configurable) { - throw new TypeError('property must be configurable') - } - - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - // set site name - site.name = prop - - // convert data descriptor - if ('value' in descriptor) { - descriptor = convertDataDescriptorToAccessor(obj, prop, message) - } - - var get = descriptor.get - var set = descriptor.set - - // wrap getter - if (typeof get === 'function') { - descriptor.get = function getter() { - log.call(deprecate, message, site) - return get.apply(this, arguments) - } - } - - // wrap setter - if (typeof set === 'function') { - descriptor.set = function setter() { - log.call(deprecate, message, site) - return set.apply(this, arguments) - } - } - - Object.defineProperty(obj, prop, descriptor) -} - -/** - * Create DeprecationError for deprecation - */ - -function DeprecationError(namespace, message, stack) { - var error = new Error() - var stackString - - Object.defineProperty(error, 'constructor', { - value: DeprecationError - }) - - Object.defineProperty(error, 'message', { - configurable: true, - enumerable: false, - value: message, - writable: true - }) - - Object.defineProperty(error, 'name', { - enumerable: false, - configurable: true, - value: 'DeprecationError', - writable: true - }) - - Object.defineProperty(error, 'namespace', { - configurable: true, - enumerable: false, - value: namespace, - writable: true - }) - - Object.defineProperty(error, 'stack', { - configurable: true, - enumerable: false, - get: function () { - if (stackString !== undefined) { - return stackString - } - - // prepare stack trace - return stackString = createStackString.call(this, stack) - }, - set: function setter(val) { - stackString = val - } - }) - - return error -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/package.json deleted file mode 100644 index 6935dc5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "depd", - "description": "Deprecate all the things", - "version": "0.4.4", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "deprecate", - "deprecated" - ], - "repository": { - "type": "git", - "url": "git://github.com/dougwilson/nodejs-depd" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.20.1", - "should": "~4.0.4" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec --bail --require should test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --require should test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --require should test/" - }, - "bugs": { - "url": "https://github.com/dougwilson/nodejs-depd/issues" - }, - "homepage": "https://github.com/dougwilson/nodejs-depd", - "_id": "depd@0.4.4", - "dist": { - "shasum": "07091fae75f97828d89b4a02a2d4778f0e7c0662", - "tarball": "http://registry.npmjs.org/depd/-/depd-0.4.4.tgz" - }, - "_from": "depd@0.4.4", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "07091fae75f97828d89b4a02a2d4778f0e7c0662", - "_resolved": "https://registry.npmjs.org/depd/-/depd-0.4.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/.npmignore deleted file mode 100644 index 48a2e24..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -components -build diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Makefile deleted file mode 100644 index 3f6119d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Makefile +++ /dev/null @@ -1,11 +0,0 @@ - -build: components index.js - @component build - -components: - @Component install - -clean: - rm -fr build components template.js - -.PHONY: clean diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Readme.md deleted file mode 100644 index 2cfcc99..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Readme.md +++ /dev/null @@ -1,15 +0,0 @@ - -# escape-html - - Escape HTML entities - -## Example - -```js -var escape = require('escape-html'); -escape(str); -``` - -## License - - MIT \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/component.json deleted file mode 100644 index cb9740f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/component.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "escape-html", - "description": "Escape HTML entities", - "version": "1.0.1", - "keywords": ["escape", "html", "utility"], - "dependencies": {}, - "scripts": [ - "index.js" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/index.js deleted file mode 100644 index 2765211..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/index.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Escape special characters in the given string of html. - * - * @param {String} html - * @return {String} - * @api private - */ - -module.exports = function(html) { - return String(html) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(//g, '>'); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/package.json deleted file mode 100644 index ee240f0..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "escape-html", - "description": "Escape HTML entities", - "version": "1.0.1", - "keywords": [ - "escape", - "html", - "utility" - ], - "dependencies": {}, - "main": "index.js", - "component": { - "scripts": { - "escape-html/index.js": "index.js" - } - }, - "repository": { - "type": "git", - "url": "https://github.com/component/escape-html.git" - }, - "readme": "\n# escape-html\n\n Escape HTML entities\n\n## Example\n\n```js\nvar escape = require('escape-html');\nescape(str);\n```\n\n## License\n\n MIT", - "readmeFilename": "Readme.md", - "bugs": { - "url": "https://github.com/component/escape-html/issues" - }, - "homepage": "https://github.com/component/escape-html", - "_id": "escape-html@1.0.1", - "dist": { - "shasum": "181a286ead397a39a92857cfb1d43052e356bff0", - "tarball": "http://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz" - }, - "_from": "escape-html@1.0.1", - "_npmVersion": "1.3.15", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "181a286ead397a39a92857cfb1d43052e356bff0", - "_resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/HISTORY.md deleted file mode 100644 index 236e95e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/HISTORY.md +++ /dev/null @@ -1,27 +0,0 @@ -0.1.0 / 2014-07-16 -================== - - * Respond after request fully read - - prevents hung responses and socket hang ups - * deps: debug@1.0.4 - -0.0.3 / 2014-07-11 -================== - - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.0.2 / 2014-06-19 -================== - - * Handle invalid status codes - -0.0.1 / 2014-06-05 -================== - - * deps: debug@1.0.2 - -0.0.0 / 2014-06-05 -================== - - * Extracted from connect/express diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/README.md deleted file mode 100644 index c701e3a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/README.md +++ /dev/null @@ -1,140 +0,0 @@ -# finalhandler - -[![NPM version](https://badge.fury.io/js/finalhandler.svg)](https://badge.fury.io/js/finalhandler) -[![Build Status](https://travis-ci.org/expressjs/finalhandler.svg?branch=master)](https://travis-ci.org/expressjs/finalhandler) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/finalhandler.svg?branch=master)](https://coveralls.io/r/expressjs/finalhandler) - -Node.js function to invoke as the final step to respond to HTTP request. - -## Installation - -```sh -$ npm install finalhandler -``` - -## API - -```js -var finalhandler = require('finalhandler') -``` - -### finalhandler(req, res, [options]) - -Returns function to be invoked as the final step for the given `req` and `res`. -This function is to be invoked as `fn(err)`. If `err` is falsy, the handler will -write out a 404 response to the `res`. If it is truthy, an error response will -be written out to the `res`, and `res.statusCode` is set from `err.status`. - -The final handler will also unpipe anything from `req` when it is invoked. - -#### options.env - -By default, the environment is determined by `NODE_ENV` variable, but it can be -overridden by this option. - -#### options.onerror - -Provide a function to be called with the `err` when it exists. Can be used for -writing errors to a central location without excessive function generation. Called -as `onerror(err, req, res)`. - -## Examples - -### always 404 - -```js -var finalhandler = require('finalhandler') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - done() -}) - -server.listen(3000) -``` - -### perform simple action - -```js -var finalhandler = require('finalhandler') -var fs = require('fs') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - - fs.readFile('index.html', function (err, buf) { - if (err) return done(err) - res.setHeader('Content-Type', 'text/html') - res.end(buf) - }) -}) - -server.listen(3000) -``` - -### use with middleware-style functions - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -var serve = serveStatic('public') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - serve(req, res, done) -}) - -server.listen(3000) -``` - -### keep log of all errors - -```js -var finalhandler = require('finalhandler') -var fs = require('fs') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res, {onerror: logerror}) - - fs.readFile('index.html', function (err, buf) { - if (err) return done(err) - res.setHeader('Content-Type', 'text/html') - res.end(buf) - }) -}) - -server.listen(3000) - -function logerror(err) { - console.error(err.stack || err.toString()) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/index.js deleted file mode 100644 index 1ee90c6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/index.js +++ /dev/null @@ -1,158 +0,0 @@ -/*! - * finalhandler - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var debug = require('debug')('finalhandler') -var escapeHtml = require('escape-html') -var http = require('http') - -/** - * Variables. - */ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Module exports. - */ - -module.exports = finalhandler - -/** - * Final handler: - * - * @param {Request} req - * @param {Response} res - * @param {Object} [options] - * @return {Function} - * @api public - */ - -function finalhandler(req, res, options) { - options = options || {} - - // get environment - var env = options.env || process.env.NODE_ENV || 'development' - - // get error callback - var onerror = options.onerror - - return function (err) { - var msg - - // unhandled error - if (err) { - // default status code to 500 - if (!res.statusCode || res.statusCode < 400) { - res.statusCode = 500 - } - - // respect err.status - if (err.status) { - res.statusCode = err.status - } - - // production gets a basic error message - var msg = env === 'production' - ? http.STATUS_CODES[res.statusCode] - : err.stack || err.toString() - msg = escapeHtml(msg) - .replace(/\n/g, '
') - .replace(/ /g, '  ') + '\n' - } else { - res.statusCode = 404 - msg = 'Cannot ' + escapeHtml(req.method) + ' ' + escapeHtml(req.originalUrl || req.url) + '\n' - } - - debug('default %s', res.statusCode) - - // schedule onerror callback - if (err && onerror) { - defer(onerror, err, req, res) - } - - // cannot actually respond - if (res._header) { - return req.socket.destroy() - } - - send(req, res, res.statusCode, msg) - } -} - -/** - * Send response. - * - * @param {IncomingMessage} req - * @param {OutgoingMessage} res - * @param {number} status - * @param {string} body - * @api private - */ - -function send(req, res, status, body) { - function write() { - res.statusCode = status - res.setHeader('Content-Type', 'text/html; charset=utf-8') - res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8')) - - if (req.method === 'HEAD') { - res.end() - return - } - - res.end(body, 'utf8') - } - - if (!req.readable) { - write() - return - } - - // unpipe everything from the request - unpipe(req) - - // flush the request - req.once('end', write) - req.resume() -} - -/** - * Unpipe everything from a stream. - * - * @param {Object} stream - * @api private - */ - -/* istanbul ignore next: implementation differs between versions */ -function unpipe(stream) { - if (typeof stream.unpipe === 'function') { - // new-style - stream.unpipe() - return - } - - // Node.js 0.8 hack - var listener - var listeners = stream.listeners('close') - - for (var i = 0; i < listeners.length; i++) { - listener = listeners[i] - - if (listener.name !== 'cleanup' && listener.name !== 'onclose') { - continue - } - - // invoke the listener - listener.call(stream) - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/package.json deleted file mode 100644 index a690645..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "finalhandler", - "description": "Node.js final http responder", - "version": "0.1.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/finalhandler" - }, - "dependencies": { - "debug": "1.0.4", - "escape-html": "1.0.1" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.20.1", - "readable-stream": "~1.0.27", - "should": "~4.0.1", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/finalhandler/issues" - }, - "homepage": "https://github.com/expressjs/finalhandler", - "_id": "finalhandler@0.1.0", - "dist": { - "shasum": "da05bbc4f5f4a30c84ce1d91f3c154007c4e9daa", - "tarball": "http://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz" - }, - "_from": "finalhandler@0.1.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "da05bbc4f5f4a30c84ce1d91f3c154007c4e9daa", - "_resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/History.md deleted file mode 100644 index 12e1b3e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/History.md +++ /dev/null @@ -1,10 +0,0 @@ - -0.2.1 / 2014-01-29 -================== - - * fix: support max-age=0 for end-to-end revalidation - -0.2.0 / 2013-08-11 -================== - - * fix: return false for no-cache diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Readme.md deleted file mode 100644 index 61366c5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Readme.md +++ /dev/null @@ -1,57 +0,0 @@ - -# node-fresh - - HTTP response freshness testing - -## fresh(req, res) - - Check freshness of `req` and `res` headers. - - When the cache is "fresh" __true__ is returned, - otherwise __false__ is returned to indicate that - the cache is now stale. - -## Example: - -```js -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'luna' }; -fresh(req, res); -// => false - -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'tobi' }; -fresh(req, res); -// => true -``` - -## Installation - -``` -$ npm install fresh -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/index.js deleted file mode 100644 index 9c3f47d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/index.js +++ /dev/null @@ -1,53 +0,0 @@ - -/** - * Expose `fresh()`. - */ - -module.exports = fresh; - -/** - * Check freshness of `req` and `res` headers. - * - * When the cache is "fresh" __true__ is returned, - * otherwise __false__ is returned to indicate that - * the cache is now stale. - * - * @param {Object} req - * @param {Object} res - * @return {Boolean} - * @api public - */ - -function fresh(req, res) { - // defaults - var etagMatches = true; - var notModified = true; - - // fields - var modifiedSince = req['if-modified-since']; - var noneMatch = req['if-none-match']; - var lastModified = res['last-modified']; - var etag = res['etag']; - var cc = req['cache-control']; - - // unconditional request - if (!modifiedSince && !noneMatch) return false; - - // check for no-cache cache request directive - if (cc && cc.indexOf('no-cache') !== -1) return false; - - // parse if-none-match - if (noneMatch) noneMatch = noneMatch.split(/ *, */); - - // if-none-match - if (noneMatch) etagMatches = ~noneMatch.indexOf(etag) || '*' == noneMatch[0]; - - // if-modified-since - if (modifiedSince) { - modifiedSince = new Date(modifiedSince); - lastModified = new Date(lastModified); - notModified = lastModified <= modifiedSince; - } - - return !! (etagMatches && notModified); -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/package.json deleted file mode 100644 index bc9631a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "fresh", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "HTTP response freshness testing", - "version": "0.2.2", - "main": "index.js", - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-fresh.git" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/visionmedia/node-fresh/blob/master/Readme.md#license" - } - ], - "bugs": { - "url": "https://github.com/visionmedia/node-fresh/issues" - }, - "homepage": "https://github.com/visionmedia/node-fresh", - "_id": "fresh@0.2.2", - "dist": { - "shasum": "9731dcf5678c7faeb44fb903c4f72df55187fa77", - "tarball": "http://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz" - }, - "_from": "fresh@0.2.2", - "_npmVersion": "1.3.15", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "9731dcf5678c7faeb44fb903c4f72df55187fa77", - "_resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/HISTORY.md deleted file mode 100644 index 215cc22..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/HISTORY.md +++ /dev/null @@ -1,16 +0,0 @@ -0.2.0 / 2014-06-18 -================== - - * Add `typer.format()` to format media types - -0.1.0 / 2014-06-17 -================== - - * Accept `req` as argument to `parse` - * Accept `res` as argument to `parse` - * Parse media type with extra LWS between type and first parameter - -0.0.0 / 2014-06-13 -================== - - * Initial implementation diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/README.md deleted file mode 100644 index 338b7ce..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# media-typer - -[![NPM version](https://badge.fury.io/js/media-typer.svg)](https://badge.fury.io/js/media-typer) -[![Build Status](https://travis-ci.org/expressjs/media-typer.svg?branch=master)](https://travis-ci.org/expressjs/media-typer) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/media-typer.svg?branch=master)](https://coveralls.io/r/expressjs/media-typer) - -Simple RFC 6838 media type parser - -## Installation - -```sh -$ npm install media-typer -``` - -## API - -```js -var typer = require('media-typer') -``` - -### typer.parse(string) - -```js -var obj = typer.parse('image/svg+xml; charset=utf-8') -``` - -Parse a media type string. This will return an object with the following -properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`): - - - `type`: The type of the media type (always lower case). Example: `'image'` - - - `subtype`: The subtype of the media type (always lower case). Example: `'svg'` - - - `suffix`: The suffix of the media type (always lower case). Example: `'xml'` - - - `parameters`: An object of the parameters in the media type (name of parameter always lower case). Example: `{charset: 'utf-8'}` - -### typer.parse(req) - -```js -var obj = typer.parse(req) -``` - -Parse the `content-type` header from the given `req`. Short-cut for -`typer.parse(req.headers['content-type'])`. - -### typer.parse(res) - -```js -var obj = typer.parse(req) -``` - -Parse the `content-type` header set on the given `res`. Short-cut for -`typer.parse(res.getHeader('content-type'))`. - -### typer.format(obj) - -```js -var obj = typer.format({type: 'image', subtype: 'svg', suffix: 'xml'}) -``` - -Format an object into a media type string. This will return a string of the -mime type for the given object. For the properties of the object, see the -documentation for `typer.parse(string)`. - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/index.js deleted file mode 100644 index cbf2e17..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/index.js +++ /dev/null @@ -1,261 +0,0 @@ -/*! - * media-typer - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * RegExp to match *( ";" parameter ) in RFC 2616 sec 3.7 - * - * parameter = token "=" ( token | quoted-string ) - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) - * qdtext = > - * quoted-pair = "\" CHAR - * CHAR = - * TEXT = - * LWS = [CRLF] 1*( SP | HT ) - * CRLF = CR LF - * CR = - * LF = - * SP = - * SHT = - * CTL = - * OCTET = - */ -var paramRegExp = /; *([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *= *("(?:[ !\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u0020-\u007e])*"|[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) */g; -var textRegExp = /^[\u0020-\u007e\u0080-\u00ff]+$/ -var tokenRegExp = /^[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+$/ - -/** - * RegExp to match quoted-pair in RFC 2616 - * - * quoted-pair = "\" CHAR - * CHAR = - */ -var qescRegExp = /\\([\u0000-\u007f])/g; - -/** - * RegExp to match chars that must be quoted-pair in RFC 2616 - */ -var quoteRegExp = /([\\"])/g; - -/** - * RegExp to match type in RFC 6838 - * - * type-name = restricted-name - * subtype-name = restricted-name - * restricted-name = restricted-name-first *126restricted-name-chars - * restricted-name-first = ALPHA / DIGIT - * restricted-name-chars = ALPHA / DIGIT / "!" / "#" / - * "$" / "&" / "-" / "^" / "_" - * restricted-name-chars =/ "." ; Characters before first dot always - * ; specify a facet name - * restricted-name-chars =/ "+" ; Characters after last plus always - * ; specify a structured syntax suffix - * ALPHA = %x41-5A / %x61-7A ; A-Z / a-z - * DIGIT = %x30-39 ; 0-9 - */ -var subtypeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/ -var typeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/ -var typeRegExp = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/; - -/** - * Module exports. - */ - -exports.format = format -exports.parse = parse - -/** - * Format object to media type. - * - * @param {object} obj - * @return {string} - * @api public - */ - -function format(obj) { - if (!obj || typeof obj !== 'object') { - throw new TypeError('argument obj is required') - } - - var parameters = obj.parameters - var subtype = obj.subtype - var suffix = obj.suffix - var type = obj.type - - if (!type || !typeNameRegExp.test(type)) { - throw new TypeError('invalid type') - } - - if (!subtype || !subtypeNameRegExp.test(subtype)) { - throw new TypeError('invalid subtype') - } - - // format as type/subtype - var string = type + '/' + subtype - - // append +suffix - if (suffix) { - if (!typeNameRegExp.test(suffix)) { - throw new TypeError('invalid suffix') - } - - string += '+' + suffix - } - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - if (!tokenRegExp.test(param)) { - throw new TypeError('invalid parameter name') - } - - string += '; ' + param + '=' + qstring(parameters[param]) - } - } - - return string -} - -/** - * Parse media type to object. - * - * @param {string|object} string - * @return {Object} - * @api public - */ - -function parse(string) { - if (!string) { - throw new TypeError('argument string is required') - } - - // support req/res-like objects as argument - if (typeof string === 'object') { - string = getcontenttype(string) - } - - if (typeof string !== 'string') { - throw new TypeError('argument string is required to be a string') - } - - var index = string.indexOf(';') - var type = index !== -1 - ? string.substr(0, index) - : string - - var key - var match - var obj = splitType(type) - var params = {} - var value - - paramRegExp.lastIndex = index - - while (match = paramRegExp.exec(string)) { - key = match[1].toLowerCase() - value = match[2] - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(qescRegExp, '$1') - } - - params[key] = value - } - - obj.parameters = params - - return obj -} - -/** - * Get content-type from req/res objects. - * - * @param {object} - * @return {Object} - * @api private - */ - -function getcontenttype(obj) { - if (typeof obj.getHeader === 'function') { - // res-like - return obj.getHeader('content-type') - } - - if (typeof obj.headers === 'object') { - // req-like - return obj.headers && obj.headers['content-type'] - } -} - -/** - * Quote a string if necessary. - * - * @param {string} val - * @return {string} - * @api private - */ - -function qstring(val) { - var str = String(val) - - // no need to quote tokens - if (tokenRegExp.test(str)) { - return str - } - - if (str.length > 0 && !textRegExp.test(str)) { - throw new TypeError('invalid parameter value') - } - - return '"' + str.replace(quoteRegExp, '\\$1') + '"' -} - -/** - * Simply "type/subtype+siffx" into parts. - * - * @param {string} string - * @return {Object} - * @api private - */ - -function splitType(string) { - var match = typeRegExp.exec(string.toLowerCase()) - - if (!match) { - throw new TypeError('invalid media type') - } - - var type = match[1] - var subtype = match[2] - var suffix - - // suffix after last + - var index = subtype.lastIndexOf('+') - if (index !== -1) { - suffix = subtype.substr(index + 1) - subtype = subtype.substr(0, index) - } - - var obj = { - type: type, - subtype: subtype, - suffix: suffix - } - - return obj -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/package.json deleted file mode 100644 index 7ba61f9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "media-typer", - "description": "Simple RFC 6838 media type parser and formatter", - "version": "0.2.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/media-typer" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.1", - "should": "~4.0.4" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/media-typer/issues" - }, - "homepage": "https://github.com/expressjs/media-typer", - "_id": "media-typer@0.2.0", - "dist": { - "shasum": "d8a065213adfeaa2e76321a2b6dda36ff6335984", - "tarball": "http://registry.npmjs.org/media-typer/-/media-typer-0.2.0.tgz" - }, - "_from": "media-typer@0.2.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "d8a065213adfeaa2e76321a2b6dda36ff6335984", - "_resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/.npmignore deleted file mode 100644 index f62e605..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/.npmignore +++ /dev/null @@ -1,59 +0,0 @@ -# Compiled source # -################### -*.com -*.class -*.dll -*.exe -*.o -*.so - -# Packages # -############ -# it's better to unpack these files and commit the raw source -# git has its own built in compression methods -*.7z -*.dmg -*.gz -*.iso -*.jar -*.rar -*.tar -*.zip - -# Logs and databases # -###################### -*.log -*.sql -*.sqlite - -# OS generated files # -###################### -.DS_Store* -ehthumbs.db -Icon? -Thumbs.db - -# Node.js # -########### -lib-cov -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.gz - -pids -logs -results - -node_modules -npm-debug.log - -# Components # -############## - -/build -/components -/vendors \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/README.md deleted file mode 100644 index 50cf50c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Merge Descriptors [![Build Status](https://travis-ci.org/component/merge-descriptors.png)](https://travis-ci.org/component/merge-descriptors) - -Merge objects using descriptors. - -```js -var thing = { - get name() { - return 'jon' - } -} - -var animal = { - -} - -merge(animal, thing) - -animal.name === 'jon' -``` - -## API - -### merge(destination, source) - -Overwrites `destination`'s descriptors with `source`'s. - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/component.json deleted file mode 100644 index 7653906..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/component.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "merge-descriptors", - "description": "Merge objects using descriptors", - "version": "0.0.2", - "scripts": [ - "index.js" - ], - "repo": "component/merge-descriptors", - "license": "MIT" -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/index.js deleted file mode 100644 index e4e2379..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/index.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = function (dest, src) { - Object.getOwnPropertyNames(src).forEach(function (name) { - var descriptor = Object.getOwnPropertyDescriptor(src, name) - Object.defineProperty(dest, name, descriptor) - }) - - return dest -} \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/package.json deleted file mode 100644 index b1b83d4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "merge-descriptors", - "description": "Merge objects using descriptors", - "version": "0.0.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/component/merge-descriptors.git" - }, - "bugs": { - "url": "https://github.com/component/merge-descriptors/issues" - }, - "scripts": { - "test": "make test;" - }, - "homepage": "https://github.com/component/merge-descriptors", - "_id": "merge-descriptors@0.0.2", - "dist": { - "shasum": "c36a52a781437513c57275f39dd9d317514ac8c7", - "tarball": "http://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz" - }, - "_from": "merge-descriptors@0.0.2", - "_npmVersion": "1.3.17", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "directories": {}, - "_shasum": "c36a52a781437513c57275f39dd9d317514ac8c7", - "_resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/.npmignore deleted file mode 100644 index c2658d7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/History.md deleted file mode 100644 index d3996c2..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/History.md +++ /dev/null @@ -1,20 +0,0 @@ - -1.1.0 / 2014-07-05 -================== - - * add CONNECT - -1.0.1 / 2014-06-02 -================== - - * fix index.js to work with harmony transform - -1.0.0 / 2014-05-08 -================== - - * add PURGE. Closes #9 - -0.1.0 / 2013-10-28 -================== - - * add http.METHODS support diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/LICENSE deleted file mode 100644 index 8bce401..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2013-2014 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. - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/Readme.md deleted file mode 100644 index ac0658e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/Readme.md +++ /dev/null @@ -1,4 +0,0 @@ - -# Methods - - HTTP verbs that node core's parser supports. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/index.js deleted file mode 100644 index f7e3c48..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/index.js +++ /dev/null @@ -1,41 +0,0 @@ - -var http = require('http'); - -if (http.METHODS) { - - module.exports = http.METHODS.map(function(method){ - return method.toLowerCase(); - }); - -} else { - - module.exports = [ - 'get', - 'post', - 'put', - 'head', - 'delete', - 'options', - 'trace', - 'copy', - 'lock', - 'mkcol', - 'move', - 'purge', - 'propfind', - 'proppatch', - 'unlock', - 'report', - 'mkactivity', - 'checkout', - 'merge', - 'm-search', - 'notify', - 'subscribe', - 'unsubscribe', - 'patch', - 'search', - 'connect' - ]; - -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/package.json deleted file mode 100644 index 8d1c198..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "methods", - "version": "1.1.0", - "description": "HTTP methods that node supports", - "main": "index.js", - "scripts": { - "test": "./node_modules/mocha/bin/mocha" - }, - "keywords": [ - "http", - "methods" - ], - "author": { - "name": "TJ Holowaychuk" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/node-methods.git" - }, - "devDependencies": { - "mocha": "1.17.x" - }, - "gitHead": "2a4dd325d18436c33356e6be19e32e08a7c877ab", - "bugs": { - "url": "https://github.com/visionmedia/node-methods/issues" - }, - "homepage": "https://github.com/visionmedia/node-methods", - "_id": "methods@1.1.0", - "_shasum": "5dca4ee12df52ff3b056145986a8f01cbc86436f", - "_from": "methods@1.1.0", - "_npmVersion": "1.4.16", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "5dca4ee12df52ff3b056145986a8f01cbc86436f", - "tarball": "http://registry.npmjs.org/methods/-/methods-1.1.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/test/methods.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/test/methods.js deleted file mode 100644 index 527beab..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/test/methods.js +++ /dev/null @@ -1,33 +0,0 @@ -var http = require('http'); -var assert = require('assert'); -var methods = require('..'); - -describe('methods', function() { - - if (http.METHODS) { - - it('is a lowercased http.METHODS', function() { - var lowercased = http.METHODS.map(function(method) { - return method.toLowerCase(); - }); - assert.deepEqual(lowercased, methods); - }); - - } else { - - it('contains GET, POST, PUT, and DELETE', function() { - assert.notEqual(methods.indexOf('get'), -1); - assert.notEqual(methods.indexOf('post'), -1); - assert.notEqual(methods.indexOf('put'), -1); - assert.notEqual(methods.indexOf('delete'), -1); - }); - - it('is all lowercase', function() { - for (var i = 0; i < methods.length; i ++) { - assert(methods[i], methods[i].toLowerCase(), methods[i] + " isn't all lowercase"); - } - }); - - } - -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/.npmignore deleted file mode 100644 index 85c82a5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -benchmark/ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/HISTORY.md deleted file mode 100644 index cf36864..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/HISTORY.md +++ /dev/null @@ -1,36 +0,0 @@ -1.2.0 / 2014-07-21 -================== - - * Cache URLs based on original value - * Remove no-longer-needed URL mis-parse work-around - * Simplify the "fast-path" `RegExp` - -1.1.3 / 2014-07-08 -================== - - * Fix typo - -1.1.2 / 2014-07-08 -================== - - * Seriously fix Node.js 0.8 compatibility - -1.1.1 / 2014-07-08 -================== - - * Fix Node.js 0.8 compatibility - -1.1.0 / 2014-07-08 -================== - - * Incorporate URL href-only parse fast-path - -1.0.1 / 2014-03-08 -================== - - * Add missing `require` - -1.0.0 / 2014-03-08 -================== - - * Genesis from `connect` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/LICENSE deleted file mode 100644 index 991dc7d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ - -(The MIT License) - -Copyright (c) 2014 Jonathan Ong - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/README.md deleted file mode 100644 index 91a70db..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/README.md +++ /dev/null @@ -1,99 +0,0 @@ -# parseurl - -[![NPM version](https://badge.fury.io/js/parseurl.svg)](http://badge.fury.io/js/parseurl) -[![Build Status](https://travis-ci.org/expressjs/parseurl.svg?branch=master)](https://travis-ci.org/expressjs/parseurl) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/parseurl.svg?branch=master)](https://coveralls.io/r/expressjs/parseurl) - -Parse a URL with memoization. - -## Install - -```bash -$ npm install parseurl -``` - -## API - -```js -var parseurl = require('parseurl') -``` - -### parseurl(req) - -Parse the URL of the given request object (looks at the `req.url` property) -and return the result. The result is the same as `url.parse` in Node.js core. -Calling this function multiple times on the same `req` where `req.url` does -not change will return a cached parsed object, rather than parsing again. - -## Benchmark - -```bash -$ npm run-script bench - -> parseurl@1.2.0 bench nodejs-parseurl -> node benchmark/index.js - -> node benchmark/fullurl.js - - Parsing URL "http://localhost:8888/foo/bar?user=tj&pet=fluffy" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 1,290,780 ops/sec ±0.46% (195 runs sampled) - nativeurl x 56,401 ops/sec ±0.22% (196 runs sampled) - parseurl x 55,231 ops/sec ±0.22% (194 runs sampled) - -> node benchmark/pathquery.js - - Parsing URL "/foo/bar?user=tj&pet=fluffy" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 1,986,668 ops/sec ±0.27% (190 runs sampled) - nativeurl x 98,740 ops/sec ±0.21% (195 runs sampled) - parseurl x 2,628,171 ops/sec ±0.36% (195 runs sampled) - -> node benchmark/samerequest.js - - Parsing URL "/foo/bar?user=tj&pet=fluffy" on same request object - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 2,184,468 ops/sec ±0.40% (194 runs sampled) - nativeurl x 99,437 ops/sec ±0.71% (194 runs sampled) - parseurl x 10,498,005 ops/sec ±0.61% (186 runs sampled) - -> node benchmark/simplepath.js - - Parsing URL "/foo/bar" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 4,535,825 ops/sec ±0.27% (191 runs sampled) - nativeurl x 98,769 ops/sec ±0.54% (191 runs sampled) - parseurl x 4,164,865 ops/sec ±0.34% (192 runs sampled) - -> node benchmark/slash.js - - Parsing URL "/" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 4,908,405 ops/sec ±0.42% (191 runs sampled) - nativeurl x 100,945 ops/sec ±0.59% (188 runs sampled) - parseurl x 4,333,208 ops/sec ±0.27% (194 runs sampled) -``` - -## License - - [MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/index.js deleted file mode 100644 index 41e6d00..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/index.js +++ /dev/null @@ -1,87 +0,0 @@ - -/** - * Module dependencies. - */ - -var url = require('url') -var parse = url.parse -var Url = url.Url - -/** - * Pattern for a simple path case. - * See: https://github.com/joyent/node/pull/7878 - */ - -var simplePathRegExp = /^(\/\/?(?!\/)[^\?#\s]*)(\?[^#\s]*)?$/ - -/** - * Parse the `req` url with memoization. - * - * @param {ServerRequest} req - * @return {Object} - * @api public - */ - -module.exports = function parseUrl(req){ - var parsed = req._parsedUrl - var url = req.url - - if (fresh(url, parsed)) { - // Return cached URL parse - return parsed - } - - // Parse the URL - parsed = fastparse(url) - parsed._raw = url - - return req._parsedUrl = parsed -}; - -/** - * Parse the `str` url with fast-path short-cut. - * - * @param {string} str - * @return {Object} - * @api private - */ - -function fastparse(str) { - // Try fast path regexp - // See: https://github.com/joyent/node/pull/7878 - var simplePath = typeof str === 'string' && simplePathRegExp.exec(str) - - // Construct simple URL - if (simplePath) { - var pathname = simplePath[1] - var search = simplePath[2] || null - var url = Url !== undefined - ? new Url() - : {} - url.path = str - url.href = str - url.pathname = pathname - url.search = search - url.query = search && search.substr(1) - - return url - } - - return parse(str) -} - -/** - * Determine if parsed is still fresh for url. - * - * @param {string} url - * @param {object} parsedUrl - * @return {boolean} - * @api private - */ - -function fresh(url, parsedUrl) { - return typeof parsedUrl === 'object' - && parsedUrl !== null - && (Url === undefined || parsedUrl instanceof Url) - && parsedUrl._raw === url -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/package.json deleted file mode 100644 index 5c8e842..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "parseurl", - "description": "parse a url with memoization", - "version": "1.2.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/parseurl" - }, - "license": "MIT", - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "fast-url-parser": "~1.0.0", - "istanbul": "0.3.0", - "mocha": "~1.20.0" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --check-leaks --bail --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/parseurl/issues" - }, - "homepage": "https://github.com/expressjs/parseurl", - "_id": "parseurl@1.2.0", - "dist": { - "shasum": "be7df2d698eb49ffb10ea62939693e152991c008", - "tarball": "http://registry.npmjs.org/parseurl/-/parseurl-1.2.0.tgz" - }, - "_from": "parseurl@>=1.2.0-0 <1.3.0-0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "be7df2d698eb49ffb10ea62939693e152991c008", - "_resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/.npmignore deleted file mode 100644 index ba2a97b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -coverage diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/History.md deleted file mode 100644 index f962cfa..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/History.md +++ /dev/null @@ -1,16 +0,0 @@ -0.1.3 / 2014-07-06 -================== - - * Better array support - * Improved support for trailing slash in non-ending mode - -0.1.0 / 2014-03-06 -================== - - * add options.end - -0.0.2 / 2013-02-10 -================== - - * Update to match current express - * add .license property to component.json diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/Readme.md deleted file mode 100644 index 9199e38..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/Readme.md +++ /dev/null @@ -1,33 +0,0 @@ - -# Path-to-RegExp - - Turn an Express-style path string such as `/user/:name` into a regular expression. - -## Usage - -```javascript -var pathToRegexp = require('path-to-regexp'); -``` -### pathToRegexp(path, keys, options) - - - **path** A string in the express format, an array of such strings, or a regular expression - - **keys** An array to be populated with the keys present in the url. Once the function completes, this will be an array of strings. - - **options** - - **options.sensitive** Defaults to false, set this to true to make routes case sensitive - - **options.strict** Defaults to false, set this to true to make the trailing slash matter. - - **options.end** Defaults to true, set this to false to only match the prefix of the URL. - -```javascript -var keys = []; -var exp = pathToRegexp('/foo/:bar', keys); -//keys = ['bar'] -//exp = /^\/foo\/(?:([^\/]+?))\/?$/i -``` - -## Live Demo - -You can see a live demo of this library in use at [express-route-tester](http://forbeslindesay.github.com/express-route-tester/). - -## License - - MIT \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/component.json deleted file mode 100644 index 6ab37d3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/component.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "path-to-regexp", - "description": "Express style path to RegExp utility", - "version": "0.1.3", - "keywords": [ - "express", - "regexp", - "route", - "routing" - ], - "scripts": [ - "index.js" - ], - "license": "MIT" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/index.js deleted file mode 100644 index 2801f91..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/index.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Expose `pathtoRegexp`. - */ - -module.exports = pathtoRegexp; - -/** - * Normalize the given path string, - * returning a regular expression. - * - * An empty array should be passed, - * which will contain the placeholder - * key names. For example "/user/:id" will - * then contain ["id"]. - * - * @param {String|RegExp|Array} path - * @param {Array} keys - * @param {Object} options - * @return {RegExp} - * @api private - */ - -function pathtoRegexp(path, keys, options) { - options = options || {}; - var strict = options.strict; - var end = options.end !== false; - var flags = options.sensitive ? '' : 'i'; - keys = keys || []; - - if (path instanceof RegExp) { - return path; - } - - if (Array.isArray(path)) { - // Map array parts into regexps and return their source. We also pass - // the same keys and options instance into every generation to get - // consistent matching groups before we join the sources together. - path = path.map(function (value) { - return pathtoRegexp(value, keys, options).source; - }); - - return new RegExp('(?:' + path.join('|') + ')', flags); - } - - path = ('^' + path + (strict ? '' : path[path.length - 1] === '/' ? '?' : '/?')) - .replace(/\/\(/g, '/(?:') - .replace(/([\/\.])/g, '\\$1') - .replace(/(\\\/)?(\\\.)?:(\w+)(\(.*?\))?(\*)?(\?)?/g, function (match, slash, format, key, capture, star, optional) { - slash = slash || ''; - format = format || ''; - capture = capture || '([^\\/' + format + ']+?)'; - optional = optional || ''; - - keys.push({ name: key, optional: !!optional }); - - return '' - + (optional ? '' : slash) - + '(?:' - + format + (optional ? slash : '') + capture - + (star ? '((?:[\\/' + format + '].+?)?)' : '') - + ')' - + optional; - }) - .replace(/\*/g, '(.*)'); - - // If the path is non-ending, match until the end or a slash. - path += (end ? '$' : (path[path.length - 1] === '/' ? '' : '(?=\\/|$)')); - - return new RegExp(path, flags); -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/package.json deleted file mode 100644 index bccfe25..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/package.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "name": "path-to-regexp", - "description": "Express style path to RegExp utility", - "version": "0.1.3", - "scripts": { - "test": "istanbul cover _mocha -- -R spec" - }, - "keywords": [ - "express", - "regexp" - ], - "component": { - "scripts": { - "path-to-regexp": "index.js" - } - }, - "repository": { - "type": "git", - "url": "https://github.com/component/path-to-regexp.git" - }, - "devDependencies": { - "mocha": "^1.17.1", - "istanbul": "^0.2.6" - }, - "bugs": { - "url": "https://github.com/component/path-to-regexp/issues" - }, - "homepage": "https://github.com/component/path-to-regexp", - "_id": "path-to-regexp@0.1.3", - "_shasum": "21b9ab82274279de25b156ea08fd12ca51b8aecb", - "_from": "path-to-regexp@0.1.3", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dominicbarnes", - "email": "dominic@dbarnes.info" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - { - "name": "retrofox", - "email": "rdsuarez@gmail.com" - }, - { - "name": "coreh", - "email": "thecoreh@gmail.com" - }, - { - "name": "forbeslindesay", - "email": "forbes@lindesay.co.uk" - }, - { - "name": "kelonye", - "email": "kelonyemitchel@gmail.com" - }, - { - "name": "mattmueller", - "email": "mattmuelle@gmail.com" - }, - { - "name": "yields", - "email": "yields@icloud.com" - }, - { - "name": "anthonyshort", - "email": "antshort@gmail.com" - }, - { - "name": "ianstormtaylor", - "email": "ian@ianstormtaylor.com" - }, - { - "name": "cristiandouce", - "email": "cristian@gravityonmars.com" - }, - { - "name": "swatinem", - "email": "arpad.borsos@googlemail.com" - }, - { - "name": "stagas", - "email": "gstagas@gmail.com" - }, - { - "name": "amasad", - "email": "amjad.masad@gmail.com" - }, - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "calvinfo", - "email": "calvin@calv.info" - }, - { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - { - "name": "timoxley", - "email": "secoif@gmail.com" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "queckezz", - "email": "fabian.eichenberger@gmail.com" - }, - { - "name": "nami-doc", - "email": "vendethiel@hotmail.fr" - }, - { - "name": "clintwood", - "email": "clint@anotherway.co.za" - }, - { - "name": "thehydroimpulse", - "email": "dnfagnan@gmail.com" - }, - { - "name": "stephenmathieson", - "email": "me@stephenmathieson.com" - }, - { - "name": "trevorgerhardt", - "email": "trevorgerhardt@gmail.com" - } - ], - "dist": { - "shasum": "21b9ab82274279de25b156ea08fd12ca51b8aecb", - "tarball": "http://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/test.js deleted file mode 100644 index 4a0c270..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/test.js +++ /dev/null @@ -1,616 +0,0 @@ -var pathToRegExp = require('./'); -var assert = require('assert'); - -describe('path-to-regexp', function () { - describe('strings', function () { - it('should match simple paths', function () { - var params = []; - var m = pathToRegExp('/test', params).exec('/test'); - - assert.equal(params.length, 0); - - assert.equal(m.length, 1); - assert.equal(m[0], '/test'); - }); - - it('should match express format params', function () { - var params = []; - var m = pathToRegExp('/:test', params).exec('/pathname'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/pathname'); - assert.equal(m[1], 'pathname'); - }); - - it('should do strict matches', function () { - var params = []; - var re = pathToRegExp('/:test', params, { strict: true }); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/route'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - - m = re.exec('/route/'); - - assert.ok(!m); - }); - - it('should do strict matches with trailing slashes', function () { - var params = []; - var re = pathToRegExp('/:test/', params, { strict: true }); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/route'); - - assert.ok(!m); - - m = re.exec('/route/'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route/'); - assert.equal(m[1], 'route'); - - m = re.exec('/route//'); - - assert.ok(!m); - }); - - it('should allow optional express format params', function () { - var params = []; - var re = pathToRegExp('/:test?', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, true); - - m = re.exec('/route'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - - m = re.exec('/'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/'); - assert.equal(m[1], undefined); - }); - - it('should allow express format param regexps', function () { - var params = []; - var m = pathToRegExp('/:page(\\d+)', params).exec('/56'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'page'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/56'); - assert.equal(m[1], '56'); - }); - - it('should match without a prefixed slash', function () { - var params = []; - var m = pathToRegExp(':test', params).exec('string'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], 'string'); - assert.equal(m[1], 'string'); - }); - - it('should not match format parts', function () { - var params = []; - var m = pathToRegExp('/:test.json', params).exec('/route.json'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - }); - - it('should match format parts', function () { - var params = []; - var re = pathToRegExp('/:test.:format', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, false); - - m = re.exec('/route.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - assert.equal(m[2], 'json'); - - m = re.exec('/route'); - - assert.ok(!m); - }); - - it('should match route parts with a trailing format', function () { - var params = []; - var m = pathToRegExp('/:test.json', params).exec('/route.json'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - }); - - it('should match optional trailing routes', function () { - var params = []; - var m = pathToRegExp('/test*', params).exec('/test/route'); - - assert.equal(params.length, 0); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test/route'); - assert.equal(m[1], '/route'); - }); - - it('should match optional trailing routes after a param', function () { - var params = []; - var re = pathToRegExp('/:test*', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/test/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/route'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - - m = re.exec('/testing'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/testing'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - }); - - it('should match optional trailing routes before a format', function () { - var params = []; - var re = pathToRegExp('/test*.json', params); - var m; - - assert.equal(params.length, 0); - - m = re.exec('/test.json'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test.json'); - assert.equal(m[1], ''); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'ing'); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], '/route'); - }); - - it('should match optional trailing routes after a param and before a format', function () { - var params = []; - var re = pathToRegExp('/:test*.json', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - - m = re.exec('.json'); - - assert.ok(!m); - }); - - it('should match optional trailing routes between a normal param and a format param', function () { - var params = []; - var re = pathToRegExp('/:test*.:format', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, false); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - assert.equal(m[3], 'json'); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - assert.equal(m[3], 'json'); - - m = re.exec('/test'); - - assert.ok(!m); - - m = re.exec('.json'); - - assert.ok(!m); - }); - - it('should match optional trailing routes after a param and before an optional format param', function () { - var params = []; - var re = pathToRegExp('/:test*.:format?', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, true); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - assert.equal(m[3], 'json'); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - assert.equal(m[3], 'json'); - - m = re.exec('/test'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/test'); - assert.equal(m[1], 'test'); - assert.equal(m[2], ''); - assert.equal(m[3], undefined); - - m = re.exec('.json'); - - assert.ok(!m); - }); - - it('should match optional trailing routes inside optional express param', function () { - var params = []; - var re = pathToRegExp('/:test*?', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, true); - - m = re.exec('/test/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/route'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - - m = re.exec('/test'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test'); - assert.equal(m[1], 'test'); - assert.equal(m[2], ''); - - m = re.exec('/'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/'); - assert.equal(m[1], undefined); - assert.equal(m[2], undefined); - }); - - it('should do case insensitive matches', function () { - var m = pathToRegExp('/test').exec('/TEST'); - - assert.equal(m[0], '/TEST'); - }); - - it('should do case sensitive matches', function () { - var re = pathToRegExp('/test', null, { sensitive: true }); - var m; - - m = re.exec('/test'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/test'); - - m = re.exec('/TEST'); - - assert.ok(!m); - }); - - it('should do non-ending matches', function () { - var params = []; - var m = pathToRegExp('/:test', params, { end: false }).exec('/test/route'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test'); - assert.equal(m[1], 'test'); - }); - - it('should match trailing slashes in non-ending non-strict mode', function () { - var params = []; - var re = pathToRegExp('/:test', params, { end: false }); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/test/'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test/'); - assert.equal(m[1], 'test'); - }); - - it('should match trailing slashes in non-ending non-strict mode', function () { - var params = []; - var re = pathToRegExp('/route/', params, { end: false }); - var m; - - assert.equal(params.length, 0); - - m = re.exec('/route/'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - - m = re.exec('/route/test'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route'); - - m = re.exec('/route'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route'); - - m = re.exec('/route//'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - }); - - it('should match trailing slashing in non-ending strict mode', function () { - var params = []; - var re = pathToRegExp('/route/', params, { end: false, strict: true }); - - assert.equal(params.length, 0); - - m = re.exec('/route/'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - - m = re.exec('/route/test'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - - m = re.exec('/route'); - - assert.ok(!m); - - m = re.exec('/route//'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - }); - - it('should not match trailing slashes in non-ending strict mode', function () { - var params = []; - var re = pathToRegExp('/route', params, { end: false, strict: true }); - - assert.equal(params.length, 0); - - m = re.exec('/route'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route'); - - m = re.exec('/route/'); - - assert.ok(m.length, 1); - assert.equal(m[0], '/route'); - }); - - it('should match text after an express param', function () { - var params = []; - var re = pathToRegExp('/(:test)route', params); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/route'); - - assert.ok(!m); - - m = re.exec('/testroute'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/testroute'); - assert.equal(m[1], 'test'); - - m = re.exec('testroute'); - - assert.ok(!m); - }); - - it('should match text after an optional express param', function () { - var params = []; - var re = pathToRegExp('/(:test?)route', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, true); - - m = re.exec('/route'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route'); - assert.equal(m[1], undefined); - - m = re.exec('/testroute'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/testroute'); - assert.equal(m[1], 'test'); - - m = re.exec('route'); - - assert.ok(!m); - }); - - it('should match optional formats', function () { - var params = []; - var re = pathToRegExp('/:test.:format?', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, true); - - m = re.exec('/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - assert.equal(m[2], undefined); - - m = re.exec('/route.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - assert.equal(m[2], 'json'); - }); - - it('should match full paths with format by default', function () { - var params = []; - var m = pathToRegExp('/:test', params).exec('/test.json'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test.json'); - assert.equal(m[1], 'test.json'); - }); - }); - - describe('regexps', function () { - it('should return the regexp', function () { - assert.deepEqual(pathToRegExp(/.*/), /.*/); - }); - }); - - describe('arrays', function () { - it('should join arrays parts', function () { - var re = pathToRegExp(['/test', '/route']); - - assert.ok(re.test('/test')); - assert.ok(re.test('/route')); - assert.ok(!re.test('/else')); - }); - - it('should match parts properly', function () { - var params = []; - var re = pathToRegExp(['/:test', '/test/:route'], params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'route'); - assert.equal(params[1].optional, false); - - m = re.exec('/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - assert.equal(m[2], undefined); - - m = re.exec('/test/path'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/path'); - assert.equal(m[1], undefined); - assert.equal(m[2], 'path'); - }); - }); -}); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/.npmignore deleted file mode 100644 index 85c82a5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -benchmark/ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/History.md deleted file mode 100644 index 61a0d50..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/History.md +++ /dev/null @@ -1,27 +0,0 @@ -1.0.1 / 2014-06-03 -================== - - * Fix links in npm package - -1.0.0 / 2014-05-08 -================== - - * Add `trust` argument to determine proxy trust on - * Accepts custom function - * Accepts IPv4/IPv6 address(es) - * Accepts subnets - * Accepts pre-defined names - * Add optional `trust` argument to `proxyaddr.all` to - stop at first untrusted - * Add `proxyaddr.compile` to pre-compile `trust` function - to make subsequent calls faster - -0.0.1 / 2014-05-04 -================== - - * Fix bad npm publish - -0.0.0 / 2014-05-04 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/README.md deleted file mode 100644 index 4fe57d3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# proxy-addr - -[![NPM version](https://badge.fury.io/js/proxy-addr.svg)](http://badge.fury.io/js/proxy-addr) -[![Build Status](https://travis-ci.org/expressjs/proxy-addr.svg?branch=master)](https://travis-ci.org/expressjs/proxy-addr) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/proxy-addr.svg?branch=master)](https://coveralls.io/r/expressjs/proxy-addr) - -Determine address of proxied request - -## Install - -```sh -$ npm install proxy-addr -``` - -## API - -```js -var proxyaddr = require('proxy-addr') -``` - -### proxyaddr(req, trust) - -Return the address of the request, using the given `trust` parameter. - -The `trust` argument is a function that returns `true` if you trust -the address, `false` if you don't. The closest untrusted address is -returned. - -```js -proxyaddr(req, function(addr){ return addr === '127.0.0.1' }) -proxyaddr(req, function(addr, i){ return i < 1 }) -``` - -The `trust` arugment may also be a single IP address string or an -array of trusted addresses, as plain IP addresses, CIDR-formatted -strings, or IP/netmask strings. - -```js -proxyaddr(req, '127.0.0.1') -proxyaddr(req, ['127.0.0.0/8', '10.0.0.0/8']) -proxyaddr(req, ['127.0.0.0/255.0.0.0', '192.168.0.0/255.255.0.0']) -``` - -This module also supports IPv6. Your IPv6 addresses will be normalized -automatically (i.e. `fe80::00ed:1` equals `fe80:0:0:0:0:0:ed:1`). - -```js -proxyaddr(req, '::1') -proxyaddr(req, ['::1/128', 'fe80::/10']) -proxyaddr(req, ['fe80::/ffc0::']) -``` - -This module will automatically work with IPv4-mapped IPv6 addresses -as well to support node.js in IPv6-only mode. This means that you do -not have to specify both `::ffff:a00:1` and `10.0.0.1`. - -As a convenience, this module also takes certain pre-defined names -in addition to IP addresses, which expand into IP addresses: - -```js -proxyaddr(req, 'loopback') -proxyaddr(req, ['loopback', 'fc00:ac:1ab5:fff::1/64']) -``` - - * `loopback`: IPv4 and IPv6 loopback addresses (like `::1` and - `127.0.0.1`). - * `linklocal`: IPv4 and IPv6 link-local addresses (like - `fe80::1:1:1:1` and `169.254.0.1`). - * `uniquelocal`: IPv4 private addresses and IPv6 unique-local - addresses (like `fc00:ac:1ab5:fff::1` and `192.168.0.1`). - -When `trust` is specified as a function, it will be called for each -address to determine if it is a trusted address. The function is -given two arguments: `addr` and `i`, where `addr` is a string of -the address to check and `i` is a number that represents the distance -from the socket address. - -### proxyaddr.all(req, [trust]) - -Return all the addresses of the request, optionally stopping at the -first untrusted. This array is ordered from closest to furthest -(i.e. `arr[0] === req.connection.remoteAddress`). - -```js -proxyaddr.all(req) -``` - -The optional `trust` argument takes the same arguments as `trust` -does in `proxyaddr(req, trust)`. - -```js -proxyaddr.all(req, 'loopback') -``` - -### proxyaddr.compile(val) - -Compiles argument `val` into a `trust` function. This function takes -the same arguments as `trust` does in `proxyaddr(req, trust)` and -returns a function suitable for `proxyaddr(req, trust)`. - -```js -var trust = proxyaddr.compile('localhost') -var addr = proxyaddr(req, trust) -``` - -This function is meant to be optimized for use against every request. -It is recommend to compile a trust function up-front for the trusted -configuration and pass that to `proxyaddr(req, trust)` for each request. - -## Testing - -```sh -$ npm test -``` - -## Benchmarks - -```sh -$ npm run-script bench -``` - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/index.js deleted file mode 100644 index 75ee432..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/index.js +++ /dev/null @@ -1,353 +0,0 @@ -/*! - * proxy-addr - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = proxyaddr; -module.exports.all = alladdrs; -module.exports.compile = compile; - -/** - * Module dependencies. - */ - -var ipaddr = require('ipaddr.js'); - -/** - * Variables. - */ - -var digitre = /^[0-9]+$/; -var isip = ipaddr.isValid; -var parseip = ipaddr.parse; - -/** - * Pre-defined IP ranges. - */ - -var ipranges = { - linklocal: ['169.254.0.0/16', 'fe80::/10'], - loopback: ['127.0.0.1/8', '::1/128'], - uniquelocal: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fc00::/7'] -}; - -/** - * Get all addresses in the request, optionally stopping - * at the first untrusted. - * - * @param {Object} request - * @param {Function|Array|String} [trust] - * @api public - */ - -function alladdrs(req, trust) { - if (!req) { - throw new TypeError('req argument is required'); - } - - var proxyAddrs = (req.headers['x-forwarded-for'] || '') - .split(/ *, */) - .filter(Boolean) - .reverse(); - var socketAddr = req.connection.remoteAddress; - var addrs = [socketAddr].concat(proxyAddrs); - - if (!trust) { - // Return all addresses - return addrs; - } - - if (typeof trust !== 'function') { - trust = compile(trust); - } - - for (var i = 0; i < addrs.length - 1; i++) { - if (trust(addrs[i], i)) continue; - - addrs.length = i + 1; - } - - return addrs; -} - -/** - * Compile argument into trust function. - * - * @param {Array|String} val - * @api private - */ - -function compile(val) { - if (!val) { - throw new TypeError('argument is required'); - } - - var trust = typeof val === 'string' - ? [val] - : val; - - if (!Array.isArray(trust)) { - throw new TypeError('unsupported trust argument'); - } - - for (var i = 0; i < trust.length; i++) { - val = trust[i]; - - if (!ipranges.hasOwnProperty(val)) { - continue; - } - - // Splice in pre-defined range - val = ipranges[val]; - trust.splice.apply(trust, [i, 1].concat(val)); - i += val.length - 1; - } - - return compileTrust(compileRangeSubnets(trust)); -} - -/** - * Compile `arr` elements into range subnets. - * - * @param {Array} arr - * @api private - */ - -function compileRangeSubnets(arr) { - var rangeSubnets = new Array(arr.length); - - for (var i = 0; i < arr.length; i++) { - rangeSubnets[i] = parseipNotation(arr[i]); - } - - return rangeSubnets; -} - -/** - * Compile range subnet array into trust function. - * - * @param {Array} rangeSubnets - * @api private - */ - -function compileTrust(rangeSubnets) { - // Return optimized function based on length - var len = rangeSubnets.length; - return len === 0 - ? trustNone - : len === 1 - ? trustSingle(rangeSubnets[0]) - : trustMulti(rangeSubnets); -} - -/** - * Parse IP notation string into range subnet. - * - * @param {String} note - * @api private - */ - -function parseipNotation(note) { - var ip; - var kind; - var max; - var pos = note.lastIndexOf('/'); - var range; - - ip = pos !== -1 - ? note.substring(0, pos) - : note; - - if (!isip(ip)) { - throw new TypeError('invalid IP address: ' + ip); - } - - ip = parseip(ip); - - kind = ip.kind(); - max = kind === 'ipv4' ? 32 - : kind === 'ipv6' ? 128 - : 0; - - range = pos !== -1 - ? note.substring(pos + 1, note.length) - : max; - - if (typeof range !== 'number') { - range = digitre.test(range) - ? parseInt(range, 10) - : isip(range) - ? parseNetmask(range) - : 0; - } - - if (ip.kind() === 'ipv6' && ip.isIPv4MappedAddress()) { - // Store as IPv4 - ip = ip.toIPv4Address(); - range = range <= max - ? range - 96 - : range; - } - - if (range <= 0 || range > max) { - throw new TypeError('invalid range on address: ' + note); - } - - return [ip, range]; -} - -/** - * Parse netmask string into CIDR range. - * - * @param {String} note - * @api private - */ - -function parseNetmask(netmask) { - var ip = parseip(netmask); - var parts; - var size; - - switch (ip.kind()) { - case 'ipv4': - parts = ip.octets; - size = 8; - break; - case 'ipv6': - parts = ip.parts; - size = 16; - break; - default: - throw new TypeError('unknown netmask'); - } - - var max = Math.pow(2, size) - 1; - var part; - var range = 0; - - for (var i = 0; i < parts.length; i++) { - part = parts[i] & max; - - if (part === max) { - range += size; - continue; - } - - while (part) { - part = (part << 1) & max; - range += 1; - } - - break; - } - - return range; -} - -/** - * Determine address of proxied request. - * - * @param {Object} request - * @param {Function|Array|String} trust - * @api public - */ - -function proxyaddr(req, trust) { - if (!req) { - throw new TypeError('req argument is required'); - } - - if (!trust) { - throw new TypeError('trust argument is required'); - } - - var addrs = alladdrs(req, trust); - var addr = addrs[addrs.length - 1]; - - return addr; -} - -/** - * Static trust function to trust nothing. - * - * @api private - */ - -function trustNone() { - return false; -} - -/** - * Compile trust function for multiple subnets. - * - * @param {Array} subnets - * @api private - */ - -function trustMulti(subnets) { - return function trust(addr) { - if (!isip(addr)) return false; - - var ip = parseip(addr); - var ipv4; - var kind = ip.kind(); - var subnet; - var subnetip; - var subnetkind; - var trusted; - - for (var i = 0; i < subnets.length; i++) { - subnet = subnets[i]; - subnetip = subnet[0]; - subnetkind = subnetip.kind(); - subnetrange = subnet[1]; - trusted = ip; - - if (kind !== subnetkind) { - if (kind !== 'ipv6' || subnetkind !== 'ipv4' || !ip.isIPv4MappedAddress()) { - continue; - } - - // Store addr as IPv4 - ipv4 = ipv4 || ip.toIPv4Address(); - trusted = ipv4; - } - - if (trusted.match(subnetip, subnetrange)) return true; - } - - return false; - }; -} - -/** - * Compile trust function for single subnet. - * - * @param {Object} subnet - * @api private - */ - -function trustSingle(subnet) { - var subnetip = subnet[0]; - var subnetkind = subnetip.kind(); - var subnetisipv4 = subnetkind === 'ipv4'; - var subnetrange = subnet[1]; - - return function trust(addr) { - if (!isip(addr)) return false; - - var ip = parseip(addr); - var kind = ip.kind(); - - return kind === subnetkind - ? ip.match(subnetip, subnetrange) - : subnetisipv4 && kind === 'ipv6' && ip.isIPv4MappedAddress() - ? ip.toIPv4Address().match(subnetip, subnetrange) - : false; - }; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore deleted file mode 100644 index 7a1537b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.idea -node_modules diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile deleted file mode 100644 index 7fd355a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile +++ /dev/null @@ -1,18 +0,0 @@ -fs = require 'fs' -CoffeeScript = require 'coffee-script' -nodeunit = require 'nodeunit' -UglifyJS = require 'uglify-js' - -task 'build', 'build the JavaScript files from CoffeeScript source', build = (cb) -> - source = fs.readFileSync 'src/ipaddr.coffee' - fs.writeFileSync 'lib/ipaddr.js', CoffeeScript.compile source.toString() - - invoke 'test' - invoke 'compress' - -task 'test', 'run the bundled tests', (cb) -> - nodeunit.reporters.default.run ['test'] - -task 'compress', 'uglify the resulting javascript', (cb) -> - result = UglifyJS.minify('lib/ipaddr.js') - fs.writeFileSync('ipaddr.min.js', result.code) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE deleted file mode 100644 index 3493f0d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2011 Peter Zotov - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md deleted file mode 100644 index a816672..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md +++ /dev/null @@ -1,149 +0,0 @@ -# ipaddr.js — an IPv6 and IPv4 address manipulation library - -ipaddr.js is a small (1.9K minified and gzipped) library for manipulating -IP addresses in JavaScript environments. It runs on both CommonJS runtimes -(e.g. [nodejs]) and in a web browser. - -ipaddr.js allows you to verify and parse string representation of an IP -address, match it against a CIDR range or range list, determine if it falls -into some reserved ranges (examples include loopback and private ranges), -and convert between IPv4 and IPv4-mapped IPv6 addresses. - -[nodejs]: http://nodejs.org - -## Installation - -`npm install ipaddr.js` - -## API - -ipaddr.js defines one object in the global scope: `ipaddr`. In CommonJS, -it is exported from the module: - -```js -var ipaddr = require('ipaddr.js'); -``` - -The API consists of several global methods and two classes: ipaddr.IPv6 and ipaddr.IPv4. - -### Global methods - -There are three global methods defined: `ipaddr.isValid`, `ipaddr.parse` and -`ipaddr.process`. All of them receive a string as a single parameter. - -The `ipaddr.isValid` method returns `true` if the address is a valid IPv4 or -IPv6 address, and `false` otherwise. It does not throw any exceptions. - -The `ipaddr.parse` method returns an object representing the IP address, -or throws an `Error` if the passed string is not a valid representation of an -IP address. - -The `ipaddr.process` method works just like the `ipaddr.parse` one, but it -automatically converts IPv4-mapped IPv6 addresses to their IPv4 couterparts -before returning. It is useful when you have a Node.js instance listening -on an IPv6 socket, and the `net.ivp6.bindv6only` sysctl parameter (or its -equivalent on non-Linux OS) is set to 0. In this case, you can accept IPv4 -connections on your IPv6-only socket, but the remote address will be mangled. -Use `ipaddr.process` method to automatically demangle it. - -### Object representation - -Parsing methods return an object which descends from `ipaddr.IPv6` or -`ipaddr.IPv4`. These objects share some properties, but most of them differ. - -#### Shared properties - -One can determine the type of address by calling `addr.kind()`. It will return -either `"ipv6"` or `"ipv4"`. - -An address can be converted back to its string representation with `addr.toString()`. -Note that this method: - * does not return the original string used to create the object (in fact, there is - no way of getting that string) - * returns a compact representation (when it is applicable) - -A `match(range, bits)` method can be used to check if the address falls into a -certain CIDR range. -Note that an address can be (obviously) matched only against an address of the same type. - -For example: - -```js -var addr = ipaddr.parse("2001:db8:1234::1"); -var range = ipaddr.parse("2001:db8::"); - -addr.match(range, 32); // => true -``` - -A `range()` method returns one of predefined names for several special ranges defined -by IP protocols. The exact names (and their respective CIDR ranges) can be looked up -in the source: [IPv6 ranges] and [IPv4 ranges]. Some common ones include `"unicast"` -(the default one) and `"reserved"`. - -You can match against your own range list by using -`ipaddr.subnetMatch(address, rangeList, defaultName)` method. It can work with both -IPv6 and IPv4 addresses, and accepts a name-to-subnet map as the range list. For example: - -```js -var rangeList = { - documentationOnly: [ ipaddr.parse('2001:db8::'), 32 ], - tunnelProviders: [ - [ ipaddr.parse('2001:470::'), 32 ], // he.net - [ ipaddr.parse('2001:5c0::'), 32 ] // freenet6 - ] -}; -ipaddr.subnetMatch(ipaddr.parse('2001:470:8:66::1'), rangeList, 'unknown'); // => "he.net" -``` - -The addresses can be converted to their byte representation with `toByteArray()`. -(Actually, JavaScript mostly does not know about byte buffers. They are emulated with -arrays of numbers, each in range of 0..255.) - -```js -var bytes = ipaddr.parse('2a00:1450:8007::68').toByteArray(); // ipv6.google.com -bytes // => [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, , 0x00, 0x68 ] -``` - -The `ipaddr.IPv4` and `ipaddr.IPv6` objects have some methods defined, too. All of them -have the same interface for both protocols, and are similar to global methods. - -`ipaddr.IPvX.isValid(string)` can be used to check if the string is a valid address -for particular protocol, and `ipaddr.IPvX.parse(string)` is the error-throwing parser. - -[IPv6 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L186 -[IPv4 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L71 - -#### IPv6 properties - -Sometimes you will want to convert IPv6 not to a compact string representation (with -the `::` substitution); the `toNormalizedString()` method will return an address where -all zeroes are explicit. - -For example: - -```js -var addr = ipaddr.parse("2001:0db8::0001"); -addr.toString(); // => "2001:db8::1" -addr.toNormalizedString(); // => "2001:db8:0:0:0:0:0:1" -``` - -The `isIPv4MappedAddress()` method will return `true` if this address is an IPv4-mapped -one, and `toIPv4Address()` will return an IPv4 object address. - -To access the underlying binary representation of the address, use `addr.parts`. - -```js -var addr = ipaddr.parse("2001:db8:10::1234:DEAD"); -addr.parts // => [0x2001, 0xdb8, 0x10, 0, 0, 0, 0x1234, 0xdead] -``` - -#### IPv4 properties - -`toIPv4MappedAddress()` will return a corresponding IPv4-mapped IPv6 address. - -To access the underlying representation of the address, use `addr.octets`. - -```js -var addr = ipaddr.parse("192.168.1.1"); -addr.octets // => [192, 168, 1, 1] -``` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js deleted file mode 100644 index 528d48b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var t,r,n,e,i,o,a,s;r={},s=this,"undefined"!=typeof module&&null!==module&&module.exports?module.exports=r:s.ipaddr=r,a=function(t,r,n,e){var i,o;if(t.length!==r.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;e>0;){if(o=n-e,0>o&&(o=0),t[i]>>o!==r[i]>>o)return!1;e-=n,i+=1}return!0},r.subnetMatch=function(t,r,n){var e,i,o,a,s;null==n&&(n="unicast");for(e in r)for(i=r[e],"[object Array]"!==toString.call(i[0])&&(i=[i]),a=0,s=i.length;s>a;a++)if(o=i[a],t.match.apply(t,o))return e;return n},r.IPv4=function(){function t(t){var r,n,e;if(4!==t.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(n=0,e=t.length;e>n;n++)if(r=t[n],!(r>=0&&255>=r))throw new Error("ipaddr: ipv4 octet is a byte");this.octets=t}return t.prototype.kind=function(){return"ipv4"},t.prototype.toString=function(){return this.octets.join(".")},t.prototype.toByteArray=function(){return this.octets.slice(0)},t.prototype.match=function(t,r){if("ipv4"!==t.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return a(this.octets,t.octets,8,r)},t.prototype.SpecialRanges={broadcast:[[new t([255,255,255,255]),32]],multicast:[[new t([224,0,0,0]),4]],linkLocal:[[new t([169,254,0,0]),16]],loopback:[[new t([127,0,0,0]),8]],"private":[[new t([10,0,0,0]),8],[new t([172,16,0,0]),12],[new t([192,168,0,0]),16]],reserved:[[new t([192,0,0,0]),24],[new t([192,0,2,0]),24],[new t([192,88,99,0]),24],[new t([198,51,100,0]),24],[new t([203,0,113,0]),24],[new t([240,0,0,0]),4]]},t.prototype.range=function(){return r.subnetMatch(this,this.SpecialRanges)},t.prototype.toIPv4MappedAddress=function(){return r.IPv6.parse("::ffff:"+this.toString())},t}(),n="(0?\\d+|0x[a-f0-9]+)",e={fourOctet:new RegExp("^"+n+"\\."+n+"\\."+n+"\\."+n+"$","i"),longValue:new RegExp("^"+n+"$","i")},r.IPv4.parser=function(t){var r,n,i,o,a;return n=function(t){return"0"===t[0]&&"x"!==t[1]?parseInt(t,8):parseInt(t)},(r=t.match(e.fourOctet))?function(){var t,e,o,a;for(o=r.slice(1,6),a=[],t=0,e=o.length;e>t;t++)i=o[t],a.push(n(i));return a}():(r=t.match(e.longValue))?(a=n(r[1]),function(){var t,r;for(r=[],o=t=0;24>=t;o=t+=8)r.push(a>>o&255);return r}().reverse()):null},r.IPv6=function(){function t(t){var r,n,e;if(8!==t.length)throw new Error("ipaddr: ipv6 part count should be 8");for(n=0,e=t.length;e>n;n++)if(r=t[n],!(r>=0&&65535>=r))throw new Error("ipaddr: ipv6 part should fit to two octets");this.parts=t}return t.prototype.kind=function(){return"ipv6"},t.prototype.toString=function(){var t,r,n,e,i,o,a;for(i=function(){var t,n,e,i;for(e=this.parts,i=[],t=0,n=e.length;n>t;t++)r=e[t],i.push(r.toString(16));return i}.call(this),t=[],n=function(r){return t.push(r)},e=0,o=0,a=i.length;a>o;o++)switch(r=i[o],e){case 0:"0"===r?n(""):n(r),e=1;break;case 1:"0"===r?e=2:n(r);break;case 2:"0"!==r&&(n(""),n(r),e=3);break;case 3:n(r)}return 2===e&&(n(""),n("")),t.join(":")},t.prototype.toByteArray=function(){var t,r,n,e,i;for(t=[],i=this.parts,n=0,e=i.length;e>n;n++)r=i[n],t.push(r>>8),t.push(255&r);return t},t.prototype.toNormalizedString=function(){var t;return function(){var r,n,e,i;for(e=this.parts,i=[],r=0,n=e.length;n>r;r++)t=e[r],i.push(t.toString(16));return i}.call(this).join(":")},t.prototype.match=function(t,r){if("ipv6"!==t.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return a(this.parts,t.parts,16,r)},t.prototype.SpecialRanges={unspecified:[new t([0,0,0,0,0,0,0,0]),128],linkLocal:[new t([65152,0,0,0,0,0,0,0]),10],multicast:[new t([65280,0,0,0,0,0,0,0]),8],loopback:[new t([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new t([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new t([0,0,0,0,0,65535,0,0]),96],rfc6145:[new t([0,0,0,0,65535,0,0,0]),96],rfc6052:[new t([100,65435,0,0,0,0,0,0]),96],"6to4":[new t([8194,0,0,0,0,0,0,0]),16],teredo:[new t([8193,0,0,0,0,0,0,0]),32],reserved:[[new t([8193,3512,0,0,0,0,0,0]),32]]},t.prototype.range=function(){return r.subnetMatch(this,this.SpecialRanges)},t.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},t.prototype.toIPv4Address=function(){var t,n,e;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return e=this.parts.slice(-2),t=e[0],n=e[1],new r.IPv4([t>>8,255&t,n>>8,255&n])},t}(),i="(?:[0-9a-f]+::?)+",o={"native":new RegExp("^(::)?("+i+")?([0-9a-f]+)?(::)?$","i"),transitional:new RegExp("^((?:"+i+")|(?:::)(?:"+i+")?)"+(""+n+"\\."+n+"\\."+n+"\\."+n+"$"),"i")},t=function(t,r){var n,e,i,o,a;if(t.indexOf("::")!==t.lastIndexOf("::"))return null;for(n=0,e=-1;(e=t.indexOf(":",e+1))>=0;)n++;for(":"===t[0]&&n--,":"===t[t.length-1]&&n--,a=r-n,o=":";a--;)o+="0:";return t=t.replace("::",o),":"===t[0]&&(t=t.slice(1)),":"===t[t.length-1]&&(t=t.slice(0,-1)),function(){var r,n,e,o;for(e=t.split(":"),o=[],r=0,n=e.length;n>r;r++)i=e[r],o.push(parseInt(i,16));return o}()},r.IPv6.parser=function(r){var n,e;return r.match(o["native"])?t(r,8):(n=r.match(o.transitional))&&(e=t(n[1].slice(0,-1),6))?(e.push(parseInt(n[2])<<8|parseInt(n[3])),e.push(parseInt(n[4])<<8|parseInt(n[5])),e):null},r.IPv4.isIPv4=r.IPv6.isIPv6=function(t){return null!==this.parser(t)},r.IPv4.isValid=r.IPv6.isValid=function(t){var r;try{return new this(this.parser(t)),!0}catch(n){return r=n,!1}},r.IPv4.parse=r.IPv6.parse=function(t){var r;if(r=this.parser(t),null===r)throw new Error("ipaddr: string is not formatted like ip address");return new this(r)},r.isValid=function(t){return r.IPv6.isValid(t)||r.IPv4.isValid(t)},r.parse=function(t){if(r.IPv6.isIPv6(t))return r.IPv6.parse(t);if(r.IPv4.isIPv4(t))return r.IPv4.parse(t);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},r.process=function(t){var r;return r=this.parse(t),"ipv6"===r.kind()&&r.isIPv4MappedAddress()?r.toIPv4Address():r}}).call(this); \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js deleted file mode 100644 index 2319737..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js +++ /dev/null @@ -1,401 +0,0 @@ -(function() { - var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root; - - ipaddr = {}; - - root = this; - - if ((typeof module !== "undefined" && module !== null) && module.exports) { - module.exports = ipaddr; - } else { - root['ipaddr'] = ipaddr; - } - - matchCIDR = function(first, second, partSize, cidrBits) { - var part, shift; - if (first.length !== second.length) { - throw new Error("ipaddr: cannot match CIDR for objects with different lengths"); - } - part = 0; - while (cidrBits > 0) { - shift = partSize - cidrBits; - if (shift < 0) { - shift = 0; - } - if (first[part] >> shift !== second[part] >> shift) { - return false; - } - cidrBits -= partSize; - part += 1; - } - return true; - }; - - ipaddr.subnetMatch = function(address, rangeList, defaultName) { - var rangeName, rangeSubnets, subnet, _i, _len; - if (defaultName == null) { - defaultName = 'unicast'; - } - for (rangeName in rangeList) { - rangeSubnets = rangeList[rangeName]; - if (toString.call(rangeSubnets[0]) !== '[object Array]') { - rangeSubnets = [rangeSubnets]; - } - for (_i = 0, _len = rangeSubnets.length; _i < _len; _i++) { - subnet = rangeSubnets[_i]; - if (address.match.apply(address, subnet)) { - return rangeName; - } - } - } - return defaultName; - }; - - ipaddr.IPv4 = (function() { - function IPv4(octets) { - var octet, _i, _len; - if (octets.length !== 4) { - throw new Error("ipaddr: ipv4 octet count should be 4"); - } - for (_i = 0, _len = octets.length; _i < _len; _i++) { - octet = octets[_i]; - if (!((0 <= octet && octet <= 255))) { - throw new Error("ipaddr: ipv4 octet is a byte"); - } - } - this.octets = octets; - } - - IPv4.prototype.kind = function() { - return 'ipv4'; - }; - - IPv4.prototype.toString = function() { - return this.octets.join("."); - }; - - IPv4.prototype.toByteArray = function() { - return this.octets.slice(0); - }; - - IPv4.prototype.match = function(other, cidrRange) { - if (other.kind() !== 'ipv4') { - throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one"); - } - return matchCIDR(this.octets, other.octets, 8, cidrRange); - }; - - IPv4.prototype.SpecialRanges = { - broadcast: [[new IPv4([255, 255, 255, 255]), 32]], - multicast: [[new IPv4([224, 0, 0, 0]), 4]], - linkLocal: [[new IPv4([169, 254, 0, 0]), 16]], - loopback: [[new IPv4([127, 0, 0, 0]), 8]], - "private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]], - reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]] - }; - - IPv4.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv4.prototype.toIPv4MappedAddress = function() { - return ipaddr.IPv6.parse("::ffff:" + (this.toString())); - }; - - return IPv4; - - })(); - - ipv4Part = "(0?\\d+|0x[a-f0-9]+)"; - - ipv4Regexes = { - fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'), - longValue: new RegExp("^" + ipv4Part + "$", 'i') - }; - - ipaddr.IPv4.parser = function(string) { - var match, parseIntAuto, part, shift, value; - parseIntAuto = function(string) { - if (string[0] === "0" && string[1] !== "x") { - return parseInt(string, 8); - } else { - return parseInt(string); - } - }; - if (match = string.match(ipv4Regexes.fourOctet)) { - return (function() { - var _i, _len, _ref, _results; - _ref = match.slice(1, 6); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(parseIntAuto(part)); - } - return _results; - })(); - } else if (match = string.match(ipv4Regexes.longValue)) { - value = parseIntAuto(match[1]); - return ((function() { - var _i, _results; - _results = []; - for (shift = _i = 0; _i <= 24; shift = _i += 8) { - _results.push((value >> shift) & 0xff); - } - return _results; - })()).reverse(); - } else { - return null; - } - }; - - ipaddr.IPv6 = (function() { - function IPv6(parts) { - var part, _i, _len; - if (parts.length !== 8) { - throw new Error("ipaddr: ipv6 part count should be 8"); - } - for (_i = 0, _len = parts.length; _i < _len; _i++) { - part = parts[_i]; - if (!((0 <= part && part <= 0xffff))) { - throw new Error("ipaddr: ipv6 part should fit to two octets"); - } - } - this.parts = parts; - } - - IPv6.prototype.kind = function() { - return 'ipv6'; - }; - - IPv6.prototype.toString = function() { - var compactStringParts, part, pushPart, state, stringParts, _i, _len; - stringParts = (function() { - var _i, _len, _ref, _results; - _ref = this.parts; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(part.toString(16)); - } - return _results; - }).call(this); - compactStringParts = []; - pushPart = function(part) { - return compactStringParts.push(part); - }; - state = 0; - for (_i = 0, _len = stringParts.length; _i < _len; _i++) { - part = stringParts[_i]; - switch (state) { - case 0: - if (part === '0') { - pushPart(''); - } else { - pushPart(part); - } - state = 1; - break; - case 1: - if (part === '0') { - state = 2; - } else { - pushPart(part); - } - break; - case 2: - if (part !== '0') { - pushPart(''); - pushPart(part); - state = 3; - } - break; - case 3: - pushPart(part); - } - } - if (state === 2) { - pushPart(''); - pushPart(''); - } - return compactStringParts.join(":"); - }; - - IPv6.prototype.toByteArray = function() { - var bytes, part, _i, _len, _ref; - bytes = []; - _ref = this.parts; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - bytes.push(part >> 8); - bytes.push(part & 0xff); - } - return bytes; - }; - - IPv6.prototype.toNormalizedString = function() { - var part; - return ((function() { - var _i, _len, _ref, _results; - _ref = this.parts; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(part.toString(16)); - } - return _results; - }).call(this)).join(":"); - }; - - IPv6.prototype.match = function(other, cidrRange) { - if (other.kind() !== 'ipv6') { - throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one"); - } - return matchCIDR(this.parts, other.parts, 16, cidrRange); - }; - - IPv6.prototype.SpecialRanges = { - unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128], - linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10], - multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8], - loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128], - uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7], - ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96], - rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96], - rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96], - '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16], - teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32], - reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]] - }; - - IPv6.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv6.prototype.isIPv4MappedAddress = function() { - return this.range() === 'ipv4Mapped'; - }; - - IPv6.prototype.toIPv4Address = function() { - var high, low, _ref; - if (!this.isIPv4MappedAddress()) { - throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4"); - } - _ref = this.parts.slice(-2), high = _ref[0], low = _ref[1]; - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]); - }; - - return IPv6; - - })(); - - ipv6Part = "(?:[0-9a-f]+::?)+"; - - ipv6Regexes = { - "native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?$", 'i'), - transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + ("" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$"), 'i') - }; - - expandIPv6 = function(string, parts) { - var colonCount, lastColon, part, replacement, replacementCount; - if (string.indexOf('::') !== string.lastIndexOf('::')) { - return null; - } - colonCount = 0; - lastColon = -1; - while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) { - colonCount++; - } - if (string[0] === ':') { - colonCount--; - } - if (string[string.length - 1] === ':') { - colonCount--; - } - replacementCount = parts - colonCount; - replacement = ':'; - while (replacementCount--) { - replacement += '0:'; - } - string = string.replace('::', replacement); - if (string[0] === ':') { - string = string.slice(1); - } - if (string[string.length - 1] === ':') { - string = string.slice(0, -1); - } - return (function() { - var _i, _len, _ref, _results; - _ref = string.split(":"); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(parseInt(part, 16)); - } - return _results; - })(); - }; - - ipaddr.IPv6.parser = function(string) { - var match, parts; - if (string.match(ipv6Regexes['native'])) { - return expandIPv6(string, 8); - } else if (match = string.match(ipv6Regexes['transitional'])) { - parts = expandIPv6(match[1].slice(0, -1), 6); - if (parts) { - parts.push(parseInt(match[2]) << 8 | parseInt(match[3])); - parts.push(parseInt(match[4]) << 8 | parseInt(match[5])); - return parts; - } - } - return null; - }; - - ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) { - return this.parser(string) !== null; - }; - - ipaddr.IPv4.isValid = ipaddr.IPv6.isValid = function(string) { - var e; - try { - new this(this.parser(string)); - return true; - } catch (_error) { - e = _error; - return false; - } - }; - - ipaddr.IPv4.parse = ipaddr.IPv6.parse = function(string) { - var parts; - parts = this.parser(string); - if (parts === null) { - throw new Error("ipaddr: string is not formatted like ip address"); - } - return new this(parts); - }; - - ipaddr.isValid = function(string) { - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string); - }; - - ipaddr.parse = function(string) { - if (ipaddr.IPv6.isIPv6(string)) { - return ipaddr.IPv6.parse(string); - } else if (ipaddr.IPv4.isIPv4(string)) { - return ipaddr.IPv4.parse(string); - } else { - throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format"); - } - }; - - ipaddr.process = function(string) { - var addr; - addr = this.parse(string); - if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) { - return addr.toIPv4Address(); - } else { - return addr; - } - }; - -}).call(this); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json deleted file mode 100644 index f375304..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "ipaddr.js", - "description": "A library for manipulating IPv4 and IPv6 addresses in JavaScript.", - "version": "0.1.2", - "author": { - "name": "Peter Zotov", - "email": "whitequark@whitequark.org" - }, - "directories": { - "lib": "./lib" - }, - "dependencies": {}, - "devDependencies": { - "coffee-script": "~1.6", - "nodeunit": "~0.5.3", - "uglify-js": "latest" - }, - "scripts": { - "test": "cake build test" - }, - "keywords": [ - "ip", - "ipv4", - "ipv6" - ], - "repository": { - "type": "git", - "url": "git://github.com/whitequark/ipaddr.js" - }, - "main": "./lib/ipaddr", - "engines": { - "node": ">= 0.2.5" - }, - "bugs": { - "url": "https://github.com/whitequark/ipaddr.js/issues" - }, - "_id": "ipaddr.js@0.1.2", - "dist": { - "shasum": "6a1fd3d854f5002965c34d7bbcd9b4a8d4b0467e", - "tarball": "http://registry.npmjs.org/ipaddr.js/-/ipaddr.js-0.1.2.tgz" - }, - "_from": "ipaddr.js@0.1.2", - "_npmVersion": "1.3.10", - "_npmUser": { - "name": "whitequark", - "email": "whitequark@whitequark.org" - }, - "maintainers": [ - { - "name": "whitequark", - "email": "whitequark@whitequark.org" - } - ], - "_shasum": "6a1fd3d854f5002965c34d7bbcd9b4a8d4b0467e", - "_resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-0.1.2.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/whitequark/ipaddr.js" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee deleted file mode 100644 index 4c89ded..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee +++ /dev/null @@ -1,344 +0,0 @@ -# Define the main object -ipaddr = {} - -root = this - -# Export for both the CommonJS and browser-like environment -if module? && module.exports - module.exports = ipaddr -else - root['ipaddr'] = ipaddr - -# A generic CIDR (Classless Inter-Domain Routing) RFC1518 range matcher. -matchCIDR = (first, second, partSize, cidrBits) -> - if first.length != second.length - throw new Error "ipaddr: cannot match CIDR for objects with different lengths" - - part = 0 - while cidrBits > 0 - shift = partSize - cidrBits - shift = 0 if shift < 0 - - if first[part] >> shift != second[part] >> shift - return false - - cidrBits -= partSize - part += 1 - - return true - -# An utility function to ease named range matching. See examples below. -ipaddr.subnetMatch = (address, rangeList, defaultName='unicast') -> - for rangeName, rangeSubnets of rangeList - # ECMA5 Array.isArray isn't available everywhere - if toString.call(rangeSubnets[0]) != '[object Array]' - rangeSubnets = [ rangeSubnets ] - - for subnet in rangeSubnets - return rangeName if address.match.apply(address, subnet) - - return defaultName - -# An IPv4 address (RFC791). -class ipaddr.IPv4 - # Constructs a new IPv4 address from an array of four octets. - # Verifies the input. - constructor: (octets) -> - if octets.length != 4 - throw new Error "ipaddr: ipv4 octet count should be 4" - - for octet in octets - if !(0 <= octet <= 255) - throw new Error "ipaddr: ipv4 octet is a byte" - - @octets = octets - - # The 'kind' method exists on both IPv4 and IPv6 classes. - kind: -> - return 'ipv4' - - # Returns the address in convenient, decimal-dotted format. - toString: -> - return @octets.join "." - - # Returns an array of byte-sized values in network order - toByteArray: -> - return @octets.slice(0) # octets.clone - - # Checks if this address matches other one within given CIDR range. - match: (other, cidrRange) -> - if other.kind() != 'ipv4' - throw new Error "ipaddr: cannot match ipv4 address with non-ipv4 one" - - return matchCIDR(this.octets, other.octets, 8, cidrRange) - - # Special IPv4 address ranges. - SpecialRanges: - broadcast: [ - [ new IPv4([255, 255, 255, 255]), 32 ] - ] - multicast: [ # RFC3171 - [ new IPv4([224, 0, 0, 0]), 4 ] - ] - linkLocal: [ # RFC3927 - [ new IPv4([169, 254, 0, 0]), 16 ] - ] - loopback: [ # RFC5735 - [ new IPv4([127, 0, 0, 0]), 8 ] - ] - private: [ # RFC1918 - [ new IPv4([10, 0, 0, 0]), 8 ] - [ new IPv4([172, 16, 0, 0]), 12 ] - [ new IPv4([192, 168, 0, 0]), 16 ] - ] - reserved: [ # Reserved and testing-only ranges; RFCs 5735, 5737, 2544, 1700 - [ new IPv4([192, 0, 0, 0]), 24 ] - [ new IPv4([192, 0, 2, 0]), 24 ] - [ new IPv4([192, 88, 99, 0]), 24 ] - [ new IPv4([198, 51, 100, 0]), 24 ] - [ new IPv4([203, 0, 113, 0]), 24 ] - [ new IPv4([240, 0, 0, 0]), 4 ] - ] - - # Checks if the address corresponds to one of the special ranges. - range: -> - return ipaddr.subnetMatch(this, @SpecialRanges) - - # Convrets this IPv4 address to an IPv4-mapped IPv6 address. - toIPv4MappedAddress: -> - return ipaddr.IPv6.parse "::ffff:#{@toString()}" - -# A list of regular expressions that match arbitrary IPv4 addresses, -# for which a number of weird notations exist. -# Note that an address like 0010.0xa5.1.1 is considered legal. -ipv4Part = "(0?\\d+|0x[a-f0-9]+)" -ipv4Regexes = - fourOctet: new RegExp "^#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}$", 'i' - longValue: new RegExp "^#{ipv4Part}$", 'i' - -# Classful variants (like a.b, where a is an octet, and b is a 24-bit -# value representing last three octets; this corresponds to a class C -# address) are omitted due to classless nature of modern Internet. -ipaddr.IPv4.parser = (string) -> - parseIntAuto = (string) -> - if string[0] == "0" && string[1] != "x" - parseInt(string, 8) - else - parseInt(string) - - # parseInt recognizes all that octal & hexadecimal weirdness for us - if match = string.match(ipv4Regexes.fourOctet) - return (parseIntAuto(part) for part in match[1..5]) - else if match = string.match(ipv4Regexes.longValue) - value = parseIntAuto(match[1]) - return ((value >> shift) & 0xff for shift in [0..24] by 8).reverse() - else - return null - -# An IPv6 address (RFC2460) -class ipaddr.IPv6 - # Constructs an IPv6 address from an array of eight 16-bit parts. - # Throws an error if the input is invalid. - constructor: (parts) -> - if parts.length != 8 - throw new Error "ipaddr: ipv6 part count should be 8" - - for part in parts - if !(0 <= part <= 0xffff) - throw new Error "ipaddr: ipv6 part should fit to two octets" - - @parts = parts - - # The 'kind' method exists on both IPv4 and IPv6 classes. - kind: -> - return 'ipv6' - - # Returns the address in compact, human-readable format like - # 2001:db8:8:66::1 - toString: -> - stringParts = (part.toString(16) for part in @parts) - - compactStringParts = [] - pushPart = (part) -> compactStringParts.push part - - state = 0 - for part in stringParts - switch state - when 0 - if part == '0' - pushPart('') - else - pushPart(part) - - state = 1 - when 1 - if part == '0' - state = 2 - else - pushPart(part) - when 2 - unless part == '0' - pushPart('') - pushPart(part) - state = 3 - when 3 - pushPart(part) - - if state == 2 - pushPart('') - pushPart('') - - return compactStringParts.join ":" - - # Returns an array of byte-sized values in network order - toByteArray: -> - bytes = [] - for part in @parts - bytes.push(part >> 8) - bytes.push(part & 0xff) - - return bytes - - # Returns the address in expanded format with all zeroes included, like - # 2001:db8:8:66:0:0:0:1 - toNormalizedString: -> - return (part.toString(16) for part in @parts).join ":" - - # Checks if this address matches other one within given CIDR range. - match: (other, cidrRange) -> - if other.kind() != 'ipv6' - throw new Error "ipaddr: cannot match ipv6 address with non-ipv6 one" - - return matchCIDR(this.parts, other.parts, 16, cidrRange) - - # Special IPv6 ranges - SpecialRanges: - unspecified: [ new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128 ] # RFC4291, here and after - linkLocal: [ new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10 ] - multicast: [ new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8 ] - loopback: [ new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128 ] - uniqueLocal: [ new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7 ] - ipv4Mapped: [ new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96 ] - rfc6145: [ new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96 ] # RFC6145 - rfc6052: [ new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96 ] # RFC6052 - '6to4': [ new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16 ] # RFC3056 - teredo: [ new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32 ] # RFC6052, RFC6146 - reserved: [ - [ new IPv6([ 0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32 ] # RFC4291 - ] - - # Checks if the address corresponds to one of the special ranges. - range: -> - return ipaddr.subnetMatch(this, @SpecialRanges) - - # Checks if this address is an IPv4-mapped IPv6 address. - isIPv4MappedAddress: -> - return @range() == 'ipv4Mapped' - - # Converts this address to IPv4 address if it is an IPv4-mapped IPv6 address. - # Throws an error otherwise. - toIPv4Address: -> - unless @isIPv4MappedAddress() - throw new Error "ipaddr: trying to convert a generic ipv6 address to ipv4" - - [high, low] = @parts[-2..-1] - - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]) - -# IPv6-matching regular expressions. -# For IPv6, the task is simpler: it is enough to match the colon-delimited -# hexadecimal IPv6 and a transitional variant with dotted-decimal IPv4 at -# the end. -ipv6Part = "(?:[0-9a-f]+::?)+" -ipv6Regexes = - native: new RegExp "^(::)?(#{ipv6Part})?([0-9a-f]+)?(::)?$", 'i' - transitional: new RegExp "^((?:#{ipv6Part})|(?:::)(?:#{ipv6Part})?)" + - "#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}$", 'i' - -# Expand :: in an IPv6 address or address part consisting of `parts` groups. -expandIPv6 = (string, parts) -> - # More than one '::' means invalid adddress - if string.indexOf('::') != string.lastIndexOf('::') - return null - - # How many parts do we already have? - colonCount = 0 - lastColon = -1 - while (lastColon = string.indexOf(':', lastColon + 1)) >= 0 - colonCount++ - - # 0::0 is two parts more than :: - colonCount-- if string[0] == ':' - colonCount-- if string[string.length-1] == ':' - - # replacement = ':' + '0:' * (parts - colonCount) - replacementCount = parts - colonCount - replacement = ':' - while replacementCount-- - replacement += '0:' - - # Insert the missing zeroes - string = string.replace('::', replacement) - - # Trim any garbage which may be hanging around if :: was at the edge in - # the source string - string = string[1..-1] if string[0] == ':' - string = string[0..-2] if string[string.length-1] == ':' - - return (parseInt(part, 16) for part in string.split(":")) - -# Parse an IPv6 address. -ipaddr.IPv6.parser = (string) -> - if string.match(ipv6Regexes['native']) - return expandIPv6(string, 8) - - else if match = string.match(ipv6Regexes['transitional']) - parts = expandIPv6(match[1][0..-2], 6) - if parts - parts.push(parseInt(match[2]) << 8 | parseInt(match[3])) - parts.push(parseInt(match[4]) << 8 | parseInt(match[5])) - return parts - - return null - -# Checks if a given string is formatted like IPv4/IPv6 address. -ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = (string) -> - return @parser(string) != null - -# Checks if a given string is a valid IPv4/IPv6 address. -ipaddr.IPv4.isValid = ipaddr.IPv6.isValid = (string) -> - try - new this(@parser(string)) - return true - catch e - return false - -# Tries to parse and validate a string with IPv4/IPv6 address. -# Throws an error if it fails. -ipaddr.IPv4.parse = ipaddr.IPv6.parse = (string) -> - parts = @parser(string) - if parts == null - throw new Error "ipaddr: string is not formatted like ip address" - - return new this(parts) - -# Checks if the address is valid IP address -ipaddr.isValid = (string) -> - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string) - -# Try to parse an address and throw an error if it is impossible -ipaddr.parse = (string) -> - if ipaddr.IPv6.isIPv6(string) - return ipaddr.IPv6.parse(string) - else if ipaddr.IPv4.isIPv4(string) - return ipaddr.IPv4.parse(string) - else - throw new Error "ipaddr: the address has neither IPv6 nor IPv4 format" - -# Parse an address and return plain IPv4 address if it is an IPv4-mapped address -ipaddr.process = (string) -> - addr = @parse(string) - if addr.kind() == 'ipv6' && addr.isIPv4MappedAddress() - return addr.toIPv4Address() - else - return addr diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee deleted file mode 100644 index 56751da..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee +++ /dev/null @@ -1,209 +0,0 @@ -ipaddr = require '../lib/ipaddr' - -module.exports = - 'should define main classes': (test) -> - test.ok(ipaddr.IPv4?, 'defines IPv4 class') - test.ok(ipaddr.IPv6?, 'defines IPv6 class') - test.done() - - 'can construct IPv4 from octets': (test) -> - test.doesNotThrow -> - new ipaddr.IPv4([192, 168, 1, 2]) - test.done() - - 'refuses to construct invalid IPv4': (test) -> - test.throws -> - new ipaddr.IPv4([300, 1, 2, 3]) - test.throws -> - new ipaddr.IPv4([8, 8, 8]) - test.done() - - 'converts IPv4 to string correctly': (test) -> - addr = new ipaddr.IPv4([192, 168, 1, 1]) - test.equal(addr.toString(), '192.168.1.1') - test.done() - - 'returns correct kind for IPv4': (test) -> - addr = new ipaddr.IPv4([1, 2, 3, 4]) - test.equal(addr.kind(), 'ipv4') - test.done() - - 'allows to access IPv4 octets': (test) -> - addr = new ipaddr.IPv4([42, 0, 0, 0]) - test.equal(addr.octets[0], 42) - test.done() - - 'checks IPv4 address format': (test) -> - test.equal(ipaddr.IPv4.isIPv4('192.168.007.0xa'), true) - test.equal(ipaddr.IPv4.isIPv4('1024.0.0.1'), true) - test.equal(ipaddr.IPv4.isIPv4('8.0xa.wtf.6'), false) - test.done() - - 'validates IPv4 addresses': (test) -> - test.equal(ipaddr.IPv4.isValid('192.168.007.0xa'), true) - test.equal(ipaddr.IPv4.isValid('1024.0.0.1'), false) - test.equal(ipaddr.IPv4.isValid('8.0xa.wtf.6'), false) - test.done() - - 'parses IPv4 in several weird formats': (test) -> - test.deepEqual(ipaddr.IPv4.parse('192.168.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('0xc0.168.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('192.0250.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('0xc0a80101').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('030052000401').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('3232235777').octets, [192, 168, 1, 1]) - test.done() - - 'barfs at invalid IPv4': (test) -> - test.throws -> - ipaddr.IPv4.parse('10.0.0.wtf') - test.done() - - 'matches IPv4 CIDR correctly': (test) -> - addr = new ipaddr.IPv4([10, 5, 0, 1]) - test.equal(addr.match(ipaddr.IPv4.parse('0.0.0.0'), 0), true) - test.equal(addr.match(ipaddr.IPv4.parse('11.0.0.0'), 8), false) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.0'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.1'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.10'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.5.5.0'), 16), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 16), false) - test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 15), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.5.0.2'), 32), false) - test.equal(addr.match(addr, 32), true) - test.done() - - 'detects reserved IPv4 networks': (test) -> - test.equal(ipaddr.IPv4.parse('10.1.0.1').range(), 'private') - test.equal(ipaddr.IPv4.parse('192.168.2.1').range(), 'private') - test.equal(ipaddr.IPv4.parse('224.100.0.1').range(), 'multicast') - test.equal(ipaddr.IPv4.parse('169.254.15.0').range(), 'linkLocal') - test.equal(ipaddr.IPv4.parse('127.1.1.1').range(), 'loopback') - test.equal(ipaddr.IPv4.parse('255.255.255.255').range(), 'broadcast') - test.equal(ipaddr.IPv4.parse('240.1.2.3').range(), 'reserved') - test.equal(ipaddr.IPv4.parse('8.8.8.8').range(), 'unicast') - test.done() - - 'can construct IPv6 from parts': (test) -> - test.doesNotThrow -> - new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.done() - - 'refuses to construct invalid IPv6': (test) -> - test.throws -> - new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 0, 1]) - test.throws -> - new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 1]) - test.done() - - 'converts IPv6 to string correctly': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.equal(addr.toNormalizedString(), '2001:db8:f53a:0:0:0:0:1') - test.equal(addr.toString(), '2001:db8:f53a::1') - test.equal(new ipaddr.IPv6([0, 0, 0, 0, 0, 0, 0, 1]).toString(), '::1') - test.equal(new ipaddr.IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]).toString(), '2001:db8::') - test.done() - - 'returns correct kind for IPv6': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.equal(addr.kind(), 'ipv6') - test.done() - - 'allows to access IPv6 address parts': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 42, 0, 1]) - test.equal(addr.parts[5], 42) - test.done() - - 'checks IPv6 address format': (test) -> - test.equal(ipaddr.IPv6.isIPv6('2001:db8:F53A::1'), true) - test.equal(ipaddr.IPv6.isIPv6('200001::1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:192.168.1.1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1:0'), false) - test.equal(ipaddr.IPv6.isIPv6('fe80::wtf'), false) - test.done() - - 'validates IPv6 addresses': (test) -> - test.equal(ipaddr.IPv6.isValid('2001:db8:F53A::1'), true) - test.equal(ipaddr.IPv6.isValid('200001::1'), false) - test.equal(ipaddr.IPv6.isValid('::ffff:192.168.1.1'), true) - test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1'), false) - test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1:0'), false) - test.equal(ipaddr.IPv6.isValid('2001:db8::F53A::1'), false) - test.equal(ipaddr.IPv6.isValid('fe80::wtf'), false) - test.done() - - 'parses IPv6 in different formats': (test) -> - test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A:0:0:0:0:1').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.deepEqual(ipaddr.IPv6.parse('fe80::10').parts, [0xfe80, 0, 0, 0, 0, 0, 0, 0x10]) - test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A::').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 0]) - test.deepEqual(ipaddr.IPv6.parse('::1').parts, [0, 0, 0, 0, 0, 0, 0, 1]) - test.deepEqual(ipaddr.IPv6.parse('::').parts, [0, 0, 0, 0, 0, 0, 0, 0]) - test.done() - - 'barfs at invalid IPv6': (test) -> - test.throws -> - ipaddr.IPv6.parse('fe80::0::1') - test.done() - - 'matches IPv6 CIDR correctly': (test) -> - addr = ipaddr.IPv6.parse('2001:db8:f53a::1') - test.equal(addr.match(ipaddr.IPv6.parse('::'), 0), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53a::1:1'), 64), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53b::1:1'), 48), false) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f531::1:1'), 44), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f500::1'), 40), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db9:f500::1'), 40), false) - test.equal(addr.match(addr, 128), true) - test.done() - - 'converts between IPv4-mapped IPv6 addresses and IPv4 addresses': (test) -> - addr = ipaddr.IPv4.parse('77.88.21.11') - mapped = addr.toIPv4MappedAddress() - test.deepEqual(mapped.parts, [0, 0, 0, 0, 0, 0xffff, 0x4d58, 0x150b]) - test.deepEqual(mapped.toIPv4Address().octets, addr.octets) - test.done() - - 'refuses to convert non-IPv4-mapped IPv6 address to IPv4 address': (test) -> - test.throws -> - ipaddr.IPv6.parse('2001:db8::1').toIPv4Address() - test.done() - - 'detects reserved IPv6 networks': (test) -> - test.equal(ipaddr.IPv6.parse('::').range(), 'unspecified') - test.equal(ipaddr.IPv6.parse('fe80::1234:5678:abcd:0123').range(), 'linkLocal') - test.equal(ipaddr.IPv6.parse('ff00::1234').range(), 'multicast') - test.equal(ipaddr.IPv6.parse('::1').range(), 'loopback') - test.equal(ipaddr.IPv6.parse('fc00::').range(), 'uniqueLocal') - test.equal(ipaddr.IPv6.parse('::ffff:192.168.1.10').range(), 'ipv4Mapped') - test.equal(ipaddr.IPv6.parse('::ffff:0:192.168.1.10').range(), 'rfc6145') - test.equal(ipaddr.IPv6.parse('64:ff9b::1234').range(), 'rfc6052') - test.equal(ipaddr.IPv6.parse('2002:1f63:45e8::1').range(), '6to4') - test.equal(ipaddr.IPv6.parse('2001::4242').range(), 'teredo') - test.equal(ipaddr.IPv6.parse('2001:db8::3210').range(), 'reserved') - test.equal(ipaddr.IPv6.parse('2001:470:8:66::1').range(), 'unicast') - test.done() - - 'is able to determine IP address type': (test) -> - test.equal(ipaddr.parse('8.8.8.8').kind(), 'ipv4') - test.equal(ipaddr.parse('2001:db8:3312::1').kind(), 'ipv6') - test.done() - - 'throws an error if tried to parse an invalid address': (test) -> - test.throws -> - ipaddr.parse('::some.nonsense') - test.done() - - 'correctly processes IPv4-mapped addresses': (test) -> - test.equal(ipaddr.process('8.8.8.8').kind(), 'ipv4') - test.equal(ipaddr.process('2001:db8:3312::1').kind(), 'ipv6') - test.equal(ipaddr.process('::ffff:192.168.1.1').kind(), 'ipv4') - test.done() - - 'correctly converts IPv6 and IPv4 addresses to byte arrays': (test) -> - test.deepEqual(ipaddr.parse('1.2.3.4').toByteArray(), - [0x1, 0x2, 0x3, 0x4]); - # Fuck yeah. The first byte of Google's IPv6 address is 42. 42! - test.deepEqual(ipaddr.parse('2a00:1450:8007::68').toByteArray(), - [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68 ]) - test.done() diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/package.json deleted file mode 100644 index e5dfcb6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "proxy-addr", - "description": "Determine address of proxied request", - "version": "1.0.1", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "ip", - "proxy", - "x-forwarded-for" - ], - "repository": { - "type": "git", - "url": "https://github.com/expressjs/proxy-addr.git" - }, - "bugs": { - "url": "https://github.com/expressjs/proxy-addr/issues" - }, - "dependencies": { - "ipaddr.js": "0.1.2" - }, - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "istanbul": "0.2.10", - "mocha": "~1.20.0", - "should": "~4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "homepage": "https://github.com/expressjs/proxy-addr", - "_id": "proxy-addr@1.0.1", - "dist": { - "shasum": "c7c566d5eb4e3fad67eeb9c77c5558ccc39b88a8", - "tarball": "http://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.1.tgz" - }, - "_from": "proxy-addr@1.0.1", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "c7c566d5eb4e3fad67eeb9c77c5558ccc39b88a8", - "_resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.gitmodules b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.gitmodules deleted file mode 100644 index 49e31da..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "support/expresso"] - path = support/expresso - url = git://github.com/visionmedia/expresso.git -[submodule "support/should"] - path = support/should - url = git://github.com/visionmedia/should.js.git diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.npmignore deleted file mode 100644 index e85ce2a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -test -.travis.yml -benchmark.js -component.json -examples.js -History.md -Makefile diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/Readme.md deleted file mode 100644 index 27e54a4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/Readme.md +++ /dev/null @@ -1,58 +0,0 @@ -# node-querystring - - query string parser for node and the browser supporting nesting, as it was removed from `0.3.x`, so this library provides the previous and commonly desired behaviour (and twice as fast). Used by [express](http://expressjs.com), [connect](http://senchalabs.github.com/connect) and others. - -## Installation - - $ npm install qs - -## Examples - -```js -var qs = require('qs'); - -qs.parse('user[name][first]=Tobi&user[email]=tobi@learnboost.com'); -// => { user: { name: { first: 'Tobi' }, email: 'tobi@learnboost.com' } } - -qs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }}) -// => user[name]=Tobi&user[email]=tobi%40learnboost.com -``` - -## Testing - -Install dev dependencies: - - $ npm install -d - -and execute: - - $ make test - -browser: - - $ open test/browser/index.html - -## License - -(The MIT License) - -Copyright (c) 2010 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/index.js deleted file mode 100644 index b05938a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/index.js +++ /dev/null @@ -1,366 +0,0 @@ -/** - * Object#toString() ref for stringify(). - */ - -var toString = Object.prototype.toString; - -/** - * Object#hasOwnProperty ref - */ - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -/** - * Array#indexOf shim. - */ - -var indexOf = typeof Array.prototype.indexOf === 'function' - ? function(arr, el) { return arr.indexOf(el); } - : function(arr, el) { - for (var i = 0; i < arr.length; i++) { - if (arr[i] === el) return i; - } - return -1; - }; - -/** - * Array.isArray shim. - */ - -var isArray = Array.isArray || function(arr) { - return toString.call(arr) == '[object Array]'; -}; - -/** - * Object.keys shim. - */ - -var objectKeys = Object.keys || function(obj) { - var ret = []; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - ret.push(key); - } - } - return ret; -}; - -/** - * Array#forEach shim. - */ - -var forEach = typeof Array.prototype.forEach === 'function' - ? function(arr, fn) { return arr.forEach(fn); } - : function(arr, fn) { - for (var i = 0; i < arr.length; i++) fn(arr[i]); - }; - -/** - * Array#reduce shim. - */ - -var reduce = function(arr, fn, initial) { - if (typeof arr.reduce === 'function') return arr.reduce(fn, initial); - var res = initial; - for (var i = 0; i < arr.length; i++) res = fn(res, arr[i]); - return res; -}; - -/** - * 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]) { - if (hasOwnProperty.call(parent[key], i)) { - t[i] = parent[key][i]; - } - } - parent[key] = t; - return t; -} - -function parse(parts, parent, key, val) { - var part = parts.shift(); - - // illegal - if (Object.getOwnPropertyDescriptor(Object.prototype, key)) return; - - // end - if (!part) { - if (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 (isArray(obj)) { - if ('' != val) obj.push(val); - } else if ('object' == typeof obj) { - obj[objectKeys(obj).length] = val; - } else { - obj = parent[key] = [parent[key], val]; - } - // prop - } else if (~indexOf(part, ']')) { - part = part.substr(0, part.length - 1); - if (!isint.test(part) && isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - // key - } else { - if (!isint.test(part) && isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - } - } -} - -/** - * Merge parent key/val pair. - */ - -function merge(parent, key, val){ - if (~indexOf(key, ']')) { - var parts = key.split('[') - , len = parts.length - , last = len - 1; - parse(parts, parent, 'base', val); - // optimize - } else { - if (!isint.test(key) && 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; -} - -/** - * Compact sparse arrays. - */ - -function compact(obj) { - if ('object' != typeof obj) return obj; - - if (isArray(obj)) { - var ret = []; - - for (var i in obj) { - if (hasOwnProperty.call(obj, i)) { - ret.push(obj[i]); - } - } - - return ret; - } - - for (var key in obj) { - obj[key] = compact(obj[key]); - } - - return obj; -} - -/** - * Parse the given obj. - */ - -function parseObject(obj){ - var ret = { base: {} }; - - forEach(objectKeys(obj), function(name){ - merge(ret, name, obj[name]); - }); - - return compact(ret.base); -} - -/** - * Parse the given str. - */ - -function parseString(str){ - var ret = reduce(String(str).split('&'), function(ret, pair){ - var eql = indexOf(pair, '=') - , brace = lastBraceInKey(pair) - , key = pair.substr(0, brace || eql) - , val = pair.substr(brace || eql, pair.length) - , val = val.substr(indexOf(val, '=') + 1, val.length); - - // ?foo - if ('' == key) key = pair, val = ''; - if ('' == key) return ret; - - return merge(ret, decode(key), decode(val)); - }, { base: {} }).base; - - return compact(ret); -} - -/** - * 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 (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 + '=' + encodeURIComponent(String(obj)); - } -}; - -/** - * Stringify the given `str`. - * - * @param {String} str - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyString(str, prefix) { - if (!prefix) throw new TypeError('stringify expects an object'); - return prefix + '=' + encodeURIComponent(str); -} - -/** - * Stringify the given `arr`. - * - * @param {Array} arr - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyArray(arr, prefix) { - var ret = []; - if (!prefix) throw new TypeError('stringify expects an object'); - for (var i = 0; i < arr.length; i++) { - ret.push(stringify(arr[i], prefix + '[' + i + ']')); - } - return ret.join('&'); -} - -/** - * Stringify the given `obj`. - * - * @param {Object} obj - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyObject(obj, prefix) { - var ret = [] - , keys = objectKeys(obj) - , key; - - for (var i = 0, len = keys.length; i < len; ++i) { - key = keys[i]; - if ('' == key) continue; - if (null == obj[key]) { - ret.push(encodeURIComponent(key) + '='); - } else { - 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 (Object.getOwnPropertyDescriptor(Object.prototype, key)) return; - if (undefined === v) { - obj[key] = val; - } else if (isArray(v)) { - v.push(val); - } else { - obj[key] = [v, val]; - } -} - -/** - * Locate last brace in `str` within the key. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function lastBraceInKey(str) { - var len = str.length - , brace - , c; - for (var i = 0; i < len; ++i) { - c = str[i]; - if (']' == c) brace = false; - if ('[' == c) brace = true; - if ('=' == c && !brace) return i; - } -} - -/** - * Decode `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -function decode(str) { - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (err) { - return str; - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/package.json deleted file mode 100644 index 3568353..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "qs", - "description": "querystring parser", - "version": "0.6.6", - "keywords": [ - "query string", - "parser", - "component" - ], - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/node-querystring.git" - }, - "devDependencies": { - "mocha": "*", - "expect.js": "*" - }, - "scripts": { - "test": "make test" - }, - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "main": "index", - "engines": { - "node": "*" - }, - "bugs": { - "url": "https://github.com/visionmedia/node-querystring/issues" - }, - "_id": "qs@0.6.6", - "dist": { - "shasum": "6e015098ff51968b8a3c819001d5f2c89bc4b107", - "tarball": "http://registry.npmjs.org/qs/-/qs-0.6.6.tgz" - }, - "_from": "qs@0.6.6", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "6e015098ff51968b8a3c819001d5f2c89bc4b107", - "_resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/visionmedia/node-querystring" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/History.md deleted file mode 100644 index b35ba51..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/History.md +++ /dev/null @@ -1,21 +0,0 @@ - -1.0.0 / 2013-12-11 -================== - - * add repository to package.json - * add MIT license - -0.0.4 / 2012-06-17 -================== - - * changed: ret -1 for unsatisfiable and -2 when invalid - -0.0.3 / 2012-06-17 -================== - - * fix last-byte-pos default to len - 1 - -0.0.2 / 2012-06-14 -================== - - * add `.type` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Readme.md deleted file mode 100644 index cb30a5a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Readme.md +++ /dev/null @@ -1,53 +0,0 @@ - -# node-range-parser - - Range header field parser. - -## Example: - -```js -assert(-1 == parse(200, 'bytes=500-20')); -assert(-2 == parse(200, 'bytes=malformed')); -parse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }])); -parse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }])); -parse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }])); -parse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }])); -parse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }])); -parse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }])); -parse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }])); -parse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }])); -parse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }])); -``` - -## Installation - -``` -$ npm install range-parser -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/index.js deleted file mode 100644 index 9b0f7a8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/index.js +++ /dev/null @@ -1,49 +0,0 @@ - -/** - * Parse "Range" header `str` relative to the given file `size`. - * - * @param {Number} size - * @param {String} str - * @return {Array} - * @api public - */ - -module.exports = function(size, str){ - var valid = true; - var i = str.indexOf('='); - - if (-1 == i) return -2; - - var arr = str.slice(i + 1).split(',').map(function(range){ - var range = range.split('-') - , start = parseInt(range[0], 10) - , end = parseInt(range[1], 10); - - // -nnn - if (isNaN(start)) { - start = size - end; - end = size - 1; - // nnn- - } else if (isNaN(end)) { - end = size - 1; - } - - // limit last-byte-pos to current length - if (end > size - 1) end = size - 1; - - // invalid - if (isNaN(start) - || isNaN(end) - || start > end - || start < 0) valid = false; - - return { - start: start, - end: end - }; - }); - - arr.type = str.slice(0, i); - - return valid ? arr : -1; -}; \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/package.json deleted file mode 100644 index 568c0f1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "range-parser", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "Range header field string parser", - "version": "1.0.0", - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-range-parser.git" - }, - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/visionmedia/node-range-parser#license" - } - ], - "bugs": { - "url": "https://github.com/visionmedia/node-range-parser/issues" - }, - "_id": "range-parser@1.0.0", - "dist": { - "shasum": "a4b264cfe0be5ce36abe3765ac9c2a248746dbc0", - "tarball": "http://registry.npmjs.org/range-parser/-/range-parser-1.0.0.tgz" - }, - "_from": "range-parser@1.0.0", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "a4b264cfe0be5ce36abe3765ac9c2a248746dbc0", - "_resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.0.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/visionmedia/node-range-parser" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/.npmignore deleted file mode 100644 index 223570e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -coverage -test -examples -.travis.yml -*.sock diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/History.md deleted file mode 100644 index 9cf4069..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/History.md +++ /dev/null @@ -1,137 +0,0 @@ -0.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -0.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -0.7.0 / 2014-07-20 -================== - - * Deprecate `hidden` option; use `dotfiles` option - * Add `dotfiles` option - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - -0.6.0 / 2014-07-11 -================== - - * Deprecate `from` option; use `root` option - * Deprecate `send.etag()` -- use `etag` in `options` - * Deprecate `send.hidden()` -- use `hidden` in `options` - * Deprecate `send.index()` -- use `index` in `options` - * Deprecate `send.maxage()` -- use `maxAge` in `options` - * Deprecate `send.root()` -- use `root` in `options` - * Cap `maxAge` value to 1 year - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.5.0 / 2014-06-28 -================== - - * Accept string for `maxAge` (converted by `ms`) - * Add `headers` event - * Include link in default redirect response - * Use `EventEmitter.listenerCount` to count listeners - -0.4.3 / 2014-06-11 -================== - - * Do not throw un-catchable error on file open race condition - * Use `escape-html` for HTML escaping - * deps: debug@1.0.2 - - fix some debugging output colors on node.js 0.8 - * deps: finished@1.2.2 - * deps: fresh@0.2.2 - -0.4.2 / 2014-06-09 -================== - - * fix "event emitter leak" warnings - * deps: debug@1.0.1 - * deps: finished@1.2.1 - -0.4.1 / 2014-06-02 -================== - - * Send `max-age` in `Cache-Control` in correct format - -0.4.0 / 2014-05-27 -================== - - * Calculate ETag with md5 for reduced collisions - * Fix wrong behavior when index file matches directory - * Ignore stream errors after request ends - - Goodbye `EBADF, read` - * Skip directories in index file search - * deps: debug@0.8.1 - -0.3.0 / 2014-04-24 -================== - - * Fix sending files with dots without root set - * Coerce option types - * Accept API options in options object - * Set etags to "weak" - * Include file path in etag - * Make "Can't set headers after they are sent." catchable - * Send full entity-body for multi range requests - * Default directory access to 403 when index disabled - * Support multiple index paths - * Support "If-Range" header - * Control whether to generate etags - * deps: mime@1.2.11 - -0.2.0 / 2014-01-29 -================== - - * update range-parser and fresh - -0.1.4 / 2013-08-11 -================== - - * update fresh - -0.1.3 / 2013-07-08 -================== - - * Revert "Fix fd leak" - -0.1.2 / 2013-07-03 -================== - - * Fix fd leak - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/Readme.md deleted file mode 100644 index 5eceeef..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/Readme.md +++ /dev/null @@ -1,159 +0,0 @@ -# send - -[![NPM version](https://badge.fury.io/js/send.svg)](https://badge.fury.io/js/send) -[![Build Status](https://travis-ci.org/visionmedia/send.svg?branch=master)](https://travis-ci.org/visionmedia/send) -[![Coverage Status](https://img.shields.io/coveralls/visionmedia/send.svg?branch=master)](https://coveralls.io/r/visionmedia/send) - - Send is Connect's `static()` extracted for generalized use, a streaming static file - server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework. - -## Installation - - $ npm install send - -## Examples - - Small: - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - send(req, req.url).pipe(res); -}).listen(3000); -``` - - Serving from a root directory with custom error-handling: - -```js -var http = require('http'); -var send = require('send'); -var url = require('url'); - -var app = http.createServer(function(req, res){ - // your custom error-handling logic: - function error(err) { - res.statusCode = err.status || 500; - res.end(err.message); - } - - // your custom headers - function headers(res, path, stat) { - // serve all files for download - res.setHeader('Content-Disposition', 'attachment'); - } - - // your custom directory handling logic: - function redirect() { - res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, url.parse(req.url).pathname, {root: '/www/example.com/public'}) - .on('error', error) - .on('directory', redirect) - .on('headers', headers) - .pipe(res); -}).listen(3000); -``` - -## API - -### Options - -#### etag - - Enable or disable etag generation, defaults to true. - -#### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file - or directory that begins with a dot ("."). Note this check is done on - the path itself without checking if the path actually exists on the - disk. If `root` is specified, only the dotfiles above the root are - checked (i.e. the root itself can be within a dotfile when when set - to "deny"). - - The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and 404. - -#### index - - By default send supports "index.html" files, to disable this - set `false` or to supply a new index pass a string or an array - in preferred order. - -#### maxAge - - Provide a max-age in milliseconds for http caching, defaults to 0. - This can also be a string accepted by the - [ms](https://www.npmjs.org/package/ms#readme) module. - -#### root - - Serve files relative to `path`. - -### Events - - - `error` an error occurred `(err)` - - `directory` a directory was requested - - `file` a file was requested `(path, stat)` - - `headers` the headers are about to be set on a file `(res, path, stat)` - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -## Error-handling - - By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc. - -## Caching - - It does _not_ perform internal caching, you should use a reverse proxy cache such - as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;). - -## Debugging - - To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ npm test -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/index.js deleted file mode 100644 index 51b2b57..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/send'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/send.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/send.js deleted file mode 100644 index 1e71b58..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/send.js +++ /dev/null @@ -1,711 +0,0 @@ - -/** - * Module dependencies. - */ - -var debug = require('debug')('send') -var deprecate = require('depd')('send') -var escapeHtml = require('escape-html') - , parseRange = require('range-parser') - , Stream = require('stream') - , mime = require('mime') - , fresh = require('fresh') - , path = require('path') - , http = require('http') - , onFinished = require('finished') - , fs = require('fs') - , normalize = path.normalize - , join = path.join - , utils = require('./utils'); -var EventEmitter = require('events').EventEmitter; -var ms = require('ms'); - -/** - * Variables. - */ -var maxMaxAge = 60 * 60 * 24 * 365 * 1000; // 1 year -var resolve = path.resolve -var sep = path.sep -var upPathRegexp = /(?:^|[\\\/])\.\.(?:[\\\/]|$)/ - -/** - * Expose `send`. - */ - -exports = module.exports = send; - -/** - * Expose mime module. - */ - -exports.mime = mime; - -/** - * Shim EventEmitter.listenerCount for node.js < 0.10 - */ - -/* istanbul ignore next */ -var listenerCount = EventEmitter.listenerCount - || function(emitter, type){ return emitter.listeners(type).length; }; - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @return {SendStream} - * @api public - */ - -function send(req, path, options) { - return new SendStream(req, path, options); -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @api private - */ - -function SendStream(req, path, options) { - var self = this; - options = options || {}; - this.req = req; - this.path = path; - this.options = options; - - this._etag = options.etag !== undefined - ? Boolean(options.etag) - : true - - this._dotfiles = options.dotfiles !== undefined - ? options.dotfiles - : 'ignore' - - if (['allow', 'deny', 'ignore'].indexOf(this._dotfiles) === -1) { - throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') - } - - this._hidden = Boolean(options.hidden) - - if ('hidden' in options) { - deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') - } - - // legacy support - if (!('dotfiles' in options)) { - this._dotfiles = undefined - } - - this._index = options.index !== undefined - ? normalizeIndex(options.index) - : ['index.html'] - - this._maxage = options.maxAge || options.maxage - this._maxage = typeof this._maxage === 'string' - ? ms(this._maxage) - : Number(this._maxage) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), maxMaxAge) - : 0 - - this._root = options.root - ? resolve(options.root) - : null - - if (!this._root && options.from) { - this.from(options.from); - } -} - -/** - * Inherits from `Stream.prototype`. - */ - -SendStream.prototype.__proto__ = Stream.prototype; - -/** - * Enable or disable etag generation. - * - * @param {Boolean} val - * @return {SendStream} - * @api public - */ - -SendStream.prototype.etag = deprecate.function(function etag(val) { - val = Boolean(val); - debug('etag %s', val); - this._etag = val; - return this; -}, 'send.etag: pass etag as option'); - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = deprecate.function(function hidden(val) { - val = Boolean(val); - debug('hidden %s', val); - this._hidden = val; - this._dotfiles = undefined - return this; -}, 'send.hidden: use dotfiles option'); - -/** - * Set index `paths`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean|Array} paths - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = deprecate.function(function index(paths) { - var index = !paths ? [] : normalizeIndex(paths); - debug('index %o', paths); - this._index = index; - return this; -}, 'send.index: pass index as option'); - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = function(path){ - path = String(path); - this._root = resolve(path) - return this; -}; - -SendStream.prototype.from = deprecate.function(SendStream.prototype.root, - 'send.from: pass root as option'); - -SendStream.prototype.root = deprecate.function(SendStream.prototype.root, - 'send.root: pass root as option'); - -/** - * Set max-age to `maxAge`. - * - * @param {Number} maxAge - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = deprecate.function(function maxage(maxAge) { - maxAge = typeof maxAge === 'string' - ? ms(maxAge) - : Number(maxAge); - if (isNaN(maxAge)) maxAge = 0; - if (Infinity == maxAge) maxAge = 60 * 60 * 24 * 365 * 1000; - debug('max-age %d', maxAge); - this._maxage = maxAge; - return this; -}, 'send.maxage: pass maxAge as option'); - -/** - * Emit error with `status`. - * - * @param {Number} status - * @api private - */ - -SendStream.prototype.error = function(status, err){ - var res = this.res; - var msg = http.STATUS_CODES[status]; - - err = err || new Error(msg); - err.status = status; - - // emit if listeners instead of responding - if (listenerCount(this, 'error') !== 0) { - return this.emit('error', err); - } - - // wipe all existing headers - res._headers = undefined; - - res.statusCode = err.status; - res.end(msg); -}; - -/** - * Check if the pathname ends with "/". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasTrailingSlash = function(){ - return '/' == this.path[this.path.length - 1]; -}; - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function(){ - return this.req.headers['if-none-match'] - || this.req.headers['if-modified-since']; -}; - -/** - * Strip content-* header fields. - * - * @api private - */ - -SendStream.prototype.removeContentHeaderFields = function(){ - var res = this.res; - Object.keys(res._headers).forEach(function(field){ - if (0 == field.indexOf('content')) { - res.removeHeader(field); - } - }); -}; - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function(){ - var res = this.res; - debug('not modified'); - this.removeContentHeaderFields(); - res.statusCode = 304; - res.end(); -}; - -/** - * Raise error that headers already sent. - * - * @api private - */ - -SendStream.prototype.headersAlreadySent = function headersAlreadySent(){ - var err = new Error('Can\'t set headers after they are sent.'); - debug('headers already sent'); - this.error(500, err); -}; - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function(){ - var res = this.res; - return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; -}; - -/** - * Handle stat() error. - * - * @param {Error} err - * @api private - */ - -SendStream.prototype.onStatError = function(err){ - var notfound = ['ENOENT', 'ENAMETOOLONG', 'ENOTDIR']; - if (~notfound.indexOf(err.code)) return this.error(404, err); - this.error(500, err); -}; - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function(){ - return fresh(this.req.headers, this.res._headers); -}; - -/** - * Check if the range is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isRangeFresh = function isRangeFresh(){ - var ifRange = this.req.headers['if-range']; - - if (!ifRange) return true; - - return ~ifRange.indexOf('"') - ? ~ifRange.indexOf(this.res._headers['etag']) - : Date.parse(this.res._headers['last-modified']) <= Date.parse(ifRange); -}; - -/** - * Redirect to `path`. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.redirect = function(path){ - if (listenerCount(this, 'directory') !== 0) { - return this.emit('directory'); - } - - if (this.hasTrailingSlash()) return this.error(403); - var res = this.res; - path += '/'; - res.statusCode = 301; - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.setHeader('Location', path); - res.end('Redirecting to ' + escapeHtml(path) + '\n'); -}; - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function(res){ - var self = this - , args = arguments - , root = this._root; - - // references - this.res = res; - - // decode the path - var path = utils.decode(this.path) - if (path === -1) return this.error(400) - - // null byte(s) - if (~path.indexOf('\0')) return this.error(400); - - var parts - if (root !== null) { - // join / normalize from optional root dir - path = normalize(join(root, path)) - - // malicious path - if (path.substr(0, root.length) !== root) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = path.substr(root.length + 1).split(sep) - } else { - // ".." is malicious without "root" - if (upPathRegexp.test(path)) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = normalize(path).split(sep) - - // resolve the path - path = resolve(path) - } - - // dotfile handling - if (containsDotFile(parts)) { - var access = this._dotfiles - - // legacy support - if (access === undefined) { - access = parts[parts.length - 1][0] === '.' - ? (this._hidden ? 'allow' : 'ignore') - : 'allow' - } - - debug('%s dotfile "%s"', access, path) - switch (access) { - case 'allow': - break - case 'deny': - return this.error(403) - case 'ignore': - default: - return this.error(404) - } - } - - // index file support - if (this._index.length && this.hasTrailingSlash()) { - this.sendIndex(path); - return res; - } - - debug('stat "%s"', path); - fs.stat(path, function(err, stat){ - if (err) return self.onStatError(err); - if (stat.isDirectory()) return self.redirect(self.path); - self.emit('file', path, stat); - self.send(path, stat); - }); - - return res; -}; - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function(path, stat){ - var options = this.options; - var len = stat.size; - var res = this.res; - var req = this.req; - var ranges = req.headers.range; - var offset = options.start || 0; - - if (res._header) { - // impossible to send now - return this.headersAlreadySent(); - } - - debug('pipe "%s"', path) - - // set header fields - this.setHeader(path, stat); - - // set content-type - this.type(path); - - // conditional GET support - if (this.isConditionalGET() - && this.isCachable() - && this.isFresh()) { - return this.notModified(); - } - - // adjust len to start/end options - len = Math.max(0, len - offset); - if (options.end !== undefined) { - var bytes = options.end - offset + 1; - if (len > bytes) len = bytes; - } - - // Range support - if (ranges) { - ranges = parseRange(len, ranges); - - // If-Range support - if (!this.isRangeFresh()) { - debug('range stale'); - ranges = -2; - } - - // unsatisfiable - if (-1 == ranges) { - debug('range unsatisfiable'); - res.setHeader('Content-Range', 'bytes */' + stat.size); - return this.error(416); - } - - // valid (syntactically invalid/multiple ranges are treated as a regular response) - if (-2 != ranges && ranges.length === 1) { - debug('range %j', ranges); - - options.start = offset + ranges[0].start; - options.end = offset + ranges[0].end; - - // Content-Range - res.statusCode = 206; - res.setHeader('Content-Range', 'bytes ' - + ranges[0].start - + '-' - + ranges[0].end - + '/' - + len); - len = options.end - options.start + 1; - } - } - - // content-length - res.setHeader('Content-Length', len); - - // HEAD support - if ('HEAD' == req.method) return res.end(); - - this.stream(path, options); -}; - -/** - * Transfer index for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendIndex = function sendIndex(path){ - var i = -1; - var self = this; - - function next(err){ - if (++i >= self._index.length) { - if (err) return self.onStatError(err); - return self.error(404); - } - - var p = path + self._index[i]; - - debug('stat "%s"', p); - fs.stat(p, function(err, stat){ - if (err) return next(err); - if (stat.isDirectory()) return next(); - self.emit('file', p, stat); - self.send(p, stat); - }); - } - - if (!this.hasTrailingSlash()) path += '/'; - - next(); -}; - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function(path, options){ - // TODO: this is all lame, refactor meeee - var finished = false; - var self = this; - var res = this.res; - var req = this.req; - - // pipe - var stream = fs.createReadStream(path, options); - this.emit('stream', stream); - stream.pipe(res); - - // response finished, done with the fd - onFinished(res, function onfinished(){ - finished = true; - stream.destroy(); - }); - - // error handling code-smell - stream.on('error', function onerror(err){ - // request already finished - if (finished) return; - - // clean up stream - finished = true; - stream.destroy(); - - // no hope in responding - if (res._header) { - console.error(err.stack); - req.destroy(); - return; - } - - // error - self.onStatError(err); - }); - - // end - stream.on('end', function onend(){ - self.emit('end'); - }); -}; - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function(path){ - var res = this.res; - if (res.getHeader('Content-Type')) return; - var type = mime.lookup(path); - var charset = mime.charsets.lookup(type); - debug('content-type %s', type); - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); -}; - -/** - * Set response header fields, most - * fields may be pre-defined. - * - * @param {String} path - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function setHeader(path, stat){ - var res = this.res; - - this.emit('headers', res, path, stat); - - if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); - if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString()); - if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + Math.floor(this._maxage / 1000)); - if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString()); - - if (this._etag && !res.getHeader('ETag')) { - var etag = utils.etag(path, stat); - debug('etag %s', etag); - res.setHeader('ETag', etag); - } -}; - -/** - * Determine if path parts contain a dotfile. - * - * @api private - */ - -function containsDotFile(parts) { - for (var i = 0; i < parts.length; i++) { - if (parts[i][0] === '.') { - return true - } - } - - return false -} - -/** - * Normalize the index option into an array. - * - * @param {boolean|string|array} val - * @api private - */ - -function normalizeIndex(val){ - return [].concat(val || []) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/utils.js deleted file mode 100644 index 3a88bf9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/utils.js +++ /dev/null @@ -1,42 +0,0 @@ - -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Return a weak ETag from the given `path` and `stat`. - * - * @param {String} path - * @param {Object} stat - * @return {String} - * @api private - */ - -exports.etag = function etag(path, stat) { - var tag = String(stat.mtime.getTime()) + ':' + String(stat.size) + ':' + path; - var str = crypto - .createHash('md5') - .update(tag, 'utf8') - .digest('base64'); - return 'W/"' + str + '"'; -}; - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -exports.decode = function(path){ - try { - return decodeURIComponent(path); - } catch (err) { - return -1; - } -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md deleted file mode 100644 index 8937250..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md +++ /dev/null @@ -1,50 +0,0 @@ -1.2.2 / 2014-06-10 -========== - - * reduce listeners added to emitters - - avoids "event emitter leak" warnings when used multiple times on same request - -1.2.1 / 2014-06-08 -================== - - * fix returned value when already finished - -1.2.0 / 2014-06-05 -================== - - * call callback when called on already-finished socket - -1.1.4 / 2014-05-27 -================== - - * support node.js 0.8 - -1.1.3 / 2014-04-30 -================== - - * make sure errors passed as instanceof `Error` - -1.1.2 / 2014-04-18 -================== - - * default the `socket` to passed-in object - -1.1.1 / 2014-01-16 -================== - - * rename module to `finished` - -1.1.0 / 2013-12-25 -================== - - * call callback when called on already-errored socket - -1.0.1 / 2013-12-20 -================== - - * actually pass the error to the callback - -1.0.0 / 2013-12-20 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/README.md deleted file mode 100644 index 79facd5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# finished - -[![NPM Version](https://badge.fury.io/js/finished.svg)](http://badge.fury.io/js/finished) -[![Build Status](https://travis-ci.org/expressjs/finished.svg?branch=master)](https://travis-ci.org/expressjs/finished) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/finished.svg?branch=master)](https://coveralls.io/r/expressjs/finished) - -Execute a callback when a request closes, finishes, or errors. - -#### Install - -```sh -$ npm install finished -``` - -#### Uses - -This is useful for cleaning up streams. For example, you want to destroy any file streams you create on socket errors otherwise you will leak file descriptors. - -This is required to fix what many perceive as issues with node's streams. Relevant: - -- [node#6041](https://github.com/joyent/node/issues/6041) -- [koa#184](https://github.com/koajs/koa/issues/184) -- [koa#165](https://github.com/koajs/koa/issues/165) - -## API - -### finished(response, callback) - -```js -var onFinished = require('finished') - -onFinished(res, function (err) { - // do something maybe -}) -``` - -### Examples - -The following code ensures that file descriptors are always closed once the response finishes. - -#### Node / Connect / Express - -```js -var onFinished = require('finished') - -function (req, res, next) { - var stream = fs.createReadStream('thingie.json') - stream.pipe(res) - onFinished(res, function (err) { - stream.destroy() - }) -} -``` - -#### Koa - -```js -function* () { - var stream = this.body = fs.createReadStream('thingie.json') - onFinished(this, function (err) { - stream.destroy() - }) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/index.js deleted file mode 100644 index 90709d4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/index.js +++ /dev/null @@ -1,62 +0,0 @@ -/*! - * finished - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** -* Module dependencies. -*/ - -var first = require('ee-first') - -/** -* Variables. -*/ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Invoke callback when the response has finished, useful for - * cleaning up resources afterwards. - * - * @param {object} thingie - * @param {function} callback - * @return {object} - * @api public - */ - -module.exports = function finished(thingie, callback) { - var socket = thingie.socket || thingie - var res = thingie.res || thingie - - if (res.finished || !socket.writable) { - defer(callback) - return thingie - } - - var listener = res.__onFinished - - // create a private single listener with queue - if (!listener || !listener.queue) { - listener = res.__onFinished = function onFinished(err) { - if (res.__onFinished === listener) res.__onFinished = null - var queue = listener.queue || [] - while (queue.length) queue.shift()(err) - } - listener.queue = [] - - // finished on first event - first([ - [socket, 'error', 'close'], - [res, 'finish'], - ], listener) - } - - listener.queue.push(callback) - - return thingie -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore deleted file mode 100644 index 72921ab..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.DS_Store* -node_modules diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md deleted file mode 100644 index 7eae173..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -# EE First - -Get the first event in a set of event emitters and event pairs, -then clean up after itself. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js deleted file mode 100644 index d0c48c9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js +++ /dev/null @@ -1,60 +0,0 @@ - -module.exports = function first(stuff, done) { - if (!Array.isArray(stuff)) - throw new TypeError('arg must be an array of [ee, events...] arrays') - - var cleanups = [] - - for (var i = 0; i < stuff.length; i++) { - var arr = stuff[i] - - if (!Array.isArray(arr) || arr.length < 2) - throw new TypeError('each array member must be [ee, events...]') - - var ee = arr[0] - - for (var j = 1; j < arr.length; j++) { - var event = arr[j] - var fn = listener(event, cleanup) - - // listen to the event - ee.on(event, fn) - // push this listener to the list of cleanups - cleanups.push({ - ee: ee, - event: event, - fn: fn, - }) - } - } - - return function (fn) { - done = fn - } - - function cleanup() { - var x - for (var i = 0; i < cleanups.length; i++) { - x = cleanups[i] - x.ee.removeListener(x.event, x.fn) - } - done.apply(null, arguments) - } -} - -function listener(event, done) { - return function onevent(arg1) { - var args = new Array(arguments.length) - var ee = this - var err = event === 'error' - ? arg1 - : null - - // copy args to prevent arguments escaping scope - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - done(err, ee, event, args) - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json deleted file mode 100644 index 1f82e3e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "ee-first", - "description": "return the first event in a set of ee/event pairs", - "version": "1.0.3", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/jonathanong/ee-first" - }, - "devDependencies": { - "mocha": "1" - }, - "scripts": { - "test": "mocha --reporter spec" - }, - "bugs": { - "url": "https://github.com/jonathanong/ee-first/issues" - }, - "homepage": "https://github.com/jonathanong/ee-first", - "_id": "ee-first@1.0.3", - "_shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "_from": "ee-first@1.0.3", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "tarball": "http://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js deleted file mode 100644 index adff984..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js +++ /dev/null @@ -1,60 +0,0 @@ - -var EventEmitter = require('events').EventEmitter -var assert = require('assert') - -var first = require('./') - -describe('first', function () { - var ee1 = new EventEmitter() - var ee2 = new EventEmitter() - var ee3 = new EventEmitter() - - it('should emit the first event', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - assert.equal(ee, ee2) - assert.equal(event, 'b') - assert.deepEqual(args, [1, 2, 3]) - done() - }) - - ee2.emit('b', 1, 2, 3) - }) - - it('it should return an error if event === error', function (done) { - first([ - [ee1, 'error', 'b', 'c'], - [ee2, 'error', 'b', 'c'], - [ee3, 'error', 'b', 'c'], - ], function (err, ee, event, args) { - assert.equal(err.message, 'boom') - assert.equal(ee, ee3) - assert.equal(event, 'error') - done() - }) - - ee3.emit('error', new Error('boom')) - }) - - it('should cleanup after itself', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - ;[ee1, ee2, ee3].forEach(function (ee) { - ['a', 'b', 'c'].forEach(function (event) { - assert(!ee.listeners(event).length) - }) - }) - done() - }) - - ee1.emit('a') - }) -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/package.json deleted file mode 100644 index b645a74..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "finished", - "description": "Execute a callback when a request closes, finishes, or errors", - "version": "1.2.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/finished" - }, - "dependencies": { - "ee-first": "1.0.3" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.1", - "should": "~4.0.1" - }, - "engine": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/finished/issues" - }, - "homepage": "https://github.com/expressjs/finished", - "_id": "finished@1.2.2", - "_shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "_from": "finished@1.2.2", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "tarball": "http://registry.npmjs.org/finished/-/finished-1.2.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/README.md deleted file mode 100644 index 6ca19bd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.default_type -Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/mime.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/mime.js deleted file mode 100644 index 48be0c5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/mime.js +++ /dev/null @@ -1,114 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - if (process.env.DEBUG_MIME && this.types[exts]) { - console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + - this.types[exts] + ' to ' + type); - } - - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - - this._loading = file; - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); - - this._loading = null; -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); - return this.extensions[type]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -}; - -module.exports = mime; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/package.json deleted file mode 100644 index 917e6af..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.2.11", - "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g.\n\n var mime = require('mime');\n\n mime.lookup('/path/to/file.txt'); // => 'text/plain'\n mime.lookup('file.txt'); // => 'text/plain'\n mime.lookup('.TXT'); // => 'text/plain'\n mime.lookup('htm'); // => 'text/html'\n\n### mime.default_type\nSets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)\n\n### mime.extension(type)\nGet the default extension for `type`\n\n mime.extension('text/html'); // => 'html'\n mime.extension('application/octet-stream'); // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n mime.charsets.lookup('text/plain'); // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n mime.define({\n 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n 'application/x-my-type': ['x-mt', 'x-mtt'],\n // etc ...\n });\n\n mime.lookup('x-sft'); // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n mime.load('./my_project.types');\n\nThe .types file format is simple - See the `types` dir for examples.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/broofa/node-mime/issues" - }, - "_id": "mime@1.2.11", - "dist": { - "shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "tarball": "http://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - }, - "_from": "mime@1.2.11", - "_npmVersion": "1.3.6", - "_npmUser": { - "name": "broofa", - "email": "robert@broofa.com" - }, - "maintainers": [ - { - "name": "broofa", - "email": "robert@broofa.com" - }, - { - "name": "bentomas", - "email": "benjamin@benjaminthomas.org" - } - ], - "directories": {}, - "_shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "_resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "homepage": "https://github.com/broofa/node-mime" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/test.js deleted file mode 100644 index 2cda1c7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/test.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); -var path = require('path'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); // normal file -eq('text/plain', mime.lookup('TEXT.TXT')); // uppercase -eq('text/plain', mime.lookup('dir/text.txt')); // dir + file -eq('text/plain', mime.lookup('.text.txt')); // hidden file -eq('text/plain', mime.lookup('.txt')); // nameless -eq('text/plain', mime.lookup('txt')); // extension-only -eq('text/plain', mime.lookup('/txt')); // extension-less () -eq('text/plain', mime.lookup('\\txt')); // Windows, extension-less -eq('application/octet-stream', mime.lookup('text.nope')); // unrecognized -eq('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq('bin', mime.extension('application/octet-stream ')); -eq('html', mime.extension(' text/html; charset=UTF-8')); -eq('html', mime.extension('text/html; charset=UTF-8 ')); -eq('html', mime.extension('text/html; charset=UTF-8')); -eq('html', mime.extension('text/html ; charset=UTF-8')); -eq('html', mime.extension('text/html;charset=UTF-8')); -eq('html', mime.extension('text/Html;charset=UTF-8')); -eq(undefined, mime.extension('unrecognized')); - -// -// Test node.types lookups -// - -eq('application/font-woff', mime.lookup('file.woff')); -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); -eq('font/opentype', mime.lookup('file.otf')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -// -// Test for overlaps between mime.types and node.types -// - -var apacheTypes = new mime.Mime(), nodeTypes = new mime.Mime(); -apacheTypes.load(path.join(__dirname, 'types/mime.types')); -nodeTypes.load(path.join(__dirname, 'types/node.types')); - -var keys = [].concat(Object.keys(apacheTypes.types)) - .concat(Object.keys(nodeTypes.types)); -keys.sort(); -for (var i = 1; i < keys.length; i++) { - if (keys[i] == keys[i-1]) { - console.warn('Warning: ' + - 'node.types defines ' + keys[i] + '->' + nodeTypes.types[keys[i]] + - ', mime.types defines ' + keys[i] + '->' + apacheTypes.types[keys[i]]); - } -} - -console.log('\nOK'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/mime.types b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/mime.types deleted file mode 100644 index da8cd69..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/node.types b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/node.types deleted file mode 100644 index 55b2cf7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/node.types +++ /dev/null @@ -1,77 +0,0 @@ -# What: WebVTT -# Why: To allow formats intended for marking up external text track resources. -# http://dev.w3.org/html5/webvtt/ -# Added by: niftylettuce -text/vtt vtt - -# 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: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifes ('.manifest' extension) -# 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 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: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp - -# What: Lua file types -# Why: Googling around shows de-facto consensus on these -# Added by: creationix (Issue #45) -text/x-lua lua -application/x-lua-bytecode luac - -# What: Markdown files, as per http://daringfireball.net/projects/markdown/syntax -# Why: http://stackoverflow.com/questions/10701983/what-is-the-mime-type-for-markdown -# Added by: avoidwork -text/x-markdown markdown md mkd - -# What: ini files -# Why: because they're just text files -# Added by: Matthew Kastor -text/plain ini - -# What: DASH Adaptive Streaming manifest -# Why: https://developer.mozilla.org/en-US/docs/DASH_Adaptive_Streaming_for_HTML_5_Video -# Added by: eelcocramer -application/dash+xml mdp - -# What: OpenType font files - http://www.microsoft.com/typography/otspec/ -# Why: Browsers usually ignore the font MIME types and sniff the content, -# but Chrome, shows a warning if OpenType fonts aren't served with -# the `font/opentype` MIME type: http://i.imgur.com/8c5RN8M.png. -# Added by: alrra -font/opentype otf diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/README.md deleted file mode 100644 index d4ab12a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours', { long: true })) // "10 hours" -``` - -- Node/Browser compatible. Published as `ms` in NPM. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/index.js deleted file mode 100644 index c5847f8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/package.json deleted file mode 100644 index 654cde8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "ms", - "version": "0.6.2", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "readme": "# ms.js: miliseconds conversion utility\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('100') // 100\n```\n\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(ms('10 hours', { long: true })) // \"10 hours\"\n```\n\n- Node/Browser compatible. Published as `ms` in NPM.\n- If a number is supplied to `ms`, a string with a unit is returned.\n- If a string that contains the number is supplied, it returns it as\na number (e.g: it returns `100` for `'100'`).\n- If you pass a string with a number and a valid unit, the number of\nequivalent ms is returned.\n\n## License\n\nMIT", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "_id": "ms@0.6.2", - "dist": { - "shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - }, - "_from": "ms@0.6.2", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "directories": {}, - "_shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "homepage": "https://github.com/guille/ms.js", - "scripts": {} -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/package.json deleted file mode 100644 index bb1dd7a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "send", - "description": "Better streaming static file server with Range and conditional-GET support", - "version": "0.7.2", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/send" - }, - "keywords": [ - "static", - "file", - "server" - ], - "dependencies": { - "debug": "1.0.4", - "depd": "0.4.4", - "escape-html": "1.0.1", - "finished": "1.2.2", - "fresh": "0.2.2", - "mime": "1.2.11", - "ms": "0.6.2", - "range-parser": "~1.0.0" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.0", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --check-leaks --reporter spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec" - }, - "bugs": { - "url": "https://github.com/visionmedia/send/issues" - }, - "homepage": "https://github.com/visionmedia/send", - "_id": "send@0.7.2", - "dist": { - "shasum": "3b5f696f701d56fe115b860cc6b3f0cdbfbf7804", - "tarball": "http://registry.npmjs.org/send/-/send-0.7.2.tgz" - }, - "_from": "send@0.7.2", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "3b5f696f701d56fe115b860cc6b3f0cdbfbf7804", - "_resolved": "https://registry.npmjs.org/send/-/send-0.7.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/History.md deleted file mode 100644 index 36f430d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/History.md +++ /dev/null @@ -1,117 +0,0 @@ -1.4.3 / 2014-07-29 -================== - - * deps: send@0.7.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - -1.4.2 / 2014-07-27 -================== - - * deps: send@0.7.2 - - deps: depd@0.4.4 - -1.4.1 / 2014-07-26 -================== - - * deps: send@0.7.1 - - deps: depd@0.4.3 - -1.4.0 / 2014-07-21 -================== - - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -1.3.2 / 2014-07-11 -================== - - * deps: send@0.6.0 - - Cap `maxAge` value to 1 year - - deps: debug@1.0.3 - -1.3.1 / 2014-07-09 -================== - - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -1.3.0 / 2014-06-28 -================== - - * Add `setHeaders` option - * Include HTML link in redirect response - * deps: send@0.5.0 - - Accept string for `maxAge` (converted by `ms`) - -1.2.3 / 2014-06-11 -================== - - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -1.2.2 / 2014-06-09 -================== - - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - -1.2.1 / 2014-06-02 -================== - - * use `escape-html` for escaping - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -1.2.0 / 2014-05-29 -================== - - * deps: send@0.4.0 - - Calculate ETag with md5 for reduced collisions - - Fix wrong behavior when index file matches directory - - Ignore stream errors after request ends - - Skip directories in index file search - - deps: debug@0.8.1 - -1.1.0 / 2014-04-24 -================== - - * Accept options directly to `send` module - * deps: send@0.3.0 - -1.0.4 / 2014-04-07 -================== - - * Resolve relative paths at middleware setup - * Use parseurl to parse the URL from request - -1.0.3 / 2014-03-20 -================== - - * Do not rely on connect-like environments - -1.0.2 / 2014-03-06 -================== - - * deps: send@0.2.0 - -1.0.1 / 2014-03-05 -================== - - * Add mime export for back-compat - -1.0.0 / 2014-03-05 -================== - - * Genesis from `connect` diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/LICENSE deleted file mode 100644 index b7bc085..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -(The MIT License) - -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 LearnBoost -Copyright (c) 2011 TJ Holowaychuk -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/Readme.md deleted file mode 100644 index 11dbc01..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/Readme.md +++ /dev/null @@ -1,144 +0,0 @@ -# serve-static - -[![NPM version](https://badge.fury.io/js/serve-static.svg)](http://badge.fury.io/js/serve-static) -[![Build Status](https://travis-ci.org/expressjs/serve-static.svg?branch=master)](https://travis-ci.org/expressjs/serve-static) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/serve-static.svg?branch=master)](https://coveralls.io/r/expressjs/serve-static) -[![Gittip](http://img.shields.io/gittip/dougwilson.svg)](https://www.gittip.com/dougwilson/) - -## Install - -```sh -$ npm install serve-static -``` - -## API - -```js -var serveStatic = require('serve-static') -``` - -### serveStatic(root, options) - -Create a new middleware function to serve files from within a given root -directory. The file to serve will be determined by combining `req.url` -with the provided root directory. When a file is not found, instead of -sending a 404 response, this module will instead call `next()` to move on -to the next middleware, allowing for stacking and fall-backs. - -#### Options - -##### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file -or directory that begins with a dot ("."). Note this check is done on -the path itself without checking if the path actually exists on the -disk. If `root` is specified, only the dotfiles above the root are -checked (i.e. the root itself can be within a dotfile when when set -to "deny"). - -The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and call `next()`. - -##### etag - -Enable or disable etag generation, defaults to true. - -##### index - -By default this module will send "index.html" files in response to a request -on a directory. To disable this set `false` or to supply a new index pass a -string or an array in preferred order. - -##### maxAge - -Provide a max-age in milliseconds for http caching, defaults to 0. This -can also be a string accepted by the [ms](https://www.npmjs.org/package/ms#readme) -module. - -##### redirect - -Redirect to trailing "/" when the pathname is a dir. Defaults to `true`. - -##### setHeaders - -Function to set custom headers on response. - -## Examples - -### Serve files with vanilla node.js http server - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -// Serve up public/ftp folder -var serve = serveStatic('public/ftp', {'index': ['index.html', 'index.htm']}) - -// Create server -var server = http.createServer(function(req, res){ - var done = finalhandler(req, res) - serve(req, res, done) -}) - -// Listen -server.listen(3000) -``` - -### Serve all files from ftp folder - -```js -var connect = require('connect') -var serveStatic = require('serve-static') - -var app = connect() - -app.use(serveStatic('public/ftp', {'index': ['default.html', 'default.htm']})) -app.listen(3000) -``` - -### Serve all files as downloads - -```js -var express = require('express') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic('public/ftp', { - 'index': false, - 'setHeaders': setHeaders -})) -app.listen(3000) - -function setHeaders(res, path) { - res.attachment(path) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/index.js deleted file mode 100644 index caa3acb..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/index.js +++ /dev/null @@ -1,122 +0,0 @@ -/*! - * serve-static - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var escapeHtml = require('escape-html'); -var parseurl = require('parseurl'); -var resolve = require('path').resolve; -var send = require('send'); -var url = require('url'); - -/** - * @param {String} root - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function(root, options){ - options = extend({}, options); - - // root required - if (!root) throw new TypeError('root path required'); - - // resolve root to absolute - root = resolve(root); - - // default redirect - var redirect = false !== options.redirect; - - // headers listener - var setHeaders = options.setHeaders - delete options.setHeaders - - if (setHeaders && typeof setHeaders !== 'function') { - throw new TypeError('option setHeaders must be function') - } - - // setup options for send - options.maxage = options.maxage || options.maxAge || 0; - options.root = root; - - return function staticMiddleware(req, res, next) { - if ('GET' != req.method && 'HEAD' != req.method) return next(); - var opts = extend({}, options); - var originalUrl = url.parse(req.originalUrl || req.url); - var path = parseurl(req).pathname; - - if (path === '/' && originalUrl.pathname[originalUrl.pathname.length - 1] !== '/') { - // make sure redirect occurs at mount - path = '' - } - - // create send stream - var stream = send(req, path, opts) - - if (redirect) { - // redirect relative to originalUrl - stream.on('directory', function redirect() { - originalUrl.pathname += '/' - - var target = url.format(originalUrl) - - res.statusCode = 303 - res.setHeader('Content-Type', 'text/html; charset=utf-8') - res.setHeader('Location', target) - res.end('Redirecting to ' + escapeHtml(target) + '\n') - }) - } else { - // forward to next middleware on directory - stream.on('directory', next) - } - - // add headers listener - if (setHeaders) { - stream.on('headers', setHeaders) - } - - // forward non-404 errors - stream.on('error', function error(err) { - next(err.status === 404 ? null : err) - }) - - // pipe - stream.pipe(res) - }; -}; - -/** - * Expose mime module. - * - * If you wish to extend the mime table use this - * reference to the "mime" module in the npm registry. - */ - -exports.mime = send.mime; - -/** - * Shallow clone a single object. - * - * @param {Object} obj - * @param {Object} source - * @return {Object} - * @api private - */ - -function extend(obj, source) { - if (!source) return obj; - - for (var prop in source) { - obj[prop] = source[prop]; - } - - return obj; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore deleted file mode 100644 index 223570e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -coverage -test -examples -.travis.yml -*.sock diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/History.md deleted file mode 100644 index 2b3de42..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/History.md +++ /dev/null @@ -1,142 +0,0 @@ -0.7.3 / 2014-07-29 -================== - - * Fix incorrect 403 on Windows and Node.js 0.11 - -0.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -0.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -0.7.0 / 2014-07-20 -================== - - * Deprecate `hidden` option; use `dotfiles` option - * Add `dotfiles` option - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - -0.6.0 / 2014-07-11 -================== - - * Deprecate `from` option; use `root` option - * Deprecate `send.etag()` -- use `etag` in `options` - * Deprecate `send.hidden()` -- use `hidden` in `options` - * Deprecate `send.index()` -- use `index` in `options` - * Deprecate `send.maxage()` -- use `maxAge` in `options` - * Deprecate `send.root()` -- use `root` in `options` - * Cap `maxAge` value to 1 year - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.5.0 / 2014-06-28 -================== - - * Accept string for `maxAge` (converted by `ms`) - * Add `headers` event - * Include link in default redirect response - * Use `EventEmitter.listenerCount` to count listeners - -0.4.3 / 2014-06-11 -================== - - * Do not throw un-catchable error on file open race condition - * Use `escape-html` for HTML escaping - * deps: debug@1.0.2 - - fix some debugging output colors on node.js 0.8 - * deps: finished@1.2.2 - * deps: fresh@0.2.2 - -0.4.2 / 2014-06-09 -================== - - * fix "event emitter leak" warnings - * deps: debug@1.0.1 - * deps: finished@1.2.1 - -0.4.1 / 2014-06-02 -================== - - * Send `max-age` in `Cache-Control` in correct format - -0.4.0 / 2014-05-27 -================== - - * Calculate ETag with md5 for reduced collisions - * Fix wrong behavior when index file matches directory - * Ignore stream errors after request ends - - Goodbye `EBADF, read` - * Skip directories in index file search - * deps: debug@0.8.1 - -0.3.0 / 2014-04-24 -================== - - * Fix sending files with dots without root set - * Coerce option types - * Accept API options in options object - * Set etags to "weak" - * Include file path in etag - * Make "Can't set headers after they are sent." catchable - * Send full entity-body for multi range requests - * Default directory access to 403 when index disabled - * Support multiple index paths - * Support "If-Range" header - * Control whether to generate etags - * deps: mime@1.2.11 - -0.2.0 / 2014-01-29 -================== - - * update range-parser and fresh - -0.1.4 / 2013-08-11 -================== - - * update fresh - -0.1.3 / 2013-07-08 -================== - - * Revert "Fix fd leak" - -0.1.2 / 2013-07-03 -================== - - * Fix fd leak - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md deleted file mode 100644 index 5eceeef..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md +++ /dev/null @@ -1,159 +0,0 @@ -# send - -[![NPM version](https://badge.fury.io/js/send.svg)](https://badge.fury.io/js/send) -[![Build Status](https://travis-ci.org/visionmedia/send.svg?branch=master)](https://travis-ci.org/visionmedia/send) -[![Coverage Status](https://img.shields.io/coveralls/visionmedia/send.svg?branch=master)](https://coveralls.io/r/visionmedia/send) - - Send is Connect's `static()` extracted for generalized use, a streaming static file - server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework. - -## Installation - - $ npm install send - -## Examples - - Small: - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - send(req, req.url).pipe(res); -}).listen(3000); -``` - - Serving from a root directory with custom error-handling: - -```js -var http = require('http'); -var send = require('send'); -var url = require('url'); - -var app = http.createServer(function(req, res){ - // your custom error-handling logic: - function error(err) { - res.statusCode = err.status || 500; - res.end(err.message); - } - - // your custom headers - function headers(res, path, stat) { - // serve all files for download - res.setHeader('Content-Disposition', 'attachment'); - } - - // your custom directory handling logic: - function redirect() { - res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, url.parse(req.url).pathname, {root: '/www/example.com/public'}) - .on('error', error) - .on('directory', redirect) - .on('headers', headers) - .pipe(res); -}).listen(3000); -``` - -## API - -### Options - -#### etag - - Enable or disable etag generation, defaults to true. - -#### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file - or directory that begins with a dot ("."). Note this check is done on - the path itself without checking if the path actually exists on the - disk. If `root` is specified, only the dotfiles above the root are - checked (i.e. the root itself can be within a dotfile when when set - to "deny"). - - The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and 404. - -#### index - - By default send supports "index.html" files, to disable this - set `false` or to supply a new index pass a string or an array - in preferred order. - -#### maxAge - - Provide a max-age in milliseconds for http caching, defaults to 0. - This can also be a string accepted by the - [ms](https://www.npmjs.org/package/ms#readme) module. - -#### root - - Serve files relative to `path`. - -### Events - - - `error` an error occurred `(err)` - - `directory` a directory was requested - - `file` a file was requested `(path, stat)` - - `headers` the headers are about to be set on a file `(res, path, stat)` - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -## Error-handling - - By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc. - -## Caching - - It does _not_ perform internal caching, you should use a reverse proxy cache such - as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;). - -## Debugging - - To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ npm test -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/index.js deleted file mode 100644 index 51b2b57..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/send'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js deleted file mode 100644 index 4bdd001..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js +++ /dev/null @@ -1,712 +0,0 @@ - -/** - * Module dependencies. - */ - -var debug = require('debug')('send') -var deprecate = require('depd')('send') -var escapeHtml = require('escape-html') - , parseRange = require('range-parser') - , Stream = require('stream') - , mime = require('mime') - , fresh = require('fresh') - , path = require('path') - , http = require('http') - , onFinished = require('finished') - , fs = require('fs') - , normalize = path.normalize - , join = path.join - , utils = require('./utils'); -var EventEmitter = require('events').EventEmitter; -var ms = require('ms'); - -/** - * Variables. - */ -var maxMaxAge = 60 * 60 * 24 * 365 * 1000; // 1 year -var resolve = path.resolve -var sep = path.sep -var upPathRegexp = /(?:^|[\\\/])\.\.(?:[\\\/]|$)/ - -/** - * Expose `send`. - */ - -exports = module.exports = send; - -/** - * Expose mime module. - */ - -exports.mime = mime; - -/** - * Shim EventEmitter.listenerCount for node.js < 0.10 - */ - -/* istanbul ignore next */ -var listenerCount = EventEmitter.listenerCount - || function(emitter, type){ return emitter.listeners(type).length; }; - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @return {SendStream} - * @api public - */ - -function send(req, path, options) { - return new SendStream(req, path, options); -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @api private - */ - -function SendStream(req, path, options) { - var self = this; - options = options || {}; - this.req = req; - this.path = path; - this.options = options; - - this._etag = options.etag !== undefined - ? Boolean(options.etag) - : true - - this._dotfiles = options.dotfiles !== undefined - ? options.dotfiles - : 'ignore' - - if (['allow', 'deny', 'ignore'].indexOf(this._dotfiles) === -1) { - throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') - } - - this._hidden = Boolean(options.hidden) - - if ('hidden' in options) { - deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') - } - - // legacy support - if (!('dotfiles' in options)) { - this._dotfiles = undefined - } - - this._index = options.index !== undefined - ? normalizeIndex(options.index) - : ['index.html'] - - this._maxage = options.maxAge || options.maxage - this._maxage = typeof this._maxage === 'string' - ? ms(this._maxage) - : Number(this._maxage) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), maxMaxAge) - : 0 - - this._root = options.root - ? resolve(options.root) - : null - - if (!this._root && options.from) { - this.from(options.from); - } -} - -/** - * Inherits from `Stream.prototype`. - */ - -SendStream.prototype.__proto__ = Stream.prototype; - -/** - * Enable or disable etag generation. - * - * @param {Boolean} val - * @return {SendStream} - * @api public - */ - -SendStream.prototype.etag = deprecate.function(function etag(val) { - val = Boolean(val); - debug('etag %s', val); - this._etag = val; - return this; -}, 'send.etag: pass etag as option'); - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = deprecate.function(function hidden(val) { - val = Boolean(val); - debug('hidden %s', val); - this._hidden = val; - this._dotfiles = undefined - return this; -}, 'send.hidden: use dotfiles option'); - -/** - * Set index `paths`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean|Array} paths - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = deprecate.function(function index(paths) { - var index = !paths ? [] : normalizeIndex(paths); - debug('index %o', paths); - this._index = index; - return this; -}, 'send.index: pass index as option'); - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = function(path){ - path = String(path); - this._root = resolve(path) - return this; -}; - -SendStream.prototype.from = deprecate.function(SendStream.prototype.root, - 'send.from: pass root as option'); - -SendStream.prototype.root = deprecate.function(SendStream.prototype.root, - 'send.root: pass root as option'); - -/** - * Set max-age to `maxAge`. - * - * @param {Number} maxAge - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = deprecate.function(function maxage(maxAge) { - maxAge = typeof maxAge === 'string' - ? ms(maxAge) - : Number(maxAge); - if (isNaN(maxAge)) maxAge = 0; - if (Infinity == maxAge) maxAge = 60 * 60 * 24 * 365 * 1000; - debug('max-age %d', maxAge); - this._maxage = maxAge; - return this; -}, 'send.maxage: pass maxAge as option'); - -/** - * Emit error with `status`. - * - * @param {Number} status - * @api private - */ - -SendStream.prototype.error = function(status, err){ - var res = this.res; - var msg = http.STATUS_CODES[status]; - - err = err || new Error(msg); - err.status = status; - - // emit if listeners instead of responding - if (listenerCount(this, 'error') !== 0) { - return this.emit('error', err); - } - - // wipe all existing headers - res._headers = undefined; - - res.statusCode = err.status; - res.end(msg); -}; - -/** - * Check if the pathname ends with "/". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasTrailingSlash = function(){ - return '/' == this.path[this.path.length - 1]; -}; - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function(){ - return this.req.headers['if-none-match'] - || this.req.headers['if-modified-since']; -}; - -/** - * Strip content-* header fields. - * - * @api private - */ - -SendStream.prototype.removeContentHeaderFields = function(){ - var res = this.res; - Object.keys(res._headers).forEach(function(field){ - if (0 == field.indexOf('content')) { - res.removeHeader(field); - } - }); -}; - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function(){ - var res = this.res; - debug('not modified'); - this.removeContentHeaderFields(); - res.statusCode = 304; - res.end(); -}; - -/** - * Raise error that headers already sent. - * - * @api private - */ - -SendStream.prototype.headersAlreadySent = function headersAlreadySent(){ - var err = new Error('Can\'t set headers after they are sent.'); - debug('headers already sent'); - this.error(500, err); -}; - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function(){ - var res = this.res; - return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; -}; - -/** - * Handle stat() error. - * - * @param {Error} err - * @api private - */ - -SendStream.prototype.onStatError = function(err){ - var notfound = ['ENOENT', 'ENAMETOOLONG', 'ENOTDIR']; - if (~notfound.indexOf(err.code)) return this.error(404, err); - this.error(500, err); -}; - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function(){ - return fresh(this.req.headers, this.res._headers); -}; - -/** - * Check if the range is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isRangeFresh = function isRangeFresh(){ - var ifRange = this.req.headers['if-range']; - - if (!ifRange) return true; - - return ~ifRange.indexOf('"') - ? ~ifRange.indexOf(this.res._headers['etag']) - : Date.parse(this.res._headers['last-modified']) <= Date.parse(ifRange); -}; - -/** - * Redirect to `path`. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.redirect = function(path){ - if (listenerCount(this, 'directory') !== 0) { - return this.emit('directory'); - } - - if (this.hasTrailingSlash()) return this.error(403); - var res = this.res; - path += '/'; - res.statusCode = 301; - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.setHeader('Location', path); - res.end('Redirecting to ' + escapeHtml(path) + '\n'); -}; - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function(res){ - var self = this - , args = arguments - , root = this._root; - - // references - this.res = res; - - // decode the path - var path = utils.decode(this.path) - if (path === -1) return this.error(400) - - // null byte(s) - if (~path.indexOf('\0')) return this.error(400); - - var parts - if (root !== null) { - // join / normalize from optional root dir - path = normalize(join(root, path)) - root = normalize(root) - - // malicious path - if (path.substr(0, root.length) !== root) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = path.substr(root.length + 1).split(sep) - } else { - // ".." is malicious without "root" - if (upPathRegexp.test(path)) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = normalize(path).split(sep) - - // resolve the path - path = resolve(path) - } - - // dotfile handling - if (containsDotFile(parts)) { - var access = this._dotfiles - - // legacy support - if (access === undefined) { - access = parts[parts.length - 1][0] === '.' - ? (this._hidden ? 'allow' : 'ignore') - : 'allow' - } - - debug('%s dotfile "%s"', access, path) - switch (access) { - case 'allow': - break - case 'deny': - return this.error(403) - case 'ignore': - default: - return this.error(404) - } - } - - // index file support - if (this._index.length && this.hasTrailingSlash()) { - this.sendIndex(path); - return res; - } - - debug('stat "%s"', path); - fs.stat(path, function(err, stat){ - if (err) return self.onStatError(err); - if (stat.isDirectory()) return self.redirect(self.path); - self.emit('file', path, stat); - self.send(path, stat); - }); - - return res; -}; - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function(path, stat){ - var options = this.options; - var len = stat.size; - var res = this.res; - var req = this.req; - var ranges = req.headers.range; - var offset = options.start || 0; - - if (res._header) { - // impossible to send now - return this.headersAlreadySent(); - } - - debug('pipe "%s"', path) - - // set header fields - this.setHeader(path, stat); - - // set content-type - this.type(path); - - // conditional GET support - if (this.isConditionalGET() - && this.isCachable() - && this.isFresh()) { - return this.notModified(); - } - - // adjust len to start/end options - len = Math.max(0, len - offset); - if (options.end !== undefined) { - var bytes = options.end - offset + 1; - if (len > bytes) len = bytes; - } - - // Range support - if (ranges) { - ranges = parseRange(len, ranges); - - // If-Range support - if (!this.isRangeFresh()) { - debug('range stale'); - ranges = -2; - } - - // unsatisfiable - if (-1 == ranges) { - debug('range unsatisfiable'); - res.setHeader('Content-Range', 'bytes */' + stat.size); - return this.error(416); - } - - // valid (syntactically invalid/multiple ranges are treated as a regular response) - if (-2 != ranges && ranges.length === 1) { - debug('range %j', ranges); - - options.start = offset + ranges[0].start; - options.end = offset + ranges[0].end; - - // Content-Range - res.statusCode = 206; - res.setHeader('Content-Range', 'bytes ' - + ranges[0].start - + '-' - + ranges[0].end - + '/' - + len); - len = options.end - options.start + 1; - } - } - - // content-length - res.setHeader('Content-Length', len); - - // HEAD support - if ('HEAD' == req.method) return res.end(); - - this.stream(path, options); -}; - -/** - * Transfer index for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendIndex = function sendIndex(path){ - var i = -1; - var self = this; - - function next(err){ - if (++i >= self._index.length) { - if (err) return self.onStatError(err); - return self.error(404); - } - - var p = path + self._index[i]; - - debug('stat "%s"', p); - fs.stat(p, function(err, stat){ - if (err) return next(err); - if (stat.isDirectory()) return next(); - self.emit('file', p, stat); - self.send(p, stat); - }); - } - - if (!this.hasTrailingSlash()) path += '/'; - - next(); -}; - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function(path, options){ - // TODO: this is all lame, refactor meeee - var finished = false; - var self = this; - var res = this.res; - var req = this.req; - - // pipe - var stream = fs.createReadStream(path, options); - this.emit('stream', stream); - stream.pipe(res); - - // response finished, done with the fd - onFinished(res, function onfinished(){ - finished = true; - stream.destroy(); - }); - - // error handling code-smell - stream.on('error', function onerror(err){ - // request already finished - if (finished) return; - - // clean up stream - finished = true; - stream.destroy(); - - // no hope in responding - if (res._header) { - console.error(err.stack); - req.destroy(); - return; - } - - // error - self.onStatError(err); - }); - - // end - stream.on('end', function onend(){ - self.emit('end'); - }); -}; - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function(path){ - var res = this.res; - if (res.getHeader('Content-Type')) return; - var type = mime.lookup(path); - var charset = mime.charsets.lookup(type); - debug('content-type %s', type); - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); -}; - -/** - * Set response header fields, most - * fields may be pre-defined. - * - * @param {String} path - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function setHeader(path, stat){ - var res = this.res; - - this.emit('headers', res, path, stat); - - if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); - if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString()); - if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + Math.floor(this._maxage / 1000)); - if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString()); - - if (this._etag && !res.getHeader('ETag')) { - var etag = utils.etag(path, stat); - debug('etag %s', etag); - res.setHeader('ETag', etag); - } -}; - -/** - * Determine if path parts contain a dotfile. - * - * @api private - */ - -function containsDotFile(parts) { - for (var i = 0; i < parts.length; i++) { - if (parts[i][0] === '.') { - return true - } - } - - return false -} - -/** - * Normalize the index option into an array. - * - * @param {boolean|string|array} val - * @api private - */ - -function normalizeIndex(val){ - return [].concat(val || []) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js deleted file mode 100644 index 3a88bf9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js +++ /dev/null @@ -1,42 +0,0 @@ - -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Return a weak ETag from the given `path` and `stat`. - * - * @param {String} path - * @param {Object} stat - * @return {String} - * @api private - */ - -exports.etag = function etag(path, stat) { - var tag = String(stat.mtime.getTime()) + ':' + String(stat.size) + ':' + path; - var str = crypto - .createHash('md5') - .update(tag, 'utf8') - .digest('base64'); - return 'W/"' + str + '"'; -}; - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -exports.decode = function(path){ - try { - return decodeURIComponent(path); - } catch (err) { - return -1; - } -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md deleted file mode 100644 index 8937250..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md +++ /dev/null @@ -1,50 +0,0 @@ -1.2.2 / 2014-06-10 -========== - - * reduce listeners added to emitters - - avoids "event emitter leak" warnings when used multiple times on same request - -1.2.1 / 2014-06-08 -================== - - * fix returned value when already finished - -1.2.0 / 2014-06-05 -================== - - * call callback when called on already-finished socket - -1.1.4 / 2014-05-27 -================== - - * support node.js 0.8 - -1.1.3 / 2014-04-30 -================== - - * make sure errors passed as instanceof `Error` - -1.1.2 / 2014-04-18 -================== - - * default the `socket` to passed-in object - -1.1.1 / 2014-01-16 -================== - - * rename module to `finished` - -1.1.0 / 2013-12-25 -================== - - * call callback when called on already-errored socket - -1.0.1 / 2013-12-20 -================== - - * actually pass the error to the callback - -1.0.0 / 2013-12-20 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md deleted file mode 100644 index 79facd5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# finished - -[![NPM Version](https://badge.fury.io/js/finished.svg)](http://badge.fury.io/js/finished) -[![Build Status](https://travis-ci.org/expressjs/finished.svg?branch=master)](https://travis-ci.org/expressjs/finished) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/finished.svg?branch=master)](https://coveralls.io/r/expressjs/finished) - -Execute a callback when a request closes, finishes, or errors. - -#### Install - -```sh -$ npm install finished -``` - -#### Uses - -This is useful for cleaning up streams. For example, you want to destroy any file streams you create on socket errors otherwise you will leak file descriptors. - -This is required to fix what many perceive as issues with node's streams. Relevant: - -- [node#6041](https://github.com/joyent/node/issues/6041) -- [koa#184](https://github.com/koajs/koa/issues/184) -- [koa#165](https://github.com/koajs/koa/issues/165) - -## API - -### finished(response, callback) - -```js -var onFinished = require('finished') - -onFinished(res, function (err) { - // do something maybe -}) -``` - -### Examples - -The following code ensures that file descriptors are always closed once the response finishes. - -#### Node / Connect / Express - -```js -var onFinished = require('finished') - -function (req, res, next) { - var stream = fs.createReadStream('thingie.json') - stream.pipe(res) - onFinished(res, function (err) { - stream.destroy() - }) -} -``` - -#### Koa - -```js -function* () { - var stream = this.body = fs.createReadStream('thingie.json') - onFinished(this, function (err) { - stream.destroy() - }) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js deleted file mode 100644 index 90709d4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js +++ /dev/null @@ -1,62 +0,0 @@ -/*! - * finished - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** -* Module dependencies. -*/ - -var first = require('ee-first') - -/** -* Variables. -*/ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Invoke callback when the response has finished, useful for - * cleaning up resources afterwards. - * - * @param {object} thingie - * @param {function} callback - * @return {object} - * @api public - */ - -module.exports = function finished(thingie, callback) { - var socket = thingie.socket || thingie - var res = thingie.res || thingie - - if (res.finished || !socket.writable) { - defer(callback) - return thingie - } - - var listener = res.__onFinished - - // create a private single listener with queue - if (!listener || !listener.queue) { - listener = res.__onFinished = function onFinished(err) { - if (res.__onFinished === listener) res.__onFinished = null - var queue = listener.queue || [] - while (queue.length) queue.shift()(err) - } - listener.queue = [] - - // finished on first event - first([ - [socket, 'error', 'close'], - [res, 'finish'], - ], listener) - } - - listener.queue.push(callback) - - return thingie -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore deleted file mode 100644 index 72921ab..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.DS_Store* -node_modules diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md deleted file mode 100644 index 7eae173..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -# EE First - -Get the first event in a set of event emitters and event pairs, -then clean up after itself. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js deleted file mode 100644 index d0c48c9..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js +++ /dev/null @@ -1,60 +0,0 @@ - -module.exports = function first(stuff, done) { - if (!Array.isArray(stuff)) - throw new TypeError('arg must be an array of [ee, events...] arrays') - - var cleanups = [] - - for (var i = 0; i < stuff.length; i++) { - var arr = stuff[i] - - if (!Array.isArray(arr) || arr.length < 2) - throw new TypeError('each array member must be [ee, events...]') - - var ee = arr[0] - - for (var j = 1; j < arr.length; j++) { - var event = arr[j] - var fn = listener(event, cleanup) - - // listen to the event - ee.on(event, fn) - // push this listener to the list of cleanups - cleanups.push({ - ee: ee, - event: event, - fn: fn, - }) - } - } - - return function (fn) { - done = fn - } - - function cleanup() { - var x - for (var i = 0; i < cleanups.length; i++) { - x = cleanups[i] - x.ee.removeListener(x.event, x.fn) - } - done.apply(null, arguments) - } -} - -function listener(event, done) { - return function onevent(arg1) { - var args = new Array(arguments.length) - var ee = this - var err = event === 'error' - ? arg1 - : null - - // copy args to prevent arguments escaping scope - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - done(err, ee, event, args) - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json deleted file mode 100644 index 1f82e3e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "ee-first", - "description": "return the first event in a set of ee/event pairs", - "version": "1.0.3", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/jonathanong/ee-first" - }, - "devDependencies": { - "mocha": "1" - }, - "scripts": { - "test": "mocha --reporter spec" - }, - "bugs": { - "url": "https://github.com/jonathanong/ee-first/issues" - }, - "homepage": "https://github.com/jonathanong/ee-first", - "_id": "ee-first@1.0.3", - "_shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "_from": "ee-first@1.0.3", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "tarball": "http://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js deleted file mode 100644 index adff984..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js +++ /dev/null @@ -1,60 +0,0 @@ - -var EventEmitter = require('events').EventEmitter -var assert = require('assert') - -var first = require('./') - -describe('first', function () { - var ee1 = new EventEmitter() - var ee2 = new EventEmitter() - var ee3 = new EventEmitter() - - it('should emit the first event', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - assert.equal(ee, ee2) - assert.equal(event, 'b') - assert.deepEqual(args, [1, 2, 3]) - done() - }) - - ee2.emit('b', 1, 2, 3) - }) - - it('it should return an error if event === error', function (done) { - first([ - [ee1, 'error', 'b', 'c'], - [ee2, 'error', 'b', 'c'], - [ee3, 'error', 'b', 'c'], - ], function (err, ee, event, args) { - assert.equal(err.message, 'boom') - assert.equal(ee, ee3) - assert.equal(event, 'error') - done() - }) - - ee3.emit('error', new Error('boom')) - }) - - it('should cleanup after itself', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - ;[ee1, ee2, ee3].forEach(function (ee) { - ['a', 'b', 'c'].forEach(function (event) { - assert(!ee.listeners(event).length) - }) - }) - done() - }) - - ee1.emit('a') - }) -}) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json deleted file mode 100644 index b645a74..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "finished", - "description": "Execute a callback when a request closes, finishes, or errors", - "version": "1.2.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/finished" - }, - "dependencies": { - "ee-first": "1.0.3" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.1", - "should": "~4.0.1" - }, - "engine": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/finished/issues" - }, - "homepage": "https://github.com/expressjs/finished", - "_id": "finished@1.2.2", - "_shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "_from": "finished@1.2.2", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "tarball": "http://registry.npmjs.org/finished/-/finished-1.2.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md deleted file mode 100644 index 6ca19bd..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.default_type -Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js deleted file mode 100644 index 48be0c5..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js +++ /dev/null @@ -1,114 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - if (process.env.DEBUG_MIME && this.types[exts]) { - console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + - this.types[exts] + ' to ' + type); - } - - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - - this._loading = file; - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); - - this._loading = null; -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); - return this.extensions[type]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -}; - -module.exports = mime; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json deleted file mode 100644 index 917e6af..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.2.11", - "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g.\n\n var mime = require('mime');\n\n mime.lookup('/path/to/file.txt'); // => 'text/plain'\n mime.lookup('file.txt'); // => 'text/plain'\n mime.lookup('.TXT'); // => 'text/plain'\n mime.lookup('htm'); // => 'text/html'\n\n### mime.default_type\nSets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)\n\n### mime.extension(type)\nGet the default extension for `type`\n\n mime.extension('text/html'); // => 'html'\n mime.extension('application/octet-stream'); // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n mime.charsets.lookup('text/plain'); // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n mime.define({\n 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n 'application/x-my-type': ['x-mt', 'x-mtt'],\n // etc ...\n });\n\n mime.lookup('x-sft'); // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n mime.load('./my_project.types');\n\nThe .types file format is simple - See the `types` dir for examples.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/broofa/node-mime/issues" - }, - "_id": "mime@1.2.11", - "dist": { - "shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "tarball": "http://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - }, - "_from": "mime@1.2.11", - "_npmVersion": "1.3.6", - "_npmUser": { - "name": "broofa", - "email": "robert@broofa.com" - }, - "maintainers": [ - { - "name": "broofa", - "email": "robert@broofa.com" - }, - { - "name": "bentomas", - "email": "benjamin@benjaminthomas.org" - } - ], - "directories": {}, - "_shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "_resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "homepage": "https://github.com/broofa/node-mime" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js deleted file mode 100644 index 2cda1c7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); -var path = require('path'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); // normal file -eq('text/plain', mime.lookup('TEXT.TXT')); // uppercase -eq('text/plain', mime.lookup('dir/text.txt')); // dir + file -eq('text/plain', mime.lookup('.text.txt')); // hidden file -eq('text/plain', mime.lookup('.txt')); // nameless -eq('text/plain', mime.lookup('txt')); // extension-only -eq('text/plain', mime.lookup('/txt')); // extension-less () -eq('text/plain', mime.lookup('\\txt')); // Windows, extension-less -eq('application/octet-stream', mime.lookup('text.nope')); // unrecognized -eq('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq('bin', mime.extension('application/octet-stream ')); -eq('html', mime.extension(' text/html; charset=UTF-8')); -eq('html', mime.extension('text/html; charset=UTF-8 ')); -eq('html', mime.extension('text/html; charset=UTF-8')); -eq('html', mime.extension('text/html ; charset=UTF-8')); -eq('html', mime.extension('text/html;charset=UTF-8')); -eq('html', mime.extension('text/Html;charset=UTF-8')); -eq(undefined, mime.extension('unrecognized')); - -// -// Test node.types lookups -// - -eq('application/font-woff', mime.lookup('file.woff')); -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); -eq('font/opentype', mime.lookup('file.otf')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -// -// Test for overlaps between mime.types and node.types -// - -var apacheTypes = new mime.Mime(), nodeTypes = new mime.Mime(); -apacheTypes.load(path.join(__dirname, 'types/mime.types')); -nodeTypes.load(path.join(__dirname, 'types/node.types')); - -var keys = [].concat(Object.keys(apacheTypes.types)) - .concat(Object.keys(nodeTypes.types)); -keys.sort(); -for (var i = 1; i < keys.length; i++) { - if (keys[i] == keys[i-1]) { - console.warn('Warning: ' + - 'node.types defines ' + keys[i] + '->' + nodeTypes.types[keys[i]] + - ', mime.types defines ' + keys[i] + '->' + apacheTypes.types[keys[i]]); - } -} - -console.log('\nOK'); diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types deleted file mode 100644 index da8cd69..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types deleted file mode 100644 index 55b2cf7..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types +++ /dev/null @@ -1,77 +0,0 @@ -# What: WebVTT -# Why: To allow formats intended for marking up external text track resources. -# http://dev.w3.org/html5/webvtt/ -# Added by: niftylettuce -text/vtt vtt - -# 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: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifes ('.manifest' extension) -# 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 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: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp - -# What: Lua file types -# Why: Googling around shows de-facto consensus on these -# Added by: creationix (Issue #45) -text/x-lua lua -application/x-lua-bytecode luac - -# What: Markdown files, as per http://daringfireball.net/projects/markdown/syntax -# Why: http://stackoverflow.com/questions/10701983/what-is-the-mime-type-for-markdown -# Added by: avoidwork -text/x-markdown markdown md mkd - -# What: ini files -# Why: because they're just text files -# Added by: Matthew Kastor -text/plain ini - -# What: DASH Adaptive Streaming manifest -# Why: https://developer.mozilla.org/en-US/docs/DASH_Adaptive_Streaming_for_HTML_5_Video -# Added by: eelcocramer -application/dash+xml mdp - -# What: OpenType font files - http://www.microsoft.com/typography/otspec/ -# Why: Browsers usually ignore the font MIME types and sniff the content, -# but Chrome, shows a warning if OpenType fonts aren't served with -# the `font/opentype` MIME type: http://i.imgur.com/8c5RN8M.png. -# Added by: alrra -font/opentype otf diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md deleted file mode 100644 index d4ab12a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours', { long: true })) // "10 hours" -``` - -- Node/Browser compatible. Published as `ms` in NPM. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js deleted file mode 100644 index c5847f8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json deleted file mode 100644 index 654cde8..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "ms", - "version": "0.6.2", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "readme": "# ms.js: miliseconds conversion utility\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('100') // 100\n```\n\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(ms('10 hours', { long: true })) // \"10 hours\"\n```\n\n- Node/Browser compatible. Published as `ms` in NPM.\n- If a number is supplied to `ms`, a string with a unit is returned.\n- If a string that contains the number is supplied, it returns it as\na number (e.g: it returns `100` for `'100'`).\n- If you pass a string with a number and a valid unit, the number of\nequivalent ms is returned.\n\n## License\n\nMIT", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "_id": "ms@0.6.2", - "dist": { - "shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - }, - "_from": "ms@0.6.2", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "directories": {}, - "_shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "homepage": "https://github.com/guille/ms.js", - "scripts": {} -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/package.json deleted file mode 100644 index bb5e8b4..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "send", - "description": "Better streaming static file server with Range and conditional-GET support", - "version": "0.7.3", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/send" - }, - "keywords": [ - "static", - "file", - "server" - ], - "dependencies": { - "debug": "1.0.4", - "depd": "0.4.4", - "escape-html": "1.0.1", - "finished": "1.2.2", - "fresh": "0.2.2", - "mime": "1.2.11", - "ms": "0.6.2", - "range-parser": "~1.0.0" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.0", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --check-leaks --reporter spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec" - }, - "bugs": { - "url": "https://github.com/visionmedia/send/issues" - }, - "homepage": "https://github.com/visionmedia/send", - "_id": "send@0.7.3", - "dist": { - "shasum": "2caa2e2627d2f9c2d109d3f5c2942935480aa993", - "tarball": "http://registry.npmjs.org/send/-/send-0.7.3.tgz" - }, - "_from": "send@0.7.3", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "2caa2e2627d2f9c2d109d3f5c2942935480aa993", - "_resolved": "https://registry.npmjs.org/send/-/send-0.7.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/package.json deleted file mode 100644 index 7345a3c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "serve-static", - "description": "Serve static files", - "version": "1.4.3", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/serve-static" - }, - "dependencies": { - "escape-html": "1.0.1", - "parseurl": "~1.2.0", - "send": "0.7.3" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.0", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks --require should test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks --require should test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks --require should test/" - }, - "bugs": { - "url": "https://github.com/expressjs/serve-static/issues" - }, - "homepage": "https://github.com/expressjs/serve-static", - "_id": "serve-static@1.4.3", - "dist": { - "shasum": "9f08c7dea1b15e2eb1382ae0e12b8a0de295de52", - "tarball": "http://registry.npmjs.org/serve-static/-/serve-static-1.4.3.tgz" - }, - "_from": "serve-static@>=1.4.2-0 <1.5.0-0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "9f08c7dea1b15e2eb1382ae0e12b8a0de295de52", - "_resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.4.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/HISTORY.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/HISTORY.md deleted file mode 100644 index b4c94be..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/HISTORY.md +++ /dev/null @@ -1,54 +0,0 @@ - -1.3.2 / 2014-06-24 -================== - - * use `~` range on mime-types - -1.3.1 / 2014-06-19 -================== - - * fix global variable leak - -1.3.0 / 2014-06-19 -================== - - * improve type parsing - - - invalid media type never matches - - media type not case-sensitive - - extra LWS does not affect results - -1.2.2 / 2014-06-19 -================== - - * fix behavior on unknown type argument - -1.2.1 / 2014-06-03 -================== - - * switch dependency from `mime` to `mime-types@1.0.0` - -1.2.0 / 2014-05-11 -================== - - * support suffix matching: - - - `+json` matches `application/vnd+json` - - `*/vnd+json` matches `application/vnd+json` - - `application/*+json` matches `application/vnd+json` - -1.1.0 / 2014-04-12 -================== - - * add non-array values support - * expose internal utilities: - - - `.is()` - - `.hasBody()` - - `.normalize()` - - `.match()` - -1.0.1 / 2014-03-30 -================== - - * add `multipart` as a shorthand diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/README.md deleted file mode 100644 index 5d8b166..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# type-is - -[![NPM version](https://badge.fury.io/js/type-is.svg)](https://badge.fury.io/js/type-is) -[![Build Status](https://travis-ci.org/expressjs/type-is.svg?branch=master)](https://travis-ci.org/expressjs/type-is) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/type-is.svg?branch=master)](https://coveralls.io/r/expressjs/type-is) - -Infer the content-type of a request. - -### Install - -```sh -$ npm install type-is -``` - -## API - -```js -var http = require('http') -var is = require('type-is') - -http.createServer(function (req, res) { - var istext = is(req, ['text/*']) - res.end('you ' + (istext ? 'sent' : 'did not send') + ' me text') -}) -``` - -### type = is(request, types) - -`request` is the node HTTP request. `types` is an array of types. - -```js -// req.headers.content-type = 'application/json' - -is(req, ['json']) // 'json' -is(req, ['html', 'json']) // 'json' -is(req, ['application/*']) // 'application/json' -is(req, ['application/json']) // 'application/json' - -is(req, ['html']) // false -``` - -#### Each type can be: - -- An extension name such as `json`. This name will be returned if matched. -- A mime type such as `application/json`. -- A mime type with a wildcard such as `*/json` or `application/*`. The full mime type will be returned if matched -- A suffix such as `+json`. This can be combined with a wildcard such as `*/vnd+json` or `application/*+json`. The full mime type will be returned if matched. - -`false` will be returned if no type matches. - -## Examples - -#### Example body parser - -```js -var is = require('type-is'); -var parse = require('body'); -var busboy = require('busboy'); - -function bodyParser(req, res, next) { - if (!is.hasBody(req)) return next(); - - switch (is(req, ['urlencoded', 'json', 'multipart'])) { - case 'urlencoded': - // parse urlencoded body - break - case 'json': - // parse json body - break - case 'multipart': - // parse multipart body - break - default: - // 415 error code - } -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/index.js deleted file mode 100644 index 315907a..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/index.js +++ /dev/null @@ -1,230 +0,0 @@ - -var typer = require('media-typer') -var mime = require('mime-types') - -module.exports = typeofrequest; -typeofrequest.is = typeis; -typeofrequest.hasBody = hasbody; -typeofrequest.normalize = normalize; -typeofrequest.match = mimeMatch; - -/** - * Compare a `value` content-type with `types`. - * Each `type` can be an extension like `html`, - * a special shortcut like `multipart` or `urlencoded`, - * or a mime type. - * - * If no types match, `false` is returned. - * Otherwise, the first `type` that matches is returned. - * - * @param {String} value - * @param {Array} types - * @return String - */ - -function typeis(value, types_) { - var i - var types = types_ - - // remove parameters and normalize - value = typenormalize(value) - - // no type or invalid - if (!value) { - return false - } - - // support flattened arguments - if (types && !Array.isArray(types)) { - types = new Array(arguments.length - 1) - for (i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // no types, return the content type - if (!types || !types.length) return value; - - var type - for (i = 0; i < types.length; i++) { - if (mimeMatch(normalize(type = types[i]), value)) { - return type[0] === '+' || ~type.indexOf('*') - ? value - : type - } - } - - // no matches - return false; -} - -/** - * Check if a request has a request body. - * A request with a body __must__ either have `transfer-encoding` - * or `content-length` headers set. - * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 - * - * @param {Object} request - * @return {Boolean} - * @api public - */ - -function hasbody(req) { - var headers = req.headers; - if ('transfer-encoding' in headers) return true; - var length = headers['content-length']; - if (!length) return false; - // no idea when this would happen, but `isNaN(null) === false` - if (isNaN(length)) return false; - return !!parseInt(length, 10); -} - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains any of the give mime `type`s. - * If there is no request body, `null` is returned. - * If there is no content type, `false` is returned. - * Otherwise, it returns the first `type` that matches. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * this.is('html'); // => 'html' - * this.is('text/html'); // => 'text/html' - * this.is('text/*', 'application/json'); // => 'text/html' - * - * // When Content-Type is application/json - * this.is('json', 'urlencoded'); // => 'json' - * this.is('application/json'); // => 'application/json' - * this.is('html', 'application/*'); // => 'application/json' - * - * this.is('html'); // => false - * - * @param {String|Array} types... - * @return {String|false|null} - * @api public - */ - -function typeofrequest(req, types_) { - var types = types_ - - // no body - if (!hasbody(req)) { - return null - } - - // support flattened arguments - if (arguments.length > 2) { - types = new Array(arguments.length - 1) - for (var i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // request content type - var value = req.headers['content-type'] - - return typeis(value, types); -} - -/** - * Normalize a mime type. - * If it's a shorthand, expand it to a valid mime type. - * - * In general, you probably want: - * - * var type = is(req, ['urlencoded', 'json', 'multipart']); - * - * Then use the appropriate body parsers. - * These three are the most common request body types - * and are thus ensured to work. - * - * @param {String} type - * @api private - */ - -function normalize(type) { - switch (type) { - case 'urlencoded': return 'application/x-www-form-urlencoded'; - case 'multipart': - type = 'multipart/*'; - break; - } - - return type[0] === '+' || ~type.indexOf('/') - ? type - : mime.lookup(type) -} - -/** - * Check if `exected` mime type - * matches `actual` mime type with - * wildcard and +suffix support. - * - * @param {String} expected - * @param {String} actual - * @return {Boolean} - * @api private - */ - -function mimeMatch(expected, actual) { - // invalid type - if (expected === false) { - return false - } - - // exact match - if (expected === actual) { - return true - } - - actual = actual.split('/'); - - if (expected[0] === '+') { - // support +suffix - return Boolean(actual[1]) - && expected.length <= actual[1].length - && expected === actual[1].substr(0 - expected.length) - } - - if (!~expected.indexOf('*')) return false; - - expected = expected.split('/'); - - if (expected[0] === '*') { - // support */yyy - return expected[1] === actual[1] - } - - if (expected[1] === '*') { - // support xxx/* - return expected[0] === actual[0] - } - - if (expected[1][0] === '*' && expected[1][1] === '+') { - // support xxx/*+zzz - return expected[0] === actual[0] - && expected[1].length <= actual[1].length + 1 - && expected[1].substr(1) === actual[1].substr(1 - expected[1].length) - } - - return false -} - -/** - * Normalize a type and remove parameters. - * - * @param {string} value - * @return {string} - * @api private - */ - -function typenormalize(value) { - try { - var type = typer.parse(value) - delete type.parameters - return typer.format(type) - } catch (err) { - return null - } -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore deleted file mode 100644 index 919d51b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -test -build.js - -# OS generated files # -###################### -.DS_Store* -# Icon? -ehthumbs.db -Thumbs.db - -# Node.js # -########### -node_modules -npm-debug.log diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml deleted file mode 100644 index 73c85c6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" - - "0.11" -matrix: - allow_failures: - - node_js: "0.11" - fast_finish: true -before_install: - # remove build script deps before install - - node -pe 'f="./package.json";p=require(f);d=p.devDependencies;for(k in d){if("co"===k.substr(0,2))delete d[k]}require("fs").writeFileSync(f,JSON.stringify(p,null,2))' diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile deleted file mode 100644 index ceaf011..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -build: - node --harmony-generators build.js - -test: - node test/mime.js - mocha --require should --reporter spec test/test.js - -.PHONY: build test diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md deleted file mode 100644 index 8e21ee1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# mime-types -[![NPM version](https://badge.fury.io/js/mime-types.svg)](https://badge.fury.io/js/mime-types) [![Build Status](https://travis-ci.org/expressjs/mime-types.svg?branch=master)](https://travis-ci.org/expressjs/mime-types) - -The ultimate javascript content-type utility. - -### Install - -```sh -$ npm install mime-types -``` - -#### Similar to [node-mime](https://github.com/broofa/node-mime), except: - -- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. -- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. -- Additional mime types are added such as jade and stylus. Feel free to add more! -- Browser support via Browserify and Component by converting lists to JSON files. - -Otherwise, the API is compatible. - -### Adding Types - -If you'd like to add additional types, -simply create a PR adding the type to `custom.json` and -a reference link to the [sources](SOURCES.md). - -Do __NOT__ edit `mime.json` or `node.json`. -Those are pulled using `build.js`. -You should only touch `custom.json`. - -## API - -```js -var mime = require('mime-types') -``` - -All functions return `false` if input is invalid or not found. - -### mime.lookup(path) - -Lookup the content-type associated with a file. - -```js -mime.lookup('json') // 'application/json' -mime.lookup('.md') // 'text/x-markdown' -mime.lookup('file.html') // 'text/html' -mime.lookup('folder/file.js') // 'application/javascript' - -mime.lookup('cats') // false -``` - -### mime.contentType(type) - -Create a full content-type header given a content-type or extension. - -```js -mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' -mime.contentType('file.json') // 'application/json; charset=utf-8' -``` - -### mime.extension(type) - -Get the default extension for a content-type. - -```js -mime.extension('application/octet-stream') // 'bin' -``` - -### mime.charset(type) - -Lookup the implied default charset of a content-type. - -```js -mime.charset('text/x-markdown') // 'UTF-8' -``` - -### mime.types[extension] = type - -A map of content-types by extension. - -### mime.extensions[type] = [extensions] - -A map of extensions by content-type. - -### mime.define(types) - -Globally add definitions. -`types` must be an object of the form: - -```js -{ - "": [extensions...], - "": [extensions...] -} -``` - -See the `.json` files in `lib/` for examples. - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md deleted file mode 100644 index 1d65012..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md +++ /dev/null @@ -1,17 +0,0 @@ - -### Sources for custom types - -This is a list of sources for any custom mime types. -When adding custom mime types, please link to where you found the mime type, -even if it's from an unofficial source. - -- `text/coffeescript` - http://coffeescript.org/#scripts -- `text/x-handlebars-template` - https://handlebarsjs.com/#getting-started -- `text/x-sass` & `text/x-scss` - https://github.com/janlelis/rubybuntu-mime/blob/master/sass.xml -- `text.jsx` - http://facebook.github.io/react/docs/getting-started.html [[2]](https://github.com/facebook/react/blob/f230e0a03154e6f8a616e0da1fb3d97ffa1a6472/vendor/browser-transforms.js#L210) - -[Sources for node.json types](https://github.com/broofa/node-mime/blob/master/types/node.types) - -### Notes on weird types - -- `font/opentype` - This type is technically invalid according to the spec. No valid types begin with `font/`. No-one uses the official type of `application/vnd.ms-opentype` as the community standardized `application/x-font-otf`. However, chrome logs nonsense warnings unless opentype fonts are served with `font/opentype`. [[1]](http://stackoverflow.com/questions/2871655/proper-mime-type-for-fonts) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json deleted file mode 100644 index fa67a6d..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "0.1.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com", - "twitter": "https://twitter.com/jongleberry" - }, - "repository": "expressjs/mime-types", - "license": "MIT", - "main": "lib/index.js", - "scripts": ["lib/index.js"], - "json": ["mime.json", "node.json", "custom.json"] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json deleted file mode 100644 index 6137da3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "text/jade": [ - "jade" - ], - "text/stylus": [ - "stylus", - "styl" - ], - "text/less": [ - "less" - ], - "text/x-sass": [ - "sass" - ], - "text/x-scss": [ - "scss" - ], - "text/coffeescript": [ - "coffee" - ], - "text/x-handlebars-template": [ - "hbs" - ], - "text/jsx": [ - "jsx" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js deleted file mode 100644 index 27559ea..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js +++ /dev/null @@ -1,74 +0,0 @@ - -// types[extension] = type -exports.types = Object.create(null) -// extensions[type] = [extensions] -exports.extensions = Object.create(null) -// define more mime types -exports.define = define - -// store the json files -exports.json = { - mime: require('./mime.json'), - node: require('./node.json'), - custom: require('./custom.json'), -} - -exports.lookup = function (string) { - if (!string || typeof string !== "string") return false - string = string.replace(/.*[\.\/\\]/, '').toLowerCase() - if (!string) return false - return exports.types[string] || false -} - -exports.extension = function (type) { - if (!type || typeof type !== "string") return false - type = type.match(/^\s*([^;\s]*)(?:;|\s|$)/) - if (!type) return false - var exts = exports.extensions[type[1].toLowerCase()] - if (!exts || !exts.length) return false - return exts[0] -} - -// type has to be an exact mime type -exports.charset = function (type) { - // special cases - switch (type) { - case 'application/json': return 'UTF-8' - } - - // default text/* to utf-8 - if (/^text\//.test(type)) return 'UTF-8' - - return false -} - -// backwards compatibility -exports.charsets = { - lookup: exports.charset -} - -exports.contentType = function (type) { - if (!type || typeof type !== "string") return false - if (!~type.indexOf('/')) type = exports.lookup(type) - if (!type) return false - if (!~type.indexOf('charset')) { - var charset = exports.charset(type) - if (charset) type += '; charset=' + charset.toLowerCase() - } - return type -} - -define(exports.json.mime) -define(exports.json.node) -define(exports.json.custom) - -function define(json) { - Object.keys(json).forEach(function (type) { - var exts = json[type] || [] - exports.extensions[type] = exports.extensions[type] || [] - exts.forEach(function (ext) { - if (!~exports.extensions[type].indexOf(ext)) exports.extensions[type].push(ext) - exports.types[ext] = type - }) - }) -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json deleted file mode 100644 index f445a86..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json +++ /dev/null @@ -1,3317 +0,0 @@ -{ - "application/1d-interleaved-parityfec": [], - "application/3gpp-ims+xml": [], - "application/activemessage": [], - "application/andrew-inset": [ - "ez" - ], - "application/applefile": [], - "application/applixware": [ - "aw" - ], - "application/atom+xml": [ - "atom" - ], - "application/atomcat+xml": [ - "atomcat" - ], - "application/atomicmail": [], - "application/atomsvc+xml": [ - "atomsvc" - ], - "application/auth-policy+xml": [], - "application/batch-smtp": [], - "application/beep+xml": [], - "application/calendar+xml": [], - "application/cals-1840": [], - "application/ccmp+xml": [], - "application/ccxml+xml": [ - "ccxml" - ], - "application/cdmi-capability": [ - "cdmia" - ], - "application/cdmi-container": [ - "cdmic" - ], - "application/cdmi-domain": [ - "cdmid" - ], - "application/cdmi-object": [ - "cdmio" - ], - "application/cdmi-queue": [ - "cdmiq" - ], - "application/cea-2018+xml": [], - "application/cellml+xml": [], - "application/cfw": [], - "application/cnrp+xml": [], - "application/commonground": [], - "application/conference-info+xml": [], - "application/cpl+xml": [], - "application/csta+xml": [], - "application/cstadata+xml": [], - "application/cu-seeme": [ - "cu" - ], - "application/cybercash": [], - "application/davmount+xml": [ - "davmount" - ], - "application/dca-rft": [], - "application/dec-dx": [], - "application/dialog-info+xml": [], - "application/dicom": [], - "application/dns": [], - "application/docbook+xml": [ - "dbk" - ], - "application/dskpp+xml": [], - "application/dssc+der": [ - "dssc" - ], - "application/dssc+xml": [ - "xdssc" - ], - "application/dvcs": [], - "application/ecmascript": [ - "ecma" - ], - "application/edi-consent": [], - "application/edi-x12": [], - "application/edifact": [], - "application/emma+xml": [ - "emma" - ], - "application/epp+xml": [], - "application/epub+zip": [ - "epub" - ], - "application/eshop": [], - "application/example": [], - "application/exi": [ - "exi" - ], - "application/fastinfoset": [], - "application/fastsoap": [], - "application/fits": [], - "application/font-tdpfr": [ - "pfr" - ], - "application/framework-attributes+xml": [], - "application/gml+xml": [ - "gml" - ], - "application/gpx+xml": [ - "gpx" - ], - "application/gxf": [ - "gxf" - ], - "application/h224": [], - "application/held+xml": [], - "application/http": [], - "application/hyperstudio": [ - "stk" - ], - "application/ibe-key-request+xml": [], - "application/ibe-pkg-reply+xml": [], - "application/ibe-pp-data": [], - "application/iges": [], - "application/im-iscomposing+xml": [], - "application/index": [], - "application/index.cmd": [], - "application/index.obj": [], - "application/index.response": [], - "application/index.vnd": [], - "application/inkml+xml": [ - "ink", - "inkml" - ], - "application/iotp": [], - "application/ipfix": [ - "ipfix" - ], - "application/ipp": [], - "application/isup": [], - "application/java-archive": [ - "jar" - ], - "application/java-serialized-object": [ - "ser" - ], - "application/java-vm": [ - "class" - ], - "application/javascript": [ - "js" - ], - "application/json": [ - "json" - ], - "application/jsonml+json": [ - "jsonml" - ], - "application/kpml-request+xml": [], - "application/kpml-response+xml": [], - "application/lost+xml": [ - "lostxml" - ], - "application/mac-binhex40": [ - "hqx" - ], - "application/mac-compactpro": [ - "cpt" - ], - "application/macwriteii": [], - "application/mads+xml": [ - "mads" - ], - "application/marc": [ - "mrc" - ], - "application/marcxml+xml": [ - "mrcx" - ], - "application/mathematica": [ - "ma", - "nb", - "mb" - ], - "application/mathml-content+xml": [], - "application/mathml-presentation+xml": [], - "application/mathml+xml": [ - "mathml" - ], - "application/mbms-associated-procedure-description+xml": [], - "application/mbms-deregister+xml": [], - "application/mbms-envelope+xml": [], - "application/mbms-msk+xml": [], - "application/mbms-msk-response+xml": [], - "application/mbms-protection-description+xml": [], - "application/mbms-reception-report+xml": [], - "application/mbms-register+xml": [], - "application/mbms-register-response+xml": [], - "application/mbms-user-service-description+xml": [], - "application/mbox": [ - "mbox" - ], - "application/media_control+xml": [], - "application/mediaservercontrol+xml": [ - "mscml" - ], - "application/metalink+xml": [ - "metalink" - ], - "application/metalink4+xml": [ - "meta4" - ], - "application/mets+xml": [ - "mets" - ], - "application/mikey": [], - "application/mods+xml": [ - "mods" - ], - "application/moss-keys": [], - "application/moss-signature": [], - "application/mosskey-data": [], - "application/mosskey-request": [], - "application/mp21": [ - "m21", - "mp21" - ], - "application/mp4": [ - "mp4s" - ], - "application/mpeg4-generic": [], - "application/mpeg4-iod": [], - "application/mpeg4-iod-xmt": [], - "application/msc-ivr+xml": [], - "application/msc-mixer+xml": [], - "application/msword": [ - "doc", - "dot" - ], - "application/mxf": [ - "mxf" - ], - "application/nasdata": [], - "application/news-checkgroups": [], - "application/news-groupinfo": [], - "application/news-transmission": [], - "application/nss": [], - "application/ocsp-request": [], - "application/ocsp-response": [], - "application/octet-stream": [ - "bin", - "dms", - "lrf", - "mar", - "so", - "dist", - "distz", - "pkg", - "bpk", - "dump", - "elc", - "deploy" - ], - "application/oda": [ - "oda" - ], - "application/oebps-package+xml": [ - "opf" - ], - "application/ogg": [ - "ogx" - ], - "application/omdoc+xml": [ - "omdoc" - ], - "application/onenote": [ - "onetoc", - "onetoc2", - "onetmp", - "onepkg" - ], - "application/oxps": [ - "oxps" - ], - "application/parityfec": [], - "application/patch-ops-error+xml": [ - "xer" - ], - "application/pdf": [ - "pdf" - ], - "application/pgp-encrypted": [ - "pgp" - ], - "application/pgp-keys": [], - "application/pgp-signature": [ - "asc", - "sig" - ], - "application/pics-rules": [ - "prf" - ], - "application/pidf+xml": [], - "application/pidf-diff+xml": [], - "application/pkcs10": [ - "p10" - ], - "application/pkcs7-mime": [ - "p7m", - "p7c" - ], - "application/pkcs7-signature": [ - "p7s" - ], - "application/pkcs8": [ - "p8" - ], - "application/pkix-attr-cert": [ - "ac" - ], - "application/pkix-cert": [ - "cer" - ], - "application/pkix-crl": [ - "crl" - ], - "application/pkix-pkipath": [ - "pkipath" - ], - "application/pkixcmp": [ - "pki" - ], - "application/pls+xml": [ - "pls" - ], - "application/poc-settings+xml": [], - "application/postscript": [ - "ai", - "eps", - "ps" - ], - "application/prs.alvestrand.titrax-sheet": [], - "application/prs.cww": [ - "cww" - ], - "application/prs.nprend": [], - "application/prs.plucker": [], - "application/prs.rdf-xml-crypt": [], - "application/prs.xsf+xml": [], - "application/pskc+xml": [ - "pskcxml" - ], - "application/qsig": [], - "application/rdf+xml": [ - "rdf" - ], - "application/reginfo+xml": [ - "rif" - ], - "application/relax-ng-compact-syntax": [ - "rnc" - ], - "application/remote-printing": [], - "application/resource-lists+xml": [ - "rl" - ], - "application/resource-lists-diff+xml": [ - "rld" - ], - "application/riscos": [], - "application/rlmi+xml": [], - "application/rls-services+xml": [ - "rs" - ], - "application/rpki-ghostbusters": [ - "gbr" - ], - "application/rpki-manifest": [ - "mft" - ], - "application/rpki-roa": [ - "roa" - ], - "application/rpki-updown": [], - "application/rsd+xml": [ - "rsd" - ], - "application/rss+xml": [ - "rss" - ], - "application/rtf": [ - "rtf" - ], - "application/rtx": [], - "application/samlassertion+xml": [], - "application/samlmetadata+xml": [], - "application/sbml+xml": [ - "sbml" - ], - "application/scvp-cv-request": [ - "scq" - ], - "application/scvp-cv-response": [ - "scs" - ], - "application/scvp-vp-request": [ - "spq" - ], - "application/scvp-vp-response": [ - "spp" - ], - "application/sdp": [ - "sdp" - ], - "application/set-payment": [], - "application/set-payment-initiation": [ - "setpay" - ], - "application/set-registration": [], - "application/set-registration-initiation": [ - "setreg" - ], - "application/sgml": [], - "application/sgml-open-catalog": [], - "application/shf+xml": [ - "shf" - ], - "application/sieve": [], - "application/simple-filter+xml": [], - "application/simple-message-summary": [], - "application/simplesymbolcontainer": [], - "application/slate": [], - "application/smil": [], - "application/smil+xml": [ - "smi", - "smil" - ], - "application/soap+fastinfoset": [], - "application/soap+xml": [], - "application/sparql-query": [ - "rq" - ], - "application/sparql-results+xml": [ - "srx" - ], - "application/spirits-event+xml": [], - "application/srgs": [ - "gram" - ], - "application/srgs+xml": [ - "grxml" - ], - "application/sru+xml": [ - "sru" - ], - "application/ssdl+xml": [ - "ssdl" - ], - "application/ssml+xml": [ - "ssml" - ], - "application/tamp-apex-update": [], - "application/tamp-apex-update-confirm": [], - "application/tamp-community-update": [], - "application/tamp-community-update-confirm": [], - "application/tamp-error": [], - "application/tamp-sequence-adjust": [], - "application/tamp-sequence-adjust-confirm": [], - "application/tamp-status-query": [], - "application/tamp-status-response": [], - "application/tamp-update": [], - "application/tamp-update-confirm": [], - "application/tei+xml": [ - "tei", - "teicorpus" - ], - "application/thraud+xml": [ - "tfi" - ], - "application/timestamp-query": [], - "application/timestamp-reply": [], - "application/timestamped-data": [ - "tsd" - ], - "application/tve-trigger": [], - "application/ulpfec": [], - "application/vcard+xml": [], - "application/vemmi": [], - "application/vividence.scriptfile": [], - "application/vnd.3gpp.bsf+xml": [], - "application/vnd.3gpp.pic-bw-large": [ - "plb" - ], - "application/vnd.3gpp.pic-bw-small": [ - "psb" - ], - "application/vnd.3gpp.pic-bw-var": [ - "pvb" - ], - "application/vnd.3gpp.sms": [], - "application/vnd.3gpp2.bcmcsinfo+xml": [], - "application/vnd.3gpp2.sms": [], - "application/vnd.3gpp2.tcap": [ - "tcap" - ], - "application/vnd.3m.post-it-notes": [ - "pwn" - ], - "application/vnd.accpac.simply.aso": [ - "aso" - ], - "application/vnd.accpac.simply.imp": [ - "imp" - ], - "application/vnd.acucobol": [ - "acu" - ], - "application/vnd.acucorp": [ - "atc", - "acutc" - ], - "application/vnd.adobe.air-application-installer-package+zip": [ - "air" - ], - "application/vnd.adobe.formscentral.fcdt": [ - "fcdt" - ], - "application/vnd.adobe.fxp": [ - "fxp", - "fxpl" - ], - "application/vnd.adobe.partial-upload": [], - "application/vnd.adobe.xdp+xml": [ - "xdp" - ], - "application/vnd.adobe.xfdf": [ - "xfdf" - ], - "application/vnd.aether.imp": [], - "application/vnd.ah-barcode": [], - "application/vnd.ahead.space": [ - "ahead" - ], - "application/vnd.airzip.filesecure.azf": [ - "azf" - ], - "application/vnd.airzip.filesecure.azs": [ - "azs" - ], - "application/vnd.amazon.ebook": [ - "azw" - ], - "application/vnd.americandynamics.acc": [ - "acc" - ], - "application/vnd.amiga.ami": [ - "ami" - ], - "application/vnd.amundsen.maze+xml": [], - "application/vnd.android.package-archive": [ - "apk" - ], - "application/vnd.anser-web-certificate-issue-initiation": [ - "cii" - ], - "application/vnd.anser-web-funds-transfer-initiation": [ - "fti" - ], - "application/vnd.antix.game-component": [ - "atx" - ], - "application/vnd.apple.installer+xml": [ - "mpkg" - ], - "application/vnd.apple.mpegurl": [ - "m3u8" - ], - "application/vnd.arastra.swi": [], - "application/vnd.aristanetworks.swi": [ - "swi" - ], - "application/vnd.astraea-software.iota": [ - "iota" - ], - "application/vnd.audiograph": [ - "aep" - ], - "application/vnd.autopackage": [], - "application/vnd.avistar+xml": [], - "application/vnd.blueice.multipass": [ - "mpm" - ], - "application/vnd.bluetooth.ep.oob": [], - "application/vnd.bmi": [ - "bmi" - ], - "application/vnd.businessobjects": [ - "rep" - ], - "application/vnd.cab-jscript": [], - "application/vnd.canon-cpdl": [], - "application/vnd.canon-lips": [], - "application/vnd.cendio.thinlinc.clientconf": [], - "application/vnd.chemdraw+xml": [ - "cdxml" - ], - "application/vnd.chipnuts.karaoke-mmd": [ - "mmd" - ], - "application/vnd.cinderella": [ - "cdy" - ], - "application/vnd.cirpack.isdn-ext": [], - "application/vnd.claymore": [ - "cla" - ], - "application/vnd.cloanto.rp9": [ - "rp9" - ], - "application/vnd.clonk.c4group": [ - "c4g", - "c4d", - "c4f", - "c4p", - "c4u" - ], - "application/vnd.cluetrust.cartomobile-config": [ - "c11amc" - ], - "application/vnd.cluetrust.cartomobile-config-pkg": [ - "c11amz" - ], - "application/vnd.collection+json": [], - "application/vnd.commerce-battelle": [], - "application/vnd.commonspace": [ - "csp" - ], - "application/vnd.contact.cmsg": [ - "cdbcmsg" - ], - "application/vnd.cosmocaller": [ - "cmc" - ], - "application/vnd.crick.clicker": [ - "clkx" - ], - "application/vnd.crick.clicker.keyboard": [ - "clkk" - ], - "application/vnd.crick.clicker.palette": [ - "clkp" - ], - "application/vnd.crick.clicker.template": [ - "clkt" - ], - "application/vnd.crick.clicker.wordbank": [ - "clkw" - ], - "application/vnd.criticaltools.wbs+xml": [ - "wbs" - ], - "application/vnd.ctc-posml": [ - "pml" - ], - "application/vnd.ctct.ws+xml": [], - "application/vnd.cups-pdf": [], - "application/vnd.cups-postscript": [], - "application/vnd.cups-ppd": [ - "ppd" - ], - "application/vnd.cups-raster": [], - "application/vnd.cups-raw": [], - "application/vnd.curl": [], - "application/vnd.curl.car": [ - "car" - ], - "application/vnd.curl.pcurl": [ - "pcurl" - ], - "application/vnd.cybank": [], - "application/vnd.dart": [ - "dart" - ], - "application/vnd.data-vision.rdz": [ - "rdz" - ], - "application/vnd.dece.data": [ - "uvf", - "uvvf", - "uvd", - "uvvd" - ], - "application/vnd.dece.ttml+xml": [ - "uvt", - "uvvt" - ], - "application/vnd.dece.unspecified": [ - "uvx", - "uvvx" - ], - "application/vnd.dece.zip": [ - "uvz", - "uvvz" - ], - "application/vnd.denovo.fcselayout-link": [ - "fe_launch" - ], - "application/vnd.dir-bi.plate-dl-nosuffix": [], - "application/vnd.dna": [ - "dna" - ], - "application/vnd.dolby.mlp": [ - "mlp" - ], - "application/vnd.dolby.mobile.1": [], - "application/vnd.dolby.mobile.2": [], - "application/vnd.dpgraph": [ - "dpg" - ], - "application/vnd.dreamfactory": [ - "dfac" - ], - "application/vnd.ds-keypoint": [ - "kpxx" - ], - "application/vnd.dvb.ait": [ - "ait" - ], - "application/vnd.dvb.dvbj": [], - "application/vnd.dvb.esgcontainer": [], - "application/vnd.dvb.ipdcdftnotifaccess": [], - "application/vnd.dvb.ipdcesgaccess": [], - "application/vnd.dvb.ipdcesgaccess2": [], - "application/vnd.dvb.ipdcesgpdd": [], - "application/vnd.dvb.ipdcroaming": [], - "application/vnd.dvb.iptv.alfec-base": [], - "application/vnd.dvb.iptv.alfec-enhancement": [], - "application/vnd.dvb.notif-aggregate-root+xml": [], - "application/vnd.dvb.notif-container+xml": [], - "application/vnd.dvb.notif-generic+xml": [], - "application/vnd.dvb.notif-ia-msglist+xml": [], - "application/vnd.dvb.notif-ia-registration-request+xml": [], - "application/vnd.dvb.notif-ia-registration-response+xml": [], - "application/vnd.dvb.notif-init+xml": [], - "application/vnd.dvb.pfr": [], - "application/vnd.dvb.service": [ - "svc" - ], - "application/vnd.dxr": [], - "application/vnd.dynageo": [ - "geo" - ], - "application/vnd.easykaraoke.cdgdownload": [], - "application/vnd.ecdis-update": [], - "application/vnd.ecowin.chart": [ - "mag" - ], - "application/vnd.ecowin.filerequest": [], - "application/vnd.ecowin.fileupdate": [], - "application/vnd.ecowin.series": [], - "application/vnd.ecowin.seriesrequest": [], - "application/vnd.ecowin.seriesupdate": [], - "application/vnd.emclient.accessrequest+xml": [], - "application/vnd.enliven": [ - "nml" - ], - "application/vnd.eprints.data+xml": [], - "application/vnd.epson.esf": [ - "esf" - ], - "application/vnd.epson.msf": [ - "msf" - ], - "application/vnd.epson.quickanime": [ - "qam" - ], - "application/vnd.epson.salt": [ - "slt" - ], - "application/vnd.epson.ssf": [ - "ssf" - ], - "application/vnd.ericsson.quickcall": [], - "application/vnd.eszigno3+xml": [ - "es3", - "et3" - ], - "application/vnd.etsi.aoc+xml": [], - "application/vnd.etsi.cug+xml": [], - "application/vnd.etsi.iptvcommand+xml": [], - "application/vnd.etsi.iptvdiscovery+xml": [], - "application/vnd.etsi.iptvprofile+xml": [], - "application/vnd.etsi.iptvsad-bc+xml": [], - "application/vnd.etsi.iptvsad-cod+xml": [], - "application/vnd.etsi.iptvsad-npvr+xml": [], - "application/vnd.etsi.iptvservice+xml": [], - "application/vnd.etsi.iptvsync+xml": [], - "application/vnd.etsi.iptvueprofile+xml": [], - "application/vnd.etsi.mcid+xml": [], - "application/vnd.etsi.overload-control-policy-dataset+xml": [], - "application/vnd.etsi.sci+xml": [], - "application/vnd.etsi.simservs+xml": [], - "application/vnd.etsi.tsl+xml": [], - "application/vnd.etsi.tsl.der": [], - "application/vnd.eudora.data": [], - "application/vnd.ezpix-album": [ - "ez2" - ], - "application/vnd.ezpix-package": [ - "ez3" - ], - "application/vnd.f-secure.mobile": [], - "application/vnd.fdf": [ - "fdf" - ], - "application/vnd.fdsn.mseed": [ - "mseed" - ], - "application/vnd.fdsn.seed": [ - "seed", - "dataless" - ], - "application/vnd.ffsns": [], - "application/vnd.fints": [], - "application/vnd.flographit": [ - "gph" - ], - "application/vnd.fluxtime.clip": [ - "ftc" - ], - "application/vnd.font-fontforge-sfd": [], - "application/vnd.framemaker": [ - "fm", - "frame", - "maker", - "book" - ], - "application/vnd.frogans.fnc": [ - "fnc" - ], - "application/vnd.frogans.ltf": [ - "ltf" - ], - "application/vnd.fsc.weblaunch": [ - "fsc" - ], - "application/vnd.fujitsu.oasys": [ - "oas" - ], - "application/vnd.fujitsu.oasys2": [ - "oa2" - ], - "application/vnd.fujitsu.oasys3": [ - "oa3" - ], - "application/vnd.fujitsu.oasysgp": [ - "fg5" - ], - "application/vnd.fujitsu.oasysprs": [ - "bh2" - ], - "application/vnd.fujixerox.art-ex": [], - "application/vnd.fujixerox.art4": [], - "application/vnd.fujixerox.hbpl": [], - "application/vnd.fujixerox.ddd": [ - "ddd" - ], - "application/vnd.fujixerox.docuworks": [ - "xdw" - ], - "application/vnd.fujixerox.docuworks.binder": [ - "xbd" - ], - "application/vnd.fut-misnet": [], - "application/vnd.fuzzysheet": [ - "fzs" - ], - "application/vnd.genomatix.tuxedo": [ - "txd" - ], - "application/vnd.geocube+xml": [], - "application/vnd.geogebra.file": [ - "ggb" - ], - "application/vnd.geogebra.tool": [ - "ggt" - ], - "application/vnd.geometry-explorer": [ - "gex", - "gre" - ], - "application/vnd.geonext": [ - "gxt" - ], - "application/vnd.geoplan": [ - "g2w" - ], - "application/vnd.geospace": [ - "g3w" - ], - "application/vnd.globalplatform.card-content-mgt": [], - "application/vnd.globalplatform.card-content-mgt-response": [], - "application/vnd.gmx": [ - "gmx" - ], - "application/vnd.google-earth.kml+xml": [ - "kml" - ], - "application/vnd.google-earth.kmz": [ - "kmz" - ], - "application/vnd.grafeq": [ - "gqf", - "gqs" - ], - "application/vnd.gridmp": [], - "application/vnd.groove-account": [ - "gac" - ], - "application/vnd.groove-help": [ - "ghf" - ], - "application/vnd.groove-identity-message": [ - "gim" - ], - "application/vnd.groove-injector": [ - "grv" - ], - "application/vnd.groove-tool-message": [ - "gtm" - ], - "application/vnd.groove-tool-template": [ - "tpl" - ], - "application/vnd.groove-vcard": [ - "vcg" - ], - "application/vnd.hal+json": [], - "application/vnd.hal+xml": [ - "hal" - ], - "application/vnd.handheld-entertainment+xml": [ - "zmm" - ], - "application/vnd.hbci": [ - "hbci" - ], - "application/vnd.hcl-bireports": [], - "application/vnd.hhe.lesson-player": [ - "les" - ], - "application/vnd.hp-hpgl": [ - "hpgl" - ], - "application/vnd.hp-hpid": [ - "hpid" - ], - "application/vnd.hp-hps": [ - "hps" - ], - "application/vnd.hp-jlyt": [ - "jlt" - ], - "application/vnd.hp-pcl": [ - "pcl" - ], - "application/vnd.hp-pclxl": [ - "pclxl" - ], - "application/vnd.httphone": [], - "application/vnd.hzn-3d-crossword": [], - "application/vnd.ibm.afplinedata": [], - "application/vnd.ibm.electronic-media": [], - "application/vnd.ibm.minipay": [ - "mpy" - ], - "application/vnd.ibm.modcap": [ - "afp", - "listafp", - "list3820" - ], - "application/vnd.ibm.rights-management": [ - "irm" - ], - "application/vnd.ibm.secure-container": [ - "sc" - ], - "application/vnd.iccprofile": [ - "icc", - "icm" - ], - "application/vnd.igloader": [ - "igl" - ], - "application/vnd.immervision-ivp": [ - "ivp" - ], - "application/vnd.immervision-ivu": [ - "ivu" - ], - "application/vnd.informedcontrol.rms+xml": [], - "application/vnd.informix-visionary": [], - "application/vnd.infotech.project": [], - "application/vnd.infotech.project+xml": [], - "application/vnd.innopath.wamp.notification": [], - "application/vnd.insors.igm": [ - "igm" - ], - "application/vnd.intercon.formnet": [ - "xpw", - "xpx" - ], - "application/vnd.intergeo": [ - "i2g" - ], - "application/vnd.intertrust.digibox": [], - "application/vnd.intertrust.nncp": [], - "application/vnd.intu.qbo": [ - "qbo" - ], - "application/vnd.intu.qfx": [ - "qfx" - ], - "application/vnd.iptc.g2.conceptitem+xml": [], - "application/vnd.iptc.g2.knowledgeitem+xml": [], - "application/vnd.iptc.g2.newsitem+xml": [], - "application/vnd.iptc.g2.newsmessage+xml": [], - "application/vnd.iptc.g2.packageitem+xml": [], - "application/vnd.iptc.g2.planningitem+xml": [], - "application/vnd.ipunplugged.rcprofile": [ - "rcprofile" - ], - "application/vnd.irepository.package+xml": [ - "irp" - ], - "application/vnd.is-xpr": [ - "xpr" - ], - "application/vnd.isac.fcs": [ - "fcs" - ], - "application/vnd.jam": [ - "jam" - ], - "application/vnd.japannet-directory-service": [], - "application/vnd.japannet-jpnstore-wakeup": [], - "application/vnd.japannet-payment-wakeup": [], - "application/vnd.japannet-registration": [], - "application/vnd.japannet-registration-wakeup": [], - "application/vnd.japannet-setstore-wakeup": [], - "application/vnd.japannet-verification": [], - "application/vnd.japannet-verification-wakeup": [], - "application/vnd.jcp.javame.midlet-rms": [ - "rms" - ], - "application/vnd.jisp": [ - "jisp" - ], - "application/vnd.joost.joda-archive": [ - "joda" - ], - "application/vnd.kahootz": [ - "ktz", - "ktr" - ], - "application/vnd.kde.karbon": [ - "karbon" - ], - "application/vnd.kde.kchart": [ - "chrt" - ], - "application/vnd.kde.kformula": [ - "kfo" - ], - "application/vnd.kde.kivio": [ - "flw" - ], - "application/vnd.kde.kontour": [ - "kon" - ], - "application/vnd.kde.kpresenter": [ - "kpr", - "kpt" - ], - "application/vnd.kde.kspread": [ - "ksp" - ], - "application/vnd.kde.kword": [ - "kwd", - "kwt" - ], - "application/vnd.kenameaapp": [ - "htke" - ], - "application/vnd.kidspiration": [ - "kia" - ], - "application/vnd.kinar": [ - "kne", - "knp" - ], - "application/vnd.koan": [ - "skp", - "skd", - "skt", - "skm" - ], - "application/vnd.kodak-descriptor": [ - "sse" - ], - "application/vnd.las.las+xml": [ - "lasxml" - ], - "application/vnd.liberty-request+xml": [], - "application/vnd.llamagraphics.life-balance.desktop": [ - "lbd" - ], - "application/vnd.llamagraphics.life-balance.exchange+xml": [ - "lbe" - ], - "application/vnd.lotus-1-2-3": [ - "123" - ], - "application/vnd.lotus-approach": [ - "apr" - ], - "application/vnd.lotus-freelance": [ - "pre" - ], - "application/vnd.lotus-notes": [ - "nsf" - ], - "application/vnd.lotus-organizer": [ - "org" - ], - "application/vnd.lotus-screencam": [ - "scm" - ], - "application/vnd.lotus-wordpro": [ - "lwp" - ], - "application/vnd.macports.portpkg": [ - "portpkg" - ], - "application/vnd.marlin.drm.actiontoken+xml": [], - "application/vnd.marlin.drm.conftoken+xml": [], - "application/vnd.marlin.drm.license+xml": [], - "application/vnd.marlin.drm.mdcf": [], - "application/vnd.mcd": [ - "mcd" - ], - "application/vnd.medcalcdata": [ - "mc1" - ], - "application/vnd.mediastation.cdkey": [ - "cdkey" - ], - "application/vnd.meridian-slingshot": [], - "application/vnd.mfer": [ - "mwf" - ], - "application/vnd.mfmp": [ - "mfm" - ], - "application/vnd.micrografx.flo": [ - "flo" - ], - "application/vnd.micrografx.igx": [ - "igx" - ], - "application/vnd.mif": [ - "mif" - ], - "application/vnd.minisoft-hp3000-save": [], - "application/vnd.mitsubishi.misty-guard.trustweb": [], - "application/vnd.mobius.daf": [ - "daf" - ], - "application/vnd.mobius.dis": [ - "dis" - ], - "application/vnd.mobius.mbk": [ - "mbk" - ], - "application/vnd.mobius.mqy": [ - "mqy" - ], - "application/vnd.mobius.msl": [ - "msl" - ], - "application/vnd.mobius.plc": [ - "plc" - ], - "application/vnd.mobius.txf": [ - "txf" - ], - "application/vnd.mophun.application": [ - "mpn" - ], - "application/vnd.mophun.certificate": [ - "mpc" - ], - "application/vnd.motorola.flexsuite": [], - "application/vnd.motorola.flexsuite.adsi": [], - "application/vnd.motorola.flexsuite.fis": [], - "application/vnd.motorola.flexsuite.gotap": [], - "application/vnd.motorola.flexsuite.kmr": [], - "application/vnd.motorola.flexsuite.ttc": [], - "application/vnd.motorola.flexsuite.wem": [], - "application/vnd.motorola.iprm": [], - "application/vnd.mozilla.xul+xml": [ - "xul" - ], - "application/vnd.ms-artgalry": [ - "cil" - ], - "application/vnd.ms-asf": [], - "application/vnd.ms-cab-compressed": [ - "cab" - ], - "application/vnd.ms-color.iccprofile": [], - "application/vnd.ms-excel": [ - "xls", - "xlm", - "xla", - "xlc", - "xlt", - "xlw" - ], - "application/vnd.ms-excel.addin.macroenabled.12": [ - "xlam" - ], - "application/vnd.ms-excel.sheet.binary.macroenabled.12": [ - "xlsb" - ], - "application/vnd.ms-excel.sheet.macroenabled.12": [ - "xlsm" - ], - "application/vnd.ms-excel.template.macroenabled.12": [ - "xltm" - ], - "application/vnd.ms-fontobject": [ - "eot" - ], - "application/vnd.ms-htmlhelp": [ - "chm" - ], - "application/vnd.ms-ims": [ - "ims" - ], - "application/vnd.ms-lrm": [ - "lrm" - ], - "application/vnd.ms-office.activex+xml": [], - "application/vnd.ms-officetheme": [ - "thmx" - ], - "application/vnd.ms-opentype": [], - "application/vnd.ms-package.obfuscated-opentype": [], - "application/vnd.ms-pki.seccat": [ - "cat" - ], - "application/vnd.ms-pki.stl": [ - "stl" - ], - "application/vnd.ms-playready.initiator+xml": [], - "application/vnd.ms-powerpoint": [ - "ppt", - "pps", - "pot" - ], - "application/vnd.ms-powerpoint.addin.macroenabled.12": [ - "ppam" - ], - "application/vnd.ms-powerpoint.presentation.macroenabled.12": [ - "pptm" - ], - "application/vnd.ms-powerpoint.slide.macroenabled.12": [ - "sldm" - ], - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": [ - "ppsm" - ], - "application/vnd.ms-powerpoint.template.macroenabled.12": [ - "potm" - ], - "application/vnd.ms-printing.printticket+xml": [], - "application/vnd.ms-project": [ - "mpp", - "mpt" - ], - "application/vnd.ms-tnef": [], - "application/vnd.ms-wmdrm.lic-chlg-req": [], - "application/vnd.ms-wmdrm.lic-resp": [], - "application/vnd.ms-wmdrm.meter-chlg-req": [], - "application/vnd.ms-wmdrm.meter-resp": [], - "application/vnd.ms-word.document.macroenabled.12": [ - "docm" - ], - "application/vnd.ms-word.template.macroenabled.12": [ - "dotm" - ], - "application/vnd.ms-works": [ - "wps", - "wks", - "wcm", - "wdb" - ], - "application/vnd.ms-wpl": [ - "wpl" - ], - "application/vnd.ms-xpsdocument": [ - "xps" - ], - "application/vnd.mseq": [ - "mseq" - ], - "application/vnd.msign": [], - "application/vnd.multiad.creator": [], - "application/vnd.multiad.creator.cif": [], - "application/vnd.music-niff": [], - "application/vnd.musician": [ - "mus" - ], - "application/vnd.muvee.style": [ - "msty" - ], - "application/vnd.mynfc": [ - "taglet" - ], - "application/vnd.ncd.control": [], - "application/vnd.ncd.reference": [], - "application/vnd.nervana": [], - "application/vnd.netfpx": [], - "application/vnd.neurolanguage.nlu": [ - "nlu" - ], - "application/vnd.nitf": [ - "ntf", - "nitf" - ], - "application/vnd.noblenet-directory": [ - "nnd" - ], - "application/vnd.noblenet-sealer": [ - "nns" - ], - "application/vnd.noblenet-web": [ - "nnw" - ], - "application/vnd.nokia.catalogs": [], - "application/vnd.nokia.conml+wbxml": [], - "application/vnd.nokia.conml+xml": [], - "application/vnd.nokia.isds-radio-presets": [], - "application/vnd.nokia.iptv.config+xml": [], - "application/vnd.nokia.landmark+wbxml": [], - "application/vnd.nokia.landmark+xml": [], - "application/vnd.nokia.landmarkcollection+xml": [], - "application/vnd.nokia.n-gage.ac+xml": [], - "application/vnd.nokia.n-gage.data": [ - "ngdat" - ], - "application/vnd.nokia.ncd": [], - "application/vnd.nokia.pcd+wbxml": [], - "application/vnd.nokia.pcd+xml": [], - "application/vnd.nokia.radio-preset": [ - "rpst" - ], - "application/vnd.nokia.radio-presets": [ - "rpss" - ], - "application/vnd.novadigm.edm": [ - "edm" - ], - "application/vnd.novadigm.edx": [ - "edx" - ], - "application/vnd.novadigm.ext": [ - "ext" - ], - "application/vnd.ntt-local.file-transfer": [], - "application/vnd.ntt-local.sip-ta_remote": [], - "application/vnd.ntt-local.sip-ta_tcp_stream": [], - "application/vnd.oasis.opendocument.chart": [ - "odc" - ], - "application/vnd.oasis.opendocument.chart-template": [ - "otc" - ], - "application/vnd.oasis.opendocument.database": [ - "odb" - ], - "application/vnd.oasis.opendocument.formula": [ - "odf" - ], - "application/vnd.oasis.opendocument.formula-template": [ - "odft" - ], - "application/vnd.oasis.opendocument.graphics": [ - "odg" - ], - "application/vnd.oasis.opendocument.graphics-template": [ - "otg" - ], - "application/vnd.oasis.opendocument.image": [ - "odi" - ], - "application/vnd.oasis.opendocument.image-template": [ - "oti" - ], - "application/vnd.oasis.opendocument.presentation": [ - "odp" - ], - "application/vnd.oasis.opendocument.presentation-template": [ - "otp" - ], - "application/vnd.oasis.opendocument.spreadsheet": [ - "ods" - ], - "application/vnd.oasis.opendocument.spreadsheet-template": [ - "ots" - ], - "application/vnd.oasis.opendocument.text": [ - "odt" - ], - "application/vnd.oasis.opendocument.text-master": [ - "odm" - ], - "application/vnd.oasis.opendocument.text-template": [ - "ott" - ], - "application/vnd.oasis.opendocument.text-web": [ - "oth" - ], - "application/vnd.obn": [], - "application/vnd.oftn.l10n+json": [], - "application/vnd.oipf.contentaccessdownload+xml": [], - "application/vnd.oipf.contentaccessstreaming+xml": [], - "application/vnd.oipf.cspg-hexbinary": [], - "application/vnd.oipf.dae.svg+xml": [], - "application/vnd.oipf.dae.xhtml+xml": [], - "application/vnd.oipf.mippvcontrolmessage+xml": [], - "application/vnd.oipf.pae.gem": [], - "application/vnd.oipf.spdiscovery+xml": [], - "application/vnd.oipf.spdlist+xml": [], - "application/vnd.oipf.ueprofile+xml": [], - "application/vnd.oipf.userprofile+xml": [], - "application/vnd.olpc-sugar": [ - "xo" - ], - "application/vnd.oma-scws-config": [], - "application/vnd.oma-scws-http-request": [], - "application/vnd.oma-scws-http-response": [], - "application/vnd.oma.bcast.associated-procedure-parameter+xml": [], - "application/vnd.oma.bcast.drm-trigger+xml": [], - "application/vnd.oma.bcast.imd+xml": [], - "application/vnd.oma.bcast.ltkm": [], - "application/vnd.oma.bcast.notification+xml": [], - "application/vnd.oma.bcast.provisioningtrigger": [], - "application/vnd.oma.bcast.sgboot": [], - "application/vnd.oma.bcast.sgdd+xml": [], - "application/vnd.oma.bcast.sgdu": [], - "application/vnd.oma.bcast.simple-symbol-container": [], - "application/vnd.oma.bcast.smartcard-trigger+xml": [], - "application/vnd.oma.bcast.sprov+xml": [], - "application/vnd.oma.bcast.stkm": [], - "application/vnd.oma.cab-address-book+xml": [], - "application/vnd.oma.cab-feature-handler+xml": [], - "application/vnd.oma.cab-pcc+xml": [], - "application/vnd.oma.cab-user-prefs+xml": [], - "application/vnd.oma.dcd": [], - "application/vnd.oma.dcdc": [], - "application/vnd.oma.dd2+xml": [ - "dd2" - ], - "application/vnd.oma.drm.risd+xml": [], - "application/vnd.oma.group-usage-list+xml": [], - "application/vnd.oma.pal+xml": [], - "application/vnd.oma.poc.detailed-progress-report+xml": [], - "application/vnd.oma.poc.final-report+xml": [], - "application/vnd.oma.poc.groups+xml": [], - "application/vnd.oma.poc.invocation-descriptor+xml": [], - "application/vnd.oma.poc.optimized-progress-report+xml": [], - "application/vnd.oma.push": [], - "application/vnd.oma.scidm.messages+xml": [], - "application/vnd.oma.xcap-directory+xml": [], - "application/vnd.omads-email+xml": [], - "application/vnd.omads-file+xml": [], - "application/vnd.omads-folder+xml": [], - "application/vnd.omaloc-supl-init": [], - "application/vnd.openofficeorg.extension": [ - "oxt" - ], - "application/vnd.openxmlformats-officedocument.custom-properties+xml": [], - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": [], - "application/vnd.openxmlformats-officedocument.drawing+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": [], - "application/vnd.openxmlformats-officedocument.extended-properties+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presentation": [ - "pptx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slide": [ - "sldx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [ - "ppsx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.template": [ - "potx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [ - "xlsx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [ - "xltx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": [], - "application/vnd.openxmlformats-officedocument.theme+xml": [], - "application/vnd.openxmlformats-officedocument.themeoverride+xml": [], - "application/vnd.openxmlformats-officedocument.vmldrawing": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [ - "docx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [ - "dotx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": [], - "application/vnd.openxmlformats-package.core-properties+xml": [], - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": [], - "application/vnd.openxmlformats-package.relationships+xml": [], - "application/vnd.quobject-quoxdocument": [], - "application/vnd.osa.netdeploy": [], - "application/vnd.osgeo.mapguide.package": [ - "mgp" - ], - "application/vnd.osgi.bundle": [], - "application/vnd.osgi.dp": [ - "dp" - ], - "application/vnd.osgi.subsystem": [ - "esa" - ], - "application/vnd.otps.ct-kip+xml": [], - "application/vnd.palm": [ - "pdb", - "pqa", - "oprc" - ], - "application/vnd.paos.xml": [], - "application/vnd.pawaafile": [ - "paw" - ], - "application/vnd.pg.format": [ - "str" - ], - "application/vnd.pg.osasli": [ - "ei6" - ], - "application/vnd.piaccess.application-licence": [], - "application/vnd.picsel": [ - "efif" - ], - "application/vnd.pmi.widget": [ - "wg" - ], - "application/vnd.poc.group-advertisement+xml": [], - "application/vnd.pocketlearn": [ - "plf" - ], - "application/vnd.powerbuilder6": [ - "pbd" - ], - "application/vnd.powerbuilder6-s": [], - "application/vnd.powerbuilder7": [], - "application/vnd.powerbuilder7-s": [], - "application/vnd.powerbuilder75": [], - "application/vnd.powerbuilder75-s": [], - "application/vnd.preminet": [], - "application/vnd.previewsystems.box": [ - "box" - ], - "application/vnd.proteus.magazine": [ - "mgz" - ], - "application/vnd.publishare-delta-tree": [ - "qps" - ], - "application/vnd.pvi.ptid1": [ - "ptid" - ], - "application/vnd.pwg-multiplexed": [], - "application/vnd.pwg-xhtml-print+xml": [], - "application/vnd.qualcomm.brew-app-res": [], - "application/vnd.quark.quarkxpress": [ - "qxd", - "qxt", - "qwd", - "qwt", - "qxl", - "qxb" - ], - "application/vnd.radisys.moml+xml": [], - "application/vnd.radisys.msml+xml": [], - "application/vnd.radisys.msml-audit+xml": [], - "application/vnd.radisys.msml-audit-conf+xml": [], - "application/vnd.radisys.msml-audit-conn+xml": [], - "application/vnd.radisys.msml-audit-dialog+xml": [], - "application/vnd.radisys.msml-audit-stream+xml": [], - "application/vnd.radisys.msml-conf+xml": [], - "application/vnd.radisys.msml-dialog+xml": [], - "application/vnd.radisys.msml-dialog-base+xml": [], - "application/vnd.radisys.msml-dialog-fax-detect+xml": [], - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": [], - "application/vnd.radisys.msml-dialog-group+xml": [], - "application/vnd.radisys.msml-dialog-speech+xml": [], - "application/vnd.radisys.msml-dialog-transform+xml": [], - "application/vnd.rainstor.data": [], - "application/vnd.rapid": [], - "application/vnd.realvnc.bed": [ - "bed" - ], - "application/vnd.recordare.musicxml": [ - "mxl" - ], - "application/vnd.recordare.musicxml+xml": [ - "musicxml" - ], - "application/vnd.renlearn.rlprint": [], - "application/vnd.rig.cryptonote": [ - "cryptonote" - ], - "application/vnd.rim.cod": [ - "cod" - ], - "application/vnd.rn-realmedia": [ - "rm" - ], - "application/vnd.rn-realmedia-vbr": [ - "rmvb" - ], - "application/vnd.route66.link66+xml": [ - "link66" - ], - "application/vnd.rs-274x": [], - "application/vnd.ruckus.download": [], - "application/vnd.s3sms": [], - "application/vnd.sailingtracker.track": [ - "st" - ], - "application/vnd.sbm.cid": [], - "application/vnd.sbm.mid2": [], - "application/vnd.scribus": [], - "application/vnd.sealed.3df": [], - "application/vnd.sealed.csf": [], - "application/vnd.sealed.doc": [], - "application/vnd.sealed.eml": [], - "application/vnd.sealed.mht": [], - "application/vnd.sealed.net": [], - "application/vnd.sealed.ppt": [], - "application/vnd.sealed.tiff": [], - "application/vnd.sealed.xls": [], - "application/vnd.sealedmedia.softseal.html": [], - "application/vnd.sealedmedia.softseal.pdf": [], - "application/vnd.seemail": [ - "see" - ], - "application/vnd.sema": [ - "sema" - ], - "application/vnd.semd": [ - "semd" - ], - "application/vnd.semf": [ - "semf" - ], - "application/vnd.shana.informed.formdata": [ - "ifm" - ], - "application/vnd.shana.informed.formtemplate": [ - "itp" - ], - "application/vnd.shana.informed.interchange": [ - "iif" - ], - "application/vnd.shana.informed.package": [ - "ipk" - ], - "application/vnd.simtech-mindmapper": [ - "twd", - "twds" - ], - "application/vnd.smaf": [ - "mmf" - ], - "application/vnd.smart.notebook": [], - "application/vnd.smart.teacher": [ - "teacher" - ], - "application/vnd.software602.filler.form+xml": [], - "application/vnd.software602.filler.form-xml-zip": [], - "application/vnd.solent.sdkm+xml": [ - "sdkm", - "sdkd" - ], - "application/vnd.spotfire.dxp": [ - "dxp" - ], - "application/vnd.spotfire.sfs": [ - "sfs" - ], - "application/vnd.sss-cod": [], - "application/vnd.sss-dtf": [], - "application/vnd.sss-ntf": [], - "application/vnd.stardivision.calc": [ - "sdc" - ], - "application/vnd.stardivision.draw": [ - "sda" - ], - "application/vnd.stardivision.impress": [ - "sdd" - ], - "application/vnd.stardivision.math": [ - "smf" - ], - "application/vnd.stardivision.writer": [ - "sdw", - "vor" - ], - "application/vnd.stardivision.writer-global": [ - "sgl" - ], - "application/vnd.stepmania.package": [ - "smzip" - ], - "application/vnd.stepmania.stepchart": [ - "sm" - ], - "application/vnd.street-stream": [], - "application/vnd.sun.xml.calc": [ - "sxc" - ], - "application/vnd.sun.xml.calc.template": [ - "stc" - ], - "application/vnd.sun.xml.draw": [ - "sxd" - ], - "application/vnd.sun.xml.draw.template": [ - "std" - ], - "application/vnd.sun.xml.impress": [ - "sxi" - ], - "application/vnd.sun.xml.impress.template": [ - "sti" - ], - "application/vnd.sun.xml.math": [ - "sxm" - ], - "application/vnd.sun.xml.writer": [ - "sxw" - ], - "application/vnd.sun.xml.writer.global": [ - "sxg" - ], - "application/vnd.sun.xml.writer.template": [ - "stw" - ], - "application/vnd.sun.wadl+xml": [], - "application/vnd.sus-calendar": [ - "sus", - "susp" - ], - "application/vnd.svd": [ - "svd" - ], - "application/vnd.swiftview-ics": [], - "application/vnd.symbian.install": [ - "sis", - "sisx" - ], - "application/vnd.syncml+xml": [ - "xsm" - ], - "application/vnd.syncml.dm+wbxml": [ - "bdm" - ], - "application/vnd.syncml.dm+xml": [ - "xdm" - ], - "application/vnd.syncml.dm.notification": [], - "application/vnd.syncml.ds.notification": [], - "application/vnd.tao.intent-module-archive": [ - "tao" - ], - "application/vnd.tcpdump.pcap": [ - "pcap", - "cap", - "dmp" - ], - "application/vnd.tmobile-livetv": [ - "tmo" - ], - "application/vnd.trid.tpt": [ - "tpt" - ], - "application/vnd.triscape.mxs": [ - "mxs" - ], - "application/vnd.trueapp": [ - "tra" - ], - "application/vnd.truedoc": [], - "application/vnd.ubisoft.webplayer": [], - "application/vnd.ufdl": [ - "ufd", - "ufdl" - ], - "application/vnd.uiq.theme": [ - "utz" - ], - "application/vnd.umajin": [ - "umj" - ], - "application/vnd.unity": [ - "unityweb" - ], - "application/vnd.uoml+xml": [ - "uoml" - ], - "application/vnd.uplanet.alert": [], - "application/vnd.uplanet.alert-wbxml": [], - "application/vnd.uplanet.bearer-choice": [], - "application/vnd.uplanet.bearer-choice-wbxml": [], - "application/vnd.uplanet.cacheop": [], - "application/vnd.uplanet.cacheop-wbxml": [], - "application/vnd.uplanet.channel": [], - "application/vnd.uplanet.channel-wbxml": [], - "application/vnd.uplanet.list": [], - "application/vnd.uplanet.list-wbxml": [], - "application/vnd.uplanet.listcmd": [], - "application/vnd.uplanet.listcmd-wbxml": [], - "application/vnd.uplanet.signal": [], - "application/vnd.vcx": [ - "vcx" - ], - "application/vnd.vd-study": [], - "application/vnd.vectorworks": [], - "application/vnd.verimatrix.vcas": [], - "application/vnd.vidsoft.vidconference": [], - "application/vnd.visio": [ - "vsd", - "vst", - "vss", - "vsw" - ], - "application/vnd.visionary": [ - "vis" - ], - "application/vnd.vividence.scriptfile": [], - "application/vnd.vsf": [ - "vsf" - ], - "application/vnd.wap.sic": [], - "application/vnd.wap.slc": [], - "application/vnd.wap.wbxml": [ - "wbxml" - ], - "application/vnd.wap.wmlc": [ - "wmlc" - ], - "application/vnd.wap.wmlscriptc": [ - "wmlsc" - ], - "application/vnd.webturbo": [ - "wtb" - ], - "application/vnd.wfa.wsc": [], - "application/vnd.wmc": [], - "application/vnd.wmf.bootstrap": [], - "application/vnd.wolfram.mathematica": [], - "application/vnd.wolfram.mathematica.package": [], - "application/vnd.wolfram.player": [ - "nbp" - ], - "application/vnd.wordperfect": [ - "wpd" - ], - "application/vnd.wqd": [ - "wqd" - ], - "application/vnd.wrq-hp3000-labelled": [], - "application/vnd.wt.stf": [ - "stf" - ], - "application/vnd.wv.csp+wbxml": [], - "application/vnd.wv.csp+xml": [], - "application/vnd.wv.ssp+xml": [], - "application/vnd.xara": [ - "xar" - ], - "application/vnd.xfdl": [ - "xfdl" - ], - "application/vnd.xfdl.webform": [], - "application/vnd.xmi+xml": [], - "application/vnd.xmpie.cpkg": [], - "application/vnd.xmpie.dpkg": [], - "application/vnd.xmpie.plan": [], - "application/vnd.xmpie.ppkg": [], - "application/vnd.xmpie.xlim": [], - "application/vnd.yamaha.hv-dic": [ - "hvd" - ], - "application/vnd.yamaha.hv-script": [ - "hvs" - ], - "application/vnd.yamaha.hv-voice": [ - "hvp" - ], - "application/vnd.yamaha.openscoreformat": [ - "osf" - ], - "application/vnd.yamaha.openscoreformat.osfpvg+xml": [ - "osfpvg" - ], - "application/vnd.yamaha.remote-setup": [], - "application/vnd.yamaha.smaf-audio": [ - "saf" - ], - "application/vnd.yamaha.smaf-phrase": [ - "spf" - ], - "application/vnd.yamaha.through-ngn": [], - "application/vnd.yamaha.tunnel-udpencap": [], - "application/vnd.yellowriver-custom-menu": [ - "cmp" - ], - "application/vnd.zul": [ - "zir", - "zirz" - ], - "application/vnd.zzazz.deck+xml": [ - "zaz" - ], - "application/voicexml+xml": [ - "vxml" - ], - "application/vq-rtcpxr": [], - "application/watcherinfo+xml": [], - "application/whoispp-query": [], - "application/whoispp-response": [], - "application/widget": [ - "wgt" - ], - "application/winhlp": [ - "hlp" - ], - "application/wita": [], - "application/wordperfect5.1": [], - "application/wsdl+xml": [ - "wsdl" - ], - "application/wspolicy+xml": [ - "wspolicy" - ], - "application/x-7z-compressed": [ - "7z" - ], - "application/x-abiword": [ - "abw" - ], - "application/x-ace-compressed": [ - "ace" - ], - "application/x-amf": [], - "application/x-apple-diskimage": [ - "dmg" - ], - "application/x-authorware-bin": [ - "aab", - "x32", - "u32", - "vox" - ], - "application/x-authorware-map": [ - "aam" - ], - "application/x-authorware-seg": [ - "aas" - ], - "application/x-bcpio": [ - "bcpio" - ], - "application/x-bittorrent": [ - "torrent" - ], - "application/x-blorb": [ - "blb", - "blorb" - ], - "application/x-bzip": [ - "bz" - ], - "application/x-bzip2": [ - "bz2", - "boz" - ], - "application/x-cbr": [ - "cbr", - "cba", - "cbt", - "cbz", - "cb7" - ], - "application/x-cdlink": [ - "vcd" - ], - "application/x-cfs-compressed": [ - "cfs" - ], - "application/x-chat": [ - "chat" - ], - "application/x-chess-pgn": [ - "pgn" - ], - "application/x-conference": [ - "nsc" - ], - "application/x-compress": [], - "application/x-cpio": [ - "cpio" - ], - "application/x-csh": [ - "csh" - ], - "application/x-debian-package": [ - "deb", - "udeb" - ], - "application/x-dgc-compressed": [ - "dgc" - ], - "application/x-director": [ - "dir", - "dcr", - "dxr", - "cst", - "cct", - "cxt", - "w3d", - "fgd", - "swa" - ], - "application/x-doom": [ - "wad" - ], - "application/x-dtbncx+xml": [ - "ncx" - ], - "application/x-dtbook+xml": [ - "dtb" - ], - "application/x-dtbresource+xml": [ - "res" - ], - "application/x-dvi": [ - "dvi" - ], - "application/x-envoy": [ - "evy" - ], - "application/x-eva": [ - "eva" - ], - "application/x-font-bdf": [ - "bdf" - ], - "application/x-font-dos": [], - "application/x-font-framemaker": [], - "application/x-font-ghostscript": [ - "gsf" - ], - "application/x-font-libgrx": [], - "application/x-font-linux-psf": [ - "psf" - ], - "application/x-font-otf": [ - "otf" - ], - "application/x-font-pcf": [ - "pcf" - ], - "application/x-font-snf": [ - "snf" - ], - "application/x-font-speedo": [], - "application/x-font-sunos-news": [], - "application/x-font-ttf": [ - "ttf", - "ttc" - ], - "application/x-font-type1": [ - "pfa", - "pfb", - "pfm", - "afm" - ], - "application/font-woff": [ - "woff" - ], - "application/x-font-vfont": [], - "application/x-freearc": [ - "arc" - ], - "application/x-futuresplash": [ - "spl" - ], - "application/x-gca-compressed": [ - "gca" - ], - "application/x-glulx": [ - "ulx" - ], - "application/x-gnumeric": [ - "gnumeric" - ], - "application/x-gramps-xml": [ - "gramps" - ], - "application/x-gtar": [ - "gtar" - ], - "application/x-gzip": [], - "application/x-hdf": [ - "hdf" - ], - "application/x-install-instructions": [ - "install" - ], - "application/x-iso9660-image": [ - "iso" - ], - "application/x-java-jnlp-file": [ - "jnlp" - ], - "application/x-latex": [ - "latex" - ], - "application/x-lzh-compressed": [ - "lzh", - "lha" - ], - "application/x-mie": [ - "mie" - ], - "application/x-mobipocket-ebook": [ - "prc", - "mobi" - ], - "application/x-ms-application": [ - "application" - ], - "application/x-ms-shortcut": [ - "lnk" - ], - "application/x-ms-wmd": [ - "wmd" - ], - "application/x-ms-wmz": [ - "wmz" - ], - "application/x-ms-xbap": [ - "xbap" - ], - "application/x-msaccess": [ - "mdb" - ], - "application/x-msbinder": [ - "obd" - ], - "application/x-mscardfile": [ - "crd" - ], - "application/x-msclip": [ - "clp" - ], - "application/x-msdownload": [ - "exe", - "dll", - "com", - "bat", - "msi" - ], - "application/x-msmediaview": [ - "mvb", - "m13", - "m14" - ], - "application/x-msmetafile": [ - "wmf", - "wmz", - "emf", - "emz" - ], - "application/x-msmoney": [ - "mny" - ], - "application/x-mspublisher": [ - "pub" - ], - "application/x-msschedule": [ - "scd" - ], - "application/x-msterminal": [ - "trm" - ], - "application/x-mswrite": [ - "wri" - ], - "application/x-netcdf": [ - "nc", - "cdf" - ], - "application/x-nzb": [ - "nzb" - ], - "application/x-pkcs12": [ - "p12", - "pfx" - ], - "application/x-pkcs7-certificates": [ - "p7b", - "spc" - ], - "application/x-pkcs7-certreqresp": [ - "p7r" - ], - "application/x-rar-compressed": [ - "rar" - ], - "application/x-research-info-systems": [ - "ris" - ], - "application/x-sh": [ - "sh" - ], - "application/x-shar": [ - "shar" - ], - "application/x-shockwave-flash": [ - "swf" - ], - "application/x-silverlight-app": [ - "xap" - ], - "application/x-sql": [ - "sql" - ], - "application/x-stuffit": [ - "sit" - ], - "application/x-stuffitx": [ - "sitx" - ], - "application/x-subrip": [ - "srt" - ], - "application/x-sv4cpio": [ - "sv4cpio" - ], - "application/x-sv4crc": [ - "sv4crc" - ], - "application/x-t3vm-image": [ - "t3" - ], - "application/x-tads": [ - "gam" - ], - "application/x-tar": [ - "tar" - ], - "application/x-tcl": [ - "tcl" - ], - "application/x-tex": [ - "tex" - ], - "application/x-tex-tfm": [ - "tfm" - ], - "application/x-texinfo": [ - "texinfo", - "texi" - ], - "application/x-tgif": [ - "obj" - ], - "application/x-ustar": [ - "ustar" - ], - "application/x-wais-source": [ - "src" - ], - "application/x-x509-ca-cert": [ - "der", - "crt" - ], - "application/x-xfig": [ - "fig" - ], - "application/x-xliff+xml": [ - "xlf" - ], - "application/x-xpinstall": [ - "xpi" - ], - "application/x-xz": [ - "xz" - ], - "application/x-zmachine": [ - "z1", - "z2", - "z3", - "z4", - "z5", - "z6", - "z7", - "z8" - ], - "application/x400-bp": [], - "application/xaml+xml": [ - "xaml" - ], - "application/xcap-att+xml": [], - "application/xcap-caps+xml": [], - "application/xcap-diff+xml": [ - "xdf" - ], - "application/xcap-el+xml": [], - "application/xcap-error+xml": [], - "application/xcap-ns+xml": [], - "application/xcon-conference-info-diff+xml": [], - "application/xcon-conference-info+xml": [], - "application/xenc+xml": [ - "xenc" - ], - "application/xhtml+xml": [ - "xhtml", - "xht" - ], - "application/xhtml-voice+xml": [], - "application/xml": [ - "xml", - "xsl" - ], - "application/xml-dtd": [ - "dtd" - ], - "application/xml-external-parsed-entity": [], - "application/xmpp+xml": [], - "application/xop+xml": [ - "xop" - ], - "application/xproc+xml": [ - "xpl" - ], - "application/xslt+xml": [ - "xslt" - ], - "application/xspf+xml": [ - "xspf" - ], - "application/xv+xml": [ - "mxml", - "xhvml", - "xvml", - "xvm" - ], - "application/yang": [ - "yang" - ], - "application/yin+xml": [ - "yin" - ], - "application/zip": [ - "zip" - ], - "audio/1d-interleaved-parityfec": [], - "audio/32kadpcm": [], - "audio/3gpp": [], - "audio/3gpp2": [], - "audio/ac3": [], - "audio/adpcm": [ - "adp" - ], - "audio/amr": [], - "audio/amr-wb": [], - "audio/amr-wb+": [], - "audio/asc": [], - "audio/atrac-advanced-lossless": [], - "audio/atrac-x": [], - "audio/atrac3": [], - "audio/basic": [ - "au", - "snd" - ], - "audio/bv16": [], - "audio/bv32": [], - "audio/clearmode": [], - "audio/cn": [], - "audio/dat12": [], - "audio/dls": [], - "audio/dsr-es201108": [], - "audio/dsr-es202050": [], - "audio/dsr-es202211": [], - "audio/dsr-es202212": [], - "audio/dv": [], - "audio/dvi4": [], - "audio/eac3": [], - "audio/evrc": [], - "audio/evrc-qcp": [], - "audio/evrc0": [], - "audio/evrc1": [], - "audio/evrcb": [], - "audio/evrcb0": [], - "audio/evrcb1": [], - "audio/evrcwb": [], - "audio/evrcwb0": [], - "audio/evrcwb1": [], - "audio/example": [], - "audio/fwdred": [], - "audio/g719": [], - "audio/g722": [], - "audio/g7221": [], - "audio/g723": [], - "audio/g726-16": [], - "audio/g726-24": [], - "audio/g726-32": [], - "audio/g726-40": [], - "audio/g728": [], - "audio/g729": [], - "audio/g7291": [], - "audio/g729d": [], - "audio/g729e": [], - "audio/gsm": [], - "audio/gsm-efr": [], - "audio/gsm-hr-08": [], - "audio/ilbc": [], - "audio/ip-mr_v2.5": [], - "audio/isac": [], - "audio/l16": [], - "audio/l20": [], - "audio/l24": [], - "audio/l8": [], - "audio/lpc": [], - "audio/midi": [ - "mid", - "midi", - "kar", - "rmi" - ], - "audio/mobile-xmf": [], - "audio/mp4": [ - "mp4a" - ], - "audio/mp4a-latm": [], - "audio/mpa": [], - "audio/mpa-robust": [], - "audio/mpeg": [ - "mpga", - "mp2", - "mp2a", - "mp3", - "m2a", - "m3a" - ], - "audio/mpeg4-generic": [], - "audio/musepack": [], - "audio/ogg": [ - "oga", - "ogg", - "spx" - ], - "audio/opus": [], - "audio/parityfec": [], - "audio/pcma": [], - "audio/pcma-wb": [], - "audio/pcmu-wb": [], - "audio/pcmu": [], - "audio/prs.sid": [], - "audio/qcelp": [], - "audio/red": [], - "audio/rtp-enc-aescm128": [], - "audio/rtp-midi": [], - "audio/rtx": [], - "audio/s3m": [ - "s3m" - ], - "audio/silk": [ - "sil" - ], - "audio/smv": [], - "audio/smv0": [], - "audio/smv-qcp": [], - "audio/sp-midi": [], - "audio/speex": [], - "audio/t140c": [], - "audio/t38": [], - "audio/telephone-event": [], - "audio/tone": [], - "audio/uemclip": [], - "audio/ulpfec": [], - "audio/vdvi": [], - "audio/vmr-wb": [], - "audio/vnd.3gpp.iufp": [], - "audio/vnd.4sb": [], - "audio/vnd.audiokoz": [], - "audio/vnd.celp": [], - "audio/vnd.cisco.nse": [], - "audio/vnd.cmles.radio-events": [], - "audio/vnd.cns.anp1": [], - "audio/vnd.cns.inf1": [], - "audio/vnd.dece.audio": [ - "uva", - "uvva" - ], - "audio/vnd.digital-winds": [ - "eol" - ], - "audio/vnd.dlna.adts": [], - "audio/vnd.dolby.heaac.1": [], - "audio/vnd.dolby.heaac.2": [], - "audio/vnd.dolby.mlp": [], - "audio/vnd.dolby.mps": [], - "audio/vnd.dolby.pl2": [], - "audio/vnd.dolby.pl2x": [], - "audio/vnd.dolby.pl2z": [], - "audio/vnd.dolby.pulse.1": [], - "audio/vnd.dra": [ - "dra" - ], - "audio/vnd.dts": [ - "dts" - ], - "audio/vnd.dts.hd": [ - "dtshd" - ], - "audio/vnd.dvb.file": [], - "audio/vnd.everad.plj": [], - "audio/vnd.hns.audio": [], - "audio/vnd.lucent.voice": [ - "lvp" - ], - "audio/vnd.ms-playready.media.pya": [ - "pya" - ], - "audio/vnd.nokia.mobile-xmf": [], - "audio/vnd.nortel.vbk": [], - "audio/vnd.nuera.ecelp4800": [ - "ecelp4800" - ], - "audio/vnd.nuera.ecelp7470": [ - "ecelp7470" - ], - "audio/vnd.nuera.ecelp9600": [ - "ecelp9600" - ], - "audio/vnd.octel.sbc": [], - "audio/vnd.qcelp": [], - "audio/vnd.rhetorex.32kadpcm": [], - "audio/vnd.rip": [ - "rip" - ], - "audio/vnd.sealedmedia.softseal.mpeg": [], - "audio/vnd.vmx.cvsd": [], - "audio/vorbis": [], - "audio/vorbis-config": [], - "audio/webm": [ - "weba" - ], - "audio/x-aac": [ - "aac" - ], - "audio/x-aiff": [ - "aif", - "aiff", - "aifc" - ], - "audio/x-caf": [ - "caf" - ], - "audio/x-flac": [ - "flac" - ], - "audio/x-matroska": [ - "mka" - ], - "audio/x-mpegurl": [ - "m3u" - ], - "audio/x-ms-wax": [ - "wax" - ], - "audio/x-ms-wma": [ - "wma" - ], - "audio/x-pn-realaudio": [ - "ram", - "ra" - ], - "audio/x-pn-realaudio-plugin": [ - "rmp" - ], - "audio/x-tta": [], - "audio/x-wav": [ - "wav" - ], - "audio/xm": [ - "xm" - ], - "chemical/x-cdx": [ - "cdx" - ], - "chemical/x-cif": [ - "cif" - ], - "chemical/x-cmdf": [ - "cmdf" - ], - "chemical/x-cml": [ - "cml" - ], - "chemical/x-csml": [ - "csml" - ], - "chemical/x-pdb": [], - "chemical/x-xyz": [ - "xyz" - ], - "image/bmp": [ - "bmp" - ], - "image/cgm": [ - "cgm" - ], - "image/example": [], - "image/fits": [], - "image/g3fax": [ - "g3" - ], - "image/gif": [ - "gif" - ], - "image/ief": [ - "ief" - ], - "image/jp2": [], - "image/jpeg": [ - "jpeg", - "jpg", - "jpe" - ], - "image/jpm": [], - "image/jpx": [], - "image/ktx": [ - "ktx" - ], - "image/naplps": [], - "image/png": [ - "png" - ], - "image/prs.btif": [ - "btif" - ], - "image/prs.pti": [], - "image/sgi": [ - "sgi" - ], - "image/svg+xml": [ - "svg", - "svgz" - ], - "image/t38": [], - "image/tiff": [ - "tiff", - "tif" - ], - "image/tiff-fx": [], - "image/vnd.adobe.photoshop": [ - "psd" - ], - "image/vnd.cns.inf2": [], - "image/vnd.dece.graphic": [ - "uvi", - "uvvi", - "uvg", - "uvvg" - ], - "image/vnd.dvb.subtitle": [ - "sub" - ], - "image/vnd.djvu": [ - "djvu", - "djv" - ], - "image/vnd.dwg": [ - "dwg" - ], - "image/vnd.dxf": [ - "dxf" - ], - "image/vnd.fastbidsheet": [ - "fbs" - ], - "image/vnd.fpx": [ - "fpx" - ], - "image/vnd.fst": [ - "fst" - ], - "image/vnd.fujixerox.edmics-mmr": [ - "mmr" - ], - "image/vnd.fujixerox.edmics-rlc": [ - "rlc" - ], - "image/vnd.globalgraphics.pgb": [], - "image/vnd.microsoft.icon": [], - "image/vnd.mix": [], - "image/vnd.ms-modi": [ - "mdi" - ], - "image/vnd.ms-photo": [ - "wdp" - ], - "image/vnd.net-fpx": [ - "npx" - ], - "image/vnd.radiance": [], - "image/vnd.sealed.png": [], - "image/vnd.sealedmedia.softseal.gif": [], - "image/vnd.sealedmedia.softseal.jpg": [], - "image/vnd.svf": [], - "image/vnd.wap.wbmp": [ - "wbmp" - ], - "image/vnd.xiff": [ - "xif" - ], - "image/webp": [ - "webp" - ], - "image/x-3ds": [ - "3ds" - ], - "image/x-cmu-raster": [ - "ras" - ], - "image/x-cmx": [ - "cmx" - ], - "image/x-freehand": [ - "fh", - "fhc", - "fh4", - "fh5", - "fh7" - ], - "image/x-icon": [ - "ico" - ], - "image/x-mrsid-image": [ - "sid" - ], - "image/x-pcx": [ - "pcx" - ], - "image/x-pict": [ - "pic", - "pct" - ], - "image/x-portable-anymap": [ - "pnm" - ], - "image/x-portable-bitmap": [ - "pbm" - ], - "image/x-portable-graymap": [ - "pgm" - ], - "image/x-portable-pixmap": [ - "ppm" - ], - "image/x-rgb": [ - "rgb" - ], - "image/x-tga": [ - "tga" - ], - "image/x-xbitmap": [ - "xbm" - ], - "image/x-xpixmap": [ - "xpm" - ], - "image/x-xwindowdump": [ - "xwd" - ], - "message/cpim": [], - "message/delivery-status": [], - "message/disposition-notification": [], - "message/example": [], - "message/external-body": [], - "message/feedback-report": [], - "message/global": [], - "message/global-delivery-status": [], - "message/global-disposition-notification": [], - "message/global-headers": [], - "message/http": [], - "message/imdn+xml": [], - "message/news": [], - "message/partial": [], - "message/rfc822": [ - "eml", - "mime" - ], - "message/s-http": [], - "message/sip": [], - "message/sipfrag": [], - "message/tracking-status": [], - "message/vnd.si.simp": [], - "model/example": [], - "model/iges": [ - "igs", - "iges" - ], - "model/mesh": [ - "msh", - "mesh", - "silo" - ], - "model/vnd.collada+xml": [ - "dae" - ], - "model/vnd.dwf": [ - "dwf" - ], - "model/vnd.flatland.3dml": [], - "model/vnd.gdl": [ - "gdl" - ], - "model/vnd.gs-gdl": [], - "model/vnd.gs.gdl": [], - "model/vnd.gtw": [ - "gtw" - ], - "model/vnd.moml+xml": [], - "model/vnd.mts": [ - "mts" - ], - "model/vnd.parasolid.transmit.binary": [], - "model/vnd.parasolid.transmit.text": [], - "model/vnd.vtu": [ - "vtu" - ], - "model/vrml": [ - "wrl", - "vrml" - ], - "model/x3d+binary": [ - "x3db", - "x3dbz" - ], - "model/x3d+vrml": [ - "x3dv", - "x3dvz" - ], - "model/x3d+xml": [ - "x3d", - "x3dz" - ], - "multipart/alternative": [], - "multipart/appledouble": [], - "multipart/byteranges": [], - "multipart/digest": [], - "multipart/encrypted": [], - "multipart/example": [], - "multipart/form-data": [], - "multipart/header-set": [], - "multipart/mixed": [], - "multipart/parallel": [], - "multipart/related": [], - "multipart/report": [], - "multipart/signed": [], - "multipart/voice-message": [], - "text/1d-interleaved-parityfec": [], - "text/cache-manifest": [ - "appcache" - ], - "text/calendar": [ - "ics", - "ifb" - ], - "text/css": [ - "css" - ], - "text/csv": [ - "csv" - ], - "text/directory": [], - "text/dns": [], - "text/ecmascript": [], - "text/enriched": [], - "text/example": [], - "text/fwdred": [], - "text/html": [ - "html", - "htm" - ], - "text/javascript": [], - "text/n3": [ - "n3" - ], - "text/parityfec": [], - "text/plain": [ - "txt", - "text", - "conf", - "def", - "list", - "log", - "in" - ], - "text/prs.fallenstein.rst": [], - "text/prs.lines.tag": [ - "dsc" - ], - "text/vnd.radisys.msml-basic-layout": [], - "text/red": [], - "text/rfc822-headers": [], - "text/richtext": [ - "rtx" - ], - "text/rtf": [], - "text/rtp-enc-aescm128": [], - "text/rtx": [], - "text/sgml": [ - "sgml", - "sgm" - ], - "text/t140": [], - "text/tab-separated-values": [ - "tsv" - ], - "text/troff": [ - "t", - "tr", - "roff", - "man", - "me", - "ms" - ], - "text/turtle": [ - "ttl" - ], - "text/ulpfec": [], - "text/uri-list": [ - "uri", - "uris", - "urls" - ], - "text/vcard": [ - "vcard" - ], - "text/vnd.abc": [], - "text/vnd.curl": [ - "curl" - ], - "text/vnd.curl.dcurl": [ - "dcurl" - ], - "text/vnd.curl.scurl": [ - "scurl" - ], - "text/vnd.curl.mcurl": [ - "mcurl" - ], - "text/vnd.dmclientscript": [], - "text/vnd.dvb.subtitle": [ - "sub" - ], - "text/vnd.esmertec.theme-descriptor": [], - "text/vnd.fly": [ - "fly" - ], - "text/vnd.fmi.flexstor": [ - "flx" - ], - "text/vnd.graphviz": [ - "gv" - ], - "text/vnd.in3d.3dml": [ - "3dml" - ], - "text/vnd.in3d.spot": [ - "spot" - ], - "text/vnd.iptc.newsml": [], - "text/vnd.iptc.nitf": [], - "text/vnd.latex-z": [], - "text/vnd.motorola.reflex": [], - "text/vnd.ms-mediapackage": [], - "text/vnd.net2phone.commcenter.command": [], - "text/vnd.si.uricatalogue": [], - "text/vnd.sun.j2me.app-descriptor": [ - "jad" - ], - "text/vnd.trolltech.linguist": [], - "text/vnd.wap.si": [], - "text/vnd.wap.sl": [], - "text/vnd.wap.wml": [ - "wml" - ], - "text/vnd.wap.wmlscript": [ - "wmls" - ], - "text/x-asm": [ - "s", - "asm" - ], - "text/x-c": [ - "c", - "cc", - "cxx", - "cpp", - "h", - "hh", - "dic" - ], - "text/x-fortran": [ - "f", - "for", - "f77", - "f90" - ], - "text/x-java-source": [ - "java" - ], - "text/x-opml": [ - "opml" - ], - "text/x-pascal": [ - "p", - "pas" - ], - "text/x-nfo": [ - "nfo" - ], - "text/x-setext": [ - "etx" - ], - "text/x-sfv": [ - "sfv" - ], - "text/x-uuencode": [ - "uu" - ], - "text/x-vcalendar": [ - "vcs" - ], - "text/x-vcard": [ - "vcf" - ], - "text/xml": [], - "text/xml-external-parsed-entity": [], - "video/1d-interleaved-parityfec": [], - "video/3gpp": [ - "3gp" - ], - "video/3gpp-tt": [], - "video/3gpp2": [ - "3g2" - ], - "video/bmpeg": [], - "video/bt656": [], - "video/celb": [], - "video/dv": [], - "video/example": [], - "video/h261": [ - "h261" - ], - "video/h263": [ - "h263" - ], - "video/h263-1998": [], - "video/h263-2000": [], - "video/h264": [ - "h264" - ], - "video/h264-rcdo": [], - "video/h264-svc": [], - "video/jpeg": [ - "jpgv" - ], - "video/jpeg2000": [], - "video/jpm": [ - "jpm", - "jpgm" - ], - "video/mj2": [ - "mj2", - "mjp2" - ], - "video/mp1s": [], - "video/mp2p": [], - "video/mp2t": [], - "video/mp4": [ - "mp4", - "mp4v", - "mpg4" - ], - "video/mp4v-es": [], - "video/mpeg": [ - "mpeg", - "mpg", - "mpe", - "m1v", - "m2v" - ], - "video/mpeg4-generic": [], - "video/mpv": [], - "video/nv": [], - "video/ogg": [ - "ogv" - ], - "video/parityfec": [], - "video/pointer": [], - "video/quicktime": [ - "qt", - "mov" - ], - "video/raw": [], - "video/rtp-enc-aescm128": [], - "video/rtx": [], - "video/smpte292m": [], - "video/ulpfec": [], - "video/vc1": [], - "video/vnd.cctv": [], - "video/vnd.dece.hd": [ - "uvh", - "uvvh" - ], - "video/vnd.dece.mobile": [ - "uvm", - "uvvm" - ], - "video/vnd.dece.mp4": [], - "video/vnd.dece.pd": [ - "uvp", - "uvvp" - ], - "video/vnd.dece.sd": [ - "uvs", - "uvvs" - ], - "video/vnd.dece.video": [ - "uvv", - "uvvv" - ], - "video/vnd.directv.mpeg": [], - "video/vnd.directv.mpeg-tts": [], - "video/vnd.dlna.mpeg-tts": [], - "video/vnd.dvb.file": [ - "dvb" - ], - "video/vnd.fvt": [ - "fvt" - ], - "video/vnd.hns.video": [], - "video/vnd.iptvforum.1dparityfec-1010": [], - "video/vnd.iptvforum.1dparityfec-2005": [], - "video/vnd.iptvforum.2dparityfec-1010": [], - "video/vnd.iptvforum.2dparityfec-2005": [], - "video/vnd.iptvforum.ttsavc": [], - "video/vnd.iptvforum.ttsmpeg2": [], - "video/vnd.motorola.video": [], - "video/vnd.motorola.videop": [], - "video/vnd.mpegurl": [ - "mxu", - "m4u" - ], - "video/vnd.ms-playready.media.pyv": [ - "pyv" - ], - "video/vnd.nokia.interleaved-multimedia": [], - "video/vnd.nokia.videovoip": [], - "video/vnd.objectvideo": [], - "video/vnd.sealed.mpeg1": [], - "video/vnd.sealed.mpeg4": [], - "video/vnd.sealed.swf": [], - "video/vnd.sealedmedia.softseal.mov": [], - "video/vnd.uvvu.mp4": [ - "uvu", - "uvvu" - ], - "video/vnd.vivo": [ - "viv" - ], - "video/webm": [ - "webm" - ], - "video/x-f4v": [ - "f4v" - ], - "video/x-fli": [ - "fli" - ], - "video/x-flv": [ - "flv" - ], - "video/x-m4v": [ - "m4v" - ], - "video/x-matroska": [ - "mkv", - "mk3d", - "mks" - ], - "video/x-mng": [ - "mng" - ], - "video/x-ms-asf": [ - "asf", - "asx" - ], - "video/x-ms-vob": [ - "vob" - ], - "video/x-ms-wm": [ - "wm" - ], - "video/x-ms-wmv": [ - "wmv" - ], - "video/x-ms-wmx": [ - "wmx" - ], - "video/x-ms-wvx": [ - "wvx" - ], - "video/x-msvideo": [ - "avi" - ], - "video/x-sgi-movie": [ - "movie" - ], - "video/x-smv": [ - "smv" - ], - "x-conference/x-cooltalk": [ - "ice" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json deleted file mode 100644 index ad50d61..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "text/vtt": [ - "vtt" - ], - "application/x-chrome-extension": [ - "crx" - ], - "text/x-component": [ - "htc" - ], - "text/cache-manifest": [ - "manifest" - ], - "application/octet-stream": [ - "buffer" - ], - "application/mp4": [ - "m4p" - ], - "audio/mp4": [ - "m4a" - ], - "video/MP2T": [ - "ts" - ], - "application/x-web-app-manifest+json": [ - "webapp" - ], - "text/x-lua": [ - "lua" - ], - "application/x-lua-bytecode": [ - "luac" - ], - "text/x-markdown": [ - "markdown", - "md", - "mkd" - ], - "text/plain": [ - "ini" - ], - "application/dash+xml": [ - "mdp" - ], - "font/opentype": [ - "otf" - ], - "application/json": [ - "map" - ], - "application/xml": [ - "xsd" - ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json deleted file mode 100644 index bd487f6..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "1.0.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": "https://searchbeam.jit.su" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/mime-types" - }, - "license": "MIT", - "main": "lib", - "devDependencies": { - "co": "3", - "cogent": "0", - "mocha": "1", - "should": "3" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "make test" - }, - "bugs": { - "url": "https://github.com/expressjs/mime-types/issues" - }, - "homepage": "https://github.com/expressjs/mime-types", - "_id": "mime-types@1.0.1", - "_shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "_from": "mime-types@>=1.0.1-0 <1.1.0-0", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/package.json deleted file mode 100644 index 6cdddee..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "type-is", - "description": "Infer the content-type of a request.", - "version": "1.3.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/expressjs/type-is" - }, - "dependencies": { - "media-typer": "0.2.0", - "mime-types": "~1.0.1" - }, - "devDependencies": { - "istanbul": "0.2.11", - "mocha": "*", - "should": "*" - }, - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "test": "mocha --require should --reporter spec --check-leaks --bail test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "d76790909638d4cf1785e09858db5576f91f710f", - "bugs": { - "url": "https://github.com/expressjs/type-is/issues" - }, - "homepage": "https://github.com/expressjs/type-is", - "_id": "type-is@1.3.2", - "_shasum": "4f2a5dc58775ca1630250afc7186f8b36309d1bb", - "_from": "type-is@>=1.3.2-0 <1.4.0-0", - "_npmVersion": "1.4.16", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "4f2a5dc58775ca1630250afc7186f8b36309d1bb", - "tarball": "http://registry.npmjs.org/type-is/-/type-is-1.3.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/type-is/-/type-is-1.3.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/.travis.yml b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/.travis.yml deleted file mode 100644 index af92b02..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: "node_js" -node_js: - - "0.4" - - "0.6" - - "0.8" - - "0.10" diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/LICENSE deleted file mode 100644 index e33bd10..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -(The MIT License) - -Copyright (c) 2013 Jared Hanson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/README.md deleted file mode 100644 index 2f94e9b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# utils-merge - -Merges the properties from a source object into a destination object. - -## Install - - $ npm install utils-merge - -## Usage - -```javascript -var a = { foo: 'bar' } - , b = { bar: 'baz' }; - -merge(a, b); -// => { foo: 'bar', bar: 'baz' } -``` - -## Tests - - $ npm install - $ npm test - -[![Build Status](https://secure.travis-ci.org/jaredhanson/utils-merge.png)](http://travis-ci.org/jaredhanson/utils-merge) - -## Credits - - - [Jared Hanson](http://github.com/jaredhanson) - -## License - -[The MIT License](http://opensource.org/licenses/MIT) - -Copyright (c) 2013 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/index.js deleted file mode 100644 index 4265c69..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/index.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Merge object b with object a. - * - * var a = { foo: 'bar' } - * , b = { bar: 'baz' }; - * - * merge(a, b); - * // => { foo: 'bar', bar: 'baz' } - * - * @param {Object} a - * @param {Object} b - * @return {Object} - * @api public - */ - -exports = module.exports = function(a, b){ - if (a && b) { - for (var key in b) { - a[key] = b[key]; - } - } - return a; -}; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/package.json deleted file mode 100644 index e655383..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "utils-merge", - "version": "1.0.0", - "description": "merge() utility function", - "keywords": [ - "util" - ], - "repository": { - "type": "git", - "url": "git://github.com/jaredhanson/utils-merge.git" - }, - "bugs": { - "url": "http://github.com/jaredhanson/utils-merge/issues" - }, - "author": { - "name": "Jared Hanson", - "email": "jaredhanson@gmail.com", - "url": "http://www.jaredhanson.net/" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://www.opensource.org/licenses/MIT" - } - ], - "main": "./index", - "dependencies": {}, - "devDependencies": { - "mocha": "1.x.x", - "chai": "1.x.x" - }, - "scripts": { - "test": "mocha --reporter spec --require test/bootstrap/node test/*.test.js" - }, - "engines": { - "node": ">= 0.4.0" - }, - "readme": "# utils-merge\n\nMerges the properties from a source object into a destination object.\n\n## Install\n\n $ npm install utils-merge\n\n## Usage\n\n```javascript\nvar a = { foo: 'bar' }\n , b = { bar: 'baz' };\n\nmerge(a, b);\n// => { foo: 'bar', bar: 'baz' }\n```\n\n## Tests\n\n $ npm install\n $ npm test\n\n[![Build Status](https://secure.travis-ci.org/jaredhanson/utils-merge.png)](http://travis-ci.org/jaredhanson/utils-merge)\n\n## Credits\n\n - [Jared Hanson](http://github.com/jaredhanson)\n\n## License\n\n[The MIT License](http://opensource.org/licenses/MIT)\n\nCopyright (c) 2013 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)>\n", - "readmeFilename": "README.md", - "_id": "utils-merge@1.0.0", - "dist": { - "shasum": "0294fb922bb9375153541c4f7096231f287c8af8", - "tarball": "http://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" - }, - "_from": "utils-merge@1.0.0", - "_npmVersion": "1.2.25", - "_npmUser": { - "name": "jaredhanson", - "email": "jaredhanson@gmail.com" - }, - "maintainers": [ - { - "name": "jaredhanson", - "email": "jaredhanson@gmail.com" - } - ], - "directories": {}, - "_shasum": "0294fb922bb9375153541c4f7096231f287c8af8", - "_resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "homepage": "https://github.com/jaredhanson/utils-merge" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/.npmignore b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/History.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/History.md deleted file mode 100644 index 10fb1db..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/History.md +++ /dev/null @@ -1,9 +0,0 @@ -0.1.0 / 2014-06-05 -================== - - * Support array of fields to set - -0.0.0 / 2014-06-04 -================== - - * Initial release diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/README.md deleted file mode 100644 index 6ed2825..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# vary - -[![NPM version](https://badge.fury.io/js/vary.svg)](http://badge.fury.io/js/vary) -[![Build Status](https://travis-ci.org/expressjs/vary.svg?branch=master)](https://travis-ci.org/expressjs/vary) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/vary.svg?branch=master)](https://coveralls.io/r/expressjs/vary) - -Update the Vary header of a response - -## Install - -```sh -$ npm install vary -``` - -## API - -```js -var vary = require('vary') -``` - -### vary(res, field) - -Adds the given header `field` to the `Vary` response header of `res`. -This can be a string of a single field or an array of multiple fields. - -This will append the header if not already listed, otherwise leaves -it listed in the current location. - -```js -vary(res, 'Origin') -vary(res, 'User-Agent') -vary(res, ['Accept', 'Accept-Language', 'Accept-Encoding']) -``` - -## Testing - -```sh -$ npm test -``` - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/index.js deleted file mode 100644 index 6f52730..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/index.js +++ /dev/null @@ -1,79 +0,0 @@ -/*! - * vary - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = vary; - -/** - * Variables. - */ - -var separators = /[\(\)<>@,;:\\"\/\[\]\?=\{\}\u0020\u0009]/; - -/** - * Mark that a request is varied on a header field. - * - * @param {Object} res - * @param {String|Array} field - * @api public - */ - -function vary(res, field) { - if (!res || !res.getHeader || !res.setHeader) { - // quack quack - throw new TypeError('res argument is required'); - } - - if (!field) { - throw new TypeError('field argument is required'); - } - - var fields = !Array.isArray(field) - ? [String(field)] - : field; - - for (var i = 0; i < fields.length; i++) { - if (separators.test(fields[i])) { - throw new TypeError('field argument contains an invalid header'); - } - } - - var val = res.getHeader('Vary') || '' - var headers = Array.isArray(val) - ? val.join(', ') - : String(val); - - // existing unspecified vary - if (headers === '*') { - return; - } - - // enumerate current values - var vals = headers.toLowerCase().split(/ *, */); - - // unspecified vary - if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { - res.setHeader('Vary', '*'); - return; - } - - for (var i = 0; i < fields.length; i++) { - field = fields[i].toLowerCase(); - - // append value (case-preserving) - if (vals.indexOf(field) === -1) { - vals.push(field); - headers = headers - ? headers + ', ' + fields[i] - : fields[i]; - } - } - - res.setHeader('Vary', headers); -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/package.json deleted file mode 100644 index c4937fe..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "vary", - "description": "Update the Vary header of a response", - "version": "0.1.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "http", - "res", - "vary" - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/vary" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.0", - "should": "~4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/vary/issues" - }, - "homepage": "https://github.com/expressjs/vary", - "_id": "vary@0.1.0", - "dist": { - "shasum": "df0945899e93c0cc5bd18cc8321d9d21e74f6176", - "tarball": "http://registry.npmjs.org/vary/-/vary-0.1.0.tgz" - }, - "_from": "vary@0.1.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "df0945899e93c0cc5bd18cc8321d9d21e74f6176", - "_resolved": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/package.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/package.json deleted file mode 100644 index 65ea6d1..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/package.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "name": "express", - "description": "Fast, unopinionated, minimalist web framework", - "version": "4.7.2", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Aaron Heckmann", - "email": "aaron.heckmann+github@gmail.com" - }, - { - "name": "Ciaran Jessup", - "email": "ciaranj@gmail.com" - }, - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Guillermo Rauch", - "email": "rauchg@gmail.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com" - }, - { - "name": "Roman Shtylman", - "email": "shtylman+expressjs@gmail.com" - }, - { - "name": "Young Jae Sim", - "email": "hanul@hanul.me" - } - ], - "keywords": [ - "express", - "framework", - "sinatra", - "web", - "rest", - "restful", - "router", - "app", - "api" - ], - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/express" - }, - "license": "MIT", - "dependencies": { - "accepts": "~1.0.7", - "buffer-crc32": "0.2.3", - "debug": "1.0.4", - "depd": "0.4.4", - "escape-html": "1.0.1", - "finalhandler": "0.1.0", - "media-typer": "0.2.0", - "methods": "1.1.0", - "parseurl": "~1.2.0", - "path-to-regexp": "0.1.3", - "proxy-addr": "1.0.1", - "range-parser": "1.0.0", - "send": "0.7.2", - "serve-static": "~1.4.2", - "type-is": "~1.3.2", - "vary": "0.1.0", - "cookie": "0.1.2", - "fresh": "0.2.2", - "cookie-signature": "1.0.4", - "merge-descriptors": "0.0.2", - "qs": "0.6.6", - "utils-merge": "1.0.0" - }, - "devDependencies": { - "after": "0.8.1", - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.4", - "supertest": "~0.13.0", - "connect-redis": "~2.0.0", - "ejs": "~1.0.0", - "marked": "0.3.2", - "hjs": "~0.0.6", - "body-parser": "~1.5.2", - "cookie-parser": "~1.3.1", - "express-session": "~1.7.2", - "jade": "~1.5.0", - "method-override": "~2.1.1", - "morgan": "~1.2.2", - "multiparty": "~3.3.1", - "vhost": "2.0.0" - }, - "engines": { - "node": ">= 0.10.0" - }, - "scripts": { - "prepublish": "npm prune", - "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/" - }, - "bugs": { - "url": "https://github.com/visionmedia/express/issues" - }, - "homepage": "https://github.com/visionmedia/express", - "_id": "express@4.7.2", - "dist": { - "shasum": "2cbae61efab6c2db72a547ff3bf380e637c08590", - "tarball": "http://registry.npmjs.org/express/-/express-4.7.2.tgz" - }, - "_from": "express@latest", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "aredridel", - "email": "aredridel@nbtsc.org" - } - ], - "directories": {}, - "_shasum": "2cbae61efab6c2db72a547ff3bf380e637c08590", - "_resolved": "https://registry.npmjs.org/express/-/express-4.7.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/test.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/test.js deleted file mode 100644 index cacd7a3..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/node_modules/express/test.js +++ /dev/null @@ -1,8 +0,0 @@ -var app = require('./index')() -app.get('/iamaverylongcomponent/in_a_url/you_said_didnt_work', function (req, res) { - res.send('got long url') -}) -app.get('/IamUSINGcaps', function (req, res) { - res.send('got caps matching') -}) -app.listen(3333) \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/views/home.handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/views/home.handlebars deleted file mode 100644 index d694190..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/views/home.handlebars +++ /dev/null @@ -1 +0,0 @@ -

Example App: Home

diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/views/layouts/main.handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/views/layouts/main.handlebars deleted file mode 100644 index 49aff4b..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/examples/basic/views/layouts/main.handlebars +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Example App - - - - {{{body}}} - - - diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/index.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/index.js deleted file mode 100644 index 5546d21..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/index.js +++ /dev/null @@ -1,13 +0,0 @@ -var ExpressHandlebars = require('./lib/express-handlebars'); - -function exphbs(config) { - return exphbs.create(config).engine; -} - -exphbs.create = function (config) { - return new ExpressHandlebars(config); -}; - -exphbs.ExpressHandlebars = ExpressHandlebars; - -module.exports = exphbs; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/lib/express-handlebars.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/lib/express-handlebars.js deleted file mode 100644 index 099a743..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/lib/express-handlebars.js +++ /dev/null @@ -1,369 +0,0 @@ -var async = require('async'), - fs = require('fs'), - glob = require('glob'), - path = require('path'), - semver = require('semver'); - -// -- Utilites ----------------------------------------------------------------- - -function extend(obj) { - Array.prototype.slice.call(arguments, 1).forEach(function (source) { - if (!source) { return; } - - for (var key in source) { - obj[key] = source[key]; - } - }); - - return obj; -} - -// -- Constructor -------------------------------------------------------------- - -function ExpressHandlebars(config) { - config || (config = {}); - - var handlebars = config.handlebars || require('handlebars'); - - if ('extname' in config) { this.extname = config.extname; } - if ('layoutsDir' in config) { this.layoutsDir = config.layoutsDir; } - if ('partialsDir' in config) { this.partialsDir = config.partialsDir; } - - if(this.extname[0] !== '.') { this.extname = '.' + this.extname; } - - this.defaultLayout = config.defaultLayout; - this.handlebars = handlebars; - this.helpers = config.helpers; - - this.handlebarsVersion = ExpressHandlebars.getHandlebarsSemver(handlebars); - - this.compiled = {}; - this.precompiled = {}; - - this.engine = this.renderView.bind(this); -} - -// -- Statics ------------------------------------------------------------------ - -ExpressHandlebars._dirCache = {}; -ExpressHandlebars._fileCache = {}; -ExpressHandlebars._pendingReads = {}; - -ExpressHandlebars.getHandlebarsSemver = function (handlebars) { - var version = handlebars.VERSION || ''; - - // Makes sure the Handlebars version is a valid semver. - if (version && !semver.valid(version)) { - version = version.replace(/(\d\.\d)\.(\D.*)/, '$1.0-$2'); - } - - return version; -}; - -// -- Prototype ---------------------------------------------------------------- - -extend(ExpressHandlebars.prototype, { - // -- Public Properties ---------------------------------------------------- - - extname : '.handlebars', - layoutsDir : 'views/layouts/', - partialsDir: 'views/partials/', - - // -- Public Methods ------------------------------------------------------- - - loadPartials: function (options, callback) { - if (arguments.length < 2 && typeof options === 'function') { - callback = options; - options = {}; - } - - options || (options = {}); - - function load(dirs, options, callback) { - Array.isArray(dirs) || (dirs = [dirs]); - var loadTemplates = this.loadTemplates.bind(this); - - async.map(dirs, function (dir, callback) { - loadTemplates(dir, options, callback); - }, callback); - } - - function mapPartials(dirs, callback) { - var getPartialName = this._getPartialName.bind(this), - partials; - - partials = dirs.reduce(function (partials, templates) { - Object.keys(templates).forEach(function (filePath) { - partials[getPartialName(filePath)] = templates[filePath]; - }); - - return partials; - }, {}); - - callback(null, partials); - } - - async.waterfall([ - load.bind(this, this.partialsDir, options), - mapPartials.bind(this) - ], callback); - }, - - loadTemplate: function (filePath, options, callback) { - filePath = path.resolve(filePath); - - if (arguments.length < 3 && typeof options === 'function') { - callback = options; - options = {}; - } - - options || (options = {}); - - var precompiled = options.precompiled, - cache = precompiled ? this.precompiled : this.compiled, - template = options.cache && cache[filePath], - compile; - - if (template) { - callback(null, template); - return; - } - - compile = this.handlebars[precompiled ? 'precompile' : 'compile']; - - this._loadFile(filePath, options, function (err, file) { - if (err) { return callback(err); } - - try { - template = cache[filePath] = compile(file); - callback(null, template); - } catch (ex) { - callback(ex); - } - }); - }, - - loadTemplates: function (dirPath, options, callback) { - if (arguments.length < 3 && typeof options === 'function') { - callback = options; - options = {}; - } - - options || (options = {}); - - function load(filePath, callback) { - this.loadTemplate(path.join(dirPath, filePath), options, callback); - } - - function mapTemplates(filePaths, callback) { - async.map(filePaths, load.bind(this), function (err, templates) { - if (err) { return callback(err); } - - var map = filePaths.reduce(function (map, filePath, i) { - map[filePath] = templates[i]; - return map; - }, {}); - - callback(null, map); - }); - } - - async.waterfall([ - this._loadDir.bind(this, dirPath, options), - mapTemplates.bind(this) - ], callback); - }, - - render: function (filePath, options, callback) { - if (arguments.length < 3 && typeof options === 'function') { - callback = options; - options = {}; - } - - options || (options = {}); - - var helpers = extend({}, - this.handlebars.helpers, this.helpers, options.helpers); - - function loadTemplates(callback) { - async.parallel({ - partials: this.loadPartials.bind(this, options), - template: this.loadTemplate.bind(this, filePath, options) - }, callback); - } - - function renderTemplate(templates, callback) { - this._renderTemplate(templates.template, options, { - helpers : helpers, - partials: templates.partials - }, callback); - } - - // Force `{precompiled: false}` option, before passing `options` along - // to `getPartials()` and `getTemplate()` methods. - if (options.precompiled) { - options = extend({}, options, {precompiled: false}); - } - - async.waterfall([ - loadTemplates.bind(this), - renderTemplate.bind(this) - ], callback); - }, - - renderView: function (viewPath, options, callback) { - if (arguments.length < 3 && typeof options === 'function') { - callback = options; - options = {}; - } - - options || (options = {}); - - var layoutPath = this._resolveLayoutPath(options); - - function renderLayout(body, callback) { - var context = extend({}, options, {body: body}); - this.render(layoutPath, context, callback); - } - - // Simple render when no layout is used. - if (!layoutPath) { - this.render.apply(this, arguments); - return; - } - - // Force `{precompiled: false}` option, before passing options along to - // `getPartials()` and `getTemplate()` methods. - if (options.precompiled) { - options = extend({}, options, {precompiled: false}); - } - - async.waterfall([ - this.render.bind(this, viewPath, options), - renderLayout.bind(this) - ], callback); - }, - - // -- Private Methods ------------------------------------------------------ - - _getPartialName: function (filePath) { - var extRegex = new RegExp(this.extname + '$'), - name = filePath.replace(extRegex, ''), - version = this.handlebarsVersion; - - // Fixes a Handlebars bug in versions prior to 1.0.rc.2 which caused - // partials with "/"s in their name to not be found. - // https://github.com/wycats/handlebars.js/pull/389 - if (version && !semver.satisfies(version, '>=1.0.0-rc.2')) { - name = name.replace('/', '.'); - } - - return name; - }, - - _loadDir: function (dirPath, options, callback) { - dirPath = path.resolve(dirPath); - - var dirCache = ExpressHandlebars._dirCache, - pendingReads = ExpressHandlebars._pendingReads, - dir = options.cache && dirCache[dirPath], - callbacks, pattern; - - if (dir) { - callback(null, dir.concat()); - return; - } - - callbacks = pendingReads[dirPath]; - - if (callbacks) { - callbacks.push(callback); - return; - } - - callbacks = pendingReads[dirPath] = [callback]; - pattern = '**/*' + this.extname; - - glob(pattern, {cwd: dirPath}, function (err, dir) { - if (!err) { - dirCache[dirPath] = dir; - } - - while (callbacks.length) { - callbacks.shift().call(null, err, dir && dir.concat()); - } - - delete pendingReads[dirPath]; - }); - }, - - _loadFile: function (filePath, options, callback) { - filePath = path.resolve(filePath); - - var fileCache = ExpressHandlebars._fileCache, - pendingReads = ExpressHandlebars._pendingReads, - file = options.cache && fileCache[filePath], - callbacks; - - if (file) { - callback(null, file); - return; - } - - callbacks = pendingReads[filePath]; - - if (callbacks) { - callbacks.push(callback); - return; - } - - callbacks = pendingReads[filePath] = [callback]; - - fs.readFile(filePath, 'utf8', function (err, file) { - if (!err) { - fileCache[filePath] = file; - } - - while (callbacks.length) { - callbacks.shift().call(null, err, file); - } - - delete pendingReads[filePath]; - }); - }, - - _renderTemplate: function (template, context, options, callback) { - var output; - - try { - output = template(context, options); - callback(null, output); - } catch (ex) { - callback(ex); - } - }, - - _resolveLayoutPath: function (options) { - // Makes sure to interpret falsy `options.layout` values as no layout. - var layoutPath = 'layout' in options ? options.layout : - this.defaultLayout; - - if (!layoutPath) { - return null; - } - - if (!path.extname(layoutPath)) { - layoutPath += this.extname; - } - - if (layoutPath[0] !== '/') { - layoutPath = path.join(this.layoutsDir, layoutPath); - } - - return layoutPath; - } -}); - -// -- Exports ------------------------------------------------------------------ - -module.exports = ExpressHandlebars; diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/.bin/handlebars b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/.bin/handlebars deleted file mode 120000 index fb7d090..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/.bin/handlebars +++ /dev/null @@ -1 +0,0 @@ -../handlebars/bin/handlebars \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/.bin/semver b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/.bin/semver deleted file mode 120000 index 317eb29..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/.bin/semver +++ /dev/null @@ -1 +0,0 @@ -../semver/bin/semver \ No newline at end of file diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/LICENSE b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/LICENSE deleted file mode 100644 index b7f9d50..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Caolan McMahon - -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/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/README.md b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/README.md deleted file mode 100644 index 951f76e..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/README.md +++ /dev/null @@ -1,1425 +0,0 @@ -# Async.js - -Async is a utility module which provides straight-forward, powerful functions -for working with asynchronous JavaScript. Although originally designed for -use with [node.js](http://nodejs.org), it can also be used directly in the -browser. Also supports [component](https://github.com/component/component). - -Async provides around 20 functions that include the usual 'functional' -suspects (map, reduce, filter, each…) as well as some common patterns -for asynchronous control flow (parallel, series, waterfall…). All these -functions assume you follow the node.js convention of providing a single -callback as the last argument of your async function. - - -## Quick Examples - -```javascript -async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file -}); - -async.filter(['file1','file2','file3'], fs.exists, function(results){ - // results now equals an array of the existing files -}); - -async.parallel([ - function(){ ... }, - function(){ ... } -], callback); - -async.series([ - function(){ ... }, - function(){ ... } -]); -``` - -There are many more functions available so take a look at the docs below for a -full list. This module aims to be comprehensive, so if you feel anything is -missing please create a GitHub issue for it. - -## Common Pitfalls - -### Binding a context to an iterator - -This section is really about bind, not about async. If you are wondering how to -make async execute your iterators in a given context, or are confused as to why -a method of another library isn't working as an iterator, study this example: - -```js -// Here is a simple object with an (unnecessarily roundabout) squaring method -var AsyncSquaringLibrary = { - squareExponent: 2, - square: function(number, callback){ - var result = Math.pow(number, this.squareExponent); - setTimeout(function(){ - callback(null, result); - }, 200); - } -}; - -async.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){ - // result is [NaN, NaN, NaN] - // This fails because the `this.squareExponent` expression in the square - // function is not evaluated in the context of AsyncSquaringLibrary, and is - // therefore undefined. -}); - -async.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){ - // result is [1, 4, 9] - // With the help of bind we can attach a context to the iterator before - // passing it to async. Now the square function will be executed in its - // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent` - // will be as expected. -}); -``` - -## Download - -The source is available for download from -[GitHub](http://github.com/caolan/async). -Alternatively, you can install using Node Package Manager (npm): - - npm install async - -__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed - -## In the Browser - -So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage: - -```html - - -``` - -## Documentation - -### Collections - -* [each](#each) -* [eachSeries](#eachSeries) -* [eachLimit](#eachLimit) -* [map](#map) -* [mapSeries](#mapSeries) -* [mapLimit](#mapLimit) -* [filter](#filter) -* [filterSeries](#filterSeries) -* [reject](#reject) -* [rejectSeries](#rejectSeries) -* [reduce](#reduce) -* [reduceRight](#reduceRight) -* [detect](#detect) -* [detectSeries](#detectSeries) -* [sortBy](#sortBy) -* [some](#some) -* [every](#every) -* [concat](#concat) -* [concatSeries](#concatSeries) - -### Control Flow - -* [series](#series) -* [parallel](#parallel) -* [parallelLimit](#parallellimittasks-limit-callback) -* [whilst](#whilst) -* [doWhilst](#doWhilst) -* [until](#until) -* [doUntil](#doUntil) -* [forever](#forever) -* [waterfall](#waterfall) -* [compose](#compose) -* [applyEach](#applyEach) -* [applyEachSeries](#applyEachSeries) -* [queue](#queue) -* [cargo](#cargo) -* [auto](#auto) -* [iterator](#iterator) -* [apply](#apply) -* [nextTick](#nextTick) -* [times](#times) -* [timesSeries](#timesSeries) - -### Utils - -* [memoize](#memoize) -* [unmemoize](#unmemoize) -* [log](#log) -* [dir](#dir) -* [noConflict](#noConflict) - - -## Collections - - - -### each(arr, iterator, callback) - -Applies an iterator function to each item in an array, in parallel. -The iterator is called with an item from the list and a callback for when it -has finished. If the iterator passes an error to this callback, the main -callback for the each function is immediately called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err) which must be called once it has - completed. If no error has occured, the callback should be run without - arguments or with an explicit null argument. -* callback(err) - A callback which is called after all the iterator functions - have finished, or an error has occurred. - -__Example__ - -```js -// assuming openFiles is an array of file names and saveFile is a function -// to save the modified contents of that file: - -async.each(openFiles, saveFile, function(err){ - // if any of the saves produced an error, err would equal that error -}); -``` - ---------------------------------------- - - - -### eachSeries(arr, iterator, callback) - -The same as each only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. This means the iterator functions will complete in order. - - ---------------------------------------- - - - -### eachLimit(arr, limit, iterator, callback) - -The same as each only no more than "limit" iterators will be simultaneously -running at any time. - -Note that the items are not processed in batches, so there is no guarantee that - the first "limit" iterator functions will complete before any others are -started. - -__Arguments__ - -* arr - An array to iterate over. -* limit - The maximum number of iterators to run at any time. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err) which must be called once it has - completed. If no error has occured, the callback should be run without - arguments or with an explicit null argument. -* callback(err) - A callback which is called after all the iterator functions - have finished, or an error has occurred. - -__Example__ - -```js -// Assume documents is an array of JSON objects and requestApi is a -// function that interacts with a rate-limited REST api. - -async.eachLimit(documents, 20, requestApi, function(err){ - // if any of the saves produced an error, err would equal that error -}); -``` - ---------------------------------------- - - -### map(arr, iterator, callback) - -Produces a new array of values by mapping each value in the given array through -the iterator function. The iterator is called with an item from the array and a -callback for when it has finished processing. The callback takes 2 arguments, -an error and the transformed item from the array. If the iterator passes an -error to this callback, the main callback for the map function is immediately -called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order, however -the results array will be in the same order as the original array. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, transformed) which must be called once - it has completed with an error (which can be null) and a transformed item. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array of the - transformed items from the original array. - -__Example__ - -```js -async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file -}); -``` - ---------------------------------------- - - -### mapSeries(arr, iterator, callback) - -The same as map only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - - ---------------------------------------- - - -### mapLimit(arr, limit, iterator, callback) - -The same as map only no more than "limit" iterators will be simultaneously -running at any time. - -Note that the items are not processed in batches, so there is no guarantee that - the first "limit" iterator functions will complete before any others are -started. - -__Arguments__ - -* arr - An array to iterate over. -* limit - The maximum number of iterators to run at any time. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, transformed) which must be called once - it has completed with an error (which can be null) and a transformed item. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array of the - transformed items from the original array. - -__Example__ - -```js -async.mapLimit(['file1','file2','file3'], 1, fs.stat, function(err, results){ - // results is now an array of stats for each file -}); -``` - ---------------------------------------- - - -### filter(arr, iterator, callback) - -__Alias:__ select - -Returns a new array of all the values which pass an async truth test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like fs.exists. This operation is -performed in parallel, but the results array will be in the same order as the -original. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(results) - A callback which is called after all the iterator - functions have finished. - -__Example__ - -```js -async.filter(['file1','file2','file3'], fs.exists, function(results){ - // results now equals an array of the existing files -}); -``` - ---------------------------------------- - - -### filterSeries(arr, iterator, callback) - -__alias:__ selectSeries - -The same as filter only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - ---------------------------------------- - - -### reject(arr, iterator, callback) - -The opposite of filter. Removes values that pass an async truth test. - ---------------------------------------- - - -### rejectSeries(arr, iterator, callback) - -The same as reject, only the iterator is applied to each item in the array -in series. - - ---------------------------------------- - - -### reduce(arr, memo, iterator, callback) - -__aliases:__ inject, foldl - -Reduces a list of values into a single value using an async iterator to return -each successive step. Memo is the initial state of the reduction. This -function only operates in series. For performance reasons, it may make sense to -split a call to this function into a parallel map, then use the normal -Array.prototype.reduce on the results. This function is for situations where -each step in the reduction needs to be async, if you can get the data before -reducing it then it's probably a good idea to do so. - -__Arguments__ - -* arr - An array to iterate over. -* memo - The initial state of the reduction. -* iterator(memo, item, callback) - A function applied to each item in the - array to produce the next step in the reduction. The iterator is passed a - callback(err, reduction) which accepts an optional error as its first - argument, and the state of the reduction as the second. If an error is - passed to the callback, the reduction is stopped and the main callback is - immediately called with the error. -* callback(err, result) - A callback which is called after all the iterator - functions have finished. Result is the reduced value. - -__Example__ - -```js -async.reduce([1,2,3], 0, function(memo, item, callback){ - // pointless async: - process.nextTick(function(){ - callback(null, memo + item) - }); -}, function(err, result){ - // result is now equal to the last value of memo, which is 6 -}); -``` - ---------------------------------------- - - -### reduceRight(arr, memo, iterator, callback) - -__Alias:__ foldr - -Same as reduce, only operates on the items in the array in reverse order. - - ---------------------------------------- - - -### detect(arr, iterator, callback) - -Returns the first value in a list that passes an async truth test. The -iterator is applied in parallel, meaning the first iterator to return true will -fire the detect callback with that result. That means the result might not be -the first item in the original array (in terms of order) that passes the test. - -If order within the original array is important then look at detectSeries. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - the first item in the array that passes the truth test (iterator) or the - value undefined if none passed. - -__Example__ - -```js -async.detect(['file1','file2','file3'], fs.exists, function(result){ - // result now equals the first file in the list that exists -}); -``` - ---------------------------------------- - - -### detectSeries(arr, iterator, callback) - -The same as detect, only the iterator is applied to each item in the array -in series. This means the result is always the first in the original array (in -terms of array order) that passes the truth test. - - ---------------------------------------- - - -### sortBy(arr, iterator, callback) - -Sorts a list by the results of running each value through an async iterator. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, sortValue) which must be called once it - has completed with an error (which can be null) and a value to use as the sort - criteria. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is the items from - the original array sorted by the values returned by the iterator calls. - -__Example__ - -```js -async.sortBy(['file1','file2','file3'], function(file, callback){ - fs.stat(file, function(err, stats){ - callback(err, stats.mtime); - }); -}, function(err, results){ - // results is now the original array of files sorted by - // modified date -}); -``` - ---------------------------------------- - - -### some(arr, iterator, callback) - -__Alias:__ any - -Returns true if at least one element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like fs.exists. Once any iterator -call returns true, the main callback is immediately called. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - either true or false depending on the values of the async tests. - -__Example__ - -```js -async.some(['file1','file2','file3'], fs.exists, function(result){ - // if result is true then at least one of the files exists -}); -``` - ---------------------------------------- - - -### every(arr, iterator, callback) - -__Alias:__ all - -Returns true if every element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like fs.exists. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(result) - A callback which is called after all the iterator - functions have finished. Result will be either true or false depending on - the values of the async tests. - -__Example__ - -```js -async.every(['file1','file2','file3'], fs.exists, function(result){ - // if result is true then every file exists -}); -``` - ---------------------------------------- - - -### concat(arr, iterator, callback) - -Applies an iterator to each item in a list, concatenating the results. Returns the -concatenated list. The iterators are called in parallel, and the results are -concatenated as they return. There is no guarantee that the results array will -be returned in the original order of the arguments passed to the iterator function. - -__Arguments__ - -* arr - An array to iterate over -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, results) which must be called once it - has completed with an error (which can be null) and an array of results. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array containing - the concatenated results of the iterator function. - -__Example__ - -```js -async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){ - // files is now a list of filenames that exist in the 3 directories -}); -``` - ---------------------------------------- - - -### concatSeries(arr, iterator, callback) - -Same as async.concat, but executes in series instead of parallel. - - -## Control Flow - - -### series(tasks, [callback]) - -Run an array of functions in series, each one running once the previous -function has completed. If any functions in the series pass an error to its -callback, no more functions are run and the callback for the series is -immediately called with the value of the error. Once the tasks have completed, -the results are passed to the final callback as an array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.series. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback(err, result) it must call on completion with an error (which can - be null) and an optional result value. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - -__Example__ - -```js -async.series([ - function(callback){ - // do some stuff ... - callback(null, 'one'); - }, - function(callback){ - // do some more stuff ... - callback(null, 'two'); - } -], -// optional callback -function(err, results){ - // results is now equal to ['one', 'two'] -}); - - -// an example using an object instead of an array -async.series({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - } -}, -function(err, results) { - // results is now equal to: {one: 1, two: 2} -}); -``` - ---------------------------------------- - - -### parallel(tasks, [callback]) - -Run an array of functions in parallel, without waiting until the previous -function has completed. If any of the functions pass an error to its -callback, the main callback is immediately called with the value of the error. -Once the tasks have completed, the results are passed to the final callback as an -array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.parallel. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback(err, result) it must call on completion with an error (which can - be null) and an optional result value. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - -__Example__ - -```js -async.parallel([ - function(callback){ - setTimeout(function(){ - callback(null, 'one'); - }, 200); - }, - function(callback){ - setTimeout(function(){ - callback(null, 'two'); - }, 100); - } -], -// optional callback -function(err, results){ - // the results array will equal ['one','two'] even though - // the second function had a shorter timeout. -}); - - -// an example using an object instead of an array -async.parallel({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - } -}, -function(err, results) { - // results is now equals to: {one: 1, two: 2} -}); -``` - ---------------------------------------- - - -### parallelLimit(tasks, limit, [callback]) - -The same as parallel only the tasks are executed in parallel with a maximum of "limit" -tasks executing at any time. - -Note that the tasks are not executed in batches, so there is no guarantee that -the first "limit" tasks will complete before any others are started. - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback(err, result) it must call on completion with an error (which can - be null) and an optional result value. -* limit - The maximum number of tasks to run at any time. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - ---------------------------------------- - - -### whilst(test, fn, callback) - -Repeatedly call fn, while test returns true. Calls the callback when stopped, -or an error occurs. - -__Arguments__ - -* test() - synchronous truth test to perform before each execution of fn. -* fn(callback) - A function to call each time the test passes. The function is - passed a callback(err) which must be called once it has completed with an - optional error argument. -* callback(err) - A callback which is called after the test fails and repeated - execution of fn has stopped. - -__Example__ - -```js -var count = 0; - -async.whilst( - function () { return count < 5; }, - function (callback) { - count++; - setTimeout(callback, 1000); - }, - function (err) { - // 5 seconds have passed - } -); -``` - ---------------------------------------- - - -### doWhilst(fn, test, callback) - -The post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. - ---------------------------------------- - - -### until(test, fn, callback) - -Repeatedly call fn, until test returns true. Calls the callback when stopped, -or an error occurs. - -The inverse of async.whilst. - ---------------------------------------- - - -### doUntil(fn, test, callback) - -Like doWhilst except the test is inverted. Note the argument ordering differs from `until`. - ---------------------------------------- - - -### forever(fn, callback) - -Calls the asynchronous function 'fn' repeatedly, in series, indefinitely. -If an error is passed to fn's callback then 'callback' is called with the -error, otherwise it will never be called. - ---------------------------------------- - - -### waterfall(tasks, [callback]) - -Runs an array of functions in series, each passing their results to the next in -the array. However, if any of the functions pass an error to the callback, the -next function is not executed and the main callback is immediately called with -the error. - -__Arguments__ - -* tasks - An array of functions to run, each function is passed a - callback(err, result1, result2, ...) it must call on completion. The first - argument is an error (which can be null) and any further arguments will be - passed as arguments in order to the next task. -* callback(err, [results]) - An optional callback to run once all the functions - have completed. This will be passed the results of the last task's callback. - - - -__Example__ - -```js -async.waterfall([ - function(callback){ - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - callback(null, 'three'); - }, - function(arg1, callback){ - // arg1 now equals 'three' - callback(null, 'done'); - } -], function (err, result) { - // result now equals 'done' -}); -``` - ---------------------------------------- - -### compose(fn1, fn2...) - -Creates a function which is a composition of the passed asynchronous -functions. Each function consumes the return value of the function that -follows. Composing functions f(), g() and h() would produce the result of -f(g(h())), only this version uses callbacks to obtain the return values. - -Each function is executed with the `this` binding of the composed function. - -__Arguments__ - -* functions... - the asynchronous functions to compose - - -__Example__ - -```js -function add1(n, callback) { - setTimeout(function () { - callback(null, n + 1); - }, 10); -} - -function mul3(n, callback) { - setTimeout(function () { - callback(null, n * 3); - }, 10); -} - -var add1mul3 = async.compose(mul3, add1); - -add1mul3(4, function (err, result) { - // result now equals 15 -}); -``` - ---------------------------------------- - -### applyEach(fns, args..., callback) - -Applies the provided arguments to each function in the array, calling the -callback after all functions have completed. If you only provide the first -argument then it will return a function which lets you pass in the -arguments as if it were a single function call. - -__Arguments__ - -* fns - the asynchronous functions to all call with the same arguments -* args... - any number of separate arguments to pass to the function -* callback - the final argument should be the callback, called when all - functions have completed processing - - -__Example__ - -```js -async.applyEach([enableSearch, updateSchema], 'bucket', callback); - -// partial application example: -async.each( - buckets, - async.applyEach([enableSearch, updateSchema]), - callback -); -``` - ---------------------------------------- - - -### applyEachSeries(arr, iterator, callback) - -The same as applyEach only the functions are applied in series. - ---------------------------------------- - - -### queue(worker, concurrency) - -Creates a queue object with the specified concurrency. Tasks added to the -queue will be processed in parallel (up to the concurrency limit). If all -workers are in progress, the task is queued until one is available. Once -a worker has completed a task, the task's callback is called. - -__Arguments__ - -* worker(task, callback) - An asynchronous function for processing a queued - task, which must call its callback(err) argument when finished, with an - optional error as an argument. -* concurrency - An integer for determining how many worker functions should be - run in parallel. - -__Queue objects__ - -The queue object returned by this function has the following properties and -methods: - -* length() - a function returning the number of items waiting to be processed. -* concurrency - an integer for determining how many worker functions should be - run in parallel. This property can be changed after a queue is created to - alter the concurrency on-the-fly. -* push(task, [callback]) - add a new task to the queue, the callback is called - once the worker has finished processing the task. - instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list. -* unshift(task, [callback]) - add a new task to the front of the queue. -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued -* empty - a callback that is called when the last item from the queue is given to a worker -* drain - a callback that is called when the last item from the queue has returned from the worker - -__Example__ - -```js -// create a queue object with concurrency 2 - -var q = async.queue(function (task, callback) { - console.log('hello ' + task.name); - callback(); -}, 2); - - -// assign a callback -q.drain = function() { - console.log('all items have been processed'); -} - -// add some items to the queue - -q.push({name: 'foo'}, function (err) { - console.log('finished processing foo'); -}); -q.push({name: 'bar'}, function (err) { - console.log('finished processing bar'); -}); - -// add some items to the queue (batch-wise) - -q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) { - console.log('finished processing bar'); -}); - -// add some items to the front of the queue - -q.unshift({name: 'bar'}, function (err) { - console.log('finished processing bar'); -}); -``` - ---------------------------------------- - - -### cargo(worker, [payload]) - -Creates a cargo object with the specified payload. Tasks added to the -cargo will be processed altogether (up to the payload limit). If the -worker is in progress, the task is queued until it is available. Once -the worker has completed some tasks, each callback of those tasks is called. - -__Arguments__ - -* worker(tasks, callback) - An asynchronous function for processing an array of - queued tasks, which must call its callback(err) argument when finished, with - an optional error as an argument. -* payload - An optional integer for determining how many tasks should be - processed per round; if omitted, the default is unlimited. - -__Cargo objects__ - -The cargo object returned by this function has the following properties and -methods: - -* length() - a function returning the number of items waiting to be processed. -* payload - an integer for determining how many tasks should be - process per round. This property can be changed after a cargo is created to - alter the payload on-the-fly. -* push(task, [callback]) - add a new task to the queue, the callback is called - once the worker has finished processing the task. - instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list. -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued -* empty - a callback that is called when the last item from the queue is given to a worker -* drain - a callback that is called when the last item from the queue has returned from the worker - -__Example__ - -```js -// create a cargo object with payload 2 - -var cargo = async.cargo(function (tasks, callback) { - for(var i=0; i -### auto(tasks, [callback]) - -Determines the best order for running functions based on their requirements. -Each function can optionally depend on other functions being completed first, -and each function is run as soon as its requirements are satisfied. If any of -the functions pass an error to their callback, that function will not complete -(so any other functions depending on it will not run) and the main callback -will be called immediately with the error. Functions also receive an object -containing the results of functions which have completed so far. - -Note, all functions are called with a results object as a second argument, -so it is unsafe to pass functions in the tasks object which cannot handle the -extra argument. For example, this snippet of code: - -```js -async.auto({ - readData: async.apply(fs.readFile, 'data.txt', 'utf-8') -}, callback); -``` - -will have the effect of calling readFile with the results object as the last -argument, which will fail: - -```js -fs.readFile('data.txt', 'utf-8', cb, {}); -``` - -Instead, wrap the call to readFile in a function which does not forward the -results object: - -```js -async.auto({ - readData: function(cb, results){ - fs.readFile('data.txt', 'utf-8', cb); - } -}, callback); -``` - -__Arguments__ - -* tasks - An object literal containing named functions or an array of - requirements, with the function itself the last item in the array. The key - used for each function or array is used when specifying requirements. The - function receives two arguments: (1) a callback(err, result) which must be - called when finished, passing an error (which can be null) and the result of - the function's execution, and (2) a results object, containing the results of - the previously executed functions. -* callback(err, results) - An optional callback which is called when all the - tasks have been completed. The callback will receive an error as an argument - if any tasks pass an error to their callback. Results will always be passed - but if an error occurred, no other tasks will be performed, and the results - object will only contain partial results. - - -__Example__ - -```js -async.auto({ - get_data: function(callback){ - // async code to get some data - }, - make_folder: function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - }, - write_file: ['get_data', 'make_folder', function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - callback(null, filename); - }], - email_link: ['write_file', function(callback, results){ - // once the file is written let's email a link to it... - // results.write_file contains the filename returned by write_file. - }] -}); -``` - -This is a fairly trivial example, but to do this using the basic parallel and -series functions would look like this: - -```js -async.parallel([ - function(callback){ - // async code to get some data - }, - function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - } -], -function(err, results){ - async.series([ - function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - }, - function(callback){ - // once the file is written let's email a link to it... - } - ]); -}); -``` - -For a complicated series of async tasks using the auto function makes adding -new tasks much easier and makes the code more readable. - - ---------------------------------------- - - -### iterator(tasks) - -Creates an iterator function which calls the next function in the array, -returning a continuation to call the next one after that. It's also possible to -'peek' the next iterator by doing iterator.next(). - -This function is used internally by the async module but can be useful when -you want to manually control the flow of functions in series. - -__Arguments__ - -* tasks - An array of functions to run. - -__Example__ - -```js -var iterator = async.iterator([ - function(){ sys.p('one'); }, - function(){ sys.p('two'); }, - function(){ sys.p('three'); } -]); - -node> var iterator2 = iterator(); -'one' -node> var iterator3 = iterator2(); -'two' -node> iterator3(); -'three' -node> var nextfn = iterator2.next(); -node> nextfn(); -'three' -``` - ---------------------------------------- - - -### apply(function, arguments..) - -Creates a continuation function with some arguments already applied, a useful -shorthand when combined with other control flow functions. Any arguments -passed to the returned function are added to the arguments originally passed -to apply. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to automatically apply when the - continuation is called. - -__Example__ - -```js -// using apply - -async.parallel([ - async.apply(fs.writeFile, 'testfile1', 'test1'), - async.apply(fs.writeFile, 'testfile2', 'test2'), -]); - - -// the same process without using apply - -async.parallel([ - function(callback){ - fs.writeFile('testfile1', 'test1', callback); - }, - function(callback){ - fs.writeFile('testfile2', 'test2', callback); - } -]); -``` - -It's possible to pass any number of additional arguments when calling the -continuation: - -```js -node> var fn = async.apply(sys.puts, 'one'); -node> fn('two', 'three'); -one -two -three -``` - ---------------------------------------- - - -### nextTick(callback) - -Calls the callback on a later loop around the event loop. In node.js this just -calls process.nextTick, in the browser it falls back to setImmediate(callback) -if available, otherwise setTimeout(callback, 0), which means other higher priority -events may precede the execution of the callback. - -This is used internally for browser-compatibility purposes. - -__Arguments__ - -* callback - The function to call on a later loop around the event loop. - -__Example__ - -```js -var call_order = []; -async.nextTick(function(){ - call_order.push('two'); - // call_order now equals ['one','two'] -}); -call_order.push('one') -``` - - -### times(n, callback) - -Calls the callback n times and accumulates results in the same manner -you would use with async.map. - -__Arguments__ - -* n - The number of times to run the function. -* callback - The function to call n times. - -__Example__ - -```js -// Pretend this is some complicated async factory -var createUser = function(id, callback) { - callback(null, { - id: 'user' + id - }) -} -// generate 5 users -async.times(5, function(n, next){ - createUser(n, function(err, user) { - next(err, user) - }) -}, function(err, users) { - // we should now have 5 users -}); -``` - - -### timesSeries(n, callback) - -The same as times only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - - -## Utils - - -### memoize(fn, [hasher]) - -Caches the results of an async function. When creating a hash to store function -results against, the callback is omitted from the hash and an optional hash -function can be used. - -The cache of results is exposed as the `memo` property of the function returned -by `memoize`. - -__Arguments__ - -* fn - the function you to proxy and cache results from. -* hasher - an optional function for generating a custom hash for storing - results, it has all the arguments applied to it apart from the callback, and - must be synchronous. - -__Example__ - -```js -var slow_fn = function (name, callback) { - // do something - callback(null, result); -}; -var fn = async.memoize(slow_fn); - -// fn can now be used as if it were slow_fn -fn('some name', function () { - // callback -}); -``` - - -### unmemoize(fn) - -Undoes a memoized function, reverting it to the original, unmemoized -form. Comes handy in tests. - -__Arguments__ - -* fn - the memoized function - - -### log(function, arguments) - -Logs the result of an async function to the console. Only works in node.js or -in browsers that support console.log and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.log is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - -```js -var hello = function(name, callback){ - setTimeout(function(){ - callback(null, 'hello ' + name); - }, 1000); -}; -``` -```js -node> async.log(hello, 'world'); -'hello world' -``` - ---------------------------------------- - - -### dir(function, arguments) - -Logs the result of an async function to the console using console.dir to -display the properties of the resulting object. Only works in node.js or -in browsers that support console.dir and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.dir is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - -```js -var hello = function(name, callback){ - setTimeout(function(){ - callback(null, {hello: name}); - }, 1000); -}; -``` -```js -node> async.dir(hello, 'world'); -{hello: 'world'} -``` - ---------------------------------------- - - -### noConflict() - -Changes the value of async back to its original value, returning a reference to the -async object. diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/component.json b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/component.json deleted file mode 100644 index bbb0115..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/component.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "async", - "repo": "caolan/async", - "description": "Higher-order functions and common patterns for asynchronous code", - "version": "0.1.23", - "keywords": [], - "dependencies": {}, - "development": {}, - "main": "lib/async.js", - "scripts": [ "lib/async.js" ] -} diff --git a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/lib/async.js b/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/lib/async.js deleted file mode 100755 index 1eebb15..0000000 --- a/Excersizes/Build A Static Site With Express (Class 7) /node_modules/express3-handlebars/node_modules/async/lib/async.js +++ /dev/null @@ -1,958 +0,0 @@ -/*global setImmediate: false, setTimeout: false, console: false */ -(function () { - - var async = {}; - - // global on the server, window in the browser - var root, previous_async; - - root = this; - if (root != null) { - previous_async = root.async; - } - - async.noConflict = function () { - root.async = previous_async; - return async; - }; - - function only_once(fn) { - var called = false; - return function() { - if (called) throw new Error("Callback was already called."); - called = true; - fn.apply(root, arguments); - } - } - - //// cross-browser compatiblity functions //// - - var _each = function (arr, iterator) { - if (arr.forEach) { - return arr.forEach(iterator); - } - for (var i = 0; i < arr.length; i += 1) { - iterator(arr[i], i, arr); - } - }; - - var _map = function (arr, iterator) { - if (arr.map) { - return arr.map(iterator); - } - var results = []; - _each(arr, function (x, i, a) { - results.push(iterator(x, i, a)); - }); - return results; - }; - - var _reduce = function (arr, iterator, memo) { - if (arr.reduce) { - return arr.reduce(iterator, memo); - } - _each(arr, function (x, i, a) { - memo = iterator(memo, x, i, a); - }); - return memo; - }; - - var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; - }; - - //// exported async module functions //// - - //// nextTick implementation with browser-compatible fallback //// - if (typeof process === 'undefined' || !(process.nextTick)) { - if (typeof setImmediate === 'function') { - async.nextTick = function (fn) { - // not a direct alias for IE10 compatibility - setImmediate(fn); - }; - async.setImmediate = async.nextTick; - } - else { - async.nextTick = function (fn) { - setTimeout(fn, 0); - }; - async.setImmediate = async.nextTick; - } - } - else { - async.nextTick = process.nextTick; - if (typeof setImmediate !== 'undefined') { - async.setImmediate = function (fn) { - // not a direct alias for IE10 compatibility - setImmediate(fn); - }; - } - else { - async.setImmediate = async.nextTick; - } - } - - async.each = function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length) { - return callback(); - } - var completed = 0; - _each(arr, function (x) { - iterator(x, only_once(function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed >= arr.length) { - callback(null); - } - } - })); - }); - }; - async.forEach = async.each; - - async.eachSeries = function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length) { - return callback(); - } - var completed = 0; - var iterate = function () { - iterator(arr[completed], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed >= arr.length) { - callback(null); - } - else { - iterate(); - } - } - }); - }; - iterate(); - }; - async.forEachSeries = async.eachSeries; - - async.eachLimit = function (arr, limit, iterator, callback) { - var fn = _eachLimit(limit); - fn.apply(null, [arr, iterator, callback]); - }; - async.forEachLimit = async.eachLimit; - - var _eachLimit = function (limit) { - - return function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length || limit <= 0) { - return callback(); - } - var completed = 0; - var started = 0; - var running = 0; - - (function replenish () { - if (completed >= arr.length) { - return callback(); - } - - while (running < limit && started < arr.length) { - started += 1; - running += 1; - iterator(arr[started - 1], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - running -= 1; - if (completed >= arr.length) { - callback(); - } - else { - replenish(); - } - } - }); - } - })(); - }; - }; - - - var doParallel = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.each].concat(args)); - }; - }; - var doParallelLimit = function(limit, fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [_eachLimit(limit)].concat(args)); - }; - }; - var doSeries = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.eachSeries].concat(args)); - }; - }; - - - var _asyncMap = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (err, v) { - results[x.index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - }; - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - async.mapLimit = function (arr, limit, iterator, callback) { - return _mapLimit(limit)(arr, iterator, callback); - }; - - var _mapLimit = function(limit) { - return doParallelLimit(limit, _asyncMap); - }; - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.reduce = function (arr, memo, iterator, callback) { - async.eachSeries(arr, function (x, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - // inject alias - async.inject = async.reduce; - // foldl alias - async.foldl = async.reduce; - - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, function (x) { - return x; - }).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - // foldr alias - async.foldr = async.reduceRight; - - var _filter = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.filter = doParallel(_filter); - async.filterSeries = doSeries(_filter); - // select alias - async.select = async.filter; - async.selectSeries = async.filterSeries; - - var _reject = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (!v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.reject = doParallel(_reject); - async.rejectSeries = doSeries(_reject); - - var _detect = function (eachfn, arr, iterator, main_callback) { - eachfn(arr, function (x, callback) { - iterator(x, function (result) { - if (result) { - main_callback(x); - main_callback = function () {}; - } - else { - callback(); - } - }); - }, function (err) { - main_callback(); - }); - }; - async.detect = doParallel(_detect); - async.detectSeries = doSeries(_detect); - - async.some = function (arr, iterator, main_callback) { - async.each(arr, function (x, callback) { - iterator(x, function (v) { - if (v) { - main_callback(true); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(false); - }); - }; - // any alias - async.any = async.some; - - async.every = function (arr, iterator, main_callback) { - async.each(arr, function (x, callback) { - iterator(x, function (v) { - if (!v) { - main_callback(false); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(true); - }); - }; - // all alias - async.all = async.every; - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - var fn = function (left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var results = {}; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _each(listeners.slice(0), function (fn) { - fn(); - }); - }; - - addListener(function () { - if (_keys(results).length === keys.length) { - callback(null, results); - callback = function () {}; - } - }); - - _each(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - if (err) { - var safeResults = {}; - _each(_keys(results), function(rkey) { - safeResults[rkey] = results[rkey]; - }); - safeResults[k] = args; - callback(err, safeResults); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - results[k] = args; - async.setImmediate(taskComplete); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && results.hasOwnProperty(x)); - }, true) && !results.hasOwnProperty(k); - }; - if (ready()) { - task[task.length - 1](taskCallback, results); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback, results); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor !== Array) { - var err = new Error('First argument to waterfall must be an array of functions'); - return callback(err); - } - if (!tasks.length) { - return callback(); - } - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback.apply(null, arguments); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.setImmediate(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - var _parallel = function(eachfn, tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - eachfn.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - eachfn.each(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.parallel = function (tasks, callback) { - _parallel({ map: async.map, each: async.each }, tasks, callback); - }; - - async.parallelLimit = function(tasks, limit, callback) { - _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback); - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.eachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.doWhilst = function (iterator, test, callback) { - iterator(function (err) { - if (err) { - return callback(err); - } - if (test()) { - async.doWhilst(iterator, test, callback); - } - else { - callback(); - } - }); - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.doUntil = function (iterator, test, callback) { - iterator(function (err) { - if (err) { - return callback(err); - } - if (!test()) { - async.doUntil(iterator, test, callback); - } - else { - callback(); - } - }); - }; - - async.queue = function (worker, concurrency) { - if (concurrency === undefined) { - concurrency = 1; - } - function _insert(q, data, pos, callback) { - if(data.constructor !== Array) { - data = [data]; - } - _each(data, function(task) { - var item = { - data: task, - callback: typeof callback === 'function' ? callback : null - }; - - if (pos) { - q.tasks.unshift(item); - } else { - q.tasks.push(item); - } - - if (q.saturated && q.tasks.length === concurrency) { - q.saturated(); - } - async.setImmediate(q.process); - }); - } - - var workers = 0; - var q = { - tasks: [], - concurrency: concurrency, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - _insert(q, data, false, callback); - }, - unshift: function (data, callback) { - _insert(q, data, true, callback); - }, - process: function () { - if (workers < q.concurrency && q.tasks.length) { - var task = q.tasks.shift(); - if (q.empty && q.tasks.length === 0) { - q.empty(); - } - workers += 1; - var next = function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - if (q.drain && q.tasks.length + workers === 0) { - q.drain(); - } - q.process(); - }; - var cb = only_once(next); - worker(task.data, cb); - } - }, - length: function () { - return q.tasks.length; - }, - running: function () { - return workers; - } - }; - return q; - }; - - async.cargo = function (worker, payload) { - var working = false, - tasks = []; - - var cargo = { - tasks: tasks, - payload: payload, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - if(data.constructor !== Array) { - data = [data]; - } - _each(data, function(task) { - tasks.push({ - data: task, - callback: typeof callback === 'function' ? callback : null - }); - if (cargo.saturated && tasks.length === payload) { - cargo.saturated(); - } - }); - async.setImmediate(cargo.process); - }, - process: function process() { - if (working) return; - if (tasks.length === 0) { - if(cargo.drain) cargo.drain(); - return; - } - - var ts = typeof payload === 'number' - ? tasks.splice(0, payload) - : tasks.splice(0); - - var ds = _map(ts, function (task) { - return task.data; - }); - - if(cargo.empty) cargo.empty(); - working = true; - worker(ds, function () { - working = false; - - var args = arguments; - _each(ts, function (data) { - if (data.callback) { - data.callback.apply(null, args); - } - }); - - process(); - }); - }, - length: function () { - return tasks.length; - }, - running: function () { - return working; - } - }; - return cargo; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _each(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - var queues = {}; - hasher = hasher || function (x) { - return x; - }; - var memoized = function () { - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - var key = hasher.apply(null, args); - if (key in memo) { - callback.apply(null, memo[key]); - } - else if (key in queues) { - queues[key].push(callback); - } - else { - queues[key] = [callback]; - fn.apply(null, args.concat([function () { - memo[key] = arguments; - var q = queues[key]; - delete queues[key]; - for (var i = 0, l = q.length; i < l; i++) { - q[i].apply(null, arguments); - } - }])); - } - }; - memoized.memo = memo; - memoized.unmemoized = fn; - return memoized; - }; - - async.unmemoize = function (fn) { - return function () { - return (fn.unmemoized || fn).apply(null, arguments); - }; - }; - - async.times = function (count, iterator, callback) { - var counter = []; - for (var i = 0; i < count; i++) { - counter.push(i); - } - return async.map(counter, iterator, callback); - }; - - async.timesSeries = function (count, iterator, callback) { - var counter = []; - for (var i = 0; i < count; i++) { - counter.push(i); - } - return async.mapSeries(counter, iterator, callback); - }; - - async.compose = function (/* functions... */) { - var fns = Array.prototype.reverse.call(arguments); - return function () { - var that = this; - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - async.reduce(fns, args, function (newargs, fn, cb) { - fn.apply(that, newargs.concat([function () { - var err = arguments[0]; - var nextargs = Array.prototype.slice.call(arguments, 1); - cb(err, nextargs); - }])) - }, - function (err, results) { - callback.apply(that, [err].concat(results)); - }); - }; - }; - - var _applyEach = function (eachfn, fns /*args...*/) { - var go = function () { - var that = this; - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - return eachfn(fns, function (fn, cb) { - fn.apply(that, args.concat([cb])); - }, - callback); - }; - if (arguments.length > 2) { - var args = Array.prototype.slice.call(arguments, 2); - return go.apply(this, args); - } - else { - return go; - } - }; - async.applyEach = doParallel(_applyEach); - async.applyEachSeries = doSeries(_applyEach); - - async.forever = function (fn, callback) { - function next(err) { - if (err) { - if (callback) { - return callback(err); - } - throw err; - } - fn(next); - } - next(); - }; - - // AMD / RequireJS - if (typeof define !== 'undefined' && define.amd) { - define([], function () { - return async; - }); - } - // Node.js - else if (typeof module !== 'undefined' && module.exports) { - module.exports = async; - } - // included directly via - - -
- -
-
-
-
-
- {{{body}}} -
- - - \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/.DS_Store b/Excersizes/Loading Dynamic Content (Class 8)/.DS_Store deleted file mode 100644 index 44be5ae72c18cf98ed009c63dea757007bf05919..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHLO>7fK6n+x|*g(pL1PGy(7IFcRLrAF73&NQ6hgMY#8-=8Vy8AP+M_uo%cGod! z>Wy7ib*B;VDh%Mel1vsbmz9pg%wr8oB~D-m^t3>~h~%T0Lq8Gy?<4fVe)G*aenS>?o9%4jg0&fH;g|*>H|^fb=m_ETz~{ zC|xn8svbz{O41U8D0kGG!W^-bVn?BJ2cq18q$`uOLLqW>^fRS7kdi_@Y6dg|{S1iO z{SXAQYNxsSokHx_&RZ^TgwoAzE&MS6O@6MMv_qXS^v&?9#YK&juL1MFjMj6+&8!Yg6tIV5$7q3|=-VNp@ z^{R2S644EGt=IuwW-)V^&yvkTQGBY#@vW`7+1IAcx!Lx#xivpOGi_d&n{T&`yM@BZ zv#(x$cQtI^{p#y)zWwg|AAY?rHjS6G^wI}o>ihQi0B1Q)n7fg3LjLM<^2jhUtQ;D7 z>98?+WNiHCvEvgbCQrWn%H*V3HO3s<{je5^{aoQbkIH_Nt}vGe7W;^WVd`BQ-y%|v&+^j{+TU=j{X|hr^4##f9eZRtEmM|WyX0)qoG5%p! z6WX{MtaDsZaJd)?vv`?CF=C(p%Bmejc2J|`&0D_hP=7Hf^CaO7VJV{FM$&&pu4IL_ z%Yxd}rN@fOsZymoIg?JhDg$<`lnP*~Z&EbKws0x18?;!QD!r4M72q6PhPT0jI<(+3 z_yT@}pWy*Kgumel879ZbX>yKSAQ#CS=0.10` to reflect this - package's requirements. ([#78][]) - - -[#78]: https://github.com/ericf/express-handlebars/issues/78 - - -1.0.1 (2014-08-08) ------------------- - -* Fixed bug where rendered content was only be returned if a layout template was - being used. Now a layout-less render will actually return content. ([#73][]) - - -[#73]: https://github.com/ericf/express-handlebars/issues/73 - - -1.0.0 (2014-08-07) ------------------- - -* __[!]__ Renamed to: `express-handlebars`. ([#65][]) - -* __[!]__ Rewritten to use Promises instead of `async` for asynchronous code. - ([#68][]) This resulted in the following public API changes: - - * `loadPartials()` --> `getPartials()`, returns a Promise. - * `loadTemplate()` --> `getTemplate()`, returns a Promise. - * `loadTemplates()` --> `getTemplates()`, returns a Promise. - * `render(file, context, [options])`, returns a Promise. - - -* `partialsDir` can now be set with an array of objects in the following form to - support namespaced partials: ([#70][] @joanniclaborde) - - { dir: 'foo/bar/', namespace: 'bar' } - -* Added support for Handlebars' `data` channel via `options.data`. ([#62][]) - -* Added `compileTemplate()` hook for the pre/post compile process, this also - supports returning a Promise. ([#39][], [#41][]) - -* Added `_renderTemplate()` hook that supports returning a Promise. - ([#39][], [#41][]) - -* Upgraded all dependencies, including Handlebars to 2.x. ([#59][]) - -* Added `graceful-fs` dependency to support large numbers of files to avoid - EMFILE errors. - -* Reduced complexity of cache code. - -* Updated examples to each be self-contained and have `package.json` files. - - -[#39]: https://github.com/ericf/express-handlebars/issues/39 -[#41]: https://github.com/ericf/express-handlebars/issues/41 -[#59]: https://github.com/ericf/express-handlebars/issues/59 -[#62]: https://github.com/ericf/express-handlebars/issues/62 -[#65]: https://github.com/ericf/express-handlebars/issues/65 -[#68]: https://github.com/ericf/express-handlebars/issues/68 -[#70]: https://github.com/ericf/express-handlebars/issues/70 - - -0.5.1 (2014-08-05) ------------------- - -* __[!]__ Last release before `v1.0` which will have breaking changes. - -* Improved `extname` docs in README and added example. ([#30][] @Crashthatch) - -* `extname` can now be specified _without_ the leading `"."`. - ([#51][] @calvinmetcalf) - - -[#30]: https://github.com/ericf/express-handlebars/issues/30 -[#51]: https://github.com/ericf/express-handlebars/issues/51 - - -0.5.0 (2013-07-25) ------------------- - -* Added `loadTemplates()` method which will load all the templates in a - specified directory. ([#21][]) - -* Added support for multiple partials directories. This enables the - `partialsDir` configuration property to be specified as an *array* of - directories, and loads all of the templates in each one. - - This feature allows an app's partials to be split up in multiple directories, - which is common if an app has some shared partials which will also be exposed - to the client, and some server-side-only partials. ([#20][]) - -* Added runnable code examples in this package's "examples/" directory. - ([#22][]) - -* Improved optional argument handling in public methods to treat Express - `locals` function objects as `options` and not `callback` params to the method - being invoked. ([#27][]) - - -[#20]: https://github.com/ericf/express-handlebars/issues/20 -[#21]: https://github.com/ericf/express-handlebars/issues/21 -[#22]: https://github.com/ericf/express-handlebars/issues/22 -[#27]: https://github.com/ericf/express-handlebars/issues/27 - - -0.4.1 (2013-04-06) ------------------- - -* Updated `async` dependency to the latest stable minor version: "~0.2". - - -0.4.0 (2013-03-24) ------------------- - -* __[!]__ Removed the following "get" -> "load" aliases which kept in v0.2.0 for - back-compat: - - * `getPartials()` -> `loadPartials()` - * `getTemplate()` -> `loadTemplate()` - - This is the future version where these aliases have been removed. - -* __[!]__ Renamed `lib/express3-handlebars.js` -> `lib/express-handlebars.js`. - -* Exposed `getHandlebarsSemver()` function as a static property on the - `ExpressHandlebars` constructor. - -* Rearranged module exports by moving the engine factory function to `index.js`, - making the `lib/express3-handlebars.js` module only responsible for exporting - the `ExpressHandlebars` constructor. - - -0.3.3 (2013-03-22) ------------------- - -* Updated internal `_resolveLayoutPath()` method to take the full - `options`/locals objects which the view is rendered with. This makes it easier - to override. ([#14][]) - - -[#14]: https://github.com/ericf/express-handlebars/issues/14 - - -0.3.2 (2013-02-20) ------------------- - -* Transfered ownership and copyright to Yahoo! Inc. This software is still free - to use, and is now licensed under the Yahoo! Inc. BSD license. - - -0.3.1 (2013-02-18) ------------------- - -* Updated README with info about `options.helpers` for `render()` and - `renderView()` docs. ([#7][]) - - -[#7]: https://github.com/ericf/express-handlebars/issues/7 - - -0.3.0 (2013-02-18) ------------------- - -* Added support for render-level helpers, via `options.helpers`, to the - `render()` and `renderView()` methods. Handlebars' `registerHelper()` function - now works as expected and does not have to be called before the - `ExpressHandlebars` instance is created. Helpers are now merged from: - `handlebars.helpers` (global), `helpers` (instance), and `options.helpers` - (render-level) before a template is rendered; this provides flexibility at - all levels. ([#3][], [#11][]) - -* Added `handlebarsVersion` property which is the version number of `handlebars` - as a semver. This is used internally to branch on certain operations which - differ between Handlebars releases. - - -[#3]: https://github.com/ericf/express-handlebars/issues/3 -[#11]: https://github.com/ericf/express-handlebars/issues/11 - - -0.2.3 (2013-02-13) ------------------- - -* Fixed issue with naming nested partials when using the latest version of - Handlebars (1.0.rc.2). Previous versions require a hack to replace "/"s with - "."s in partial names, and the latest version of Handlebars fixes that bug. - This hack will only be applied to old versions of Handlebars. ([#9][]) - - -[#9]: https://github.com/ericf/express-handlebars/issues/9 - - -0.2.2 (2013-02-04) ------------------- - -* Updated README with the public method renames which happened v0.2.0. - - -0.2.1 (2013-02-04) ------------------- - -* `extname`, `layoutsDir`, and `partialsDir` property values will now reference - the values on the prototype unless an `ExpressHandlebars` instance is - constructed with config values for these properties. - -* Improved clarity of method implementations, and exposed more override "hooks" - via new private methods: `_getPartialName()`, `_renderTemplate()`, and - `_resolveLayoutPath()`. - - -0.2.0 (2013-02-01) ------------------- - -* __[!]__ Renamed methods prefixed with "get" to "load" for clarity: - - * `getPartials()` -> `loadPartials()` - * `getTemplate()` -> `loadTemplate()` - - Aliases for these methods have been created to maintain back-compat, but the - old method names are now deprecated will be removed in the future. ([#5][]) - -* All paths are resolved before checking in or adding to caches. ([#1][]) - -* Force `{precompiled: false}` option within `render()` and `renderView()` - methods to prevent trying to render with precompiled templates. ([#2][]) - - -[#1]: https://github.com/ericf/express-handlebars/issues/1 -[#2]: https://github.com/ericf/express-handlebars/issues/2 -[#5]: https://github.com/ericf/express-handlebars/issues/5 - - -0.1.2 (2013-01-10) ------------------- - -* Tweaked formatting of README documentation. - - -0.1.1 (2013-01-10) ------------------- - -* Added README documentation. - - -0.1.0 (2013-01-07) ------------------- - -* Initial release. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/LICENSE deleted file mode 100644 index 58708e7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2014, Yahoo Inc. All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following -conditions are met: - -* Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the - following disclaimer in the documentation and/or other - materials provided with the distribution. - -* Neither the name of Yahoo Inc. nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission of Yahoo Inc. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/README.md deleted file mode 100644 index 370881b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/README.md +++ /dev/null @@ -1,568 +0,0 @@ -Express Handlebars -================== - -A [Handlebars][] view engine for [Express][] which doesn't suck. - -[![npm version][npm-badge]][npm] -[![dependency status][dep-badge]][dep-status] - -**This package used to be named `express3-handlebars`. The previous `express-handlebars` package by @jneen can be found [here][jneen-exphbs].** - - -[Express]: https://github.com/visionmedia/express -[Handlebars]: https://github.com/wycats/handlebars.js -[npm]: https://www.npmjs.org/package/express-handlebars -[npm-badge]: https://img.shields.io/npm/v/express-handlebars.svg?style=flat-square -[dep-status]: https://david-dm.org/ericf/express-handlebars -[dep-badge]: https://img.shields.io/david/ericf/express-handlebars.svg?style=flat-square -[jneen-exphbs]: https://github.com/jneen/express-handlebars - - -## Goals & Design - -I created this project out of frustration with the existing Handlebars view engines for Express. As of version 3.x, Express got out of the business of being a generic view engine — this was a great decision — leaving developers to implement the concepts of layouts, partials, and doing file I/O for their template engines of choice. - -### Goals and Features - -After building a half-dozen Express apps, I developed requirements and opinions about what a Handlebars view engine should provide and how it should be implemented. The following is that list: - -* Add back the concept of "layout", which was removed in Express 3.x. - -* Add back the concept of "partials" via Handlebars' partials mechanism. - -* Support a directories of partials; e.g., `{{> foo/bar}}` which exists on the file system at `views/partials/foo/bar.handlebars`, by default. - -* Smart file system I/O and template caching. When in development, templates are always loaded from disk. In production, raw files and compiled templates are cached, including partials. - -* All async and non-blocking. File system I/O is slow and servers should not be blocked from handling requests while reading from disk. I/O queuing is used to avoid doing unnecessary work. - -* Ability to easily precompiled templates and partials for use on the client, enabling template sharing and reuse. - -* Ability to use a different Handlebars module/implementation other than the Handlebars npm package. - -### Package Design - -This package was designed to work great for both the simple and complex use cases. I _intentionally_ made sure the full implementation is exposed and is easily overridable. - -The package exports a function which can be invoked with no arguments or with a `config` object and it will return a function (closed over sane defaults) which can be registered with an Express app. It's an engine factory function. - -This exported engine factory has two properties which expose the underlying implementation: - -* `ExpressHandlebars()`: The constructor function which holds the internal implementation on its `prototype`. This produces instance objects which store their configuration, `compiled` and `precompiled` templates, and expose an `engine()` function which can be registered with an Express app. - -* `create()`: A convenience factory function for creating `ExpressHandlebars` instances. - -An instance-based approach is used so that multiple `ExpressHandlebars` instances can be created with their own configuration, templates, partials, and helpers. - - -## Installation - -Install using npm: - -```shell -$ npm install express-handlebars -``` - - -## Usage - -This view engine uses sane defaults that leverage the "Express-way" of structuring an app's views. This makes it trivial to use in basic apps: - -### Basic Usage - -**Directory Structure:** - -``` -. -├── app.js -└── views - ├── home.handlebars - └── layouts - └── main.handlebars - -2 directories, 3 files -``` - -**app.js:** - -Creates a super simple Express app which shows the basic way to register a Handlebars view engine using this package. - -```javascript -var express = require('express'); -var exphbs = require('express-handlebars'); - -var app = express(); - -app.engine('handlebars', exphbs({defaultLayout: 'main'})); -app.set('view engine', 'handlebars'); - -app.get('/', function (req, res) { - res.render('home'); -}); - -app.listen(3000); -``` - -**views/layouts/main.handlebars:** - -The main layout is the HTML page wrapper which can be reused for the different views of the app. `{{{body}}}` is used as a placeholder for where the main content should be rendered. - -```handlebars - - - - - Example App - - - - {{{body}}} - - - -``` - -**views/home.handlebars:** - -The content for the app's home view which will be rendered into the layout's `{{{body}}}`. - -```handlebars -

Example App: Home

-``` - -#### Running the Example - -The above example is bundled in this package's [examples directory][], where it can be run by: - -```shell -$ cd examples/basic/ -$ npm install -$ npm start -``` - -### Using Instances - -Another way to use this view engine is to create an instance(s) of `ExpressHandlebars`, allowing access to the full API: - -```javascript -var express = require('express'); -var exphbs = require('express-handlebars'); - -var app = express(); -var hbs = exphbs.create({ /* config */ }); - -// Register `hbs.engine` with the Express app. -app.engine('handlebars', hbs.engine); -app.set('view engine', 'handlebars'); - -// ...still have a reference to `hbs`, on which methods like `loadPartials()` -// can be called. -``` - -**Note:** The [Advanced Usage][] example demonstrates how `ExpressHandlebars` instances can be leveraged. - -### Template Caching - -This view engine uses a smart template caching strategy. In development, templates will always be loaded from disk, i.e., no caching. In production, raw files and compiled Handlebars templates are aggressively cached. - -The easiest way to control template/view caching is through Express' [view cache setting][]: - -```javascript -app.enable('view cache'); -``` - -Express enables this setting by default when in production mode, i.e.: - -``` -process.env.NODE_ENV === "production" -``` - -**Note:** All of the public API methods accept `options.cache`, which gives control over caching when calling these methods directly. - -### Layouts - -A layout is simply a Handlebars template with a `{{{body}}}` placeholder. Usually it will be an HTML page wrapper into which views will be rendered. - -This view engine adds back the concept of "layout", which was removed in Express 3.x. It can be configured with a path to the layouts directory, by default it's set to `"views/layouts/"`. - -There are two ways to set a default layout: configuring the view engine's `defaultLayout` property, or setting [Express locals][] `app.locals.layout`. - -The layout into which a view should be rendered can be overridden per-request by assigning a different value to the `layout` request local. The following will render the "home" view with no layout: - -```javascript -app.get('/', function (req, res, next) { - res.render('home', {layout: false}); -}); -``` - -### Helpers - -Helper functions, or "helpers" are functions that can be [registered with Handlebars][] and can be called within a template. Helpers can be used for transforming output, iterating over data, etc. To keep with the spirit of *logic-less* templates, helpers are the place where logic should be defined. - -Handlebars ships with some [built-in helpers][], such as: `with`, `if`, `each`, etc. Most application will need to extend this set of helpers to include app-specific logic and transformations. Beyond defining global helpers on `Handlebars`, this view engine supports `ExpressHandlebars` instance-level helpers via the `helpers` configuration property, and render-level helpers via `options.helpers` when calling the `render()` and `renderView()` methods. - -The following example shows helpers being specified at each level: - -**app.js:** - -Creates a super simple Express app which shows the basic way to register `ExpressHandlebars` instance-level helpers, and override one at the render-level. - -```javascript -var express = require('express'); -var exphbs = require('express-handlebars'); - -var app = express(); - -var hbs = exphbs.create({ - // Specify helpers which are only registered on this instance. - helpers: { - foo: function () { return 'FOO!'; }, - bar: function () { return 'BAR!'; } - } -}); - -app.engine('handlebars', hbs.engine); -app.set('view engine', 'handlebars'); - -app.get('/', function (req, res, next) { - res.render('home', { - showTitle: true, - - // Override `foo` helper only for this rendering. - helpers: { - foo: function () { return 'foo.'; } - } - }); -}); - -app.listen(3000); -``` - -**views/home.handlebars:** - -The app's home view which uses helper functions to help render the contents. - -```handlebars - - - - - Example App - Home - - - - - {{#if showTitle}} -

Home

- {{/if}} - - -

{{foo}}

- - -

{{bar}}

- - - -``` - -#### More on Helpers - -Refer to the [Handlebars website][] for more information on defining helpers: - -* [Expression Helpers][] -* [Block Helpers][] - -### Metadata - -Handlebars has a data channel feature that propagates data through all scopes, including helpers and partials. Values in the data channel can be accessed via the `{{@variable}}` syntax. Express Handlebars provides metadata about a template it renders on a `{{@exphbs}}` object allowing access to things like the view name passed to `res.render()` via `{{@exphbs.view}}`. - -The following is the list of metadata that's accessible on the `{{@exphbs}}` data object: - -* `cache`: Boolean whether or not the template is cached. -* `view`: String name of the view passed to `res.render()`. -* `layout`: String name of the layout view. -* `data`: Original data object passed when rendering the template. -* `helpers`: Collection of helpers used when rendering the template. -* `partials`: Collection of partials used when rendering the template. - - -[examples directory]: https://github.com/ericf/express-handlebars/tree/master/examples -[view cache setting]: http://expressjs.com/api.html#app-settings -[Express locals]: http://expressjs.com/api.html#app.locals -[registered with Handlebars]: https://github.com/wycats/handlebars.js/#registering-helpers -[built-in helpers]: http://handlebarsjs.com/#builtins -[Handlebars website]: http://handlebarsjs.com/ -[Expression Helpers]: http://handlebarsjs.com/expressions.html#helpers -[Block Helpers]: http://handlebarsjs.com/block_helpers.html - - -## API - -### Configuration and Defaults - -There are two main ways to use this package: via its engine factory function, or creating `ExpressHandlebars` instances; both use the same configuration properties and defaults. - -```javascript -var exphbs = require('express-handlebars'); - -// Using the engine factory: -exphbs({ /* config */ }); - -// Create an instance: -exphbs.create({ /* config */ }); -``` - -The following is the list of configuration properties and their default values (if any): - -#### `handlebars=require('handlebars')` -The Handlebars module/implementation. This allows for the `ExpressHandlebars` instance to use a different Handlebars module/implementation than that provided by the Handlebars npm package. - -#### `extname=".handlebars"` -The string name of the file extension used by the templates. This value should correspond with the `extname` under which this view engine is registered with Express when calling `app.engine()`. - -The following example sets up an Express app to use `.hbs` as the file extension for views: - -```javascript -var express = require('express'); -var exphbs = require('express-handlebars'); - -var app = express(); - -app.engine('.hbs', exphbs({extname: '.hbs'})); -app.set('view engine', '.hbs'); -``` - -**Note:** Setting the app's `"view engine"` setting will make that value the default file extension used for looking up views. - -#### `layoutsDir="views/layouts/"` -The string path to the directory where the layout templates reside. - -**Note:** If you configure Express to look for views in a custom location (e.g., `app.set('views', 'some/path/')`), you will need to reflect that by passing an updated path as the `layoutsDir` property in your configuration. - -#### `partialsDir="views/partials/"` -The string path to the directory where the partials templates reside or object with the following properties: - -* `dir`: The string path to the directory where the partials templates reside. -* `namespace`: Optional string namespace to prefix the partial names. -* `templates`: Optional collection (or promise of a collection) of templates in the form: `{filename: template}`. - -**Note:** If you configure Express to look for views in a custom location (e.g., `app.set('views', 'some/path/')`), you will need to reflect that by passing an updated path as the `partialsDir` property in your configuration. - -**Note:** Multiple partials dirs can be used by making `partialsDir` an array of strings, and/or config objects as described above. The namespacing feature is useful if multiple partials dirs are used and their file paths might clash. - -#### `defaultLayout` -The string name or path of a template in the `layoutsDir` to use as the default layout. This is overridden by a `layout` specified in the app or response `locals`. **Note:** A falsy value will render without a layout; e.g., `res.render('home', {layout: false});`. - -#### `helpers` -An object which holds the helper functions used when rendering templates with this `ExpressHandlebars` instance. When rendering a template, a collection of helpers will be generated by merging: `handlebars.helpers` (global), `helpers` (instance), and `options.helpers` (render-level). This allows Handlebars' `registerHelper()` function to operate as expected, will providing two extra levels over helper overrides. - -#### `compilerOptions` -An object which holds options that will be passed along to the Handlebars compiler functions: `Handlebars.compile()` and `Handlebars.precompile()`. - -### Properties - -The public API properties are provided via `ExpressHandlebars` instances. In additional to the properties listed in the **Configuration and Defaults** section, the following are additional public properties: - -#### `engine` -A function reference to the `renderView()` method which is bound to `this` `ExpressHandlebars` instance. This bound function should be used when registering this view engine with an Express app. - -#### `extname` -The normalized `extname` which will _always_ start with `.` and defaults to `.handlebars`. - -#### `compiled` -An object cache which holds compiled Handlebars template functions in the format: `{"path/to/template": [Function]}`. - -#### `precompiled` -An object cache which holds precompiled Handlebars template strings in the format: `{"path/to/template": [String]}`. - -### Methods - -The following is the list of public API methods provided via `ExpressHandlebars` instances: - -**Note:** All of the public methods return a [`Promise`][promise] (with the exception of `renderView()` which is the interface with Express.) - -#### `getPartials([options])` -Retrieves the partials in the `partialsDir` and returns a Promise for an object mapping the partials in the form `{name: partial}`. - -By default each partial will be a compiled Handlebars template function. Use `options.precompiled` to receive the partials as precompiled templates — this is useful for sharing templates with client code. - -**Parameters:** - -* `[options]`: Optional object containing any of the following properties: - - * `[cache]`: Whether cached templates can be used if they have already been requested. This is recommended for production to avoid unnecessary file I/O. - - * `[precompiled=false]`: Whether precompiled templates should be provided, instead of compiled Handlebars template functions. - -The name of each partial corresponds to its location in `partialsDir`. For example, consider the following directory structure: - -``` -views -└── partials - ├── foo - │   └── bar.handlebars - └── title.handlebars - -2 directories, 2 files -``` - -`getPartials()` would produce the following result: - -```javascript -var hbs = require('express-handlebars').create(); - -hbs.getPartials().then(function (partials) { - console.log(partials); - // => { 'foo/bar': [Function], - // => title: [Function] } -}); -``` - -#### `getTemplate(filePath, [options])` -Retrieves the template at the specified `filePath` and returns a Promise for the compiled Handlebars template function. - -Use `options.precompiled` to receive a precompiled Handlebars template. - -**Parameters:** - -* `filePath`: String path to the Handlebars template file. - -* `[options]`: Optional object containing any of the following properties: - - * `[cache]`: Whether a cached template can be used if it have already been requested. This is recommended for production to avoid necessary file I/O. - - * `[precompiled=false]`: Whether a precompiled template should be provided, instead of a compiled Handlebars template function. - -#### `getTemplates(dirPath, [options])` -Retrieves the all the templates in the specified `dirPath` and returns a Promise for an object mapping the compiled templates in the form `{filename: template}`. - -Use `options.precompiled` to receive precompiled Handlebars templates — this is useful for sharing templates with client code. - -**Parameters:** - -* `dirPath`: String path to the directory containing Handlebars template files. - -* `[options]`: Optional object containing any of the following properties: - - * `[cache]`: Whether cached templates can be used if it have already been requested. This is recommended for production to avoid necessary file I/O. - - * `[precompiled=false]`: Whether precompiled templates should be provided, instead of a compiled Handlebars template function. - -#### `render(filePath, context, [options])` -Renders the template at the specified `filePath` with the `context`, using this instance's `helpers` and partials by default, and returns a Promise for the resulting string. - -**Parameters:** - -* `filePath`: String path to the Handlebars template file. - -* `context`: Object in which the template will be executed. This contains all of the values to fill into the template. - -* `[options]`: Optional object which can contain any of the following properties which affect this view engine's behavior: - - * `[cache]`: Whether a cached template can be used if it have already been requested. This is recommended for production to avoid unnecessary file I/O. - - * `[data]`: Optional object which can contain any data that Handlebars will pipe through the template, all helpers, and all partials. This is a side data channel. - - * `[helpers]`: Render-level helpers that will be used instead of any instance-level helpers; these will be merged with (and will override) any global Handlebars helper functions. - - * `[partials]`: Render-level partials that will be used instead of any instance-level partials. This is used internally as an optimization to avoid re-loading all the partials. - -#### `renderView(viewPath, options|callback, [callback])` -Renders the template at the specified `viewPath` as the `{{{body}}}` within the layout specified by the `defaultLayout` or `options.layout`. Rendering will use this instance's `helpers` and partials, and passes the resulting string to the `callback`. - -This method is called by Express and is the main entry point into this Express view engine implementation. It adds the concept of a "layout" and delegates rendering to the `render()` method. - -The `options` will be used both as the context in which the Handlebars templates are rendered, and to signal this view engine on how it should behave, e.g., `options.cache=false` will load _always_ load the templates from disk. - -**Parameters:** - -* `viewPath`: String path to the Handlebars template file which should serve as the `{{{body}}}` when using a layout. - -* `[options]`: Optional object which will serve as the context in which the Handlebars templates are rendered. It may also contain any of the following properties which affect this view engine's behavior: - - * `[cache]`: Whether cached templates can be used if they have already been requested. This is recommended for production to avoid unnecessary file I/O. - - * `[data]`: Optional object which can contain any data that Handlebars will pipe through the template, all helpers, and all partials. This is a side data channel. - - * `[helpers]`: Render-level helpers that will be merged with (and will override) instance and global helper functions. - - * `[partials]`: Render-level partials will be merged with (and will override) instance and global partials. This should be a `{partialName: fn}` hash or a Promise of an object with this shape. - - * `[layout]`: Optional string path to the Handlebars template file to be used as the "layout". This overrides any `defaultLayout` value. Passing a falsy value will render with no layout (even if a `defaultLayout` is defined). - -* `callback`: Function to call once the template is retrieved. - -### Hooks - -The following is the list of protected methods that are called internally and serve as _hooks_ to override functionality of `ExpressHandlebars` instances. A value or a promise can be returned from these methods which allows them to perform async operations. - -#### `_compileTemplate(template, options)` -This hook will be called when a Handlebars template needs to be compiled. This function needs to return a compiled Handlebars template function, or a promise for one. - -By default this hook calls `Handlebars.compile()`, but it can be overridden to preform operations before and/or after Handlebars compiles the template. This is useful if you wanted to first process Markdown within a Handlebars template. - -**Parameters:** - -* `template`: String Handlebars template that needs to be compiled. - -* `options`: Object `compilerOptions` that were specified when the `ExpressHandlebars` instance as created. This object should be passed along to the `Handlebars.compile()` function. - -#### `_precompileTemplate(template, options)` -This hook will be called when a Handlebars template needs to be precompiled. This function needs to return a serialized Handlebars template spec. string, or a promise for one. - -By default this hook calls `Handlebars.precompile()`, but it can be overridden to preform operations before and/or after Handlebars precompiles the template. This is useful if you wanted to first process Markdown within a Handlebars template. - -**Parameters:** - -* `template`: String Handlebars template that needs to be precompiled. - -* `options`: Object `compilerOptions` that were specified when the `ExpressHandlebars` instance as created. This object should be passed along to the `Handlebars.compile()` function. - -#### `_renderTemplate(template, context, options)` -This hook will be called when a compiled Handlebars template needs to be rendered. This function needs to returned the rendered output string, or a promise for one. - -By default this hook simply calls the passed-in `template` with the `context` and `options` arguments, but it can be overridden to perform operations before and/or after rendering the template. - -**Parameters:** - -* `template`: Compiled Handlebars template function to call. - -* `context`: The context object in which to render the `template`. - -* `options`: Object that contains options and metadata for rendering the template: - - * `data`: Object to define custom `@variable` private variables. - - * `helpers`: Object to provide custom helpers in addition to the globally defined helpers. - - * `partials`: Object to provide custom partials in addition to the globally defined partials. - - -[promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise - - -## Examples - -### [Basic Usage][] - -This example shows the most basic way to use this view engine. - -### [Advanced Usage][] - -This example is more comprehensive and shows how to use many of the features of this view engine, including helpers, partials, multiple layouts, etc. - -As noted in the **Package Design** section, this view engine's implementation is instance-based, and more advanced usages can take advantage of this. The Advanced Usage example demonstrates how to use an `ExpressHandlebars` instance to share templates with the client, among other features. - - -[Basic Usage]: https://github.com/ericf/express-handlebars/tree/master/examples/basic -[Advanced Usage]: https://github.com/ericf/express-handlebars/tree/master/examples/advanced - - -License -------- - -This software is free to use under the Yahoo! Inc. BSD license. See the [LICENSE file][] for license text and copyright information. - - -[LICENSE file]: https://github.com/ericf/express-handlebars/blob/master/LICENSE diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/index.js deleted file mode 100644 index b1f6dd5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/index.js +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2014, Yahoo Inc. All rights reserved. - * Copyrights licensed under the New BSD License. - * See the accompanying LICENSE file for terms. - */ - -'use strict'; - -var ExpressHandlebars = require('./lib/express-handlebars'); - -exports = module.exports = exphbs; -exports.create = create; -exports.ExpressHandlebars = ExpressHandlebars; - -// ----------------------------------------------------------------------------- - -function exphbs(config) { - return create(config).engine; -} - -function create(config) { - return new ExpressHandlebars(config); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/lib/express-handlebars.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/lib/express-handlebars.js deleted file mode 100644 index 1894e4f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/lib/express-handlebars.js +++ /dev/null @@ -1,340 +0,0 @@ -/* - * Copyright (c) 2015, Yahoo Inc. All rights reserved. - * Copyrights licensed under the New BSD License. - * See the accompanying LICENSE file for terms. - */ - -'use strict'; - -var Promise = global.Promise || require('promise'); - -var glob = require('glob'); -var Handlebars = require('handlebars'); -var fs = require('graceful-fs'); -var path = require('path'); - -var utils = require('./utils'); - -module.exports = ExpressHandlebars; - -// ----------------------------------------------------------------------------- - -function ExpressHandlebars(config) { - // Config properties with defaults. - utils.assign(this, { - handlebars : Handlebars, - extname : '.handlebars', - layoutsDir : 'views/layouts/', - partialsDir : 'views/partials/', - defaultLayout : undefined, - helpers : undefined, - compilerOptions: undefined, - }, config); - - // Express view engine integration point. - this.engine = this.renderView.bind(this); - - // Normalize `extname`. - if (this.extname.charAt(0) !== '.') { - this.extname = '.' + this.extname; - } - - // Internal caches of compiled and precompiled templates. - this.compiled = Object.create(null); - this.precompiled = Object.create(null); - - // Private internal file system cache. - this._fsCache = Object.create(null); -} - -ExpressHandlebars.prototype.getPartials = function (options) { - var partialsDirs = Array.isArray(this.partialsDir) ? - this.partialsDir : [this.partialsDir]; - - partialsDirs = partialsDirs.map(function (dir) { - var dirPath; - var dirTemplates; - var dirNamespace; - - // Support `partialsDir` collection with object entries that contain a - // templates promise and a namespace. - if (typeof dir === 'string') { - dirPath = dir; - } else if (typeof dir === 'object') { - dirTemplates = dir.templates; - dirNamespace = dir.namespace; - dirPath = dir.dir; - } - - // We must have some path to templates, or templates themselves. - if (!(dirPath || dirTemplates)) { - throw new Error('A partials dir must be a string or config object'); - } - - // Make sure we're have a promise for the templates. - var templatesPromise = dirTemplates ? Promise.resolve(dirTemplates) : - this.getTemplates(dirPath, options); - - return templatesPromise.then(function (templates) { - return { - templates: templates, - namespace: dirNamespace, - }; - }); - }, this); - - return Promise.all(partialsDirs).then(function (dirs) { - var getTemplateName = this._getTemplateName.bind(this); - - return dirs.reduce(function (partials, dir) { - var templates = dir.templates; - var namespace = dir.namespace; - var filePaths = Object.keys(templates); - - filePaths.forEach(function (filePath) { - var partialName = getTemplateName(filePath, namespace); - partials[partialName] = templates[filePath]; - }); - - return partials; - }, {}); - }.bind(this)); -}; - -ExpressHandlebars.prototype.getTemplate = function (filePath, options) { - filePath = path.resolve(filePath); - options || (options = {}); - - var precompiled = options.precompiled; - var cache = precompiled ? this.precompiled : this.compiled; - var template = options.cache && cache[filePath]; - - if (template) { - return template; - } - - // Optimistically cache template promise to reduce file system I/O, but - // remove from cache if there was a problem. - template = cache[filePath] = this._getFile(filePath, {cache: options.cache}) - .then(function (file) { - if (precompiled) { - return this._precompileTemplate(file, this.compilerOptions); - } - - return this._compileTemplate(file, this.compilerOptions); - }.bind(this)); - - return template.catch(function (err) { - delete cache[filePath]; - throw err; - }); -}; - -ExpressHandlebars.prototype.getTemplates = function (dirPath, options) { - options || (options = {}); - var cache = options.cache; - - return this._getDir(dirPath, {cache: cache}).then(function (filePaths) { - var templates = filePaths.map(function (filePath) { - return this.getTemplate(path.join(dirPath, filePath), options); - }, this); - - return Promise.all(templates).then(function (templates) { - return filePaths.reduce(function (hash, filePath, i) { - hash[filePath] = templates[i]; - return hash; - }, {}); - }); - }.bind(this)); -}; - -ExpressHandlebars.prototype.render = function (filePath, context, options) { - options || (options = {}); - - return Promise.all([ - this.getTemplate(filePath, {cache: options.cache}), - options.partials || this.getPartials({cache: options.cache}), - ]).then(function (templates) { - var template = templates[0]; - var partials = templates[1]; - var helpers = options.helpers || this.helpers; - - // Add ExpressHandlebars metadata to the data channel so that it's - // accessible within the templates and helpers, namespaced under: - // `@exphbs.*` - var data = utils.assign({}, options.data, { - exphbs: utils.assign({}, options, { - filePath: filePath, - helpers : helpers, - partials: partials, - }), - }); - - return this._renderTemplate(template, context, { - data : data, - helpers : helpers, - partials: partials, - }); - }.bind(this)); -}; - -ExpressHandlebars.prototype.renderView = function (viewPath, options, callback) { - options || (options = {}); - - var context = options; - - // Express provides `settings.views` which is the path to the views dir that - // the developer set on the Express app. When this value exists, it's used - // to compute the view's name. - var view; - var viewsPath = options.settings && options.settings.views; - if (viewsPath) { - view = this._getTemplateName(path.relative(viewsPath, viewPath)); - } - - // Merge render-level and instance-level helpers together. - var helpers = utils.assign({}, this.helpers, options.helpers); - - // Merge render-level and instance-level partials together. - var partials = Promise.all([ - this.getPartials({cache: options.cache}), - Promise.resolve(options.partials), - ]).then(function (partials) { - return utils.assign.apply(null, [{}].concat(partials)); - }); - - // Pluck-out ExpressHandlebars-specific options and Handlebars-specific - // rendering options. - options = { - cache : options.cache, - view : view, - layout: 'layout' in options ? options.layout : this.defaultLayout, - - data : options.data, - helpers : helpers, - partials: partials, - }; - - this.render(viewPath, context, options) - .then(function (body) { - var layoutPath = this._resolveLayoutPath(options.layout); - - if (layoutPath) { - return this.render( - layoutPath, - utils.assign({}, context, {body: body}), - utils.assign({}, options, {layout: undefined}) - ); - } - - return body; - }.bind(this)) - .then(utils.passValue(callback)) - .catch(utils.passError(callback)); -}; - -// -- Protected Hooks ---------------------------------------------------------- - -ExpressHandlebars.prototype._compileTemplate = function (template, options) { - return this.handlebars.compile(template, options); -}; - -ExpressHandlebars.prototype._precompileTemplate = function (template, options) { - return this.handlebars.precompile(template, options); -}; - -ExpressHandlebars.prototype._renderTemplate = function (template, context, options) { - return template(context, options); -}; - -// -- Private ------------------------------------------------------------------ - -ExpressHandlebars.prototype._getDir = function (dirPath, options) { - dirPath = path.resolve(dirPath); - options || (options = {}); - - var cache = this._fsCache; - var dir = options.cache && cache[dirPath]; - - if (dir) { - return dir.then(function (dir) { - return dir.concat(); - }); - } - - var pattern = '**/*' + this.extname; - - // Optimistically cache dir promise to reduce file system I/O, but remove - // from cache if there was a problem. - dir = cache[dirPath] = new Promise(function (resolve, reject) { - glob(pattern, { - cwd : dirPath, - follow: true - }, function (err, dir) { - if (err) { - reject(err); - } else { - resolve(dir); - } - }); - }); - - return dir.then(function (dir) { - return dir.concat(); - }).catch(function (err) { - delete cache[dirPath]; - throw err; - }); -}; - -ExpressHandlebars.prototype._getFile = function (filePath, options) { - filePath = path.resolve(filePath); - options || (options = {}); - - var cache = this._fsCache; - var file = options.cache && cache[filePath]; - - if (file) { - return file; - } - - // Optimistically cache file promise to reduce file system I/O, but remove - // from cache if there was a problem. - file = cache[filePath] = new Promise(function (resolve, reject) { - fs.readFile(filePath, 'utf8', function (err, file) { - if (err) { - reject(err); - } else { - resolve(file); - } - }); - }); - - return file.catch(function (err) { - delete cache[filePath]; - throw err; - }); -}; - -ExpressHandlebars.prototype._getTemplateName = function (filePath, namespace) { - var extRegex = new RegExp(this.extname + '$'); - var name = filePath.replace(extRegex, ''); - - if (namespace) { - name = namespace + '/' + name; - } - - return name; -}; - -ExpressHandlebars.prototype._resolveLayoutPath = function (layoutPath) { - if (!layoutPath) { - return null; - } - - if (!path.extname(layoutPath)) { - layoutPath += this.extname; - } - - return path.resolve(this.layoutsDir, layoutPath); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/lib/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/lib/utils.js deleted file mode 100644 index a16da39..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/lib/utils.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2014, Yahoo Inc. All rights reserved. - * Copyrights licensed under the New BSD License. - * See the accompanying LICENSE file for terms. - */ - -'use strict'; - -exports.assign = Object.assign || require('object.assign'); -exports.passError = passError; -exports.passValue = passValue; - -// ----------------------------------------------------------------------------- - -function passError(callback) { - return function (reason) { - setImmediate(function () { - callback(reason); - }); - }; -} - -function passValue(callback) { - return function (value) { - setImmediate(function () { - callback(null, value); - }); - }; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/.bin/handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/.bin/handlebars deleted file mode 120000 index fb7d090..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/.bin/handlebars +++ /dev/null @@ -1 +0,0 @@ -../handlebars/bin/handlebars \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/README.md deleted file mode 100644 index 063cf95..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/README.md +++ /dev/null @@ -1,377 +0,0 @@ -[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Dependency Status](https://david-dm.org/isaacs/node-glob.svg)](https://david-dm.org/isaacs/node-glob) [![devDependency Status](https://david-dm.org/isaacs/node-glob/dev-status.svg)](https://david-dm.org/isaacs/node-glob#info=devDependencies) [![optionalDependency Status](https://david-dm.org/isaacs/node-glob/optional-status.svg)](https://david-dm.org/isaacs/node-glob#info=optionalDependencies) - -# Glob - -Match files using the patterns the shell uses, like stars and stuff. - -This is a glob implementation in JavaScript. It uses the `minimatch` -library to do its matching. - -![](oh-my-glob.gif) - -## Usage - -```javascript -var glob = require("glob") - -// options is optional -glob("**/*.js", options, function (er, files) { - // files is an array of filenames. - // If the `nonull` option is set, and nothing - // was found, then files is ["**/*.js"] - // er is an error object or null. -}) -``` - -## Glob Primer - -"Globs" are the patterns you type when you do stuff like `ls *.js` on -the command line, or put `build/*` in a `.gitignore` file. - -Before parsing the path part patterns, braced sections are expanded -into a set. Braced sections start with `{` and end with `}`, with any -number of comma-delimited sections within. Braced sections may contain -slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`. - -The following characters have special magic meaning when used in a -path portion: - -* `*` Matches 0 or more characters in a single path portion -* `?` Matches 1 character -* `[...]` Matches a range of characters, similar to a RegExp range. - If the first character of the range is `!` or `^` then it matches - any character not in the range. -* `!(pattern|pattern|pattern)` Matches anything that does not match - any of the patterns provided. -* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the - patterns provided. -* `+(pattern|pattern|pattern)` Matches one or more occurrences of the - patterns provided. -* `*(a|b|c)` Matches zero or more occurrences of the patterns provided -* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns - provided -* `**` If a "globstar" is alone in a path portion, then it matches - zero or more directories and subdirectories searching for matches. - It does not crawl symlinked directories. - -### Dots - -If a file or directory path portion has a `.` as the first character, -then it will not match any glob pattern unless that pattern's -corresponding path part also has a `.` as its first character. - -For example, the pattern `a/.*/c` would match the file at `a/.b/c`. -However the pattern `a/*/c` would not, because `*` does not start with -a dot character. - -You can make glob treat dots as normal characters by setting -`dot:true` in the options. - -### Basename Matching - -If you set `matchBase:true` in the options, and the pattern has no -slashes in it, then it will seek for any file anywhere in the tree -with a matching basename. For example, `*.js` would match -`test/simple/basic.js`. - -### Negation - -The intent for negation would be for a pattern starting with `!` to -match everything that *doesn't* match the supplied pattern. However, -the implementation is weird, and for the time being, this should be -avoided. The behavior is deprecated in version 5, and will be removed -entirely in version 6. - -### Empty Sets - -If no matching files are found, then an empty array is returned. This -differs from the shell, where the pattern itself is returned. For -example: - - $ echo a*s*d*f - a*s*d*f - -To get the bash-style behavior, set the `nonull:true` in the options. - -### See Also: - -* `man sh` -* `man bash` (Search for "Pattern Matching") -* `man 3 fnmatch` -* `man 5 gitignore` -* [minimatch documentation](https://github.com/isaacs/minimatch) - -## glob.hasMagic(pattern, [options]) - -Returns `true` if there are any special characters in the pattern, and -`false` otherwise. - -Note that the options affect the results. If `noext:true` is set in -the options object, then `+(a|b)` will not be considered a magic -pattern. If the pattern has a brace expansion, like `a/{b/c,x/y}` -then that is considered magical, unless `nobrace:true` is set in the -options. - -## glob(pattern, [options], cb) - -* `pattern` {String} Pattern to be matched -* `options` {Object} -* `cb` {Function} - * `err` {Error | null} - * `matches` {Array} filenames found matching the pattern - -Perform an asynchronous glob search. - -## glob.sync(pattern, [options]) - -* `pattern` {String} Pattern to be matched -* `options` {Object} -* return: {Array} filenames found matching the pattern - -Perform a synchronous glob search. - -## Class: glob.Glob - -Create a Glob object by instantiating the `glob.Glob` class. - -```javascript -var Glob = require("glob").Glob -var mg = new Glob(pattern, options, cb) -``` - -It's an EventEmitter, and starts walking the filesystem to find matches -immediately. - -### new glob.Glob(pattern, [options], [cb]) - -* `pattern` {String} pattern to search for -* `options` {Object} -* `cb` {Function} Called when an error occurs, or matches are found - * `err` {Error | null} - * `matches` {Array} filenames found matching the pattern - -Note that if the `sync` flag is set in the options, then matches will -be immediately available on the `g.found` member. - -### Properties - -* `minimatch` The minimatch object that the glob uses. -* `options` The options object passed in. -* `aborted` Boolean which is set to true when calling `abort()`. There - is no way at this time to continue a glob search after aborting, but - you can re-use the statCache to avoid having to duplicate syscalls. -* `cache` Convenience object. Each field has the following possible - values: - * `false` - Path does not exist - * `true` - Path exists - * `'DIR'` - Path exists, and is not a directory - * `'FILE'` - Path exists, and is a directory - * `[file, entries, ...]` - Path exists, is a directory, and the - array value is the results of `fs.readdir` -* `statCache` Cache of `fs.stat` results, to prevent statting the same - path multiple times. -* `symlinks` A record of which paths are symbolic links, which is - relevant in resolving `**` patterns. -* `realpathCache` An optional object which is passed to `fs.realpath` - to minimize unnecessary syscalls. It is stored on the instantiated - Glob object, and may be re-used. - -### Events - -* `end` When the matching is finished, this is emitted with all the - matches found. If the `nonull` option is set, and no match was found, - then the `matches` list contains the original pattern. The matches - are sorted, unless the `nosort` flag is set. -* `match` Every time a match is found, this is emitted with the matched. -* `error` Emitted when an unexpected error is encountered, or whenever - any fs error occurs if `options.strict` is set. -* `abort` When `abort()` is called, this event is raised. - -### Methods - -* `pause` Temporarily stop the search -* `resume` Resume the search -* `abort` Stop the search forever - -### Options - -All the options that can be passed to Minimatch can also be passed to -Glob to change pattern matching behavior. Also, some have been added, -or have glob-specific ramifications. - -All options are false by default, unless otherwise noted. - -All options are added to the Glob object, as well. - -If you are running many `glob` operations, you can pass a Glob object -as the `options` argument to a subsequent operation to shortcut some -`stat` and `readdir` calls. At the very least, you may pass in shared -`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that -parallel glob operations will be sped up by sharing information about -the filesystem. - -* `cwd` The current working directory in which to search. Defaults - to `process.cwd()`. -* `root` The place where patterns starting with `/` will be mounted - onto. Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix - systems, and `C:\` or some such on Windows.) -* `dot` Include `.dot` files in normal matches and `globstar` matches. - Note that an explicit dot in a portion of the pattern will always - match dot files. -* `nomount` By default, a pattern starting with a forward-slash will be - "mounted" onto the root setting, so that a valid filesystem path is - returned. Set this flag to disable that behavior. -* `mark` Add a `/` character to directory matches. Note that this - requires additional stat calls. -* `nosort` Don't sort the results. -* `stat` Set to true to stat *all* results. This reduces performance - somewhat, and is completely unnecessary, unless `readdir` is presumed - to be an untrustworthy indicator of file existence. -* `silent` When an unusual error is encountered when attempting to - read a directory, a warning will be printed to stderr. Set the - `silent` option to true to suppress these warnings. -* `strict` When an unusual error is encountered when attempting to - read a directory, the process will just continue on in search of - other matches. Set the `strict` option to raise an error in these - cases. -* `cache` See `cache` property above. Pass in a previously generated - cache object to save some fs calls. -* `statCache` A cache of results of filesystem information, to prevent - unnecessary stat calls. While it should not normally be necessary - to set this, you may pass the statCache from one glob() call to the - options object of another, if you know that the filesystem will not - change between calls. (See "Race Conditions" below.) -* `symlinks` A cache of known symbolic links. You may pass in a - previously generated `symlinks` object to save `lstat` calls when - resolving `**` matches. -* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead. -* `nounique` In some cases, brace-expanded patterns can result in the - same file showing up multiple times in the result set. By default, - this implementation prevents duplicates in the result set. Set this - flag to disable that behavior. -* `nonull` Set to never return an empty set, instead returning a set - containing the pattern itself. This is the default in glob(3). -* `debug` Set to enable debug logging in minimatch and glob. -* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets. -* `noglobstar` Do not match `**` against multiple filenames. (Ie, - treat it as a normal `*` instead.) -* `noext` Do not match `+(a|b)` "extglob" patterns. -* `nocase` Perform a case-insensitive match. Note: on - case-insensitive filesystems, non-magic patterns will match by - default, since `stat` and `readdir` will not raise errors. -* `matchBase` Perform a basename-only match if the pattern does not - contain any slash characters. That is, `*.js` would be treated as - equivalent to `**/*.js`, matching all js files in all directories. -* `nodir` Do not match directories, only files. (Note: to match - *only* directories, simply put a `/` at the end of the pattern.) -* `ignore` Add a pattern or an array of patterns to exclude matches. -* `follow` Follow symlinked directories when expanding `**` patterns. - Note that this can result in a lot of duplicate references in the - presence of cyclic links. -* `realpath` Set to true to call `fs.realpath` on all of the results. - In the case of a symlink that cannot be resolved, the full absolute - path to the matched entry is returned (though it will usually be a - broken symlink) -* `nonegate` Suppress deprecated `negate` behavior. (See below.) - Default=true -* `nocomment` Suppress deprecated `comment` behavior. (See below.) - Default=true - -## Comparisons to other fnmatch/glob implementations - -While strict compliance with the existing standards is a worthwhile -goal, some discrepancies exist between node-glob and other -implementations, and are intentional. - -The double-star character `**` is supported by default, unless the -`noglobstar` flag is set. This is supported in the manner of bsdglob -and bash 4.3, where `**` only has special significance if it is the only -thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but -`a/**b` will not. - -Note that symlinked directories are not crawled as part of a `**`, -though their contents may match against subsequent portions of the -pattern. This prevents infinite loops and duplicates and the like. - -If an escaped pattern has no matches, and the `nonull` flag is set, -then glob returns the pattern as-provided, rather than -interpreting the character escapes. For example, -`glob.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than -`"*a?"`. This is akin to setting the `nullglob` option in bash, except -that it does not resolve escaped pattern characters. - -If brace expansion is not disabled, then it is performed before any -other interpretation of the glob pattern. Thus, a pattern like -`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded -**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are -checked for validity. Since those two are valid, matching proceeds. - -### Comments and Negation - -**Note**: In version 5 of this module, negation and comments are -**disabled** by default. You can explicitly set `nonegate:false` or -`nocomment:false` to re-enable them. They are going away entirely in -version 6. - -The intent for negation would be for a pattern starting with `!` to -match everything that *doesn't* match the supplied pattern. However, -the implementation is weird. It is better to use the `ignore` option -to set a pattern or set of patterns to exclude from matches. If you -want the "everything except *x*" type of behavior, you can use `**` as -the main pattern, and set an `ignore` for the things to exclude. - -The comments feature is added in minimatch, primarily to more easily -support use cases like ignore files, where a `#` at the start of a -line makes the pattern "empty". However, in the context of a -straightforward filesystem globber, "comments" don't make much sense. - -## Windows - -**Please only use forward-slashes in glob expressions.** - -Though windows uses either `/` or `\` as its path separator, only `/` -characters are used by this glob implementation. You must use -forward-slashes **only** in glob expressions. Back-slashes will always -be interpreted as escape characters, not path separators. - -Results from absolute patterns such as `/foo/*` are mounted onto the -root setting using `path.join`. On windows, this will by default result -in `/foo/*` matching `C:\foo\bar.txt`. - -## Race Conditions - -Glob searching, by its very nature, is susceptible to race conditions, -since it relies on directory walking and such. - -As a result, it is possible that a file that exists when glob looks for -it may have been deleted or modified by the time it returns the result. - -As part of its internal implementation, this program caches all stat -and readdir calls that it makes, in order to cut down on system -overhead. However, this also makes it even more susceptible to races, -especially if the cache or statCache objects are reused between glob -calls. - -Users are thus advised not to use a glob result as a guarantee of -filesystem state in the face of rapid changes. For the vast majority -of operations, this is never a problem. - -## Contributing - -Any change to behavior (including bugfixes) must come with a test. - -Patches that fail tests or reduce performance will be rejected. - -``` -# to run tests -npm test - -# to re-generate test fixtures -npm run test-regen - -# to benchmark against bash/zsh -npm run bench - -# to profile javascript -npm run prof -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/common.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/common.js deleted file mode 100644 index e36a631..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/common.js +++ /dev/null @@ -1,245 +0,0 @@ -exports.alphasort = alphasort -exports.alphasorti = alphasorti -exports.setopts = setopts -exports.ownProp = ownProp -exports.makeAbs = makeAbs -exports.finish = finish -exports.mark = mark -exports.isIgnored = isIgnored -exports.childrenIgnored = childrenIgnored - -function ownProp (obj, field) { - return Object.prototype.hasOwnProperty.call(obj, field) -} - -var path = require("path") -var minimatch = require("minimatch") -var isAbsolute = require("path-is-absolute") -var Minimatch = minimatch.Minimatch - -function alphasorti (a, b) { - return a.toLowerCase().localeCompare(b.toLowerCase()) -} - -function alphasort (a, b) { - return a.localeCompare(b) -} - -function setupIgnores (self, options) { - self.ignore = options.ignore || [] - - if (!Array.isArray(self.ignore)) - self.ignore = [self.ignore] - - if (self.ignore.length) { - self.ignore = self.ignore.map(ignoreMap) - } -} - -function ignoreMap (pattern) { - var gmatcher = null - if (pattern.slice(-3) === '/**') { - var gpattern = pattern.replace(/(\/\*\*)+$/, '') - gmatcher = new Minimatch(gpattern) - } - - return { - matcher: new Minimatch(pattern), - gmatcher: gmatcher - } -} - -function setopts (self, pattern, options) { - if (!options) - options = {} - - // base-matching: just use globstar for that. - if (options.matchBase && -1 === pattern.indexOf("/")) { - if (options.noglobstar) { - throw new Error("base matching requires globstar") - } - pattern = "**/" + pattern - } - - self.silent = !!options.silent - self.pattern = pattern - self.strict = options.strict !== false - self.realpath = !!options.realpath - self.realpathCache = options.realpathCache || Object.create(null) - self.follow = !!options.follow - self.dot = !!options.dot - self.mark = !!options.mark - self.nodir = !!options.nodir - if (self.nodir) - self.mark = true - self.sync = !!options.sync - self.nounique = !!options.nounique - self.nonull = !!options.nonull - self.nosort = !!options.nosort - self.nocase = !!options.nocase - self.stat = !!options.stat - self.noprocess = !!options.noprocess - - self.maxLength = options.maxLength || Infinity - self.cache = options.cache || Object.create(null) - self.statCache = options.statCache || Object.create(null) - self.symlinks = options.symlinks || Object.create(null) - - setupIgnores(self, options) - - self.changedCwd = false - var cwd = process.cwd() - if (!ownProp(options, "cwd")) - self.cwd = cwd - else { - self.cwd = options.cwd - self.changedCwd = path.resolve(options.cwd) !== cwd - } - - self.root = options.root || path.resolve(self.cwd, "/") - self.root = path.resolve(self.root) - if (process.platform === "win32") - self.root = self.root.replace(/\\/g, "/") - - self.nomount = !!options.nomount - - // disable comments and negation unless the user explicitly - // passes in false as the option. - options.nonegate = options.nonegate === false ? false : true - options.nocomment = options.nocomment === false ? false : true - deprecationWarning(options) - - self.minimatch = new Minimatch(pattern, options) - self.options = self.minimatch.options -} - -// TODO(isaacs): remove entirely in v6 -// exported to reset in tests -exports.deprecationWarned -function deprecationWarning(options) { - if (!options.nonegate || !options.nocomment) { - if (process.noDeprecation !== true && !exports.deprecationWarned) { - var msg = 'glob WARNING: comments and negation will be disabled in v6' - if (process.throwDeprecation) - throw new Error(msg) - else if (process.traceDeprecation) - console.trace(msg) - else - console.error(msg) - - exports.deprecationWarned = true - } - } -} - -function finish (self) { - var nou = self.nounique - var all = nou ? [] : Object.create(null) - - for (var i = 0, l = self.matches.length; i < l; i ++) { - var matches = self.matches[i] - if (!matches || Object.keys(matches).length === 0) { - if (self.nonull) { - // do like the shell, and spit out the literal glob - var literal = self.minimatch.globSet[i] - if (nou) - all.push(literal) - else - all[literal] = true - } - } else { - // had matches - var m = Object.keys(matches) - if (nou) - all.push.apply(all, m) - else - m.forEach(function (m) { - all[m] = true - }) - } - } - - if (!nou) - all = Object.keys(all) - - if (!self.nosort) - all = all.sort(self.nocase ? alphasorti : alphasort) - - // at *some* point we statted all of these - if (self.mark) { - for (var i = 0; i < all.length; i++) { - all[i] = self._mark(all[i]) - } - if (self.nodir) { - all = all.filter(function (e) { - return !(/\/$/.test(e)) - }) - } - } - - if (self.ignore.length) - all = all.filter(function(m) { - return !isIgnored(self, m) - }) - - self.found = all -} - -function mark (self, p) { - var abs = makeAbs(self, p) - var c = self.cache[abs] - var m = p - if (c) { - var isDir = c === 'DIR' || Array.isArray(c) - var slash = p.slice(-1) === '/' - - if (isDir && !slash) - m += '/' - else if (!isDir && slash) - m = m.slice(0, -1) - - if (m !== p) { - var mabs = makeAbs(self, m) - self.statCache[mabs] = self.statCache[abs] - self.cache[mabs] = self.cache[abs] - } - } - - return m -} - -// lotta situps... -function makeAbs (self, f) { - var abs = f - if (f.charAt(0) === '/') { - abs = path.join(self.root, f) - } else if (isAbsolute(f) || f === '') { - abs = f - } else if (self.changedCwd) { - abs = path.resolve(self.cwd, f) - } else { - abs = path.resolve(f) - } - return abs -} - - -// Return true, if pattern ends with globstar '**', for the accompanying parent directory. -// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents -function isIgnored (self, path) { - if (!self.ignore.length) - return false - - return self.ignore.some(function(item) { - return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) - }) -} - -function childrenIgnored (self, path) { - if (!self.ignore.length) - return false - - return self.ignore.some(function(item) { - return !!(item.gmatcher && item.gmatcher.match(path)) - }) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/glob.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/glob.js deleted file mode 100644 index 022d2ac..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/glob.js +++ /dev/null @@ -1,752 +0,0 @@ -// Approach: -// -// 1. Get the minimatch set -// 2. For each pattern in the set, PROCESS(pattern, false) -// 3. Store matches per-set, then uniq them -// -// PROCESS(pattern, inGlobStar) -// Get the first [n] items from pattern that are all strings -// Join these together. This is PREFIX. -// If there is no more remaining, then stat(PREFIX) and -// add to matches if it succeeds. END. -// -// If inGlobStar and PREFIX is symlink and points to dir -// set ENTRIES = [] -// else readdir(PREFIX) as ENTRIES -// If fail, END -// -// with ENTRIES -// If pattern[n] is GLOBSTAR -// // handle the case where the globstar match is empty -// // by pruning it out, and testing the resulting pattern -// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) -// // handle other cases. -// for ENTRY in ENTRIES (not dotfiles) -// // attach globstar + tail onto the entry -// // Mark that this entry is a globstar match -// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) -// -// else // not globstar -// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) -// Test ENTRY against pattern[n] -// If fails, continue -// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) -// -// Caveat: -// Cache all stats and readdirs results to minimize syscall. Since all -// we ever care about is existence and directory-ness, we can just keep -// `true` for files, and [children,...] for directories, or `false` for -// things that don't exist. - -module.exports = glob - -var fs = require('fs') -var minimatch = require('minimatch') -var Minimatch = minimatch.Minimatch -var inherits = require('inherits') -var EE = require('events').EventEmitter -var path = require('path') -var assert = require('assert') -var isAbsolute = require('path-is-absolute') -var globSync = require('./sync.js') -var common = require('./common.js') -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var inflight = require('inflight') -var util = require('util') -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored - -var once = require('once') - -function glob (pattern, options, cb) { - if (typeof options === 'function') cb = options, options = {} - if (!options) options = {} - - if (options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return globSync(pattern, options) - } - - return new Glob(pattern, options, cb) -} - -glob.sync = globSync -var GlobSync = glob.GlobSync = globSync.GlobSync - -// old api surface -glob.glob = glob - -glob.hasMagic = function (pattern, options_) { - var options = util._extend({}, options_) - options.noprocess = true - - var g = new Glob(pattern, options) - var set = g.minimatch.set - if (set.length > 1) - return true - - for (var j = 0; j < set[0].length; j++) { - if (typeof set[0][j] !== 'string') - return true - } - - return false -} - -glob.Glob = Glob -inherits(Glob, EE) -function Glob (pattern, options, cb) { - if (typeof options === 'function') { - cb = options - options = null - } - - if (options && options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return new GlobSync(pattern, options) - } - - if (!(this instanceof Glob)) - return new Glob(pattern, options, cb) - - setopts(this, pattern, options) - this._didRealPath = false - - // process each pattern in the minimatch set - var n = this.minimatch.set.length - - // The matches are stored as {: true,...} so that - // duplicates are automagically pruned. - // Later, we do an Object.keys() on these. - // Keep them as a list so we can fill in when nonull is set. - this.matches = new Array(n) - - if (typeof cb === 'function') { - cb = once(cb) - this.on('error', cb) - this.on('end', function (matches) { - cb(null, matches) - }) - } - - var self = this - var n = this.minimatch.set.length - this._processing = 0 - this.matches = new Array(n) - - this._emitQueue = [] - this._processQueue = [] - this.paused = false - - if (this.noprocess) - return this - - if (n === 0) - return done() - - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false, done) - } - - function done () { - --self._processing - if (self._processing <= 0) - self._finish() - } -} - -Glob.prototype._finish = function () { - assert(this instanceof Glob) - if (this.aborted) - return - - if (this.realpath && !this._didRealpath) - return this._realpath() - - common.finish(this) - this.emit('end', this.found) -} - -Glob.prototype._realpath = function () { - if (this._didRealpath) - return - - this._didRealpath = true - - var n = this.matches.length - if (n === 0) - return this._finish() - - var self = this - for (var i = 0; i < this.matches.length; i++) - this._realpathSet(i, next) - - function next () { - if (--n === 0) - self._finish() - } -} - -Glob.prototype._realpathSet = function (index, cb) { - var matchset = this.matches[index] - if (!matchset) - return cb() - - var found = Object.keys(matchset) - var self = this - var n = found.length - - if (n === 0) - return cb() - - var set = this.matches[index] = Object.create(null) - found.forEach(function (p, i) { - // If there's a problem with the stat, then it means that - // one or more of the links in the realpath couldn't be - // resolved. just return the abs value in that case. - p = self._makeAbs(p) - fs.realpath(p, self.realpathCache, function (er, real) { - if (!er) - set[real] = true - else if (er.syscall === 'stat') - set[p] = true - else - self.emit('error', er) // srsly wtf right here - - if (--n === 0) { - self.matches[index] = set - cb() - } - }) - }) -} - -Glob.prototype._mark = function (p) { - return common.mark(this, p) -} - -Glob.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} - -Glob.prototype.abort = function () { - this.aborted = true - this.emit('abort') -} - -Glob.prototype.pause = function () { - if (!this.paused) { - this.paused = true - this.emit('pause') - } -} - -Glob.prototype.resume = function () { - if (this.paused) { - this.emit('resume') - this.paused = false - if (this._emitQueue.length) { - var eq = this._emitQueue.slice(0) - this._emitQueue.length = 0 - for (var i = 0; i < eq.length; i ++) { - var e = eq[i] - this._emitMatch(e[0], e[1]) - } - } - if (this._processQueue.length) { - var pq = this._processQueue.slice(0) - this._processQueue.length = 0 - for (var i = 0; i < pq.length; i ++) { - var p = pq[i] - this._processing-- - this._process(p[0], p[1], p[2], p[3]) - } - } - } -} - -Glob.prototype._process = function (pattern, index, inGlobStar, cb) { - assert(this instanceof Glob) - assert(typeof cb === 'function') - - if (this.aborted) - return - - this._processing++ - if (this.paused) { - this._processQueue.push([pattern, index, inGlobStar, cb]) - return - } - - //console.error('PROCESS %d', this._processing, pattern) - - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ - } - // now n is the index of the first one that is *not* a string. - - // see if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index, cb) - return - - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break - - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break - } - - var remain = pattern.slice(n) - - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix - - var abs = this._makeAbs(read) - - //if ignored, skip _processing - if (childrenIgnored(this, read)) - return cb() - - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) -} - -Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} - -Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - - // if the abs isn't a dir, then nothing can match! - if (!entries) - return cb() - - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' - - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } - - //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) - - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return cb() - - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. - - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this._emitMatch(index, e) - } - // This was the last one, and no stats were needed - return cb() - } - - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - this._process([e].concat(remain), index, inGlobStar, cb) - } - cb() -} - -Glob.prototype._emitMatch = function (index, e) { - if (this.aborted) - return - - if (this.matches[index][e]) - return - - if (isIgnored(this, e)) - return - - if (this.paused) { - this._emitQueue.push([index, e]) - return - } - - var abs = this._makeAbs(e) - - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } - - if (this.mark) - e = this._mark(e) - - this.matches[index][e] = true - - var st = this.statCache[abs] - if (st) - this.emit('stat', e, st) - - this.emit('match', e) -} - -Glob.prototype._readdirInGlobStar = function (abs, cb) { - if (this.aborted) - return - - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false, cb) - - var lstatkey = 'lstat\0' + abs - var self = this - var lstatcb = inflight(lstatkey, lstatcb_) - - if (lstatcb) - fs.lstat(abs, lstatcb) - - function lstatcb_ (er, lstat) { - if (er) - return cb() - - var isSym = lstat.isSymbolicLink() - self.symlinks[abs] = isSym - - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && !lstat.isDirectory()) { - self.cache[abs] = 'FILE' - cb() - } else - self._readdir(abs, false, cb) - } -} - -Glob.prototype._readdir = function (abs, inGlobStar, cb) { - if (this.aborted) - return - - cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) - if (!cb) - return - - //console.error('RD %j %j', +inGlobStar, abs) - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs, cb) - - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return cb() - - if (Array.isArray(c)) - return cb(null, c) - } - - var self = this - fs.readdir(abs, readdirCb(this, abs, cb)) -} - -function readdirCb (self, abs, cb) { - return function (er, entries) { - if (er) - self._readdirError(abs, er, cb) - else - self._readdirEntries(abs, entries, cb) - } -} - -Glob.prototype._readdirEntries = function (abs, entries, cb) { - if (this.aborted) - return - - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } - - this.cache[abs] = entries - return cb(null, entries) -} - -Glob.prototype._readdirError = function (f, er, cb) { - if (this.aborted) - return - - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - this.cache[this._makeAbs(f)] = 'FILE' - break - - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break - - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) { - this.emit('error', er) - // If the error is handled, then we abort - // if not, we threw out of here - this.abort() - } - if (!this.silent) - console.error('glob error', er) - break - } - - return cb() -} - -Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} - - -Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - //console.error('pgs2', prefix, remain[0], entries) - - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return cb() - - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) - - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false, cb) - - var isSym = this.symlinks[abs] - var len = entries.length - - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return cb() - - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue - - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true, cb) - - var below = gspref.concat(entries[i], remain) - this._process(below, index, true, cb) - } - - cb() -} - -Glob.prototype._processSimple = function (prefix, index, cb) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var self = this - this._stat(prefix, function (er, exists) { - self._processSimple2(prefix, index, er, exists, cb) - }) -} -Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { - - //console.error('ps2', prefix, exists) - - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return cb() - - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } - - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') - - // Mark this as a match - this._emitMatch(index, prefix) - cb() -} - -// Returns either 'DIR', 'FILE', or false -Glob.prototype._stat = function (f, cb) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' - - if (f.length > this.maxLength) - return cb() - - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] - - if (Array.isArray(c)) - c = 'DIR' - - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return cb(null, c) - - if (needDir && c === 'FILE') - return cb() - - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } - - var exists - var stat = this.statCache[abs] - if (stat !== undefined) { - if (stat === false) - return cb(null, stat) - else { - var type = stat.isDirectory() ? 'DIR' : 'FILE' - if (needDir && type === 'FILE') - return cb() - else - return cb(null, type, stat) - } - } - - var self = this - var statcb = inflight('stat\0' + abs, lstatcb_) - if (statcb) - fs.lstat(abs, statcb) - - function lstatcb_ (er, lstat) { - if (lstat && lstat.isSymbolicLink()) { - // If it's a symlink, then treat it as the target, unless - // the target does not exist, then treat it as a file. - return fs.stat(abs, function (er, stat) { - if (er) - self._stat2(f, abs, null, lstat, cb) - else - self._stat2(f, abs, er, stat, cb) - }) - } else { - self._stat2(f, abs, er, lstat, cb) - } - } -} - -Glob.prototype._stat2 = function (f, abs, er, stat, cb) { - if (er) { - this.statCache[abs] = false - return cb() - } - - var needDir = f.slice(-1) === '/' - this.statCache[abs] = stat - - if (abs.slice(-1) === '/' && !stat.isDirectory()) - return cb(null, false, stat) - - var c = stat.isDirectory() ? 'DIR' : 'FILE' - this.cache[abs] = this.cache[abs] || c - - if (needDir && c !== 'DIR') - return cb() - - return cb(null, c, stat) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/.eslintrc b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/.eslintrc deleted file mode 100644 index b7a1550..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/.eslintrc +++ /dev/null @@ -1,17 +0,0 @@ -{ - "env" : { - "node" : true - }, - "rules" : { - "semi": [2, "never"], - "strict": 0, - "quotes": [1, "single", "avoid-escape"], - "no-use-before-define": 0, - "curly": 0, - "no-underscore-dangle": 0, - "no-lonely-if": 1, - "no-unused-vars": [2, {"vars" : "all", "args" : "after-used"}], - "no-mixed-requires": 0, - "space-infix-ops": 0 - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/LICENSE deleted file mode 100644 index 05eeeb8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/README.md deleted file mode 100644 index 6dc8929..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# inflight - -Add callbacks to requests in flight to avoid async duplication - -## USAGE - -```javascript -var inflight = require('inflight') - -// some request that does some stuff -function req(key, callback) { - // key is any random string. like a url or filename or whatever. - // - // will return either a falsey value, indicating that the - // request for this key is already in flight, or a new callback - // which when called will call all callbacks passed to inflightk - // with the same key - callback = inflight(key, callback) - - // If we got a falsey value back, then there's already a req going - if (!callback) return - - // this is where you'd fetch the url or whatever - // callback is also once()-ified, so it can safely be assigned - // to multiple events etc. First call wins. - setTimeout(function() { - callback(null, key) - }, 100) -} - -// only assigns a single setTimeout -// when it dings, all cbs get called -req('foo', cb1) -req('foo', cb2) -req('foo', cb3) -req('foo', cb4) -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/inflight.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/inflight.js deleted file mode 100644 index 8bc96cb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/inflight.js +++ /dev/null @@ -1,44 +0,0 @@ -var wrappy = require('wrappy') -var reqs = Object.create(null) -var once = require('once') - -module.exports = wrappy(inflight) - -function inflight (key, cb) { - if (reqs[key]) { - reqs[key].push(cb) - return null - } else { - reqs[key] = [cb] - return makeres(key) - } -} - -function makeres (key) { - return once(function RES () { - var cbs = reqs[key] - var len = cbs.length - var args = slice(arguments) - for (var i = 0; i < len; i++) { - cbs[i].apply(null, args) - } - if (cbs.length > len) { - // added more in the interim. - // de-zalgo, just in case, but don't call again. - cbs.splice(0, len) - process.nextTick(function () { - RES.apply(null, args) - }) - } else { - delete reqs[key] - } - }) -} - -function slice (args) { - var length = args.length - var array = [] - - for (var i = 0; i < length; i++) array[i] = args[i] - return array -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md deleted file mode 100644 index 98eab25..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# wrappy - -Callback wrapping utility - -## USAGE - -```javascript -var wrappy = require("wrappy") - -// var wrapper = wrappy(wrapperFunction) - -// make sure a cb is called only once -// See also: http://npm.im/once for this specific use case -var once = wrappy(function (cb) { - var called = false - return function () { - if (called) return - called = true - return cb.apply(this, arguments) - } -}) - -function printBoo () { - console.log('boo') -} -// has some rando property -printBoo.iAmBooPrinter = true - -var onlyPrintOnce = once(printBoo) - -onlyPrintOnce() // prints 'boo' -onlyPrintOnce() // does nothing - -// random property is retained! -assert.equal(onlyPrintOnce.iAmBooPrinter, true) -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json deleted file mode 100644 index 8145dc8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "wrappy", - "version": "1.0.1", - "description": "Callback wrapping utility", - "main": "wrappy.js", - "directories": { - "test": "test" - }, - "dependencies": {}, - "devDependencies": { - "tap": "^0.4.12" - }, - "scripts": { - "test": "tap test/*.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/wrappy" - }, - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "ISC", - "bugs": { - "url": "https://github.com/npm/wrappy/issues" - }, - "homepage": "https://github.com/npm/wrappy", - "gitHead": "006a8cbac6b99988315834c207896eed71fd069a", - "_id": "wrappy@1.0.1", - "_shasum": "1e65969965ccbc2db4548c6b84a6f2c5aedd4739", - "_from": "wrappy@>=1.0.0 <2.0.0", - "_npmVersion": "2.0.0", - "_nodeVersion": "0.10.31", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "dist": { - "shasum": "1e65969965ccbc2db4548c6b84a6f2c5aedd4739", - "tarball": "http://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" - }, - "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js deleted file mode 100644 index 5ed0fcd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js +++ /dev/null @@ -1,51 +0,0 @@ -var test = require('tap').test -var wrappy = require('../wrappy.js') - -test('basic', function (t) { - function onceifier (cb) { - var called = false - return function () { - if (called) return - called = true - return cb.apply(this, arguments) - } - } - onceifier.iAmOnce = {} - var once = wrappy(onceifier) - t.equal(once.iAmOnce, onceifier.iAmOnce) - - var called = 0 - function boo () { - t.equal(called, 0) - called++ - } - // has some rando property - boo.iAmBoo = true - - var onlyPrintOnce = once(boo) - - onlyPrintOnce() // prints 'boo' - onlyPrintOnce() // does nothing - t.equal(called, 1) - - // random property is retained! - t.equal(onlyPrintOnce.iAmBoo, true) - - var logs = [] - var logwrap = wrappy(function (msg, cb) { - logs.push(msg + ' wrapping cb') - return function () { - logs.push(msg + ' before cb') - var ret = cb.apply(this, arguments) - logs.push(msg + ' after cb') - } - }) - - var c = logwrap('foo', function () { - t.same(logs, [ 'foo wrapping cb', 'foo before cb' ]) - }) - c() - t.same(logs, [ 'foo wrapping cb', 'foo before cb', 'foo after cb' ]) - - t.end() -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js deleted file mode 100644 index bb7e7d6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js +++ /dev/null @@ -1,33 +0,0 @@ -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -module.exports = wrappy -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') - - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k] - }) - - return wrapper - - function wrapper() { - var args = new Array(arguments.length) - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - var ret = fn.apply(this, args) - var cb = args[args.length-1] - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k] - }) - } - return ret - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/package.json deleted file mode 100644 index a6645bc..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "inflight", - "version": "1.0.4", - "description": "Add callbacks to requests in flight to avoid async duplication", - "main": "inflight.js", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - }, - "devDependencies": { - "tap": "^0.4.10" - }, - "scripts": { - "test": "tap test.js" - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/inflight" - }, - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/inflight/issues" - }, - "homepage": "https://github.com/isaacs/inflight", - "license": "ISC", - "gitHead": "c7b5531d572a867064d4a1da9e013e8910b7d1ba", - "_id": "inflight@1.0.4", - "_shasum": "6cbb4521ebd51ce0ec0a936bfd7657ef7e9b172a", - "_from": "inflight@>=1.0.4 <2.0.0", - "_npmVersion": "2.1.3", - "_nodeVersion": "0.10.32", - "_npmUser": { - "name": "othiym23", - "email": "ogd@aoaioxxysz.net" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - }, - { - "name": "othiym23", - "email": "ogd@aoaioxxysz.net" - }, - { - "name": "iarna", - "email": "me@re-becca.org" - } - ], - "dist": { - "shasum": "6cbb4521ebd51ce0ec0a936bfd7657ef7e9b172a", - "tarball": "http://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/test.js deleted file mode 100644 index 2bb75b3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inflight/test.js +++ /dev/null @@ -1,97 +0,0 @@ -var test = require('tap').test -var inf = require('./inflight.js') - - -function req (key, cb) { - cb = inf(key, cb) - if (cb) setTimeout(function () { - cb(key) - cb(key) - }) - return cb -} - -test('basic', function (t) { - var calleda = false - var a = req('key', function (k) { - t.notOk(calleda) - calleda = true - t.equal(k, 'key') - if (calledb) t.end() - }) - t.ok(a, 'first returned cb function') - - var calledb = false - var b = req('key', function (k) { - t.notOk(calledb) - calledb = true - t.equal(k, 'key') - if (calleda) t.end() - }) - - t.notOk(b, 'second should get falsey inflight response') -}) - -test('timing', function (t) { - var expect = [ - 'method one', - 'start one', - 'end one', - 'two', - 'tick', - 'three' - ] - var i = 0 - - function log (m) { - t.equal(m, expect[i], m + ' === ' + expect[i]) - ++i - if (i === expect.length) - t.end() - } - - function method (name, cb) { - log('method ' + name) - process.nextTick(cb) - } - - var one = inf('foo', function () { - log('start one') - var three = inf('foo', function () { - log('three') - }) - if (three) method('three', three) - log('end one') - }) - - method('one', one) - - var two = inf('foo', function () { - log('two') - }) - if (two) method('one', two) - - process.nextTick(log.bind(null, 'tick')) -}) - -test('parameters', function (t) { - t.plan(8) - - var a = inf('key', function (first, second, third) { - t.equal(first, 1) - t.equal(second, 2) - t.equal(third, 3) - }) - t.ok(a, 'first returned cb function') - - var b = inf('key', function (first, second, third) { - t.equal(first, 1) - t.equal(second, 2) - t.equal(third, 3) - }) - t.notOk(b, 'second should get falsey inflight response') - - setTimeout(function () { - a(1, 2, 3) - }) -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/LICENSE deleted file mode 100644 index dea3013..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/README.md deleted file mode 100644 index b1c5665..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/README.md +++ /dev/null @@ -1,42 +0,0 @@ -Browser-friendly inheritance fully compatible with standard node.js -[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). - -This package exports standard `inherits` from node.js `util` module in -node environment, but also provides alternative browser-friendly -implementation through [browser -field](https://gist.github.com/shtylman/4339901). Alternative -implementation is a literal copy of standard one located in standalone -module to avoid requiring of `util`. It also has a shim for old -browsers with no `Object.create` support. - -While keeping you sure you are using standard `inherits` -implementation in node.js environment, it allows bundlers such as -[browserify](https://github.com/substack/node-browserify) to not -include full `util` package to your client code if all you need is -just `inherits` function. It worth, because browser shim for `util` -package is large and `inherits` is often the single function you need -from it. - -It's recommended to use this package instead of -`require('util').inherits` for any code that has chances to be used -not only in node.js but in browser too. - -## usage - -```js -var inherits = require('inherits'); -// then use exactly as the standard one -``` - -## note on version ~1.0 - -Version ~1.0 had completely different motivation and is not compatible -neither with 2.0 nor with standard node.js `inherits`. - -If you are using version ~1.0 and planning to switch to ~2.0, be -careful: - -* new version uses `super_` instead of `super` for referencing - superclass -* new version overwrites current prototype while old one preserves any - existing fields on it diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits.js deleted file mode 100644 index 29f5e24..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('util').inherits diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits_browser.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits_browser.js deleted file mode 100644 index c1e78a7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/inherits_browser.js +++ /dev/null @@ -1,23 +0,0 @@ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/package.json deleted file mode 100644 index a703bdd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "inherits", - "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", - "version": "2.0.1", - "keywords": [ - "inheritance", - "class", - "klass", - "oop", - "object-oriented", - "inherits", - "browser", - "browserify" - ], - "main": "./inherits.js", - "browser": "./inherits_browser.js", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/inherits" - }, - "license": "ISC", - "scripts": { - "test": "node test" - }, - "bugs": { - "url": "https://github.com/isaacs/inherits/issues" - }, - "_id": "inherits@2.0.1", - "dist": { - "shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", - "tarball": "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "_from": "inherits@>=2.0.0 <3.0.0", - "_npmVersion": "1.3.8", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "directories": {}, - "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", - "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/isaacs/inherits" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/test.js deleted file mode 100644 index fc53012..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/inherits/test.js +++ /dev/null @@ -1,25 +0,0 @@ -var inherits = require('./inherits.js') -var assert = require('assert') - -function test(c) { - assert(c.constructor === Child) - assert(c.constructor.super_ === Parent) - assert(Object.getPrototypeOf(c) === Child.prototype) - assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) - assert(c instanceof Child) - assert(c instanceof Parent) -} - -function Child() { - Parent.call(this) - test(this) -} - -function Parent() {} - -inherits(Child, Parent) - -var c = new Child -test(c) - -console.log('ok') diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/README.md deleted file mode 100644 index d458bc2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/README.md +++ /dev/null @@ -1,216 +0,0 @@ -# minimatch - -A minimal matching utility. - -[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch) - - -This is the matching library used internally by npm. - -It works by converting glob expressions into JavaScript `RegExp` -objects. - -## Usage - -```javascript -var minimatch = require("minimatch") - -minimatch("bar.foo", "*.foo") // true! -minimatch("bar.foo", "*.bar") // false! -minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! -``` - -## Features - -Supports these glob features: - -* Brace Expansion -* Extended glob matching -* "Globstar" `**` matching - -See: - -* `man sh` -* `man bash` -* `man 3 fnmatch` -* `man 5 gitignore` - -## Minimatch Class - -Create a minimatch object by instanting the `minimatch.Minimatch` class. - -```javascript -var Minimatch = require("minimatch").Minimatch -var mm = new Minimatch(pattern, options) -``` - -### Properties - -* `pattern` The original pattern the minimatch object represents. -* `options` The options supplied to the constructor. -* `set` A 2-dimensional array of regexp or string expressions. - Each row in the - array corresponds to a brace-expanded pattern. Each item in the row - corresponds to a single path-part. For example, the pattern - `{a,b/c}/d` would expand to a set of patterns like: - - [ [ a, d ] - , [ b, c, d ] ] - - If a portion of the pattern doesn't have any "magic" in it - (that is, it's something like `"foo"` rather than `fo*o?`), then it - will be left as a string rather than converted to a regular - expression. - -* `regexp` Created by the `makeRe` method. A single regular expression - expressing the entire pattern. This is useful in cases where you wish - to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. -* `negate` True if the pattern is negated. -* `comment` True if the pattern is a comment. -* `empty` True if the pattern is `""`. - -### Methods - -* `makeRe` Generate the `regexp` member if necessary, and return it. - Will return `false` if the pattern is invalid. -* `match(fname)` Return true if the filename matches the pattern, or - false otherwise. -* `matchOne(fileArray, patternArray, partial)` Take a `/`-split - filename, and match it against a single row in the `regExpSet`. This - method is mainly for internal use, but is exposed so that it can be - used by a glob-walker that needs to avoid excessive filesystem calls. - -All other methods are internal, and will be called as necessary. - -## Functions - -The top-level exported function has a `cache` property, which is an LRU -cache set to store 100 items. So, calling these methods repeatedly -with the same pattern and options will use the same Minimatch object, -saving the cost of parsing it multiple times. - -### minimatch(path, pattern, options) - -Main export. Tests a path against the pattern using the options. - -```javascript -var isJS = minimatch(file, "*.js", { matchBase: true }) -``` - -### minimatch.filter(pattern, options) - -Returns a function that tests its -supplied argument, suitable for use with `Array.filter`. Example: - -```javascript -var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) -``` - -### minimatch.match(list, pattern, options) - -Match against the list of -files, in the style of fnmatch or glob. If nothing is matched, and -options.nonull is set, then return a list containing the pattern itself. - -```javascript -var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) -``` - -### minimatch.makeRe(pattern, options) - -Make a regular expression object from the pattern. - -## Options - -All options are `false` by default. - -### debug - -Dump a ton of stuff to stderr. - -### nobrace - -Do not expand `{a,b}` and `{1..3}` brace sets. - -### noglobstar - -Disable `**` matching against multiple folder names. - -### dot - -Allow patterns to match filenames starting with a period, even if -the pattern does not explicitly have a period in that spot. - -Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` -is set. - -### noext - -Disable "extglob" style patterns like `+(a|b)`. - -### nocase - -Perform a case-insensitive match. - -### nonull - -When a match is not found by `minimatch.match`, return a list containing -the pattern itself if this option is set. When not set, an empty list -is returned if there are no matches. - -### matchBase - -If set, then patterns without slashes will be matched -against the basename of the path if it contains slashes. For example, -`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. - -### nocomment - -Suppress the behavior of treating `#` at the start of a pattern as a -comment. - -### nonegate - -Suppress the behavior of treating a leading `!` character as negation. - -### flipNegate - -Returns from negate expressions the same as if they were not negated. -(Ie, true on a hit, false on a miss.) - - -## Comparisons to other fnmatch/glob implementations - -While strict compliance with the existing standards is a worthwhile -goal, some discrepancies exist between minimatch and other -implementations, and are intentional. - -If the pattern starts with a `!` character, then it is negated. Set the -`nonegate` flag to suppress this behavior, and treat leading `!` -characters normally. This is perhaps relevant if you wish to start the -pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` -characters at the start of a pattern will negate the pattern multiple -times. - -If a pattern starts with `#`, then it is treated as a comment, and -will not match anything. Use `\#` to match a literal `#` at the -start of a line, or set the `nocomment` flag to suppress this behavior. - -The double-star character `**` is supported by default, unless the -`noglobstar` flag is set. This is supported in the manner of bsdglob -and bash 4.1, where `**` only has special significance if it is the only -thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but -`a/**b` will not. - -If an escaped pattern has no matches, and the `nonull` flag is set, -then minimatch.match returns the pattern as-provided, rather than -interpreting the character escapes. For example, -`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than -`"*a?"`. This is akin to setting the `nullglob` option in bash, except -that it does not resolve escaped pattern characters. - -If brace expansion is not disabled, then it is performed before any -other interpretation of the glob pattern. Thus, a pattern like -`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded -**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are -checked for validity. Since those two are valid, matching proceeds. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/browser.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/browser.js deleted file mode 100644 index 7d05159..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/browser.js +++ /dev/null @@ -1,1159 +0,0 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.minimatch = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o any number of characters -var star = qmark + '*?' - -// ** when dots are allowed. Anything goes, except .. and . -// not (^ or / followed by one or two dots followed by $ or /), -// followed by anything, any number of times. -var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' - -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' - -// characters that need to be escaped in RegExp. -var reSpecials = charSet('().*{}+?[]^$\\!') - -// "abc" -> { a:true, b:true, c:true } -function charSet (s) { - return s.split('').reduce(function (set, c) { - set[c] = true - return set - }, {}) -} - -// normalizes slashes. -var slashSplit = /\/+/ - -minimatch.filter = filter -function filter (pattern, options) { - options = options || {} - return function (p, i, list) { - return minimatch(p, pattern, options) - } -} - -function ext (a, b) { - a = a || {} - b = b || {} - var t = {} - Object.keys(b).forEach(function (k) { - t[k] = b[k] - }) - Object.keys(a).forEach(function (k) { - t[k] = a[k] - }) - return t -} - -minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return minimatch - - var orig = minimatch - - var m = function minimatch (p, pattern, options) { - return orig.minimatch(p, pattern, ext(def, options)) - } - - m.Minimatch = function Minimatch (pattern, options) { - return new orig.Minimatch(pattern, ext(def, options)) - } - - return m -} - -Minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return Minimatch - return minimatch.defaults(def).Minimatch -} - -function minimatch (p, pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {} - - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - return false - } - - // "" only matches "" - if (pattern.trim() === '') return p === '' - - return new Minimatch(pattern, options).match(p) -} - -function Minimatch (pattern, options) { - if (!(this instanceof Minimatch)) { - return new Minimatch(pattern, options) - } - - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {} - pattern = pattern.trim() - - // windows support: need to use /, not \ - if (path.sep !== '/') { - pattern = pattern.split(path.sep).join('/') - } - - this.options = options - this.set = [] - this.pattern = pattern - this.regexp = null - this.negate = false - this.comment = false - this.empty = false - - // make the set of regexps etc. - this.make() -} - -Minimatch.prototype.debug = function () {} - -Minimatch.prototype.make = make -function make () { - // don't do it more than once. - if (this._made) return - - var pattern = this.pattern - var options = this.options - - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - this.comment = true - return - } - if (!pattern) { - this.empty = true - return - } - - // step 1: figure out negation, etc. - this.parseNegate() - - // step 2: expand braces - var set = this.globSet = this.braceExpand() - - if (options.debug) this.debug = console.error - - this.debug(this.pattern, set) - - // step 3: now we have a set, so turn each one into a series of path-portion - // matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - set = this.globParts = set.map(function (s) { - return s.split(slashSplit) - }) - - this.debug(this.pattern, set) - - // glob --> regexps - set = set.map(function (s, si, set) { - return s.map(this.parse, this) - }, this) - - this.debug(this.pattern, set) - - // filter out everything that didn't compile properly. - set = set.filter(function (s) { - return s.indexOf(false) === -1 - }) - - this.debug(this.pattern, set) - - this.set = set -} - -Minimatch.prototype.parseNegate = parseNegate -function parseNegate () { - var pattern = this.pattern - var negate = false - var options = this.options - var negateOffset = 0 - - if (options.nonegate) return - - for (var i = 0, l = pattern.length - ; i < l && pattern.charAt(i) === '!' - ; i++) { - negate = !negate - negateOffset++ - } - - if (negateOffset) this.pattern = pattern.substr(negateOffset) - this.negate = negate -} - -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -minimatch.braceExpand = function (pattern, options) { - return braceExpand(pattern, options) -} - -Minimatch.prototype.braceExpand = braceExpand - -function braceExpand (pattern, options) { - if (!options) { - if (this instanceof Minimatch) { - options = this.options - } else { - options = {} - } - } - - pattern = typeof pattern === 'undefined' - ? this.pattern : pattern - - if (typeof pattern === 'undefined') { - throw new Error('undefined pattern') - } - - if (options.nobrace || - !pattern.match(/\{.*\}/)) { - // shortcut. no need to expand. - return [pattern] - } - - return expand(pattern) -} - -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -Minimatch.prototype.parse = parse -var SUBPARSE = {} -function parse (pattern, isSub) { - var options = this.options - - // shortcuts - if (!options.noglobstar && pattern === '**') return GLOBSTAR - if (pattern === '') return '' - - var re = '' - var hasMagic = !!options.nocase - var escaping = false - // ? => one single character - var patternListStack = [] - var negativeLists = [] - var plType - var stateChar - var inClass = false - var reClassStart = -1 - var classStart = -1 - // . and .. never match anything that doesn't start with ., - // even when options.dot is set. - var patternStart = pattern.charAt(0) === '.' ? '' // anything - // not (start or / followed by . or .. followed by / or end) - : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' - : '(?!\\.)' - var self = this - - function clearStateChar () { - if (stateChar) { - // we had some state-tracking character - // that wasn't consumed by this pass. - switch (stateChar) { - case '*': - re += star - hasMagic = true - break - case '?': - re += qmark - hasMagic = true - break - default: - re += '\\' + stateChar - break - } - self.debug('clearStateChar %j %j', stateChar, re) - stateChar = false - } - } - - for (var i = 0, len = pattern.length, c - ; (i < len) && (c = pattern.charAt(i)) - ; i++) { - this.debug('%s\t%s %s %j', pattern, i, re, c) - - // skip over any that are escaped. - if (escaping && reSpecials[c]) { - re += '\\' + c - escaping = false - continue - } - - switch (c) { - case '/': - // completely not allowed, even escaped. - // Should already be path-split by now. - return false - - case '\\': - clearStateChar() - escaping = true - continue - - // the various stateChar values - // for the "extglob" stuff. - case '?': - case '*': - case '+': - case '@': - case '!': - this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) - - // all of those are literals inside a class, except that - // the glob [!a] means [^a] in regexp - if (inClass) { - this.debug(' in class') - if (c === '!' && i === classStart + 1) c = '^' - re += c - continue - } - - // if we already have a stateChar, then it means - // that there was something like ** or +? in there. - // Handle the stateChar, then proceed with this one. - self.debug('call clearStateChar %j', stateChar) - clearStateChar() - stateChar = c - // if extglob is disabled, then +(asdf|foo) isn't a thing. - // just clear the statechar *now*, rather than even diving into - // the patternList stuff. - if (options.noext) clearStateChar() - continue - - case '(': - if (inClass) { - re += '(' - continue - } - - if (!stateChar) { - re += '\\(' - continue - } - - plType = stateChar - patternListStack.push({ - type: plType, - start: i - 1, - reStart: re.length - }) - // negation is (?:(?!js)[^/]*) - re += stateChar === '!' ? '(?:(?!(?:' : '(?:' - this.debug('plType %j %j', stateChar, re) - stateChar = false - continue - - case ')': - if (inClass || !patternListStack.length) { - re += '\\)' - continue - } - - clearStateChar() - hasMagic = true - re += ')' - var pl = patternListStack.pop() - plType = pl.type - // negation is (?:(?!js)[^/]*) - // The others are (?:) - switch (plType) { - case '!': - negativeLists.push(pl) - re += ')[^/]*?)' - pl.reEnd = re.length - break - case '?': - case '+': - case '*': - re += plType - break - case '@': break // the default anyway - } - continue - - case '|': - if (inClass || !patternListStack.length || escaping) { - re += '\\|' - escaping = false - continue - } - - clearStateChar() - re += '|' - continue - - // these are mostly the same in regexp and glob - case '[': - // swallow any state-tracking char before the [ - clearStateChar() - - if (inClass) { - re += '\\' + c - continue - } - - inClass = true - classStart = i - reClassStart = re.length - re += c - continue - - case ']': - // a right bracket shall lose its special - // meaning and represent itself in - // a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - if (i === classStart + 1 || !inClass) { - re += '\\' + c - escaping = false - continue - } - - // handle the case where we left a class open. - // "[z-a]" is valid, equivalent to "\[z-a\]" - if (inClass) { - // split where the last [ was, make sure we don't have - // an invalid re. if so, re-walk the contents of the - // would-be class to re-translate any characters that - // were passed through as-is - // TODO: It would probably be faster to determine this - // without a try/catch and a new RegExp, but it's tricky - // to do safely. For now, this is safe and works. - var cs = pattern.substring(classStart + 1, i) - try { - RegExp('[' + cs + ']') - } catch (er) { - // not a valid class! - var sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' - hasMagic = hasMagic || sp[1] - inClass = false - continue - } - } - - // finish up the class. - hasMagic = true - inClass = false - re += c - continue - - default: - // swallow any state char that wasn't consumed - clearStateChar() - - if (escaping) { - // no need - escaping = false - } else if (reSpecials[c] - && !(c === '^' && inClass)) { - re += '\\' - } - - re += c - - } // switch - } // for - - // handle the case where we left a class open. - // "[abc" is valid, equivalent to "\[abc" - if (inClass) { - // split where the last [ was, and escape it - // this is a huge pita. We now have to re-walk - // the contents of the would-be class to re-translate - // any characters that were passed through as-is - cs = pattern.substr(classStart + 1) - sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] - hasMagic = hasMagic || sp[1] - } - - // handle the case where we had a +( thing at the *end* - // of the pattern. - // each pattern list stack adds 3 chars, and we need to go through - // and escape any | chars that were passed through as-is for the regexp. - // Go through and escape them, taking care not to double-escape any - // | chars that were already escaped. - for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + 3) - // maybe some even number of \, then maybe 1 \, followed by a | - tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { - if (!$2) { - // the | isn't already escaped, so escape it. - $2 = '\\' - } - - // need to escape all those slashes *again*, without escaping the - // one that we need for escaping the | character. As it works out, - // escaping an even number of slashes can be done by simply repeating - // it exactly after itself. That's why this trick works. - // - // I am sorry that you have to see this. - return $1 + $1 + $2 + '|' - }) - - this.debug('tail=%j\n %s', tail, tail) - var t = pl.type === '*' ? star - : pl.type === '?' ? qmark - : '\\' + pl.type - - hasMagic = true - re = re.slice(0, pl.reStart) + t + '\\(' + tail - } - - // handle trailing things that only matter at the very end. - clearStateChar() - if (escaping) { - // trailing \\ - re += '\\\\' - } - - // only need to apply the nodot start if the re starts with - // something that could conceivably capture a dot - var addPatternStart = false - switch (re.charAt(0)) { - case '.': - case '[': - case '(': addPatternStart = true - } - - // Hack to work around lack of negative lookbehind in JS - // A pattern like: *.!(x).!(y|z) needs to ensure that a name - // like 'a.xyz.yz' doesn't match. So, the first negative - // lookahead, has to look ALL the way ahead, to the end of - // the pattern. - for (var n = negativeLists.length - 1; n > -1; n--) { - var nl = negativeLists[n] - - var nlBefore = re.slice(0, nl.reStart) - var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) - var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) - var nlAfter = re.slice(nl.reEnd) - - nlLast += nlAfter - - // Handle nested stuff like *(*.js|!(*.json)), where open parens - // mean that we should *not* include the ) in the bit that is considered - // "after" the negated section. - var openParensBefore = nlBefore.split('(').length - 1 - var cleanAfter = nlAfter - for (i = 0; i < openParensBefore; i++) { - cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') - } - nlAfter = cleanAfter - - var dollar = '' - if (nlAfter === '' && isSub !== SUBPARSE) { - dollar = '$' - } - var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast - re = newRe - } - - // if the re is not "" at this point, then we need to make sure - // it doesn't match against an empty path part. - // Otherwise a/* will match a/, which it should not. - if (re !== '' && hasMagic) { - re = '(?=.)' + re - } - - if (addPatternStart) { - re = patternStart + re - } - - // parsing just a piece of a larger pattern. - if (isSub === SUBPARSE) { - return [re, hasMagic] - } - - // skip the regexp for non-magical patterns - // unescape anything in it, though, so that it'll be - // an exact match against a file etc. - if (!hasMagic) { - return globUnescape(pattern) - } - - var flags = options.nocase ? 'i' : '' - var regExp = new RegExp('^' + re + '$', flags) - - regExp._glob = pattern - regExp._src = re - - return regExp -} - -minimatch.makeRe = function (pattern, options) { - return new Minimatch(pattern, options || {}).makeRe() -} - -Minimatch.prototype.makeRe = makeRe -function makeRe () { - if (this.regexp || this.regexp === false) return this.regexp - - // at this point, this.set is a 2d array of partial - // pattern strings, or "**". - // - // It's better to use .match(). This function shouldn't - // be used, really, but it's pretty convenient sometimes, - // when you just want to work with a regex. - var set = this.set - - if (!set.length) { - this.regexp = false - return this.regexp - } - var options = this.options - - var twoStar = options.noglobstar ? star - : options.dot ? twoStarDot - : twoStarNoDot - var flags = options.nocase ? 'i' : '' - - var re = set.map(function (pattern) { - return pattern.map(function (p) { - return (p === GLOBSTAR) ? twoStar - : (typeof p === 'string') ? regExpEscape(p) - : p._src - }).join('\\\/') - }).join('|') - - // must match entire pattern - // ending in a * or ** will make it less strict. - re = '^(?:' + re + ')$' - - // can match anything, as long as it's not this. - if (this.negate) re = '^(?!' + re + ').*$' - - try { - this.regexp = new RegExp(re, flags) - } catch (ex) { - this.regexp = false - } - return this.regexp -} - -minimatch.match = function (list, pattern, options) { - options = options || {} - var mm = new Minimatch(pattern, options) - list = list.filter(function (f) { - return mm.match(f) - }) - if (mm.options.nonull && !list.length) { - list.push(pattern) - } - return list -} - -Minimatch.prototype.match = match -function match (f, partial) { - this.debug('match', f, this.pattern) - // short-circuit in the case of busted things. - // comments, etc. - if (this.comment) return false - if (this.empty) return f === '' - - if (f === '/' && partial) return true - - var options = this.options - - // windows: need to use /, not \ - if (path.sep !== '/') { - f = f.split(path.sep).join('/') - } - - // treat the test path as a set of pathparts. - f = f.split(slashSplit) - this.debug(this.pattern, 'split', f) - - // just ONE of the pattern sets in this.set needs to match - // in order for it to be valid. If negating, then just one - // match means that we have failed. - // Either way, return on the first hit. - - var set = this.set - this.debug(this.pattern, 'set', set) - - // Find the basename of the path by looking for the last non-empty segment - var filename - var i - for (i = f.length - 1; i >= 0; i--) { - filename = f[i] - if (filename) break - } - - for (i = 0; i < set.length; i++) { - var pattern = set[i] - var file = f - if (options.matchBase && pattern.length === 1) { - file = [filename] - } - var hit = this.matchOne(file, pattern, partial) - if (hit) { - if (options.flipNegate) return true - return !this.negate - } - } - - // didn't get any hits. this is success if it's a negative - // pattern, failure otherwise. - if (options.flipNegate) return false - return this.negate -} - -// set partial to true to test if, for example, -// "/a/b" matches the start of "/*/b/*/d" -// Partial means, if you run out of file before you run -// out of pattern, then that's fine, as long as all -// the parts match. -Minimatch.prototype.matchOne = function (file, pattern, partial) { - var options = this.options - - this.debug('matchOne', - { 'this': this, file: file, pattern: pattern }) - - this.debug('matchOne', file.length, pattern.length) - - for (var fi = 0, - pi = 0, - fl = file.length, - pl = pattern.length - ; (fi < fl) && (pi < pl) - ; fi++, pi++) { - this.debug('matchOne loop') - var p = pattern[pi] - var f = file[fi] - - this.debug(pattern, p, f) - - // should be impossible. - // some invalid regexp stuff in the set. - if (p === false) return false - - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]) - - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi - var pr = pi + 1 - if (pr === pl) { - this.debug('** at the end') - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) return false - } - return true - } - - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr] - - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) - - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee) - // found a match. - return true - } else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr) - break - } - - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue') - fr++ - } - } - - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - // If there's more *pattern* left, then - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr) - if (fr === fl) return true - } - return false - } - - // something other than ** - // non-magic patterns just have to match exactly - // patterns with magic have been turned into regexps. - var hit - if (typeof p === 'string') { - if (options.nocase) { - hit = f.toLowerCase() === p.toLowerCase() - } else { - hit = f === p - } - this.debug('string match', p, f, hit) - } else { - hit = f.match(p) - this.debug('pattern match', p, f, hit) - } - - if (!hit) return false - } - - // Note: ending in / means that we'll get a final "" - // at the end of the pattern. This can only match a - // corresponding "" at the end of the file. - // If the file ends in /, then it can only match a - // a pattern that ends in /, unless the pattern just - // doesn't have any more for it. But, a/b/ should *not* - // match "a/b/*", even though "" matches against the - // [^/]*? pattern, except in partial mode, where it might - // simply not be reached yet. - // However, a/b/ should still satisfy a/* - - // now either we fell off the end of the pattern, or we're done. - if (fi === fl && pi === pl) { - // ran out of pattern and filename at the same time. - // an exact hit! - return true - } else if (fi === fl) { - // ran out of file, but still had pattern left. - // this is ok if we're doing the match as part of - // a glob fs traversal. - return partial - } else if (pi === pl) { - // ran out of pattern, still have file left. - // this is only acceptable if we're on the very last - // empty segment of a file with a trailing slash. - // a/* should match a/b/ - var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') - return emptyFileEnd - } - - // should be unreachable. - throw new Error('wtf?') -} - -// replace stuff like \* with * -function globUnescape (s) { - return s.replace(/\\(.)/g, '$1') -} - -function regExpEscape (s) { - return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') -} - -},{"brace-expansion":2,"path":undefined}],2:[function(require,module,exports){ -var concatMap = require('concat-map'); -var balanced = require('balanced-match'); - -module.exports = expandTop; - -var escSlash = '\0SLASH'+Math.random()+'\0'; -var escOpen = '\0OPEN'+Math.random()+'\0'; -var escClose = '\0CLOSE'+Math.random()+'\0'; -var escComma = '\0COMMA'+Math.random()+'\0'; -var escPeriod = '\0PERIOD'+Math.random()+'\0'; - -function numeric(str) { - return parseInt(str, 10) == str - ? parseInt(str, 10) - : str.charCodeAt(0); -} - -function escapeBraces(str) { - return str.split('\\\\').join(escSlash) - .split('\\{').join(escOpen) - .split('\\}').join(escClose) - .split('\\,').join(escComma) - .split('\\.').join(escPeriod); -} - -function unescapeBraces(str) { - return str.split(escSlash).join('\\') - .split(escOpen).join('{') - .split(escClose).join('}') - .split(escComma).join(',') - .split(escPeriod).join('.'); -} - - -// Basically just str.split(","), but handling cases -// where we have nested braced sections, which should be -// treated as individual members, like {a,{b,c},d} -function parseCommaParts(str) { - if (!str) - return ['']; - - var parts = []; - var m = balanced('{', '}', str); - - if (!m) - return str.split(','); - - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(','); - - p[p.length-1] += '{' + body + '}'; - var postParts = parseCommaParts(post); - if (post.length) { - p[p.length-1] += postParts.shift(); - p.push.apply(p, postParts); - } - - parts.push.apply(parts, p); - - return parts; -} - -function expandTop(str) { - if (!str) - return []; - - var expansions = expand(escapeBraces(str)); - return expansions.filter(identity).map(unescapeBraces); -} - -function identity(e) { - return e; -} - -function embrace(str) { - return '{' + str + '}'; -} -function isPadded(el) { - return /^-?0\d/.test(el); -} - -function lte(i, y) { - return i <= y; -} -function gte(i, y) { - return i >= y; -} - -function expand(str) { - var expansions = []; - - var m = balanced('{', '}', str); - if (!m || /\$$/.test(m.pre)) return [str]; - - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = /^(.*,)+(.+)?$/.test(m.body); - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,.*}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str); - } - return [str]; - } - - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0]).map(embrace); - if (n.length === 1) { - var post = m.post.length - ? expand(m.post) - : ['']; - return post.map(function(p) { - return m.pre + n[0] + p; - }); - } - } - } - - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. - - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post) - : ['']; - - var N; - - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length) - var incr = n.length == 3 - ? Math.abs(numeric(n[2])) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); - - N = []; - - for (var i = x; test(i, y); i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; - } - } - } - N.push(c); - } - } else { - N = concatMap(n, function(el) { return expand(el) }); - } - - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - expansions.push([pre, N[j], post[k]].join('')) - } - } - - return expansions; -} - - -},{"balanced-match":3,"concat-map":4}],3:[function(require,module,exports){ -module.exports = balanced; -function balanced(a, b, str) { - var bal = 0; - var m = {}; - var ended = false; - - for (var i = 0; i < str.length; i++) { - if (a == str.substr(i, a.length)) { - if (!('start' in m)) m.start = i; - bal++; - } - else if (b == str.substr(i, b.length) && 'start' in m) { - ended = true; - bal--; - if (!bal) { - m.end = i; - m.pre = str.substr(0, m.start); - m.body = (m.end - m.start > 1) - ? str.substring(m.start + a.length, m.end) - : ''; - m.post = str.slice(m.end + b.length); - return m; - } - } - } - - // if we opened more than we closed, find the one we closed - if (bal && ended) { - var start = m.start + a.length; - m = balanced(a, b, str.substr(start)); - if (m) { - m.start += start; - m.end += start; - m.pre = str.slice(0, start) + m.pre; - } - return m; - } -} - -},{}],4:[function(require,module,exports){ -module.exports = function (xs, fn) { - var res = []; - for (var i = 0; i < xs.length; i++) { - var x = fn(xs[i], i); - if (Array.isArray(x)) res.push.apply(res, x); - else res.push(x); - } - return res; -}; - -},{}]},{},[1])(1) -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js deleted file mode 100644 index ec4c05c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/minimatch.js +++ /dev/null @@ -1,912 +0,0 @@ -module.exports = minimatch -minimatch.Minimatch = Minimatch - -var path = { sep: '/' } -try { - path = require('path') -} catch (er) {} - -var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} -var expand = require('brace-expansion') - -// any single thing other than / -// don't need to escape / when using new RegExp() -var qmark = '[^/]' - -// * => any number of characters -var star = qmark + '*?' - -// ** when dots are allowed. Anything goes, except .. and . -// not (^ or / followed by one or two dots followed by $ or /), -// followed by anything, any number of times. -var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' - -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' - -// characters that need to be escaped in RegExp. -var reSpecials = charSet('().*{}+?[]^$\\!') - -// "abc" -> { a:true, b:true, c:true } -function charSet (s) { - return s.split('').reduce(function (set, c) { - set[c] = true - return set - }, {}) -} - -// normalizes slashes. -var slashSplit = /\/+/ - -minimatch.filter = filter -function filter (pattern, options) { - options = options || {} - return function (p, i, list) { - return minimatch(p, pattern, options) - } -} - -function ext (a, b) { - a = a || {} - b = b || {} - var t = {} - Object.keys(b).forEach(function (k) { - t[k] = b[k] - }) - Object.keys(a).forEach(function (k) { - t[k] = a[k] - }) - return t -} - -minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return minimatch - - var orig = minimatch - - var m = function minimatch (p, pattern, options) { - return orig.minimatch(p, pattern, ext(def, options)) - } - - m.Minimatch = function Minimatch (pattern, options) { - return new orig.Minimatch(pattern, ext(def, options)) - } - - return m -} - -Minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return Minimatch - return minimatch.defaults(def).Minimatch -} - -function minimatch (p, pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {} - - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - return false - } - - // "" only matches "" - if (pattern.trim() === '') return p === '' - - return new Minimatch(pattern, options).match(p) -} - -function Minimatch (pattern, options) { - if (!(this instanceof Minimatch)) { - return new Minimatch(pattern, options) - } - - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {} - pattern = pattern.trim() - - // windows support: need to use /, not \ - if (path.sep !== '/') { - pattern = pattern.split(path.sep).join('/') - } - - this.options = options - this.set = [] - this.pattern = pattern - this.regexp = null - this.negate = false - this.comment = false - this.empty = false - - // make the set of regexps etc. - this.make() -} - -Minimatch.prototype.debug = function () {} - -Minimatch.prototype.make = make -function make () { - // don't do it more than once. - if (this._made) return - - var pattern = this.pattern - var options = this.options - - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - this.comment = true - return - } - if (!pattern) { - this.empty = true - return - } - - // step 1: figure out negation, etc. - this.parseNegate() - - // step 2: expand braces - var set = this.globSet = this.braceExpand() - - if (options.debug) this.debug = console.error - - this.debug(this.pattern, set) - - // step 3: now we have a set, so turn each one into a series of path-portion - // matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - set = this.globParts = set.map(function (s) { - return s.split(slashSplit) - }) - - this.debug(this.pattern, set) - - // glob --> regexps - set = set.map(function (s, si, set) { - return s.map(this.parse, this) - }, this) - - this.debug(this.pattern, set) - - // filter out everything that didn't compile properly. - set = set.filter(function (s) { - return s.indexOf(false) === -1 - }) - - this.debug(this.pattern, set) - - this.set = set -} - -Minimatch.prototype.parseNegate = parseNegate -function parseNegate () { - var pattern = this.pattern - var negate = false - var options = this.options - var negateOffset = 0 - - if (options.nonegate) return - - for (var i = 0, l = pattern.length - ; i < l && pattern.charAt(i) === '!' - ; i++) { - negate = !negate - negateOffset++ - } - - if (negateOffset) this.pattern = pattern.substr(negateOffset) - this.negate = negate -} - -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -minimatch.braceExpand = function (pattern, options) { - return braceExpand(pattern, options) -} - -Minimatch.prototype.braceExpand = braceExpand - -function braceExpand (pattern, options) { - if (!options) { - if (this instanceof Minimatch) { - options = this.options - } else { - options = {} - } - } - - pattern = typeof pattern === 'undefined' - ? this.pattern : pattern - - if (typeof pattern === 'undefined') { - throw new Error('undefined pattern') - } - - if (options.nobrace || - !pattern.match(/\{.*\}/)) { - // shortcut. no need to expand. - return [pattern] - } - - return expand(pattern) -} - -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -Minimatch.prototype.parse = parse -var SUBPARSE = {} -function parse (pattern, isSub) { - var options = this.options - - // shortcuts - if (!options.noglobstar && pattern === '**') return GLOBSTAR - if (pattern === '') return '' - - var re = '' - var hasMagic = !!options.nocase - var escaping = false - // ? => one single character - var patternListStack = [] - var negativeLists = [] - var plType - var stateChar - var inClass = false - var reClassStart = -1 - var classStart = -1 - // . and .. never match anything that doesn't start with ., - // even when options.dot is set. - var patternStart = pattern.charAt(0) === '.' ? '' // anything - // not (start or / followed by . or .. followed by / or end) - : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' - : '(?!\\.)' - var self = this - - function clearStateChar () { - if (stateChar) { - // we had some state-tracking character - // that wasn't consumed by this pass. - switch (stateChar) { - case '*': - re += star - hasMagic = true - break - case '?': - re += qmark - hasMagic = true - break - default: - re += '\\' + stateChar - break - } - self.debug('clearStateChar %j %j', stateChar, re) - stateChar = false - } - } - - for (var i = 0, len = pattern.length, c - ; (i < len) && (c = pattern.charAt(i)) - ; i++) { - this.debug('%s\t%s %s %j', pattern, i, re, c) - - // skip over any that are escaped. - if (escaping && reSpecials[c]) { - re += '\\' + c - escaping = false - continue - } - - switch (c) { - case '/': - // completely not allowed, even escaped. - // Should already be path-split by now. - return false - - case '\\': - clearStateChar() - escaping = true - continue - - // the various stateChar values - // for the "extglob" stuff. - case '?': - case '*': - case '+': - case '@': - case '!': - this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) - - // all of those are literals inside a class, except that - // the glob [!a] means [^a] in regexp - if (inClass) { - this.debug(' in class') - if (c === '!' && i === classStart + 1) c = '^' - re += c - continue - } - - // if we already have a stateChar, then it means - // that there was something like ** or +? in there. - // Handle the stateChar, then proceed with this one. - self.debug('call clearStateChar %j', stateChar) - clearStateChar() - stateChar = c - // if extglob is disabled, then +(asdf|foo) isn't a thing. - // just clear the statechar *now*, rather than even diving into - // the patternList stuff. - if (options.noext) clearStateChar() - continue - - case '(': - if (inClass) { - re += '(' - continue - } - - if (!stateChar) { - re += '\\(' - continue - } - - plType = stateChar - patternListStack.push({ - type: plType, - start: i - 1, - reStart: re.length - }) - // negation is (?:(?!js)[^/]*) - re += stateChar === '!' ? '(?:(?!(?:' : '(?:' - this.debug('plType %j %j', stateChar, re) - stateChar = false - continue - - case ')': - if (inClass || !patternListStack.length) { - re += '\\)' - continue - } - - clearStateChar() - hasMagic = true - re += ')' - var pl = patternListStack.pop() - plType = pl.type - // negation is (?:(?!js)[^/]*) - // The others are (?:) - switch (plType) { - case '!': - negativeLists.push(pl) - re += ')[^/]*?)' - pl.reEnd = re.length - break - case '?': - case '+': - case '*': - re += plType - break - case '@': break // the default anyway - } - continue - - case '|': - if (inClass || !patternListStack.length || escaping) { - re += '\\|' - escaping = false - continue - } - - clearStateChar() - re += '|' - continue - - // these are mostly the same in regexp and glob - case '[': - // swallow any state-tracking char before the [ - clearStateChar() - - if (inClass) { - re += '\\' + c - continue - } - - inClass = true - classStart = i - reClassStart = re.length - re += c - continue - - case ']': - // a right bracket shall lose its special - // meaning and represent itself in - // a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - if (i === classStart + 1 || !inClass) { - re += '\\' + c - escaping = false - continue - } - - // handle the case where we left a class open. - // "[z-a]" is valid, equivalent to "\[z-a\]" - if (inClass) { - // split where the last [ was, make sure we don't have - // an invalid re. if so, re-walk the contents of the - // would-be class to re-translate any characters that - // were passed through as-is - // TODO: It would probably be faster to determine this - // without a try/catch and a new RegExp, but it's tricky - // to do safely. For now, this is safe and works. - var cs = pattern.substring(classStart + 1, i) - try { - RegExp('[' + cs + ']') - } catch (er) { - // not a valid class! - var sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' - hasMagic = hasMagic || sp[1] - inClass = false - continue - } - } - - // finish up the class. - hasMagic = true - inClass = false - re += c - continue - - default: - // swallow any state char that wasn't consumed - clearStateChar() - - if (escaping) { - // no need - escaping = false - } else if (reSpecials[c] - && !(c === '^' && inClass)) { - re += '\\' - } - - re += c - - } // switch - } // for - - // handle the case where we left a class open. - // "[abc" is valid, equivalent to "\[abc" - if (inClass) { - // split where the last [ was, and escape it - // this is a huge pita. We now have to re-walk - // the contents of the would-be class to re-translate - // any characters that were passed through as-is - cs = pattern.substr(classStart + 1) - sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] - hasMagic = hasMagic || sp[1] - } - - // handle the case where we had a +( thing at the *end* - // of the pattern. - // each pattern list stack adds 3 chars, and we need to go through - // and escape any | chars that were passed through as-is for the regexp. - // Go through and escape them, taking care not to double-escape any - // | chars that were already escaped. - for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + 3) - // maybe some even number of \, then maybe 1 \, followed by a | - tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { - if (!$2) { - // the | isn't already escaped, so escape it. - $2 = '\\' - } - - // need to escape all those slashes *again*, without escaping the - // one that we need for escaping the | character. As it works out, - // escaping an even number of slashes can be done by simply repeating - // it exactly after itself. That's why this trick works. - // - // I am sorry that you have to see this. - return $1 + $1 + $2 + '|' - }) - - this.debug('tail=%j\n %s', tail, tail) - var t = pl.type === '*' ? star - : pl.type === '?' ? qmark - : '\\' + pl.type - - hasMagic = true - re = re.slice(0, pl.reStart) + t + '\\(' + tail - } - - // handle trailing things that only matter at the very end. - clearStateChar() - if (escaping) { - // trailing \\ - re += '\\\\' - } - - // only need to apply the nodot start if the re starts with - // something that could conceivably capture a dot - var addPatternStart = false - switch (re.charAt(0)) { - case '.': - case '[': - case '(': addPatternStart = true - } - - // Hack to work around lack of negative lookbehind in JS - // A pattern like: *.!(x).!(y|z) needs to ensure that a name - // like 'a.xyz.yz' doesn't match. So, the first negative - // lookahead, has to look ALL the way ahead, to the end of - // the pattern. - for (var n = negativeLists.length - 1; n > -1; n--) { - var nl = negativeLists[n] - - var nlBefore = re.slice(0, nl.reStart) - var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) - var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) - var nlAfter = re.slice(nl.reEnd) - - nlLast += nlAfter - - // Handle nested stuff like *(*.js|!(*.json)), where open parens - // mean that we should *not* include the ) in the bit that is considered - // "after" the negated section. - var openParensBefore = nlBefore.split('(').length - 1 - var cleanAfter = nlAfter - for (i = 0; i < openParensBefore; i++) { - cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') - } - nlAfter = cleanAfter - - var dollar = '' - if (nlAfter === '' && isSub !== SUBPARSE) { - dollar = '$' - } - var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast - re = newRe - } - - // if the re is not "" at this point, then we need to make sure - // it doesn't match against an empty path part. - // Otherwise a/* will match a/, which it should not. - if (re !== '' && hasMagic) { - re = '(?=.)' + re - } - - if (addPatternStart) { - re = patternStart + re - } - - // parsing just a piece of a larger pattern. - if (isSub === SUBPARSE) { - return [re, hasMagic] - } - - // skip the regexp for non-magical patterns - // unescape anything in it, though, so that it'll be - // an exact match against a file etc. - if (!hasMagic) { - return globUnescape(pattern) - } - - var flags = options.nocase ? 'i' : '' - var regExp = new RegExp('^' + re + '$', flags) - - regExp._glob = pattern - regExp._src = re - - return regExp -} - -minimatch.makeRe = function (pattern, options) { - return new Minimatch(pattern, options || {}).makeRe() -} - -Minimatch.prototype.makeRe = makeRe -function makeRe () { - if (this.regexp || this.regexp === false) return this.regexp - - // at this point, this.set is a 2d array of partial - // pattern strings, or "**". - // - // It's better to use .match(). This function shouldn't - // be used, really, but it's pretty convenient sometimes, - // when you just want to work with a regex. - var set = this.set - - if (!set.length) { - this.regexp = false - return this.regexp - } - var options = this.options - - var twoStar = options.noglobstar ? star - : options.dot ? twoStarDot - : twoStarNoDot - var flags = options.nocase ? 'i' : '' - - var re = set.map(function (pattern) { - return pattern.map(function (p) { - return (p === GLOBSTAR) ? twoStar - : (typeof p === 'string') ? regExpEscape(p) - : p._src - }).join('\\\/') - }).join('|') - - // must match entire pattern - // ending in a * or ** will make it less strict. - re = '^(?:' + re + ')$' - - // can match anything, as long as it's not this. - if (this.negate) re = '^(?!' + re + ').*$' - - try { - this.regexp = new RegExp(re, flags) - } catch (ex) { - this.regexp = false - } - return this.regexp -} - -minimatch.match = function (list, pattern, options) { - options = options || {} - var mm = new Minimatch(pattern, options) - list = list.filter(function (f) { - return mm.match(f) - }) - if (mm.options.nonull && !list.length) { - list.push(pattern) - } - return list -} - -Minimatch.prototype.match = match -function match (f, partial) { - this.debug('match', f, this.pattern) - // short-circuit in the case of busted things. - // comments, etc. - if (this.comment) return false - if (this.empty) return f === '' - - if (f === '/' && partial) return true - - var options = this.options - - // windows: need to use /, not \ - if (path.sep !== '/') { - f = f.split(path.sep).join('/') - } - - // treat the test path as a set of pathparts. - f = f.split(slashSplit) - this.debug(this.pattern, 'split', f) - - // just ONE of the pattern sets in this.set needs to match - // in order for it to be valid. If negating, then just one - // match means that we have failed. - // Either way, return on the first hit. - - var set = this.set - this.debug(this.pattern, 'set', set) - - // Find the basename of the path by looking for the last non-empty segment - var filename - var i - for (i = f.length - 1; i >= 0; i--) { - filename = f[i] - if (filename) break - } - - for (i = 0; i < set.length; i++) { - var pattern = set[i] - var file = f - if (options.matchBase && pattern.length === 1) { - file = [filename] - } - var hit = this.matchOne(file, pattern, partial) - if (hit) { - if (options.flipNegate) return true - return !this.negate - } - } - - // didn't get any hits. this is success if it's a negative - // pattern, failure otherwise. - if (options.flipNegate) return false - return this.negate -} - -// set partial to true to test if, for example, -// "/a/b" matches the start of "/*/b/*/d" -// Partial means, if you run out of file before you run -// out of pattern, then that's fine, as long as all -// the parts match. -Minimatch.prototype.matchOne = function (file, pattern, partial) { - var options = this.options - - this.debug('matchOne', - { 'this': this, file: file, pattern: pattern }) - - this.debug('matchOne', file.length, pattern.length) - - for (var fi = 0, - pi = 0, - fl = file.length, - pl = pattern.length - ; (fi < fl) && (pi < pl) - ; fi++, pi++) { - this.debug('matchOne loop') - var p = pattern[pi] - var f = file[fi] - - this.debug(pattern, p, f) - - // should be impossible. - // some invalid regexp stuff in the set. - if (p === false) return false - - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]) - - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi - var pr = pi + 1 - if (pr === pl) { - this.debug('** at the end') - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) return false - } - return true - } - - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr] - - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) - - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee) - // found a match. - return true - } else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr) - break - } - - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue') - fr++ - } - } - - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - // If there's more *pattern* left, then - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr) - if (fr === fl) return true - } - return false - } - - // something other than ** - // non-magic patterns just have to match exactly - // patterns with magic have been turned into regexps. - var hit - if (typeof p === 'string') { - if (options.nocase) { - hit = f.toLowerCase() === p.toLowerCase() - } else { - hit = f === p - } - this.debug('string match', p, f, hit) - } else { - hit = f.match(p) - this.debug('pattern match', p, f, hit) - } - - if (!hit) return false - } - - // Note: ending in / means that we'll get a final "" - // at the end of the pattern. This can only match a - // corresponding "" at the end of the file. - // If the file ends in /, then it can only match a - // a pattern that ends in /, unless the pattern just - // doesn't have any more for it. But, a/b/ should *not* - // match "a/b/*", even though "" matches against the - // [^/]*? pattern, except in partial mode, where it might - // simply not be reached yet. - // However, a/b/ should still satisfy a/* - - // now either we fell off the end of the pattern, or we're done. - if (fi === fl && pi === pl) { - // ran out of pattern and filename at the same time. - // an exact hit! - return true - } else if (fi === fl) { - // ran out of file, but still had pattern left. - // this is ok if we're doing the match as part of - // a glob fs traversal. - return partial - } else if (pi === pl) { - // ran out of pattern, still have file left. - // this is only acceptable if we're on the very last - // empty segment of a file with a trailing slash. - // a/* should match a/b/ - var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') - return emptyFileEnd - } - - // should be unreachable. - throw new Error('wtf?') -} - -// replace stuff like \* with * -function globUnescape (s) { - return s.replace(/\\(.)/g, '$1') -} - -function regExpEscape (s) { - return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore deleted file mode 100644 index 249bc20..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -*.sw* diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml deleted file mode 100644 index 6e5919d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ -language: node_js -node_js: - - "0.10" diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md deleted file mode 100644 index 62bc7ba..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md +++ /dev/null @@ -1,121 +0,0 @@ -# brace-expansion - -[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), -as known from sh/bash, in JavaScript. - -[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) - -[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) - -## Example - -```js -var expand = require('brace-expansion'); - -expand('file-{a,b,c}.jpg') -// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] - -expand('-v{,,}') -// => ['-v', '-v', '-v'] - -expand('file{0..2}.jpg') -// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] - -expand('file-{a..c}.jpg') -// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] - -expand('file{2..0}.jpg') -// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] - -expand('file{0..4..2}.jpg') -// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] - -expand('file-{a..e..2}.jpg') -// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] - -expand('file{00..10..5}.jpg') -// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] - -expand('{{A..C},{a..c}}') -// => ['A', 'B', 'C', 'a', 'b', 'c'] - -expand('ppp{,config,oe{,conf}}') -// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] -``` - -## API - -```js -var expand = require('brace-expansion'); -``` - -### var expanded = expand(str) - -Return an array of all possible and valid expansions of `str`. If none are -found, `[str]` is returned. - -Valid expansions are: - -```js -/^(.*,)+(.+)?$/ -// {a,b,...} -``` - -A comma seperated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. - -```js -/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ -// {x..y[..incr]} -``` - -A numeric sequence from `x` to `y` inclusive, with optional increment. -If `x` or `y` start with a leading `0`, all the numbers will be padded -to have equal length. Negative numbers and backwards iteration work too. - -```js -/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ -// {x..y[..incr]} -``` - -An alphabetic sequence from `x` to `y` inclusive, with optional increment. -`x` and `y` must be exactly one character, and if given, `incr` must be a -number. - -For compatibility reasons, the string `${` is not eligible for brace expansion. - -## Installation - -With [npm](https://npmjs.org) do: - -```bash -npm install brace-expansion -``` - -## Contributors - -- [Julian Gruber](https://github.com/juliangruber) -- [Isaac Z. Schlueter](https://github.com/isaacs) - -## License - -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js deleted file mode 100644 index 60ecfc7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js +++ /dev/null @@ -1,8 +0,0 @@ -var expand = require('./'); - -console.log(expand('http://any.org/archive{1996..1999}/vol{1..4}/part{a,b,c}.html')); -console.log(expand('http://www.numericals.com/file{1..100..10}.txt')); -console.log(expand('http://www.letters.com/file{a..z..2}.txt')); -console.log(expand('mkdir /usr/local/src/bash/{old,new,dist,bugs}')); -console.log(expand('chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}')); - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js deleted file mode 100644 index a23104e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js +++ /dev/null @@ -1,191 +0,0 @@ -var concatMap = require('concat-map'); -var balanced = require('balanced-match'); - -module.exports = expandTop; - -var escSlash = '\0SLASH'+Math.random()+'\0'; -var escOpen = '\0OPEN'+Math.random()+'\0'; -var escClose = '\0CLOSE'+Math.random()+'\0'; -var escComma = '\0COMMA'+Math.random()+'\0'; -var escPeriod = '\0PERIOD'+Math.random()+'\0'; - -function numeric(str) { - return parseInt(str, 10) == str - ? parseInt(str, 10) - : str.charCodeAt(0); -} - -function escapeBraces(str) { - return str.split('\\\\').join(escSlash) - .split('\\{').join(escOpen) - .split('\\}').join(escClose) - .split('\\,').join(escComma) - .split('\\.').join(escPeriod); -} - -function unescapeBraces(str) { - return str.split(escSlash).join('\\') - .split(escOpen).join('{') - .split(escClose).join('}') - .split(escComma).join(',') - .split(escPeriod).join('.'); -} - - -// Basically just str.split(","), but handling cases -// where we have nested braced sections, which should be -// treated as individual members, like {a,{b,c},d} -function parseCommaParts(str) { - if (!str) - return ['']; - - var parts = []; - var m = balanced('{', '}', str); - - if (!m) - return str.split(','); - - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(','); - - p[p.length-1] += '{' + body + '}'; - var postParts = parseCommaParts(post); - if (post.length) { - p[p.length-1] += postParts.shift(); - p.push.apply(p, postParts); - } - - parts.push.apply(parts, p); - - return parts; -} - -function expandTop(str) { - if (!str) - return []; - - return expand(escapeBraces(str), true).map(unescapeBraces); -} - -function identity(e) { - return e; -} - -function embrace(str) { - return '{' + str + '}'; -} -function isPadded(el) { - return /^-?0\d/.test(el); -} - -function lte(i, y) { - return i <= y; -} -function gte(i, y) { - return i >= y; -} - -function expand(str, isTop) { - var expansions = []; - - var m = balanced('{', '}', str); - if (!m || /\$$/.test(m.pre)) return [str]; - - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = /^(.*,)+(.+)?$/.test(m.body); - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,.*}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str); - } - return [str]; - } - - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0], false).map(embrace); - if (n.length === 1) { - var post = m.post.length - ? expand(m.post, false) - : ['']; - return post.map(function(p) { - return m.pre + n[0] + p; - }); - } - } - } - - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. - - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post, false) - : ['']; - - var N; - - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length) - var incr = n.length == 3 - ? Math.abs(numeric(n[2])) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); - - N = []; - - for (var i = x; test(i, y); i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; - } - } - } - N.push(c); - } - } else { - N = concatMap(n, function(el) { return expand(el, false) }); - } - - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) - expansions.push(expansion); - } - } - - return expansions; -} - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore deleted file mode 100644 index fd4f2b0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -.DS_Store diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml deleted file mode 100644 index cc4dba2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile deleted file mode 100644 index fa5da71..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile +++ /dev/null @@ -1,6 +0,0 @@ - -test: - @node_modules/.bin/tape test/*.js - -.PHONY: test - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md deleted file mode 100644 index 2aff0eb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# balanced-match - -Match balanced string pairs, like `{` and `}` or `` and ``. - -[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) -[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) - -[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) - -## Example - -Get the first matching pair of braces: - -```js -var balanced = require('balanced-match'); - -console.log(balanced('{', '}', 'pre{in{nested}}post')); -console.log(balanced('{', '}', 'pre{first}between{second}post')); -``` - -The matches are: - -```bash -$ node example.js -{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } -{ start: 3, - end: 9, - pre: 'pre', - body: 'first', - post: 'between{second}post' } -``` - -## API - -### var m = balanced(a, b, str) - -For the first non-nested matching pair of `a` and `b` in `str`, return an -object with those keys: - -* **start** the index of the first match of `a` -* **end** the index of the matching `b` -* **pre** the preamble, `a` and `b` not included -* **body** the match, `a` and `b` not included -* **post** the postscript, `a` and `b` not included - -If there's no match, `undefined` will be returned. - -If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']`. - -## Installation - -With [npm](https://npmjs.org) do: - -```bash -npm install balanced-match -``` - -## License - -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js deleted file mode 100644 index c02ad34..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js +++ /dev/null @@ -1,5 +0,0 @@ -var balanced = require('./'); - -console.log(balanced('{', '}', 'pre{in{nested}}post')); -console.log(balanced('{', '}', 'pre{first}between{second}post')); - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js deleted file mode 100644 index d165ae8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js +++ /dev/null @@ -1,38 +0,0 @@ -module.exports = balanced; -function balanced(a, b, str) { - var bal = 0; - var m = {}; - var ended = false; - - for (var i = 0; i < str.length; i++) { - if (a == str.substr(i, a.length)) { - if (!('start' in m)) m.start = i; - bal++; - } - else if (b == str.substr(i, b.length) && 'start' in m) { - ended = true; - bal--; - if (!bal) { - m.end = i; - m.pre = str.substr(0, m.start); - m.body = (m.end - m.start > 1) - ? str.substring(m.start + a.length, m.end) - : ''; - m.post = str.slice(m.end + b.length); - return m; - } - } - } - - // if we opened more than we closed, find the one we closed - if (bal && ended) { - var start = m.start + a.length; - m = balanced(a, b, str.substr(start)); - if (m) { - m.start += start; - m.end += start; - m.pre = str.slice(0, start) + m.pre; - } - return m; - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json deleted file mode 100644 index ede6efe..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "balanced-match", - "description": "Match balanced character pairs, like \"{\" and \"}\"", - "version": "0.2.0", - "repository": { - "type": "git", - "url": "git://github.com/juliangruber/balanced-match.git" - }, - "homepage": "https://github.com/juliangruber/balanced-match", - "main": "index.js", - "scripts": { - "test": "make test" - }, - "dependencies": {}, - "devDependencies": { - "tape": "~1.1.1" - }, - "keywords": [ - "match", - "regexp", - "test", - "balanced", - "parse" - ], - "author": { - "name": "Julian Gruber", - "email": "mail@juliangruber.com", - "url": "http://juliangruber.com" - }, - "license": "MIT", - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/8..latest", - "firefox/20..latest", - "firefox/nightly", - "chrome/25..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "gitHead": "ba40ed78e7114a4a67c51da768a100184dead39c", - "bugs": { - "url": "https://github.com/juliangruber/balanced-match/issues" - }, - "_id": "balanced-match@0.2.0", - "_shasum": "38f6730c03aab6d5edbb52bd934885e756d71674", - "_from": "balanced-match@>=0.2.0 <0.3.0", - "_npmVersion": "2.1.8", - "_nodeVersion": "0.10.32", - "_npmUser": { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - "maintainers": [ - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - } - ], - "dist": { - "shasum": "38f6730c03aab6d5edbb52bd934885e756d71674", - "tarball": "http://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js deleted file mode 100644 index 36bfd39..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js +++ /dev/null @@ -1,56 +0,0 @@ -var test = require('tape'); -var balanced = require('..'); - -test('balanced', function(t) { - t.deepEqual(balanced('{', '}', 'pre{in{nest}}post'), { - start: 3, - end: 12, - pre: 'pre', - body: 'in{nest}', - post: 'post' - }); - t.deepEqual(balanced('{', '}', '{{{{{{{{{in}post'), { - start: 8, - end: 11, - pre: '{{{{{{{{', - body: 'in', - post: 'post' - }); - t.deepEqual(balanced('{', '}', 'pre{body{in}post'), { - start: 8, - end: 11, - pre: 'pre{body', - body: 'in', - post: 'post' - }); - t.deepEqual(balanced('{', '}', 'pre}{in{nest}}post'), { - start: 4, - end: 13, - pre: 'pre}', - body: 'in{nest}', - post: 'post' - }); - t.deepEqual(balanced('{', '}', 'pre{body}between{body2}post'), { - start: 3, - end: 8, - pre: 'pre', - body: 'body', - post: 'between{body2}post' - }); - t.notOk(balanced('{', '}', 'nope'), 'should be notOk'); - t.deepEqual(balanced('', '', 'preinnestpost'), { - start: 3, - end: 19, - pre: 'pre', - body: 'innest', - post: 'post' - }); - t.deepEqual(balanced('', '', 'preinnestpost'), { - start: 7, - end: 23, - pre: 'pre', - body: 'innest', - post: 'post' - }); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE deleted file mode 100644 index ee27ba4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -This software is released under the MIT 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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown deleted file mode 100644 index 408f70a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown +++ /dev/null @@ -1,62 +0,0 @@ -concat-map -========== - -Concatenative mapdashery. - -[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map) - -[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map) - -example -======= - -``` js -var concatMap = require('concat-map'); -var xs = [ 1, 2, 3, 4, 5, 6 ]; -var ys = concatMap(xs, function (x) { - return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; -}); -console.dir(ys); -``` - -*** - -``` -[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ] -``` - -methods -======= - -``` js -var concatMap = require('concat-map') -``` - -concatMap(xs, fn) ------------------ - -Return an array of concatenated elements by calling `fn(x, i)` for each element -`x` and each index `i` in the array `xs`. - -When `fn(x, i)` returns an array, its result will be concatenated with the -result array. If `fn(x, i)` returns anything else, that value will be pushed -onto the end of the result array. - -install -======= - -With [npm](http://npmjs.org) do: - -``` -npm install concat-map -``` - -license -======= - -MIT - -notes -===== - -This module was written while sitting high above the ground in a tree. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js deleted file mode 100644 index 3365621..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js +++ /dev/null @@ -1,6 +0,0 @@ -var concatMap = require('../'); -var xs = [ 1, 2, 3, 4, 5, 6 ]; -var ys = concatMap(xs, function (x) { - return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; -}); -console.dir(ys); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js deleted file mode 100644 index b29a781..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = function (xs, fn) { - var res = []; - for (var i = 0; i < xs.length; i++) { - var x = fn(xs[i], i); - if (isArray(x)) res.push.apply(res, x); - else res.push(x); - } - return res; -}; - -var isArray = Array.isArray || function (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json deleted file mode 100644 index b516138..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "concat-map", - "description": "concatenative mapdashery", - "version": "0.0.1", - "repository": { - "type": "git", - "url": "git://github.com/substack/node-concat-map.git" - }, - "main": "index.js", - "keywords": [ - "concat", - "concatMap", - "map", - "functional", - "higher-order" - ], - "directories": { - "example": "example", - "test": "test" - }, - "scripts": { - "test": "tape test/*.js" - }, - "devDependencies": { - "tape": "~2.4.0" - }, - "license": "MIT", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "testling": { - "files": "test/*.js", - "browsers": { - "ie": [ - 6, - 7, - 8, - 9 - ], - "ff": [ - 3.5, - 10, - 15 - ], - "chrome": [ - 10, - 22 - ], - "safari": [ - 5.1 - ], - "opera": [ - 12 - ] - } - }, - "bugs": { - "url": "https://github.com/substack/node-concat-map/issues" - }, - "homepage": "https://github.com/substack/node-concat-map", - "_id": "concat-map@0.0.1", - "dist": { - "shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b", - "tarball": "http://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - }, - "_from": "concat-map@0.0.1", - "_npmVersion": "1.3.21", - "_npmUser": { - "name": "substack", - "email": "mail@substack.net" - }, - "maintainers": [ - { - "name": "substack", - "email": "mail@substack.net" - } - ], - "_shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b", - "_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js deleted file mode 100644 index fdbd702..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js +++ /dev/null @@ -1,39 +0,0 @@ -var concatMap = require('../'); -var test = require('tape'); - -test('empty or not', function (t) { - var xs = [ 1, 2, 3, 4, 5, 6 ]; - var ixes = []; - var ys = concatMap(xs, function (x, ix) { - ixes.push(ix); - return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; - }); - t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]); - t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]); - t.end(); -}); - -test('always something', function (t) { - var xs = [ 'a', 'b', 'c', 'd' ]; - var ys = concatMap(xs, function (x) { - return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ]; - }); - t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); - t.end(); -}); - -test('scalars', function (t) { - var xs = [ 'a', 'b', 'c', 'd' ]; - var ys = concatMap(xs, function (x) { - return x === 'b' ? [ 'B', 'B', 'B' ] : x; - }); - t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); - t.end(); -}); - -test('undefs', function (t) { - var xs = [ 'a', 'b', 'c', 'd' ]; - var ys = concatMap(xs, function () {}); - t.same(ys, [ undefined, undefined, undefined, undefined ]); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json deleted file mode 100644 index 5f1866c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "brace-expansion", - "description": "Brace expansion as known from sh/bash", - "version": "1.1.0", - "repository": { - "type": "git", - "url": "git://github.com/juliangruber/brace-expansion.git" - }, - "homepage": "https://github.com/juliangruber/brace-expansion", - "main": "index.js", - "scripts": { - "test": "tape test/*.js", - "gentest": "bash test/generate.sh" - }, - "dependencies": { - "balanced-match": "^0.2.0", - "concat-map": "0.0.1" - }, - "devDependencies": { - "tape": "^3.0.3" - }, - "keywords": [], - "author": { - "name": "Julian Gruber", - "email": "mail@juliangruber.com", - "url": "http://juliangruber.com" - }, - "license": "MIT", - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/8..latest", - "firefox/20..latest", - "firefox/nightly", - "chrome/25..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "gitHead": "b5fa3b1c74e5e2dba2d0efa19b28335641bc1164", - "bugs": { - "url": "https://github.com/juliangruber/brace-expansion/issues" - }, - "_id": "brace-expansion@1.1.0", - "_shasum": "c9b7d03c03f37bc704be100e522b40db8f6cfcd9", - "_from": "brace-expansion@>=1.0.0 <2.0.0", - "_npmVersion": "2.1.10", - "_nodeVersion": "0.10.32", - "_npmUser": { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - "maintainers": [ - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - { - "name": "isaacs", - "email": "isaacs@npmjs.com" - } - ], - "dist": { - "shasum": "c9b7d03c03f37bc704be100e522b40db8f6cfcd9", - "tarball": "http://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js deleted file mode 100644 index 5fe2b8a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js +++ /dev/null @@ -1,32 +0,0 @@ -var test = require('tape'); -var expand = require('..'); -var fs = require('fs'); -var resfile = __dirname + '/bash-results.txt'; -var cases = fs.readFileSync(resfile, 'utf8').split('><><><><'); - -// throw away the EOF marker -cases.pop() - -test('matches bash expansions', function(t) { - cases.forEach(function(testcase) { - var set = testcase.split('\n'); - var pattern = set.shift(); - var actual = expand(pattern); - - // If it expands to the empty string, then it's actually - // just nothing, but Bash is a singly typed language, so - // "nothing" is the same as "". - if (set.length === 1 && set[0] === '') { - set = [] - } else { - // otherwise, strip off the [] that were added so that - // "" expansions would be preserved properly. - set = set.map(function (s) { - return s.replace(/^\[|\]$/g, '') - }) - } - - t.same(actual, set, pattern); - }); - t.end(); -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt deleted file mode 100644 index 958148d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt +++ /dev/null @@ -1,1075 +0,0 @@ -A{b,{d,e},{f,g}}Z -[AbZ] -[AdZ] -[AeZ] -[AfZ] -[AgZ]><><><><><><><\{a,b}{{a,b},a,b} -[{a,b}a] -[{a,b}b] -[{a,b}a] -[{a,b}b]><><><><{{a,b} -[{a] -[{b]><><><><{a,b}} -[a}] -[b}]><><><><{,} -><><><><><><><{,}b -[b] -[b]><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><{-01..5} -[-01] -[000] -[001] -[002] -[003] -[004] -[005]><><><><{-05..100..5} -[-05] -[000] -[005] -[010] -[015] -[020] -[025] -[030] -[035] -[040] -[045] -[050] -[055] -[060] -[065] -[070] -[075] -[080] -[085] -[090] -[095] -[100]><><><><{-05..100} -[-05] -[-04] -[-03] -[-02] -[-01] -[000] -[001] -[002] -[003] -[004] -[005] -[006] -[007] -[008] -[009] -[010] -[011] -[012] -[013] -[014] -[015] -[016] -[017] -[018] -[019] -[020] -[021] -[022] -[023] -[024] -[025] -[026] -[027] -[028] -[029] -[030] -[031] -[032] -[033] -[034] -[035] -[036] -[037] -[038] -[039] -[040] -[041] -[042] -[043] -[044] -[045] -[046] -[047] -[048] -[049] -[050] -[051] -[052] -[053] -[054] -[055] -[056] -[057] -[058] -[059] -[060] -[061] -[062] -[063] -[064] -[065] -[066] -[067] -[068] -[069] -[070] -[071] -[072] -[073] -[074] -[075] -[076] -[077] -[078] -[079] -[080] -[081] -[082] -[083] -[084] -[085] -[086] -[087] -[088] -[089] -[090] -[091] -[092] -[093] -[094] -[095] -[096] -[097] -[098] -[099] -[100]><><><><{0..5..2} -[0] -[2] -[4]><><><><{0001..05..2} -[0001] -[0003] -[0005]><><><><{0001..-5..2} -[0001] -[-001] -[-003] -[-005]><><><><{0001..-5..-2} -[0001] -[-001] -[-003] -[-005]><><><><{0001..5..-2} -[0001] -[0003] -[0005]><><><><{01..5} -[01] -[02] -[03] -[04] -[05]><><><><{1..05} -[01] -[02] -[03] -[04] -[05]><><><><{1..05..3} -[01] -[04]><><><><{05..100} -[005] -[006] -[007] -[008] -[009] -[010] -[011] -[012] -[013] -[014] -[015] -[016] -[017] -[018] -[019] -[020] -[021] -[022] -[023] -[024] -[025] -[026] -[027] -[028] -[029] -[030] -[031] -[032] -[033] -[034] -[035] -[036] -[037] -[038] -[039] -[040] -[041] -[042] -[043] -[044] -[045] -[046] -[047] -[048] -[049] -[050] -[051] -[052] -[053] -[054] -[055] -[056] -[057] -[058] -[059] -[060] -[061] -[062] -[063] -[064] -[065] -[066] -[067] -[068] -[069] -[070] -[071] -[072] -[073] -[074] -[075] -[076] -[077] -[078] -[079] -[080] -[081] -[082] -[083] -[084] -[085] -[086] -[087] -[088] -[089] -[090] -[091] -[092] -[093] -[094] -[095] -[096] -[097] -[098] -[099] -[100]><><><><{0a..0z} -[{0a..0z}]><><><><{a,b\}c,d} -[a] -[b}c] -[d]><><><><{a,b{c,d} -[{a,bc] -[{a,bd]><><><><{a,b}c,d} -[ac,d}] -[bc,d}]><><><><{a..F} -[a] -[`] -[_] -[^] -[]] -[] -[[] -[Z] -[Y] -[X] -[W] -[V] -[U] -[T] -[S] -[R] -[Q] -[P] -[O] -[N] -[M] -[L] -[K] -[J] -[I] -[H] -[G] -[F]><><><><{A..f} -[A] -[B] -[C] -[D] -[E] -[F] -[G] -[H] -[I] -[J] -[K] -[L] -[M] -[N] -[O] -[P] -[Q] -[R] -[S] -[T] -[U] -[V] -[W] -[X] -[Y] -[Z] -[[] -[] -[]] -[^] -[_] -[`] -[a] -[b] -[c] -[d] -[e] -[f]><><><><{a..Z} -[a] -[`] -[_] -[^] -[]] -[] -[[] -[Z]><><><><{A..z} -[A] -[B] -[C] -[D] -[E] -[F] -[G] -[H] -[I] -[J] -[K] -[L] -[M] -[N] -[O] -[P] -[Q] -[R] -[S] -[T] -[U] -[V] -[W] -[X] -[Y] -[Z] -[[] -[] -[]] -[^] -[_] -[`] -[a] -[b] -[c] -[d] -[e] -[f] -[g] -[h] -[i] -[j] -[k] -[l] -[m] -[n] -[o] -[p] -[q] -[r] -[s] -[t] -[u] -[v] -[w] -[x] -[y] -[z]><><><><{z..A} -[z] -[y] -[x] -[w] -[v] -[u] -[t] -[s] -[r] -[q] -[p] -[o] -[n] -[m] -[l] -[k] -[j] -[i] -[h] -[g] -[f] -[e] -[d] -[c] -[b] -[a] -[`] -[_] -[^] -[]] -[] -[[] -[Z] -[Y] -[X] -[W] -[V] -[U] -[T] -[S] -[R] -[Q] -[P] -[O] -[N] -[M] -[L] -[K] -[J] -[I] -[H] -[G] -[F] -[E] -[D] -[C] -[B] -[A]><><><><{Z..a} -[Z] -[[] -[] -[]] -[^] -[_] -[`] -[a]><><><><{a..F..2} -[a] -[_] -[]] -[[] -[Y] -[W] -[U] -[S] -[Q] -[O] -[M] -[K] -[I] -[G]><><><><{A..f..02} -[A] -[C] -[E] -[G] -[I] -[K] -[M] -[O] -[Q] -[S] -[U] -[W] -[Y] -[[] -[]] -[_] -[a] -[c] -[e]><><><><{a..Z..5} -[a] -[]><><><><><><><{A..z..10} -[A] -[K] -[U] -[_] -[i] -[s]><><><><{z..A..-2} -[z] -[x] -[v] -[t] -[r] -[p] -[n] -[l] -[j] -[h] -[f] -[d] -[b] -[`] -[^] -[] -[Z] -[X] -[V] -[T] -[R] -[P] -[N] -[L] -[J] -[H] -[F] -[D] -[B]><><><><{Z..a..20} -[Z]><><><><{a{,b} -[{a] -[{ab]><><><><{a},b} -[a}] -[b]><><><><{x,y{,}g} -[x] -[yg] -[yg]><><><><{x,y{}g} -[x] -[y{}g]><><><><{{a,b} -[{a] -[{b]><><><><{{a,b},c} -[a] -[b] -[c]><><><><{{a,b}c} -[{ac}] -[{bc}]><><><><{{a,b},} -[a] -[b]><><><><><><><{{a,b},}c -[ac] -[bc] -[c]><><><><{{a,b}.} -[{a.}] -[{b.}]><><><><{{a,b}} -[{a}] -[{b}]><><><><><><>< -><><><><{-10..00} -[-10] -[-09] -[-08] -[-07] -[-06] -[-05] -[-04] -[-03] -[-02] -[-01] -[000]><><><><{a,\\{a,b}c} -[a] -[\ac] -[\bc]><><><><{a,\{a,b}c} -[ac}] -[{ac}] -[bc}]><><><><><><><{-10.\.00} -[{-10..00}]><><><><><><><><><><{l,n,m}xyz -[lxyz] -[nxyz] -[mxyz]><><><><{abc\,def} -[{abc,def}]><><><><{abc} -[{abc}]><><><><{x\,y,\{abc\},trie} -[x,y] -[{abc}] -[trie]><><><><{} -[{}]><><><><} -[}]><><><><{ -[{]><><><><><><><{1..10} -[1] -[2] -[3] -[4] -[5] -[6] -[7] -[8] -[9] -[10]><><><><{0..10,braces} -[0..10] -[braces]><><><><{{0..10},braces} -[0] -[1] -[2] -[3] -[4] -[5] -[6] -[7] -[8] -[9] -[10] -[braces]><><><><><><><{3..3} -[3]><><><><><><><{10..1} -[10] -[9] -[8] -[7] -[6] -[5] -[4] -[3] -[2] -[1]><><><><{10..1}y -[10y] -[9y] -[8y] -[7y] -[6y] -[5y] -[4y] -[3y] -[2y] -[1y]><><><><><><><{a..f} -[a] -[b] -[c] -[d] -[e] -[f]><><><><{f..a} -[f] -[e] -[d] -[c] -[b] -[a]><><><><{a..A} -[a] -[`] -[_] -[^] -[]] -[] -[[] -[Z] -[Y] -[X] -[W] -[V] -[U] -[T] -[S] -[R] -[Q] -[P] -[O] -[N] -[M] -[L] -[K] -[J] -[I] -[H] -[G] -[F] -[E] -[D] -[C] -[B] -[A]><><><><{A..a} -[A] -[B] -[C] -[D] -[E] -[F] -[G] -[H] -[I] -[J] -[K] -[L] -[M] -[N] -[O] -[P] -[Q] -[R] -[S] -[T] -[U] -[V] -[W] -[X] -[Y] -[Z] -[[] -[] -[]] -[^] -[_] -[`] -[a]><><><><{f..f} -[f]><><><><{1..f} -[{1..f}]><><><><{f..1} -[{f..1}]><><><><{-1..-10} -[-1] -[-2] -[-3] -[-4] -[-5] -[-6] -[-7] -[-8] -[-9] -[-10]><><><><{-20..0} -[-20] -[-19] -[-18] -[-17] -[-16] -[-15] -[-14] -[-13] -[-12] -[-11] -[-10] -[-9] -[-8] -[-7] -[-6] -[-5] -[-4] -[-3] -[-2] -[-1] -[0]><><><><><><><><><><{klklkl}{1,2,3} -[{klklkl}1] -[{klklkl}2] -[{klklkl}3]><><><><{1..10..2} -[1] -[3] -[5] -[7] -[9]><><><><{-1..-10..2} -[-1] -[-3] -[-5] -[-7] -[-9]><><><><{-1..-10..-2} -[-1] -[-3] -[-5] -[-7] -[-9]><><><><{10..1..-2} -[10] -[8] -[6] -[4] -[2]><><><><{10..1..2} -[10] -[8] -[6] -[4] -[2]><><><><{1..20..2} -[1] -[3] -[5] -[7] -[9] -[11] -[13] -[15] -[17] -[19]><><><><{1..20..20} -[1]><><><><{100..0..5} -[100] -[95] -[90] -[85] -[80] -[75] -[70] -[65] -[60] -[55] -[50] -[45] -[40] -[35] -[30] -[25] -[20] -[15] -[10] -[5] -[0]><><><><{100..0..-5} -[100] -[95] -[90] -[85] -[80] -[75] -[70] -[65] -[60] -[55] -[50] -[45] -[40] -[35] -[30] -[25] -[20] -[15] -[10] -[5] -[0]><><><><{a..z} -[a] -[b] -[c] -[d] -[e] -[f] -[g] -[h] -[i] -[j] -[k] -[l] -[m] -[n] -[o] -[p] -[q] -[r] -[s] -[t] -[u] -[v] -[w] -[x] -[y] -[z]><><><><{a..z..2} -[a] -[c] -[e] -[g] -[i] -[k] -[m] -[o] -[q] -[s] -[u] -[w] -[y]><><><><{z..a..-2} -[z] -[x] -[v] -[t] -[r] -[p] -[n] -[l] -[j] -[h] -[f] -[d] -[b]><><><><{2147483645..2147483649} -[2147483645] -[2147483646] -[2147483647] -[2147483648] -[2147483649]><><><><{10..0..2} -[10] -[8] -[6] -[4] -[2] -[0]><><><><{10..0..-2} -[10] -[8] -[6] -[4] -[2] -[0]><><><><{-50..-0..5} -[-50] -[-45] -[-40] -[-35] -[-30] -[-25] -[-20] -[-15] -[-10] -[-5] -[0]><><><><{1..10.f} -[{1..10.f}]><><><><{1..ff} -[{1..ff}]><><><><{1..10..ff} -[{1..10..ff}]><><><><{1.20..2} -[{1.20..2}]><><><><{1..20..f2} -[{1..20..f2}]><><><><{1..20..2f} -[{1..20..2f}]><><><><{1..2f..2} -[{1..2f..2}]><><><><{1..ff..2} -[{1..ff..2}]><><><><{1..ff} -[{1..ff}]><><><><{1..f} -[{1..f}]><><><><{1..0f} -[{1..0f}]><><><><{1..10f} -[{1..10f}]><><><><{1..10.f} -[{1..10.f}]><><><><{1..10.f} -[{1..10.f}]><><><>< \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt deleted file mode 100644 index e5161c3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt +++ /dev/null @@ -1,182 +0,0 @@ -# skip quotes for now -# "{x,x}" -# {"x,x"} -# {x","x} -# '{a,b}{{a,b},a,b}' -A{b,{d,e},{f,g}}Z -PRE-{a,b}{{a,b},a,b}-POST -\\{a,b}{{a,b},a,b} -{{a,b} -{a,b}} -{,} -a{,} -{,}b -a{,}b -a{b}c -a{1..5}b -a{01..5}b -a{-01..5}b -a{-01..5..3}b -a{001..9}b -a{b,c{d,e},{f,g}h}x{y,z -a{b,c{d,e},{f,g}h}x{y,z\\} -a{b,c{d,e},{f,g}h}x{y,z} -a{b{c{d,e}f{x,y{{g}h -a{b{c{d,e}f{x,y{}g}h -a{b{c{d,e}f{x,y}}g}h -a{b{c{d,e}f}g}h -a{{x,y},z}b -f{x,y{g,z}}h -f{x,y{{g,z}}h -f{x,y{{g,z}}h} -f{x,y{{g}h -f{x,y{{g}}h -f{x,y{}g}h -z{a,b{,c}d -z{a,b},c}d -{-01..5} -{-05..100..5} -{-05..100} -{0..5..2} -{0001..05..2} -{0001..-5..2} -{0001..-5..-2} -{0001..5..-2} -{01..5} -{1..05} -{1..05..3} -{05..100} -{0a..0z} -{a,b\\}c,d} -{a,b{c,d} -{a,b}c,d} -{a..F} -{A..f} -{a..Z} -{A..z} -{z..A} -{Z..a} -{a..F..2} -{A..f..02} -{a..Z..5} -d{a..Z..5}b -{A..z..10} -{z..A..-2} -{Z..a..20} -{a{,b} -{a},b} -{x,y{,}g} -{x,y{}g} -{{a,b} -{{a,b},c} -{{a,b}c} -{{a,b},} -X{{a,b},}X -{{a,b},}c -{{a,b}.} -{{a,b}} -X{a..#}X -# this next one is an empty string - -{-10..00} -# Need to escape slashes in here for reasons i guess. -{a,\\\\{a,b}c} -{a,\\{a,b}c} -a,\\{b,c} -{-10.\\.00} -#### bash tests/braces.tests -# Note that some tests are edited out because some features of -# bash are intentionally not supported in this brace expander. -ff{c,b,a} -f{d,e,f}g -{l,n,m}xyz -{abc\\,def} -{abc} -{x\\,y,\\{abc\\},trie} -# not impementing back-ticks obviously -# XXXX\\{`echo a b c | tr ' ' ','`\\} -{} -# We only ever have to worry about parsing a single argument, -# not a command line, so spaces have a different meaning than bash. -# { } -} -{ -abcd{efgh -# spaces -# foo {1,2} bar -# not impementing back-ticks obviously -# `zecho foo {1,2} bar` -# $(zecho foo {1,2} bar) -# ${var} is not a variable here, like it is in bash. omit. -# foo{bar,${var}.} -# foo{bar,${var}} -# isaacs: skip quotes for now -# "${var}"{x,y} -# $var{x,y} -# ${var}{x,y} -# new sequence brace operators -{1..10} -# this doesn't work yet -{0..10,braces} -# but this does -{{0..10},braces} -x{{0..10},braces}y -{3..3} -x{3..3}y -{10..1} -{10..1}y -x{10..1}y -{a..f} -{f..a} -{a..A} -{A..a} -{f..f} -# mixes are incorrectly-formed brace expansions -{1..f} -{f..1} -# spaces -# 0{1..9} {10..20} -# do negative numbers work? -{-1..-10} -{-20..0} -# weirdly-formed brace expansions -- fixed in post-bash-3.1 -a-{b{d,e}}-c -a-{bdef-{g,i}-c -# isaacs: skip quotes for now -# {"klklkl"}{1,2,3} -# isaacs: this is a valid test, though -{klklkl}{1,2,3} -# {"x,x"} -{1..10..2} -{-1..-10..2} -{-1..-10..-2} -{10..1..-2} -{10..1..2} -{1..20..2} -{1..20..20} -{100..0..5} -{100..0..-5} -{a..z} -{a..z..2} -{z..a..-2} -# make sure brace expansion handles ints > 2**31 - 1 using intmax_t -{2147483645..2147483649} -# unwanted zero-padding -- fixed post-bash-4.0 -{10..0..2} -{10..0..-2} -{-50..-0..5} -# bad -{1..10.f} -{1..ff} -{1..10..ff} -{1.20..2} -{1..20..f2} -{1..20..2f} -{1..2f..2} -{1..ff..2} -{1..ff} -{1..f} -{1..0f} -{1..10f} -{1..10.f} -{1..10.f} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js deleted file mode 100644 index 3fcc185..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js +++ /dev/null @@ -1,9 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('ignores ${', function(t) { - t.deepEqual(expand('${1..3}'), ['${1..3}']); - t.deepEqual(expand('${a,b}${c,d}'), ['${a,b}${c,d}']); - t.deepEqual(expand('x${a,b}x${c,d}x'), ['x${a,b}x${c,d}x']); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js deleted file mode 100644 index e429121..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js +++ /dev/null @@ -1,10 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('empty option', function(t) { - t.deepEqual(expand('-v{,,,,}'), [ - '-v', '-v', '-v', '-v', '-v' - ]); - t.end(); -}); - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh deleted file mode 100644 index e040e66..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -set -e - -# Bash 4.3 because of arbitrary need to pick a single standard. - -if [ "${BASH_VERSINFO[0]}" != "4" ] || [ "${BASH_VERSINFO[1]}" != "3" ]; then - echo "this script requires bash 4.3" >&2 - exit 1 -fi - -CDPATH= cd "$(dirname "$0")" - -js='require("./")(process.argv[1]).join(" ")' - -cat cases.txt | \ - while read case; do - if [ "${case:0:1}" = "#" ]; then - continue; - fi; - b="$($BASH -c 'for c in '"$case"'; do echo ["$c"]; done')" - echo "$case" - echo -n "$b><><><><"; - done > bash-results.txt diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js deleted file mode 100644 index 8d434c2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js +++ /dev/null @@ -1,15 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('negative increment', function(t) { - t.deepEqual(expand('{3..1}'), ['3', '2', '1']); - t.deepEqual(expand('{10..8}'), ['10', '9', '8']); - t.deepEqual(expand('{10..08}'), ['10', '09', '08']); - t.deepEqual(expand('{c..a}'), ['c', 'b', 'a']); - - t.deepEqual(expand('{4..0..2}'), ['4', '2', '0']); - t.deepEqual(expand('{4..0..-2}'), ['4', '2', '0']); - t.deepEqual(expand('{e..a..2}'), ['e', 'c', 'a']); - - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js deleted file mode 100644 index 0862dc5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js +++ /dev/null @@ -1,16 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('nested', function(t) { - t.deepEqual(expand('{a,b{1..3},c}'), [ - 'a', 'b1', 'b2', 'b3', 'c' - ]); - t.deepEqual(expand('{{A..Z},{a..z}}'), - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('') - ); - t.deepEqual(expand('ppp{,config,oe{,conf}}'), [ - 'ppp', 'pppconfig', 'pppoe', 'pppoeconf' - ]); - t.end(); -}); - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js deleted file mode 100644 index c00ad15..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js +++ /dev/null @@ -1,10 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('order', function(t) { - t.deepEqual(expand('a{d,c,b}e'), [ - 'ade', 'ace', 'abe' - ]); - t.end(); -}); - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js deleted file mode 100644 index e415877..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js +++ /dev/null @@ -1,13 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('pad', function(t) { - t.deepEqual(expand('{9..11}'), [ - '9', '10', '11' - ]); - t.deepEqual(expand('{09..11}'), [ - '09', '10', '11' - ]); - t.end(); -}); - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js deleted file mode 100644 index 3038fba..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js +++ /dev/null @@ -1,7 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('x and y of same type', function(t) { - t.deepEqual(expand('{a..9}'), ['{a..9}']); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js deleted file mode 100644 index f73a957..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js +++ /dev/null @@ -1,50 +0,0 @@ -var test = require('tape'); -var expand = require('..'); - -test('numeric sequences', function(t) { - t.deepEqual(expand('a{1..2}b{2..3}c'), [ - 'a1b2c', 'a1b3c', 'a2b2c', 'a2b3c' - ]); - t.deepEqual(expand('{1..2}{2..3}'), [ - '12', '13', '22', '23' - ]); - t.end(); -}); - -test('numeric sequences with step count', function(t) { - t.deepEqual(expand('{0..8..2}'), [ - '0', '2', '4', '6', '8' - ]); - t.deepEqual(expand('{1..8..2}'), [ - '1', '3', '5', '7' - ]); - t.end(); -}); - -test('numeric sequence with negative x / y', function(t) { - t.deepEqual(expand('{3..-2}'), [ - '3', '2', '1', '0', '-1', '-2' - ]); - t.end(); -}); - -test('alphabetic sequences', function(t) { - t.deepEqual(expand('1{a..b}2{b..c}3'), [ - '1a2b3', '1a2c3', '1b2b3', '1b2c3' - ]); - t.deepEqual(expand('{a..b}{b..c}'), [ - 'ab', 'ac', 'bb', 'bc' - ]); - t.end(); -}); - -test('alphabetic sequences with step count', function(t) { - t.deepEqual(expand('{a..k..2}'), [ - 'a', 'c', 'e', 'g', 'i', 'k' - ]); - t.deepEqual(expand('{b..k..2}'), [ - 'b', 'd', 'f', 'h', 'j' - ]); - t.end(); -}); - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/package.json deleted file mode 100644 index aa2844d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/minimatch/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me" - }, - "name": "minimatch", - "description": "a glob matcher in javascript", - "version": "2.0.10", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/minimatch.git" - }, - "main": "minimatch.js", - "scripts": { - "posttest": "standard minimatch.js test/*.js", - "test": "tap test/*.js", - "prepublish": "browserify -o browser.js -e minimatch.js -s minimatch --bare" - }, - "engines": { - "node": "*" - }, - "dependencies": { - "brace-expansion": "^1.0.0" - }, - "devDependencies": { - "browserify": "^9.0.3", - "standard": "^3.7.2", - "tap": "^1.2.0" - }, - "license": "ISC", - "files": [ - "minimatch.js", - "browser.js" - ], - "gitHead": "6afb85f0c324b321f76a38df81891e562693e257", - "bugs": { - "url": "https://github.com/isaacs/minimatch/issues" - }, - "homepage": "https://github.com/isaacs/minimatch#readme", - "_id": "minimatch@2.0.10", - "_shasum": "8d087c39c6b38c001b97fca7ce6d0e1e80afbac7", - "_from": "minimatch@>=2.0.1 <3.0.0", - "_npmVersion": "3.1.0", - "_nodeVersion": "2.2.1", - "_npmUser": { - "name": "isaacs", - "email": "isaacs@npmjs.com" - }, - "dist": { - "shasum": "8d087c39c6b38c001b97fca7ce6d0e1e80afbac7", - "tarball": "http://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "directories": {}, - "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/README.md deleted file mode 100644 index a2981ea..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# once - -Only call a function once. - -## usage - -```javascript -var once = require('once') - -function load (file, cb) { - cb = once(cb) - loader.load('file') - loader.once('load', cb) - loader.once('error', cb) -} -``` - -Or add to the Function.prototype in a responsible way: - -```javascript -// only has to be done once -require('once').proto() - -function load (file, cb) { - cb = cb.once() - loader.load('file') - loader.once('load', cb) - loader.once('error', cb) -} -``` - -Ironically, the prototype feature makes this module twice as -complicated as necessary. - -To check whether you function has been called, use `fn.called`. Once the -function is called for the first time the return value of the original -function is saved in `fn.value` and subsequent calls will continue to -return this value. - -```javascript -var once = require('once') - -function load (cb) { - cb = once(cb) - var stream = createStream() - stream.once('data', cb) - stream.once('end', function () { - if (!cb.called) cb(new Error('not found')) - }) -} -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/README.md deleted file mode 100644 index 98eab25..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# wrappy - -Callback wrapping utility - -## USAGE - -```javascript -var wrappy = require("wrappy") - -// var wrapper = wrappy(wrapperFunction) - -// make sure a cb is called only once -// See also: http://npm.im/once for this specific use case -var once = wrappy(function (cb) { - var called = false - return function () { - if (called) return - called = true - return cb.apply(this, arguments) - } -}) - -function printBoo () { - console.log('boo') -} -// has some rando property -printBoo.iAmBooPrinter = true - -var onlyPrintOnce = once(printBoo) - -onlyPrintOnce() // prints 'boo' -onlyPrintOnce() // does nothing - -// random property is retained! -assert.equal(onlyPrintOnce.iAmBooPrinter, true) -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/package.json deleted file mode 100644 index 8145dc8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "wrappy", - "version": "1.0.1", - "description": "Callback wrapping utility", - "main": "wrappy.js", - "directories": { - "test": "test" - }, - "dependencies": {}, - "devDependencies": { - "tap": "^0.4.12" - }, - "scripts": { - "test": "tap test/*.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/wrappy" - }, - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "ISC", - "bugs": { - "url": "https://github.com/npm/wrappy/issues" - }, - "homepage": "https://github.com/npm/wrappy", - "gitHead": "006a8cbac6b99988315834c207896eed71fd069a", - "_id": "wrappy@1.0.1", - "_shasum": "1e65969965ccbc2db4548c6b84a6f2c5aedd4739", - "_from": "wrappy@>=1.0.0 <2.0.0", - "_npmVersion": "2.0.0", - "_nodeVersion": "0.10.31", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "dist": { - "shasum": "1e65969965ccbc2db4548c6b84a6f2c5aedd4739", - "tarball": "http://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" - }, - "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js deleted file mode 100644 index 5ed0fcd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js +++ /dev/null @@ -1,51 +0,0 @@ -var test = require('tap').test -var wrappy = require('../wrappy.js') - -test('basic', function (t) { - function onceifier (cb) { - var called = false - return function () { - if (called) return - called = true - return cb.apply(this, arguments) - } - } - onceifier.iAmOnce = {} - var once = wrappy(onceifier) - t.equal(once.iAmOnce, onceifier.iAmOnce) - - var called = 0 - function boo () { - t.equal(called, 0) - called++ - } - // has some rando property - boo.iAmBoo = true - - var onlyPrintOnce = once(boo) - - onlyPrintOnce() // prints 'boo' - onlyPrintOnce() // does nothing - t.equal(called, 1) - - // random property is retained! - t.equal(onlyPrintOnce.iAmBoo, true) - - var logs = [] - var logwrap = wrappy(function (msg, cb) { - logs.push(msg + ' wrapping cb') - return function () { - logs.push(msg + ' before cb') - var ret = cb.apply(this, arguments) - logs.push(msg + ' after cb') - } - }) - - var c = logwrap('foo', function () { - t.same(logs, [ 'foo wrapping cb', 'foo before cb' ]) - }) - c() - t.same(logs, [ 'foo wrapping cb', 'foo before cb', 'foo after cb' ]) - - t.end() -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js deleted file mode 100644 index bb7e7d6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js +++ /dev/null @@ -1,33 +0,0 @@ -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -module.exports = wrappy -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') - - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k] - }) - - return wrapper - - function wrapper() { - var args = new Array(arguments.length) - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - var ret = fn.apply(this, args) - var cb = args[args.length-1] - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k] - }) - } - return ret - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/once.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/once.js deleted file mode 100644 index 2e1e721..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/once.js +++ /dev/null @@ -1,21 +0,0 @@ -var wrappy = require('wrappy') -module.exports = wrappy(once) - -once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(this) - }, - configurable: true - }) -}) - -function once (fn) { - var f = function () { - if (f.called) return f.value - f.called = true - return f.value = fn.apply(this, arguments) - } - f.called = false - return f -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/package.json deleted file mode 100644 index 8f46e50..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "once", - "version": "1.3.2", - "description": "Run a function exactly one time", - "main": "once.js", - "directories": { - "test": "test" - }, - "dependencies": { - "wrappy": "1" - }, - "devDependencies": { - "tap": "~0.3.0" - }, - "scripts": { - "test": "tap test/*.js" - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/once.git" - }, - "keywords": [ - "once", - "function", - "one", - "single" - ], - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "ISC", - "gitHead": "e35eed5a7867574e2bf2260a1ba23970958b22f2", - "bugs": { - "url": "https://github.com/isaacs/once/issues" - }, - "homepage": "https://github.com/isaacs/once#readme", - "_id": "once@1.3.2", - "_shasum": "d8feeca93b039ec1dcdee7741c92bdac5e28081b", - "_from": "once@>=1.3.0 <2.0.0", - "_npmVersion": "2.9.1", - "_nodeVersion": "2.0.0", - "_npmUser": { - "name": "isaacs", - "email": "isaacs@npmjs.com" - }, - "dist": { - "shasum": "d8feeca93b039ec1dcdee7741c92bdac5e28081b", - "tarball": "http://registry.npmjs.org/once/-/once-1.3.2.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "_resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/test/once.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/test/once.js deleted file mode 100644 index c618360..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/once/test/once.js +++ /dev/null @@ -1,23 +0,0 @@ -var test = require('tap').test -var once = require('../once.js') - -test('once', function (t) { - var f = 0 - function fn (g) { - t.equal(f, 0) - f ++ - return f + g + this - } - fn.ownProperty = {} - var foo = once(fn) - t.equal(fn.ownProperty, foo.ownProperty) - t.notOk(foo.called) - for (var i = 0; i < 1E3; i++) { - t.same(f, i === 0 ? 0 : 1) - var g = foo.call(1, 1) - t.ok(foo.called) - t.same(g, 3) - t.same(f, 1) - } - t.end() -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/index.js deleted file mode 100644 index 19f103f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/index.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -function posix(path) { - return path.charAt(0) === '/'; -}; - -function win32(path) { - // https://github.com/joyent/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 - var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; - var result = splitDeviceRe.exec(path); - var device = result[1] || ''; - var isUnc = !!device && device.charAt(1) !== ':'; - - // UNC paths are always absolute - return !!result[2] || isUnc; -}; - -module.exports = process.platform === 'win32' ? win32 : posix; -module.exports.posix = posix; -module.exports.win32 = win32; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/license b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/license deleted file mode 100644 index 654d0bf..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/package.json deleted file mode 100644 index 301658f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "path-is-absolute", - "version": "1.0.0", - "description": "Node.js 0.12 path.isAbsolute() ponyfill", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/sindresorhus/path-is-absolute" - }, - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "node test.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "path", - "paths", - "file", - "dir", - "absolute", - "isabsolute", - "is-absolute", - "built-in", - "util", - "utils", - "core", - "ponyfill", - "polyfill", - "shim", - "is", - "detect", - "check" - ], - "gitHead": "7a76a0c9f2263192beedbe0a820e4d0baee5b7a1", - "bugs": { - "url": "https://github.com/sindresorhus/path-is-absolute/issues" - }, - "homepage": "https://github.com/sindresorhus/path-is-absolute", - "_id": "path-is-absolute@1.0.0", - "_shasum": "263dada66ab3f2fb10bf7f9d24dd8f3e570ef912", - "_from": "path-is-absolute@>=1.0.0 <2.0.0", - "_npmVersion": "2.5.1", - "_nodeVersion": "0.12.0", - "_npmUser": { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - "maintainers": [ - { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - } - ], - "dist": { - "shasum": "263dada66ab3f2fb10bf7f9d24dd8f3e570ef912", - "tarball": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/readme.md deleted file mode 100644 index cdf94f4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/node_modules/path-is-absolute/readme.md +++ /dev/null @@ -1,51 +0,0 @@ -# path-is-absolute [![Build Status](https://travis-ci.org/sindresorhus/path-is-absolute.svg?branch=master)](https://travis-ci.org/sindresorhus/path-is-absolute) - -> Node.js 0.12 [`path.isAbsolute()`](http://nodejs.org/api/path.html#path_path_isabsolute_path) ponyfill - -> Ponyfill: A polyfill that doesn't overwrite the native method - - -## Install - -``` -$ npm install --save path-is-absolute -``` - - -## Usage - -```js -var pathIsAbsolute = require('path-is-absolute'); - -// Linux -pathIsAbsolute('/home/foo'); -//=> true - -// Windows -pathIsAbsolute('C:/Users/'); -//=> true - -// Any OS -pathIsAbsolute.posix('/home/foo'); -//=> true -``` - - -## API - -See the [`path.isAbsolute()` docs](http://nodejs.org/api/path.html#path_path_isabsolute_path). - -### pathIsAbsolute(path) - -### pathIsAbsolute.posix(path) - -The Posix specific version. - -### pathIsAbsolute.win32(path) - -The Windows specific version. - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/package.json deleted file mode 100644 index 0c2d083..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "name": "glob", - "description": "a little globber", - "version": "5.0.14", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-glob.git" - }, - "main": "glob.js", - "files": [ - "glob.js", - "sync.js", - "common.js" - ], - "engines": { - "node": "*" - }, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "devDependencies": { - "mkdirp": "0", - "rimraf": "^2.2.8", - "tap": "^1.1.4", - "tick": "0.0.6" - }, - "scripts": { - "prepublish": "npm run benchclean", - "profclean": "rm -f v8.log profile.txt", - "test": "tap test/*.js --cov", - "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js", - "bench": "bash benchmark.sh", - "prof": "bash prof.sh && cat profile.txt", - "benchclean": "node benchclean.js" - }, - "license": "ISC", - "gitHead": "c47d4514f8f93f23b589afa18947306116bfe40f", - "bugs": { - "url": "https://github.com/isaacs/node-glob/issues" - }, - "homepage": "https://github.com/isaacs/node-glob#readme", - "_id": "glob@5.0.14", - "_shasum": "a811d507acb605441edd6cd2622a3c6f06cc00e1", - "_from": "glob@>=5.0.0 <6.0.0", - "_npmVersion": "3.1.0", - "_nodeVersion": "2.2.1", - "_npmUser": { - "name": "isaacs", - "email": "isaacs@npmjs.com" - }, - "dist": { - "shasum": "a811d507acb605441edd6cd2622a3c6f06cc00e1", - "tarball": "http://registry.npmjs.org/glob/-/glob-5.0.14.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "directories": {}, - "_resolved": "https://registry.npmjs.org/glob/-/glob-5.0.14.tgz" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/sync.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/sync.js deleted file mode 100644 index 09883d2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/glob/sync.js +++ /dev/null @@ -1,460 +0,0 @@ -module.exports = globSync -globSync.GlobSync = GlobSync - -var fs = require('fs') -var minimatch = require('minimatch') -var Minimatch = minimatch.Minimatch -var Glob = require('./glob.js').Glob -var util = require('util') -var path = require('path') -var assert = require('assert') -var isAbsolute = require('path-is-absolute') -var common = require('./common.js') -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var childrenIgnored = common.childrenIgnored - -function globSync (pattern, options) { - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') - - return new GlobSync(pattern, options).found -} - -function GlobSync (pattern, options) { - if (!pattern) - throw new Error('must provide pattern') - - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') - - if (!(this instanceof GlobSync)) - return new GlobSync(pattern, options) - - setopts(this, pattern, options) - - if (this.noprocess) - return this - - var n = this.minimatch.set.length - this.matches = new Array(n) - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false) - } - this._finish() -} - -GlobSync.prototype._finish = function () { - assert(this instanceof GlobSync) - if (this.realpath) { - var self = this - this.matches.forEach(function (matchset, index) { - var set = self.matches[index] = Object.create(null) - for (var p in matchset) { - try { - p = self._makeAbs(p) - var real = fs.realpathSync(p, self.realpathCache) - set[real] = true - } catch (er) { - if (er.syscall === 'stat') - set[self._makeAbs(p)] = true - else - throw er - } - } - }) - } - common.finish(this) -} - - -GlobSync.prototype._process = function (pattern, index, inGlobStar) { - assert(this instanceof GlobSync) - - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ - } - // now n is the index of the first one that is *not* a string. - - // See if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index) - return - - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break - - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break - } - - var remain = pattern.slice(n) - - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix - - var abs = this._makeAbs(read) - - //if ignored, skip processing - if (childrenIgnored(this, read)) - return - - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar) -} - - -GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { - var entries = this._readdir(abs, inGlobStar) - - // if the abs isn't a dir, then nothing can match! - if (!entries) - return - - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' - - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } - - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return - - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. - - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix.slice(-1) !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this.matches[index][e] = true - } - // This was the last one, and no stats were needed - return - } - - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) - newPattern = [prefix, e] - else - newPattern = [e] - this._process(newPattern.concat(remain), index, inGlobStar) - } -} - - -GlobSync.prototype._emitMatch = function (index, e) { - var abs = this._makeAbs(e) - if (this.mark) - e = this._mark(e) - - if (this.matches[index][e]) - return - - if (this.nodir) { - var c = this.cache[this._makeAbs(e)] - if (c === 'DIR' || Array.isArray(c)) - return - } - - this.matches[index][e] = true - if (this.stat) - this._stat(e) -} - - -GlobSync.prototype._readdirInGlobStar = function (abs) { - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false) - - var entries - var lstat - var stat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - // lstat failed, doesn't exist - return null - } - - var isSym = lstat.isSymbolicLink() - this.symlinks[abs] = isSym - - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && !lstat.isDirectory()) - this.cache[abs] = 'FILE' - else - entries = this._readdir(abs, false) - - return entries -} - -GlobSync.prototype._readdir = function (abs, inGlobStar) { - var entries - - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs) - - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return null - - if (Array.isArray(c)) - return c - } - - try { - return this._readdirEntries(abs, fs.readdirSync(abs)) - } catch (er) { - this._readdirError(abs, er) - return null - } -} - -GlobSync.prototype._readdirEntries = function (abs, entries) { - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } - - this.cache[abs] = entries - - // mark and cache dir-ness - return entries -} - -GlobSync.prototype._readdirError = function (f, er) { - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - this.cache[this._makeAbs(f)] = 'FILE' - break - - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break - - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) - throw er - if (!this.silent) - console.error('glob error', er) - break - } -} - -GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { - - var entries = this._readdir(abs, inGlobStar) - - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return - - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) - - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false) - - var len = entries.length - var isSym = this.symlinks[abs] - - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return - - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue - - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true) - - var below = gspref.concat(entries[i], remain) - this._process(below, index, true) - } -} - -GlobSync.prototype._processSimple = function (prefix, index) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var exists = this._stat(prefix) - - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return - - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } - - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') - - // Mark this as a match - this.matches[index][prefix] = true -} - -// Returns either 'DIR', 'FILE', or false -GlobSync.prototype._stat = function (f) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' - - if (f.length > this.maxLength) - return false - - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] - - if (Array.isArray(c)) - c = 'DIR' - - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return c - - if (needDir && c === 'FILE') - return false - - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } - - var exists - var stat = this.statCache[abs] - if (!stat) { - var lstat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - return false - } - - if (lstat.isSymbolicLink()) { - try { - stat = fs.statSync(abs) - } catch (er) { - stat = lstat - } - } else { - stat = lstat - } - } - - this.statCache[abs] = stat - - var c = stat.isDirectory() ? 'DIR' : 'FILE' - this.cache[abs] = this.cache[abs] || c - - if (needDir && c !== 'DIR') - return false - - return c -} - -GlobSync.prototype._mark = function (p) { - return common.mark(this, p) -} - -GlobSync.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/.npmignore deleted file mode 100644 index c2658d7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/README.md deleted file mode 100644 index 13a2e86..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# graceful-fs - -graceful-fs functions as a drop-in replacement for the fs module, -making various improvements. - -The improvements are meant to normalize behavior across different -platforms and environments, and to make filesystem access more -resilient to errors. - -## Improvements over [fs module](http://api.nodejs.org/fs.html) - -graceful-fs: - -* Queues up `open` and `readdir` calls, and retries them once - something closes if there is an EMFILE error from too many file - descriptors. -* fixes `lchmod` for Node versions prior to 0.6.2. -* implements `fs.lutimes` if possible. Otherwise it becomes a noop. -* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or - `lchown` if the user isn't root. -* makes `lchmod` and `lchown` become noops, if not available. -* retries reading a file if `read` results in EAGAIN error. - -On Windows, it retries renaming a file for up to one second if `EACCESS` -or `EPERM` error occurs, likely because antivirus software has locked -the directory. - -## USAGE - -```javascript -// use just like fs -var fs = require('graceful-fs') - -// now go and do stuff with it... -fs.readFileSync('some-file-or-whatever') -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/fs.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/fs.js deleted file mode 100644 index 64ad980..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/fs.js +++ /dev/null @@ -1,11 +0,0 @@ -// eeeeeevvvvviiiiiiillllll -// more evil than monkey-patching the native builtin? -// Not sure. - -var mod = require("module") -var pre = '(function (exports, require, module, __filename, __dirname) { ' -var post = '});' -var src = pre + process.binding('natives').fs + post -var vm = require('vm') -var fn = vm.runInThisContext(src) -fn(exports, require, module, __filename, __dirname) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/graceful-fs.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/graceful-fs.js deleted file mode 100644 index fb206b8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/graceful-fs.js +++ /dev/null @@ -1,158 +0,0 @@ -// Monkey-patching the fs module. -// It's ugly, but there is simply no other way to do this. -var fs = module.exports = require('./fs.js') - -var assert = require('assert') - -// fix up some busted stuff, mostly on windows and old nodes -require('./polyfills.js') - -var util = require('util') - -function noop () {} - -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs') -else if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS: ' + m.split(/\n/).join('\nGFS: ') - console.error(m) - } - -if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug('fds', fds) - debug(queue) - assert.equal(queue.length, 0) - }) -} - - -var originalOpen = fs.open -fs.open = open - -function open(path, flags, mode, cb) { - if (typeof mode === "function") cb = mode, mode = null - if (typeof cb !== "function") cb = noop - new OpenReq(path, flags, mode, cb) -} - -function OpenReq(path, flags, mode, cb) { - this.path = path - this.flags = flags - this.mode = mode - this.cb = cb - Req.call(this) -} - -util.inherits(OpenReq, Req) - -OpenReq.prototype.process = function() { - originalOpen.call(fs, this.path, this.flags, this.mode, this.done) -} - -var fds = {} -OpenReq.prototype.done = function(er, fd) { - debug('open done', er, fd) - if (fd) - fds['fd' + fd] = this.path - Req.prototype.done.call(this, er, fd) -} - - -var originalReaddir = fs.readdir -fs.readdir = readdir - -function readdir(path, cb) { - if (typeof cb !== "function") cb = noop - new ReaddirReq(path, cb) -} - -function ReaddirReq(path, cb) { - this.path = path - this.cb = cb - Req.call(this) -} - -util.inherits(ReaddirReq, Req) - -ReaddirReq.prototype.process = function() { - originalReaddir.call(fs, this.path, this.done) -} - -ReaddirReq.prototype.done = function(er, files) { - if (files && files.sort) - files = files.sort() - Req.prototype.done.call(this, er, files) - onclose() -} - - -var originalClose = fs.close -fs.close = close - -function close (fd, cb) { - debug('close', fd) - if (typeof cb !== "function") cb = noop - delete fds['fd' + fd] - originalClose.call(fs, fd, function(er) { - onclose() - cb(er) - }) -} - - -var originalCloseSync = fs.closeSync -fs.closeSync = closeSync - -function closeSync (fd) { - try { - return originalCloseSync(fd) - } finally { - onclose() - } -} - - -// Req class -function Req () { - // start processing - this.done = this.done.bind(this) - this.failures = 0 - this.process() -} - -Req.prototype.done = function (er, result) { - var tryAgain = false - if (er) { - var code = er.code - var tryAgain = code === "EMFILE" || code === "ENFILE" - if (process.platform === "win32") - tryAgain = tryAgain || code === "OK" - } - - if (tryAgain) { - this.failures ++ - enqueue(this) - } else { - var cb = this.cb - cb(er, result) - } -} - -var queue = [] - -function enqueue(req) { - queue.push(req) - debug('enqueue %d %s', queue.length, req.constructor.name, req) -} - -function onclose() { - var req = queue.shift() - if (req) { - debug('process', req.constructor.name, req) - req.process() - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/package.json deleted file mode 100644 index 1e77dd0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me" - }, - "name": "graceful-fs", - "description": "A drop-in replacement for fs, making various improvements.", - "version": "3.0.8", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-graceful-fs.git" - }, - "main": "graceful-fs.js", - "engines": { - "node": ">=0.4.0" - }, - "directories": { - "test": "test" - }, - "scripts": { - "test": "tap test/*.js" - }, - "keywords": [ - "fs", - "module", - "reading", - "retry", - "retries", - "queue", - "error", - "errors", - "handling", - "EMFILE", - "EAGAIN", - "EINVAL", - "EPERM", - "EACCESS" - ], - "license": "ISC", - "devDependencies": { - "mkdirp": "^0.5.0", - "rimraf": "^2.2.8", - "tap": "^1.2.0" - }, - "gitHead": "45c57aa5e323c35a985a525de6f0c9a6ef59e1f8", - "bugs": { - "url": "https://github.com/isaacs/node-graceful-fs/issues" - }, - "homepage": "https://github.com/isaacs/node-graceful-fs#readme", - "_id": "graceful-fs@3.0.8", - "_shasum": "ce813e725fa82f7e6147d51c9a5ca68270551c22", - "_from": "graceful-fs@>=3.0.2 <4.0.0", - "_npmVersion": "2.10.1", - "_nodeVersion": "2.0.1", - "_npmUser": { - "name": "isaacs", - "email": "isaacs@npmjs.com" - }, - "dist": { - "shasum": "ce813e725fa82f7e6147d51c9a5ca68270551c22", - "tarball": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/polyfills.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/polyfills.js deleted file mode 100644 index 4270539..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/polyfills.js +++ /dev/null @@ -1,255 +0,0 @@ -var fs = require('./fs.js') -var constants = require('constants') - -var origCwd = process.cwd -var cwd = null -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) -} - -// (re-)implement some things that are known busted or missing. - -// lchmod, broken prior to 0.6.2 -// back-port the fix here. -if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - fs.lchmod = function (path, mode, callback) { - callback = callback || noop - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , 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, mode) - - // 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 - } -} - - -// lutimes implementation, or no-op -if (!fs.lutimes) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - cb = cb || noop - if (er) return cb(er) - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - return cb(er || er2) - }) - }) - }) - } - - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - , err - , err2 - , ret - - try { - var ret = fs.futimesSync(fd, at, mt) - } catch (er) { - err = er - } - try { - fs.closeSync(fd) - } catch (er) { - err2 = er - } - if (err || err2) throw (err || err2) - return ret - } - - } else if (fs.utimensat && constants.hasOwnProperty("AT_SYMLINK_NOFOLLOW")) { - // maybe utimensat will be bound soonish? - fs.lutimes = function (path, at, mt, cb) { - fs.utimensat(path, at, mt, constants.AT_SYMLINK_NOFOLLOW, cb) - } - - fs.lutimesSync = function (path, at, mt) { - return fs.utimensatSync(path, at, mt, constants.AT_SYMLINK_NOFOLLOW) - } - - } else { - fs.lutimes = function (_a, _b, _c, cb) { process.nextTick(cb) } - fs.lutimesSync = function () {} - } -} - - -// https://github.com/isaacs/node-graceful-fs/issues/4 -// Chown should not fail on einval or eperm if non-root. -// It should not fail on enosys ever, as this just indicates -// that a fs doesn't support the intended operation. - -fs.chown = chownFix(fs.chown) -fs.fchown = chownFix(fs.fchown) -fs.lchown = chownFix(fs.lchown) - -fs.chmod = chownFix(fs.chmod) -fs.fchmod = chownFix(fs.fchmod) -fs.lchmod = chownFix(fs.lchmod) - -fs.chownSync = chownFixSync(fs.chownSync) -fs.fchownSync = chownFixSync(fs.fchownSync) -fs.lchownSync = chownFixSync(fs.lchownSync) - -fs.chmodSync = chownFix(fs.chmodSync) -fs.fchmodSync = chownFix(fs.fchmodSync) -fs.lchmodSync = chownFix(fs.lchmodSync) - -function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er, res) { - if (chownErOk(er)) er = null - cb(er, res) - }) - } -} - -function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } - } -} - -// ENOSYS means that the fs doesn't support the op. Just ignore -// that, because it doesn't matter. -// -// if there's no getuid, or if getuid() is something other -// than 0, and the error is EINVAL or EPERM, then just ignore -// it. -// -// This specific case is a silent failure in cp, install, tar, -// and most other unix tools that manage permissions. -// -// When running as root, or if other types of errors are -// encountered, then it's strict. -function chownErOk (er) { - if (!er) - return true - - if (er.code === "ENOSYS") - return true - - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } - - return false -} - - -// if lchmod/lchown do not exist, then make them no-ops -if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - process.nextTick(cb) - } - fs.lchmodSync = function () {} -} -if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - process.nextTick(cb) - } - fs.lchownSync = function () {} -} - - - -// on Windows, A/V software can lock the directory, causing this -// to fail with an EACCES or EPERM if the directory contains newly -// created files. Try again on failure, for up to 1 second. -if (process.platform === "win32") { - var rename_ = fs.rename - fs.rename = function rename (from, to, cb) { - var start = Date.now() - rename_(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 1000) { - return rename_(from, to, CB) - } - if(cb) cb(er) - }) - } -} - - -// if read() returns EAGAIN, then just try it again. -var read = fs.read -fs.read = function (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) - } - } - return read.call(fs, fd, buffer, offset, length, position, callback) -} - -var readSync = fs.readSync -fs.readSync = function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue - } - throw er - } - } -} - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/max-open.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/max-open.js deleted file mode 100644 index a6b9ba4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/max-open.js +++ /dev/null @@ -1,69 +0,0 @@ -var test = require('tap').test -var fs = require('../') - -test('open lots of stuff', function (t) { - // Get around EBADF from libuv by making sure that stderr is opened - // Otherwise Darwin will refuse to give us a FD for stderr! - process.stderr.write('') - - // How many parallel open()'s to do - var n = 1024 - var opens = 0 - var fds = [] - var going = true - var closing = false - var doneCalled = 0 - - for (var i = 0; i < n; i++) { - go() - } - - function go() { - opens++ - fs.open(__filename, 'r', function (er, fd) { - if (er) throw er - fds.push(fd) - if (going) go() - }) - } - - // should hit ulimit pretty fast - setTimeout(function () { - going = false - t.equal(opens - fds.length, n) - done() - }, 100) - - - function done () { - if (closing) return - doneCalled++ - - if (fds.length === 0) { - console.error('done called %d times', doneCalled) - // First because of the timeout - // Then to close the fd's opened afterwards - // Then this time, to complete. - // Might take multiple passes, depending on CPU speed - // and ulimit, but at least 3 in every case. - t.ok(doneCalled >= 2) - return t.end() - } - - closing = true - setTimeout(function () { - // console.error('do closing again') - closing = false - done() - }, 100) - - // console.error('closing time') - var closes = fds.slice(0) - fds.length = 0 - closes.forEach(function (fd) { - fs.close(fd, function (er) { - if (er) throw er - }) - }) - } -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/open.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/open.js deleted file mode 100644 index 85732f2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/open.js +++ /dev/null @@ -1,39 +0,0 @@ -var test = require('tap').test -var fs = require('../graceful-fs.js') - -test('graceful fs is monkeypatched fs', function (t) { - t.equal(fs, require('../fs.js')) - t.end() -}) - -test('open an existing file works', function (t) { - var fd = fs.openSync(__filename, 'r') - fs.closeSync(fd) - fs.open(__filename, 'r', function (er, fd) { - if (er) throw er - fs.close(fd, function (er) { - if (er) throw er - t.pass('works') - t.end() - }) - }) -}) - -test('open a non-existing file throws', function (t) { - var er - try { - var fd = fs.openSync('this file does not exist', 'r') - } catch (x) { - er = x - } - t.ok(er, 'should throw') - t.notOk(fd, 'should not get an fd') - t.equal(er.code, 'ENOENT') - - fs.open('neither does this file', 'r', function (er, fd) { - t.ok(er, 'should throw') - t.notOk(fd, 'should not get an fd') - t.equal(er.code, 'ENOENT') - t.end() - }) -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/readdir-sort.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/readdir-sort.js deleted file mode 100644 index cb63a68..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/readdir-sort.js +++ /dev/null @@ -1,20 +0,0 @@ -var test = require("tap").test -var fs = require("../fs.js") - -var readdir = fs.readdir -fs.readdir = function(path, cb) { - process.nextTick(function() { - cb(null, ["b", "z", "a"]) - }) -} - -var g = require("../") - -test("readdir reorder", function (t) { - g.readdir("whatevers", function (er, files) { - if (er) - throw er - t.same(files, [ "a", "b", "z" ]) - t.end() - }) -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/write-then-read.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/write-then-read.js deleted file mode 100644 index 21e4c26..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/graceful-fs/test/write-then-read.js +++ /dev/null @@ -1,47 +0,0 @@ -var fs = require('../'); -var rimraf = require('rimraf'); -var mkdirp = require('mkdirp'); -var test = require('tap').test; -var p = require('path').resolve(__dirname, 'files'); - -process.chdir(__dirname) - -// Make sure to reserve the stderr fd -process.stderr.write(''); - -var num = 4097; -var paths = new Array(num); - -test('make files', function (t) { - rimraf.sync(p); - mkdirp.sync(p); - - for (var i = 0; i < num; ++i) { - paths[i] = 'files/file-' + i; - fs.writeFileSync(paths[i], 'content'); - } - - t.end(); -}) - -test('read files', function (t) { - // now read them - var done = 0; - for (var i = 0; i < num; ++i) { - fs.readFile(paths[i], function(err, data) { - if (err) - throw err; - - ++done; - if (done === num) { - t.pass('success'); - t.end() - } - }); - } -}); - -test('cleanup', function (t) { - rimraf.sync(p); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/.gitmodules b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/.gitmodules deleted file mode 100644 index 1739275..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "spec/mustache"] - path = spec/mustache - url = git://github.com/mustache/spec.git diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/.istanbul.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/.istanbul.yml deleted file mode 100644 index e6911f1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/.istanbul.yml +++ /dev/null @@ -1,2 +0,0 @@ -instrumentation: - excludes: ['**/spec/**'] diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/.npmignore deleted file mode 100644 index f10592c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/.npmignore +++ /dev/null @@ -1,25 +0,0 @@ -.DS_Store -.gitignore -.rvmrc -.eslintrc -.travis.yml -.rspec -Gemfile -Gemfile.lock -Rakefile -Gruntfile.js -*.gemspec -*.nuspec -*.log -bench/* -configurations/* -components/* -coverage/* -dist/cdnjs/* -dist/components/* -spec/* -src/* -tasks/* -tmp/* -publish/* -vendor/* diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/CONTRIBUTING.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/CONTRIBUTING.md deleted file mode 100644 index b84fdb0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/CONTRIBUTING.md +++ /dev/null @@ -1,80 +0,0 @@ -# How to Contribute - -## Reporting Issues - -Please see our [FAQ](https://github.com/wycats/handlebars.js/blob/master/FAQ.md) for common issues that people run into. - -Should you run into other issues with the project, please don't hesitate to let us know by filing an [issue][issue]! In general we are going to ask for an example of the problem failing, which can be as simple as a jsfiddle/jsbin/etc. We've put together a jsfiddle [template][jsfiddle] to ease this. (We will keep this link up to date as new releases occur, so feel free to check back here) - -Pull requests containing only failing thats demonstrating the issue are welcomed and this also helps ensure that your issue won't regress in the future once it's fixed. - -Documentation issues on the handlebarsjs.com site should be reported on [handlebars-site](https://github.com/wycats/handlebars-site). - -## Pull Requests - -We also accept [pull requests][pull-request]! - -Generally we like to see pull requests that -- Maintain the existing code style -- Are focused on a single change (i.e. avoid large refactoring or style adjustments in untouched code if not the primary goal of the pull request) -- Have [good commit messages](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) -- Have tests -- Don't significantly decrease the current code coverage (see coverage/lcov-report/index.html) - -## Building - -To build Handlebars.js you'll need a few things installed. - -* Node.js -* [Grunt](http://gruntjs.com/getting-started) - -Before building, you need to make sure that the Git submodule `spec/mustache` is included (i.e. the directory `spec/mustache` should not be empty). To include it, if using Git version 1.6.5 or newer, use `git clone --recursive` rather than `git clone`. Or, if you already cloned without `--recursive`, use `git submodule update --init`. - -Project dependencies may be installed via `npm install`. - -To build Handlebars.js from scratch, you'll want to run `grunt` -in the root of the project. That will build Handlebars and output the -results to the dist/ folder. To re-run tests, run `grunt test` or `npm test`. -You can also run our set of benchmarks with `grunt bench`. - -The `grunt dev` implements watching for tests and allows for in browser testing at `http://localhost:9999/spec/`. - -If you notice any problems, please report them to the GitHub issue tracker at -[http://github.com/wycats/handlebars.js/issues](http://github.com/wycats/handlebars.js/issues). - -## Ember testing - -The current ember distribution should be tested as part of the handlebars release process. This requires building the `handlebars-source` gem locally and then executing the ember test script. - -```sh -npm link -grunt build release -cp dist/*.js $emberRepoDir/bower_components/handlebars/ - -cd $emberRepoDir -npm link handlebars -npm test -``` - -## Releasing - -Handlebars utilizes the [release yeoman generator][generator-release] to perform most release tasks. - -A full release may be completed with the following: - -``` -yo release -npm publish -yo release:publish components handlebars.js dist/components/ - -cd dist/components/ -gem build handlebars-source.gemspec -gem push handlebars-source-*.gem -``` - -After this point the handlebars site needs to be updated to point to the new version numbers. The jsfiddle link should be updated to point to the most recent distribution for all instances in our documentation. - -[generator-release]: https://github.com/walmartlabs/generator-release -[pull-request]: https://github.com/wycats/handlebars.js/pull/new/master -[issue]: https://github.com/wycats/handlebars.js/issues/new -[jsfiddle]: http://jsfiddle.net/9D88g/26/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/FAQ.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/FAQ.md deleted file mode 100644 index 108e839..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/FAQ.md +++ /dev/null @@ -1,60 +0,0 @@ -# Frequently Asked Questions - -1. How can I file a bug report: - - See our guidelines on [reporting issues](https://github.com/wycats/handlebars.js/blob/master/CONTRIBUTING.md#reporting-issues). - -1. Why isn't my Mustache template working? - - Handlebars deviates from Mustache slightly on a few behaviors. These variations are documented in our [readme](https://github.com/wycats/handlebars.js#differences-between-handlebarsjs-and-mustache). - -1. Why is it slower when compiling? - - The Handlebars compiler must parse the template and construct a JavaScript program which can then be run. Under some environments such as older mobile devices this can have a performance impact which can be avoided by precompiling. Generally it's recommended that precompilation and the runtime library be used on all clients. - -1. Why doesn't this work with Content Security Policy restrictions? - - When not using the precompiler, Handlebars generates a dynamic function for each template which can cause issues with pages that have enabled Content Policy. It's recommended that templates are precompiled or the `unsafe-eval` policy is enabled for sites that must generate dynamic templates at runtime. - -1. How can I include script tags in my template? - - If loading the template via an inlined ` - ``` - - It's generally recommended that templates are served through external, precompiled, files, which do not suffer from this issue. - -1. Why are my precompiled scripts throwing exceptions? - - When using the precompiler, it's important that a supporting version of the Handlebars runtime be loaded on the target page. In version 1.x there were rudimentary checks to compare the version but these did not always work. This is fixed under 2.x but the version checking does not work between these two versions. If you see unexpected errors such as `undefined is not a function` or similar, please verify that the same version is being used for both the precompiler and the client. This can be checked via: - - ```sh - handlebars --version - ``` - If using the integrated precompiler and - - ```javascript - console.log(Handlebars.VERSION); - ``` - On the client side. - - We include the built client libraries in the npm package for those who want to be certain that they are using the same client libraries as the compiler. - - Should these match, please file an issue with us, per our [issue filing guidelines](https://github.com/wycats/handlebars.js/blob/master/CONTRIBUTING.md#reporting-issues). - -1. Why doesn't IE like the `default` name in the AMD module? - - Some browsers such as particular versions of IE treat `default` as a reserved word in JavaScript source files. To safely use this you need to reference this via the `Handlebars['default']` lookup method. This is an unfortunate side effect of the shims necessary to backport the Handlebars ES6 code to all current browsers. - -1. How do I load the runtime library when using AMD? - - There are two options for loading under AMD environments. The first is to use the `handlebars.runtime.amd.js` file. This may require a [path mapping](https://github.com/wycats/handlebars.js/blob/master/spec/amd-runtime.html#L31) as well as access via the `default` field. - - The other option is to load the `handlebars.runtime.js` UMD build, which might not require path configuration and exposes the library as both the module root and the `default` field for compatibility. - - If not using ES6 transpilers or accessing submodules in the build the former option should be sufficient for most use cases. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/LICENSE deleted file mode 100644 index a2d22cb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2011-2014 by Yehuda Katz - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/README.markdown b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/README.markdown deleted file mode 100644 index d6aa6bd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/README.markdown +++ /dev/null @@ -1,438 +0,0 @@ -[![Travis Build Status](https://img.shields.io/travis/wycats/handlebars.js/master.svg)](https://travis-ci.org/wycats/handlebars.js) -[![Selenium Test Status](https://saucelabs.com/buildstatus/handlebars)](https://saucelabs.com/u/handlebars) - -Handlebars.js -============= - -Handlebars.js is an extension to the [Mustache templating -language](http://mustache.github.com/) created by Chris Wanstrath. -Handlebars.js and Mustache are both logicless templating languages that -keep the view and the code separated like we all know they should be. - -Checkout the official Handlebars docs site at -[http://www.handlebarsjs.com](http://www.handlebarsjs.com). - -Installing ----------- -Installing Handlebars is easy. Simply download the package [from the official site](http://handlebarsjs.com/) or the [bower repository][bower-repo] and add it to your web pages (you should usually use the most recent version). - -For web browsers, a free CDN is available at [jsDelivr](http://www.jsdelivr.com/#!handlebarsjs). Advanced usage, such as [version aliasing & concocting](https://github.com/jsdelivr/jsdelivr#usage), is available. - -Alternatively, if you prefer having the latest version of handlebars from -the 'master' branch, passing builds of the 'master' branch are automatically -published to S3. You may download the latest passing master build by grabbing -a `handlebars-latest.js` file from the [builds page][builds-page]. When the -build is published, it is also available as a `handlebars-gitSHA.js` file on -the builds page if you need a version to refer to others. -`handlebars-runtime.js` builds are also available. - -**Note**: The S3 builds page is provided as a convenience for the community, -but you should not use it for hosting Handlebars in production. - -Usage ------ -In general, the syntax of Handlebars.js templates is a superset -of Mustache templates. For basic syntax, check out the [Mustache -manpage](http://mustache.github.com/mustache.5.html). - -Once you have a template, use the `Handlebars.compile` method to compile -the template into a function. The generated function takes a context -argument, which will be used to render the template. - -```js -var source = "

Hello, my name is {{name}}. I am from {{hometown}}. I have " + - "{{kids.length}} kids:

" + - "
    {{#kids}}
  • {{name}} is {{age}}
  • {{/kids}}
"; -var template = Handlebars.compile(source); - -var data = { "name": "Alan", "hometown": "Somewhere, TX", - "kids": [{"name": "Jimmy", "age": "12"}, {"name": "Sally", "age": "4"}]}; -var result = template(data); - -// Would render: -//

Hello, my name is Alan. I am from Somewhere, TX. I have 2 kids:

-//
    -//
  • Jimmy is 12
  • -//
  • Sally is 4
  • -//
-``` - - -Registering Helpers -------------------- - -You can register helpers that Handlebars will use when evaluating your -template. Here's an example, which assumes that your objects have a URL -embedded in them, as well as the text for a link: - -```js -Handlebars.registerHelper('link_to', function() { - return new Handlebars.SafeString("" + Handlebars.Utils.escapeExpression(this.body) + ""); -}); - -var context = { posts: [{url: "/hello-world", body: "Hello World!"}] }; -var source = "
    {{#posts}}
  • {{link_to}}
  • {{/posts}}
" - -var template = Handlebars.compile(source); -template(context); - -// Would render: -// -// -``` - -Helpers take precedence over fields defined on the context. To access a field -that is masked by a helper, a path reference may be used. In the example above -a field named `link_to` on the `context` object would be referenced using: - -``` -{{./link_to}} -``` - -Escaping --------- - -By default, the `{{expression}}` syntax will escape its contents. This -helps to protect you against accidental XSS problems caused by malicious -data passed from the server as JSON. - -To explicitly *not* escape the contents, use the triple-mustache -(`{{{}}}`). You have seen this used in the above example. - - -Differences Between Handlebars.js and Mustache ----------------------------------------------- -Handlebars.js adds a couple of additional features to make writing -templates easier and also changes a tiny detail of how partials work. - -### Paths - -Handlebars.js supports an extended expression syntax that we call paths. -Paths are made up of typical expressions and `.` characters. Expressions -allow you to not only display data from the current context, but to -display data from contexts that are descendants and ancestors of the -current context. - -To display data from descendant contexts, use the `.` character. So, for -example, if your data were structured like: - -```js -var data = {"person": { "name": "Alan" }, "company": {"name": "Rad, Inc." } }; -``` - -You could display the person's name from the top-level context with the -following expression: - -``` -{{person.name}} -``` - -You can backtrack using `../`. For example, if you've already traversed -into the person object you could still display the company's name with -an expression like `{{../company.name}}`, so: - -``` -{{#with person}}{{name}} - {{../company.name}}{{/with}} -``` - -would render: - -``` -Alan - Rad, Inc. -``` - -### Strings - -When calling a helper, you can pass paths or Strings as parameters. For -instance: - -```js -Handlebars.registerHelper('link_to', function(title, options) { - return "" + title + "!" -}); - -var context = { posts: [{url: "/hello-world", body: "Hello World!"}] }; -var source = '
    {{#posts}}
  • {{{link_to "Post"}}}
  • {{/posts}}
' - -var template = Handlebars.compile(source); -template(context); - -// Would render: -// -// -``` - -When you pass a String as a parameter to a helper, the literal String -gets passed to the helper function. - - -### Block Helpers - -Handlebars.js also adds the ability to define block helpers. Block -helpers are functions that can be called from anywhere in the template. -Here's an example: - -```js -var source = "
    {{#people}}
  • {{#link}}{{name}}{{/link}}
  • {{/people}}
"; -Handlebars.registerHelper('link', function(options) { - return '' + options.fn(this) + ''; -}); -var template = Handlebars.compile(source); - -var data = { "people": [ - { "name": "Alan", "id": 1 }, - { "name": "Yehuda", "id": 2 } - ]}; -template(data); - -// Should render: -// -``` - -Whenever the block helper is called it is given one or more parameters, -any arguments that are passed into the helper in the call, and an `options` -object containing the `fn` function which executes the block's child. -The block's current context may be accessed through `this`. - -Block helpers have the same syntax as mustache sections but should not be -confused with one another. Sections are akin to an implicit `each` or -`with` statement depending on the input data and helpers are explicit -pieces of code that are free to implement whatever behavior they like. -The [mustache spec](http://mustache.github.io/mustache.5.html) -defines the exact behavior of sections. In the case of name conflicts, -helpers are given priority. - -### Partials - -You can register additional templates as partials, which will be used by -Handlebars when it encounters a partial (`{{> partialName}}`). Partials -can either be String templates or compiled template functions. Here's an -example: - -```js -var source = "
    {{#people}}
  • {{> link}}
  • {{/people}}
"; - -Handlebars.registerPartial('link', '{{name}}') -var template = Handlebars.compile(source); - -var data = { "people": [ - { "name": "Alan", "id": 1 }, - { "name": "Yehuda", "id": 2 } - ]}; - -template(data); - -// Should render: -// -``` - -Partials can also accept parameters - -```js -var source = "
{{> roster rosterProperties people=listOfPeople}}
"; - -Handlebars.registerPartial('roster', '

{{rosterName}}

{{#people}}{{id}}: {{name}}{{/people}}') -var template = Handlebars.compile(source); - -var data = { - "listOfPeople": [ - { "name": "Alan", "id": 1 }, - { "name": "Yehuda", "id": 2 } - ], - "rosterProperties": { - "rosterName": "Cool People" - } -}; - -template(data); - -// Should render: -//
-//

Cool People

-// 1: Alan -// 2: Yehuda -//
- -``` - -### Comments - -You can add comments to your templates with the following syntax: - -```js -{{! This is a comment }} -``` - -You can also use real html comments if you want them to end up in the output. - -```html -
- {{! This comment will not end up in the output }} - -
-``` - - -### Compatibility - -There are a few Mustache behaviors that Handlebars does not implement. -- Handlebars deviates from Mustache slightly in that it does not perform recursive lookup by default. The compile time `compat` flag must be set to enable this functionality. Users should note that there is a performance cost for enabling this flag. The exact cost varies by template, but it's recommended that performance sensitive operations should avoid this mode and instead opt for explicit path references. -- The optional Mustache-style lambdas are not supported. Instead Handlebars provides it's own lambda resolution that follows the behaviors of helpers. -- Alternative delimeters are not supported. - - -Precompiling Templates ----------------------- - -Handlebars allows templates to be precompiled and included as javascript -code rather than the handlebars template allowing for faster startup time. - -### Installation -The precompiler script may be installed via npm using the `npm install -g handlebars` -command. - -### Usage - -
-Precompile handlebar templates.
-Usage: handlebars template...
-
-Options:
-  -a, --amd            Create an AMD format function (allows loading with RequireJS)          [boolean]
-  -f, --output         Output File                                                            [string]
-  -k, --known          Known helpers                                                          [string]
-  -o, --knownOnly      Known helpers only                                                     [boolean]
-  -m, --min            Minimize output                                                        [boolean]
-  -s, --simple         Output template function only.                                         [boolean]
-  -r, --root           Template root. Base value that will be stripped from template names.   [string]
-  -c, --commonjs       Exports CommonJS style, path to Handlebars module                      [string]
-  -h, --handlebarPath  Path to handlebar.js (only valid for amd-style)                        [string]
-  -n, --namespace      Template namespace                                                     [string]
-  -p, --partial        Compiling a partial template                                           [boolean]
-  -d, --data           Include data when compiling                                            [boolean]
-  -e, --extension      Template extension.                                                    [string]
-  -b, --bom            Removes the BOM (Byte Order Mark) from the beginning of the templates. [boolean]
-
- -If using the precompiler's normal mode, the resulting templates will be -stored to the `Handlebars.templates` object using the relative template -name sans the extension. These templates may be executed in the same -manner as templates. - -If using the simple mode the precompiler will generate a single -javascript method. To execute this method it must be passed to -the `Handlebars.template` method and the resulting object may be used as normal. - -### Optimizations - -- Rather than using the full _handlebars.js_ library, implementations that - do not need to compile templates at runtime may include _handlebars.runtime.js_ - whose min+gzip size is approximately 1k. -- If a helper is known to exist in the target environment they may be defined - using the `--known name` argument may be used to optimize accesses to these - helpers for size and speed. -- When all helpers are known in advance the `--knownOnly` argument may be used - to optimize all block helper references. -- Implementations that do not use `@data` variables can improve performance of - iteration centric templates by specifying `{data: false}` in the compiler options. - -Supported Environments ----------------------- - -Handlebars has been designed to work in any ECMAScript 3 environment. This includes - -- Node.js -- Chrome -- Firefox -- Safari 5+ -- Opera 11+ -- IE 6+ - -Older versions and other runtimes are likely to work but have not been formally -tested. The compiler requires `JSON.stringify` to be implemented natively or via a polyfill. If using the precompiler this is not necessary. - -[![Selenium Test Status](https://saucelabs.com/browser-matrix/handlebars.svg)](https://saucelabs.com/u/handlebars) - -Performance ------------ - -In a rough performance test, precompiled Handlebars.js templates (in -the original version of Handlebars.js) rendered in about half the -time of Mustache templates. It would be a shame if it were any other -way, since they were precompiled, but the difference in architecture -does have some big performance advantages. Justin Marney, a.k.a. -[gotascii](http://github.com/gotascii), confirmed that with an -[independent test](http://sorescode.com/2010/09/12/benchmarks.html). The -rewritten Handlebars (current version) is faster than the old version, -with many [performance tests](https://travis-ci.org/wycats/handlebars.js/builds/33392182#L538) being 5 to 7 times faster than the Mustache equivalent. - - -Upgrading ---------- - -See [release-notes.md](https://github.com/wycats/handlebars.js/blob/master/release-notes.md) for upgrade notes. - -Known Issues ------------- - -See [FAQ.md](https://github.com/wycats/handlebars.js/blob/master/FAQ.md) for known issues and common pitfalls. - - -Handlebars in the Wild ----------------------- - -* [Assemble](http://assemble.io), by [@jonschlinkert](https://github.com/jonschlinkert) - and [@doowb](https://github.com/doowb), is a static site generator that uses Handlebars.js - as its template engine. -* [CoSchedule](http://coschedule.com) An editorial calendar for WordPress that uses Handlebars.js -* [dashbars](https://github.com/pismute/dashbars) A modern helper library for Handlebars.js. -* [Ember.js](http://www.emberjs.com) makes Handlebars.js the primary way to - structure your views, also with automatic data binding support. -* [Ghost](https://ghost.org/) Just a blogging platform. -* [handlebars_assets](http://github.com/leshill/handlebars_assets): A Rails Asset Pipeline gem - from Les Hill (@leshill). -* [handlebars-helpers](https://github.com/assemble/handlebars-helpers) is an extensive library - with 100+ handlebars helpers. -* [handlebars-layouts](https://github.com/shannonmoeller/handlebars-layouts) is a set of helpers which implement extendible and embeddable layout blocks as seen in other popular templating languages. -* [hbs](http://github.com/donpark/hbs): An Express.js view engine adapter for Handlebars.js, - from Don Park. -* [koa-hbs](https://github.com/jwilm/koa-hbs): [koa](https://github.com/koajs/koa) generator based - renderer for Handlebars.js. -* [jblotus](http://github.com/jblotus) created [http://tryhandlebarsjs.com](http://tryhandlebarsjs.com) - for anyone who would like to try out Handlebars.js in their browser. -* [jQuery plugin](http://71104.github.io/jquery-handlebars/): allows you to use - Handlebars.js with [jQuery](http://jquery.com/). -* [Lumbar](http://walmartlabs.github.io/lumbar) provides easy module-based template management for - handlebars projects. -* [sammy.js](http://github.com/quirkey/sammy) by Aaron Quint, a.k.a. quirkey, - supports Handlebars.js as one of its template plugins. -* [SproutCore](http://www.sproutcore.com) uses Handlebars.js as its main - templating engine, extending it with automatic data binding support. -* [YUI](http://yuilibrary.com/yui/docs/handlebars/) implements a port of handlebars -* [Swag](https://github.com/elving/swag) by [@elving](https://github.com/elving) is a growing collection of helpers for handlebars.js. Give your handlebars.js templates some swag son! -* [DOMBars](https://github.com/blakeembrey/dombars) is a DOM-based templating engine built on the Handlebars parser and runtime - -External Resources ------------------- - -* [Gist about Synchronous and asynchronous loading of external handlebars templates](https://gist.github.com/2287070) - -Have a project using Handlebars? Send us a [pull request][pull-request]! - -License -------- -Handlebars.js is released under the MIT license. - -[bower-repo]: https://github.com/components/handlebars.js -[builds-page]: http://builds.handlebarsjs.com.s3.amazonaws.com/bucket-listing.html?sort=lastmod&sortdir=desc -[pull-request]: https://github.com/wycats/handlebars.js/pull/new/master diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/bin/handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/bin/handlebars deleted file mode 100755 index 4ed98b3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/bin/handlebars +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env node - -var optimist = require('optimist') - .usage('Precompile handlebar templates.\nUsage: $0 [template|directory]...', { - 'f': { - 'type': 'string', - 'description': 'Output File', - 'alias': 'output' - }, - 'map': { - 'type': 'string', - 'description': 'Source Map File' - }, - 'a': { - 'type': 'boolean', - 'description': 'Exports amd style (require.js)', - 'alias': 'amd' - }, - 'c': { - 'type': 'string', - 'description': 'Exports CommonJS style, path to Handlebars module', - 'alias': 'commonjs', - 'default': null - }, - 'h': { - 'type': 'string', - 'description': 'Path to handlebar.js (only valid for amd-style)', - 'alias': 'handlebarPath', - 'default': '' - }, - 'k': { - 'type': 'string', - 'description': 'Known helpers', - 'alias': 'known' - }, - 'o': { - 'type': 'boolean', - 'description': 'Known helpers only', - 'alias': 'knownOnly' - }, - 'm': { - 'type': 'boolean', - 'description': 'Minimize output', - 'alias': 'min' - }, - 'n': { - 'type': 'string', - 'description': 'Template namespace', - 'alias': 'namespace', - 'default': 'Handlebars.templates' - }, - 's': { - 'type': 'boolean', - 'description': 'Output template function only.', - 'alias': 'simple' - }, - 'r': { - 'type': 'string', - 'description': 'Template root. Base value that will be stripped from template names.', - 'alias': 'root' - }, - 'p' : { - 'type': 'boolean', - 'description': 'Compiling a partial template', - 'alias': 'partial' - }, - 'd' : { - 'type': 'boolean', - 'description': 'Include data when compiling', - 'alias': 'data' - }, - 'e': { - 'type': 'string', - 'description': 'Template extension.', - 'alias': 'extension', - 'default': 'handlebars' - }, - 'b': { - 'type': 'boolean', - 'description': 'Removes the BOM (Byte Order Mark) from the beginning of the templates.', - 'alias': 'bom' - }, - 'v': { - 'type': 'boolean', - 'description': 'Prints the current compiler version', - 'alias': 'version' - }, - - 'help': { - 'type': 'boolean', - 'description': 'Outputs this message' - } - }) - - .check(function(argv) { - if (argv.version) { - return; - } - }); - - -var argv = optimist.argv; -argv.templates = argv._; -delete argv._; - -if (argv.help || (!argv.templates.length && !argv.version)) { - optimist.showHelp(); - return; -} - -return require('../dist/cjs/precompiler').cli(argv); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.js deleted file mode 100644 index 3e2b5f9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.js +++ /dev/null @@ -1,48 +0,0 @@ -define(['exports', 'module', './handlebars.runtime', './handlebars/compiler/ast', './handlebars/compiler/base', './handlebars/compiler/compiler', './handlebars/compiler/javascript-compiler', './handlebars/compiler/visitor', './handlebars/no-conflict'], function (exports, module, _handlebarsRuntime, _handlebarsCompilerAst, _handlebarsCompilerBase, _handlebarsCompilerCompiler, _handlebarsCompilerJavascriptCompiler, _handlebarsCompilerVisitor, _handlebarsNoConflict) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _runtime = _interopRequire(_handlebarsRuntime); - - // Compiler imports - - var _AST = _interopRequire(_handlebarsCompilerAst); - - var _JavaScriptCompiler = _interopRequire(_handlebarsCompilerJavascriptCompiler); - - var _Visitor = _interopRequire(_handlebarsCompilerVisitor); - - var _noConflict = _interopRequire(_handlebarsNoConflict); - - var _create = _runtime.create; - function create() { - var hb = _create(); - - hb.compile = function (input, options) { - return _handlebarsCompilerCompiler.compile(input, options, hb); - }; - hb.precompile = function (input, options) { - return _handlebarsCompilerCompiler.precompile(input, options, hb); - }; - - hb.AST = _AST; - hb.Compiler = _handlebarsCompilerCompiler.Compiler; - hb.JavaScriptCompiler = _JavaScriptCompiler; - hb.Parser = _handlebarsCompilerBase.parser; - hb.parse = _handlebarsCompilerBase.parse; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict(inst); - - inst.Visitor = _Visitor; - - inst['default'] = inst; - - module.exports = inst; -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.runtime.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.runtime.js deleted file mode 100644 index 73218be..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars.runtime.js +++ /dev/null @@ -1,41 +0,0 @@ -define(['exports', 'module', './handlebars/base', './handlebars/safe-string', './handlebars/exception', './handlebars/utils', './handlebars/runtime', './handlebars/no-conflict'], function (exports, module, _handlebarsBase, _handlebarsSafeString, _handlebarsException, _handlebarsUtils, _handlebarsRuntime, _handlebarsNoConflict) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - // Each of these augment the Handlebars object. No need to setup here. - // (This is done to easily share code between commonjs and browse envs) - - var _SafeString = _interopRequire(_handlebarsSafeString); - - var _Exception = _interopRequire(_handlebarsException); - - var _noConflict = _interopRequire(_handlebarsNoConflict); - - // For compatibility and usage outside of module systems, make the Handlebars object a namespace - function create() { - var hb = new _handlebarsBase.HandlebarsEnvironment(); - - _handlebarsUtils.extend(hb, _handlebarsBase); - hb.SafeString = _SafeString; - hb.Exception = _Exception; - hb.Utils = _handlebarsUtils; - hb.escapeExpression = _handlebarsUtils.escapeExpression; - - hb.VM = _handlebarsRuntime; - hb.template = function (spec) { - return _handlebarsRuntime.template(spec, hb); - }; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict(inst); - - inst['default'] = inst; - - module.exports = inst; -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/base.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/base.js deleted file mode 100644 index 4b7e4b3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/base.js +++ /dev/null @@ -1,268 +0,0 @@ -define(['exports', './utils', './exception'], function (exports, _utils, _exception) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.HandlebarsEnvironment = HandlebarsEnvironment; - exports.createFrame = createFrame; - - var _Exception = _interopRequire(_exception); - - var VERSION = '3.0.1'; - exports.VERSION = VERSION; - var COMPILER_REVISION = 6; - - exports.COMPILER_REVISION = COMPILER_REVISION; - var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' - }; - - exports.REVISION_CHANGES = REVISION_CHANGES; - var isArray = _utils.isArray, - isFunction = _utils.isFunction, - toString = _utils.toString, - objectType = '[object Object]'; - - function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); - } - - HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function registerHelper(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { - throw new _Exception('Arg not supported with multiple helpers'); - } - _utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (toString.call(name) === objectType) { - _utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _Exception('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - } - }; - - function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function () { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _Exception('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _Exception('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (var j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function (conditional, options) { - if (isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - - instance.registerHelper('with', function (context, options) { - if (isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!_utils.isEmpty(context)) { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = { data: data }; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function (message, options) { - var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); - } - - var logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function log(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - var method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } - }; - - exports.logger = logger; - var log = logger.log; - - exports.log = log; - - function createFrame(object) { - var frame = _utils.extend({}, object); - frame._parent = object; - return frame; - } -}); -/* [args, ]options */ \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/ast.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/ast.js deleted file mode 100644 index c025389..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/ast.js +++ /dev/null @@ -1,152 +0,0 @@ -define(['exports', 'module'], function (exports, module) { - 'use strict'; - - var AST = { - Program: function Program(statements, blockParams, strip, locInfo) { - this.loc = locInfo; - this.type = 'Program'; - this.body = statements; - - this.blockParams = blockParams; - this.strip = strip; - }, - - MustacheStatement: function MustacheStatement(path, params, hash, escaped, strip, locInfo) { - this.loc = locInfo; - this.type = 'MustacheStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.escaped = escaped; - - this.strip = strip; - }, - - BlockStatement: function BlockStatement(path, params, hash, program, inverse, openStrip, inverseStrip, closeStrip, locInfo) { - this.loc = locInfo; - this.type = 'BlockStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.program = program; - this.inverse = inverse; - - this.openStrip = openStrip; - this.inverseStrip = inverseStrip; - this.closeStrip = closeStrip; - }, - - PartialStatement: function PartialStatement(name, params, hash, strip, locInfo) { - this.loc = locInfo; - this.type = 'PartialStatement'; - - this.name = name; - this.params = params || []; - this.hash = hash; - - this.indent = ''; - this.strip = strip; - }, - - ContentStatement: function ContentStatement(string, locInfo) { - this.loc = locInfo; - this.type = 'ContentStatement'; - this.original = this.value = string; - }, - - CommentStatement: function CommentStatement(comment, strip, locInfo) { - this.loc = locInfo; - this.type = 'CommentStatement'; - this.value = comment; - - this.strip = strip; - }, - - SubExpression: function SubExpression(path, params, hash, locInfo) { - this.loc = locInfo; - - this.type = 'SubExpression'; - this.path = path; - this.params = params || []; - this.hash = hash; - }, - - PathExpression: function PathExpression(data, depth, parts, original, locInfo) { - this.loc = locInfo; - this.type = 'PathExpression'; - - this.data = data; - this.original = original; - this.parts = parts; - this.depth = depth; - }, - - StringLiteral: function StringLiteral(string, locInfo) { - this.loc = locInfo; - this.type = 'StringLiteral'; - this.original = this.value = string; - }, - - NumberLiteral: function NumberLiteral(number, locInfo) { - this.loc = locInfo; - this.type = 'NumberLiteral'; - this.original = this.value = Number(number); - }, - - BooleanLiteral: function BooleanLiteral(bool, locInfo) { - this.loc = locInfo; - this.type = 'BooleanLiteral'; - this.original = this.value = bool === 'true'; - }, - - UndefinedLiteral: function UndefinedLiteral(locInfo) { - this.loc = locInfo; - this.type = 'UndefinedLiteral'; - this.original = this.value = undefined; - }, - - NullLiteral: function NullLiteral(locInfo) { - this.loc = locInfo; - this.type = 'NullLiteral'; - this.original = this.value = null; - }, - - Hash: function Hash(pairs, locInfo) { - this.loc = locInfo; - this.type = 'Hash'; - this.pairs = pairs; - }, - HashPair: function HashPair(key, value, locInfo) { - this.loc = locInfo; - this.type = 'HashPair'; - this.key = key; - this.value = value; - }, - - // Public API used to evaluate derived attributes regarding AST nodes - helpers: { - // a mustache is definitely a helper if: - // * it is an eligible helper, and - // * it has at least one parameter or hash segment - helperExpression: function helperExpression(node) { - return !!(node.type === 'SubExpression' || node.params.length || node.hash); - }, - - scopedId: function scopedId(path) { - return /^\.|this\b/.test(path.original); - }, - - // an ID is simple if it only has one part, and that part is not - // `..` or `this`. - simpleId: function simpleId(path) { - return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; - } - } - }; - - // Must be exported as an object rather than the root of the module as the jison lexer - // must modify the object to operate properly. - module.exports = AST; -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/base.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/base.js deleted file mode 100644 index 35473b1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/base.js +++ /dev/null @@ -1,36 +0,0 @@ -define(['exports', './parser', './ast', './whitespace-control', './helpers', '../utils'], function (exports, _parser, _ast, _whitespaceControl, _helpers, _utils) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.parse = parse; - - var _parser2 = _interopRequire(_parser); - - var _AST = _interopRequire(_ast); - - var _WhitespaceControl = _interopRequire(_whitespaceControl); - - exports.parser = _parser2; - - var yy = {}; - _utils.extend(yy, _helpers, _AST); - - function parse(input, options) { - // Just return if an already-compiled AST was passed in. - if (input.type === 'Program') { - return input; - } - - _parser2.yy = yy; - - // Altering the shared object here, but this is ok as parser is a sync operation - yy.locInfo = function (locInfo) { - return new yy.SourceLocation(options && options.srcName, locInfo); - }; - - var strip = new _WhitespaceControl(); - return strip.accept(_parser2.parse(input)); - } -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/code-gen.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/code-gen.js deleted file mode 100644 index 4baf088..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/code-gen.js +++ /dev/null @@ -1,161 +0,0 @@ -define(['exports', 'module', '../utils'], function (exports, module, _utils) { - 'use strict'; - - var SourceNode = undefined; - - try { - /* istanbul ignore next */ - if (typeof define !== 'function' || !define.amd) { - // We don't support this in AMD environments. For these environments, we asusme that - // they are running on the browser and thus have no need for the source-map library. - var SourceMap = require('source-map'); - SourceNode = SourceMap.SourceNode; - } - } catch (err) {} - - /* istanbul ignore if: tested but not covered in istanbul due to dist build */ - if (!SourceNode) { - SourceNode = function (line, column, srcFile, chunks) { - this.src = ''; - if (chunks) { - this.add(chunks); - } - }; - /* istanbul ignore next */ - SourceNode.prototype = { - add: function add(chunks) { - if (_utils.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src += chunks; - }, - prepend: function prepend(chunks) { - if (_utils.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src = chunks + this.src; - }, - toStringWithSourceMap: function toStringWithSourceMap() { - return { code: this.toString() }; - }, - toString: function toString() { - return this.src; - } - }; - } - - function castChunk(chunk, codeGen, loc) { - if (_utils.isArray(chunk)) { - var ret = []; - - for (var i = 0, len = chunk.length; i < len; i++) { - ret.push(codeGen.wrap(chunk[i], loc)); - } - return ret; - } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { - // Handle primitives that the SourceNode will throw up on - return chunk + ''; - } - return chunk; - } - - function CodeGen(srcFile) { - this.srcFile = srcFile; - this.source = []; - } - - CodeGen.prototype = { - prepend: function prepend(source, loc) { - this.source.unshift(this.wrap(source, loc)); - }, - push: function push(source, loc) { - this.source.push(this.wrap(source, loc)); - }, - - merge: function merge() { - var source = this.empty(); - this.each(function (line) { - source.add([' ', line, '\n']); - }); - return source; - }, - - each: function each(iter) { - for (var i = 0, len = this.source.length; i < len; i++) { - iter(this.source[i]); - } - }, - - empty: function empty() { - var loc = arguments[0] === undefined ? this.currentLocation || { start: {} } : arguments[0]; - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile); - }, - wrap: function wrap(chunk) { - var loc = arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1]; - - if (chunk instanceof SourceNode) { - return chunk; - } - - chunk = castChunk(chunk, this, loc); - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); - }, - - functionCall: function functionCall(fn, type, params) { - params = this.generateList(params); - return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); - }, - - quotedString: function quotedString(str) { - return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 - .replace(/\u2029/g, '\\u2029') + '"'; - }, - - objectLiteral: function objectLiteral(obj) { - var pairs = []; - - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - var value = castChunk(obj[key], this); - if (value !== 'undefined') { - pairs.push([this.quotedString(key), ':', value]); - } - } - } - - var ret = this.generateList(pairs); - ret.prepend('{'); - ret.add('}'); - return ret; - }, - - generateList: function generateList(entries, loc) { - var ret = this.empty(loc); - - for (var i = 0, len = entries.length; i < len; i++) { - if (i) { - ret.add(','); - } - - ret.add(castChunk(entries[i], this, loc)); - } - - return ret; - }, - - generateArray: function generateArray(entries, loc) { - var ret = this.generateList(entries, loc); - ret.prepend('['); - ret.add(']'); - - return ret; - } - }; - - module.exports = CodeGen; -}); -/*global define */ - -/* NOP */ \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/compiler.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/compiler.js deleted file mode 100644 index 152e528..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/compiler.js +++ /dev/null @@ -1,523 +0,0 @@ -define(['exports', '../exception', '../utils', './ast'], function (exports, _exception, _utils, _ast) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.Compiler = Compiler; - exports.precompile = precompile; - exports.compile = compile; - - var _Exception = _interopRequire(_exception); - - var _AST = _interopRequire(_ast); - - var slice = [].slice; - - function Compiler() {} - - // the foundHelper register will disambiguate helper lookup from finding a - // function in a context. This is necessary for mustache compatibility, which - // requires that context functions in blocks are evaluated by blockHelperMissing, - // and then proceed as if the resulting value was provided to blockHelperMissing. - - Compiler.prototype = { - compiler: Compiler, - - equals: function equals(other) { - var len = this.opcodes.length; - if (other.opcodes.length !== len) { - return false; - } - - for (var i = 0; i < len; i++) { - var opcode = this.opcodes[i], - otherOpcode = other.opcodes[i]; - if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { - return false; - } - } - - // We know that length is the same between the two arrays because they are directly tied - // to the opcode behavior above. - len = this.children.length; - for (var i = 0; i < len; i++) { - if (!this.children[i].equals(other.children[i])) { - return false; - } - } - - return true; - }, - - guid: 0, - - compile: function compile(program, options) { - this.sourceNode = []; - this.opcodes = []; - this.children = []; - this.options = options; - this.stringParams = options.stringParams; - this.trackIds = options.trackIds; - - options.blockParams = options.blockParams || []; - - // These changes will propagate to the other compiler components - var knownHelpers = options.knownHelpers; - options.knownHelpers = { - helperMissing: true, - blockHelperMissing: true, - each: true, - 'if': true, - unless: true, - 'with': true, - log: true, - lookup: true - }; - if (knownHelpers) { - for (var _name in knownHelpers) { - if (_name in knownHelpers) { - options.knownHelpers[_name] = knownHelpers[_name]; - } - } - } - - return this.accept(program); - }, - - compileProgram: function compileProgram(program) { - var childCompiler = new this.compiler(), - // eslint-disable-line new-cap - result = childCompiler.compile(program, this.options), - guid = this.guid++; - - this.usePartial = this.usePartial || result.usePartial; - - this.children[guid] = result; - this.useDepths = this.useDepths || result.useDepths; - - return guid; - }, - - accept: function accept(node) { - this.sourceNode.unshift(node); - var ret = this[node.type](node); - this.sourceNode.shift(); - return ret; - }, - - Program: function Program(program) { - this.options.blockParams.unshift(program.blockParams); - - var body = program.body, - bodyLength = body.length; - for (var i = 0; i < bodyLength; i++) { - this.accept(body[i]); - } - - this.options.blockParams.shift(); - - this.isSimple = bodyLength === 1; - this.blockParams = program.blockParams ? program.blockParams.length : 0; - - return this; - }, - - BlockStatement: function BlockStatement(block) { - transformLiteralToPath(block); - - var program = block.program, - inverse = block.inverse; - - program = program && this.compileProgram(program); - inverse = inverse && this.compileProgram(inverse); - - var type = this.classifySexpr(block); - - if (type === 'helper') { - this.helperSexpr(block, program, inverse); - } else if (type === 'simple') { - this.simpleSexpr(block); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('blockValue', block.path.original); - } else { - this.ambiguousSexpr(block, program, inverse); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('ambiguousBlockValue'); - } - - this.opcode('append'); - }, - - PartialStatement: function PartialStatement(partial) { - this.usePartial = true; - - var params = partial.params; - if (params.length > 1) { - throw new _Exception('Unsupported number of partial arguments: ' + params.length, partial); - } else if (!params.length) { - params.push({ type: 'PathExpression', parts: [], depth: 0 }); - } - - var partialName = partial.name.original, - isDynamic = partial.name.type === 'SubExpression'; - if (isDynamic) { - this.accept(partial.name); - } - - this.setupFullMustacheParams(partial, undefined, undefined, true); - - var indent = partial.indent || ''; - if (this.options.preventIndent && indent) { - this.opcode('appendContent', indent); - indent = ''; - } - - this.opcode('invokePartial', isDynamic, partialName, indent); - this.opcode('append'); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.SubExpression(mustache); // eslint-disable-line new-cap - - if (mustache.escaped && !this.options.noEscape) { - this.opcode('appendEscaped'); - } else { - this.opcode('append'); - } - }, - - ContentStatement: function ContentStatement(content) { - if (content.value) { - this.opcode('appendContent', content.value); - } - }, - - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - transformLiteralToPath(sexpr); - var type = this.classifySexpr(sexpr); - - if (type === 'simple') { - this.simpleSexpr(sexpr); - } else if (type === 'helper') { - this.helperSexpr(sexpr); - } else { - this.ambiguousSexpr(sexpr); - } - }, - ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) { - var path = sexpr.path, - name = path.parts[0], - isBlock = program != null || inverse != null; - - this.opcode('getContext', path.depth); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - this.accept(path); - - this.opcode('invokeAmbiguous', name, isBlock); - }, - - simpleSexpr: function simpleSexpr(sexpr) { - this.accept(sexpr.path); - this.opcode('resolvePossibleLambda'); - }, - - helperSexpr: function helperSexpr(sexpr, program, inverse) { - var params = this.setupFullMustacheParams(sexpr, program, inverse), - path = sexpr.path, - name = path.parts[0]; - - if (this.options.knownHelpers[name]) { - this.opcode('invokeKnownHelper', params.length, name); - } else if (this.options.knownHelpersOnly) { - throw new _Exception('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); - } else { - path.falsy = true; - - this.accept(path); - this.opcode('invokeHelper', params.length, path.original, _AST.helpers.simpleId(path)); - } - }, - - PathExpression: function PathExpression(path) { - this.addDepth(path.depth); - this.opcode('getContext', path.depth); - - var name = path.parts[0], - scoped = _AST.helpers.scopedId(path), - blockParamId = !path.depth && !scoped && this.blockParamIndex(name); - - if (blockParamId) { - this.opcode('lookupBlockParam', blockParamId, path.parts); - } else if (!name) { - // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` - this.opcode('pushContext'); - } else if (path.data) { - this.options.data = true; - this.opcode('lookupData', path.depth, path.parts); - } else { - this.opcode('lookupOnContext', path.parts, path.falsy, scoped); - } - }, - - StringLiteral: function StringLiteral(string) { - this.opcode('pushString', string.value); - }, - - NumberLiteral: function NumberLiteral(number) { - this.opcode('pushLiteral', number.value); - }, - - BooleanLiteral: function BooleanLiteral(bool) { - this.opcode('pushLiteral', bool.value); - }, - - UndefinedLiteral: function UndefinedLiteral() { - this.opcode('pushLiteral', 'undefined'); - }, - - NullLiteral: function NullLiteral() { - this.opcode('pushLiteral', 'null'); - }, - - Hash: function Hash(hash) { - var pairs = hash.pairs, - i = 0, - l = pairs.length; - - this.opcode('pushHash'); - - for (; i < l; i++) { - this.pushParam(pairs[i].value); - } - while (i--) { - this.opcode('assignToHash', pairs[i].key); - } - this.opcode('popHash'); - }, - - // HELPERS - opcode: function opcode(name) { - this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); - }, - - addDepth: function addDepth(depth) { - if (!depth) { - return; - } - - this.useDepths = true; - }, - - classifySexpr: function classifySexpr(sexpr) { - var isSimple = _AST.helpers.simpleId(sexpr.path); - - var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); - - // a mustache is an eligible helper if: - // * its id is simple (a single part, not `this` or `..`) - var isHelper = !isBlockParam && _AST.helpers.helperExpression(sexpr); - - // if a mustache is an eligible helper but not a definite - // helper, it is ambiguous, and will be resolved in a later - // pass or at runtime. - var isEligible = !isBlockParam && (isHelper || isSimple); - - // if ambiguous, we can possibly resolve the ambiguity now - // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. - if (isEligible && !isHelper) { - var _name2 = sexpr.path.parts[0], - options = this.options; - - if (options.knownHelpers[_name2]) { - isHelper = true; - } else if (options.knownHelpersOnly) { - isEligible = false; - } - } - - if (isHelper) { - return 'helper'; - } else if (isEligible) { - return 'ambiguous'; - } else { - return 'simple'; - } - }, - - pushParams: function pushParams(params) { - for (var i = 0, l = params.length; i < l; i++) { - this.pushParam(params[i]); - } - }, - - pushParam: function pushParam(val) { - var value = val.value != null ? val.value : val.original || ''; - - if (this.stringParams) { - if (value.replace) { - value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.'); - } - - if (val.depth) { - this.addDepth(val.depth); - } - this.opcode('getContext', val.depth || 0); - this.opcode('pushStringParam', value, val.type); - - if (val.type === 'SubExpression') { - // SubExpressions get evaluated and passed in - // in string params mode. - this.accept(val); - } - } else { - if (this.trackIds) { - var blockParamIndex = undefined; - if (val.parts && !_AST.helpers.scopedId(val) && !val.depth) { - blockParamIndex = this.blockParamIndex(val.parts[0]); - } - if (blockParamIndex) { - var blockParamChild = val.parts.slice(1).join('.'); - this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); - } else { - value = val.original || value; - if (value.replace) { - value = value.replace(/^\.\//g, '').replace(/^\.$/g, ''); - } - - this.opcode('pushId', val.type, value); - } - } - this.accept(val); - } - }, - - setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) { - var params = sexpr.params; - this.pushParams(params); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - if (sexpr.hash) { - this.accept(sexpr.hash); - } else { - this.opcode('emptyHash', omitEmpty); - } - - return params; - }, - - blockParamIndex: function blockParamIndex(name) { - for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) { - var blockParams = this.options.blockParams[depth], - param = blockParams && _utils.indexOf(blockParams, name); - if (blockParams && param >= 0) { - return [depth, param]; - } - } - } - }; - - function precompile(input, options, env) { - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); - } - - options = options || {}; - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options); - return new env.JavaScriptCompiler().compile(environment, options); - } - - function compile(input, _x, env) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); - } - - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var compiled = undefined; - - function compileInput() { - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options), - templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); - return env.template(templateSpec); - } - - // Template is only compiled on first use and cached after that point. - function ret(context, execOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled.call(this, context, execOptions); - } - ret._setup = function (setupOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._setup(setupOptions); - }; - ret._child = function (i, data, blockParams, depths) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._child(i, data, blockParams, depths); - }; - return ret; - } - - function argEquals(a, b) { - if (a === b) { - return true; - } - - if (_utils.isArray(a) && _utils.isArray(b) && a.length === b.length) { - for (var i = 0; i < a.length; i++) { - if (!argEquals(a[i], b[i])) { - return false; - } - } - return true; - } - } - - function transformLiteralToPath(sexpr) { - if (!sexpr.path.parts) { - var literal = sexpr.path; - // Casting to string here to make false and 0 literal values play nicely with the rest - // of the system. - sexpr.path = new _AST.PathExpression(false, 0, [literal.original + ''], literal.original + '', literal.loc); - } - } -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/helpers.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/helpers.js deleted file mode 100644 index 97efc9e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/helpers.js +++ /dev/null @@ -1,131 +0,0 @@ -define(['exports', '../exception'], function (exports, _exception) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.SourceLocation = SourceLocation; - exports.id = id; - exports.stripFlags = stripFlags; - exports.stripComment = stripComment; - exports.preparePath = preparePath; - exports.prepareMustache = prepareMustache; - exports.prepareRawBlock = prepareRawBlock; - exports.prepareBlock = prepareBlock; - - var _Exception = _interopRequire(_exception); - - function SourceLocation(source, locInfo) { - this.source = source; - this.start = { - line: locInfo.first_line, - column: locInfo.first_column - }; - this.end = { - line: locInfo.last_line, - column: locInfo.last_column - }; - } - - function id(token) { - if (/^\[.*\]$/.test(token)) { - return token.substr(1, token.length - 2); - } else { - return token; - } - } - - function stripFlags(open, close) { - return { - open: open.charAt(2) === '~', - close: close.charAt(close.length - 3) === '~' - }; - } - - function stripComment(comment) { - return comment.replace(/^\{\{~?\!-?-?/, '').replace(/-?-?~?\}\}$/, ''); - } - - function preparePath(data, parts, locInfo) { - locInfo = this.locInfo(locInfo); - - var original = data ? '@' : '', - dig = [], - depth = 0, - depthString = ''; - - for (var i = 0, l = parts.length; i < l; i++) { - var part = parts[i].part, - - // If we have [] syntax then we do not treat path references as operators, - // i.e. foo.[this] resolves to approximately context.foo['this'] - isLiteral = parts[i].original !== part; - original += (parts[i].separator || '') + part; - - if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { - if (dig.length > 0) { - throw new _Exception('Invalid path: ' + original, { loc: locInfo }); - } else if (part === '..') { - depth++; - depthString += '../'; - } - } else { - dig.push(part); - } - } - - return new this.PathExpression(data, depth, dig, original, locInfo); - } - - function prepareMustache(path, params, hash, open, strip, locInfo) { - // Must use charAt to support IE pre-10 - var escapeFlag = open.charAt(3) || open.charAt(2), - escaped = escapeFlag !== '{' && escapeFlag !== '&'; - - return new this.MustacheStatement(path, params, hash, escaped, strip, this.locInfo(locInfo)); - } - - function prepareRawBlock(openRawBlock, content, close, locInfo) { - if (openRawBlock.path.original !== close) { - var errorNode = { loc: openRawBlock.path.loc }; - - throw new _Exception(openRawBlock.path.original + ' doesn\'t match ' + close, errorNode); - } - - locInfo = this.locInfo(locInfo); - var program = new this.Program([content], null, {}, locInfo); - - return new this.BlockStatement(openRawBlock.path, openRawBlock.params, openRawBlock.hash, program, undefined, {}, {}, {}, locInfo); - } - - function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { - // When we are chaining inverse calls, we will not have a close path - if (close && close.path && openBlock.path.original !== close.path.original) { - var errorNode = { loc: openBlock.path.loc }; - - throw new _Exception(openBlock.path.original + ' doesn\'t match ' + close.path.original, errorNode); - } - - program.blockParams = openBlock.blockParams; - - var inverse = undefined, - inverseStrip = undefined; - - if (inverseAndProgram) { - if (inverseAndProgram.chain) { - inverseAndProgram.program.body[0].closeStrip = close.strip; - } - - inverseStrip = inverseAndProgram.strip; - inverse = inverseAndProgram.program; - } - - if (inverted) { - inverted = inverse; - inverse = program; - program = inverted; - } - - return new this.BlockStatement(openBlock.path, openBlock.params, openBlock.hash, program, inverse, openBlock.strip, inverseStrip, close && close.strip, this.locInfo(locInfo)); - } -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/javascript-compiler.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/javascript-compiler.js deleted file mode 100644 index befdf50..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/javascript-compiler.js +++ /dev/null @@ -1,1053 +0,0 @@ -define(['exports', 'module', '../base', '../exception', '../utils', './code-gen'], function (exports, module, _base, _exception, _utils, _codeGen) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _Exception = _interopRequire(_exception); - - var _CodeGen = _interopRequire(_codeGen); - - function Literal(value) { - this.value = value; - } - - function JavaScriptCompiler() {} - - JavaScriptCompiler.prototype = { - // PUBLIC API: You can override these methods in a subclass to provide - // alternative compiled forms for name lookup and buffering semantics - nameLookup: function nameLookup(parent, name /* , type*/) { - if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { - return [parent, '.', name]; - } else { - return [parent, '[\'', name, '\']']; - } - }, - depthedLookup: function depthedLookup(name) { - return [this.aliasable('this.lookup'), '(depths, "', name, '")']; - }, - - compilerInfo: function compilerInfo() { - var revision = _base.COMPILER_REVISION, - versions = _base.REVISION_CHANGES[revision]; - return [revision, versions]; - }, - - appendToBuffer: function appendToBuffer(source, location, explicit) { - // Force a source as this simplifies the merge logic. - if (!_utils.isArray(source)) { - source = [source]; - } - source = this.source.wrap(source, location); - - if (this.environment.isSimple) { - return ['return ', source, ';']; - } else if (explicit) { - // This is a case where the buffer operation occurs as a child of another - // construct, generally braces. We have to explicitly output these buffer - // operations to ensure that the emitted code goes in the correct location. - return ['buffer += ', source, ';']; - } else { - source.appendToBuffer = true; - return source; - } - }, - - initializeBuffer: function initializeBuffer() { - return this.quotedString(''); - }, - // END PUBLIC API - - compile: function compile(environment, options, context, asObject) { - this.environment = environment; - this.options = options; - this.stringParams = this.options.stringParams; - this.trackIds = this.options.trackIds; - this.precompile = !asObject; - - this.name = this.environment.name; - this.isChild = !!context; - this.context = context || { - programs: [], - environments: [] - }; - - this.preamble(); - - this.stackSlot = 0; - this.stackVars = []; - this.aliases = {}; - this.registers = { list: [] }; - this.hashes = []; - this.compileStack = []; - this.inlineStack = []; - this.blockParams = []; - - this.compileChildren(environment, options); - - this.useDepths = this.useDepths || environment.useDepths || this.options.compat; - this.useBlockParams = this.useBlockParams || environment.useBlockParams; - - var opcodes = environment.opcodes, - opcode = undefined, - firstLoc = undefined, - i = undefined, - l = undefined; - - for (i = 0, l = opcodes.length; i < l; i++) { - opcode = opcodes[i]; - - this.source.currentLocation = opcode.loc; - firstLoc = firstLoc || opcode.loc; - this[opcode.opcode].apply(this, opcode.args); - } - - // Flush any trailing content that might be pending. - this.source.currentLocation = firstLoc; - this.pushSource(''); - - /* istanbul ignore next */ - if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { - throw new _Exception('Compile completed with content left on stack'); - } - - var fn = this.createFunctionContext(asObject); - if (!this.isChild) { - var ret = { - compiler: this.compilerInfo(), - main: fn - }; - var programs = this.context.programs; - for (i = 0, l = programs.length; i < l; i++) { - if (programs[i]) { - ret[i] = programs[i]; - } - } - - if (this.environment.usePartial) { - ret.usePartial = true; - } - if (this.options.data) { - ret.useData = true; - } - if (this.useDepths) { - ret.useDepths = true; - } - if (this.useBlockParams) { - ret.useBlockParams = true; - } - if (this.options.compat) { - ret.compat = true; - } - - if (!asObject) { - ret.compiler = JSON.stringify(ret.compiler); - - this.source.currentLocation = { start: { line: 1, column: 0 } }; - ret = this.objectLiteral(ret); - - if (options.srcName) { - ret = ret.toStringWithSourceMap({ file: options.destName }); - ret.map = ret.map && ret.map.toString(); - } else { - ret = ret.toString(); - } - } else { - ret.compilerOptions = this.options; - } - - return ret; - } else { - return fn; - } - }, - - preamble: function preamble() { - // track the last context pushed into place to allow skipping the - // getContext opcode when it would be a noop - this.lastContext = 0; - this.source = new _CodeGen(this.options.srcName); - }, - - createFunctionContext: function createFunctionContext(asObject) { - var varDeclarations = ''; - - var locals = this.stackVars.concat(this.registers.list); - if (locals.length > 0) { - varDeclarations += ', ' + locals.join(', '); - } - - // Generate minimizer alias mappings - // - // When using true SourceNodes, this will update all references to the given alias - // as the source nodes are reused in situ. For the non-source node compilation mode, - // aliases will not be used, but this case is already being run on the client and - // we aren't concern about minimizing the template size. - var aliasCount = 0; - for (var alias in this.aliases) { - // eslint-disable-line guard-for-in - var node = this.aliases[alias]; - - if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) { - varDeclarations += ', alias' + ++aliasCount + '=' + alias; - node.children[0] = 'alias' + aliasCount; - } - } - - var params = ['depth0', 'helpers', 'partials', 'data']; - - if (this.useBlockParams || this.useDepths) { - params.push('blockParams'); - } - if (this.useDepths) { - params.push('depths'); - } - - // Perform a second pass over the output to merge content when possible - var source = this.mergeSource(varDeclarations); - - if (asObject) { - params.push(source); - - return Function.apply(this, params); - } else { - return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); - } - }, - mergeSource: function mergeSource(varDeclarations) { - var isSimple = this.environment.isSimple, - appendOnly = !this.forceBuffer, - appendFirst = undefined, - sourceSeen = undefined, - bufferStart = undefined, - bufferEnd = undefined; - this.source.each(function (line) { - if (line.appendToBuffer) { - if (bufferStart) { - line.prepend(' + '); - } else { - bufferStart = line; - } - bufferEnd = line; - } else { - if (bufferStart) { - if (!sourceSeen) { - appendFirst = true; - } else { - bufferStart.prepend('buffer += '); - } - bufferEnd.add(';'); - bufferStart = bufferEnd = undefined; - } - - sourceSeen = true; - if (!isSimple) { - appendOnly = false; - } - } - }); - - if (appendOnly) { - if (bufferStart) { - bufferStart.prepend('return '); - bufferEnd.add(';'); - } else if (!sourceSeen) { - this.source.push('return "";'); - } - } else { - varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); - - if (bufferStart) { - bufferStart.prepend('return buffer + '); - bufferEnd.add(';'); - } else { - this.source.push('return buffer;'); - } - } - - if (varDeclarations) { - this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); - } - - return this.source.merge(); - }, - - // [blockValue] - // - // On stack, before: hash, inverse, program, value - // On stack, after: return value of blockHelperMissing - // - // The purpose of this opcode is to take a block of the form - // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and - // replace it on the stack with the result of properly - // invoking blockHelperMissing. - blockValue: function blockValue(name) { - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs(name, 0, params); - - var blockName = this.popStack(); - params.splice(1, 0, blockName); - - this.push(this.source.functionCall(blockHelperMissing, 'call', params)); - }, - - // [ambiguousBlockValue] - // - // On stack, before: hash, inverse, program, value - // Compiler value, before: lastHelper=value of last found helper, if any - // On stack, after, if no lastHelper: same as [blockValue] - // On stack, after, if lastHelper: value - ambiguousBlockValue: function ambiguousBlockValue() { - // We're being a bit cheeky and reusing the options value from the prior exec - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs('', 0, params, true); - - this.flushInline(); - - var current = this.topStack(); - params.splice(1, 0, current); - - this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']); - }, - - // [appendContent] - // - // On stack, before: ... - // On stack, after: ... - // - // Appends the string value of `content` to the current buffer - appendContent: function appendContent(content) { - if (this.pendingContent) { - content = this.pendingContent + content; - } else { - this.pendingLocation = this.source.currentLocation; - } - - this.pendingContent = content; - }, - - // [append] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Coerces `value` to a String and appends it to the current buffer. - // - // If `value` is truthy, or 0, it is coerced into a string and appended - // Otherwise, the empty string is appended - append: function append() { - if (this.isInline()) { - this.replaceStack(function (current) { - return [' != null ? ', current, ' : ""']; - }); - - this.pushSource(this.appendToBuffer(this.popStack())); - } else { - var local = this.popStack(); - this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); - if (this.environment.isSimple) { - this.pushSource(['else { ', this.appendToBuffer('\'\'', undefined, true), ' }']); - } - } - }, - - // [appendEscaped] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Escape `value` and append it to the buffer - appendEscaped: function appendEscaped() { - this.pushSource(this.appendToBuffer([this.aliasable('this.escapeExpression'), '(', this.popStack(), ')'])); - }, - - // [getContext] - // - // On stack, before: ... - // On stack, after: ... - // Compiler value, after: lastContext=depth - // - // Set the value of the `lastContext` compiler value to the depth - getContext: function getContext(depth) { - this.lastContext = depth; - }, - - // [pushContext] - // - // On stack, before: ... - // On stack, after: currentContext, ... - // - // Pushes the value of the current context onto the stack. - pushContext: function pushContext() { - this.pushStackLiteral(this.contextName(this.lastContext)); - }, - - // [lookupOnContext] - // - // On stack, before: ... - // On stack, after: currentContext[name], ... - // - // Looks up the value of `name` on the current context and pushes - // it onto the stack. - lookupOnContext: function lookupOnContext(parts, falsy, scoped) { - var i = 0; - - if (!scoped && this.options.compat && !this.lastContext) { - // The depthed query is expected to handle the undefined logic for the root level that - // is implemented below, so we evaluate that directly in compat mode - this.push(this.depthedLookup(parts[i++])); - } else { - this.pushContext(); - } - - this.resolvePath('context', parts, i, falsy); - }, - - // [lookupBlockParam] - // - // On stack, before: ... - // On stack, after: blockParam[name], ... - // - // Looks up the value of `parts` on the given block param and pushes - // it onto the stack. - lookupBlockParam: function lookupBlockParam(blockParamId, parts) { - this.useBlockParams = true; - - this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); - this.resolvePath('context', parts, 1); - }, - - // [lookupData] - // - // On stack, before: ... - // On stack, after: data, ... - // - // Push the data lookup operator - lookupData: function lookupData(depth, parts) { - if (!depth) { - this.pushStackLiteral('data'); - } else { - this.pushStackLiteral('this.data(data, ' + depth + ')'); - } - - this.resolvePath('data', parts, 0, true); - }, - - resolvePath: function resolvePath(type, parts, i, falsy) { - var _this = this; - - if (this.options.strict || this.options.assumeObjects) { - this.push(strictLookup(this.options.strict, this, parts, type)); - return; - } - - var len = parts.length; - for (; i < len; i++) { - /*eslint-disable no-loop-func */ - this.replaceStack(function (current) { - var lookup = _this.nameLookup(current, parts[i], type); - // We want to ensure that zero and false are handled properly if the context (falsy flag) - // needs to have the special handling for these values. - if (!falsy) { - return [' != null ? ', lookup, ' : ', current]; - } else { - // Otherwise we can use generic falsy handling - return [' && ', lookup]; - } - }); - /*eslint-enable no-loop-func */ - } - }, - - // [resolvePossibleLambda] - // - // On stack, before: value, ... - // On stack, after: resolved value, ... - // - // If the `value` is a lambda, replace it on the stack by - // the return value of the lambda - resolvePossibleLambda: function resolvePossibleLambda() { - this.push([this.aliasable('this.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); - }, - - // [pushStringParam] - // - // On stack, before: ... - // On stack, after: string, currentContext, ... - // - // This opcode is designed for use in string mode, which - // provides the string value of a parameter along with its - // depth rather than resolving it immediately. - pushStringParam: function pushStringParam(string, type) { - this.pushContext(); - this.pushString(type); - - // If it's a subexpression, the string result - // will be pushed after this opcode. - if (type !== 'SubExpression') { - if (typeof string === 'string') { - this.pushString(string); - } else { - this.pushStackLiteral(string); - } - } - }, - - emptyHash: function emptyHash(omitEmpty) { - if (this.trackIds) { - this.push('{}'); // hashIds - } - if (this.stringParams) { - this.push('{}'); // hashContexts - this.push('{}'); // hashTypes - } - this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); - }, - pushHash: function pushHash() { - if (this.hash) { - this.hashes.push(this.hash); - } - this.hash = { values: [], types: [], contexts: [], ids: [] }; - }, - popHash: function popHash() { - var hash = this.hash; - this.hash = this.hashes.pop(); - - if (this.trackIds) { - this.push(this.objectLiteral(hash.ids)); - } - if (this.stringParams) { - this.push(this.objectLiteral(hash.contexts)); - this.push(this.objectLiteral(hash.types)); - } - - this.push(this.objectLiteral(hash.values)); - }, - - // [pushString] - // - // On stack, before: ... - // On stack, after: quotedString(string), ... - // - // Push a quoted version of `string` onto the stack - pushString: function pushString(string) { - this.pushStackLiteral(this.quotedString(string)); - }, - - // [pushLiteral] - // - // On stack, before: ... - // On stack, after: value, ... - // - // Pushes a value onto the stack. This operation prevents - // the compiler from creating a temporary variable to hold - // it. - pushLiteral: function pushLiteral(value) { - this.pushStackLiteral(value); - }, - - // [pushProgram] - // - // On stack, before: ... - // On stack, after: program(guid), ... - // - // Push a program expression onto the stack. This takes - // a compile-time guid and converts it into a runtime-accessible - // expression. - pushProgram: function pushProgram(guid) { - if (guid != null) { - this.pushStackLiteral(this.programExpression(guid)); - } else { - this.pushStackLiteral(null); - } - }, - - // [invokeHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // Pops off the helper's parameters, invokes the helper, - // and pushes the helper's return value onto the stack. - // - // If the helper is not found, `helperMissing` is called. - invokeHelper: function invokeHelper(paramSize, name, isSimple) { - var nonHelper = this.popStack(), - helper = this.setupHelper(paramSize, name), - simple = isSimple ? [helper.name, ' || '] : ''; - - var lookup = ['('].concat(simple, nonHelper); - if (!this.options.strict) { - lookup.push(' || ', this.aliasable('helpers.helperMissing')); - } - lookup.push(')'); - - this.push(this.source.functionCall(lookup, 'call', helper.callParams)); - }, - - // [invokeKnownHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // This operation is used when the helper is known to exist, - // so a `helperMissing` fallback is not required. - invokeKnownHelper: function invokeKnownHelper(paramSize, name) { - var helper = this.setupHelper(paramSize, name); - this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); - }, - - // [invokeAmbiguous] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of disambiguation - // - // This operation is used when an expression like `{{foo}}` - // is provided, but we don't know at compile-time whether it - // is a helper or a path. - // - // This operation emits more code than the other options, - // and can be avoided by passing the `knownHelpers` and - // `knownHelpersOnly` flags at compile-time. - invokeAmbiguous: function invokeAmbiguous(name, helperCall) { - this.useRegister('helper'); - - var nonHelper = this.popStack(); - - this.emptyHash(); - var helper = this.setupHelper(0, name, helperCall); - - var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); - - var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; - if (!this.options.strict) { - lookup[0] = '(helper = '; - lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing')); - } - - this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']); - }, - - // [invokePartial] - // - // On stack, before: context, ... - // On stack after: result of partial invocation - // - // This operation pops off a context, invokes a partial with that context, - // and pushes the result of the invocation back. - invokePartial: function invokePartial(isDynamic, name, indent) { - var params = [], - options = this.setupParams(name, 1, params, false); - - if (isDynamic) { - name = this.popStack(); - delete options.name; - } - - if (indent) { - options.indent = JSON.stringify(indent); - } - options.helpers = 'helpers'; - options.partials = 'partials'; - - if (!isDynamic) { - params.unshift(this.nameLookup('partials', name, 'partial')); - } else { - params.unshift(name); - } - - if (this.options.compat) { - options.depths = 'depths'; - } - options = this.objectLiteral(options); - params.push(options); - - this.push(this.source.functionCall('this.invokePartial', '', params)); - }, - - // [assignToHash] - // - // On stack, before: value, ..., hash, ... - // On stack, after: ..., hash, ... - // - // Pops a value off the stack and assigns it to the current hash - assignToHash: function assignToHash(key) { - var value = this.popStack(), - context = undefined, - type = undefined, - id = undefined; - - if (this.trackIds) { - id = this.popStack(); - } - if (this.stringParams) { - type = this.popStack(); - context = this.popStack(); - } - - var hash = this.hash; - if (context) { - hash.contexts[key] = context; - } - if (type) { - hash.types[key] = type; - } - if (id) { - hash.ids[key] = id; - } - hash.values[key] = value; - }, - - pushId: function pushId(type, name, child) { - if (type === 'BlockParam') { - this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : '')); - } else if (type === 'PathExpression') { - this.pushString(name); - } else if (type === 'SubExpression') { - this.pushStackLiteral('true'); - } else { - this.pushStackLiteral('null'); - } - }, - - // HELPERS - - compiler: JavaScriptCompiler, - - compileChildren: function compileChildren(environment, options) { - var children = environment.children, - child = undefined, - compiler = undefined; - - for (var i = 0, l = children.length; i < l; i++) { - child = children[i]; - compiler = new this.compiler(); // eslint-disable-line new-cap - - var index = this.matchExistingProgram(child); - - if (index == null) { - this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children - index = this.context.programs.length; - child.index = index; - child.name = 'program' + index; - this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); - this.context.environments[index] = child; - - this.useDepths = this.useDepths || compiler.useDepths; - this.useBlockParams = this.useBlockParams || compiler.useBlockParams; - } else { - child.index = index; - child.name = 'program' + index; - - this.useDepths = this.useDepths || child.useDepths; - this.useBlockParams = this.useBlockParams || child.useBlockParams; - } - } - }, - matchExistingProgram: function matchExistingProgram(child) { - for (var i = 0, len = this.context.environments.length; i < len; i++) { - var environment = this.context.environments[i]; - if (environment && environment.equals(child)) { - return i; - } - } - }, - - programExpression: function programExpression(guid) { - var child = this.environment.children[guid], - programParams = [child.index, 'data', child.blockParams]; - - if (this.useBlockParams || this.useDepths) { - programParams.push('blockParams'); - } - if (this.useDepths) { - programParams.push('depths'); - } - - return 'this.program(' + programParams.join(', ') + ')'; - }, - - useRegister: function useRegister(name) { - if (!this.registers[name]) { - this.registers[name] = true; - this.registers.list.push(name); - } - }, - - push: function push(expr) { - if (!(expr instanceof Literal)) { - expr = this.source.wrap(expr); - } - - this.inlineStack.push(expr); - return expr; - }, - - pushStackLiteral: function pushStackLiteral(item) { - this.push(new Literal(item)); - }, - - pushSource: function pushSource(source) { - if (this.pendingContent) { - this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); - this.pendingContent = undefined; - } - - if (source) { - this.source.push(source); - } - }, - - replaceStack: function replaceStack(callback) { - var prefix = ['('], - stack = undefined, - createdStack = undefined, - usedLiteral = undefined; - - /* istanbul ignore next */ - if (!this.isInline()) { - throw new _Exception('replaceStack on non-inline'); - } - - // We want to merge the inline statement into the replacement statement via ',' - var top = this.popStack(true); - - if (top instanceof Literal) { - // Literals do not need to be inlined - stack = [top.value]; - prefix = ['(', stack]; - usedLiteral = true; - } else { - // Get or create the current stack name for use by the inline - createdStack = true; - var _name = this.incrStack(); - - prefix = ['((', this.push(_name), ' = ', top, ')']; - stack = this.topStack(); - } - - var item = callback.call(this, stack); - - if (!usedLiteral) { - this.popStack(); - } - if (createdStack) { - this.stackSlot--; - } - this.push(prefix.concat(item, ')')); - }, - - incrStack: function incrStack() { - this.stackSlot++; - if (this.stackSlot > this.stackVars.length) { - this.stackVars.push('stack' + this.stackSlot); - } - return this.topStackName(); - }, - topStackName: function topStackName() { - return 'stack' + this.stackSlot; - }, - flushInline: function flushInline() { - var inlineStack = this.inlineStack; - this.inlineStack = []; - for (var i = 0, len = inlineStack.length; i < len; i++) { - var entry = inlineStack[i]; - /* istanbul ignore if */ - if (entry instanceof Literal) { - this.compileStack.push(entry); - } else { - var stack = this.incrStack(); - this.pushSource([stack, ' = ', entry, ';']); - this.compileStack.push(stack); - } - } - }, - isInline: function isInline() { - return this.inlineStack.length; - }, - - popStack: function popStack(wrapped) { - var inline = this.isInline(), - item = (inline ? this.inlineStack : this.compileStack).pop(); - - if (!wrapped && item instanceof Literal) { - return item.value; - } else { - if (!inline) { - /* istanbul ignore next */ - if (!this.stackSlot) { - throw new _Exception('Invalid stack pop'); - } - this.stackSlot--; - } - return item; - } - }, - - topStack: function topStack() { - var stack = this.isInline() ? this.inlineStack : this.compileStack, - item = stack[stack.length - 1]; - - /* istanbul ignore if */ - if (item instanceof Literal) { - return item.value; - } else { - return item; - } - }, - - contextName: function contextName(context) { - if (this.useDepths && context) { - return 'depths[' + context + ']'; - } else { - return 'depth' + context; - } - }, - - quotedString: function quotedString(str) { - return this.source.quotedString(str); - }, - - objectLiteral: function objectLiteral(obj) { - return this.source.objectLiteral(obj); - }, - - aliasable: function aliasable(name) { - var ret = this.aliases[name]; - if (ret) { - ret.referenceCount++; - return ret; - } - - ret = this.aliases[name] = this.source.wrap(name); - ret.aliasable = true; - ret.referenceCount = 1; - - return ret; - }, - - setupHelper: function setupHelper(paramSize, name, blockHelper) { - var params = [], - paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); - var foundHelper = this.nameLookup('helpers', name, 'helper'); - - return { - params: params, - paramsInit: paramsInit, - name: foundHelper, - callParams: [this.contextName(0)].concat(params) - }; - }, - - setupParams: function setupParams(helper, paramSize, params) { - var options = {}, - contexts = [], - types = [], - ids = [], - param = undefined; - - options.name = this.quotedString(helper); - options.hash = this.popStack(); - - if (this.trackIds) { - options.hashIds = this.popStack(); - } - if (this.stringParams) { - options.hashTypes = this.popStack(); - options.hashContexts = this.popStack(); - } - - var inverse = this.popStack(), - program = this.popStack(); - - // Avoid setting fn and inverse if neither are set. This allows - // helpers to do a check for `if (options.fn)` - if (program || inverse) { - options.fn = program || 'this.noop'; - options.inverse = inverse || 'this.noop'; - } - - // The parameters go on to the stack in order (making sure that they are evaluated in order) - // so we need to pop them off the stack in reverse order - var i = paramSize; - while (i--) { - param = this.popStack(); - params[i] = param; - - if (this.trackIds) { - ids[i] = this.popStack(); - } - if (this.stringParams) { - types[i] = this.popStack(); - contexts[i] = this.popStack(); - } - } - - if (this.trackIds) { - options.ids = this.source.generateArray(ids); - } - if (this.stringParams) { - options.types = this.source.generateArray(types); - options.contexts = this.source.generateArray(contexts); - } - - if (this.options.data) { - options.data = 'data'; - } - if (this.useBlockParams) { - options.blockParams = 'blockParams'; - } - return options; - }, - - setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) { - var options = this.setupParams(helper, paramSize, params, true); - options = this.objectLiteral(options); - if (useRegister) { - this.useRegister('options'); - params.push('options'); - return ['options=', options]; - } else { - params.push(options); - return ''; - } - } - }; - - (function () { - var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' '); - - var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; - - for (var i = 0, l = reservedWords.length; i < l; i++) { - compilerWords[reservedWords[i]] = true; - } - })(); - - JavaScriptCompiler.isValidJavaScriptVariableName = function (name) { - return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name); - }; - - function strictLookup(requireTerminal, compiler, parts, type) { - var stack = compiler.popStack(), - i = 0, - len = parts.length; - if (requireTerminal) { - len--; - } - - for (; i < len; i++) { - stack = compiler.nameLookup(stack, parts[i], type); - } - - if (requireTerminal) { - return [compiler.aliasable('this.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')']; - } else { - return stack; - } - } - - module.exports = JavaScriptCompiler; -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/parser.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/parser.js deleted file mode 100644 index 889545d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/parser.js +++ /dev/null @@ -1,678 +0,0 @@ -define(["exports", "module"], function (exports, module) { - /* istanbul ignore next */ - /* Jison generated parser */ - "use strict"; - - var handlebars = (function () { - var parser = { trace: function trace() {}, - yy: {}, - symbols_: { error: 2, root: 3, program: 4, EOF: 5, program_repetition0: 6, statement: 7, mustache: 8, block: 9, rawBlock: 10, partial: 11, content: 12, COMMENT: 13, CONTENT: 14, openRawBlock: 15, END_RAW_BLOCK: 16, OPEN_RAW_BLOCK: 17, helperName: 18, openRawBlock_repetition0: 19, openRawBlock_option0: 20, CLOSE_RAW_BLOCK: 21, openBlock: 22, block_option0: 23, closeBlock: 24, openInverse: 25, block_option1: 26, OPEN_BLOCK: 27, openBlock_repetition0: 28, openBlock_option0: 29, openBlock_option1: 30, CLOSE: 31, OPEN_INVERSE: 32, openInverse_repetition0: 33, openInverse_option0: 34, openInverse_option1: 35, openInverseChain: 36, OPEN_INVERSE_CHAIN: 37, openInverseChain_repetition0: 38, openInverseChain_option0: 39, openInverseChain_option1: 40, inverseAndProgram: 41, INVERSE: 42, inverseChain: 43, inverseChain_option0: 44, OPEN_ENDBLOCK: 45, OPEN: 46, mustache_repetition0: 47, mustache_option0: 48, OPEN_UNESCAPED: 49, mustache_repetition1: 50, mustache_option1: 51, CLOSE_UNESCAPED: 52, OPEN_PARTIAL: 53, partialName: 54, partial_repetition0: 55, partial_option0: 56, param: 57, sexpr: 58, OPEN_SEXPR: 59, sexpr_repetition0: 60, sexpr_option0: 61, CLOSE_SEXPR: 62, hash: 63, hash_repetition_plus0: 64, hashSegment: 65, ID: 66, EQUALS: 67, blockParams: 68, OPEN_BLOCK_PARAMS: 69, blockParams_repetition_plus0: 70, CLOSE_BLOCK_PARAMS: 71, path: 72, dataName: 73, STRING: 74, NUMBER: 75, BOOLEAN: 76, UNDEFINED: 77, NULL: 78, DATA: 79, pathSegments: 80, SEP: 81, $accept: 0, $end: 1 }, - terminals_: { 2: "error", 5: "EOF", 13: "COMMENT", 14: "CONTENT", 16: "END_RAW_BLOCK", 17: "OPEN_RAW_BLOCK", 21: "CLOSE_RAW_BLOCK", 27: "OPEN_BLOCK", 31: "CLOSE", 32: "OPEN_INVERSE", 37: "OPEN_INVERSE_CHAIN", 42: "INVERSE", 45: "OPEN_ENDBLOCK", 46: "OPEN", 49: "OPEN_UNESCAPED", 52: "CLOSE_UNESCAPED", 53: "OPEN_PARTIAL", 59: "OPEN_SEXPR", 62: "CLOSE_SEXPR", 66: "ID", 67: "EQUALS", 69: "OPEN_BLOCK_PARAMS", 71: "CLOSE_BLOCK_PARAMS", 74: "STRING", 75: "NUMBER", 76: "BOOLEAN", 77: "UNDEFINED", 78: "NULL", 79: "DATA", 81: "SEP" }, - productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [12, 1], [10, 3], [15, 5], [9, 4], [9, 4], [22, 6], [25, 6], [36, 6], [41, 2], [43, 3], [43, 1], [24, 3], [8, 5], [8, 5], [11, 5], [57, 1], [57, 1], [58, 5], [63, 1], [65, 3], [68, 3], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [54, 1], [54, 1], [73, 2], [72, 1], [80, 3], [80, 1], [6, 0], [6, 2], [19, 0], [19, 2], [20, 0], [20, 1], [23, 0], [23, 1], [26, 0], [26, 1], [28, 0], [28, 2], [29, 0], [29, 1], [30, 0], [30, 1], [33, 0], [33, 2], [34, 0], [34, 1], [35, 0], [35, 1], [38, 0], [38, 2], [39, 0], [39, 1], [40, 0], [40, 1], [44, 0], [44, 1], [47, 0], [47, 2], [48, 0], [48, 1], [50, 0], [50, 2], [51, 0], [51, 1], [55, 0], [55, 2], [56, 0], [56, 1], [60, 0], [60, 2], [61, 0], [61, 1], [64, 1], [64, 2], [70, 1], [70, 2]], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { - - var $0 = $$.length - 1; - switch (yystate) { - case 1: - return $$[$0 - 1]; - break; - case 2: - this.$ = new yy.Program($$[$0], null, {}, yy.locInfo(this._$)); - break; - case 3: - this.$ = $$[$0]; - break; - case 4: - this.$ = $$[$0]; - break; - case 5: - this.$ = $$[$0]; - break; - case 6: - this.$ = $$[$0]; - break; - case 7: - this.$ = $$[$0]; - break; - case 8: - this.$ = new yy.CommentStatement(yy.stripComment($$[$0]), yy.stripFlags($$[$0], $$[$0]), yy.locInfo(this._$)); - break; - case 9: - this.$ = new yy.ContentStatement($$[$0], yy.locInfo(this._$)); - break; - case 10: - this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); - break; - case 11: - this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] }; - break; - case 12: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$); - break; - case 13: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$); - break; - case 14: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 15: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 16: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 17: - this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] }; - break; - case 18: - var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$), - program = new yy.Program([inverse], null, {}, yy.locInfo(this._$)); - program.chained = true; - - this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true }; - - break; - case 19: - this.$ = $$[$0]; - break; - case 20: - this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) }; - break; - case 21: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 22: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 23: - this.$ = new yy.PartialStatement($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.stripFlags($$[$0 - 4], $$[$0]), yy.locInfo(this._$)); - break; - case 24: - this.$ = $$[$0]; - break; - case 25: - this.$ = $$[$0]; - break; - case 26: - this.$ = new yy.SubExpression($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.locInfo(this._$)); - break; - case 27: - this.$ = new yy.Hash($$[$0], yy.locInfo(this._$)); - break; - case 28: - this.$ = new yy.HashPair(yy.id($$[$0 - 2]), $$[$0], yy.locInfo(this._$)); - break; - case 29: - this.$ = yy.id($$[$0 - 1]); - break; - case 30: - this.$ = $$[$0]; - break; - case 31: - this.$ = $$[$0]; - break; - case 32: - this.$ = new yy.StringLiteral($$[$0], yy.locInfo(this._$)); - break; - case 33: - this.$ = new yy.NumberLiteral($$[$0], yy.locInfo(this._$)); - break; - case 34: - this.$ = new yy.BooleanLiteral($$[$0], yy.locInfo(this._$)); - break; - case 35: - this.$ = new yy.UndefinedLiteral(yy.locInfo(this._$)); - break; - case 36: - this.$ = new yy.NullLiteral(yy.locInfo(this._$)); - break; - case 37: - this.$ = $$[$0]; - break; - case 38: - this.$ = $$[$0]; - break; - case 39: - this.$ = yy.preparePath(true, $$[$0], this._$); - break; - case 40: - this.$ = yy.preparePath(false, $$[$0], this._$); - break; - case 41: - $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2]; - break; - case 42: - this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }]; - break; - case 43: - this.$ = []; - break; - case 44: - $$[$0 - 1].push($$[$0]); - break; - case 45: - this.$ = []; - break; - case 46: - $$[$0 - 1].push($$[$0]); - break; - case 53: - this.$ = []; - break; - case 54: - $$[$0 - 1].push($$[$0]); - break; - case 59: - this.$ = []; - break; - case 60: - $$[$0 - 1].push($$[$0]); - break; - case 65: - this.$ = []; - break; - case 66: - $$[$0 - 1].push($$[$0]); - break; - case 73: - this.$ = []; - break; - case 74: - $$[$0 - 1].push($$[$0]); - break; - case 77: - this.$ = []; - break; - case 78: - $$[$0 - 1].push($$[$0]); - break; - case 81: - this.$ = []; - break; - case 82: - $$[$0 - 1].push($$[$0]); - break; - case 85: - this.$ = []; - break; - case 86: - $$[$0 - 1].push($$[$0]); - break; - case 89: - this.$ = [$$[$0]]; - break; - case 90: - $$[$0 - 1].push($$[$0]); - break; - case 91: - this.$ = [$$[$0]]; - break; - case 92: - $$[$0 - 1].push($$[$0]); - break; - } - }, - table: [{ 3: 1, 4: 2, 5: [2, 43], 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: [1, 11], 14: [1, 18], 15: 16, 17: [1, 21], 22: 14, 25: 15, 27: [1, 19], 32: [1, 20], 37: [2, 2], 42: [2, 2], 45: [2, 2], 46: [1, 12], 49: [1, 13], 53: [1, 17] }, { 1: [2, 1] }, { 5: [2, 44], 13: [2, 44], 14: [2, 44], 17: [2, 44], 27: [2, 44], 32: [2, 44], 37: [2, 44], 42: [2, 44], 45: [2, 44], 46: [2, 44], 49: [2, 44], 53: [2, 44] }, { 5: [2, 3], 13: [2, 3], 14: [2, 3], 17: [2, 3], 27: [2, 3], 32: [2, 3], 37: [2, 3], 42: [2, 3], 45: [2, 3], 46: [2, 3], 49: [2, 3], 53: [2, 3] }, { 5: [2, 4], 13: [2, 4], 14: [2, 4], 17: [2, 4], 27: [2, 4], 32: [2, 4], 37: [2, 4], 42: [2, 4], 45: [2, 4], 46: [2, 4], 49: [2, 4], 53: [2, 4] }, { 5: [2, 5], 13: [2, 5], 14: [2, 5], 17: [2, 5], 27: [2, 5], 32: [2, 5], 37: [2, 5], 42: [2, 5], 45: [2, 5], 46: [2, 5], 49: [2, 5], 53: [2, 5] }, { 5: [2, 6], 13: [2, 6], 14: [2, 6], 17: [2, 6], 27: [2, 6], 32: [2, 6], 37: [2, 6], 42: [2, 6], 45: [2, 6], 46: [2, 6], 49: [2, 6], 53: [2, 6] }, { 5: [2, 7], 13: [2, 7], 14: [2, 7], 17: [2, 7], 27: [2, 7], 32: [2, 7], 37: [2, 7], 42: [2, 7], 45: [2, 7], 46: [2, 7], 49: [2, 7], 53: [2, 7] }, { 5: [2, 8], 13: [2, 8], 14: [2, 8], 17: [2, 8], 27: [2, 8], 32: [2, 8], 37: [2, 8], 42: [2, 8], 45: [2, 8], 46: [2, 8], 49: [2, 8], 53: [2, 8] }, { 18: 22, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 33, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 34, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 4: 35, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 12: 36, 14: [1, 18] }, { 18: 38, 54: 37, 58: 39, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 9], 13: [2, 9], 14: [2, 9], 16: [2, 9], 17: [2, 9], 27: [2, 9], 32: [2, 9], 37: [2, 9], 42: [2, 9], 45: [2, 9], 46: [2, 9], 49: [2, 9], 53: [2, 9] }, { 18: 41, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 42, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 43, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [2, 73], 47: 44, 59: [2, 73], 66: [2, 73], 74: [2, 73], 75: [2, 73], 76: [2, 73], 77: [2, 73], 78: [2, 73], 79: [2, 73] }, { 21: [2, 30], 31: [2, 30], 52: [2, 30], 59: [2, 30], 62: [2, 30], 66: [2, 30], 69: [2, 30], 74: [2, 30], 75: [2, 30], 76: [2, 30], 77: [2, 30], 78: [2, 30], 79: [2, 30] }, { 21: [2, 31], 31: [2, 31], 52: [2, 31], 59: [2, 31], 62: [2, 31], 66: [2, 31], 69: [2, 31], 74: [2, 31], 75: [2, 31], 76: [2, 31], 77: [2, 31], 78: [2, 31], 79: [2, 31] }, { 21: [2, 32], 31: [2, 32], 52: [2, 32], 59: [2, 32], 62: [2, 32], 66: [2, 32], 69: [2, 32], 74: [2, 32], 75: [2, 32], 76: [2, 32], 77: [2, 32], 78: [2, 32], 79: [2, 32] }, { 21: [2, 33], 31: [2, 33], 52: [2, 33], 59: [2, 33], 62: [2, 33], 66: [2, 33], 69: [2, 33], 74: [2, 33], 75: [2, 33], 76: [2, 33], 77: [2, 33], 78: [2, 33], 79: [2, 33] }, { 21: [2, 34], 31: [2, 34], 52: [2, 34], 59: [2, 34], 62: [2, 34], 66: [2, 34], 69: [2, 34], 74: [2, 34], 75: [2, 34], 76: [2, 34], 77: [2, 34], 78: [2, 34], 79: [2, 34] }, { 21: [2, 35], 31: [2, 35], 52: [2, 35], 59: [2, 35], 62: [2, 35], 66: [2, 35], 69: [2, 35], 74: [2, 35], 75: [2, 35], 76: [2, 35], 77: [2, 35], 78: [2, 35], 79: [2, 35] }, { 21: [2, 36], 31: [2, 36], 52: [2, 36], 59: [2, 36], 62: [2, 36], 66: [2, 36], 69: [2, 36], 74: [2, 36], 75: [2, 36], 76: [2, 36], 77: [2, 36], 78: [2, 36], 79: [2, 36] }, { 21: [2, 40], 31: [2, 40], 52: [2, 40], 59: [2, 40], 62: [2, 40], 66: [2, 40], 69: [2, 40], 74: [2, 40], 75: [2, 40], 76: [2, 40], 77: [2, 40], 78: [2, 40], 79: [2, 40], 81: [1, 45] }, { 66: [1, 32], 80: 46 }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 50: 47, 52: [2, 77], 59: [2, 77], 66: [2, 77], 74: [2, 77], 75: [2, 77], 76: [2, 77], 77: [2, 77], 78: [2, 77], 79: [2, 77] }, { 23: 48, 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 49, 45: [2, 49] }, { 26: 54, 41: 55, 42: [1, 53], 45: [2, 51] }, { 16: [1, 56] }, { 31: [2, 81], 55: 57, 59: [2, 81], 66: [2, 81], 74: [2, 81], 75: [2, 81], 76: [2, 81], 77: [2, 81], 78: [2, 81], 79: [2, 81] }, { 31: [2, 37], 59: [2, 37], 66: [2, 37], 74: [2, 37], 75: [2, 37], 76: [2, 37], 77: [2, 37], 78: [2, 37], 79: [2, 37] }, { 31: [2, 38], 59: [2, 38], 66: [2, 38], 74: [2, 38], 75: [2, 38], 76: [2, 38], 77: [2, 38], 78: [2, 38], 79: [2, 38] }, { 18: 58, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 28: 59, 31: [2, 53], 59: [2, 53], 66: [2, 53], 69: [2, 53], 74: [2, 53], 75: [2, 53], 76: [2, 53], 77: [2, 53], 78: [2, 53], 79: [2, 53] }, { 31: [2, 59], 33: 60, 59: [2, 59], 66: [2, 59], 69: [2, 59], 74: [2, 59], 75: [2, 59], 76: [2, 59], 77: [2, 59], 78: [2, 59], 79: [2, 59] }, { 19: 61, 21: [2, 45], 59: [2, 45], 66: [2, 45], 74: [2, 45], 75: [2, 45], 76: [2, 45], 77: [2, 45], 78: [2, 45], 79: [2, 45] }, { 18: 65, 31: [2, 75], 48: 62, 57: 63, 58: 66, 59: [1, 40], 63: 64, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 66: [1, 70] }, { 21: [2, 39], 31: [2, 39], 52: [2, 39], 59: [2, 39], 62: [2, 39], 66: [2, 39], 69: [2, 39], 74: [2, 39], 75: [2, 39], 76: [2, 39], 77: [2, 39], 78: [2, 39], 79: [2, 39], 81: [1, 45] }, { 18: 65, 51: 71, 52: [2, 79], 57: 72, 58: 66, 59: [1, 40], 63: 73, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 24: 74, 45: [1, 75] }, { 45: [2, 50] }, { 4: 76, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 45: [2, 19] }, { 18: 77, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 78, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 24: 79, 45: [1, 75] }, { 45: [2, 52] }, { 5: [2, 10], 13: [2, 10], 14: [2, 10], 17: [2, 10], 27: [2, 10], 32: [2, 10], 37: [2, 10], 42: [2, 10], 45: [2, 10], 46: [2, 10], 49: [2, 10], 53: [2, 10] }, { 18: 65, 31: [2, 83], 56: 80, 57: 81, 58: 66, 59: [1, 40], 63: 82, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 59: [2, 85], 60: 83, 62: [2, 85], 66: [2, 85], 74: [2, 85], 75: [2, 85], 76: [2, 85], 77: [2, 85], 78: [2, 85], 79: [2, 85] }, { 18: 65, 29: 84, 31: [2, 55], 57: 85, 58: 66, 59: [1, 40], 63: 86, 64: 67, 65: 68, 66: [1, 69], 69: [2, 55], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 31: [2, 61], 34: 87, 57: 88, 58: 66, 59: [1, 40], 63: 89, 64: 67, 65: 68, 66: [1, 69], 69: [2, 61], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 20: 90, 21: [2, 47], 57: 91, 58: 66, 59: [1, 40], 63: 92, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [1, 93] }, { 31: [2, 74], 59: [2, 74], 66: [2, 74], 74: [2, 74], 75: [2, 74], 76: [2, 74], 77: [2, 74], 78: [2, 74], 79: [2, 74] }, { 31: [2, 76] }, { 21: [2, 24], 31: [2, 24], 52: [2, 24], 59: [2, 24], 62: [2, 24], 66: [2, 24], 69: [2, 24], 74: [2, 24], 75: [2, 24], 76: [2, 24], 77: [2, 24], 78: [2, 24], 79: [2, 24] }, { 21: [2, 25], 31: [2, 25], 52: [2, 25], 59: [2, 25], 62: [2, 25], 66: [2, 25], 69: [2, 25], 74: [2, 25], 75: [2, 25], 76: [2, 25], 77: [2, 25], 78: [2, 25], 79: [2, 25] }, { 21: [2, 27], 31: [2, 27], 52: [2, 27], 62: [2, 27], 65: 94, 66: [1, 95], 69: [2, 27] }, { 21: [2, 89], 31: [2, 89], 52: [2, 89], 62: [2, 89], 66: [2, 89], 69: [2, 89] }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 67: [1, 96], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 21: [2, 41], 31: [2, 41], 52: [2, 41], 59: [2, 41], 62: [2, 41], 66: [2, 41], 69: [2, 41], 74: [2, 41], 75: [2, 41], 76: [2, 41], 77: [2, 41], 78: [2, 41], 79: [2, 41], 81: [2, 41] }, { 52: [1, 97] }, { 52: [2, 78], 59: [2, 78], 66: [2, 78], 74: [2, 78], 75: [2, 78], 76: [2, 78], 77: [2, 78], 78: [2, 78], 79: [2, 78] }, { 52: [2, 80] }, { 5: [2, 12], 13: [2, 12], 14: [2, 12], 17: [2, 12], 27: [2, 12], 32: [2, 12], 37: [2, 12], 42: [2, 12], 45: [2, 12], 46: [2, 12], 49: [2, 12], 53: [2, 12] }, { 18: 98, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 100, 44: 99, 45: [2, 71] }, { 31: [2, 65], 38: 101, 59: [2, 65], 66: [2, 65], 69: [2, 65], 74: [2, 65], 75: [2, 65], 76: [2, 65], 77: [2, 65], 78: [2, 65], 79: [2, 65] }, { 45: [2, 17] }, { 5: [2, 13], 13: [2, 13], 14: [2, 13], 17: [2, 13], 27: [2, 13], 32: [2, 13], 37: [2, 13], 42: [2, 13], 45: [2, 13], 46: [2, 13], 49: [2, 13], 53: [2, 13] }, { 31: [1, 102] }, { 31: [2, 82], 59: [2, 82], 66: [2, 82], 74: [2, 82], 75: [2, 82], 76: [2, 82], 77: [2, 82], 78: [2, 82], 79: [2, 82] }, { 31: [2, 84] }, { 18: 65, 57: 104, 58: 66, 59: [1, 40], 61: 103, 62: [2, 87], 63: 105, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 30: 106, 31: [2, 57], 68: 107, 69: [1, 108] }, { 31: [2, 54], 59: [2, 54], 66: [2, 54], 69: [2, 54], 74: [2, 54], 75: [2, 54], 76: [2, 54], 77: [2, 54], 78: [2, 54], 79: [2, 54] }, { 31: [2, 56], 69: [2, 56] }, { 31: [2, 63], 35: 109, 68: 110, 69: [1, 108] }, { 31: [2, 60], 59: [2, 60], 66: [2, 60], 69: [2, 60], 74: [2, 60], 75: [2, 60], 76: [2, 60], 77: [2, 60], 78: [2, 60], 79: [2, 60] }, { 31: [2, 62], 69: [2, 62] }, { 21: [1, 111] }, { 21: [2, 46], 59: [2, 46], 66: [2, 46], 74: [2, 46], 75: [2, 46], 76: [2, 46], 77: [2, 46], 78: [2, 46], 79: [2, 46] }, { 21: [2, 48] }, { 5: [2, 21], 13: [2, 21], 14: [2, 21], 17: [2, 21], 27: [2, 21], 32: [2, 21], 37: [2, 21], 42: [2, 21], 45: [2, 21], 46: [2, 21], 49: [2, 21], 53: [2, 21] }, { 21: [2, 90], 31: [2, 90], 52: [2, 90], 62: [2, 90], 66: [2, 90], 69: [2, 90] }, { 67: [1, 96] }, { 18: 65, 57: 112, 58: 66, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 22], 13: [2, 22], 14: [2, 22], 17: [2, 22], 27: [2, 22], 32: [2, 22], 37: [2, 22], 42: [2, 22], 45: [2, 22], 46: [2, 22], 49: [2, 22], 53: [2, 22] }, { 31: [1, 113] }, { 45: [2, 18] }, { 45: [2, 72] }, { 18: 65, 31: [2, 67], 39: 114, 57: 115, 58: 66, 59: [1, 40], 63: 116, 64: 67, 65: 68, 66: [1, 69], 69: [2, 67], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 23], 13: [2, 23], 14: [2, 23], 17: [2, 23], 27: [2, 23], 32: [2, 23], 37: [2, 23], 42: [2, 23], 45: [2, 23], 46: [2, 23], 49: [2, 23], 53: [2, 23] }, { 62: [1, 117] }, { 59: [2, 86], 62: [2, 86], 66: [2, 86], 74: [2, 86], 75: [2, 86], 76: [2, 86], 77: [2, 86], 78: [2, 86], 79: [2, 86] }, { 62: [2, 88] }, { 31: [1, 118] }, { 31: [2, 58] }, { 66: [1, 120], 70: 119 }, { 31: [1, 121] }, { 31: [2, 64] }, { 14: [2, 11] }, { 21: [2, 28], 31: [2, 28], 52: [2, 28], 62: [2, 28], 66: [2, 28], 69: [2, 28] }, { 5: [2, 20], 13: [2, 20], 14: [2, 20], 17: [2, 20], 27: [2, 20], 32: [2, 20], 37: [2, 20], 42: [2, 20], 45: [2, 20], 46: [2, 20], 49: [2, 20], 53: [2, 20] }, { 31: [2, 69], 40: 122, 68: 123, 69: [1, 108] }, { 31: [2, 66], 59: [2, 66], 66: [2, 66], 69: [2, 66], 74: [2, 66], 75: [2, 66], 76: [2, 66], 77: [2, 66], 78: [2, 66], 79: [2, 66] }, { 31: [2, 68], 69: [2, 68] }, { 21: [2, 26], 31: [2, 26], 52: [2, 26], 59: [2, 26], 62: [2, 26], 66: [2, 26], 69: [2, 26], 74: [2, 26], 75: [2, 26], 76: [2, 26], 77: [2, 26], 78: [2, 26], 79: [2, 26] }, { 13: [2, 14], 14: [2, 14], 17: [2, 14], 27: [2, 14], 32: [2, 14], 37: [2, 14], 42: [2, 14], 45: [2, 14], 46: [2, 14], 49: [2, 14], 53: [2, 14] }, { 66: [1, 125], 71: [1, 124] }, { 66: [2, 91], 71: [2, 91] }, { 13: [2, 15], 14: [2, 15], 17: [2, 15], 27: [2, 15], 32: [2, 15], 42: [2, 15], 45: [2, 15], 46: [2, 15], 49: [2, 15], 53: [2, 15] }, { 31: [1, 126] }, { 31: [2, 70] }, { 31: [2, 29] }, { 66: [2, 92], 71: [2, 92] }, { 13: [2, 16], 14: [2, 16], 17: [2, 16], 27: [2, 16], 32: [2, 16], 37: [2, 16], 42: [2, 16], 45: [2, 16], 46: [2, 16], 49: [2, 16], 53: [2, 16] }], - defaultActions: { 4: [2, 1], 49: [2, 50], 51: [2, 19], 55: [2, 52], 64: [2, 76], 73: [2, 80], 78: [2, 17], 82: [2, 84], 92: [2, 48], 99: [2, 18], 100: [2, 72], 105: [2, 88], 107: [2, 58], 110: [2, 64], 111: [2, 11], 123: [2, 70], 124: [2, 29] }, - parseError: function parseError(str, hash) { - throw new Error(str); - }, - parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], - lstack = [], - table = this.table, - yytext = "", - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - this.yy.parser = this; - if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - var ranges = this.lexer.options && this.lexer.options.ranges; - if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError; - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - function lex() { - var token; - token = self.lexer.lex() || 1; - if (typeof token !== "number") { - token = self.symbols_[token] || token; - } - return token; - } - var symbol, - preErrorSymbol, - state, - action, - a, - r, - yyval = {}, - p, - len, - newState, - expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == "undefined") { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === "undefined" || !action.length || !action[0]) { - var errStr = ""; - if (!recovering) { - expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected }); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; - if (ranges) { - yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; - } - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; - } - }; - /* Jison generated lexer */ - var lexer = (function () { - var lexer = { EOF: 1, - parseError: function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, - setInput: function setInput(input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ""; - this.conditionStack = ["INITIAL"]; - this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; - if (this.options.ranges) this.yylloc.range = [0, 0]; - this.offset = 0; - return this; - }, - input: function input() { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) this.yylloc.range[1]++; - - this._input = this._input.slice(1); - return ch; - }, - unput: function unput(ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); - - if (lines.length - 1) this.yylineno -= lines.length - 1; - var r = this.yylloc.range; - - this.yylloc = { first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - return this; - }, - more: function more() { - this._more = true; - return this; - }, - less: function less(n) { - this.unput(this.match.slice(n)); - }, - pastInput: function pastInput() { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); - }, - upcomingInput: function upcomingInput() { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20 - next.length); - } - return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); - }, - showPosition: function showPosition() { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, - next: function next() { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, match, tempMatch, index, col, lines; - if (!this._more) { - this.yytext = ""; - this.match = ""; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = { first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) this.done = false; - if (token) { - return token; - } else { - return; - } - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { text: "", token: null, line: this.yylineno }); - } - }, - lex: function lex() { - var r = this.next(); - if (typeof r !== "undefined") { - return r; - } else { - return this.lex(); - } - }, - begin: function begin(condition) { - this.conditionStack.push(condition); - }, - popState: function popState() { - return this.conditionStack.pop(); - }, - _currentRules: function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - }, - topState: function topState() { - return this.conditionStack[this.conditionStack.length - 2]; - }, - pushState: function begin(condition) { - this.begin(condition); - } }; - lexer.options = {}; - lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { - - function strip(start, end) { - return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end); - } - - var YYSTATE = YY_START; - switch ($avoiding_name_collisions) { - case 0: - if (yy_.yytext.slice(-2) === "\\\\") { - strip(0, 1); - this.begin("mu"); - } else if (yy_.yytext.slice(-1) === "\\") { - strip(0, 1); - this.begin("emu"); - } else { - this.begin("mu"); - } - if (yy_.yytext) { - return 14; - }break; - case 1: - return 14; - break; - case 2: - this.popState(); - return 14; - - break; - case 3: - yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9); - this.popState(); - return 16; - - break; - case 4: - return 14; - break; - case 5: - this.popState(); - return 13; - - break; - case 6: - return 59; - break; - case 7: - return 62; - break; - case 8: - return 17; - break; - case 9: - this.popState(); - this.begin("raw"); - return 21; - - break; - case 10: - return 53; - break; - case 11: - return 27; - break; - case 12: - return 45; - break; - case 13: - this.popState();return 42; - break; - case 14: - this.popState();return 42; - break; - case 15: - return 32; - break; - case 16: - return 37; - break; - case 17: - return 49; - break; - case 18: - return 46; - break; - case 19: - this.unput(yy_.yytext); - this.popState(); - this.begin("com"); - - break; - case 20: - this.popState(); - return 13; - - break; - case 21: - return 46; - break; - case 22: - return 67; - break; - case 23: - return 66; - break; - case 24: - return 66; - break; - case 25: - return 81; - break; - case 26: - // ignore whitespace - break; - case 27: - this.popState();return 52; - break; - case 28: - this.popState();return 31; - break; - case 29: - yy_.yytext = strip(1, 2).replace(/\\"/g, "\"");return 74; - break; - case 30: - yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 74; - break; - case 31: - return 79; - break; - case 32: - return 76; - break; - case 33: - return 76; - break; - case 34: - return 77; - break; - case 35: - return 78; - break; - case 36: - return 75; - break; - case 37: - return 69; - break; - case 38: - return 71; - break; - case 39: - return 66; - break; - case 40: - return 66; - break; - case 41: - return "INVALID"; - break; - case 42: - return 5; - break; - } - }; - lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]*?(?=(\{\{\{\{\/)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[[^\]]*\])/, /^(?:.)/, /^(?:$)/]; - lexer.conditions = { mu: { rules: [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], inclusive: false }, emu: { rules: [2], inclusive: false }, com: { rules: [5], inclusive: false }, raw: { rules: [3, 4], inclusive: false }, INITIAL: { rules: [0, 1, 42], inclusive: true } }; - return lexer; - })(); - parser.lexer = lexer; - function Parser() { - this.yy = {}; - }Parser.prototype = parser;parser.Parser = Parser; - return new Parser(); - })();module.exports = handlebars; -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/printer.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/printer.js deleted file mode 100644 index 6b4c230..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/printer.js +++ /dev/null @@ -1,165 +0,0 @@ -define(['exports', './visitor'], function (exports, _visitor) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.print = print; - exports.PrintVisitor = PrintVisitor; - /*eslint-disable new-cap */ - - var _Visitor = _interopRequire(_visitor); - - function print(ast) { - return new PrintVisitor().accept(ast); - } - - function PrintVisitor() { - this.padding = 0; - } - - PrintVisitor.prototype = new _Visitor(); - - PrintVisitor.prototype.pad = function (string) { - var out = ''; - - for (var i = 0, l = this.padding; i < l; i++) { - out = out + ' '; - } - - out = out + string + '\n'; - return out; - }; - - PrintVisitor.prototype.Program = function (program) { - var out = '', - body = program.body, - i = undefined, - l = undefined; - - if (program.blockParams) { - var blockParams = 'BLOCK PARAMS: ['; - for (i = 0, l = program.blockParams.length; i < l; i++) { - blockParams += ' ' + program.blockParams[i]; - } - blockParams += ' ]'; - out += this.pad(blockParams); - } - - for (i = 0, l = body.length; i < l; i++) { - out = out + this.accept(body[i]); - } - - this.padding--; - - return out; - }; - - PrintVisitor.prototype.MustacheStatement = function (mustache) { - return this.pad('{{ ' + this.SubExpression(mustache) + ' }}'); - }; - - PrintVisitor.prototype.BlockStatement = function (block) { - var out = ''; - - out = out + this.pad('BLOCK:'); - this.padding++; - out = out + this.pad(this.SubExpression(block)); - if (block.program) { - out = out + this.pad('PROGRAM:'); - this.padding++; - out = out + this.accept(block.program); - this.padding--; - } - if (block.inverse) { - if (block.program) { - this.padding++; - } - out = out + this.pad('{{^}}'); - this.padding++; - out = out + this.accept(block.inverse); - this.padding--; - if (block.program) { - this.padding--; - } - } - this.padding--; - - return out; - }; - - PrintVisitor.prototype.PartialStatement = function (partial) { - var content = 'PARTIAL:' + partial.name.original; - if (partial.params[0]) { - content += ' ' + this.accept(partial.params[0]); - } - if (partial.hash) { - content += ' ' + this.accept(partial.hash); - } - return this.pad('{{> ' + content + ' }}'); - }; - - PrintVisitor.prototype.ContentStatement = function (content) { - return this.pad('CONTENT[ \'' + content.value + '\' ]'); - }; - - PrintVisitor.prototype.CommentStatement = function (comment) { - return this.pad('{{! \'' + comment.value + '\' }}'); - }; - - PrintVisitor.prototype.SubExpression = function (sexpr) { - var params = sexpr.params, - paramStrings = [], - hash = undefined; - - for (var i = 0, l = params.length; i < l; i++) { - paramStrings.push(this.accept(params[i])); - } - - params = '[' + paramStrings.join(', ') + ']'; - - hash = sexpr.hash ? ' ' + this.accept(sexpr.hash) : ''; - - return this.accept(sexpr.path) + ' ' + params + hash; - }; - - PrintVisitor.prototype.PathExpression = function (id) { - var path = id.parts.join('/'); - return (id.data ? '@' : '') + 'PATH:' + path; - }; - - PrintVisitor.prototype.StringLiteral = function (string) { - return '"' + string.value + '"'; - }; - - PrintVisitor.prototype.NumberLiteral = function (number) { - return 'NUMBER{' + number.value + '}'; - }; - - PrintVisitor.prototype.BooleanLiteral = function (bool) { - return 'BOOLEAN{' + bool.value + '}'; - }; - - PrintVisitor.prototype.UndefinedLiteral = function () { - return 'UNDEFINED'; - }; - - PrintVisitor.prototype.NullLiteral = function () { - return 'NULL'; - }; - - PrintVisitor.prototype.Hash = function (hash) { - var pairs = hash.pairs, - joinedPairs = []; - - for (var i = 0, l = pairs.length; i < l; i++) { - joinedPairs.push(this.accept(pairs[i])); - } - - return 'HASH{' + joinedPairs.join(', ') + '}'; - }; - PrintVisitor.prototype.HashPair = function (pair) { - return pair.key + '=' + this.accept(pair.value); - }; - /*eslint-enable new-cap */ -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/visitor.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/visitor.js deleted file mode 100644 index c86bd51..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/visitor.js +++ /dev/null @@ -1,127 +0,0 @@ -define(['exports', 'module', '../exception', './ast'], function (exports, module, _exception, _ast) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _Exception = _interopRequire(_exception); - - var _AST = _interopRequire(_ast); - - function Visitor() { - this.parents = []; - } - - Visitor.prototype = { - constructor: Visitor, - mutating: false, - - // Visits a given value. If mutating, will replace the value if necessary. - acceptKey: function acceptKey(node, name) { - var value = this.accept(node[name]); - if (this.mutating) { - // Hacky sanity check: - if (value && (!value.type || !_AST[value.type])) { - throw new _Exception('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); - } - node[name] = value; - } - }, - - // Performs an accept operation with added sanity check to ensure - // required keys are not removed. - acceptRequired: function acceptRequired(node, name) { - this.acceptKey(node, name); - - if (!node[name]) { - throw new _Exception(node.type + ' requires ' + name); - } - }, - - // Traverses a given array. If mutating, empty respnses will be removed - // for child elements. - acceptArray: function acceptArray(array) { - for (var i = 0, l = array.length; i < l; i++) { - this.acceptKey(array, i); - - if (!array[i]) { - array.splice(i, 1); - i--; - l--; - } - } - }, - - accept: function accept(object) { - if (!object) { - return; - } - - if (this.current) { - this.parents.unshift(this.current); - } - this.current = object; - - var ret = this[object.type](object); - - this.current = this.parents.shift(); - - if (!this.mutating || ret) { - return ret; - } else if (ret !== false) { - return object; - } - }, - - Program: function Program(program) { - this.acceptArray(program.body); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.acceptRequired(mustache, 'path'); - this.acceptArray(mustache.params); - this.acceptKey(mustache, 'hash'); - }, - - BlockStatement: function BlockStatement(block) { - this.acceptRequired(block, 'path'); - this.acceptArray(block.params); - this.acceptKey(block, 'hash'); - - this.acceptKey(block, 'program'); - this.acceptKey(block, 'inverse'); - }, - - PartialStatement: function PartialStatement(partial) { - this.acceptRequired(partial, 'name'); - this.acceptArray(partial.params); - this.acceptKey(partial, 'hash'); - }, - - ContentStatement: function ContentStatement() {}, - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - this.acceptRequired(sexpr, 'path'); - this.acceptArray(sexpr.params); - this.acceptKey(sexpr, 'hash'); - }, - - PathExpression: function PathExpression() {}, - - StringLiteral: function StringLiteral() {}, - NumberLiteral: function NumberLiteral() {}, - BooleanLiteral: function BooleanLiteral() {}, - UndefinedLiteral: function UndefinedLiteral() {}, - NullLiteral: function NullLiteral() {}, - - Hash: function Hash(hash) { - this.acceptArray(hash.pairs); - }, - HashPair: function HashPair(pair) { - this.acceptRequired(pair, 'value'); - } - }; - - module.exports = Visitor; -}); -/* content */ /* comment */ /* path */ /* string */ /* number */ /* bool */ /* literal */ /* literal */ \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/whitespace-control.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/whitespace-control.js deleted file mode 100644 index 9f1d30f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/compiler/whitespace-control.js +++ /dev/null @@ -1,209 +0,0 @@ -define(['exports', 'module', './visitor'], function (exports, module, _visitor) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _Visitor = _interopRequire(_visitor); - - function WhitespaceControl() {} - WhitespaceControl.prototype = new _Visitor(); - - WhitespaceControl.prototype.Program = function (program) { - var isRoot = !this.isRootSeen; - this.isRootSeen = true; - - var body = program.body; - for (var i = 0, l = body.length; i < l; i++) { - var current = body[i], - strip = this.accept(current); - - if (!strip) { - continue; - } - - var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), - _isNextWhitespace = isNextWhitespace(body, i, isRoot), - openStandalone = strip.openStandalone && _isPrevWhitespace, - closeStandalone = strip.closeStandalone && _isNextWhitespace, - inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; - - if (strip.close) { - omitRight(body, i, true); - } - if (strip.open) { - omitLeft(body, i, true); - } - - if (inlineStandalone) { - omitRight(body, i); - - if (omitLeft(body, i)) { - // If we are on a standalone node, save the indent info for partials - if (current.type === 'PartialStatement') { - // Pull out the whitespace from the final line - current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1]; - } - } - } - if (openStandalone) { - omitRight((current.program || current.inverse).body); - - // Strip out the previous content node if it's whitespace only - omitLeft(body, i); - } - if (closeStandalone) { - // Always strip the next node - omitRight(body, i); - - omitLeft((current.inverse || current.program).body); - } - } - - return program; - }; - WhitespaceControl.prototype.BlockStatement = function (block) { - this.accept(block.program); - this.accept(block.inverse); - - // Find the inverse program that is involed with whitespace stripping. - var program = block.program || block.inverse, - inverse = block.program && block.inverse, - firstInverse = inverse, - lastInverse = inverse; - - if (inverse && inverse.chained) { - firstInverse = inverse.body[0].program; - - // Walk the inverse chain to find the last inverse that is actually in the chain. - while (lastInverse.chained) { - lastInverse = lastInverse.body[lastInverse.body.length - 1].program; - } - } - - var strip = { - open: block.openStrip.open, - close: block.closeStrip.close, - - // Determine the standalone candiacy. Basically flag our content as being possibly standalone - // so our parent can determine if we actually are standalone - openStandalone: isNextWhitespace(program.body), - closeStandalone: isPrevWhitespace((firstInverse || program).body) - }; - - if (block.openStrip.close) { - omitRight(program.body, null, true); - } - - if (inverse) { - var inverseStrip = block.inverseStrip; - - if (inverseStrip.open) { - omitLeft(program.body, null, true); - } - - if (inverseStrip.close) { - omitRight(firstInverse.body, null, true); - } - if (block.closeStrip.open) { - omitLeft(lastInverse.body, null, true); - } - - // Find standalone else statments - if (isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) { - omitLeft(program.body); - omitRight(firstInverse.body); - } - } else if (block.closeStrip.open) { - omitLeft(program.body, null, true); - } - - return strip; - }; - - WhitespaceControl.prototype.MustacheStatement = function (mustache) { - return mustache.strip; - }; - - WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) { - /* istanbul ignore next */ - var strip = node.strip || {}; - return { - inlineStandalone: true, - open: strip.open, - close: strip.close - }; - }; - - function isPrevWhitespace(body, i, isRoot) { - if (i === undefined) { - i = body.length; - } - - // Nodes that end with newlines are considered whitespace (but are special - // cased for strip operations) - var prev = body[i - 1], - sibling = body[i - 2]; - if (!prev) { - return isRoot; - } - - if (prev.type === 'ContentStatement') { - return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original); - } - } - function isNextWhitespace(body, i, isRoot) { - if (i === undefined) { - i = -1; - } - - var next = body[i + 1], - sibling = body[i + 2]; - if (!next) { - return isRoot; - } - - if (next.type === 'ContentStatement') { - return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original); - } - } - - // Marks the node to the right of the position as omitted. - // I.e. {{foo}}' ' will mark the ' ' node as omitted. - // - // If i is undefined, then the first child will be marked as such. - // - // If mulitple is truthy then all whitespace will be stripped out until non-whitespace - // content is met. - function omitRight(body, i, multiple) { - var current = body[i == null ? 0 : i + 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) { - return; - } - - var original = current.value; - current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, ''); - current.rightStripped = current.value !== original; - } - - // Marks the node to the left of the position as omitted. - // I.e. ' '{{foo}} will mark the ' ' node as omitted. - // - // If i is undefined then the last child will be marked as such. - // - // If mulitple is truthy then all whitespace will be stripped out until non-whitespace - // content is met. - function omitLeft(body, i, multiple) { - var current = body[i == null ? body.length - 1 : i - 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) { - return; - } - - // We omit the last node if it's whitespace only and not preceeded by a non-content node. - var original = current.value; - current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, ''); - current.leftStripped = current.value !== original; - return current.leftStripped; - } - - module.exports = WhitespaceControl; -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/exception.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/exception.js deleted file mode 100644 index a1ccecf..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/exception.js +++ /dev/null @@ -1,37 +0,0 @@ -define(['exports', 'module'], function (exports, module) { - 'use strict'; - - var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - - function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } - } - - Exception.prototype = new Error(); - - module.exports = Exception; -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/no-conflict.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/no-conflict.js deleted file mode 100644 index c7dda86..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/no-conflict.js +++ /dev/null @@ -1,16 +0,0 @@ -define(['exports', 'module'], function (exports, module) { - /*global window */ - 'use strict'; - - module.exports = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; - }; -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/runtime.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/runtime.js deleted file mode 100644 index e1186e4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/runtime.js +++ /dev/null @@ -1,226 +0,0 @@ -define(['exports', './utils', './exception', './base'], function (exports, _utils, _exception, _base) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.checkRevision = checkRevision; - - // TODO: Remove this line and break up compilePartial - - exports.template = template; - exports.wrapProgram = wrapProgram; - exports.resolvePartial = resolvePartial; - exports.invokePartial = invokePartial; - exports.noop = noop; - - var _Exception = _interopRequire(_exception); - - function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _base.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _base.REVISION_CHANGES[currentRevision], - compilerVersions = _base.REVISION_CHANGES[compilerRevision]; - throw new _Exception('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _Exception('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } - } - - function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _Exception('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _Exception('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = _utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _Exception('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _Exception('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: _utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - return templateSpec[i]; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = _utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _Exception('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _Exception('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; - } - - function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; - } - - function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; - } - - function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new _Exception('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } - } - - function noop() { - return ''; - } - - function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _base.createFrame(data) : {}; - data.root = context; - } - return data; - } -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/safe-string.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/safe-string.js deleted file mode 100644 index f2b3d53..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/safe-string.js +++ /dev/null @@ -1,14 +0,0 @@ -define(['exports', 'module'], function (exports, module) { - // Build out our basic SafeString type - 'use strict'; - - function SafeString(string) { - this.string = string; - } - - SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; - }; - - module.exports = SafeString; -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/utils.js deleted file mode 100644 index e2d6fff..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/handlebars/utils.js +++ /dev/null @@ -1,116 +0,0 @@ -define(['exports'], function (exports) { - 'use strict'; - - exports.__esModule = true; - exports.extend = extend; - - // Older IE versions do not directly support indexOf so we must implement our own, sadly. - exports.indexOf = indexOf; - exports.escapeExpression = escapeExpression; - exports.isEmpty = isEmpty; - exports.blockParams = blockParams; - exports.appendContextPath = appendContextPath; - var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '`': '`' - }; - - var badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - - function escapeChar(chr) { - return escape[chr]; - } - - function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; - } - - var toString = Object.prototype.toString; - - exports.toString = toString; - // Sourced from lodash - // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt - /*eslint-disable func-style, no-var */ - var isFunction = function isFunction(value) { - return typeof value === 'function'; - }; - // fallback for older versions of Chrome and Safari - /* istanbul ignore next */ - if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; - } - var isFunction; - exports.isFunction = isFunction; - /*eslint-enable func-style, no-var */ - - /* istanbul ignore next */ - var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; - };exports.isArray = isArray; - - function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; - } - - function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); - } - - function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } - } - - function blockParams(params, ids) { - params.path = ids; - return params; - } - - function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; - } -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/precompiler.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/precompiler.js deleted file mode 100644 index dc5aac8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/amd/precompiler.js +++ /dev/null @@ -1,184 +0,0 @@ -define(['exports', 'fs', './handlebars', 'path', 'source-map', 'uglify-js'], function (exports, _fs, _handlebars, _path, _sourceMap, _uglifyJs) { - 'use strict'; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - /*eslint-disable no-console */ - - var _fs2 = _interopRequire(_fs); - - var _uglify = _interopRequire(_uglifyJs); - - module.exports.cli = function (opts) { - if (opts.version) { - console.log(_handlebars.VERSION); - return; - } - - if (!opts.templates.length) { - throw new _handlebars.Exception('Must define at least one template or directory.'); - } - - opts.templates.forEach(function (template) { - try { - _fs2.statSync(template); - } catch (err) { - throw new _handlebars.Exception('Unable to open template file "' + template + '"'); - } - }); - - if (opts.simple && opts.min) { - throw new _handlebars.Exception('Unable to minimize simple output'); - } - if (opts.simple && (opts.templates.length !== 1 || _fs2.statSync(opts.templates[0]).isDirectory())) { - throw new _handlebars.Exception('Unable to output multiple templates in simple mode'); - } - - // Convert the known list into a hash - var known = {}; - if (opts.known && !Array.isArray(opts.known)) { - opts.known = [opts.known]; - } - if (opts.known) { - for (var i = 0, len = opts.known.length; i < len; i++) { - known[opts.known[i]] = true; - } - } - - // Build file extension pattern - var extension = opts.extension.replace(/[\\^$*+?.():=!|{}\-\[\]]/g, function (arg) { - return '\\' + arg; - }); - extension = new RegExp('\\.' + extension + '$'); - - var output = new _sourceMap.SourceNode(); - if (!opts.simple) { - if (opts.amd) { - output.add('define([\'' + opts.handlebarPath + 'handlebars.runtime\'], function(Handlebars) {\n Handlebars = Handlebars["default"];'); - } else if (opts.commonjs) { - output.add('var Handlebars = require("' + opts.commonjs + '");'); - } else { - output.add('(function() {\n'); - } - output.add(' var template = Handlebars.template, templates = '); - if (opts.namespace) { - output.add(opts.namespace); - output.add(' = '); - output.add(opts.namespace); - output.add(' || '); - } - output.add('{};\n'); - } - function processTemplate(template, root) { - var path = template, - stat = _fs2.statSync(path); - if (stat.isDirectory()) { - _fs2.readdirSync(template).map(function (file) { - var childPath = template + '/' + file; - - if (extension.test(childPath) || _fs2.statSync(childPath).isDirectory()) { - processTemplate(childPath, root || template); - } - }); - } else { - var data = _fs2.readFileSync(path, 'utf8'); - - if (opts.bom && data.indexOf('') === 0) { - data = data.substring(1); - } - - var options = { - knownHelpers: known, - knownHelpersOnly: opts.o - }; - - if (opts.map) { - options.srcName = path; - } - if (opts.data) { - options.data = true; - } - - // Clean the template name - if (!root) { - template = _path.basename(template); - } else if (template.indexOf(root) === 0) { - template = template.substring(root.length + 1); - } - template = template.replace(extension, ''); - - var precompiled = _handlebars.precompile(data, options); - - // If we are generating a source map, we have to reconstruct the SourceNode object - if (opts.map) { - var consumer = new _sourceMap.SourceMapConsumer(precompiled.map); - precompiled = _sourceMap.SourceNode.fromStringWithSourceMap(precompiled.code, consumer); - } - - if (opts.simple) { - output.add([precompiled, '\n']); - } else if (opts.partial) { - if (opts.amd && (opts.templates.length == 1 && !_fs2.statSync(opts.templates[0]).isDirectory())) { - output.add('return '); - } - output.add(['Handlebars.partials[\'', template, '\'] = template(', precompiled, ');\n']); - } else { - if (opts.amd && (opts.templates.length == 1 && !_fs2.statSync(opts.templates[0]).isDirectory())) { - output.add('return '); - } - output.add(['templates[\'', template, '\'] = template(', precompiled, ');\n']); - } - } - } - - opts.templates.forEach(function (template) { - processTemplate(template, opts.root); - }); - - // Output the content - if (!opts.simple) { - if (opts.amd) { - if (opts.templates.length > 1 || opts.templates.length == 1 && _fs2.statSync(opts.templates[0]).isDirectory()) { - if (opts.partial) { - output.add('return Handlebars.partials;\n'); - } else { - output.add('return templates;\n'); - } - } - output.add('});'); - } else if (!opts.commonjs) { - output.add('})();'); - } - } - - if (opts.map) { - output.add('\n//# sourceMappingURL=' + opts.map + '\n'); - } - - output = output.toStringWithSourceMap(); - output.map = output.map + ''; - - if (opts.min) { - output = _uglify.minify(output.code, { - fromString: true, - - outSourceMap: opts.map, - inSourceMap: JSON.parse(output.map) - }); - if (opts.map) { - output.code += '\n//# sourceMappingURL=' + opts.map + '\n'; - } - } - - if (opts.map) { - _fs2.writeFileSync(opts.map, output.map, 'utf8'); - } - output = output.code; - - if (opts.output) { - _fs2.writeFileSync(opts.output, output, 'utf8'); - } else { - console.log(output); - } - }; -}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.js deleted file mode 100644 index f294436..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.js +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; - -var _runtime = require('./handlebars.runtime'); - -var _runtime2 = _interopRequireWildcard(_runtime); - -// Compiler imports - -var _AST = require('./handlebars/compiler/ast'); - -var _AST2 = _interopRequireWildcard(_AST); - -var _Parser$parse = require('./handlebars/compiler/base'); - -var _Compiler$compile$precompile = require('./handlebars/compiler/compiler'); - -var _JavaScriptCompiler = require('./handlebars/compiler/javascript-compiler'); - -var _JavaScriptCompiler2 = _interopRequireWildcard(_JavaScriptCompiler); - -var _Visitor = require('./handlebars/compiler/visitor'); - -var _Visitor2 = _interopRequireWildcard(_Visitor); - -var _noConflict = require('./handlebars/no-conflict'); - -var _noConflict2 = _interopRequireWildcard(_noConflict); - -var _create = _runtime2['default'].create; -function create() { - var hb = _create(); - - hb.compile = function (input, options) { - return _Compiler$compile$precompile.compile(input, options, hb); - }; - hb.precompile = function (input, options) { - return _Compiler$compile$precompile.precompile(input, options, hb); - }; - - hb.AST = _AST2['default']; - hb.Compiler = _Compiler$compile$precompile.Compiler; - hb.JavaScriptCompiler = _JavaScriptCompiler2['default']; - hb.Parser = _Parser$parse.parser; - hb.parse = _Parser$parse.parse; - - return hb; -} - -var inst = create(); -inst.create = create; - -_noConflict2['default'](inst); - -inst.Visitor = _Visitor2['default']; - -inst['default'] = inst; - -exports['default'] = inst; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.runtime.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.runtime.js deleted file mode 100644 index e52f2fd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars.runtime.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; - -var _import = require('./handlebars/base'); - -var base = _interopRequireWildcard(_import); - -// Each of these augment the Handlebars object. No need to setup here. -// (This is done to easily share code between commonjs and browse envs) - -var _SafeString = require('./handlebars/safe-string'); - -var _SafeString2 = _interopRequireWildcard(_SafeString); - -var _Exception = require('./handlebars/exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -var _import2 = require('./handlebars/utils'); - -var Utils = _interopRequireWildcard(_import2); - -var _import3 = require('./handlebars/runtime'); - -var runtime = _interopRequireWildcard(_import3); - -var _noConflict = require('./handlebars/no-conflict'); - -var _noConflict2 = _interopRequireWildcard(_noConflict); - -// For compatibility and usage outside of module systems, make the Handlebars object a namespace -function create() { - var hb = new base.HandlebarsEnvironment(); - - Utils.extend(hb, base); - hb.SafeString = _SafeString2['default']; - hb.Exception = _Exception2['default']; - hb.Utils = Utils; - hb.escapeExpression = Utils.escapeExpression; - - hb.VM = runtime; - hb.template = function (spec) { - return runtime.template(spec, hb); - }; - - return hb; -} - -var inst = create(); -inst.create = create; - -_noConflict2['default'](inst); - -inst['default'] = inst; - -exports['default'] = inst; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/base.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/base.js deleted file mode 100644 index c7c6a69..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/base.js +++ /dev/null @@ -1,273 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; -exports.HandlebarsEnvironment = HandlebarsEnvironment; -exports.createFrame = createFrame; - -var _import = require('./utils'); - -var Utils = _interopRequireWildcard(_import); - -var _Exception = require('./exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -var VERSION = '3.0.1'; -exports.VERSION = VERSION; -var COMPILER_REVISION = 6; - -exports.COMPILER_REVISION = COMPILER_REVISION; -var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' -}; - -exports.REVISION_CHANGES = REVISION_CHANGES; -var isArray = Utils.isArray, - isFunction = Utils.isFunction, - toString = Utils.toString, - objectType = '[object Object]'; - -function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); -} - -HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function registerHelper(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { - throw new _Exception2['default']('Arg not supported with multiple helpers'); - } - Utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (toString.call(name) === objectType) { - Utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _Exception2['default']('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - } -}; - -function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function () { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _Exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _Exception2['default']('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: Utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (var j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function (conditional, options) { - if (isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || Utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - - instance.registerHelper('with', function (context, options) { - if (isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!Utils.isEmpty(context)) { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = { data: data }; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function (message, options) { - var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); -} - -var logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function log(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - var method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } -}; - -exports.logger = logger; -var log = logger.log; - -exports.log = log; - -function createFrame(object) { - var frame = Utils.extend({}, object); - frame._parent = object; - return frame; -} - -/* [args, ]options */ \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js deleted file mode 100644 index 88b290a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/ast.js +++ /dev/null @@ -1,152 +0,0 @@ -'use strict'; - -exports.__esModule = true; -var AST = { - Program: function Program(statements, blockParams, strip, locInfo) { - this.loc = locInfo; - this.type = 'Program'; - this.body = statements; - - this.blockParams = blockParams; - this.strip = strip; - }, - - MustacheStatement: function MustacheStatement(path, params, hash, escaped, strip, locInfo) { - this.loc = locInfo; - this.type = 'MustacheStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.escaped = escaped; - - this.strip = strip; - }, - - BlockStatement: function BlockStatement(path, params, hash, program, inverse, openStrip, inverseStrip, closeStrip, locInfo) { - this.loc = locInfo; - this.type = 'BlockStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.program = program; - this.inverse = inverse; - - this.openStrip = openStrip; - this.inverseStrip = inverseStrip; - this.closeStrip = closeStrip; - }, - - PartialStatement: function PartialStatement(name, params, hash, strip, locInfo) { - this.loc = locInfo; - this.type = 'PartialStatement'; - - this.name = name; - this.params = params || []; - this.hash = hash; - - this.indent = ''; - this.strip = strip; - }, - - ContentStatement: function ContentStatement(string, locInfo) { - this.loc = locInfo; - this.type = 'ContentStatement'; - this.original = this.value = string; - }, - - CommentStatement: function CommentStatement(comment, strip, locInfo) { - this.loc = locInfo; - this.type = 'CommentStatement'; - this.value = comment; - - this.strip = strip; - }, - - SubExpression: function SubExpression(path, params, hash, locInfo) { - this.loc = locInfo; - - this.type = 'SubExpression'; - this.path = path; - this.params = params || []; - this.hash = hash; - }, - - PathExpression: function PathExpression(data, depth, parts, original, locInfo) { - this.loc = locInfo; - this.type = 'PathExpression'; - - this.data = data; - this.original = original; - this.parts = parts; - this.depth = depth; - }, - - StringLiteral: function StringLiteral(string, locInfo) { - this.loc = locInfo; - this.type = 'StringLiteral'; - this.original = this.value = string; - }, - - NumberLiteral: function NumberLiteral(number, locInfo) { - this.loc = locInfo; - this.type = 'NumberLiteral'; - this.original = this.value = Number(number); - }, - - BooleanLiteral: function BooleanLiteral(bool, locInfo) { - this.loc = locInfo; - this.type = 'BooleanLiteral'; - this.original = this.value = bool === 'true'; - }, - - UndefinedLiteral: function UndefinedLiteral(locInfo) { - this.loc = locInfo; - this.type = 'UndefinedLiteral'; - this.original = this.value = undefined; - }, - - NullLiteral: function NullLiteral(locInfo) { - this.loc = locInfo; - this.type = 'NullLiteral'; - this.original = this.value = null; - }, - - Hash: function Hash(pairs, locInfo) { - this.loc = locInfo; - this.type = 'Hash'; - this.pairs = pairs; - }, - HashPair: function HashPair(key, value, locInfo) { - this.loc = locInfo; - this.type = 'HashPair'; - this.key = key; - this.value = value; - }, - - // Public API used to evaluate derived attributes regarding AST nodes - helpers: { - // a mustache is definitely a helper if: - // * it is an eligible helper, and - // * it has at least one parameter or hash segment - helperExpression: function helperExpression(node) { - return !!(node.type === 'SubExpression' || node.params.length || node.hash); - }, - - scopedId: function scopedId(path) { - return /^\.|this\b/.test(path.original); - }, - - // an ID is simple if it only has one part, and that part is not - // `..` or `this`. - simpleId: function simpleId(path) { - return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; - } - } -}; - -// Must be exported as an object rather than the root of the module as the jison lexer -// must modify the object to operate properly. -exports['default'] = AST; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js deleted file mode 100644 index d4bafe0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/base.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; -exports.parse = parse; - -var _parser = require('./parser'); - -var _parser2 = _interopRequireWildcard(_parser); - -var _AST = require('./ast'); - -var _AST2 = _interopRequireWildcard(_AST); - -var _WhitespaceControl = require('./whitespace-control'); - -var _WhitespaceControl2 = _interopRequireWildcard(_WhitespaceControl); - -var _import = require('./helpers'); - -var Helpers = _interopRequireWildcard(_import); - -var _extend = require('../utils'); - -exports.parser = _parser2['default']; - -var yy = {}; -_extend.extend(yy, Helpers, _AST2['default']); - -function parse(input, options) { - // Just return if an already-compiled AST was passed in. - if (input.type === 'Program') { - return input; - } - - _parser2['default'].yy = yy; - - // Altering the shared object here, but this is ok as parser is a sync operation - yy.locInfo = function (locInfo) { - return new yy.SourceLocation(options && options.srcName, locInfo); - }; - - var strip = new _WhitespaceControl2['default'](); - return strip.accept(_parser2['default'].parse(input)); -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js deleted file mode 100644 index 8c48c8b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/code-gen.js +++ /dev/null @@ -1,164 +0,0 @@ -'use strict'; - -exports.__esModule = true; -/*global define */ - -var _isArray = require('../utils'); - -var SourceNode = undefined; - -try { - /* istanbul ignore next */ - if (typeof define !== 'function' || !define.amd) { - // We don't support this in AMD environments. For these environments, we asusme that - // they are running on the browser and thus have no need for the source-map library. - var SourceMap = require('source-map'); - SourceNode = SourceMap.SourceNode; - } -} catch (err) {} - -/* istanbul ignore if: tested but not covered in istanbul due to dist build */ -if (!SourceNode) { - SourceNode = function (line, column, srcFile, chunks) { - this.src = ''; - if (chunks) { - this.add(chunks); - } - }; - /* istanbul ignore next */ - SourceNode.prototype = { - add: function add(chunks) { - if (_isArray.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src += chunks; - }, - prepend: function prepend(chunks) { - if (_isArray.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src = chunks + this.src; - }, - toStringWithSourceMap: function toStringWithSourceMap() { - return { code: this.toString() }; - }, - toString: function toString() { - return this.src; - } - }; -} - -function castChunk(chunk, codeGen, loc) { - if (_isArray.isArray(chunk)) { - var ret = []; - - for (var i = 0, len = chunk.length; i < len; i++) { - ret.push(codeGen.wrap(chunk[i], loc)); - } - return ret; - } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { - // Handle primitives that the SourceNode will throw up on - return chunk + ''; - } - return chunk; -} - -function CodeGen(srcFile) { - this.srcFile = srcFile; - this.source = []; -} - -CodeGen.prototype = { - prepend: function prepend(source, loc) { - this.source.unshift(this.wrap(source, loc)); - }, - push: function push(source, loc) { - this.source.push(this.wrap(source, loc)); - }, - - merge: function merge() { - var source = this.empty(); - this.each(function (line) { - source.add([' ', line, '\n']); - }); - return source; - }, - - each: function each(iter) { - for (var i = 0, len = this.source.length; i < len; i++) { - iter(this.source[i]); - } - }, - - empty: function empty() { - var loc = arguments[0] === undefined ? this.currentLocation || { start: {} } : arguments[0]; - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile); - }, - wrap: function wrap(chunk) { - var loc = arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1]; - - if (chunk instanceof SourceNode) { - return chunk; - } - - chunk = castChunk(chunk, this, loc); - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); - }, - - functionCall: function functionCall(fn, type, params) { - params = this.generateList(params); - return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); - }, - - quotedString: function quotedString(str) { - return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 - .replace(/\u2029/g, '\\u2029') + '"'; - }, - - objectLiteral: function objectLiteral(obj) { - var pairs = []; - - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - var value = castChunk(obj[key], this); - if (value !== 'undefined') { - pairs.push([this.quotedString(key), ':', value]); - } - } - } - - var ret = this.generateList(pairs); - ret.prepend('{'); - ret.add('}'); - return ret; - }, - - generateList: function generateList(entries, loc) { - var ret = this.empty(loc); - - for (var i = 0, len = entries.length; i < len; i++) { - if (i) { - ret.add(','); - } - - ret.add(castChunk(entries[i], this, loc)); - } - - return ret; - }, - - generateArray: function generateArray(entries, loc) { - var ret = this.generateList(entries, loc); - ret.prepend('['); - ret.add(']'); - - return ret; - } -}; - -exports['default'] = CodeGen; -module.exports = exports['default']; - -/* NOP */ \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js deleted file mode 100644 index 4840fa5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js +++ /dev/null @@ -1,527 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; -exports.Compiler = Compiler; -exports.precompile = precompile; -exports.compile = compile; - -var _Exception = require('../exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -var _isArray$indexOf = require('../utils'); - -var _AST = require('./ast'); - -var _AST2 = _interopRequireWildcard(_AST); - -var slice = [].slice; - -function Compiler() {} - -// the foundHelper register will disambiguate helper lookup from finding a -// function in a context. This is necessary for mustache compatibility, which -// requires that context functions in blocks are evaluated by blockHelperMissing, -// and then proceed as if the resulting value was provided to blockHelperMissing. - -Compiler.prototype = { - compiler: Compiler, - - equals: function equals(other) { - var len = this.opcodes.length; - if (other.opcodes.length !== len) { - return false; - } - - for (var i = 0; i < len; i++) { - var opcode = this.opcodes[i], - otherOpcode = other.opcodes[i]; - if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { - return false; - } - } - - // We know that length is the same between the two arrays because they are directly tied - // to the opcode behavior above. - len = this.children.length; - for (var i = 0; i < len; i++) { - if (!this.children[i].equals(other.children[i])) { - return false; - } - } - - return true; - }, - - guid: 0, - - compile: function compile(program, options) { - this.sourceNode = []; - this.opcodes = []; - this.children = []; - this.options = options; - this.stringParams = options.stringParams; - this.trackIds = options.trackIds; - - options.blockParams = options.blockParams || []; - - // These changes will propagate to the other compiler components - var knownHelpers = options.knownHelpers; - options.knownHelpers = { - helperMissing: true, - blockHelperMissing: true, - each: true, - 'if': true, - unless: true, - 'with': true, - log: true, - lookup: true - }; - if (knownHelpers) { - for (var _name in knownHelpers) { - if (_name in knownHelpers) { - options.knownHelpers[_name] = knownHelpers[_name]; - } - } - } - - return this.accept(program); - }, - - compileProgram: function compileProgram(program) { - var childCompiler = new this.compiler(), - // eslint-disable-line new-cap - result = childCompiler.compile(program, this.options), - guid = this.guid++; - - this.usePartial = this.usePartial || result.usePartial; - - this.children[guid] = result; - this.useDepths = this.useDepths || result.useDepths; - - return guid; - }, - - accept: function accept(node) { - this.sourceNode.unshift(node); - var ret = this[node.type](node); - this.sourceNode.shift(); - return ret; - }, - - Program: function Program(program) { - this.options.blockParams.unshift(program.blockParams); - - var body = program.body, - bodyLength = body.length; - for (var i = 0; i < bodyLength; i++) { - this.accept(body[i]); - } - - this.options.blockParams.shift(); - - this.isSimple = bodyLength === 1; - this.blockParams = program.blockParams ? program.blockParams.length : 0; - - return this; - }, - - BlockStatement: function BlockStatement(block) { - transformLiteralToPath(block); - - var program = block.program, - inverse = block.inverse; - - program = program && this.compileProgram(program); - inverse = inverse && this.compileProgram(inverse); - - var type = this.classifySexpr(block); - - if (type === 'helper') { - this.helperSexpr(block, program, inverse); - } else if (type === 'simple') { - this.simpleSexpr(block); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('blockValue', block.path.original); - } else { - this.ambiguousSexpr(block, program, inverse); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('ambiguousBlockValue'); - } - - this.opcode('append'); - }, - - PartialStatement: function PartialStatement(partial) { - this.usePartial = true; - - var params = partial.params; - if (params.length > 1) { - throw new _Exception2['default']('Unsupported number of partial arguments: ' + params.length, partial); - } else if (!params.length) { - params.push({ type: 'PathExpression', parts: [], depth: 0 }); - } - - var partialName = partial.name.original, - isDynamic = partial.name.type === 'SubExpression'; - if (isDynamic) { - this.accept(partial.name); - } - - this.setupFullMustacheParams(partial, undefined, undefined, true); - - var indent = partial.indent || ''; - if (this.options.preventIndent && indent) { - this.opcode('appendContent', indent); - indent = ''; - } - - this.opcode('invokePartial', isDynamic, partialName, indent); - this.opcode('append'); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.SubExpression(mustache); // eslint-disable-line new-cap - - if (mustache.escaped && !this.options.noEscape) { - this.opcode('appendEscaped'); - } else { - this.opcode('append'); - } - }, - - ContentStatement: function ContentStatement(content) { - if (content.value) { - this.opcode('appendContent', content.value); - } - }, - - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - transformLiteralToPath(sexpr); - var type = this.classifySexpr(sexpr); - - if (type === 'simple') { - this.simpleSexpr(sexpr); - } else if (type === 'helper') { - this.helperSexpr(sexpr); - } else { - this.ambiguousSexpr(sexpr); - } - }, - ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) { - var path = sexpr.path, - name = path.parts[0], - isBlock = program != null || inverse != null; - - this.opcode('getContext', path.depth); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - this.accept(path); - - this.opcode('invokeAmbiguous', name, isBlock); - }, - - simpleSexpr: function simpleSexpr(sexpr) { - this.accept(sexpr.path); - this.opcode('resolvePossibleLambda'); - }, - - helperSexpr: function helperSexpr(sexpr, program, inverse) { - var params = this.setupFullMustacheParams(sexpr, program, inverse), - path = sexpr.path, - name = path.parts[0]; - - if (this.options.knownHelpers[name]) { - this.opcode('invokeKnownHelper', params.length, name); - } else if (this.options.knownHelpersOnly) { - throw new _Exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); - } else { - path.falsy = true; - - this.accept(path); - this.opcode('invokeHelper', params.length, path.original, _AST2['default'].helpers.simpleId(path)); - } - }, - - PathExpression: function PathExpression(path) { - this.addDepth(path.depth); - this.opcode('getContext', path.depth); - - var name = path.parts[0], - scoped = _AST2['default'].helpers.scopedId(path), - blockParamId = !path.depth && !scoped && this.blockParamIndex(name); - - if (blockParamId) { - this.opcode('lookupBlockParam', blockParamId, path.parts); - } else if (!name) { - // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` - this.opcode('pushContext'); - } else if (path.data) { - this.options.data = true; - this.opcode('lookupData', path.depth, path.parts); - } else { - this.opcode('lookupOnContext', path.parts, path.falsy, scoped); - } - }, - - StringLiteral: function StringLiteral(string) { - this.opcode('pushString', string.value); - }, - - NumberLiteral: function NumberLiteral(number) { - this.opcode('pushLiteral', number.value); - }, - - BooleanLiteral: function BooleanLiteral(bool) { - this.opcode('pushLiteral', bool.value); - }, - - UndefinedLiteral: function UndefinedLiteral() { - this.opcode('pushLiteral', 'undefined'); - }, - - NullLiteral: function NullLiteral() { - this.opcode('pushLiteral', 'null'); - }, - - Hash: function Hash(hash) { - var pairs = hash.pairs, - i = 0, - l = pairs.length; - - this.opcode('pushHash'); - - for (; i < l; i++) { - this.pushParam(pairs[i].value); - } - while (i--) { - this.opcode('assignToHash', pairs[i].key); - } - this.opcode('popHash'); - }, - - // HELPERS - opcode: function opcode(name) { - this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); - }, - - addDepth: function addDepth(depth) { - if (!depth) { - return; - } - - this.useDepths = true; - }, - - classifySexpr: function classifySexpr(sexpr) { - var isSimple = _AST2['default'].helpers.simpleId(sexpr.path); - - var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); - - // a mustache is an eligible helper if: - // * its id is simple (a single part, not `this` or `..`) - var isHelper = !isBlockParam && _AST2['default'].helpers.helperExpression(sexpr); - - // if a mustache is an eligible helper but not a definite - // helper, it is ambiguous, and will be resolved in a later - // pass or at runtime. - var isEligible = !isBlockParam && (isHelper || isSimple); - - // if ambiguous, we can possibly resolve the ambiguity now - // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. - if (isEligible && !isHelper) { - var _name2 = sexpr.path.parts[0], - options = this.options; - - if (options.knownHelpers[_name2]) { - isHelper = true; - } else if (options.knownHelpersOnly) { - isEligible = false; - } - } - - if (isHelper) { - return 'helper'; - } else if (isEligible) { - return 'ambiguous'; - } else { - return 'simple'; - } - }, - - pushParams: function pushParams(params) { - for (var i = 0, l = params.length; i < l; i++) { - this.pushParam(params[i]); - } - }, - - pushParam: function pushParam(val) { - var value = val.value != null ? val.value : val.original || ''; - - if (this.stringParams) { - if (value.replace) { - value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.'); - } - - if (val.depth) { - this.addDepth(val.depth); - } - this.opcode('getContext', val.depth || 0); - this.opcode('pushStringParam', value, val.type); - - if (val.type === 'SubExpression') { - // SubExpressions get evaluated and passed in - // in string params mode. - this.accept(val); - } - } else { - if (this.trackIds) { - var blockParamIndex = undefined; - if (val.parts && !_AST2['default'].helpers.scopedId(val) && !val.depth) { - blockParamIndex = this.blockParamIndex(val.parts[0]); - } - if (blockParamIndex) { - var blockParamChild = val.parts.slice(1).join('.'); - this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); - } else { - value = val.original || value; - if (value.replace) { - value = value.replace(/^\.\//g, '').replace(/^\.$/g, ''); - } - - this.opcode('pushId', val.type, value); - } - } - this.accept(val); - } - }, - - setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) { - var params = sexpr.params; - this.pushParams(params); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - if (sexpr.hash) { - this.accept(sexpr.hash); - } else { - this.opcode('emptyHash', omitEmpty); - } - - return params; - }, - - blockParamIndex: function blockParamIndex(name) { - for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) { - var blockParams = this.options.blockParams[depth], - param = blockParams && _isArray$indexOf.indexOf(blockParams, name); - if (blockParams && param >= 0) { - return [depth, param]; - } - } - } -}; - -function precompile(input, options, env) { - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); - } - - options = options || {}; - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options); - return new env.JavaScriptCompiler().compile(environment, options); -} - -function compile(input, _x, env) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); - } - - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var compiled = undefined; - - function compileInput() { - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options), - templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); - return env.template(templateSpec); - } - - // Template is only compiled on first use and cached after that point. - function ret(context, execOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled.call(this, context, execOptions); - } - ret._setup = function (setupOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._setup(setupOptions); - }; - ret._child = function (i, data, blockParams, depths) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._child(i, data, blockParams, depths); - }; - return ret; -} - -function argEquals(a, b) { - if (a === b) { - return true; - } - - if (_isArray$indexOf.isArray(a) && _isArray$indexOf.isArray(b) && a.length === b.length) { - for (var i = 0; i < a.length; i++) { - if (!argEquals(a[i], b[i])) { - return false; - } - } - return true; - } -} - -function transformLiteralToPath(sexpr) { - if (!sexpr.path.parts) { - var literal = sexpr.path; - // Casting to string here to make false and 0 literal values play nicely with the rest - // of the system. - sexpr.path = new _AST2['default'].PathExpression(false, 0, [literal.original + ''], literal.original + '', literal.loc); - } -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/helpers.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/helpers.js deleted file mode 100644 index dac4f0c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/helpers.js +++ /dev/null @@ -1,131 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; -exports.SourceLocation = SourceLocation; -exports.id = id; -exports.stripFlags = stripFlags; -exports.stripComment = stripComment; -exports.preparePath = preparePath; -exports.prepareMustache = prepareMustache; -exports.prepareRawBlock = prepareRawBlock; -exports.prepareBlock = prepareBlock; - -var _Exception = require('../exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -function SourceLocation(source, locInfo) { - this.source = source; - this.start = { - line: locInfo.first_line, - column: locInfo.first_column - }; - this.end = { - line: locInfo.last_line, - column: locInfo.last_column - }; -} - -function id(token) { - if (/^\[.*\]$/.test(token)) { - return token.substr(1, token.length - 2); - } else { - return token; - } -} - -function stripFlags(open, close) { - return { - open: open.charAt(2) === '~', - close: close.charAt(close.length - 3) === '~' - }; -} - -function stripComment(comment) { - return comment.replace(/^\{\{~?\!-?-?/, '').replace(/-?-?~?\}\}$/, ''); -} - -function preparePath(data, parts, locInfo) { - locInfo = this.locInfo(locInfo); - - var original = data ? '@' : '', - dig = [], - depth = 0, - depthString = ''; - - for (var i = 0, l = parts.length; i < l; i++) { - var part = parts[i].part, - - // If we have [] syntax then we do not treat path references as operators, - // i.e. foo.[this] resolves to approximately context.foo['this'] - isLiteral = parts[i].original !== part; - original += (parts[i].separator || '') + part; - - if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { - if (dig.length > 0) { - throw new _Exception2['default']('Invalid path: ' + original, { loc: locInfo }); - } else if (part === '..') { - depth++; - depthString += '../'; - } - } else { - dig.push(part); - } - } - - return new this.PathExpression(data, depth, dig, original, locInfo); -} - -function prepareMustache(path, params, hash, open, strip, locInfo) { - // Must use charAt to support IE pre-10 - var escapeFlag = open.charAt(3) || open.charAt(2), - escaped = escapeFlag !== '{' && escapeFlag !== '&'; - - return new this.MustacheStatement(path, params, hash, escaped, strip, this.locInfo(locInfo)); -} - -function prepareRawBlock(openRawBlock, content, close, locInfo) { - if (openRawBlock.path.original !== close) { - var errorNode = { loc: openRawBlock.path.loc }; - - throw new _Exception2['default'](openRawBlock.path.original + ' doesn\'t match ' + close, errorNode); - } - - locInfo = this.locInfo(locInfo); - var program = new this.Program([content], null, {}, locInfo); - - return new this.BlockStatement(openRawBlock.path, openRawBlock.params, openRawBlock.hash, program, undefined, {}, {}, {}, locInfo); -} - -function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { - // When we are chaining inverse calls, we will not have a close path - if (close && close.path && openBlock.path.original !== close.path.original) { - var errorNode = { loc: openBlock.path.loc }; - - throw new _Exception2['default'](openBlock.path.original + ' doesn\'t match ' + close.path.original, errorNode); - } - - program.blockParams = openBlock.blockParams; - - var inverse = undefined, - inverseStrip = undefined; - - if (inverseAndProgram) { - if (inverseAndProgram.chain) { - inverseAndProgram.program.body[0].closeStrip = close.strip; - } - - inverseStrip = inverseAndProgram.strip; - inverse = inverseAndProgram.program; - } - - if (inverted) { - inverted = inverse; - inverse = program; - program = inverted; - } - - return new this.BlockStatement(openBlock.path, openBlock.params, openBlock.hash, program, inverse, openBlock.strip, inverseStrip, close && close.strip, this.locInfo(locInfo)); -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js deleted file mode 100644 index c77f270..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js +++ /dev/null @@ -1,1062 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; - -var _COMPILER_REVISION$REVISION_CHANGES = require('../base'); - -var _Exception = require('../exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -var _isArray = require('../utils'); - -var _CodeGen = require('./code-gen'); - -var _CodeGen2 = _interopRequireWildcard(_CodeGen); - -function Literal(value) { - this.value = value; -} - -function JavaScriptCompiler() {} - -JavaScriptCompiler.prototype = { - // PUBLIC API: You can override these methods in a subclass to provide - // alternative compiled forms for name lookup and buffering semantics - nameLookup: function nameLookup(parent, name /* , type*/) { - if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { - return [parent, '.', name]; - } else { - return [parent, '[\'', name, '\']']; - } - }, - depthedLookup: function depthedLookup(name) { - return [this.aliasable('this.lookup'), '(depths, "', name, '")']; - }, - - compilerInfo: function compilerInfo() { - var revision = _COMPILER_REVISION$REVISION_CHANGES.COMPILER_REVISION, - versions = _COMPILER_REVISION$REVISION_CHANGES.REVISION_CHANGES[revision]; - return [revision, versions]; - }, - - appendToBuffer: function appendToBuffer(source, location, explicit) { - // Force a source as this simplifies the merge logic. - if (!_isArray.isArray(source)) { - source = [source]; - } - source = this.source.wrap(source, location); - - if (this.environment.isSimple) { - return ['return ', source, ';']; - } else if (explicit) { - // This is a case where the buffer operation occurs as a child of another - // construct, generally braces. We have to explicitly output these buffer - // operations to ensure that the emitted code goes in the correct location. - return ['buffer += ', source, ';']; - } else { - source.appendToBuffer = true; - return source; - } - }, - - initializeBuffer: function initializeBuffer() { - return this.quotedString(''); - }, - // END PUBLIC API - - compile: function compile(environment, options, context, asObject) { - this.environment = environment; - this.options = options; - this.stringParams = this.options.stringParams; - this.trackIds = this.options.trackIds; - this.precompile = !asObject; - - this.name = this.environment.name; - this.isChild = !!context; - this.context = context || { - programs: [], - environments: [] - }; - - this.preamble(); - - this.stackSlot = 0; - this.stackVars = []; - this.aliases = {}; - this.registers = { list: [] }; - this.hashes = []; - this.compileStack = []; - this.inlineStack = []; - this.blockParams = []; - - this.compileChildren(environment, options); - - this.useDepths = this.useDepths || environment.useDepths || this.options.compat; - this.useBlockParams = this.useBlockParams || environment.useBlockParams; - - var opcodes = environment.opcodes, - opcode = undefined, - firstLoc = undefined, - i = undefined, - l = undefined; - - for (i = 0, l = opcodes.length; i < l; i++) { - opcode = opcodes[i]; - - this.source.currentLocation = opcode.loc; - firstLoc = firstLoc || opcode.loc; - this[opcode.opcode].apply(this, opcode.args); - } - - // Flush any trailing content that might be pending. - this.source.currentLocation = firstLoc; - this.pushSource(''); - - /* istanbul ignore next */ - if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { - throw new _Exception2['default']('Compile completed with content left on stack'); - } - - var fn = this.createFunctionContext(asObject); - if (!this.isChild) { - var ret = { - compiler: this.compilerInfo(), - main: fn - }; - var programs = this.context.programs; - for (i = 0, l = programs.length; i < l; i++) { - if (programs[i]) { - ret[i] = programs[i]; - } - } - - if (this.environment.usePartial) { - ret.usePartial = true; - } - if (this.options.data) { - ret.useData = true; - } - if (this.useDepths) { - ret.useDepths = true; - } - if (this.useBlockParams) { - ret.useBlockParams = true; - } - if (this.options.compat) { - ret.compat = true; - } - - if (!asObject) { - ret.compiler = JSON.stringify(ret.compiler); - - this.source.currentLocation = { start: { line: 1, column: 0 } }; - ret = this.objectLiteral(ret); - - if (options.srcName) { - ret = ret.toStringWithSourceMap({ file: options.destName }); - ret.map = ret.map && ret.map.toString(); - } else { - ret = ret.toString(); - } - } else { - ret.compilerOptions = this.options; - } - - return ret; - } else { - return fn; - } - }, - - preamble: function preamble() { - // track the last context pushed into place to allow skipping the - // getContext opcode when it would be a noop - this.lastContext = 0; - this.source = new _CodeGen2['default'](this.options.srcName); - }, - - createFunctionContext: function createFunctionContext(asObject) { - var varDeclarations = ''; - - var locals = this.stackVars.concat(this.registers.list); - if (locals.length > 0) { - varDeclarations += ', ' + locals.join(', '); - } - - // Generate minimizer alias mappings - // - // When using true SourceNodes, this will update all references to the given alias - // as the source nodes are reused in situ. For the non-source node compilation mode, - // aliases will not be used, but this case is already being run on the client and - // we aren't concern about minimizing the template size. - var aliasCount = 0; - for (var alias in this.aliases) { - // eslint-disable-line guard-for-in - var node = this.aliases[alias]; - - if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) { - varDeclarations += ', alias' + ++aliasCount + '=' + alias; - node.children[0] = 'alias' + aliasCount; - } - } - - var params = ['depth0', 'helpers', 'partials', 'data']; - - if (this.useBlockParams || this.useDepths) { - params.push('blockParams'); - } - if (this.useDepths) { - params.push('depths'); - } - - // Perform a second pass over the output to merge content when possible - var source = this.mergeSource(varDeclarations); - - if (asObject) { - params.push(source); - - return Function.apply(this, params); - } else { - return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); - } - }, - mergeSource: function mergeSource(varDeclarations) { - var isSimple = this.environment.isSimple, - appendOnly = !this.forceBuffer, - appendFirst = undefined, - sourceSeen = undefined, - bufferStart = undefined, - bufferEnd = undefined; - this.source.each(function (line) { - if (line.appendToBuffer) { - if (bufferStart) { - line.prepend(' + '); - } else { - bufferStart = line; - } - bufferEnd = line; - } else { - if (bufferStart) { - if (!sourceSeen) { - appendFirst = true; - } else { - bufferStart.prepend('buffer += '); - } - bufferEnd.add(';'); - bufferStart = bufferEnd = undefined; - } - - sourceSeen = true; - if (!isSimple) { - appendOnly = false; - } - } - }); - - if (appendOnly) { - if (bufferStart) { - bufferStart.prepend('return '); - bufferEnd.add(';'); - } else if (!sourceSeen) { - this.source.push('return "";'); - } - } else { - varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); - - if (bufferStart) { - bufferStart.prepend('return buffer + '); - bufferEnd.add(';'); - } else { - this.source.push('return buffer;'); - } - } - - if (varDeclarations) { - this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); - } - - return this.source.merge(); - }, - - // [blockValue] - // - // On stack, before: hash, inverse, program, value - // On stack, after: return value of blockHelperMissing - // - // The purpose of this opcode is to take a block of the form - // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and - // replace it on the stack with the result of properly - // invoking blockHelperMissing. - blockValue: function blockValue(name) { - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs(name, 0, params); - - var blockName = this.popStack(); - params.splice(1, 0, blockName); - - this.push(this.source.functionCall(blockHelperMissing, 'call', params)); - }, - - // [ambiguousBlockValue] - // - // On stack, before: hash, inverse, program, value - // Compiler value, before: lastHelper=value of last found helper, if any - // On stack, after, if no lastHelper: same as [blockValue] - // On stack, after, if lastHelper: value - ambiguousBlockValue: function ambiguousBlockValue() { - // We're being a bit cheeky and reusing the options value from the prior exec - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs('', 0, params, true); - - this.flushInline(); - - var current = this.topStack(); - params.splice(1, 0, current); - - this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']); - }, - - // [appendContent] - // - // On stack, before: ... - // On stack, after: ... - // - // Appends the string value of `content` to the current buffer - appendContent: function appendContent(content) { - if (this.pendingContent) { - content = this.pendingContent + content; - } else { - this.pendingLocation = this.source.currentLocation; - } - - this.pendingContent = content; - }, - - // [append] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Coerces `value` to a String and appends it to the current buffer. - // - // If `value` is truthy, or 0, it is coerced into a string and appended - // Otherwise, the empty string is appended - append: function append() { - if (this.isInline()) { - this.replaceStack(function (current) { - return [' != null ? ', current, ' : ""']; - }); - - this.pushSource(this.appendToBuffer(this.popStack())); - } else { - var local = this.popStack(); - this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); - if (this.environment.isSimple) { - this.pushSource(['else { ', this.appendToBuffer('\'\'', undefined, true), ' }']); - } - } - }, - - // [appendEscaped] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Escape `value` and append it to the buffer - appendEscaped: function appendEscaped() { - this.pushSource(this.appendToBuffer([this.aliasable('this.escapeExpression'), '(', this.popStack(), ')'])); - }, - - // [getContext] - // - // On stack, before: ... - // On stack, after: ... - // Compiler value, after: lastContext=depth - // - // Set the value of the `lastContext` compiler value to the depth - getContext: function getContext(depth) { - this.lastContext = depth; - }, - - // [pushContext] - // - // On stack, before: ... - // On stack, after: currentContext, ... - // - // Pushes the value of the current context onto the stack. - pushContext: function pushContext() { - this.pushStackLiteral(this.contextName(this.lastContext)); - }, - - // [lookupOnContext] - // - // On stack, before: ... - // On stack, after: currentContext[name], ... - // - // Looks up the value of `name` on the current context and pushes - // it onto the stack. - lookupOnContext: function lookupOnContext(parts, falsy, scoped) { - var i = 0; - - if (!scoped && this.options.compat && !this.lastContext) { - // The depthed query is expected to handle the undefined logic for the root level that - // is implemented below, so we evaluate that directly in compat mode - this.push(this.depthedLookup(parts[i++])); - } else { - this.pushContext(); - } - - this.resolvePath('context', parts, i, falsy); - }, - - // [lookupBlockParam] - // - // On stack, before: ... - // On stack, after: blockParam[name], ... - // - // Looks up the value of `parts` on the given block param and pushes - // it onto the stack. - lookupBlockParam: function lookupBlockParam(blockParamId, parts) { - this.useBlockParams = true; - - this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); - this.resolvePath('context', parts, 1); - }, - - // [lookupData] - // - // On stack, before: ... - // On stack, after: data, ... - // - // Push the data lookup operator - lookupData: function lookupData(depth, parts) { - if (!depth) { - this.pushStackLiteral('data'); - } else { - this.pushStackLiteral('this.data(data, ' + depth + ')'); - } - - this.resolvePath('data', parts, 0, true); - }, - - resolvePath: function resolvePath(type, parts, i, falsy) { - var _this = this; - - if (this.options.strict || this.options.assumeObjects) { - this.push(strictLookup(this.options.strict, this, parts, type)); - return; - } - - var len = parts.length; - for (; i < len; i++) { - /*eslint-disable no-loop-func */ - this.replaceStack(function (current) { - var lookup = _this.nameLookup(current, parts[i], type); - // We want to ensure that zero and false are handled properly if the context (falsy flag) - // needs to have the special handling for these values. - if (!falsy) { - return [' != null ? ', lookup, ' : ', current]; - } else { - // Otherwise we can use generic falsy handling - return [' && ', lookup]; - } - }); - /*eslint-enable no-loop-func */ - } - }, - - // [resolvePossibleLambda] - // - // On stack, before: value, ... - // On stack, after: resolved value, ... - // - // If the `value` is a lambda, replace it on the stack by - // the return value of the lambda - resolvePossibleLambda: function resolvePossibleLambda() { - this.push([this.aliasable('this.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); - }, - - // [pushStringParam] - // - // On stack, before: ... - // On stack, after: string, currentContext, ... - // - // This opcode is designed for use in string mode, which - // provides the string value of a parameter along with its - // depth rather than resolving it immediately. - pushStringParam: function pushStringParam(string, type) { - this.pushContext(); - this.pushString(type); - - // If it's a subexpression, the string result - // will be pushed after this opcode. - if (type !== 'SubExpression') { - if (typeof string === 'string') { - this.pushString(string); - } else { - this.pushStackLiteral(string); - } - } - }, - - emptyHash: function emptyHash(omitEmpty) { - if (this.trackIds) { - this.push('{}'); // hashIds - } - if (this.stringParams) { - this.push('{}'); // hashContexts - this.push('{}'); // hashTypes - } - this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); - }, - pushHash: function pushHash() { - if (this.hash) { - this.hashes.push(this.hash); - } - this.hash = { values: [], types: [], contexts: [], ids: [] }; - }, - popHash: function popHash() { - var hash = this.hash; - this.hash = this.hashes.pop(); - - if (this.trackIds) { - this.push(this.objectLiteral(hash.ids)); - } - if (this.stringParams) { - this.push(this.objectLiteral(hash.contexts)); - this.push(this.objectLiteral(hash.types)); - } - - this.push(this.objectLiteral(hash.values)); - }, - - // [pushString] - // - // On stack, before: ... - // On stack, after: quotedString(string), ... - // - // Push a quoted version of `string` onto the stack - pushString: function pushString(string) { - this.pushStackLiteral(this.quotedString(string)); - }, - - // [pushLiteral] - // - // On stack, before: ... - // On stack, after: value, ... - // - // Pushes a value onto the stack. This operation prevents - // the compiler from creating a temporary variable to hold - // it. - pushLiteral: function pushLiteral(value) { - this.pushStackLiteral(value); - }, - - // [pushProgram] - // - // On stack, before: ... - // On stack, after: program(guid), ... - // - // Push a program expression onto the stack. This takes - // a compile-time guid and converts it into a runtime-accessible - // expression. - pushProgram: function pushProgram(guid) { - if (guid != null) { - this.pushStackLiteral(this.programExpression(guid)); - } else { - this.pushStackLiteral(null); - } - }, - - // [invokeHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // Pops off the helper's parameters, invokes the helper, - // and pushes the helper's return value onto the stack. - // - // If the helper is not found, `helperMissing` is called. - invokeHelper: function invokeHelper(paramSize, name, isSimple) { - var nonHelper = this.popStack(), - helper = this.setupHelper(paramSize, name), - simple = isSimple ? [helper.name, ' || '] : ''; - - var lookup = ['('].concat(simple, nonHelper); - if (!this.options.strict) { - lookup.push(' || ', this.aliasable('helpers.helperMissing')); - } - lookup.push(')'); - - this.push(this.source.functionCall(lookup, 'call', helper.callParams)); - }, - - // [invokeKnownHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // This operation is used when the helper is known to exist, - // so a `helperMissing` fallback is not required. - invokeKnownHelper: function invokeKnownHelper(paramSize, name) { - var helper = this.setupHelper(paramSize, name); - this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); - }, - - // [invokeAmbiguous] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of disambiguation - // - // This operation is used when an expression like `{{foo}}` - // is provided, but we don't know at compile-time whether it - // is a helper or a path. - // - // This operation emits more code than the other options, - // and can be avoided by passing the `knownHelpers` and - // `knownHelpersOnly` flags at compile-time. - invokeAmbiguous: function invokeAmbiguous(name, helperCall) { - this.useRegister('helper'); - - var nonHelper = this.popStack(); - - this.emptyHash(); - var helper = this.setupHelper(0, name, helperCall); - - var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); - - var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; - if (!this.options.strict) { - lookup[0] = '(helper = '; - lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing')); - } - - this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']); - }, - - // [invokePartial] - // - // On stack, before: context, ... - // On stack after: result of partial invocation - // - // This operation pops off a context, invokes a partial with that context, - // and pushes the result of the invocation back. - invokePartial: function invokePartial(isDynamic, name, indent) { - var params = [], - options = this.setupParams(name, 1, params, false); - - if (isDynamic) { - name = this.popStack(); - delete options.name; - } - - if (indent) { - options.indent = JSON.stringify(indent); - } - options.helpers = 'helpers'; - options.partials = 'partials'; - - if (!isDynamic) { - params.unshift(this.nameLookup('partials', name, 'partial')); - } else { - params.unshift(name); - } - - if (this.options.compat) { - options.depths = 'depths'; - } - options = this.objectLiteral(options); - params.push(options); - - this.push(this.source.functionCall('this.invokePartial', '', params)); - }, - - // [assignToHash] - // - // On stack, before: value, ..., hash, ... - // On stack, after: ..., hash, ... - // - // Pops a value off the stack and assigns it to the current hash - assignToHash: function assignToHash(key) { - var value = this.popStack(), - context = undefined, - type = undefined, - id = undefined; - - if (this.trackIds) { - id = this.popStack(); - } - if (this.stringParams) { - type = this.popStack(); - context = this.popStack(); - } - - var hash = this.hash; - if (context) { - hash.contexts[key] = context; - } - if (type) { - hash.types[key] = type; - } - if (id) { - hash.ids[key] = id; - } - hash.values[key] = value; - }, - - pushId: function pushId(type, name, child) { - if (type === 'BlockParam') { - this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : '')); - } else if (type === 'PathExpression') { - this.pushString(name); - } else if (type === 'SubExpression') { - this.pushStackLiteral('true'); - } else { - this.pushStackLiteral('null'); - } - }, - - // HELPERS - - compiler: JavaScriptCompiler, - - compileChildren: function compileChildren(environment, options) { - var children = environment.children, - child = undefined, - compiler = undefined; - - for (var i = 0, l = children.length; i < l; i++) { - child = children[i]; - compiler = new this.compiler(); // eslint-disable-line new-cap - - var index = this.matchExistingProgram(child); - - if (index == null) { - this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children - index = this.context.programs.length; - child.index = index; - child.name = 'program' + index; - this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); - this.context.environments[index] = child; - - this.useDepths = this.useDepths || compiler.useDepths; - this.useBlockParams = this.useBlockParams || compiler.useBlockParams; - } else { - child.index = index; - child.name = 'program' + index; - - this.useDepths = this.useDepths || child.useDepths; - this.useBlockParams = this.useBlockParams || child.useBlockParams; - } - } - }, - matchExistingProgram: function matchExistingProgram(child) { - for (var i = 0, len = this.context.environments.length; i < len; i++) { - var environment = this.context.environments[i]; - if (environment && environment.equals(child)) { - return i; - } - } - }, - - programExpression: function programExpression(guid) { - var child = this.environment.children[guid], - programParams = [child.index, 'data', child.blockParams]; - - if (this.useBlockParams || this.useDepths) { - programParams.push('blockParams'); - } - if (this.useDepths) { - programParams.push('depths'); - } - - return 'this.program(' + programParams.join(', ') + ')'; - }, - - useRegister: function useRegister(name) { - if (!this.registers[name]) { - this.registers[name] = true; - this.registers.list.push(name); - } - }, - - push: function push(expr) { - if (!(expr instanceof Literal)) { - expr = this.source.wrap(expr); - } - - this.inlineStack.push(expr); - return expr; - }, - - pushStackLiteral: function pushStackLiteral(item) { - this.push(new Literal(item)); - }, - - pushSource: function pushSource(source) { - if (this.pendingContent) { - this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); - this.pendingContent = undefined; - } - - if (source) { - this.source.push(source); - } - }, - - replaceStack: function replaceStack(callback) { - var prefix = ['('], - stack = undefined, - createdStack = undefined, - usedLiteral = undefined; - - /* istanbul ignore next */ - if (!this.isInline()) { - throw new _Exception2['default']('replaceStack on non-inline'); - } - - // We want to merge the inline statement into the replacement statement via ',' - var top = this.popStack(true); - - if (top instanceof Literal) { - // Literals do not need to be inlined - stack = [top.value]; - prefix = ['(', stack]; - usedLiteral = true; - } else { - // Get or create the current stack name for use by the inline - createdStack = true; - var _name = this.incrStack(); - - prefix = ['((', this.push(_name), ' = ', top, ')']; - stack = this.topStack(); - } - - var item = callback.call(this, stack); - - if (!usedLiteral) { - this.popStack(); - } - if (createdStack) { - this.stackSlot--; - } - this.push(prefix.concat(item, ')')); - }, - - incrStack: function incrStack() { - this.stackSlot++; - if (this.stackSlot > this.stackVars.length) { - this.stackVars.push('stack' + this.stackSlot); - } - return this.topStackName(); - }, - topStackName: function topStackName() { - return 'stack' + this.stackSlot; - }, - flushInline: function flushInline() { - var inlineStack = this.inlineStack; - this.inlineStack = []; - for (var i = 0, len = inlineStack.length; i < len; i++) { - var entry = inlineStack[i]; - /* istanbul ignore if */ - if (entry instanceof Literal) { - this.compileStack.push(entry); - } else { - var stack = this.incrStack(); - this.pushSource([stack, ' = ', entry, ';']); - this.compileStack.push(stack); - } - } - }, - isInline: function isInline() { - return this.inlineStack.length; - }, - - popStack: function popStack(wrapped) { - var inline = this.isInline(), - item = (inline ? this.inlineStack : this.compileStack).pop(); - - if (!wrapped && item instanceof Literal) { - return item.value; - } else { - if (!inline) { - /* istanbul ignore next */ - if (!this.stackSlot) { - throw new _Exception2['default']('Invalid stack pop'); - } - this.stackSlot--; - } - return item; - } - }, - - topStack: function topStack() { - var stack = this.isInline() ? this.inlineStack : this.compileStack, - item = stack[stack.length - 1]; - - /* istanbul ignore if */ - if (item instanceof Literal) { - return item.value; - } else { - return item; - } - }, - - contextName: function contextName(context) { - if (this.useDepths && context) { - return 'depths[' + context + ']'; - } else { - return 'depth' + context; - } - }, - - quotedString: function quotedString(str) { - return this.source.quotedString(str); - }, - - objectLiteral: function objectLiteral(obj) { - return this.source.objectLiteral(obj); - }, - - aliasable: function aliasable(name) { - var ret = this.aliases[name]; - if (ret) { - ret.referenceCount++; - return ret; - } - - ret = this.aliases[name] = this.source.wrap(name); - ret.aliasable = true; - ret.referenceCount = 1; - - return ret; - }, - - setupHelper: function setupHelper(paramSize, name, blockHelper) { - var params = [], - paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); - var foundHelper = this.nameLookup('helpers', name, 'helper'); - - return { - params: params, - paramsInit: paramsInit, - name: foundHelper, - callParams: [this.contextName(0)].concat(params) - }; - }, - - setupParams: function setupParams(helper, paramSize, params) { - var options = {}, - contexts = [], - types = [], - ids = [], - param = undefined; - - options.name = this.quotedString(helper); - options.hash = this.popStack(); - - if (this.trackIds) { - options.hashIds = this.popStack(); - } - if (this.stringParams) { - options.hashTypes = this.popStack(); - options.hashContexts = this.popStack(); - } - - var inverse = this.popStack(), - program = this.popStack(); - - // Avoid setting fn and inverse if neither are set. This allows - // helpers to do a check for `if (options.fn)` - if (program || inverse) { - options.fn = program || 'this.noop'; - options.inverse = inverse || 'this.noop'; - } - - // The parameters go on to the stack in order (making sure that they are evaluated in order) - // so we need to pop them off the stack in reverse order - var i = paramSize; - while (i--) { - param = this.popStack(); - params[i] = param; - - if (this.trackIds) { - ids[i] = this.popStack(); - } - if (this.stringParams) { - types[i] = this.popStack(); - contexts[i] = this.popStack(); - } - } - - if (this.trackIds) { - options.ids = this.source.generateArray(ids); - } - if (this.stringParams) { - options.types = this.source.generateArray(types); - options.contexts = this.source.generateArray(contexts); - } - - if (this.options.data) { - options.data = 'data'; - } - if (this.useBlockParams) { - options.blockParams = 'blockParams'; - } - return options; - }, - - setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) { - var options = this.setupParams(helper, paramSize, params, true); - options = this.objectLiteral(options); - if (useRegister) { - this.useRegister('options'); - params.push('options'); - return ['options=', options]; - } else { - params.push(options); - return ''; - } - } -}; - -(function () { - var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' '); - - var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; - - for (var i = 0, l = reservedWords.length; i < l; i++) { - compilerWords[reservedWords[i]] = true; - } -})(); - -JavaScriptCompiler.isValidJavaScriptVariableName = function (name) { - return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name); -}; - -function strictLookup(requireTerminal, compiler, parts, type) { - var stack = compiler.popStack(), - i = 0, - len = parts.length; - if (requireTerminal) { - len--; - } - - for (; i < len; i++) { - stack = compiler.nameLookup(stack, parts[i], type); - } - - if (requireTerminal) { - return [compiler.aliasable('this.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')']; - } else { - return stack; - } -} - -exports['default'] = JavaScriptCompiler; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js deleted file mode 100644 index c942f58..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js +++ /dev/null @@ -1,678 +0,0 @@ -"use strict"; - -exports.__esModule = true; -/* istanbul ignore next */ -/* Jison generated parser */ -var handlebars = (function () { - var parser = { trace: function trace() {}, - yy: {}, - symbols_: { error: 2, root: 3, program: 4, EOF: 5, program_repetition0: 6, statement: 7, mustache: 8, block: 9, rawBlock: 10, partial: 11, content: 12, COMMENT: 13, CONTENT: 14, openRawBlock: 15, END_RAW_BLOCK: 16, OPEN_RAW_BLOCK: 17, helperName: 18, openRawBlock_repetition0: 19, openRawBlock_option0: 20, CLOSE_RAW_BLOCK: 21, openBlock: 22, block_option0: 23, closeBlock: 24, openInverse: 25, block_option1: 26, OPEN_BLOCK: 27, openBlock_repetition0: 28, openBlock_option0: 29, openBlock_option1: 30, CLOSE: 31, OPEN_INVERSE: 32, openInverse_repetition0: 33, openInverse_option0: 34, openInverse_option1: 35, openInverseChain: 36, OPEN_INVERSE_CHAIN: 37, openInverseChain_repetition0: 38, openInverseChain_option0: 39, openInverseChain_option1: 40, inverseAndProgram: 41, INVERSE: 42, inverseChain: 43, inverseChain_option0: 44, OPEN_ENDBLOCK: 45, OPEN: 46, mustache_repetition0: 47, mustache_option0: 48, OPEN_UNESCAPED: 49, mustache_repetition1: 50, mustache_option1: 51, CLOSE_UNESCAPED: 52, OPEN_PARTIAL: 53, partialName: 54, partial_repetition0: 55, partial_option0: 56, param: 57, sexpr: 58, OPEN_SEXPR: 59, sexpr_repetition0: 60, sexpr_option0: 61, CLOSE_SEXPR: 62, hash: 63, hash_repetition_plus0: 64, hashSegment: 65, ID: 66, EQUALS: 67, blockParams: 68, OPEN_BLOCK_PARAMS: 69, blockParams_repetition_plus0: 70, CLOSE_BLOCK_PARAMS: 71, path: 72, dataName: 73, STRING: 74, NUMBER: 75, BOOLEAN: 76, UNDEFINED: 77, NULL: 78, DATA: 79, pathSegments: 80, SEP: 81, $accept: 0, $end: 1 }, - terminals_: { 2: "error", 5: "EOF", 13: "COMMENT", 14: "CONTENT", 16: "END_RAW_BLOCK", 17: "OPEN_RAW_BLOCK", 21: "CLOSE_RAW_BLOCK", 27: "OPEN_BLOCK", 31: "CLOSE", 32: "OPEN_INVERSE", 37: "OPEN_INVERSE_CHAIN", 42: "INVERSE", 45: "OPEN_ENDBLOCK", 46: "OPEN", 49: "OPEN_UNESCAPED", 52: "CLOSE_UNESCAPED", 53: "OPEN_PARTIAL", 59: "OPEN_SEXPR", 62: "CLOSE_SEXPR", 66: "ID", 67: "EQUALS", 69: "OPEN_BLOCK_PARAMS", 71: "CLOSE_BLOCK_PARAMS", 74: "STRING", 75: "NUMBER", 76: "BOOLEAN", 77: "UNDEFINED", 78: "NULL", 79: "DATA", 81: "SEP" }, - productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [12, 1], [10, 3], [15, 5], [9, 4], [9, 4], [22, 6], [25, 6], [36, 6], [41, 2], [43, 3], [43, 1], [24, 3], [8, 5], [8, 5], [11, 5], [57, 1], [57, 1], [58, 5], [63, 1], [65, 3], [68, 3], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [54, 1], [54, 1], [73, 2], [72, 1], [80, 3], [80, 1], [6, 0], [6, 2], [19, 0], [19, 2], [20, 0], [20, 1], [23, 0], [23, 1], [26, 0], [26, 1], [28, 0], [28, 2], [29, 0], [29, 1], [30, 0], [30, 1], [33, 0], [33, 2], [34, 0], [34, 1], [35, 0], [35, 1], [38, 0], [38, 2], [39, 0], [39, 1], [40, 0], [40, 1], [44, 0], [44, 1], [47, 0], [47, 2], [48, 0], [48, 1], [50, 0], [50, 2], [51, 0], [51, 1], [55, 0], [55, 2], [56, 0], [56, 1], [60, 0], [60, 2], [61, 0], [61, 1], [64, 1], [64, 2], [70, 1], [70, 2]], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { - - var $0 = $$.length - 1; - switch (yystate) { - case 1: - return $$[$0 - 1]; - break; - case 2: - this.$ = new yy.Program($$[$0], null, {}, yy.locInfo(this._$)); - break; - case 3: - this.$ = $$[$0]; - break; - case 4: - this.$ = $$[$0]; - break; - case 5: - this.$ = $$[$0]; - break; - case 6: - this.$ = $$[$0]; - break; - case 7: - this.$ = $$[$0]; - break; - case 8: - this.$ = new yy.CommentStatement(yy.stripComment($$[$0]), yy.stripFlags($$[$0], $$[$0]), yy.locInfo(this._$)); - break; - case 9: - this.$ = new yy.ContentStatement($$[$0], yy.locInfo(this._$)); - break; - case 10: - this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); - break; - case 11: - this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] }; - break; - case 12: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$); - break; - case 13: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$); - break; - case 14: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 15: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 16: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 17: - this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] }; - break; - case 18: - var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$), - program = new yy.Program([inverse], null, {}, yy.locInfo(this._$)); - program.chained = true; - - this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true }; - - break; - case 19: - this.$ = $$[$0]; - break; - case 20: - this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) }; - break; - case 21: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 22: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 23: - this.$ = new yy.PartialStatement($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.stripFlags($$[$0 - 4], $$[$0]), yy.locInfo(this._$)); - break; - case 24: - this.$ = $$[$0]; - break; - case 25: - this.$ = $$[$0]; - break; - case 26: - this.$ = new yy.SubExpression($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.locInfo(this._$)); - break; - case 27: - this.$ = new yy.Hash($$[$0], yy.locInfo(this._$)); - break; - case 28: - this.$ = new yy.HashPair(yy.id($$[$0 - 2]), $$[$0], yy.locInfo(this._$)); - break; - case 29: - this.$ = yy.id($$[$0 - 1]); - break; - case 30: - this.$ = $$[$0]; - break; - case 31: - this.$ = $$[$0]; - break; - case 32: - this.$ = new yy.StringLiteral($$[$0], yy.locInfo(this._$)); - break; - case 33: - this.$ = new yy.NumberLiteral($$[$0], yy.locInfo(this._$)); - break; - case 34: - this.$ = new yy.BooleanLiteral($$[$0], yy.locInfo(this._$)); - break; - case 35: - this.$ = new yy.UndefinedLiteral(yy.locInfo(this._$)); - break; - case 36: - this.$ = new yy.NullLiteral(yy.locInfo(this._$)); - break; - case 37: - this.$ = $$[$0]; - break; - case 38: - this.$ = $$[$0]; - break; - case 39: - this.$ = yy.preparePath(true, $$[$0], this._$); - break; - case 40: - this.$ = yy.preparePath(false, $$[$0], this._$); - break; - case 41: - $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2]; - break; - case 42: - this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }]; - break; - case 43: - this.$ = []; - break; - case 44: - $$[$0 - 1].push($$[$0]); - break; - case 45: - this.$ = []; - break; - case 46: - $$[$0 - 1].push($$[$0]); - break; - case 53: - this.$ = []; - break; - case 54: - $$[$0 - 1].push($$[$0]); - break; - case 59: - this.$ = []; - break; - case 60: - $$[$0 - 1].push($$[$0]); - break; - case 65: - this.$ = []; - break; - case 66: - $$[$0 - 1].push($$[$0]); - break; - case 73: - this.$ = []; - break; - case 74: - $$[$0 - 1].push($$[$0]); - break; - case 77: - this.$ = []; - break; - case 78: - $$[$0 - 1].push($$[$0]); - break; - case 81: - this.$ = []; - break; - case 82: - $$[$0 - 1].push($$[$0]); - break; - case 85: - this.$ = []; - break; - case 86: - $$[$0 - 1].push($$[$0]); - break; - case 89: - this.$ = [$$[$0]]; - break; - case 90: - $$[$0 - 1].push($$[$0]); - break; - case 91: - this.$ = [$$[$0]]; - break; - case 92: - $$[$0 - 1].push($$[$0]); - break; - } - }, - table: [{ 3: 1, 4: 2, 5: [2, 43], 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: [1, 11], 14: [1, 18], 15: 16, 17: [1, 21], 22: 14, 25: 15, 27: [1, 19], 32: [1, 20], 37: [2, 2], 42: [2, 2], 45: [2, 2], 46: [1, 12], 49: [1, 13], 53: [1, 17] }, { 1: [2, 1] }, { 5: [2, 44], 13: [2, 44], 14: [2, 44], 17: [2, 44], 27: [2, 44], 32: [2, 44], 37: [2, 44], 42: [2, 44], 45: [2, 44], 46: [2, 44], 49: [2, 44], 53: [2, 44] }, { 5: [2, 3], 13: [2, 3], 14: [2, 3], 17: [2, 3], 27: [2, 3], 32: [2, 3], 37: [2, 3], 42: [2, 3], 45: [2, 3], 46: [2, 3], 49: [2, 3], 53: [2, 3] }, { 5: [2, 4], 13: [2, 4], 14: [2, 4], 17: [2, 4], 27: [2, 4], 32: [2, 4], 37: [2, 4], 42: [2, 4], 45: [2, 4], 46: [2, 4], 49: [2, 4], 53: [2, 4] }, { 5: [2, 5], 13: [2, 5], 14: [2, 5], 17: [2, 5], 27: [2, 5], 32: [2, 5], 37: [2, 5], 42: [2, 5], 45: [2, 5], 46: [2, 5], 49: [2, 5], 53: [2, 5] }, { 5: [2, 6], 13: [2, 6], 14: [2, 6], 17: [2, 6], 27: [2, 6], 32: [2, 6], 37: [2, 6], 42: [2, 6], 45: [2, 6], 46: [2, 6], 49: [2, 6], 53: [2, 6] }, { 5: [2, 7], 13: [2, 7], 14: [2, 7], 17: [2, 7], 27: [2, 7], 32: [2, 7], 37: [2, 7], 42: [2, 7], 45: [2, 7], 46: [2, 7], 49: [2, 7], 53: [2, 7] }, { 5: [2, 8], 13: [2, 8], 14: [2, 8], 17: [2, 8], 27: [2, 8], 32: [2, 8], 37: [2, 8], 42: [2, 8], 45: [2, 8], 46: [2, 8], 49: [2, 8], 53: [2, 8] }, { 18: 22, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 33, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 34, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 4: 35, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 12: 36, 14: [1, 18] }, { 18: 38, 54: 37, 58: 39, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 9], 13: [2, 9], 14: [2, 9], 16: [2, 9], 17: [2, 9], 27: [2, 9], 32: [2, 9], 37: [2, 9], 42: [2, 9], 45: [2, 9], 46: [2, 9], 49: [2, 9], 53: [2, 9] }, { 18: 41, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 42, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 43, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [2, 73], 47: 44, 59: [2, 73], 66: [2, 73], 74: [2, 73], 75: [2, 73], 76: [2, 73], 77: [2, 73], 78: [2, 73], 79: [2, 73] }, { 21: [2, 30], 31: [2, 30], 52: [2, 30], 59: [2, 30], 62: [2, 30], 66: [2, 30], 69: [2, 30], 74: [2, 30], 75: [2, 30], 76: [2, 30], 77: [2, 30], 78: [2, 30], 79: [2, 30] }, { 21: [2, 31], 31: [2, 31], 52: [2, 31], 59: [2, 31], 62: [2, 31], 66: [2, 31], 69: [2, 31], 74: [2, 31], 75: [2, 31], 76: [2, 31], 77: [2, 31], 78: [2, 31], 79: [2, 31] }, { 21: [2, 32], 31: [2, 32], 52: [2, 32], 59: [2, 32], 62: [2, 32], 66: [2, 32], 69: [2, 32], 74: [2, 32], 75: [2, 32], 76: [2, 32], 77: [2, 32], 78: [2, 32], 79: [2, 32] }, { 21: [2, 33], 31: [2, 33], 52: [2, 33], 59: [2, 33], 62: [2, 33], 66: [2, 33], 69: [2, 33], 74: [2, 33], 75: [2, 33], 76: [2, 33], 77: [2, 33], 78: [2, 33], 79: [2, 33] }, { 21: [2, 34], 31: [2, 34], 52: [2, 34], 59: [2, 34], 62: [2, 34], 66: [2, 34], 69: [2, 34], 74: [2, 34], 75: [2, 34], 76: [2, 34], 77: [2, 34], 78: [2, 34], 79: [2, 34] }, { 21: [2, 35], 31: [2, 35], 52: [2, 35], 59: [2, 35], 62: [2, 35], 66: [2, 35], 69: [2, 35], 74: [2, 35], 75: [2, 35], 76: [2, 35], 77: [2, 35], 78: [2, 35], 79: [2, 35] }, { 21: [2, 36], 31: [2, 36], 52: [2, 36], 59: [2, 36], 62: [2, 36], 66: [2, 36], 69: [2, 36], 74: [2, 36], 75: [2, 36], 76: [2, 36], 77: [2, 36], 78: [2, 36], 79: [2, 36] }, { 21: [2, 40], 31: [2, 40], 52: [2, 40], 59: [2, 40], 62: [2, 40], 66: [2, 40], 69: [2, 40], 74: [2, 40], 75: [2, 40], 76: [2, 40], 77: [2, 40], 78: [2, 40], 79: [2, 40], 81: [1, 45] }, { 66: [1, 32], 80: 46 }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 50: 47, 52: [2, 77], 59: [2, 77], 66: [2, 77], 74: [2, 77], 75: [2, 77], 76: [2, 77], 77: [2, 77], 78: [2, 77], 79: [2, 77] }, { 23: 48, 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 49, 45: [2, 49] }, { 26: 54, 41: 55, 42: [1, 53], 45: [2, 51] }, { 16: [1, 56] }, { 31: [2, 81], 55: 57, 59: [2, 81], 66: [2, 81], 74: [2, 81], 75: [2, 81], 76: [2, 81], 77: [2, 81], 78: [2, 81], 79: [2, 81] }, { 31: [2, 37], 59: [2, 37], 66: [2, 37], 74: [2, 37], 75: [2, 37], 76: [2, 37], 77: [2, 37], 78: [2, 37], 79: [2, 37] }, { 31: [2, 38], 59: [2, 38], 66: [2, 38], 74: [2, 38], 75: [2, 38], 76: [2, 38], 77: [2, 38], 78: [2, 38], 79: [2, 38] }, { 18: 58, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 28: 59, 31: [2, 53], 59: [2, 53], 66: [2, 53], 69: [2, 53], 74: [2, 53], 75: [2, 53], 76: [2, 53], 77: [2, 53], 78: [2, 53], 79: [2, 53] }, { 31: [2, 59], 33: 60, 59: [2, 59], 66: [2, 59], 69: [2, 59], 74: [2, 59], 75: [2, 59], 76: [2, 59], 77: [2, 59], 78: [2, 59], 79: [2, 59] }, { 19: 61, 21: [2, 45], 59: [2, 45], 66: [2, 45], 74: [2, 45], 75: [2, 45], 76: [2, 45], 77: [2, 45], 78: [2, 45], 79: [2, 45] }, { 18: 65, 31: [2, 75], 48: 62, 57: 63, 58: 66, 59: [1, 40], 63: 64, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 66: [1, 70] }, { 21: [2, 39], 31: [2, 39], 52: [2, 39], 59: [2, 39], 62: [2, 39], 66: [2, 39], 69: [2, 39], 74: [2, 39], 75: [2, 39], 76: [2, 39], 77: [2, 39], 78: [2, 39], 79: [2, 39], 81: [1, 45] }, { 18: 65, 51: 71, 52: [2, 79], 57: 72, 58: 66, 59: [1, 40], 63: 73, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 24: 74, 45: [1, 75] }, { 45: [2, 50] }, { 4: 76, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 45: [2, 19] }, { 18: 77, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 78, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 24: 79, 45: [1, 75] }, { 45: [2, 52] }, { 5: [2, 10], 13: [2, 10], 14: [2, 10], 17: [2, 10], 27: [2, 10], 32: [2, 10], 37: [2, 10], 42: [2, 10], 45: [2, 10], 46: [2, 10], 49: [2, 10], 53: [2, 10] }, { 18: 65, 31: [2, 83], 56: 80, 57: 81, 58: 66, 59: [1, 40], 63: 82, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 59: [2, 85], 60: 83, 62: [2, 85], 66: [2, 85], 74: [2, 85], 75: [2, 85], 76: [2, 85], 77: [2, 85], 78: [2, 85], 79: [2, 85] }, { 18: 65, 29: 84, 31: [2, 55], 57: 85, 58: 66, 59: [1, 40], 63: 86, 64: 67, 65: 68, 66: [1, 69], 69: [2, 55], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 31: [2, 61], 34: 87, 57: 88, 58: 66, 59: [1, 40], 63: 89, 64: 67, 65: 68, 66: [1, 69], 69: [2, 61], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 20: 90, 21: [2, 47], 57: 91, 58: 66, 59: [1, 40], 63: 92, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [1, 93] }, { 31: [2, 74], 59: [2, 74], 66: [2, 74], 74: [2, 74], 75: [2, 74], 76: [2, 74], 77: [2, 74], 78: [2, 74], 79: [2, 74] }, { 31: [2, 76] }, { 21: [2, 24], 31: [2, 24], 52: [2, 24], 59: [2, 24], 62: [2, 24], 66: [2, 24], 69: [2, 24], 74: [2, 24], 75: [2, 24], 76: [2, 24], 77: [2, 24], 78: [2, 24], 79: [2, 24] }, { 21: [2, 25], 31: [2, 25], 52: [2, 25], 59: [2, 25], 62: [2, 25], 66: [2, 25], 69: [2, 25], 74: [2, 25], 75: [2, 25], 76: [2, 25], 77: [2, 25], 78: [2, 25], 79: [2, 25] }, { 21: [2, 27], 31: [2, 27], 52: [2, 27], 62: [2, 27], 65: 94, 66: [1, 95], 69: [2, 27] }, { 21: [2, 89], 31: [2, 89], 52: [2, 89], 62: [2, 89], 66: [2, 89], 69: [2, 89] }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 67: [1, 96], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 21: [2, 41], 31: [2, 41], 52: [2, 41], 59: [2, 41], 62: [2, 41], 66: [2, 41], 69: [2, 41], 74: [2, 41], 75: [2, 41], 76: [2, 41], 77: [2, 41], 78: [2, 41], 79: [2, 41], 81: [2, 41] }, { 52: [1, 97] }, { 52: [2, 78], 59: [2, 78], 66: [2, 78], 74: [2, 78], 75: [2, 78], 76: [2, 78], 77: [2, 78], 78: [2, 78], 79: [2, 78] }, { 52: [2, 80] }, { 5: [2, 12], 13: [2, 12], 14: [2, 12], 17: [2, 12], 27: [2, 12], 32: [2, 12], 37: [2, 12], 42: [2, 12], 45: [2, 12], 46: [2, 12], 49: [2, 12], 53: [2, 12] }, { 18: 98, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 100, 44: 99, 45: [2, 71] }, { 31: [2, 65], 38: 101, 59: [2, 65], 66: [2, 65], 69: [2, 65], 74: [2, 65], 75: [2, 65], 76: [2, 65], 77: [2, 65], 78: [2, 65], 79: [2, 65] }, { 45: [2, 17] }, { 5: [2, 13], 13: [2, 13], 14: [2, 13], 17: [2, 13], 27: [2, 13], 32: [2, 13], 37: [2, 13], 42: [2, 13], 45: [2, 13], 46: [2, 13], 49: [2, 13], 53: [2, 13] }, { 31: [1, 102] }, { 31: [2, 82], 59: [2, 82], 66: [2, 82], 74: [2, 82], 75: [2, 82], 76: [2, 82], 77: [2, 82], 78: [2, 82], 79: [2, 82] }, { 31: [2, 84] }, { 18: 65, 57: 104, 58: 66, 59: [1, 40], 61: 103, 62: [2, 87], 63: 105, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 30: 106, 31: [2, 57], 68: 107, 69: [1, 108] }, { 31: [2, 54], 59: [2, 54], 66: [2, 54], 69: [2, 54], 74: [2, 54], 75: [2, 54], 76: [2, 54], 77: [2, 54], 78: [2, 54], 79: [2, 54] }, { 31: [2, 56], 69: [2, 56] }, { 31: [2, 63], 35: 109, 68: 110, 69: [1, 108] }, { 31: [2, 60], 59: [2, 60], 66: [2, 60], 69: [2, 60], 74: [2, 60], 75: [2, 60], 76: [2, 60], 77: [2, 60], 78: [2, 60], 79: [2, 60] }, { 31: [2, 62], 69: [2, 62] }, { 21: [1, 111] }, { 21: [2, 46], 59: [2, 46], 66: [2, 46], 74: [2, 46], 75: [2, 46], 76: [2, 46], 77: [2, 46], 78: [2, 46], 79: [2, 46] }, { 21: [2, 48] }, { 5: [2, 21], 13: [2, 21], 14: [2, 21], 17: [2, 21], 27: [2, 21], 32: [2, 21], 37: [2, 21], 42: [2, 21], 45: [2, 21], 46: [2, 21], 49: [2, 21], 53: [2, 21] }, { 21: [2, 90], 31: [2, 90], 52: [2, 90], 62: [2, 90], 66: [2, 90], 69: [2, 90] }, { 67: [1, 96] }, { 18: 65, 57: 112, 58: 66, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 22], 13: [2, 22], 14: [2, 22], 17: [2, 22], 27: [2, 22], 32: [2, 22], 37: [2, 22], 42: [2, 22], 45: [2, 22], 46: [2, 22], 49: [2, 22], 53: [2, 22] }, { 31: [1, 113] }, { 45: [2, 18] }, { 45: [2, 72] }, { 18: 65, 31: [2, 67], 39: 114, 57: 115, 58: 66, 59: [1, 40], 63: 116, 64: 67, 65: 68, 66: [1, 69], 69: [2, 67], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 23], 13: [2, 23], 14: [2, 23], 17: [2, 23], 27: [2, 23], 32: [2, 23], 37: [2, 23], 42: [2, 23], 45: [2, 23], 46: [2, 23], 49: [2, 23], 53: [2, 23] }, { 62: [1, 117] }, { 59: [2, 86], 62: [2, 86], 66: [2, 86], 74: [2, 86], 75: [2, 86], 76: [2, 86], 77: [2, 86], 78: [2, 86], 79: [2, 86] }, { 62: [2, 88] }, { 31: [1, 118] }, { 31: [2, 58] }, { 66: [1, 120], 70: 119 }, { 31: [1, 121] }, { 31: [2, 64] }, { 14: [2, 11] }, { 21: [2, 28], 31: [2, 28], 52: [2, 28], 62: [2, 28], 66: [2, 28], 69: [2, 28] }, { 5: [2, 20], 13: [2, 20], 14: [2, 20], 17: [2, 20], 27: [2, 20], 32: [2, 20], 37: [2, 20], 42: [2, 20], 45: [2, 20], 46: [2, 20], 49: [2, 20], 53: [2, 20] }, { 31: [2, 69], 40: 122, 68: 123, 69: [1, 108] }, { 31: [2, 66], 59: [2, 66], 66: [2, 66], 69: [2, 66], 74: [2, 66], 75: [2, 66], 76: [2, 66], 77: [2, 66], 78: [2, 66], 79: [2, 66] }, { 31: [2, 68], 69: [2, 68] }, { 21: [2, 26], 31: [2, 26], 52: [2, 26], 59: [2, 26], 62: [2, 26], 66: [2, 26], 69: [2, 26], 74: [2, 26], 75: [2, 26], 76: [2, 26], 77: [2, 26], 78: [2, 26], 79: [2, 26] }, { 13: [2, 14], 14: [2, 14], 17: [2, 14], 27: [2, 14], 32: [2, 14], 37: [2, 14], 42: [2, 14], 45: [2, 14], 46: [2, 14], 49: [2, 14], 53: [2, 14] }, { 66: [1, 125], 71: [1, 124] }, { 66: [2, 91], 71: [2, 91] }, { 13: [2, 15], 14: [2, 15], 17: [2, 15], 27: [2, 15], 32: [2, 15], 42: [2, 15], 45: [2, 15], 46: [2, 15], 49: [2, 15], 53: [2, 15] }, { 31: [1, 126] }, { 31: [2, 70] }, { 31: [2, 29] }, { 66: [2, 92], 71: [2, 92] }, { 13: [2, 16], 14: [2, 16], 17: [2, 16], 27: [2, 16], 32: [2, 16], 37: [2, 16], 42: [2, 16], 45: [2, 16], 46: [2, 16], 49: [2, 16], 53: [2, 16] }], - defaultActions: { 4: [2, 1], 49: [2, 50], 51: [2, 19], 55: [2, 52], 64: [2, 76], 73: [2, 80], 78: [2, 17], 82: [2, 84], 92: [2, 48], 99: [2, 18], 100: [2, 72], 105: [2, 88], 107: [2, 58], 110: [2, 64], 111: [2, 11], 123: [2, 70], 124: [2, 29] }, - parseError: function parseError(str, hash) { - throw new Error(str); - }, - parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], - lstack = [], - table = this.table, - yytext = "", - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - this.yy.parser = this; - if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - var ranges = this.lexer.options && this.lexer.options.ranges; - if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError; - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - function lex() { - var token; - token = self.lexer.lex() || 1; - if (typeof token !== "number") { - token = self.symbols_[token] || token; - } - return token; - } - var symbol, - preErrorSymbol, - state, - action, - a, - r, - yyval = {}, - p, - len, - newState, - expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == "undefined") { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === "undefined" || !action.length || !action[0]) { - var errStr = ""; - if (!recovering) { - expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected }); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; - if (ranges) { - yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; - } - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; - } - }; - /* Jison generated lexer */ - var lexer = (function () { - var lexer = { EOF: 1, - parseError: function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, - setInput: function setInput(input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ""; - this.conditionStack = ["INITIAL"]; - this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; - if (this.options.ranges) this.yylloc.range = [0, 0]; - this.offset = 0; - return this; - }, - input: function input() { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) this.yylloc.range[1]++; - - this._input = this._input.slice(1); - return ch; - }, - unput: function unput(ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); - - if (lines.length - 1) this.yylineno -= lines.length - 1; - var r = this.yylloc.range; - - this.yylloc = { first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - return this; - }, - more: function more() { - this._more = true; - return this; - }, - less: function less(n) { - this.unput(this.match.slice(n)); - }, - pastInput: function pastInput() { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); - }, - upcomingInput: function upcomingInput() { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20 - next.length); - } - return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); - }, - showPosition: function showPosition() { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, - next: function next() { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, match, tempMatch, index, col, lines; - if (!this._more) { - this.yytext = ""; - this.match = ""; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = { first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) this.done = false; - if (token) { - return token; - } else { - return; - } - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { text: "", token: null, line: this.yylineno }); - } - }, - lex: function lex() { - var r = this.next(); - if (typeof r !== "undefined") { - return r; - } else { - return this.lex(); - } - }, - begin: function begin(condition) { - this.conditionStack.push(condition); - }, - popState: function popState() { - return this.conditionStack.pop(); - }, - _currentRules: function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - }, - topState: function topState() { - return this.conditionStack[this.conditionStack.length - 2]; - }, - pushState: function begin(condition) { - this.begin(condition); - } }; - lexer.options = {}; - lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { - - function strip(start, end) { - return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end); - } - - var YYSTATE = YY_START; - switch ($avoiding_name_collisions) { - case 0: - if (yy_.yytext.slice(-2) === "\\\\") { - strip(0, 1); - this.begin("mu"); - } else if (yy_.yytext.slice(-1) === "\\") { - strip(0, 1); - this.begin("emu"); - } else { - this.begin("mu"); - } - if (yy_.yytext) { - return 14; - }break; - case 1: - return 14; - break; - case 2: - this.popState(); - return 14; - - break; - case 3: - yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9); - this.popState(); - return 16; - - break; - case 4: - return 14; - break; - case 5: - this.popState(); - return 13; - - break; - case 6: - return 59; - break; - case 7: - return 62; - break; - case 8: - return 17; - break; - case 9: - this.popState(); - this.begin("raw"); - return 21; - - break; - case 10: - return 53; - break; - case 11: - return 27; - break; - case 12: - return 45; - break; - case 13: - this.popState();return 42; - break; - case 14: - this.popState();return 42; - break; - case 15: - return 32; - break; - case 16: - return 37; - break; - case 17: - return 49; - break; - case 18: - return 46; - break; - case 19: - this.unput(yy_.yytext); - this.popState(); - this.begin("com"); - - break; - case 20: - this.popState(); - return 13; - - break; - case 21: - return 46; - break; - case 22: - return 67; - break; - case 23: - return 66; - break; - case 24: - return 66; - break; - case 25: - return 81; - break; - case 26: - // ignore whitespace - break; - case 27: - this.popState();return 52; - break; - case 28: - this.popState();return 31; - break; - case 29: - yy_.yytext = strip(1, 2).replace(/\\"/g, "\"");return 74; - break; - case 30: - yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 74; - break; - case 31: - return 79; - break; - case 32: - return 76; - break; - case 33: - return 76; - break; - case 34: - return 77; - break; - case 35: - return 78; - break; - case 36: - return 75; - break; - case 37: - return 69; - break; - case 38: - return 71; - break; - case 39: - return 66; - break; - case 40: - return 66; - break; - case 41: - return "INVALID"; - break; - case 42: - return 5; - break; - } - }; - lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]*?(?=(\{\{\{\{\/)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[[^\]]*\])/, /^(?:.)/, /^(?:$)/]; - lexer.conditions = { mu: { rules: [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], inclusive: false }, emu: { rules: [2], inclusive: false }, com: { rules: [5], inclusive: false }, raw: { rules: [3, 4], inclusive: false }, INITIAL: { rules: [0, 1, 42], inclusive: true } }; - return lexer; - })(); - parser.lexer = lexer; - function Parser() { - this.yy = {}; - }Parser.prototype = parser;parser.Parser = Parser; - return new Parser(); -})();exports["default"] = handlebars; -module.exports = exports["default"]; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/printer.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/printer.js deleted file mode 100644 index 8caebf6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/printer.js +++ /dev/null @@ -1,165 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; -exports.print = print; -exports.PrintVisitor = PrintVisitor; -/*eslint-disable new-cap */ - -var _Visitor = require('./visitor'); - -var _Visitor2 = _interopRequireWildcard(_Visitor); - -function print(ast) { - return new PrintVisitor().accept(ast); -} - -function PrintVisitor() { - this.padding = 0; -} - -PrintVisitor.prototype = new _Visitor2['default'](); - -PrintVisitor.prototype.pad = function (string) { - var out = ''; - - for (var i = 0, l = this.padding; i < l; i++) { - out = out + ' '; - } - - out = out + string + '\n'; - return out; -}; - -PrintVisitor.prototype.Program = function (program) { - var out = '', - body = program.body, - i = undefined, - l = undefined; - - if (program.blockParams) { - var blockParams = 'BLOCK PARAMS: ['; - for (i = 0, l = program.blockParams.length; i < l; i++) { - blockParams += ' ' + program.blockParams[i]; - } - blockParams += ' ]'; - out += this.pad(blockParams); - } - - for (i = 0, l = body.length; i < l; i++) { - out = out + this.accept(body[i]); - } - - this.padding--; - - return out; -}; - -PrintVisitor.prototype.MustacheStatement = function (mustache) { - return this.pad('{{ ' + this.SubExpression(mustache) + ' }}'); -}; - -PrintVisitor.prototype.BlockStatement = function (block) { - var out = ''; - - out = out + this.pad('BLOCK:'); - this.padding++; - out = out + this.pad(this.SubExpression(block)); - if (block.program) { - out = out + this.pad('PROGRAM:'); - this.padding++; - out = out + this.accept(block.program); - this.padding--; - } - if (block.inverse) { - if (block.program) { - this.padding++; - } - out = out + this.pad('{{^}}'); - this.padding++; - out = out + this.accept(block.inverse); - this.padding--; - if (block.program) { - this.padding--; - } - } - this.padding--; - - return out; -}; - -PrintVisitor.prototype.PartialStatement = function (partial) { - var content = 'PARTIAL:' + partial.name.original; - if (partial.params[0]) { - content += ' ' + this.accept(partial.params[0]); - } - if (partial.hash) { - content += ' ' + this.accept(partial.hash); - } - return this.pad('{{> ' + content + ' }}'); -}; - -PrintVisitor.prototype.ContentStatement = function (content) { - return this.pad('CONTENT[ \'' + content.value + '\' ]'); -}; - -PrintVisitor.prototype.CommentStatement = function (comment) { - return this.pad('{{! \'' + comment.value + '\' }}'); -}; - -PrintVisitor.prototype.SubExpression = function (sexpr) { - var params = sexpr.params, - paramStrings = [], - hash = undefined; - - for (var i = 0, l = params.length; i < l; i++) { - paramStrings.push(this.accept(params[i])); - } - - params = '[' + paramStrings.join(', ') + ']'; - - hash = sexpr.hash ? ' ' + this.accept(sexpr.hash) : ''; - - return this.accept(sexpr.path) + ' ' + params + hash; -}; - -PrintVisitor.prototype.PathExpression = function (id) { - var path = id.parts.join('/'); - return (id.data ? '@' : '') + 'PATH:' + path; -}; - -PrintVisitor.prototype.StringLiteral = function (string) { - return '"' + string.value + '"'; -}; - -PrintVisitor.prototype.NumberLiteral = function (number) { - return 'NUMBER{' + number.value + '}'; -}; - -PrintVisitor.prototype.BooleanLiteral = function (bool) { - return 'BOOLEAN{' + bool.value + '}'; -}; - -PrintVisitor.prototype.UndefinedLiteral = function () { - return 'UNDEFINED'; -}; - -PrintVisitor.prototype.NullLiteral = function () { - return 'NULL'; -}; - -PrintVisitor.prototype.Hash = function (hash) { - var pairs = hash.pairs, - joinedPairs = []; - - for (var i = 0, l = pairs.length; i < l; i++) { - joinedPairs.push(this.accept(pairs[i])); - } - - return 'HASH{' + joinedPairs.join(', ') + '}'; -}; -PrintVisitor.prototype.HashPair = function (pair) { - return pair.key + '=' + this.accept(pair.value); -}; -/*eslint-enable new-cap */ \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js deleted file mode 100644 index d5a909b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/visitor.js +++ /dev/null @@ -1,132 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; - -var _Exception = require('../exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -var _AST = require('./ast'); - -var _AST2 = _interopRequireWildcard(_AST); - -function Visitor() { - this.parents = []; -} - -Visitor.prototype = { - constructor: Visitor, - mutating: false, - - // Visits a given value. If mutating, will replace the value if necessary. - acceptKey: function acceptKey(node, name) { - var value = this.accept(node[name]); - if (this.mutating) { - // Hacky sanity check: - if (value && (!value.type || !_AST2['default'][value.type])) { - throw new _Exception2['default']('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); - } - node[name] = value; - } - }, - - // Performs an accept operation with added sanity check to ensure - // required keys are not removed. - acceptRequired: function acceptRequired(node, name) { - this.acceptKey(node, name); - - if (!node[name]) { - throw new _Exception2['default'](node.type + ' requires ' + name); - } - }, - - // Traverses a given array. If mutating, empty respnses will be removed - // for child elements. - acceptArray: function acceptArray(array) { - for (var i = 0, l = array.length; i < l; i++) { - this.acceptKey(array, i); - - if (!array[i]) { - array.splice(i, 1); - i--; - l--; - } - } - }, - - accept: function accept(object) { - if (!object) { - return; - } - - if (this.current) { - this.parents.unshift(this.current); - } - this.current = object; - - var ret = this[object.type](object); - - this.current = this.parents.shift(); - - if (!this.mutating || ret) { - return ret; - } else if (ret !== false) { - return object; - } - }, - - Program: function Program(program) { - this.acceptArray(program.body); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.acceptRequired(mustache, 'path'); - this.acceptArray(mustache.params); - this.acceptKey(mustache, 'hash'); - }, - - BlockStatement: function BlockStatement(block) { - this.acceptRequired(block, 'path'); - this.acceptArray(block.params); - this.acceptKey(block, 'hash'); - - this.acceptKey(block, 'program'); - this.acceptKey(block, 'inverse'); - }, - - PartialStatement: function PartialStatement(partial) { - this.acceptRequired(partial, 'name'); - this.acceptArray(partial.params); - this.acceptKey(partial, 'hash'); - }, - - ContentStatement: function ContentStatement() {}, - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - this.acceptRequired(sexpr, 'path'); - this.acceptArray(sexpr.params); - this.acceptKey(sexpr, 'hash'); - }, - - PathExpression: function PathExpression() {}, - - StringLiteral: function StringLiteral() {}, - NumberLiteral: function NumberLiteral() {}, - BooleanLiteral: function BooleanLiteral() {}, - UndefinedLiteral: function UndefinedLiteral() {}, - NullLiteral: function NullLiteral() {}, - - Hash: function Hash(hash) { - this.acceptArray(hash.pairs); - }, - HashPair: function HashPair(pair) { - this.acceptRequired(pair, 'value'); - } -}; - -exports['default'] = Visitor; -module.exports = exports['default']; -/* content */ /* comment */ /* path */ /* string */ /* number */ /* bool */ /* literal */ /* literal */ \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js deleted file mode 100644 index a8bc936..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/compiler/whitespace-control.js +++ /dev/null @@ -1,212 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; - -var _Visitor = require('./visitor'); - -var _Visitor2 = _interopRequireWildcard(_Visitor); - -function WhitespaceControl() {} -WhitespaceControl.prototype = new _Visitor2['default'](); - -WhitespaceControl.prototype.Program = function (program) { - var isRoot = !this.isRootSeen; - this.isRootSeen = true; - - var body = program.body; - for (var i = 0, l = body.length; i < l; i++) { - var current = body[i], - strip = this.accept(current); - - if (!strip) { - continue; - } - - var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), - _isNextWhitespace = isNextWhitespace(body, i, isRoot), - openStandalone = strip.openStandalone && _isPrevWhitespace, - closeStandalone = strip.closeStandalone && _isNextWhitespace, - inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; - - if (strip.close) { - omitRight(body, i, true); - } - if (strip.open) { - omitLeft(body, i, true); - } - - if (inlineStandalone) { - omitRight(body, i); - - if (omitLeft(body, i)) { - // If we are on a standalone node, save the indent info for partials - if (current.type === 'PartialStatement') { - // Pull out the whitespace from the final line - current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1]; - } - } - } - if (openStandalone) { - omitRight((current.program || current.inverse).body); - - // Strip out the previous content node if it's whitespace only - omitLeft(body, i); - } - if (closeStandalone) { - // Always strip the next node - omitRight(body, i); - - omitLeft((current.inverse || current.program).body); - } - } - - return program; -}; -WhitespaceControl.prototype.BlockStatement = function (block) { - this.accept(block.program); - this.accept(block.inverse); - - // Find the inverse program that is involed with whitespace stripping. - var program = block.program || block.inverse, - inverse = block.program && block.inverse, - firstInverse = inverse, - lastInverse = inverse; - - if (inverse && inverse.chained) { - firstInverse = inverse.body[0].program; - - // Walk the inverse chain to find the last inverse that is actually in the chain. - while (lastInverse.chained) { - lastInverse = lastInverse.body[lastInverse.body.length - 1].program; - } - } - - var strip = { - open: block.openStrip.open, - close: block.closeStrip.close, - - // Determine the standalone candiacy. Basically flag our content as being possibly standalone - // so our parent can determine if we actually are standalone - openStandalone: isNextWhitespace(program.body), - closeStandalone: isPrevWhitespace((firstInverse || program).body) - }; - - if (block.openStrip.close) { - omitRight(program.body, null, true); - } - - if (inverse) { - var inverseStrip = block.inverseStrip; - - if (inverseStrip.open) { - omitLeft(program.body, null, true); - } - - if (inverseStrip.close) { - omitRight(firstInverse.body, null, true); - } - if (block.closeStrip.open) { - omitLeft(lastInverse.body, null, true); - } - - // Find standalone else statments - if (isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) { - omitLeft(program.body); - omitRight(firstInverse.body); - } - } else if (block.closeStrip.open) { - omitLeft(program.body, null, true); - } - - return strip; -}; - -WhitespaceControl.prototype.MustacheStatement = function (mustache) { - return mustache.strip; -}; - -WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) { - /* istanbul ignore next */ - var strip = node.strip || {}; - return { - inlineStandalone: true, - open: strip.open, - close: strip.close - }; -}; - -function isPrevWhitespace(body, i, isRoot) { - if (i === undefined) { - i = body.length; - } - - // Nodes that end with newlines are considered whitespace (but are special - // cased for strip operations) - var prev = body[i - 1], - sibling = body[i - 2]; - if (!prev) { - return isRoot; - } - - if (prev.type === 'ContentStatement') { - return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original); - } -} -function isNextWhitespace(body, i, isRoot) { - if (i === undefined) { - i = -1; - } - - var next = body[i + 1], - sibling = body[i + 2]; - if (!next) { - return isRoot; - } - - if (next.type === 'ContentStatement') { - return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original); - } -} - -// Marks the node to the right of the position as omitted. -// I.e. {{foo}}' ' will mark the ' ' node as omitted. -// -// If i is undefined, then the first child will be marked as such. -// -// If mulitple is truthy then all whitespace will be stripped out until non-whitespace -// content is met. -function omitRight(body, i, multiple) { - var current = body[i == null ? 0 : i + 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) { - return; - } - - var original = current.value; - current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, ''); - current.rightStripped = current.value !== original; -} - -// Marks the node to the left of the position as omitted. -// I.e. ' '{{foo}} will mark the ' ' node as omitted. -// -// If i is undefined then the last child will be marked as such. -// -// If mulitple is truthy then all whitespace will be stripped out until non-whitespace -// content is met. -function omitLeft(body, i, multiple) { - var current = body[i == null ? body.length - 1 : i - 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) { - return; - } - - // We omit the last node if it's whitespace only and not preceeded by a non-content node. - var original = current.value; - current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, ''); - current.leftStripped = current.value !== original; - return current.leftStripped; -} - -exports['default'] = WhitespaceControl; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/exception.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/exception.js deleted file mode 100644 index 9bf550a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/exception.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -exports.__esModule = true; - -var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - -function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } -} - -Exception.prototype = new Error(); - -exports['default'] = Exception; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/no-conflict.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/no-conflict.js deleted file mode 100644 index 149e421..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/no-conflict.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -exports.__esModule = true; -/*global window */ - -exports['default'] = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; -}; - -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/runtime.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/runtime.js deleted file mode 100644 index 188ac80..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/runtime.js +++ /dev/null @@ -1,232 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -exports.__esModule = true; -exports.checkRevision = checkRevision; - -// TODO: Remove this line and break up compilePartial - -exports.template = template; -exports.wrapProgram = wrapProgram; -exports.resolvePartial = resolvePartial; -exports.invokePartial = invokePartial; -exports.noop = noop; - -var _import = require('./utils'); - -var Utils = _interopRequireWildcard(_import); - -var _Exception = require('./exception'); - -var _Exception2 = _interopRequireWildcard(_Exception); - -var _COMPILER_REVISION$REVISION_CHANGES$createFrame = require('./base'); - -function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _COMPILER_REVISION$REVISION_CHANGES$createFrame.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[currentRevision], - compilerVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[compilerRevision]; - throw new _Exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _Exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } -} - -function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _Exception2['default']('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _Exception2['default']('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = Utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _Exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _Exception2['default']('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: Utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - return templateSpec[i]; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = Utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _Exception2['default']('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _Exception2['default']('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; -} - -function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; -} - -function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; -} - -function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new _Exception2['default']('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } -} - -function noop() { - return ''; -} - -function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _COMPILER_REVISION$REVISION_CHANGES$createFrame.createFrame(data) : {}; - data.root = context; - } - return data; -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/safe-string.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/safe-string.js deleted file mode 100644 index 62eb2d8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/safe-string.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -exports.__esModule = true; -// Build out our basic SafeString type -function SafeString(string) { - this.string = string; -} - -SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; -}; - -exports['default'] = SafeString; -module.exports = exports['default']; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/utils.js deleted file mode 100644 index 6ff8f37..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/handlebars/utils.js +++ /dev/null @@ -1,114 +0,0 @@ -'use strict'; - -exports.__esModule = true; -exports.extend = extend; - -// Older IE versions do not directly support indexOf so we must implement our own, sadly. -exports.indexOf = indexOf; -exports.escapeExpression = escapeExpression; -exports.isEmpty = isEmpty; -exports.blockParams = blockParams; -exports.appendContextPath = appendContextPath; -var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '`': '`' -}; - -var badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - -function escapeChar(chr) { - return escape[chr]; -} - -function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; -} - -var toString = Object.prototype.toString; - -exports.toString = toString; -// Sourced from lodash -// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt -/*eslint-disable func-style, no-var */ -var isFunction = function isFunction(value) { - return typeof value === 'function'; -}; -// fallback for older versions of Chrome and Safari -/* istanbul ignore next */ -if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; -} -var isFunction; -exports.isFunction = isFunction; -/*eslint-enable func-style, no-var */ - -/* istanbul ignore next */ -var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; -};exports.isArray = isArray; - -function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; -} - -function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); -} - -function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } -} - -function blockParams(params, ids) { - params.path = ids; - return params; -} - -function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/precompiler.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/precompiler.js deleted file mode 100644 index e9f9648..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/cjs/precompiler.js +++ /dev/null @@ -1,194 +0,0 @@ -'use strict'; - -var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - -/*eslint-disable no-console */ - -var _fs = require('fs'); - -var _fs2 = _interopRequireWildcard(_fs); - -var _import = require('./handlebars'); - -var Handlebars = _interopRequireWildcard(_import); - -var _basename = require('path'); - -var _SourceMapConsumer$SourceNode = require('source-map'); - -var _uglify = require('uglify-js'); - -var _uglify2 = _interopRequireWildcard(_uglify); - -module.exports.cli = function (opts) { - if (opts.version) { - console.log(Handlebars.VERSION); - return; - } - - if (!opts.templates.length) { - throw new Handlebars.Exception('Must define at least one template or directory.'); - } - - opts.templates.forEach(function (template) { - try { - _fs2['default'].statSync(template); - } catch (err) { - throw new Handlebars.Exception('Unable to open template file "' + template + '"'); - } - }); - - if (opts.simple && opts.min) { - throw new Handlebars.Exception('Unable to minimize simple output'); - } - if (opts.simple && (opts.templates.length !== 1 || _fs2['default'].statSync(opts.templates[0]).isDirectory())) { - throw new Handlebars.Exception('Unable to output multiple templates in simple mode'); - } - - // Convert the known list into a hash - var known = {}; - if (opts.known && !Array.isArray(opts.known)) { - opts.known = [opts.known]; - } - if (opts.known) { - for (var i = 0, len = opts.known.length; i < len; i++) { - known[opts.known[i]] = true; - } - } - - // Build file extension pattern - var extension = opts.extension.replace(/[\\^$*+?.():=!|{}\-\[\]]/g, function (arg) { - return '\\' + arg; - }); - extension = new RegExp('\\.' + extension + '$'); - - var output = new _SourceMapConsumer$SourceNode.SourceNode(); - if (!opts.simple) { - if (opts.amd) { - output.add('define([\'' + opts.handlebarPath + 'handlebars.runtime\'], function(Handlebars) {\n Handlebars = Handlebars["default"];'); - } else if (opts.commonjs) { - output.add('var Handlebars = require("' + opts.commonjs + '");'); - } else { - output.add('(function() {\n'); - } - output.add(' var template = Handlebars.template, templates = '); - if (opts.namespace) { - output.add(opts.namespace); - output.add(' = '); - output.add(opts.namespace); - output.add(' || '); - } - output.add('{};\n'); - } - function processTemplate(template, root) { - var path = template, - stat = _fs2['default'].statSync(path); - if (stat.isDirectory()) { - _fs2['default'].readdirSync(template).map(function (file) { - var childPath = template + '/' + file; - - if (extension.test(childPath) || _fs2['default'].statSync(childPath).isDirectory()) { - processTemplate(childPath, root || template); - } - }); - } else { - var data = _fs2['default'].readFileSync(path, 'utf8'); - - if (opts.bom && data.indexOf('') === 0) { - data = data.substring(1); - } - - var options = { - knownHelpers: known, - knownHelpersOnly: opts.o - }; - - if (opts.map) { - options.srcName = path; - } - if (opts.data) { - options.data = true; - } - - // Clean the template name - if (!root) { - template = _basename.basename(template); - } else if (template.indexOf(root) === 0) { - template = template.substring(root.length + 1); - } - template = template.replace(extension, ''); - - var precompiled = Handlebars.precompile(data, options); - - // If we are generating a source map, we have to reconstruct the SourceNode object - if (opts.map) { - var consumer = new _SourceMapConsumer$SourceNode.SourceMapConsumer(precompiled.map); - precompiled = _SourceMapConsumer$SourceNode.SourceNode.fromStringWithSourceMap(precompiled.code, consumer); - } - - if (opts.simple) { - output.add([precompiled, '\n']); - } else if (opts.partial) { - if (opts.amd && (opts.templates.length == 1 && !_fs2['default'].statSync(opts.templates[0]).isDirectory())) { - output.add('return '); - } - output.add(['Handlebars.partials[\'', template, '\'] = template(', precompiled, ');\n']); - } else { - if (opts.amd && (opts.templates.length == 1 && !_fs2['default'].statSync(opts.templates[0]).isDirectory())) { - output.add('return '); - } - output.add(['templates[\'', template, '\'] = template(', precompiled, ');\n']); - } - } - } - - opts.templates.forEach(function (template) { - processTemplate(template, opts.root); - }); - - // Output the content - if (!opts.simple) { - if (opts.amd) { - if (opts.templates.length > 1 || opts.templates.length == 1 && _fs2['default'].statSync(opts.templates[0]).isDirectory()) { - if (opts.partial) { - output.add('return Handlebars.partials;\n'); - } else { - output.add('return templates;\n'); - } - } - output.add('});'); - } else if (!opts.commonjs) { - output.add('})();'); - } - } - - if (opts.map) { - output.add('\n//# sourceMappingURL=' + opts.map + '\n'); - } - - output = output.toStringWithSourceMap(); - output.map = output.map + ''; - - if (opts.min) { - output = _uglify2['default'].minify(output.code, { - fromString: true, - - outSourceMap: opts.map, - inSourceMap: JSON.parse(output.map) - }); - if (opts.map) { - output.code += '\n//# sourceMappingURL=' + opts.map + '\n'; - } - } - - if (opts.map) { - _fs2['default'].writeFileSync(opts.map, output.map, 'utf8'); - } - output = output.code; - - if (opts.output) { - _fs2['default'].writeFileSync(opts.output, output, 'utf8'); - } else { - console.log(output); - } -}; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.js deleted file mode 100644 index 07640c5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.js +++ /dev/null @@ -1,3862 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -define('handlebars/utils',['exports'], function (exports) { - - - exports.__esModule = true; - exports.extend = extend; - - // Older IE versions do not directly support indexOf so we must implement our own, sadly. - exports.indexOf = indexOf; - exports.escapeExpression = escapeExpression; - exports.isEmpty = isEmpty; - exports.blockParams = blockParams; - exports.appendContextPath = appendContextPath; - var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '`': '`' - }; - - var badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - - function escapeChar(chr) { - return escape[chr]; - } - - function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; - } - - var toString = Object.prototype.toString; - - exports.toString = toString; - // Sourced from lodash - // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt - /*eslint-disable func-style, no-var */ - var isFunction = function isFunction(value) { - return typeof value === 'function'; - }; - // fallback for older versions of Chrome and Safari - /* istanbul ignore next */ - if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; - } - var isFunction; - exports.isFunction = isFunction; - /*eslint-enable func-style, no-var */ - - /* istanbul ignore next */ - var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; - };exports.isArray = isArray; - - function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; - } - - function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); - } - - function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } - } - - function blockParams(params, ids) { - params.path = ids; - return params; - } - - function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; - } -}); -define('handlebars/exception',['exports', 'module'], function (exports, module) { - - - var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - - function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } - } - - Exception.prototype = new Error(); - - module.exports = Exception; -}); -define('handlebars/base',['exports', './utils', './exception'], function (exports, _utils, _exception) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.HandlebarsEnvironment = HandlebarsEnvironment; - exports.createFrame = createFrame; - - var _Exception = _interopRequire(_exception); - - var VERSION = '3.0.1'; - exports.VERSION = VERSION; - var COMPILER_REVISION = 6; - - exports.COMPILER_REVISION = COMPILER_REVISION; - var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' - }; - - exports.REVISION_CHANGES = REVISION_CHANGES; - var isArray = _utils.isArray, - isFunction = _utils.isFunction, - toString = _utils.toString, - objectType = '[object Object]'; - - function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); - } - - HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function registerHelper(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { - throw new _Exception('Arg not supported with multiple helpers'); - } - _utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (toString.call(name) === objectType) { - _utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _Exception('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - } - }; - - function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function () { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _Exception('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _Exception('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (var j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function (conditional, options) { - if (isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - - instance.registerHelper('with', function (context, options) { - if (isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!_utils.isEmpty(context)) { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = { data: data }; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function (message, options) { - var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); - } - - var logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function log(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - var method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } - }; - - exports.logger = logger; - var log = logger.log; - - exports.log = log; - - function createFrame(object) { - var frame = _utils.extend({}, object); - frame._parent = object; - return frame; - } -}); -/* [args, ]options */; -define('handlebars/safe-string',['exports', 'module'], function (exports, module) { - // Build out our basic SafeString type - - - function SafeString(string) { - this.string = string; - } - - SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; - }; - - module.exports = SafeString; -}); -define('handlebars/runtime',['exports', './utils', './exception', './base'], function (exports, _utils, _exception, _base) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.checkRevision = checkRevision; - - // TODO: Remove this line and break up compilePartial - - exports.template = template; - exports.wrapProgram = wrapProgram; - exports.resolvePartial = resolvePartial; - exports.invokePartial = invokePartial; - exports.noop = noop; - - var _Exception = _interopRequire(_exception); - - function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _base.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _base.REVISION_CHANGES[currentRevision], - compilerVersions = _base.REVISION_CHANGES[compilerRevision]; - throw new _Exception('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _Exception('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } - } - - function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _Exception('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _Exception('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = _utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _Exception('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _Exception('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: _utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - return templateSpec[i]; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = _utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _Exception('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _Exception('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; - } - - function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; - } - - function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; - } - - function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new _Exception('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } - } - - function noop() { - return ''; - } - - function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _base.createFrame(data) : {}; - data.root = context; - } - return data; - } -}); -define('handlebars/no-conflict',['exports', 'module'], function (exports, module) { - /*global window */ - - - module.exports = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; - }; -}); -define('handlebars.runtime',['exports', 'module', './handlebars/base', './handlebars/safe-string', './handlebars/exception', './handlebars/utils', './handlebars/runtime', './handlebars/no-conflict'], function (exports, module, _handlebarsBase, _handlebarsSafeString, _handlebarsException, _handlebarsUtils, _handlebarsRuntime, _handlebarsNoConflict) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - // Each of these augment the Handlebars object. No need to setup here. - // (This is done to easily share code between commonjs and browse envs) - - var _SafeString = _interopRequire(_handlebarsSafeString); - - var _Exception = _interopRequire(_handlebarsException); - - var _noConflict = _interopRequire(_handlebarsNoConflict); - - // For compatibility and usage outside of module systems, make the Handlebars object a namespace - function create() { - var hb = new _handlebarsBase.HandlebarsEnvironment(); - - _handlebarsUtils.extend(hb, _handlebarsBase); - hb.SafeString = _SafeString; - hb.Exception = _Exception; - hb.Utils = _handlebarsUtils; - hb.escapeExpression = _handlebarsUtils.escapeExpression; - - hb.VM = _handlebarsRuntime; - hb.template = function (spec) { - return _handlebarsRuntime.template(spec, hb); - }; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict(inst); - - inst['default'] = inst; - - module.exports = inst; -}); -define('handlebars/compiler/ast',['exports', 'module'], function (exports, module) { - - - var AST = { - Program: function Program(statements, blockParams, strip, locInfo) { - this.loc = locInfo; - this.type = 'Program'; - this.body = statements; - - this.blockParams = blockParams; - this.strip = strip; - }, - - MustacheStatement: function MustacheStatement(path, params, hash, escaped, strip, locInfo) { - this.loc = locInfo; - this.type = 'MustacheStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.escaped = escaped; - - this.strip = strip; - }, - - BlockStatement: function BlockStatement(path, params, hash, program, inverse, openStrip, inverseStrip, closeStrip, locInfo) { - this.loc = locInfo; - this.type = 'BlockStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.program = program; - this.inverse = inverse; - - this.openStrip = openStrip; - this.inverseStrip = inverseStrip; - this.closeStrip = closeStrip; - }, - - PartialStatement: function PartialStatement(name, params, hash, strip, locInfo) { - this.loc = locInfo; - this.type = 'PartialStatement'; - - this.name = name; - this.params = params || []; - this.hash = hash; - - this.indent = ''; - this.strip = strip; - }, - - ContentStatement: function ContentStatement(string, locInfo) { - this.loc = locInfo; - this.type = 'ContentStatement'; - this.original = this.value = string; - }, - - CommentStatement: function CommentStatement(comment, strip, locInfo) { - this.loc = locInfo; - this.type = 'CommentStatement'; - this.value = comment; - - this.strip = strip; - }, - - SubExpression: function SubExpression(path, params, hash, locInfo) { - this.loc = locInfo; - - this.type = 'SubExpression'; - this.path = path; - this.params = params || []; - this.hash = hash; - }, - - PathExpression: function PathExpression(data, depth, parts, original, locInfo) { - this.loc = locInfo; - this.type = 'PathExpression'; - - this.data = data; - this.original = original; - this.parts = parts; - this.depth = depth; - }, - - StringLiteral: function StringLiteral(string, locInfo) { - this.loc = locInfo; - this.type = 'StringLiteral'; - this.original = this.value = string; - }, - - NumberLiteral: function NumberLiteral(number, locInfo) { - this.loc = locInfo; - this.type = 'NumberLiteral'; - this.original = this.value = Number(number); - }, - - BooleanLiteral: function BooleanLiteral(bool, locInfo) { - this.loc = locInfo; - this.type = 'BooleanLiteral'; - this.original = this.value = bool === 'true'; - }, - - UndefinedLiteral: function UndefinedLiteral(locInfo) { - this.loc = locInfo; - this.type = 'UndefinedLiteral'; - this.original = this.value = undefined; - }, - - NullLiteral: function NullLiteral(locInfo) { - this.loc = locInfo; - this.type = 'NullLiteral'; - this.original = this.value = null; - }, - - Hash: function Hash(pairs, locInfo) { - this.loc = locInfo; - this.type = 'Hash'; - this.pairs = pairs; - }, - HashPair: function HashPair(key, value, locInfo) { - this.loc = locInfo; - this.type = 'HashPair'; - this.key = key; - this.value = value; - }, - - // Public API used to evaluate derived attributes regarding AST nodes - helpers: { - // a mustache is definitely a helper if: - // * it is an eligible helper, and - // * it has at least one parameter or hash segment - helperExpression: function helperExpression(node) { - return !!(node.type === 'SubExpression' || node.params.length || node.hash); - }, - - scopedId: function scopedId(path) { - return /^\.|this\b/.test(path.original); - }, - - // an ID is simple if it only has one part, and that part is not - // `..` or `this`. - simpleId: function simpleId(path) { - return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; - } - } - }; - - // Must be exported as an object rather than the root of the module as the jison lexer - // must modify the object to operate properly. - module.exports = AST; -}); -define('handlebars/compiler/parser',["exports", "module"], function (exports, module) { - /* istanbul ignore next */ - /* Jison generated parser */ - - - var handlebars = (function () { - var parser = { trace: function trace() {}, - yy: {}, - symbols_: { error: 2, root: 3, program: 4, EOF: 5, program_repetition0: 6, statement: 7, mustache: 8, block: 9, rawBlock: 10, partial: 11, content: 12, COMMENT: 13, CONTENT: 14, openRawBlock: 15, END_RAW_BLOCK: 16, OPEN_RAW_BLOCK: 17, helperName: 18, openRawBlock_repetition0: 19, openRawBlock_option0: 20, CLOSE_RAW_BLOCK: 21, openBlock: 22, block_option0: 23, closeBlock: 24, openInverse: 25, block_option1: 26, OPEN_BLOCK: 27, openBlock_repetition0: 28, openBlock_option0: 29, openBlock_option1: 30, CLOSE: 31, OPEN_INVERSE: 32, openInverse_repetition0: 33, openInverse_option0: 34, openInverse_option1: 35, openInverseChain: 36, OPEN_INVERSE_CHAIN: 37, openInverseChain_repetition0: 38, openInverseChain_option0: 39, openInverseChain_option1: 40, inverseAndProgram: 41, INVERSE: 42, inverseChain: 43, inverseChain_option0: 44, OPEN_ENDBLOCK: 45, OPEN: 46, mustache_repetition0: 47, mustache_option0: 48, OPEN_UNESCAPED: 49, mustache_repetition1: 50, mustache_option1: 51, CLOSE_UNESCAPED: 52, OPEN_PARTIAL: 53, partialName: 54, partial_repetition0: 55, partial_option0: 56, param: 57, sexpr: 58, OPEN_SEXPR: 59, sexpr_repetition0: 60, sexpr_option0: 61, CLOSE_SEXPR: 62, hash: 63, hash_repetition_plus0: 64, hashSegment: 65, ID: 66, EQUALS: 67, blockParams: 68, OPEN_BLOCK_PARAMS: 69, blockParams_repetition_plus0: 70, CLOSE_BLOCK_PARAMS: 71, path: 72, dataName: 73, STRING: 74, NUMBER: 75, BOOLEAN: 76, UNDEFINED: 77, NULL: 78, DATA: 79, pathSegments: 80, SEP: 81, $accept: 0, $end: 1 }, - terminals_: { 2: "error", 5: "EOF", 13: "COMMENT", 14: "CONTENT", 16: "END_RAW_BLOCK", 17: "OPEN_RAW_BLOCK", 21: "CLOSE_RAW_BLOCK", 27: "OPEN_BLOCK", 31: "CLOSE", 32: "OPEN_INVERSE", 37: "OPEN_INVERSE_CHAIN", 42: "INVERSE", 45: "OPEN_ENDBLOCK", 46: "OPEN", 49: "OPEN_UNESCAPED", 52: "CLOSE_UNESCAPED", 53: "OPEN_PARTIAL", 59: "OPEN_SEXPR", 62: "CLOSE_SEXPR", 66: "ID", 67: "EQUALS", 69: "OPEN_BLOCK_PARAMS", 71: "CLOSE_BLOCK_PARAMS", 74: "STRING", 75: "NUMBER", 76: "BOOLEAN", 77: "UNDEFINED", 78: "NULL", 79: "DATA", 81: "SEP" }, - productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [12, 1], [10, 3], [15, 5], [9, 4], [9, 4], [22, 6], [25, 6], [36, 6], [41, 2], [43, 3], [43, 1], [24, 3], [8, 5], [8, 5], [11, 5], [57, 1], [57, 1], [58, 5], [63, 1], [65, 3], [68, 3], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [54, 1], [54, 1], [73, 2], [72, 1], [80, 3], [80, 1], [6, 0], [6, 2], [19, 0], [19, 2], [20, 0], [20, 1], [23, 0], [23, 1], [26, 0], [26, 1], [28, 0], [28, 2], [29, 0], [29, 1], [30, 0], [30, 1], [33, 0], [33, 2], [34, 0], [34, 1], [35, 0], [35, 1], [38, 0], [38, 2], [39, 0], [39, 1], [40, 0], [40, 1], [44, 0], [44, 1], [47, 0], [47, 2], [48, 0], [48, 1], [50, 0], [50, 2], [51, 0], [51, 1], [55, 0], [55, 2], [56, 0], [56, 1], [60, 0], [60, 2], [61, 0], [61, 1], [64, 1], [64, 2], [70, 1], [70, 2]], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { - - var $0 = $$.length - 1; - switch (yystate) { - case 1: - return $$[$0 - 1]; - break; - case 2: - this.$ = new yy.Program($$[$0], null, {}, yy.locInfo(this._$)); - break; - case 3: - this.$ = $$[$0]; - break; - case 4: - this.$ = $$[$0]; - break; - case 5: - this.$ = $$[$0]; - break; - case 6: - this.$ = $$[$0]; - break; - case 7: - this.$ = $$[$0]; - break; - case 8: - this.$ = new yy.CommentStatement(yy.stripComment($$[$0]), yy.stripFlags($$[$0], $$[$0]), yy.locInfo(this._$)); - break; - case 9: - this.$ = new yy.ContentStatement($$[$0], yy.locInfo(this._$)); - break; - case 10: - this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); - break; - case 11: - this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] }; - break; - case 12: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$); - break; - case 13: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$); - break; - case 14: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 15: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 16: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 17: - this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] }; - break; - case 18: - var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$), - program = new yy.Program([inverse], null, {}, yy.locInfo(this._$)); - program.chained = true; - - this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true }; - - break; - case 19: - this.$ = $$[$0]; - break; - case 20: - this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) }; - break; - case 21: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 22: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 23: - this.$ = new yy.PartialStatement($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.stripFlags($$[$0 - 4], $$[$0]), yy.locInfo(this._$)); - break; - case 24: - this.$ = $$[$0]; - break; - case 25: - this.$ = $$[$0]; - break; - case 26: - this.$ = new yy.SubExpression($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.locInfo(this._$)); - break; - case 27: - this.$ = new yy.Hash($$[$0], yy.locInfo(this._$)); - break; - case 28: - this.$ = new yy.HashPair(yy.id($$[$0 - 2]), $$[$0], yy.locInfo(this._$)); - break; - case 29: - this.$ = yy.id($$[$0 - 1]); - break; - case 30: - this.$ = $$[$0]; - break; - case 31: - this.$ = $$[$0]; - break; - case 32: - this.$ = new yy.StringLiteral($$[$0], yy.locInfo(this._$)); - break; - case 33: - this.$ = new yy.NumberLiteral($$[$0], yy.locInfo(this._$)); - break; - case 34: - this.$ = new yy.BooleanLiteral($$[$0], yy.locInfo(this._$)); - break; - case 35: - this.$ = new yy.UndefinedLiteral(yy.locInfo(this._$)); - break; - case 36: - this.$ = new yy.NullLiteral(yy.locInfo(this._$)); - break; - case 37: - this.$ = $$[$0]; - break; - case 38: - this.$ = $$[$0]; - break; - case 39: - this.$ = yy.preparePath(true, $$[$0], this._$); - break; - case 40: - this.$ = yy.preparePath(false, $$[$0], this._$); - break; - case 41: - $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2]; - break; - case 42: - this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }]; - break; - case 43: - this.$ = []; - break; - case 44: - $$[$0 - 1].push($$[$0]); - break; - case 45: - this.$ = []; - break; - case 46: - $$[$0 - 1].push($$[$0]); - break; - case 53: - this.$ = []; - break; - case 54: - $$[$0 - 1].push($$[$0]); - break; - case 59: - this.$ = []; - break; - case 60: - $$[$0 - 1].push($$[$0]); - break; - case 65: - this.$ = []; - break; - case 66: - $$[$0 - 1].push($$[$0]); - break; - case 73: - this.$ = []; - break; - case 74: - $$[$0 - 1].push($$[$0]); - break; - case 77: - this.$ = []; - break; - case 78: - $$[$0 - 1].push($$[$0]); - break; - case 81: - this.$ = []; - break; - case 82: - $$[$0 - 1].push($$[$0]); - break; - case 85: - this.$ = []; - break; - case 86: - $$[$0 - 1].push($$[$0]); - break; - case 89: - this.$ = [$$[$0]]; - break; - case 90: - $$[$0 - 1].push($$[$0]); - break; - case 91: - this.$ = [$$[$0]]; - break; - case 92: - $$[$0 - 1].push($$[$0]); - break; - } - }, - table: [{ 3: 1, 4: 2, 5: [2, 43], 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: [1, 11], 14: [1, 18], 15: 16, 17: [1, 21], 22: 14, 25: 15, 27: [1, 19], 32: [1, 20], 37: [2, 2], 42: [2, 2], 45: [2, 2], 46: [1, 12], 49: [1, 13], 53: [1, 17] }, { 1: [2, 1] }, { 5: [2, 44], 13: [2, 44], 14: [2, 44], 17: [2, 44], 27: [2, 44], 32: [2, 44], 37: [2, 44], 42: [2, 44], 45: [2, 44], 46: [2, 44], 49: [2, 44], 53: [2, 44] }, { 5: [2, 3], 13: [2, 3], 14: [2, 3], 17: [2, 3], 27: [2, 3], 32: [2, 3], 37: [2, 3], 42: [2, 3], 45: [2, 3], 46: [2, 3], 49: [2, 3], 53: [2, 3] }, { 5: [2, 4], 13: [2, 4], 14: [2, 4], 17: [2, 4], 27: [2, 4], 32: [2, 4], 37: [2, 4], 42: [2, 4], 45: [2, 4], 46: [2, 4], 49: [2, 4], 53: [2, 4] }, { 5: [2, 5], 13: [2, 5], 14: [2, 5], 17: [2, 5], 27: [2, 5], 32: [2, 5], 37: [2, 5], 42: [2, 5], 45: [2, 5], 46: [2, 5], 49: [2, 5], 53: [2, 5] }, { 5: [2, 6], 13: [2, 6], 14: [2, 6], 17: [2, 6], 27: [2, 6], 32: [2, 6], 37: [2, 6], 42: [2, 6], 45: [2, 6], 46: [2, 6], 49: [2, 6], 53: [2, 6] }, { 5: [2, 7], 13: [2, 7], 14: [2, 7], 17: [2, 7], 27: [2, 7], 32: [2, 7], 37: [2, 7], 42: [2, 7], 45: [2, 7], 46: [2, 7], 49: [2, 7], 53: [2, 7] }, { 5: [2, 8], 13: [2, 8], 14: [2, 8], 17: [2, 8], 27: [2, 8], 32: [2, 8], 37: [2, 8], 42: [2, 8], 45: [2, 8], 46: [2, 8], 49: [2, 8], 53: [2, 8] }, { 18: 22, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 33, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 34, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 4: 35, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 12: 36, 14: [1, 18] }, { 18: 38, 54: 37, 58: 39, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 9], 13: [2, 9], 14: [2, 9], 16: [2, 9], 17: [2, 9], 27: [2, 9], 32: [2, 9], 37: [2, 9], 42: [2, 9], 45: [2, 9], 46: [2, 9], 49: [2, 9], 53: [2, 9] }, { 18: 41, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 42, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 43, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [2, 73], 47: 44, 59: [2, 73], 66: [2, 73], 74: [2, 73], 75: [2, 73], 76: [2, 73], 77: [2, 73], 78: [2, 73], 79: [2, 73] }, { 21: [2, 30], 31: [2, 30], 52: [2, 30], 59: [2, 30], 62: [2, 30], 66: [2, 30], 69: [2, 30], 74: [2, 30], 75: [2, 30], 76: [2, 30], 77: [2, 30], 78: [2, 30], 79: [2, 30] }, { 21: [2, 31], 31: [2, 31], 52: [2, 31], 59: [2, 31], 62: [2, 31], 66: [2, 31], 69: [2, 31], 74: [2, 31], 75: [2, 31], 76: [2, 31], 77: [2, 31], 78: [2, 31], 79: [2, 31] }, { 21: [2, 32], 31: [2, 32], 52: [2, 32], 59: [2, 32], 62: [2, 32], 66: [2, 32], 69: [2, 32], 74: [2, 32], 75: [2, 32], 76: [2, 32], 77: [2, 32], 78: [2, 32], 79: [2, 32] }, { 21: [2, 33], 31: [2, 33], 52: [2, 33], 59: [2, 33], 62: [2, 33], 66: [2, 33], 69: [2, 33], 74: [2, 33], 75: [2, 33], 76: [2, 33], 77: [2, 33], 78: [2, 33], 79: [2, 33] }, { 21: [2, 34], 31: [2, 34], 52: [2, 34], 59: [2, 34], 62: [2, 34], 66: [2, 34], 69: [2, 34], 74: [2, 34], 75: [2, 34], 76: [2, 34], 77: [2, 34], 78: [2, 34], 79: [2, 34] }, { 21: [2, 35], 31: [2, 35], 52: [2, 35], 59: [2, 35], 62: [2, 35], 66: [2, 35], 69: [2, 35], 74: [2, 35], 75: [2, 35], 76: [2, 35], 77: [2, 35], 78: [2, 35], 79: [2, 35] }, { 21: [2, 36], 31: [2, 36], 52: [2, 36], 59: [2, 36], 62: [2, 36], 66: [2, 36], 69: [2, 36], 74: [2, 36], 75: [2, 36], 76: [2, 36], 77: [2, 36], 78: [2, 36], 79: [2, 36] }, { 21: [2, 40], 31: [2, 40], 52: [2, 40], 59: [2, 40], 62: [2, 40], 66: [2, 40], 69: [2, 40], 74: [2, 40], 75: [2, 40], 76: [2, 40], 77: [2, 40], 78: [2, 40], 79: [2, 40], 81: [1, 45] }, { 66: [1, 32], 80: 46 }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 50: 47, 52: [2, 77], 59: [2, 77], 66: [2, 77], 74: [2, 77], 75: [2, 77], 76: [2, 77], 77: [2, 77], 78: [2, 77], 79: [2, 77] }, { 23: 48, 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 49, 45: [2, 49] }, { 26: 54, 41: 55, 42: [1, 53], 45: [2, 51] }, { 16: [1, 56] }, { 31: [2, 81], 55: 57, 59: [2, 81], 66: [2, 81], 74: [2, 81], 75: [2, 81], 76: [2, 81], 77: [2, 81], 78: [2, 81], 79: [2, 81] }, { 31: [2, 37], 59: [2, 37], 66: [2, 37], 74: [2, 37], 75: [2, 37], 76: [2, 37], 77: [2, 37], 78: [2, 37], 79: [2, 37] }, { 31: [2, 38], 59: [2, 38], 66: [2, 38], 74: [2, 38], 75: [2, 38], 76: [2, 38], 77: [2, 38], 78: [2, 38], 79: [2, 38] }, { 18: 58, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 28: 59, 31: [2, 53], 59: [2, 53], 66: [2, 53], 69: [2, 53], 74: [2, 53], 75: [2, 53], 76: [2, 53], 77: [2, 53], 78: [2, 53], 79: [2, 53] }, { 31: [2, 59], 33: 60, 59: [2, 59], 66: [2, 59], 69: [2, 59], 74: [2, 59], 75: [2, 59], 76: [2, 59], 77: [2, 59], 78: [2, 59], 79: [2, 59] }, { 19: 61, 21: [2, 45], 59: [2, 45], 66: [2, 45], 74: [2, 45], 75: [2, 45], 76: [2, 45], 77: [2, 45], 78: [2, 45], 79: [2, 45] }, { 18: 65, 31: [2, 75], 48: 62, 57: 63, 58: 66, 59: [1, 40], 63: 64, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 66: [1, 70] }, { 21: [2, 39], 31: [2, 39], 52: [2, 39], 59: [2, 39], 62: [2, 39], 66: [2, 39], 69: [2, 39], 74: [2, 39], 75: [2, 39], 76: [2, 39], 77: [2, 39], 78: [2, 39], 79: [2, 39], 81: [1, 45] }, { 18: 65, 51: 71, 52: [2, 79], 57: 72, 58: 66, 59: [1, 40], 63: 73, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 24: 74, 45: [1, 75] }, { 45: [2, 50] }, { 4: 76, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 45: [2, 19] }, { 18: 77, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 78, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 24: 79, 45: [1, 75] }, { 45: [2, 52] }, { 5: [2, 10], 13: [2, 10], 14: [2, 10], 17: [2, 10], 27: [2, 10], 32: [2, 10], 37: [2, 10], 42: [2, 10], 45: [2, 10], 46: [2, 10], 49: [2, 10], 53: [2, 10] }, { 18: 65, 31: [2, 83], 56: 80, 57: 81, 58: 66, 59: [1, 40], 63: 82, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 59: [2, 85], 60: 83, 62: [2, 85], 66: [2, 85], 74: [2, 85], 75: [2, 85], 76: [2, 85], 77: [2, 85], 78: [2, 85], 79: [2, 85] }, { 18: 65, 29: 84, 31: [2, 55], 57: 85, 58: 66, 59: [1, 40], 63: 86, 64: 67, 65: 68, 66: [1, 69], 69: [2, 55], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 31: [2, 61], 34: 87, 57: 88, 58: 66, 59: [1, 40], 63: 89, 64: 67, 65: 68, 66: [1, 69], 69: [2, 61], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 20: 90, 21: [2, 47], 57: 91, 58: 66, 59: [1, 40], 63: 92, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [1, 93] }, { 31: [2, 74], 59: [2, 74], 66: [2, 74], 74: [2, 74], 75: [2, 74], 76: [2, 74], 77: [2, 74], 78: [2, 74], 79: [2, 74] }, { 31: [2, 76] }, { 21: [2, 24], 31: [2, 24], 52: [2, 24], 59: [2, 24], 62: [2, 24], 66: [2, 24], 69: [2, 24], 74: [2, 24], 75: [2, 24], 76: [2, 24], 77: [2, 24], 78: [2, 24], 79: [2, 24] }, { 21: [2, 25], 31: [2, 25], 52: [2, 25], 59: [2, 25], 62: [2, 25], 66: [2, 25], 69: [2, 25], 74: [2, 25], 75: [2, 25], 76: [2, 25], 77: [2, 25], 78: [2, 25], 79: [2, 25] }, { 21: [2, 27], 31: [2, 27], 52: [2, 27], 62: [2, 27], 65: 94, 66: [1, 95], 69: [2, 27] }, { 21: [2, 89], 31: [2, 89], 52: [2, 89], 62: [2, 89], 66: [2, 89], 69: [2, 89] }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 67: [1, 96], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 21: [2, 41], 31: [2, 41], 52: [2, 41], 59: [2, 41], 62: [2, 41], 66: [2, 41], 69: [2, 41], 74: [2, 41], 75: [2, 41], 76: [2, 41], 77: [2, 41], 78: [2, 41], 79: [2, 41], 81: [2, 41] }, { 52: [1, 97] }, { 52: [2, 78], 59: [2, 78], 66: [2, 78], 74: [2, 78], 75: [2, 78], 76: [2, 78], 77: [2, 78], 78: [2, 78], 79: [2, 78] }, { 52: [2, 80] }, { 5: [2, 12], 13: [2, 12], 14: [2, 12], 17: [2, 12], 27: [2, 12], 32: [2, 12], 37: [2, 12], 42: [2, 12], 45: [2, 12], 46: [2, 12], 49: [2, 12], 53: [2, 12] }, { 18: 98, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 100, 44: 99, 45: [2, 71] }, { 31: [2, 65], 38: 101, 59: [2, 65], 66: [2, 65], 69: [2, 65], 74: [2, 65], 75: [2, 65], 76: [2, 65], 77: [2, 65], 78: [2, 65], 79: [2, 65] }, { 45: [2, 17] }, { 5: [2, 13], 13: [2, 13], 14: [2, 13], 17: [2, 13], 27: [2, 13], 32: [2, 13], 37: [2, 13], 42: [2, 13], 45: [2, 13], 46: [2, 13], 49: [2, 13], 53: [2, 13] }, { 31: [1, 102] }, { 31: [2, 82], 59: [2, 82], 66: [2, 82], 74: [2, 82], 75: [2, 82], 76: [2, 82], 77: [2, 82], 78: [2, 82], 79: [2, 82] }, { 31: [2, 84] }, { 18: 65, 57: 104, 58: 66, 59: [1, 40], 61: 103, 62: [2, 87], 63: 105, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 30: 106, 31: [2, 57], 68: 107, 69: [1, 108] }, { 31: [2, 54], 59: [2, 54], 66: [2, 54], 69: [2, 54], 74: [2, 54], 75: [2, 54], 76: [2, 54], 77: [2, 54], 78: [2, 54], 79: [2, 54] }, { 31: [2, 56], 69: [2, 56] }, { 31: [2, 63], 35: 109, 68: 110, 69: [1, 108] }, { 31: [2, 60], 59: [2, 60], 66: [2, 60], 69: [2, 60], 74: [2, 60], 75: [2, 60], 76: [2, 60], 77: [2, 60], 78: [2, 60], 79: [2, 60] }, { 31: [2, 62], 69: [2, 62] }, { 21: [1, 111] }, { 21: [2, 46], 59: [2, 46], 66: [2, 46], 74: [2, 46], 75: [2, 46], 76: [2, 46], 77: [2, 46], 78: [2, 46], 79: [2, 46] }, { 21: [2, 48] }, { 5: [2, 21], 13: [2, 21], 14: [2, 21], 17: [2, 21], 27: [2, 21], 32: [2, 21], 37: [2, 21], 42: [2, 21], 45: [2, 21], 46: [2, 21], 49: [2, 21], 53: [2, 21] }, { 21: [2, 90], 31: [2, 90], 52: [2, 90], 62: [2, 90], 66: [2, 90], 69: [2, 90] }, { 67: [1, 96] }, { 18: 65, 57: 112, 58: 66, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 22], 13: [2, 22], 14: [2, 22], 17: [2, 22], 27: [2, 22], 32: [2, 22], 37: [2, 22], 42: [2, 22], 45: [2, 22], 46: [2, 22], 49: [2, 22], 53: [2, 22] }, { 31: [1, 113] }, { 45: [2, 18] }, { 45: [2, 72] }, { 18: 65, 31: [2, 67], 39: 114, 57: 115, 58: 66, 59: [1, 40], 63: 116, 64: 67, 65: 68, 66: [1, 69], 69: [2, 67], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 23], 13: [2, 23], 14: [2, 23], 17: [2, 23], 27: [2, 23], 32: [2, 23], 37: [2, 23], 42: [2, 23], 45: [2, 23], 46: [2, 23], 49: [2, 23], 53: [2, 23] }, { 62: [1, 117] }, { 59: [2, 86], 62: [2, 86], 66: [2, 86], 74: [2, 86], 75: [2, 86], 76: [2, 86], 77: [2, 86], 78: [2, 86], 79: [2, 86] }, { 62: [2, 88] }, { 31: [1, 118] }, { 31: [2, 58] }, { 66: [1, 120], 70: 119 }, { 31: [1, 121] }, { 31: [2, 64] }, { 14: [2, 11] }, { 21: [2, 28], 31: [2, 28], 52: [2, 28], 62: [2, 28], 66: [2, 28], 69: [2, 28] }, { 5: [2, 20], 13: [2, 20], 14: [2, 20], 17: [2, 20], 27: [2, 20], 32: [2, 20], 37: [2, 20], 42: [2, 20], 45: [2, 20], 46: [2, 20], 49: [2, 20], 53: [2, 20] }, { 31: [2, 69], 40: 122, 68: 123, 69: [1, 108] }, { 31: [2, 66], 59: [2, 66], 66: [2, 66], 69: [2, 66], 74: [2, 66], 75: [2, 66], 76: [2, 66], 77: [2, 66], 78: [2, 66], 79: [2, 66] }, { 31: [2, 68], 69: [2, 68] }, { 21: [2, 26], 31: [2, 26], 52: [2, 26], 59: [2, 26], 62: [2, 26], 66: [2, 26], 69: [2, 26], 74: [2, 26], 75: [2, 26], 76: [2, 26], 77: [2, 26], 78: [2, 26], 79: [2, 26] }, { 13: [2, 14], 14: [2, 14], 17: [2, 14], 27: [2, 14], 32: [2, 14], 37: [2, 14], 42: [2, 14], 45: [2, 14], 46: [2, 14], 49: [2, 14], 53: [2, 14] }, { 66: [1, 125], 71: [1, 124] }, { 66: [2, 91], 71: [2, 91] }, { 13: [2, 15], 14: [2, 15], 17: [2, 15], 27: [2, 15], 32: [2, 15], 42: [2, 15], 45: [2, 15], 46: [2, 15], 49: [2, 15], 53: [2, 15] }, { 31: [1, 126] }, { 31: [2, 70] }, { 31: [2, 29] }, { 66: [2, 92], 71: [2, 92] }, { 13: [2, 16], 14: [2, 16], 17: [2, 16], 27: [2, 16], 32: [2, 16], 37: [2, 16], 42: [2, 16], 45: [2, 16], 46: [2, 16], 49: [2, 16], 53: [2, 16] }], - defaultActions: { 4: [2, 1], 49: [2, 50], 51: [2, 19], 55: [2, 52], 64: [2, 76], 73: [2, 80], 78: [2, 17], 82: [2, 84], 92: [2, 48], 99: [2, 18], 100: [2, 72], 105: [2, 88], 107: [2, 58], 110: [2, 64], 111: [2, 11], 123: [2, 70], 124: [2, 29] }, - parseError: function parseError(str, hash) { - throw new Error(str); - }, - parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], - lstack = [], - table = this.table, - yytext = "", - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - this.yy.parser = this; - if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - var ranges = this.lexer.options && this.lexer.options.ranges; - if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError; - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - function lex() { - var token; - token = self.lexer.lex() || 1; - if (typeof token !== "number") { - token = self.symbols_[token] || token; - } - return token; - } - var symbol, - preErrorSymbol, - state, - action, - a, - r, - yyval = {}, - p, - len, - newState, - expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == "undefined") { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === "undefined" || !action.length || !action[0]) { - var errStr = ""; - if (!recovering) { - expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected }); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; - if (ranges) { - yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; - } - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; - } - }; - /* Jison generated lexer */ - var lexer = (function () { - var lexer = { EOF: 1, - parseError: function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, - setInput: function setInput(input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ""; - this.conditionStack = ["INITIAL"]; - this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; - if (this.options.ranges) this.yylloc.range = [0, 0]; - this.offset = 0; - return this; - }, - input: function input() { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) this.yylloc.range[1]++; - - this._input = this._input.slice(1); - return ch; - }, - unput: function unput(ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); - - if (lines.length - 1) this.yylineno -= lines.length - 1; - var r = this.yylloc.range; - - this.yylloc = { first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - return this; - }, - more: function more() { - this._more = true; - return this; - }, - less: function less(n) { - this.unput(this.match.slice(n)); - }, - pastInput: function pastInput() { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); - }, - upcomingInput: function upcomingInput() { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20 - next.length); - } - return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); - }, - showPosition: function showPosition() { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, - next: function next() { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, match, tempMatch, index, col, lines; - if (!this._more) { - this.yytext = ""; - this.match = ""; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = { first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) this.done = false; - if (token) { - return token; - } else { - return; - } - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { text: "", token: null, line: this.yylineno }); - } - }, - lex: function lex() { - var r = this.next(); - if (typeof r !== "undefined") { - return r; - } else { - return this.lex(); - } - }, - begin: function begin(condition) { - this.conditionStack.push(condition); - }, - popState: function popState() { - return this.conditionStack.pop(); - }, - _currentRules: function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - }, - topState: function topState() { - return this.conditionStack[this.conditionStack.length - 2]; - }, - pushState: function begin(condition) { - this.begin(condition); - } }; - lexer.options = {}; - lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { - - function strip(start, end) { - return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end); - } - - var YYSTATE = YY_START; - switch ($avoiding_name_collisions) { - case 0: - if (yy_.yytext.slice(-2) === "\\\\") { - strip(0, 1); - this.begin("mu"); - } else if (yy_.yytext.slice(-1) === "\\") { - strip(0, 1); - this.begin("emu"); - } else { - this.begin("mu"); - } - if (yy_.yytext) { - return 14; - }break; - case 1: - return 14; - break; - case 2: - this.popState(); - return 14; - - break; - case 3: - yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9); - this.popState(); - return 16; - - break; - case 4: - return 14; - break; - case 5: - this.popState(); - return 13; - - break; - case 6: - return 59; - break; - case 7: - return 62; - break; - case 8: - return 17; - break; - case 9: - this.popState(); - this.begin("raw"); - return 21; - - break; - case 10: - return 53; - break; - case 11: - return 27; - break; - case 12: - return 45; - break; - case 13: - this.popState();return 42; - break; - case 14: - this.popState();return 42; - break; - case 15: - return 32; - break; - case 16: - return 37; - break; - case 17: - return 49; - break; - case 18: - return 46; - break; - case 19: - this.unput(yy_.yytext); - this.popState(); - this.begin("com"); - - break; - case 20: - this.popState(); - return 13; - - break; - case 21: - return 46; - break; - case 22: - return 67; - break; - case 23: - return 66; - break; - case 24: - return 66; - break; - case 25: - return 81; - break; - case 26: - // ignore whitespace - break; - case 27: - this.popState();return 52; - break; - case 28: - this.popState();return 31; - break; - case 29: - yy_.yytext = strip(1, 2).replace(/\\"/g, "\"");return 74; - break; - case 30: - yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 74; - break; - case 31: - return 79; - break; - case 32: - return 76; - break; - case 33: - return 76; - break; - case 34: - return 77; - break; - case 35: - return 78; - break; - case 36: - return 75; - break; - case 37: - return 69; - break; - case 38: - return 71; - break; - case 39: - return 66; - break; - case 40: - return 66; - break; - case 41: - return "INVALID"; - break; - case 42: - return 5; - break; - } - }; - lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]*?(?=(\{\{\{\{\/)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[[^\]]*\])/, /^(?:.)/, /^(?:$)/]; - lexer.conditions = { mu: { rules: [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], inclusive: false }, emu: { rules: [2], inclusive: false }, com: { rules: [5], inclusive: false }, raw: { rules: [3, 4], inclusive: false }, INITIAL: { rules: [0, 1, 42], inclusive: true } }; - return lexer; - })(); - parser.lexer = lexer; - function Parser() { - this.yy = {}; - }Parser.prototype = parser;parser.Parser = Parser; - return new Parser(); - })();module.exports = handlebars; -}); -define('handlebars/compiler/visitor',['exports', 'module', '../exception', './ast'], function (exports, module, _exception, _ast) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _Exception = _interopRequire(_exception); - - var _AST = _interopRequire(_ast); - - function Visitor() { - this.parents = []; - } - - Visitor.prototype = { - constructor: Visitor, - mutating: false, - - // Visits a given value. If mutating, will replace the value if necessary. - acceptKey: function acceptKey(node, name) { - var value = this.accept(node[name]); - if (this.mutating) { - // Hacky sanity check: - if (value && (!value.type || !_AST[value.type])) { - throw new _Exception('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); - } - node[name] = value; - } - }, - - // Performs an accept operation with added sanity check to ensure - // required keys are not removed. - acceptRequired: function acceptRequired(node, name) { - this.acceptKey(node, name); - - if (!node[name]) { - throw new _Exception(node.type + ' requires ' + name); - } - }, - - // Traverses a given array. If mutating, empty respnses will be removed - // for child elements. - acceptArray: function acceptArray(array) { - for (var i = 0, l = array.length; i < l; i++) { - this.acceptKey(array, i); - - if (!array[i]) { - array.splice(i, 1); - i--; - l--; - } - } - }, - - accept: function accept(object) { - if (!object) { - return; - } - - if (this.current) { - this.parents.unshift(this.current); - } - this.current = object; - - var ret = this[object.type](object); - - this.current = this.parents.shift(); - - if (!this.mutating || ret) { - return ret; - } else if (ret !== false) { - return object; - } - }, - - Program: function Program(program) { - this.acceptArray(program.body); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.acceptRequired(mustache, 'path'); - this.acceptArray(mustache.params); - this.acceptKey(mustache, 'hash'); - }, - - BlockStatement: function BlockStatement(block) { - this.acceptRequired(block, 'path'); - this.acceptArray(block.params); - this.acceptKey(block, 'hash'); - - this.acceptKey(block, 'program'); - this.acceptKey(block, 'inverse'); - }, - - PartialStatement: function PartialStatement(partial) { - this.acceptRequired(partial, 'name'); - this.acceptArray(partial.params); - this.acceptKey(partial, 'hash'); - }, - - ContentStatement: function ContentStatement() {}, - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - this.acceptRequired(sexpr, 'path'); - this.acceptArray(sexpr.params); - this.acceptKey(sexpr, 'hash'); - }, - - PathExpression: function PathExpression() {}, - - StringLiteral: function StringLiteral() {}, - NumberLiteral: function NumberLiteral() {}, - BooleanLiteral: function BooleanLiteral() {}, - UndefinedLiteral: function UndefinedLiteral() {}, - NullLiteral: function NullLiteral() {}, - - Hash: function Hash(hash) { - this.acceptArray(hash.pairs); - }, - HashPair: function HashPair(pair) { - this.acceptRequired(pair, 'value'); - } - }; - - module.exports = Visitor; -}); -/* content */ /* comment */ /* path */ /* string */ /* number */ /* bool */ /* literal */ /* literal */; -define('handlebars/compiler/whitespace-control',['exports', 'module', './visitor'], function (exports, module, _visitor) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _Visitor = _interopRequire(_visitor); - - function WhitespaceControl() {} - WhitespaceControl.prototype = new _Visitor(); - - WhitespaceControl.prototype.Program = function (program) { - var isRoot = !this.isRootSeen; - this.isRootSeen = true; - - var body = program.body; - for (var i = 0, l = body.length; i < l; i++) { - var current = body[i], - strip = this.accept(current); - - if (!strip) { - continue; - } - - var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), - _isNextWhitespace = isNextWhitespace(body, i, isRoot), - openStandalone = strip.openStandalone && _isPrevWhitespace, - closeStandalone = strip.closeStandalone && _isNextWhitespace, - inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; - - if (strip.close) { - omitRight(body, i, true); - } - if (strip.open) { - omitLeft(body, i, true); - } - - if (inlineStandalone) { - omitRight(body, i); - - if (omitLeft(body, i)) { - // If we are on a standalone node, save the indent info for partials - if (current.type === 'PartialStatement') { - // Pull out the whitespace from the final line - current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1]; - } - } - } - if (openStandalone) { - omitRight((current.program || current.inverse).body); - - // Strip out the previous content node if it's whitespace only - omitLeft(body, i); - } - if (closeStandalone) { - // Always strip the next node - omitRight(body, i); - - omitLeft((current.inverse || current.program).body); - } - } - - return program; - }; - WhitespaceControl.prototype.BlockStatement = function (block) { - this.accept(block.program); - this.accept(block.inverse); - - // Find the inverse program that is involed with whitespace stripping. - var program = block.program || block.inverse, - inverse = block.program && block.inverse, - firstInverse = inverse, - lastInverse = inverse; - - if (inverse && inverse.chained) { - firstInverse = inverse.body[0].program; - - // Walk the inverse chain to find the last inverse that is actually in the chain. - while (lastInverse.chained) { - lastInverse = lastInverse.body[lastInverse.body.length - 1].program; - } - } - - var strip = { - open: block.openStrip.open, - close: block.closeStrip.close, - - // Determine the standalone candiacy. Basically flag our content as being possibly standalone - // so our parent can determine if we actually are standalone - openStandalone: isNextWhitespace(program.body), - closeStandalone: isPrevWhitespace((firstInverse || program).body) - }; - - if (block.openStrip.close) { - omitRight(program.body, null, true); - } - - if (inverse) { - var inverseStrip = block.inverseStrip; - - if (inverseStrip.open) { - omitLeft(program.body, null, true); - } - - if (inverseStrip.close) { - omitRight(firstInverse.body, null, true); - } - if (block.closeStrip.open) { - omitLeft(lastInverse.body, null, true); - } - - // Find standalone else statments - if (isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) { - omitLeft(program.body); - omitRight(firstInverse.body); - } - } else if (block.closeStrip.open) { - omitLeft(program.body, null, true); - } - - return strip; - }; - - WhitespaceControl.prototype.MustacheStatement = function (mustache) { - return mustache.strip; - }; - - WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) { - /* istanbul ignore next */ - var strip = node.strip || {}; - return { - inlineStandalone: true, - open: strip.open, - close: strip.close - }; - }; - - function isPrevWhitespace(body, i, isRoot) { - if (i === undefined) { - i = body.length; - } - - // Nodes that end with newlines are considered whitespace (but are special - // cased for strip operations) - var prev = body[i - 1], - sibling = body[i - 2]; - if (!prev) { - return isRoot; - } - - if (prev.type === 'ContentStatement') { - return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original); - } - } - function isNextWhitespace(body, i, isRoot) { - if (i === undefined) { - i = -1; - } - - var next = body[i + 1], - sibling = body[i + 2]; - if (!next) { - return isRoot; - } - - if (next.type === 'ContentStatement') { - return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original); - } - } - - // Marks the node to the right of the position as omitted. - // I.e. {{foo}}' ' will mark the ' ' node as omitted. - // - // If i is undefined, then the first child will be marked as such. - // - // If mulitple is truthy then all whitespace will be stripped out until non-whitespace - // content is met. - function omitRight(body, i, multiple) { - var current = body[i == null ? 0 : i + 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) { - return; - } - - var original = current.value; - current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, ''); - current.rightStripped = current.value !== original; - } - - // Marks the node to the left of the position as omitted. - // I.e. ' '{{foo}} will mark the ' ' node as omitted. - // - // If i is undefined then the last child will be marked as such. - // - // If mulitple is truthy then all whitespace will be stripped out until non-whitespace - // content is met. - function omitLeft(body, i, multiple) { - var current = body[i == null ? body.length - 1 : i - 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) { - return; - } - - // We omit the last node if it's whitespace only and not preceeded by a non-content node. - var original = current.value; - current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, ''); - current.leftStripped = current.value !== original; - return current.leftStripped; - } - - module.exports = WhitespaceControl; -}); -define('handlebars/compiler/helpers',['exports', '../exception'], function (exports, _exception) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.SourceLocation = SourceLocation; - exports.id = id; - exports.stripFlags = stripFlags; - exports.stripComment = stripComment; - exports.preparePath = preparePath; - exports.prepareMustache = prepareMustache; - exports.prepareRawBlock = prepareRawBlock; - exports.prepareBlock = prepareBlock; - - var _Exception = _interopRequire(_exception); - - function SourceLocation(source, locInfo) { - this.source = source; - this.start = { - line: locInfo.first_line, - column: locInfo.first_column - }; - this.end = { - line: locInfo.last_line, - column: locInfo.last_column - }; - } - - function id(token) { - if (/^\[.*\]$/.test(token)) { - return token.substr(1, token.length - 2); - } else { - return token; - } - } - - function stripFlags(open, close) { - return { - open: open.charAt(2) === '~', - close: close.charAt(close.length - 3) === '~' - }; - } - - function stripComment(comment) { - return comment.replace(/^\{\{~?\!-?-?/, '').replace(/-?-?~?\}\}$/, ''); - } - - function preparePath(data, parts, locInfo) { - locInfo = this.locInfo(locInfo); - - var original = data ? '@' : '', - dig = [], - depth = 0, - depthString = ''; - - for (var i = 0, l = parts.length; i < l; i++) { - var part = parts[i].part, - - // If we have [] syntax then we do not treat path references as operators, - // i.e. foo.[this] resolves to approximately context.foo['this'] - isLiteral = parts[i].original !== part; - original += (parts[i].separator || '') + part; - - if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { - if (dig.length > 0) { - throw new _Exception('Invalid path: ' + original, { loc: locInfo }); - } else if (part === '..') { - depth++; - depthString += '../'; - } - } else { - dig.push(part); - } - } - - return new this.PathExpression(data, depth, dig, original, locInfo); - } - - function prepareMustache(path, params, hash, open, strip, locInfo) { - // Must use charAt to support IE pre-10 - var escapeFlag = open.charAt(3) || open.charAt(2), - escaped = escapeFlag !== '{' && escapeFlag !== '&'; - - return new this.MustacheStatement(path, params, hash, escaped, strip, this.locInfo(locInfo)); - } - - function prepareRawBlock(openRawBlock, content, close, locInfo) { - if (openRawBlock.path.original !== close) { - var errorNode = { loc: openRawBlock.path.loc }; - - throw new _Exception(openRawBlock.path.original + ' doesn\'t match ' + close, errorNode); - } - - locInfo = this.locInfo(locInfo); - var program = new this.Program([content], null, {}, locInfo); - - return new this.BlockStatement(openRawBlock.path, openRawBlock.params, openRawBlock.hash, program, undefined, {}, {}, {}, locInfo); - } - - function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { - // When we are chaining inverse calls, we will not have a close path - if (close && close.path && openBlock.path.original !== close.path.original) { - var errorNode = { loc: openBlock.path.loc }; - - throw new _Exception(openBlock.path.original + ' doesn\'t match ' + close.path.original, errorNode); - } - - program.blockParams = openBlock.blockParams; - - var inverse = undefined, - inverseStrip = undefined; - - if (inverseAndProgram) { - if (inverseAndProgram.chain) { - inverseAndProgram.program.body[0].closeStrip = close.strip; - } - - inverseStrip = inverseAndProgram.strip; - inverse = inverseAndProgram.program; - } - - if (inverted) { - inverted = inverse; - inverse = program; - program = inverted; - } - - return new this.BlockStatement(openBlock.path, openBlock.params, openBlock.hash, program, inverse, openBlock.strip, inverseStrip, close && close.strip, this.locInfo(locInfo)); - } -}); -define('handlebars/compiler/base',['exports', './parser', './ast', './whitespace-control', './helpers', '../utils'], function (exports, _parser, _ast, _whitespaceControl, _helpers, _utils) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.parse = parse; - - var _parser2 = _interopRequire(_parser); - - var _AST = _interopRequire(_ast); - - var _WhitespaceControl = _interopRequire(_whitespaceControl); - - exports.parser = _parser2; - - var yy = {}; - _utils.extend(yy, _helpers, _AST); - - function parse(input, options) { - // Just return if an already-compiled AST was passed in. - if (input.type === 'Program') { - return input; - } - - _parser2.yy = yy; - - // Altering the shared object here, but this is ok as parser is a sync operation - yy.locInfo = function (locInfo) { - return new yy.SourceLocation(options && options.srcName, locInfo); - }; - - var strip = new _WhitespaceControl(); - return strip.accept(_parser2.parse(input)); - } -}); -define('handlebars/compiler/compiler',['exports', '../exception', '../utils', './ast'], function (exports, _exception, _utils, _ast) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.Compiler = Compiler; - exports.precompile = precompile; - exports.compile = compile; - - var _Exception = _interopRequire(_exception); - - var _AST = _interopRequire(_ast); - - var slice = [].slice; - - function Compiler() {} - - // the foundHelper register will disambiguate helper lookup from finding a - // function in a context. This is necessary for mustache compatibility, which - // requires that context functions in blocks are evaluated by blockHelperMissing, - // and then proceed as if the resulting value was provided to blockHelperMissing. - - Compiler.prototype = { - compiler: Compiler, - - equals: function equals(other) { - var len = this.opcodes.length; - if (other.opcodes.length !== len) { - return false; - } - - for (var i = 0; i < len; i++) { - var opcode = this.opcodes[i], - otherOpcode = other.opcodes[i]; - if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { - return false; - } - } - - // We know that length is the same between the two arrays because they are directly tied - // to the opcode behavior above. - len = this.children.length; - for (var i = 0; i < len; i++) { - if (!this.children[i].equals(other.children[i])) { - return false; - } - } - - return true; - }, - - guid: 0, - - compile: function compile(program, options) { - this.sourceNode = []; - this.opcodes = []; - this.children = []; - this.options = options; - this.stringParams = options.stringParams; - this.trackIds = options.trackIds; - - options.blockParams = options.blockParams || []; - - // These changes will propagate to the other compiler components - var knownHelpers = options.knownHelpers; - options.knownHelpers = { - helperMissing: true, - blockHelperMissing: true, - each: true, - 'if': true, - unless: true, - 'with': true, - log: true, - lookup: true - }; - if (knownHelpers) { - for (var _name in knownHelpers) { - if (_name in knownHelpers) { - options.knownHelpers[_name] = knownHelpers[_name]; - } - } - } - - return this.accept(program); - }, - - compileProgram: function compileProgram(program) { - var childCompiler = new this.compiler(), - // eslint-disable-line new-cap - result = childCompiler.compile(program, this.options), - guid = this.guid++; - - this.usePartial = this.usePartial || result.usePartial; - - this.children[guid] = result; - this.useDepths = this.useDepths || result.useDepths; - - return guid; - }, - - accept: function accept(node) { - this.sourceNode.unshift(node); - var ret = this[node.type](node); - this.sourceNode.shift(); - return ret; - }, - - Program: function Program(program) { - this.options.blockParams.unshift(program.blockParams); - - var body = program.body, - bodyLength = body.length; - for (var i = 0; i < bodyLength; i++) { - this.accept(body[i]); - } - - this.options.blockParams.shift(); - - this.isSimple = bodyLength === 1; - this.blockParams = program.blockParams ? program.blockParams.length : 0; - - return this; - }, - - BlockStatement: function BlockStatement(block) { - transformLiteralToPath(block); - - var program = block.program, - inverse = block.inverse; - - program = program && this.compileProgram(program); - inverse = inverse && this.compileProgram(inverse); - - var type = this.classifySexpr(block); - - if (type === 'helper') { - this.helperSexpr(block, program, inverse); - } else if (type === 'simple') { - this.simpleSexpr(block); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('blockValue', block.path.original); - } else { - this.ambiguousSexpr(block, program, inverse); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('ambiguousBlockValue'); - } - - this.opcode('append'); - }, - - PartialStatement: function PartialStatement(partial) { - this.usePartial = true; - - var params = partial.params; - if (params.length > 1) { - throw new _Exception('Unsupported number of partial arguments: ' + params.length, partial); - } else if (!params.length) { - params.push({ type: 'PathExpression', parts: [], depth: 0 }); - } - - var partialName = partial.name.original, - isDynamic = partial.name.type === 'SubExpression'; - if (isDynamic) { - this.accept(partial.name); - } - - this.setupFullMustacheParams(partial, undefined, undefined, true); - - var indent = partial.indent || ''; - if (this.options.preventIndent && indent) { - this.opcode('appendContent', indent); - indent = ''; - } - - this.opcode('invokePartial', isDynamic, partialName, indent); - this.opcode('append'); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.SubExpression(mustache); // eslint-disable-line new-cap - - if (mustache.escaped && !this.options.noEscape) { - this.opcode('appendEscaped'); - } else { - this.opcode('append'); - } - }, - - ContentStatement: function ContentStatement(content) { - if (content.value) { - this.opcode('appendContent', content.value); - } - }, - - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - transformLiteralToPath(sexpr); - var type = this.classifySexpr(sexpr); - - if (type === 'simple') { - this.simpleSexpr(sexpr); - } else if (type === 'helper') { - this.helperSexpr(sexpr); - } else { - this.ambiguousSexpr(sexpr); - } - }, - ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) { - var path = sexpr.path, - name = path.parts[0], - isBlock = program != null || inverse != null; - - this.opcode('getContext', path.depth); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - this.accept(path); - - this.opcode('invokeAmbiguous', name, isBlock); - }, - - simpleSexpr: function simpleSexpr(sexpr) { - this.accept(sexpr.path); - this.opcode('resolvePossibleLambda'); - }, - - helperSexpr: function helperSexpr(sexpr, program, inverse) { - var params = this.setupFullMustacheParams(sexpr, program, inverse), - path = sexpr.path, - name = path.parts[0]; - - if (this.options.knownHelpers[name]) { - this.opcode('invokeKnownHelper', params.length, name); - } else if (this.options.knownHelpersOnly) { - throw new _Exception('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); - } else { - path.falsy = true; - - this.accept(path); - this.opcode('invokeHelper', params.length, path.original, _AST.helpers.simpleId(path)); - } - }, - - PathExpression: function PathExpression(path) { - this.addDepth(path.depth); - this.opcode('getContext', path.depth); - - var name = path.parts[0], - scoped = _AST.helpers.scopedId(path), - blockParamId = !path.depth && !scoped && this.blockParamIndex(name); - - if (blockParamId) { - this.opcode('lookupBlockParam', blockParamId, path.parts); - } else if (!name) { - // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` - this.opcode('pushContext'); - } else if (path.data) { - this.options.data = true; - this.opcode('lookupData', path.depth, path.parts); - } else { - this.opcode('lookupOnContext', path.parts, path.falsy, scoped); - } - }, - - StringLiteral: function StringLiteral(string) { - this.opcode('pushString', string.value); - }, - - NumberLiteral: function NumberLiteral(number) { - this.opcode('pushLiteral', number.value); - }, - - BooleanLiteral: function BooleanLiteral(bool) { - this.opcode('pushLiteral', bool.value); - }, - - UndefinedLiteral: function UndefinedLiteral() { - this.opcode('pushLiteral', 'undefined'); - }, - - NullLiteral: function NullLiteral() { - this.opcode('pushLiteral', 'null'); - }, - - Hash: function Hash(hash) { - var pairs = hash.pairs, - i = 0, - l = pairs.length; - - this.opcode('pushHash'); - - for (; i < l; i++) { - this.pushParam(pairs[i].value); - } - while (i--) { - this.opcode('assignToHash', pairs[i].key); - } - this.opcode('popHash'); - }, - - // HELPERS - opcode: function opcode(name) { - this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); - }, - - addDepth: function addDepth(depth) { - if (!depth) { - return; - } - - this.useDepths = true; - }, - - classifySexpr: function classifySexpr(sexpr) { - var isSimple = _AST.helpers.simpleId(sexpr.path); - - var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); - - // a mustache is an eligible helper if: - // * its id is simple (a single part, not `this` or `..`) - var isHelper = !isBlockParam && _AST.helpers.helperExpression(sexpr); - - // if a mustache is an eligible helper but not a definite - // helper, it is ambiguous, and will be resolved in a later - // pass or at runtime. - var isEligible = !isBlockParam && (isHelper || isSimple); - - // if ambiguous, we can possibly resolve the ambiguity now - // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. - if (isEligible && !isHelper) { - var _name2 = sexpr.path.parts[0], - options = this.options; - - if (options.knownHelpers[_name2]) { - isHelper = true; - } else if (options.knownHelpersOnly) { - isEligible = false; - } - } - - if (isHelper) { - return 'helper'; - } else if (isEligible) { - return 'ambiguous'; - } else { - return 'simple'; - } - }, - - pushParams: function pushParams(params) { - for (var i = 0, l = params.length; i < l; i++) { - this.pushParam(params[i]); - } - }, - - pushParam: function pushParam(val) { - var value = val.value != null ? val.value : val.original || ''; - - if (this.stringParams) { - if (value.replace) { - value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.'); - } - - if (val.depth) { - this.addDepth(val.depth); - } - this.opcode('getContext', val.depth || 0); - this.opcode('pushStringParam', value, val.type); - - if (val.type === 'SubExpression') { - // SubExpressions get evaluated and passed in - // in string params mode. - this.accept(val); - } - } else { - if (this.trackIds) { - var blockParamIndex = undefined; - if (val.parts && !_AST.helpers.scopedId(val) && !val.depth) { - blockParamIndex = this.blockParamIndex(val.parts[0]); - } - if (blockParamIndex) { - var blockParamChild = val.parts.slice(1).join('.'); - this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); - } else { - value = val.original || value; - if (value.replace) { - value = value.replace(/^\.\//g, '').replace(/^\.$/g, ''); - } - - this.opcode('pushId', val.type, value); - } - } - this.accept(val); - } - }, - - setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) { - var params = sexpr.params; - this.pushParams(params); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - if (sexpr.hash) { - this.accept(sexpr.hash); - } else { - this.opcode('emptyHash', omitEmpty); - } - - return params; - }, - - blockParamIndex: function blockParamIndex(name) { - for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) { - var blockParams = this.options.blockParams[depth], - param = blockParams && _utils.indexOf(blockParams, name); - if (blockParams && param >= 0) { - return [depth, param]; - } - } - } - }; - - function precompile(input, options, env) { - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); - } - - options = options || {}; - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options); - return new env.JavaScriptCompiler().compile(environment, options); - } - - function compile(input, _x, env) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); - } - - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var compiled = undefined; - - function compileInput() { - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options), - templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); - return env.template(templateSpec); - } - - // Template is only compiled on first use and cached after that point. - function ret(context, execOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled.call(this, context, execOptions); - } - ret._setup = function (setupOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._setup(setupOptions); - }; - ret._child = function (i, data, blockParams, depths) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._child(i, data, blockParams, depths); - }; - return ret; - } - - function argEquals(a, b) { - if (a === b) { - return true; - } - - if (_utils.isArray(a) && _utils.isArray(b) && a.length === b.length) { - for (var i = 0; i < a.length; i++) { - if (!argEquals(a[i], b[i])) { - return false; - } - } - return true; - } - } - - function transformLiteralToPath(sexpr) { - if (!sexpr.path.parts) { - var literal = sexpr.path; - // Casting to string here to make false and 0 literal values play nicely with the rest - // of the system. - sexpr.path = new _AST.PathExpression(false, 0, [literal.original + ''], literal.original + '', literal.loc); - } - } -}); -define('handlebars/compiler/code-gen',['exports', 'module', '../utils'], function (exports, module, _utils) { - - - var SourceNode = undefined; - - try { - /* istanbul ignore next */ - if (typeof define !== 'function' || !define.amd) { - // We don't support this in AMD environments. For these environments, we asusme that - // they are running on the browser and thus have no need for the source-map library. - var SourceMap = require('source-map'); - SourceNode = SourceMap.SourceNode; - } - } catch (err) {} - - /* istanbul ignore if: tested but not covered in istanbul due to dist build */ - if (!SourceNode) { - SourceNode = function (line, column, srcFile, chunks) { - this.src = ''; - if (chunks) { - this.add(chunks); - } - }; - /* istanbul ignore next */ - SourceNode.prototype = { - add: function add(chunks) { - if (_utils.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src += chunks; - }, - prepend: function prepend(chunks) { - if (_utils.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src = chunks + this.src; - }, - toStringWithSourceMap: function toStringWithSourceMap() { - return { code: this.toString() }; - }, - toString: function toString() { - return this.src; - } - }; - } - - function castChunk(chunk, codeGen, loc) { - if (_utils.isArray(chunk)) { - var ret = []; - - for (var i = 0, len = chunk.length; i < len; i++) { - ret.push(codeGen.wrap(chunk[i], loc)); - } - return ret; - } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { - // Handle primitives that the SourceNode will throw up on - return chunk + ''; - } - return chunk; - } - - function CodeGen(srcFile) { - this.srcFile = srcFile; - this.source = []; - } - - CodeGen.prototype = { - prepend: function prepend(source, loc) { - this.source.unshift(this.wrap(source, loc)); - }, - push: function push(source, loc) { - this.source.push(this.wrap(source, loc)); - }, - - merge: function merge() { - var source = this.empty(); - this.each(function (line) { - source.add([' ', line, '\n']); - }); - return source; - }, - - each: function each(iter) { - for (var i = 0, len = this.source.length; i < len; i++) { - iter(this.source[i]); - } - }, - - empty: function empty() { - var loc = arguments[0] === undefined ? this.currentLocation || { start: {} } : arguments[0]; - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile); - }, - wrap: function wrap(chunk) { - var loc = arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1]; - - if (chunk instanceof SourceNode) { - return chunk; - } - - chunk = castChunk(chunk, this, loc); - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); - }, - - functionCall: function functionCall(fn, type, params) { - params = this.generateList(params); - return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); - }, - - quotedString: function quotedString(str) { - return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 - .replace(/\u2029/g, '\\u2029') + '"'; - }, - - objectLiteral: function objectLiteral(obj) { - var pairs = []; - - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - var value = castChunk(obj[key], this); - if (value !== 'undefined') { - pairs.push([this.quotedString(key), ':', value]); - } - } - } - - var ret = this.generateList(pairs); - ret.prepend('{'); - ret.add('}'); - return ret; - }, - - generateList: function generateList(entries, loc) { - var ret = this.empty(loc); - - for (var i = 0, len = entries.length; i < len; i++) { - if (i) { - ret.add(','); - } - - ret.add(castChunk(entries[i], this, loc)); - } - - return ret; - }, - - generateArray: function generateArray(entries, loc) { - var ret = this.generateList(entries, loc); - ret.prepend('['); - ret.add(']'); - - return ret; - } - }; - - module.exports = CodeGen; -}); -/*global define */ - -/* NOP */; -define('handlebars/compiler/javascript-compiler',['exports', 'module', '../base', '../exception', '../utils', './code-gen'], function (exports, module, _base, _exception, _utils, _codeGen) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _Exception = _interopRequire(_exception); - - var _CodeGen = _interopRequire(_codeGen); - - function Literal(value) { - this.value = value; - } - - function JavaScriptCompiler() {} - - JavaScriptCompiler.prototype = { - // PUBLIC API: You can override these methods in a subclass to provide - // alternative compiled forms for name lookup and buffering semantics - nameLookup: function nameLookup(parent, name /* , type*/) { - if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { - return [parent, '.', name]; - } else { - return [parent, '[\'', name, '\']']; - } - }, - depthedLookup: function depthedLookup(name) { - return [this.aliasable('this.lookup'), '(depths, "', name, '")']; - }, - - compilerInfo: function compilerInfo() { - var revision = _base.COMPILER_REVISION, - versions = _base.REVISION_CHANGES[revision]; - return [revision, versions]; - }, - - appendToBuffer: function appendToBuffer(source, location, explicit) { - // Force a source as this simplifies the merge logic. - if (!_utils.isArray(source)) { - source = [source]; - } - source = this.source.wrap(source, location); - - if (this.environment.isSimple) { - return ['return ', source, ';']; - } else if (explicit) { - // This is a case where the buffer operation occurs as a child of another - // construct, generally braces. We have to explicitly output these buffer - // operations to ensure that the emitted code goes in the correct location. - return ['buffer += ', source, ';']; - } else { - source.appendToBuffer = true; - return source; - } - }, - - initializeBuffer: function initializeBuffer() { - return this.quotedString(''); - }, - // END PUBLIC API - - compile: function compile(environment, options, context, asObject) { - this.environment = environment; - this.options = options; - this.stringParams = this.options.stringParams; - this.trackIds = this.options.trackIds; - this.precompile = !asObject; - - this.name = this.environment.name; - this.isChild = !!context; - this.context = context || { - programs: [], - environments: [] - }; - - this.preamble(); - - this.stackSlot = 0; - this.stackVars = []; - this.aliases = {}; - this.registers = { list: [] }; - this.hashes = []; - this.compileStack = []; - this.inlineStack = []; - this.blockParams = []; - - this.compileChildren(environment, options); - - this.useDepths = this.useDepths || environment.useDepths || this.options.compat; - this.useBlockParams = this.useBlockParams || environment.useBlockParams; - - var opcodes = environment.opcodes, - opcode = undefined, - firstLoc = undefined, - i = undefined, - l = undefined; - - for (i = 0, l = opcodes.length; i < l; i++) { - opcode = opcodes[i]; - - this.source.currentLocation = opcode.loc; - firstLoc = firstLoc || opcode.loc; - this[opcode.opcode].apply(this, opcode.args); - } - - // Flush any trailing content that might be pending. - this.source.currentLocation = firstLoc; - this.pushSource(''); - - /* istanbul ignore next */ - if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { - throw new _Exception('Compile completed with content left on stack'); - } - - var fn = this.createFunctionContext(asObject); - if (!this.isChild) { - var ret = { - compiler: this.compilerInfo(), - main: fn - }; - var programs = this.context.programs; - for (i = 0, l = programs.length; i < l; i++) { - if (programs[i]) { - ret[i] = programs[i]; - } - } - - if (this.environment.usePartial) { - ret.usePartial = true; - } - if (this.options.data) { - ret.useData = true; - } - if (this.useDepths) { - ret.useDepths = true; - } - if (this.useBlockParams) { - ret.useBlockParams = true; - } - if (this.options.compat) { - ret.compat = true; - } - - if (!asObject) { - ret.compiler = JSON.stringify(ret.compiler); - - this.source.currentLocation = { start: { line: 1, column: 0 } }; - ret = this.objectLiteral(ret); - - if (options.srcName) { - ret = ret.toStringWithSourceMap({ file: options.destName }); - ret.map = ret.map && ret.map.toString(); - } else { - ret = ret.toString(); - } - } else { - ret.compilerOptions = this.options; - } - - return ret; - } else { - return fn; - } - }, - - preamble: function preamble() { - // track the last context pushed into place to allow skipping the - // getContext opcode when it would be a noop - this.lastContext = 0; - this.source = new _CodeGen(this.options.srcName); - }, - - createFunctionContext: function createFunctionContext(asObject) { - var varDeclarations = ''; - - var locals = this.stackVars.concat(this.registers.list); - if (locals.length > 0) { - varDeclarations += ', ' + locals.join(', '); - } - - // Generate minimizer alias mappings - // - // When using true SourceNodes, this will update all references to the given alias - // as the source nodes are reused in situ. For the non-source node compilation mode, - // aliases will not be used, but this case is already being run on the client and - // we aren't concern about minimizing the template size. - var aliasCount = 0; - for (var alias in this.aliases) { - // eslint-disable-line guard-for-in - var node = this.aliases[alias]; - - if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) { - varDeclarations += ', alias' + ++aliasCount + '=' + alias; - node.children[0] = 'alias' + aliasCount; - } - } - - var params = ['depth0', 'helpers', 'partials', 'data']; - - if (this.useBlockParams || this.useDepths) { - params.push('blockParams'); - } - if (this.useDepths) { - params.push('depths'); - } - - // Perform a second pass over the output to merge content when possible - var source = this.mergeSource(varDeclarations); - - if (asObject) { - params.push(source); - - return Function.apply(this, params); - } else { - return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); - } - }, - mergeSource: function mergeSource(varDeclarations) { - var isSimple = this.environment.isSimple, - appendOnly = !this.forceBuffer, - appendFirst = undefined, - sourceSeen = undefined, - bufferStart = undefined, - bufferEnd = undefined; - this.source.each(function (line) { - if (line.appendToBuffer) { - if (bufferStart) { - line.prepend(' + '); - } else { - bufferStart = line; - } - bufferEnd = line; - } else { - if (bufferStart) { - if (!sourceSeen) { - appendFirst = true; - } else { - bufferStart.prepend('buffer += '); - } - bufferEnd.add(';'); - bufferStart = bufferEnd = undefined; - } - - sourceSeen = true; - if (!isSimple) { - appendOnly = false; - } - } - }); - - if (appendOnly) { - if (bufferStart) { - bufferStart.prepend('return '); - bufferEnd.add(';'); - } else if (!sourceSeen) { - this.source.push('return "";'); - } - } else { - varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); - - if (bufferStart) { - bufferStart.prepend('return buffer + '); - bufferEnd.add(';'); - } else { - this.source.push('return buffer;'); - } - } - - if (varDeclarations) { - this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); - } - - return this.source.merge(); - }, - - // [blockValue] - // - // On stack, before: hash, inverse, program, value - // On stack, after: return value of blockHelperMissing - // - // The purpose of this opcode is to take a block of the form - // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and - // replace it on the stack with the result of properly - // invoking blockHelperMissing. - blockValue: function blockValue(name) { - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs(name, 0, params); - - var blockName = this.popStack(); - params.splice(1, 0, blockName); - - this.push(this.source.functionCall(blockHelperMissing, 'call', params)); - }, - - // [ambiguousBlockValue] - // - // On stack, before: hash, inverse, program, value - // Compiler value, before: lastHelper=value of last found helper, if any - // On stack, after, if no lastHelper: same as [blockValue] - // On stack, after, if lastHelper: value - ambiguousBlockValue: function ambiguousBlockValue() { - // We're being a bit cheeky and reusing the options value from the prior exec - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs('', 0, params, true); - - this.flushInline(); - - var current = this.topStack(); - params.splice(1, 0, current); - - this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']); - }, - - // [appendContent] - // - // On stack, before: ... - // On stack, after: ... - // - // Appends the string value of `content` to the current buffer - appendContent: function appendContent(content) { - if (this.pendingContent) { - content = this.pendingContent + content; - } else { - this.pendingLocation = this.source.currentLocation; - } - - this.pendingContent = content; - }, - - // [append] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Coerces `value` to a String and appends it to the current buffer. - // - // If `value` is truthy, or 0, it is coerced into a string and appended - // Otherwise, the empty string is appended - append: function append() { - if (this.isInline()) { - this.replaceStack(function (current) { - return [' != null ? ', current, ' : ""']; - }); - - this.pushSource(this.appendToBuffer(this.popStack())); - } else { - var local = this.popStack(); - this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); - if (this.environment.isSimple) { - this.pushSource(['else { ', this.appendToBuffer('\'\'', undefined, true), ' }']); - } - } - }, - - // [appendEscaped] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Escape `value` and append it to the buffer - appendEscaped: function appendEscaped() { - this.pushSource(this.appendToBuffer([this.aliasable('this.escapeExpression'), '(', this.popStack(), ')'])); - }, - - // [getContext] - // - // On stack, before: ... - // On stack, after: ... - // Compiler value, after: lastContext=depth - // - // Set the value of the `lastContext` compiler value to the depth - getContext: function getContext(depth) { - this.lastContext = depth; - }, - - // [pushContext] - // - // On stack, before: ... - // On stack, after: currentContext, ... - // - // Pushes the value of the current context onto the stack. - pushContext: function pushContext() { - this.pushStackLiteral(this.contextName(this.lastContext)); - }, - - // [lookupOnContext] - // - // On stack, before: ... - // On stack, after: currentContext[name], ... - // - // Looks up the value of `name` on the current context and pushes - // it onto the stack. - lookupOnContext: function lookupOnContext(parts, falsy, scoped) { - var i = 0; - - if (!scoped && this.options.compat && !this.lastContext) { - // The depthed query is expected to handle the undefined logic for the root level that - // is implemented below, so we evaluate that directly in compat mode - this.push(this.depthedLookup(parts[i++])); - } else { - this.pushContext(); - } - - this.resolvePath('context', parts, i, falsy); - }, - - // [lookupBlockParam] - // - // On stack, before: ... - // On stack, after: blockParam[name], ... - // - // Looks up the value of `parts` on the given block param and pushes - // it onto the stack. - lookupBlockParam: function lookupBlockParam(blockParamId, parts) { - this.useBlockParams = true; - - this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); - this.resolvePath('context', parts, 1); - }, - - // [lookupData] - // - // On stack, before: ... - // On stack, after: data, ... - // - // Push the data lookup operator - lookupData: function lookupData(depth, parts) { - if (!depth) { - this.pushStackLiteral('data'); - } else { - this.pushStackLiteral('this.data(data, ' + depth + ')'); - } - - this.resolvePath('data', parts, 0, true); - }, - - resolvePath: function resolvePath(type, parts, i, falsy) { - var _this = this; - - if (this.options.strict || this.options.assumeObjects) { - this.push(strictLookup(this.options.strict, this, parts, type)); - return; - } - - var len = parts.length; - for (; i < len; i++) { - /*eslint-disable no-loop-func */ - this.replaceStack(function (current) { - var lookup = _this.nameLookup(current, parts[i], type); - // We want to ensure that zero and false are handled properly if the context (falsy flag) - // needs to have the special handling for these values. - if (!falsy) { - return [' != null ? ', lookup, ' : ', current]; - } else { - // Otherwise we can use generic falsy handling - return [' && ', lookup]; - } - }); - /*eslint-enable no-loop-func */ - } - }, - - // [resolvePossibleLambda] - // - // On stack, before: value, ... - // On stack, after: resolved value, ... - // - // If the `value` is a lambda, replace it on the stack by - // the return value of the lambda - resolvePossibleLambda: function resolvePossibleLambda() { - this.push([this.aliasable('this.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); - }, - - // [pushStringParam] - // - // On stack, before: ... - // On stack, after: string, currentContext, ... - // - // This opcode is designed for use in string mode, which - // provides the string value of a parameter along with its - // depth rather than resolving it immediately. - pushStringParam: function pushStringParam(string, type) { - this.pushContext(); - this.pushString(type); - - // If it's a subexpression, the string result - // will be pushed after this opcode. - if (type !== 'SubExpression') { - if (typeof string === 'string') { - this.pushString(string); - } else { - this.pushStackLiteral(string); - } - } - }, - - emptyHash: function emptyHash(omitEmpty) { - if (this.trackIds) { - this.push('{}'); // hashIds - } - if (this.stringParams) { - this.push('{}'); // hashContexts - this.push('{}'); // hashTypes - } - this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); - }, - pushHash: function pushHash() { - if (this.hash) { - this.hashes.push(this.hash); - } - this.hash = { values: [], types: [], contexts: [], ids: [] }; - }, - popHash: function popHash() { - var hash = this.hash; - this.hash = this.hashes.pop(); - - if (this.trackIds) { - this.push(this.objectLiteral(hash.ids)); - } - if (this.stringParams) { - this.push(this.objectLiteral(hash.contexts)); - this.push(this.objectLiteral(hash.types)); - } - - this.push(this.objectLiteral(hash.values)); - }, - - // [pushString] - // - // On stack, before: ... - // On stack, after: quotedString(string), ... - // - // Push a quoted version of `string` onto the stack - pushString: function pushString(string) { - this.pushStackLiteral(this.quotedString(string)); - }, - - // [pushLiteral] - // - // On stack, before: ... - // On stack, after: value, ... - // - // Pushes a value onto the stack. This operation prevents - // the compiler from creating a temporary variable to hold - // it. - pushLiteral: function pushLiteral(value) { - this.pushStackLiteral(value); - }, - - // [pushProgram] - // - // On stack, before: ... - // On stack, after: program(guid), ... - // - // Push a program expression onto the stack. This takes - // a compile-time guid and converts it into a runtime-accessible - // expression. - pushProgram: function pushProgram(guid) { - if (guid != null) { - this.pushStackLiteral(this.programExpression(guid)); - } else { - this.pushStackLiteral(null); - } - }, - - // [invokeHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // Pops off the helper's parameters, invokes the helper, - // and pushes the helper's return value onto the stack. - // - // If the helper is not found, `helperMissing` is called. - invokeHelper: function invokeHelper(paramSize, name, isSimple) { - var nonHelper = this.popStack(), - helper = this.setupHelper(paramSize, name), - simple = isSimple ? [helper.name, ' || '] : ''; - - var lookup = ['('].concat(simple, nonHelper); - if (!this.options.strict) { - lookup.push(' || ', this.aliasable('helpers.helperMissing')); - } - lookup.push(')'); - - this.push(this.source.functionCall(lookup, 'call', helper.callParams)); - }, - - // [invokeKnownHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // This operation is used when the helper is known to exist, - // so a `helperMissing` fallback is not required. - invokeKnownHelper: function invokeKnownHelper(paramSize, name) { - var helper = this.setupHelper(paramSize, name); - this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); - }, - - // [invokeAmbiguous] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of disambiguation - // - // This operation is used when an expression like `{{foo}}` - // is provided, but we don't know at compile-time whether it - // is a helper or a path. - // - // This operation emits more code than the other options, - // and can be avoided by passing the `knownHelpers` and - // `knownHelpersOnly` flags at compile-time. - invokeAmbiguous: function invokeAmbiguous(name, helperCall) { - this.useRegister('helper'); - - var nonHelper = this.popStack(); - - this.emptyHash(); - var helper = this.setupHelper(0, name, helperCall); - - var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); - - var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; - if (!this.options.strict) { - lookup[0] = '(helper = '; - lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing')); - } - - this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']); - }, - - // [invokePartial] - // - // On stack, before: context, ... - // On stack after: result of partial invocation - // - // This operation pops off a context, invokes a partial with that context, - // and pushes the result of the invocation back. - invokePartial: function invokePartial(isDynamic, name, indent) { - var params = [], - options = this.setupParams(name, 1, params, false); - - if (isDynamic) { - name = this.popStack(); - delete options.name; - } - - if (indent) { - options.indent = JSON.stringify(indent); - } - options.helpers = 'helpers'; - options.partials = 'partials'; - - if (!isDynamic) { - params.unshift(this.nameLookup('partials', name, 'partial')); - } else { - params.unshift(name); - } - - if (this.options.compat) { - options.depths = 'depths'; - } - options = this.objectLiteral(options); - params.push(options); - - this.push(this.source.functionCall('this.invokePartial', '', params)); - }, - - // [assignToHash] - // - // On stack, before: value, ..., hash, ... - // On stack, after: ..., hash, ... - // - // Pops a value off the stack and assigns it to the current hash - assignToHash: function assignToHash(key) { - var value = this.popStack(), - context = undefined, - type = undefined, - id = undefined; - - if (this.trackIds) { - id = this.popStack(); - } - if (this.stringParams) { - type = this.popStack(); - context = this.popStack(); - } - - var hash = this.hash; - if (context) { - hash.contexts[key] = context; - } - if (type) { - hash.types[key] = type; - } - if (id) { - hash.ids[key] = id; - } - hash.values[key] = value; - }, - - pushId: function pushId(type, name, child) { - if (type === 'BlockParam') { - this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : '')); - } else if (type === 'PathExpression') { - this.pushString(name); - } else if (type === 'SubExpression') { - this.pushStackLiteral('true'); - } else { - this.pushStackLiteral('null'); - } - }, - - // HELPERS - - compiler: JavaScriptCompiler, - - compileChildren: function compileChildren(environment, options) { - var children = environment.children, - child = undefined, - compiler = undefined; - - for (var i = 0, l = children.length; i < l; i++) { - child = children[i]; - compiler = new this.compiler(); // eslint-disable-line new-cap - - var index = this.matchExistingProgram(child); - - if (index == null) { - this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children - index = this.context.programs.length; - child.index = index; - child.name = 'program' + index; - this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); - this.context.environments[index] = child; - - this.useDepths = this.useDepths || compiler.useDepths; - this.useBlockParams = this.useBlockParams || compiler.useBlockParams; - } else { - child.index = index; - child.name = 'program' + index; - - this.useDepths = this.useDepths || child.useDepths; - this.useBlockParams = this.useBlockParams || child.useBlockParams; - } - } - }, - matchExistingProgram: function matchExistingProgram(child) { - for (var i = 0, len = this.context.environments.length; i < len; i++) { - var environment = this.context.environments[i]; - if (environment && environment.equals(child)) { - return i; - } - } - }, - - programExpression: function programExpression(guid) { - var child = this.environment.children[guid], - programParams = [child.index, 'data', child.blockParams]; - - if (this.useBlockParams || this.useDepths) { - programParams.push('blockParams'); - } - if (this.useDepths) { - programParams.push('depths'); - } - - return 'this.program(' + programParams.join(', ') + ')'; - }, - - useRegister: function useRegister(name) { - if (!this.registers[name]) { - this.registers[name] = true; - this.registers.list.push(name); - } - }, - - push: function push(expr) { - if (!(expr instanceof Literal)) { - expr = this.source.wrap(expr); - } - - this.inlineStack.push(expr); - return expr; - }, - - pushStackLiteral: function pushStackLiteral(item) { - this.push(new Literal(item)); - }, - - pushSource: function pushSource(source) { - if (this.pendingContent) { - this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); - this.pendingContent = undefined; - } - - if (source) { - this.source.push(source); - } - }, - - replaceStack: function replaceStack(callback) { - var prefix = ['('], - stack = undefined, - createdStack = undefined, - usedLiteral = undefined; - - /* istanbul ignore next */ - if (!this.isInline()) { - throw new _Exception('replaceStack on non-inline'); - } - - // We want to merge the inline statement into the replacement statement via ',' - var top = this.popStack(true); - - if (top instanceof Literal) { - // Literals do not need to be inlined - stack = [top.value]; - prefix = ['(', stack]; - usedLiteral = true; - } else { - // Get or create the current stack name for use by the inline - createdStack = true; - var _name = this.incrStack(); - - prefix = ['((', this.push(_name), ' = ', top, ')']; - stack = this.topStack(); - } - - var item = callback.call(this, stack); - - if (!usedLiteral) { - this.popStack(); - } - if (createdStack) { - this.stackSlot--; - } - this.push(prefix.concat(item, ')')); - }, - - incrStack: function incrStack() { - this.stackSlot++; - if (this.stackSlot > this.stackVars.length) { - this.stackVars.push('stack' + this.stackSlot); - } - return this.topStackName(); - }, - topStackName: function topStackName() { - return 'stack' + this.stackSlot; - }, - flushInline: function flushInline() { - var inlineStack = this.inlineStack; - this.inlineStack = []; - for (var i = 0, len = inlineStack.length; i < len; i++) { - var entry = inlineStack[i]; - /* istanbul ignore if */ - if (entry instanceof Literal) { - this.compileStack.push(entry); - } else { - var stack = this.incrStack(); - this.pushSource([stack, ' = ', entry, ';']); - this.compileStack.push(stack); - } - } - }, - isInline: function isInline() { - return this.inlineStack.length; - }, - - popStack: function popStack(wrapped) { - var inline = this.isInline(), - item = (inline ? this.inlineStack : this.compileStack).pop(); - - if (!wrapped && item instanceof Literal) { - return item.value; - } else { - if (!inline) { - /* istanbul ignore next */ - if (!this.stackSlot) { - throw new _Exception('Invalid stack pop'); - } - this.stackSlot--; - } - return item; - } - }, - - topStack: function topStack() { - var stack = this.isInline() ? this.inlineStack : this.compileStack, - item = stack[stack.length - 1]; - - /* istanbul ignore if */ - if (item instanceof Literal) { - return item.value; - } else { - return item; - } - }, - - contextName: function contextName(context) { - if (this.useDepths && context) { - return 'depths[' + context + ']'; - } else { - return 'depth' + context; - } - }, - - quotedString: function quotedString(str) { - return this.source.quotedString(str); - }, - - objectLiteral: function objectLiteral(obj) { - return this.source.objectLiteral(obj); - }, - - aliasable: function aliasable(name) { - var ret = this.aliases[name]; - if (ret) { - ret.referenceCount++; - return ret; - } - - ret = this.aliases[name] = this.source.wrap(name); - ret.aliasable = true; - ret.referenceCount = 1; - - return ret; - }, - - setupHelper: function setupHelper(paramSize, name, blockHelper) { - var params = [], - paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); - var foundHelper = this.nameLookup('helpers', name, 'helper'); - - return { - params: params, - paramsInit: paramsInit, - name: foundHelper, - callParams: [this.contextName(0)].concat(params) - }; - }, - - setupParams: function setupParams(helper, paramSize, params) { - var options = {}, - contexts = [], - types = [], - ids = [], - param = undefined; - - options.name = this.quotedString(helper); - options.hash = this.popStack(); - - if (this.trackIds) { - options.hashIds = this.popStack(); - } - if (this.stringParams) { - options.hashTypes = this.popStack(); - options.hashContexts = this.popStack(); - } - - var inverse = this.popStack(), - program = this.popStack(); - - // Avoid setting fn and inverse if neither are set. This allows - // helpers to do a check for `if (options.fn)` - if (program || inverse) { - options.fn = program || 'this.noop'; - options.inverse = inverse || 'this.noop'; - } - - // The parameters go on to the stack in order (making sure that they are evaluated in order) - // so we need to pop them off the stack in reverse order - var i = paramSize; - while (i--) { - param = this.popStack(); - params[i] = param; - - if (this.trackIds) { - ids[i] = this.popStack(); - } - if (this.stringParams) { - types[i] = this.popStack(); - contexts[i] = this.popStack(); - } - } - - if (this.trackIds) { - options.ids = this.source.generateArray(ids); - } - if (this.stringParams) { - options.types = this.source.generateArray(types); - options.contexts = this.source.generateArray(contexts); - } - - if (this.options.data) { - options.data = 'data'; - } - if (this.useBlockParams) { - options.blockParams = 'blockParams'; - } - return options; - }, - - setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) { - var options = this.setupParams(helper, paramSize, params, true); - options = this.objectLiteral(options); - if (useRegister) { - this.useRegister('options'); - params.push('options'); - return ['options=', options]; - } else { - params.push(options); - return ''; - } - } - }; - - (function () { - var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' '); - - var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; - - for (var i = 0, l = reservedWords.length; i < l; i++) { - compilerWords[reservedWords[i]] = true; - } - })(); - - JavaScriptCompiler.isValidJavaScriptVariableName = function (name) { - return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name); - }; - - function strictLookup(requireTerminal, compiler, parts, type) { - var stack = compiler.popStack(), - i = 0, - len = parts.length; - if (requireTerminal) { - len--; - } - - for (; i < len; i++) { - stack = compiler.nameLookup(stack, parts[i], type); - } - - if (requireTerminal) { - return [compiler.aliasable('this.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')']; - } else { - return stack; - } - } - - module.exports = JavaScriptCompiler; -}); -define('handlebars',['exports', 'module', './handlebars.runtime', './handlebars/compiler/ast', './handlebars/compiler/base', './handlebars/compiler/compiler', './handlebars/compiler/javascript-compiler', './handlebars/compiler/visitor', './handlebars/no-conflict'], function (exports, module, _handlebarsRuntime, _handlebarsCompilerAst, _handlebarsCompilerBase, _handlebarsCompilerCompiler, _handlebarsCompilerJavascriptCompiler, _handlebarsCompilerVisitor, _handlebarsNoConflict) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - var _runtime = _interopRequire(_handlebarsRuntime); - - // Compiler imports - - var _AST = _interopRequire(_handlebarsCompilerAst); - - var _JavaScriptCompiler = _interopRequire(_handlebarsCompilerJavascriptCompiler); - - var _Visitor = _interopRequire(_handlebarsCompilerVisitor); - - var _noConflict = _interopRequire(_handlebarsNoConflict); - - var _create = _runtime.create; - function create() { - var hb = _create(); - - hb.compile = function (input, options) { - return _handlebarsCompilerCompiler.compile(input, options, hb); - }; - hb.precompile = function (input, options) { - return _handlebarsCompilerCompiler.precompile(input, options, hb); - }; - - hb.AST = _AST; - hb.Compiler = _handlebarsCompilerCompiler.Compiler; - hb.JavaScriptCompiler = _JavaScriptCompiler; - hb.Parser = _handlebarsCompilerBase.parser; - hb.parse = _handlebarsCompilerBase.parse; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict(inst); - - inst.Visitor = _Visitor; - - inst['default'] = inst; - - module.exports = inst; -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.min.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.min.js deleted file mode 100644 index 752a053..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.amd.min.js +++ /dev/null @@ -1,29 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -define("handlebars/utils",["exports"],function(a){function b(a){return i[a]}function c(a){for(var b=1;bc;c++)if(a[c]===b)return c;return-1}function e(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return k.test(a)?a.replace(j,b):a}function f(a){return a||0===a?n(a)&&0===a.length?!0:!1:!0}function g(a,b){return a.path=b,a}function h(a,b){return(a?a+".":"")+b}a.__esModule=!0,a.extend=c,a.indexOf=d,a.escapeExpression=e,a.isEmpty=f,a.blockParams=g,a.appendContextPath=h;var i={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},j=/[&<>"'`]/g,k=/[&<>"'`]/,l=Object.prototype.toString;a.toString=l;var m=function(a){return"function"==typeof a};m(/x/)&&(a.isFunction=m=function(a){return"function"==typeof a&&"[object Function]"===l.call(a)});var m;a.isFunction=m;var n=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===l.call(a):!1};a.isArray=n}),define("handlebars/exception",["exports","module"],function(a,b){function c(a,b){var e=b&&b.loc,f=void 0,g=void 0;e&&(f=e.start.line,g=e.start.column,a+=" - "+f+":"+g);for(var h=Error.prototype.constructor.call(this,a),i=0;i0?(d.ids&&(d.ids=[d.name]),a.helpers.each(c,d)):e(this);if(d.data&&d.ids){var h=f(d.data);h.contextPath=b.appendContextPath(d.data.contextPath,d.name),d={data:h}}return g(c,d)}),a.registerHelper("each",function(a,c){function d(c,d,f){k&&(k.key=c,k.index=d,k.first=0===d,k.last=!!f,n&&(k.contextPath=n+c)),j+=e(a[c],{data:k,blockParams:b.blockParams([a[c],c],[n+c,null])})}if(!c)throw new h("Must pass iterator to #each");var e=c.fn,g=c.inverse,i=0,j="",k=void 0,n=void 0;if(c.data&&c.ids&&(n=b.appendContextPath(c.data.contextPath,c.ids[0])+"."),m(a)&&(a=a.call(this)),c.data&&(k=f(c.data)),a&&"object"==typeof a)if(l(a))for(var o=a.length;o>i;i++)d(i,i,i===a.length-1);else{var p=void 0;for(var q in a)a.hasOwnProperty(q)&&(p&&d(p,i-1),p=q,i++);p&&d(p,i-1,!0)}return 0===i&&(j=g(this)),j}),a.registerHelper("if",function(a,c){return m(a)&&(a=a.call(this)),!c.hash.includeZero&&!a||b.isEmpty(a)?c.inverse(this):c.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,c){m(a)&&(a=a.call(this));var d=c.fn;if(b.isEmpty(a))return c.inverse(this);if(c.data&&c.ids){var e=f(c.data);e.contextPath=b.appendContextPath(c.data.contextPath,c.ids[0]),c={data:e}}return d(a,c)}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)}),a.registerHelper("lookup",function(a,b){return a&&a[b]})}function f(a){var c=b.extend({},a);return c._parent=a,c}var g=function(a){return a&&a.__esModule?a["default"]:a};a.__esModule=!0,a.HandlebarsEnvironment=d,a.createFrame=f;var h=g(c),i="3.0.1";a.VERSION=i;var j=6;a.COMPILER_REVISION=j;var k={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1"};a.REVISION_CHANGES=k;var l=b.isArray,m=b.isFunction,n=b.toString,o="[object Object]";d.prototype={constructor:d,logger:p,log:q,registerHelper:function(a,c){if(n.call(a)===o){if(c)throw new h("Arg not supported with multiple helpers");b.extend(this.helpers,a)}else this.helpers[a]=c},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,c){if(n.call(a)===o)b.extend(this.partials,a);else{if("undefined"==typeof c)throw new h("Attempting to register a partial as undefined");this.partials[a]=c}},unregisterPartial:function(a){delete this.partials[a]}};var p={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:1,log:function(a,b){if("undefined"!=typeof console&&p.level<=a){var c=p.methodMap[a];(console[c]||console.log).call(console,b)}}};a.logger=p;var q=p.log;a.log=q}),define("handlebars/safe-string",["exports","module"],function(a,b){function c(a){this.string=a}c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b.exports=c}),define("handlebars/runtime",["exports","./utils","./exception","./base"],function(a,b,c,d){function e(a){var b=a&&a[0]||1,c=d.COMPILER_REVISION;if(b!==c){if(c>b){var e=d.REVISION_CHANGES[c],f=d.REVISION_CHANGES[b];throw new m("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+e+") or downgrade your runtime to an older version ("+f+").")}throw new m("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function f(a,c){function d(d,e,f){f.hash&&(e=b.extend({},e,f.hash)),d=c.VM.resolvePartial.call(this,d,e,f);var g=c.VM.invokePartial.call(this,d,e,f);if(null==g&&c.compile&&(f.partials[f.name]=c.compile(d,a.compilerOptions,c),g=f.partials[f.name](e,f)),null!=g){if(f.indent){for(var h=g.split("\n"),i=0,j=h.length;j>i&&(h[i]||i+1!==j);i++)h[i]=f.indent+h[i];g=h.join("\n")}return g}throw new m("The partial "+f.name+" could not be compiled when running in runtime-only mode")}function e(b){var c=void 0===arguments[1]?{}:arguments[1],d=c.data;e._setup(c),!c.partial&&a.useData&&(d=k(b,d));var g=void 0,h=a.useBlockParams?[]:void 0;return a.useDepths&&(g=c.depths?[b].concat(c.depths):[b]),a.main.call(f,b,f.helpers,f.partials,d,h,g)}if(!c)throw new m("No environment passed to template");if(!a||!a.main)throw new m("Unknown template object: "+typeof a);c.VM.checkRevision(a.compiler);var f={strict:function(a,b){if(!(b in a))throw new m('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;c>d;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:b.escapeExpression,invokePartial:d,fn:function(b){return a[b]},programs:[],program:function(a,b,c,d,e){var f=this.programs[a],h=this.fn(a);return b||e||d||c?f=g(this,a,h,b,c,d,e):f||(f=this.programs[a]=g(this,a,h)),f},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,c){var d=a||c;return a&&c&&a!==c&&(d=b.extend({},c,a)),d},noop:c.VM.noop,compilerInfo:a.compiler};return e.isTop=!0,e._setup=function(b){b.partial?(f.helpers=b.helpers,f.partials=b.partials):(f.helpers=f.merge(b.helpers,c.helpers),a.usePartial&&(f.partials=f.merge(b.partials,c.partials)))},e._child=function(b,c,d,e){if(a.useBlockParams&&!d)throw new m("must pass block params");if(a.useDepths&&!e)throw new m("must pass parent depths");return g(f,b,a[b],c,0,d,e)},e}function g(a,b,c,d,e,f,g){function h(b){var e=void 0===arguments[1]?{}:arguments[1];return c.call(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),g&&[b].concat(g))}return h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function h(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a=c.partials[c.name],a}function i(a,b,c){if(c.partial=!0,void 0===a)throw new m("The partial "+c.name+" could not be found");return a instanceof Function?a(b,c):void 0}function j(){return""}function k(a,b){return b&&"root"in b||(b=b?d.createFrame(b):{},b.root=a),b}var l=function(a){return a&&a.__esModule?a["default"]:a};a.__esModule=!0,a.checkRevision=e,a.template=f,a.wrapProgram=g,a.resolvePartial=h,a.invokePartial=i,a.noop=j;var m=l(c)}),define("handlebars/no-conflict",["exports","module"],function(a,b){b.exports=function(a){var b="undefined"!=typeof global?global:window,c=b.Handlebars;a.noConflict=function(){b.Handlebars===a&&(b.Handlebars=c)}}}),define("handlebars.runtime",["exports","module","./handlebars/base","./handlebars/safe-string","./handlebars/exception","./handlebars/utils","./handlebars/runtime","./handlebars/no-conflict"],function(a,b,c,d,e,f,g,h){function i(){var a=new c.HandlebarsEnvironment;return f.extend(a,c),a.SafeString=k,a.Exception=l,a.Utils=f,a.escapeExpression=f.escapeExpression,a.VM=g,a.template=function(b){return g.template(b,a)},a}var j=function(a){return a&&a.__esModule?a["default"]:a},k=j(d),l=j(e),m=j(h),n=i();n.create=i,m(n),n["default"]=n,b.exports=n}),define("handlebars/compiler/ast",["exports","module"],function(a,b){var c={Program:function(a,b,c,d){this.loc=d,this.type="Program",this.body=a,this.blockParams=b,this.strip=c},MustacheStatement:function(a,b,c,d,e,f){this.loc=f,this.type="MustacheStatement",this.path=a,this.params=b||[],this.hash=c,this.escaped=d,this.strip=e},BlockStatement:function(a,b,c,d,e,f,g,h,i){this.loc=i,this.type="BlockStatement",this.path=a,this.params=b||[],this.hash=c,this.program=d,this.inverse=e,this.openStrip=f,this.inverseStrip=g,this.closeStrip=h},PartialStatement:function(a,b,c,d,e){this.loc=e,this.type="PartialStatement",this.name=a,this.params=b||[],this.hash=c,this.indent="",this.strip=d},ContentStatement:function(a,b){this.loc=b,this.type="ContentStatement",this.original=this.value=a},CommentStatement:function(a,b,c){this.loc=c,this.type="CommentStatement",this.value=a,this.strip=b},SubExpression:function(a,b,c,d){this.loc=d,this.type="SubExpression",this.path=a,this.params=b||[],this.hash=c},PathExpression:function(a,b,c,d,e){this.loc=e,this.type="PathExpression",this.data=a,this.original=d,this.parts=c,this.depth=b},StringLiteral:function(a,b){this.loc=b,this.type="StringLiteral",this.original=this.value=a},NumberLiteral:function(a,b){this.loc=b,this.type="NumberLiteral",this.original=this.value=Number(a)},BooleanLiteral:function(a,b){this.loc=b,this.type="BooleanLiteral",this.original=this.value="true"===a},UndefinedLiteral:function(a){this.loc=a,this.type="UndefinedLiteral",this.original=this.value=void 0},NullLiteral:function(a){this.loc=a,this.type="NullLiteral",this.original=this.value=null},Hash:function(a,b){this.loc=b,this.type="Hash",this.pairs=a},HashPair:function(a,b,c){this.loc=c,this.type="HashPair",this.key=a,this.value=b},helpers:{helperExpression:function(a){return!("SubExpression"!==a.type&&!a.params.length&&!a.hash)},scopedId:function(a){return/^\.|this\b/.test(a.original)},simpleId:function(a){return 1===a.parts.length&&!c.helpers.scopedId(a)&&!a.depth}}};b.exports=c}),define("handlebars/compiler/parser",["exports","module"],function(a,b){var c=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,content:12,COMMENT:13,CONTENT:14,openRawBlock:15,END_RAW_BLOCK:16,OPEN_RAW_BLOCK:17,helperName:18,openRawBlock_repetition0:19,openRawBlock_option0:20,CLOSE_RAW_BLOCK:21,openBlock:22,block_option0:23,closeBlock:24,openInverse:25,block_option1:26,OPEN_BLOCK:27,openBlock_repetition0:28,openBlock_option0:29,openBlock_option1:30,CLOSE:31,OPEN_INVERSE:32,openInverse_repetition0:33,openInverse_option0:34,openInverse_option1:35,openInverseChain:36,OPEN_INVERSE_CHAIN:37,openInverseChain_repetition0:38,openInverseChain_option0:39,openInverseChain_option1:40,inverseAndProgram:41,INVERSE:42,inverseChain:43,inverseChain_option0:44,OPEN_ENDBLOCK:45,OPEN:46,mustache_repetition0:47,mustache_option0:48,OPEN_UNESCAPED:49,mustache_repetition1:50,mustache_option1:51,CLOSE_UNESCAPED:52,OPEN_PARTIAL:53,partialName:54,partial_repetition0:55,partial_option0:56,param:57,sexpr:58,OPEN_SEXPR:59,sexpr_repetition0:60,sexpr_option0:61,CLOSE_SEXPR:62,hash:63,hash_repetition_plus0:64,hashSegment:65,ID:66,EQUALS:67,blockParams:68,OPEN_BLOCK_PARAMS:69,blockParams_repetition_plus0:70,CLOSE_BLOCK_PARAMS:71,path:72,dataName:73,STRING:74,NUMBER:75,BOOLEAN:76,UNDEFINED:77,NULL:78,DATA:79,pathSegments:80,SEP:81,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",13:"COMMENT",14:"CONTENT",16:"END_RAW_BLOCK",17:"OPEN_RAW_BLOCK",21:"CLOSE_RAW_BLOCK",27:"OPEN_BLOCK",31:"CLOSE",32:"OPEN_INVERSE",37:"OPEN_INVERSE_CHAIN",42:"INVERSE",45:"OPEN_ENDBLOCK",46:"OPEN",49:"OPEN_UNESCAPED",52:"CLOSE_UNESCAPED",53:"OPEN_PARTIAL",59:"OPEN_SEXPR",62:"CLOSE_SEXPR",66:"ID",67:"EQUALS",69:"OPEN_BLOCK_PARAMS",71:"CLOSE_BLOCK_PARAMS",74:"STRING",75:"NUMBER",76:"BOOLEAN",77:"UNDEFINED",78:"NULL",79:"DATA",81:"SEP"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[12,1],[10,3],[15,5],[9,4],[9,4],[22,6],[25,6],[36,6],[41,2],[43,3],[43,1],[24,3],[8,5],[8,5],[11,5],[57,1],[57,1],[58,5],[63,1],[65,3],[68,3],[18,1],[18,1],[18,1],[18,1],[18,1],[18,1],[18,1],[54,1],[54,1],[73,2],[72,1],[80,3],[80,1],[6,0],[6,2],[19,0],[19,2],[20,0],[20,1],[23,0],[23,1],[26,0],[26,1],[28,0],[28,2],[29,0],[29,1],[30,0],[30,1],[33,0],[33,2],[34,0],[34,1],[35,0],[35,1],[38,0],[38,2],[39,0],[39,1],[40,0],[40,1],[44,0],[44,1],[47,0],[47,2],[48,0],[48,1],[50,0],[50,2],[51,0],[51,1],[55,0],[55,2],[56,0],[56,1],[60,0],[60,2],[61,0],[61,1],[64,1],[64,2],[70,1],[70,2]],performAction:function(a,b,c,d,e,f){var g=f.length-1;switch(e){case 1:return f[g-1];case 2:this.$=new d.Program(f[g],null,{},d.locInfo(this._$));break;case 3:this.$=f[g];break;case 4:this.$=f[g];break;case 5:this.$=f[g];break;case 6:this.$=f[g];break;case 7:this.$=f[g];break;case 8:this.$=new d.CommentStatement(d.stripComment(f[g]),d.stripFlags(f[g],f[g]),d.locInfo(this._$));break;case 9:this.$=new d.ContentStatement(f[g],d.locInfo(this._$));break;case 10:this.$=d.prepareRawBlock(f[g-2],f[g-1],f[g],this._$);break;case 11:this.$={path:f[g-3],params:f[g-2],hash:f[g-1]};break;case 12:this.$=d.prepareBlock(f[g-3],f[g-2],f[g-1],f[g],!1,this._$);break;case 13:this.$=d.prepareBlock(f[g-3],f[g-2],f[g-1],f[g],!0,this._$);break;case 14:this.$={path:f[g-4],params:f[g-3],hash:f[g-2],blockParams:f[g-1],strip:d.stripFlags(f[g-5],f[g])};break;case 15:this.$={path:f[g-4],params:f[g-3],hash:f[g-2],blockParams:f[g-1],strip:d.stripFlags(f[g-5],f[g])};break;case 16:this.$={path:f[g-4],params:f[g-3],hash:f[g-2],blockParams:f[g-1],strip:d.stripFlags(f[g-5],f[g])};break;case 17:this.$={strip:d.stripFlags(f[g-1],f[g-1]),program:f[g]};break;case 18:var h=d.prepareBlock(f[g-2],f[g-1],f[g],f[g],!1,this._$),i=new d.Program([h],null,{},d.locInfo(this._$));i.chained=!0,this.$={strip:f[g-2].strip,program:i,chain:!0};break;case 19:this.$=f[g];break;case 20:this.$={path:f[g-1],strip:d.stripFlags(f[g-2],f[g])};break;case 21:this.$=d.prepareMustache(f[g-3],f[g-2],f[g-1],f[g-4],d.stripFlags(f[g-4],f[g]),this._$);break;case 22:this.$=d.prepareMustache(f[g-3],f[g-2],f[g-1],f[g-4],d.stripFlags(f[g-4],f[g]),this._$);break;case 23:this.$=new d.PartialStatement(f[g-3],f[g-2],f[g-1],d.stripFlags(f[g-4],f[g]),d.locInfo(this._$));break;case 24:this.$=f[g];break;case 25:this.$=f[g];break;case 26:this.$=new d.SubExpression(f[g-3],f[g-2],f[g-1],d.locInfo(this._$));break;case 27:this.$=new d.Hash(f[g],d.locInfo(this._$));break;case 28:this.$=new d.HashPair(d.id(f[g-2]),f[g],d.locInfo(this._$));break;case 29:this.$=d.id(f[g-1]);break;case 30:this.$=f[g];break;case 31:this.$=f[g];break;case 32:this.$=new d.StringLiteral(f[g],d.locInfo(this._$));break;case 33:this.$=new d.NumberLiteral(f[g],d.locInfo(this._$));break;case 34:this.$=new d.BooleanLiteral(f[g],d.locInfo(this._$));break;case 35:this.$=new d.UndefinedLiteral(d.locInfo(this._$));break;case 36:this.$=new d.NullLiteral(d.locInfo(this._$));break;case 37:this.$=f[g];break;case 38:this.$=f[g];break;case 39:this.$=d.preparePath(!0,f[g],this._$);break;case 40:this.$=d.preparePath(!1,f[g],this._$);break;case 41:f[g-2].push({part:d.id(f[g]),original:f[g],separator:f[g-1]}),this.$=f[g-2];break;case 42:this.$=[{part:d.id(f[g]),original:f[g]}];break;case 43:this.$=[];break;case 44:f[g-1].push(f[g]);break;case 45:this.$=[];break;case 46:f[g-1].push(f[g]);break;case 53:this.$=[];break;case 54:f[g-1].push(f[g]);break;case 59:this.$=[];break;case 60:f[g-1].push(f[g]);break;case 65:this.$=[];break;case 66:f[g-1].push(f[g]);break;case 73:this.$=[];break;case 74:f[g-1].push(f[g]);break;case 77:this.$=[];break;case 78:f[g-1].push(f[g]);break;case 81:this.$=[];break;case 82:f[g-1].push(f[g]);break;case 85:this.$=[];break;case 86:f[g-1].push(f[g]);break;case 89:this.$=[f[g]];break;case 90:f[g-1].push(f[g]);break;case 91:this.$=[f[g]];break;case 92:f[g-1].push(f[g])}},table:[{3:1,4:2,5:[2,43],6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],46:[2,43],49:[2,43],53:[2,43]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:[1,11],14:[1,18],15:16,17:[1,21],22:14,25:15,27:[1,19],32:[1,20],37:[2,2],42:[2,2],45:[2,2],46:[1,12],49:[1,13],53:[1,17]},{1:[2,1]},{5:[2,44],13:[2,44],14:[2,44],17:[2,44],27:[2,44],32:[2,44],37:[2,44],42:[2,44],45:[2,44],46:[2,44],49:[2,44],53:[2,44]},{5:[2,3],13:[2,3],14:[2,3],17:[2,3],27:[2,3],32:[2,3],37:[2,3],42:[2,3],45:[2,3],46:[2,3],49:[2,3],53:[2,3]},{5:[2,4],13:[2,4],14:[2,4],17:[2,4],27:[2,4],32:[2,4],37:[2,4],42:[2,4],45:[2,4],46:[2,4],49:[2,4],53:[2,4]},{5:[2,5],13:[2,5],14:[2,5],17:[2,5],27:[2,5],32:[2,5],37:[2,5],42:[2,5],45:[2,5],46:[2,5],49:[2,5],53:[2,5]},{5:[2,6],13:[2,6],14:[2,6],17:[2,6],27:[2,6],32:[2,6],37:[2,6],42:[2,6],45:[2,6],46:[2,6],49:[2,6],53:[2,6]},{5:[2,7],13:[2,7],14:[2,7],17:[2,7],27:[2,7],32:[2,7],37:[2,7],42:[2,7],45:[2,7],46:[2,7],49:[2,7],53:[2,7]},{5:[2,8],13:[2,8],14:[2,8],17:[2,8],27:[2,8],32:[2,8],37:[2,8],42:[2,8],45:[2,8],46:[2,8],49:[2,8],53:[2,8]},{18:22,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:33,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{4:34,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],37:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{4:35,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{12:36,14:[1,18]},{18:38,54:37,58:39,59:[1,40],66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,9],13:[2,9],14:[2,9],16:[2,9],17:[2,9],27:[2,9],32:[2,9],37:[2,9],42:[2,9],45:[2,9],46:[2,9],49:[2,9],53:[2,9]},{18:41,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:42,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:43,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{31:[2,73],47:44,59:[2,73],66:[2,73],74:[2,73],75:[2,73],76:[2,73],77:[2,73],78:[2,73],79:[2,73]},{21:[2,30],31:[2,30],52:[2,30],59:[2,30],62:[2,30],66:[2,30],69:[2,30],74:[2,30],75:[2,30],76:[2,30],77:[2,30],78:[2,30],79:[2,30]},{21:[2,31],31:[2,31],52:[2,31],59:[2,31],62:[2,31],66:[2,31],69:[2,31],74:[2,31],75:[2,31],76:[2,31],77:[2,31],78:[2,31],79:[2,31]},{21:[2,32],31:[2,32],52:[2,32],59:[2,32],62:[2,32],66:[2,32],69:[2,32],74:[2,32],75:[2,32],76:[2,32],77:[2,32],78:[2,32],79:[2,32]},{21:[2,33],31:[2,33],52:[2,33],59:[2,33],62:[2,33],66:[2,33],69:[2,33],74:[2,33],75:[2,33],76:[2,33],77:[2,33],78:[2,33],79:[2,33]},{21:[2,34],31:[2,34],52:[2,34],59:[2,34],62:[2,34],66:[2,34],69:[2,34],74:[2,34],75:[2,34],76:[2,34],77:[2,34],78:[2,34],79:[2,34]},{21:[2,35],31:[2,35],52:[2,35],59:[2,35],62:[2,35],66:[2,35],69:[2,35],74:[2,35],75:[2,35],76:[2,35],77:[2,35],78:[2,35],79:[2,35]},{21:[2,36],31:[2,36],52:[2,36],59:[2,36],62:[2,36],66:[2,36],69:[2,36],74:[2,36],75:[2,36],76:[2,36],77:[2,36],78:[2,36],79:[2,36]},{21:[2,40],31:[2,40],52:[2,40],59:[2,40],62:[2,40],66:[2,40],69:[2,40],74:[2,40],75:[2,40],76:[2,40],77:[2,40],78:[2,40],79:[2,40],81:[1,45]},{66:[1,32],80:46},{21:[2,42],31:[2,42],52:[2,42],59:[2,42],62:[2,42],66:[2,42],69:[2,42],74:[2,42],75:[2,42],76:[2,42],77:[2,42],78:[2,42],79:[2,42],81:[2,42]},{50:47,52:[2,77],59:[2,77],66:[2,77],74:[2,77],75:[2,77],76:[2,77],77:[2,77],78:[2,77],79:[2,77]},{23:48,36:50,37:[1,52],41:51,42:[1,53],43:49,45:[2,49]},{26:54,41:55,42:[1,53],45:[2,51]},{16:[1,56]},{31:[2,81],55:57,59:[2,81],66:[2,81],74:[2,81],75:[2,81],76:[2,81],77:[2,81],78:[2,81],79:[2,81]},{31:[2,37],59:[2,37],66:[2,37],74:[2,37],75:[2,37],76:[2,37],77:[2,37],78:[2,37],79:[2,37]},{31:[2,38],59:[2,38],66:[2,38],74:[2,38],75:[2,38],76:[2,38],77:[2,38],78:[2,38],79:[2,38]},{18:58,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{28:59,31:[2,53],59:[2,53],66:[2,53],69:[2,53],74:[2,53],75:[2,53],76:[2,53],77:[2,53],78:[2,53],79:[2,53]},{31:[2,59],33:60,59:[2,59],66:[2,59],69:[2,59],74:[2,59],75:[2,59],76:[2,59],77:[2,59],78:[2,59],79:[2,59]},{19:61,21:[2,45],59:[2,45],66:[2,45],74:[2,45],75:[2,45],76:[2,45],77:[2,45],78:[2,45],79:[2,45]},{18:65,31:[2,75],48:62,57:63,58:66,59:[1,40],63:64,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{66:[1,70]},{21:[2,39],31:[2,39],52:[2,39],59:[2,39],62:[2,39],66:[2,39],69:[2,39],74:[2,39],75:[2,39],76:[2,39],77:[2,39],78:[2,39],79:[2,39],81:[1,45]},{18:65,51:71,52:[2,79],57:72,58:66,59:[1,40],63:73,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{24:74,45:[1,75]},{45:[2,50]},{4:76,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],37:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{45:[2,19]},{18:77,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{4:78,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{24:79,45:[1,75]},{45:[2,52]},{5:[2,10],13:[2,10],14:[2,10],17:[2,10],27:[2,10],32:[2,10],37:[2,10],42:[2,10],45:[2,10],46:[2,10],49:[2,10],53:[2,10]},{18:65,31:[2,83],56:80,57:81,58:66,59:[1,40],63:82,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{59:[2,85],60:83,62:[2,85],66:[2,85],74:[2,85],75:[2,85],76:[2,85],77:[2,85],78:[2,85],79:[2,85]},{18:65,29:84,31:[2,55],57:85,58:66,59:[1,40],63:86,64:67,65:68,66:[1,69],69:[2,55],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:65,31:[2,61],34:87,57:88,58:66,59:[1,40],63:89,64:67,65:68,66:[1,69],69:[2,61],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:65,20:90,21:[2,47],57:91,58:66,59:[1,40],63:92,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{31:[1,93]},{31:[2,74],59:[2,74],66:[2,74],74:[2,74],75:[2,74],76:[2,74],77:[2,74],78:[2,74],79:[2,74]},{31:[2,76]},{21:[2,24],31:[2,24],52:[2,24],59:[2,24],62:[2,24],66:[2,24],69:[2,24],74:[2,24],75:[2,24],76:[2,24],77:[2,24],78:[2,24],79:[2,24]},{21:[2,25],31:[2,25],52:[2,25],59:[2,25],62:[2,25],66:[2,25],69:[2,25],74:[2,25],75:[2,25],76:[2,25],77:[2,25],78:[2,25],79:[2,25]},{21:[2,27],31:[2,27],52:[2,27],62:[2,27],65:94,66:[1,95],69:[2,27]},{21:[2,89],31:[2,89],52:[2,89],62:[2,89],66:[2,89],69:[2,89]},{21:[2,42],31:[2,42],52:[2,42],59:[2,42],62:[2,42],66:[2,42],67:[1,96],69:[2,42],74:[2,42],75:[2,42],76:[2,42],77:[2,42],78:[2,42],79:[2,42],81:[2,42]},{21:[2,41],31:[2,41],52:[2,41],59:[2,41],62:[2,41],66:[2,41],69:[2,41],74:[2,41],75:[2,41],76:[2,41],77:[2,41],78:[2,41],79:[2,41],81:[2,41]},{52:[1,97]},{52:[2,78],59:[2,78],66:[2,78],74:[2,78],75:[2,78],76:[2,78],77:[2,78],78:[2,78],79:[2,78]},{52:[2,80]},{5:[2,12],13:[2,12],14:[2,12],17:[2,12],27:[2,12],32:[2,12],37:[2,12],42:[2,12],45:[2,12],46:[2,12],49:[2,12],53:[2,12]},{18:98,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{36:50,37:[1,52],41:51,42:[1,53],43:100,44:99,45:[2,71]},{31:[2,65],38:101,59:[2,65],66:[2,65],69:[2,65],74:[2,65],75:[2,65],76:[2,65],77:[2,65],78:[2,65],79:[2,65]},{45:[2,17]},{5:[2,13],13:[2,13],14:[2,13],17:[2,13],27:[2,13],32:[2,13],37:[2,13],42:[2,13],45:[2,13],46:[2,13],49:[2,13],53:[2,13]},{31:[1,102]},{31:[2,82],59:[2,82],66:[2,82],74:[2,82],75:[2,82],76:[2,82],77:[2,82],78:[2,82],79:[2,82]},{31:[2,84]},{18:65,57:104,58:66,59:[1,40],61:103,62:[2,87],63:105,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{30:106,31:[2,57],68:107,69:[1,108]},{31:[2,54],59:[2,54],66:[2,54],69:[2,54],74:[2,54],75:[2,54],76:[2,54],77:[2,54],78:[2,54],79:[2,54]},{31:[2,56],69:[2,56]},{31:[2,63],35:109,68:110,69:[1,108]},{31:[2,60],59:[2,60],66:[2,60],69:[2,60],74:[2,60],75:[2,60],76:[2,60],77:[2,60],78:[2,60],79:[2,60]},{31:[2,62],69:[2,62]},{21:[1,111]},{21:[2,46],59:[2,46],66:[2,46],74:[2,46],75:[2,46],76:[2,46],77:[2,46],78:[2,46],79:[2,46]},{21:[2,48]},{5:[2,21],13:[2,21],14:[2,21],17:[2,21],27:[2,21],32:[2,21],37:[2,21],42:[2,21],45:[2,21],46:[2,21],49:[2,21],53:[2,21]},{21:[2,90],31:[2,90],52:[2,90],62:[2,90],66:[2,90],69:[2,90]},{67:[1,96]},{18:65,57:112,58:66,59:[1,40],66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,22],13:[2,22],14:[2,22],17:[2,22],27:[2,22],32:[2,22],37:[2,22],42:[2,22],45:[2,22],46:[2,22],49:[2,22],53:[2,22]},{31:[1,113]},{45:[2,18]},{45:[2,72]},{18:65,31:[2,67],39:114,57:115,58:66,59:[1,40],63:116,64:67,65:68,66:[1,69],69:[2,67],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,23],13:[2,23],14:[2,23],17:[2,23],27:[2,23],32:[2,23],37:[2,23],42:[2,23],45:[2,23],46:[2,23],49:[2,23],53:[2,23]},{62:[1,117]},{59:[2,86],62:[2,86],66:[2,86],74:[2,86],75:[2,86],76:[2,86],77:[2,86],78:[2,86],79:[2,86]},{62:[2,88]},{31:[1,118]},{31:[2,58]},{66:[1,120],70:119},{31:[1,121]},{31:[2,64]},{14:[2,11]},{21:[2,28],31:[2,28],52:[2,28],62:[2,28],66:[2,28],69:[2,28]},{5:[2,20],13:[2,20],14:[2,20],17:[2,20],27:[2,20],32:[2,20],37:[2,20],42:[2,20],45:[2,20],46:[2,20],49:[2,20],53:[2,20]},{31:[2,69],40:122,68:123,69:[1,108]},{31:[2,66],59:[2,66],66:[2,66],69:[2,66],74:[2,66],75:[2,66],76:[2,66],77:[2,66],78:[2,66],79:[2,66]},{31:[2,68],69:[2,68]},{21:[2,26],31:[2,26],52:[2,26],59:[2,26],62:[2,26],66:[2,26],69:[2,26],74:[2,26],75:[2,26],76:[2,26],77:[2,26],78:[2,26],79:[2,26]},{13:[2,14],14:[2,14],17:[2,14],27:[2,14],32:[2,14],37:[2,14],42:[2,14],45:[2,14],46:[2,14],49:[2,14],53:[2,14]},{66:[1,125],71:[1,124]},{66:[2,91],71:[2,91]},{13:[2,15],14:[2,15],17:[2,15],27:[2,15],32:[2,15],42:[2,15],45:[2,15],46:[2,15],49:[2,15],53:[2,15]},{31:[1,126]},{31:[2,70]},{31:[2,29]},{66:[2,92],71:[2,92]},{13:[2,16],14:[2,16],17:[2,16],27:[2,16],32:[2,16],37:[2,16],42:[2,16],45:[2,16],46:[2,16],49:[2,16],53:[2,16]}],defaultActions:{4:[2,1],49:[2,50],51:[2,19],55:[2,52],64:[2,76],73:[2,80],78:[2,17],82:[2,84],92:[2,48],99:[2,18],100:[2,72],105:[2,88],107:[2,58],110:[2,64],111:[2,11],123:[2,70],124:[2,29]},parseError:function(a){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:((null===n||"undefined"==typeof n)&&(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;gb[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno}) -},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 14;break;case 1:return 14;case 2:return this.popState(),14;case 3:return b.yytext=b.yytext.substr(5,b.yyleng-9),this.popState(),16;case 4:return 14;case 5:return this.popState(),13;case 6:return 59;case 7:return 62;case 8:return 17;case 9:return this.popState(),this.begin("raw"),21;case 10:return 53;case 11:return 27;case 12:return 45;case 13:return this.popState(),42;case 14:return this.popState(),42;case 15:return 32;case 16:return 37;case 17:return 49;case 18:return 46;case 19:this.unput(b.yytext),this.popState(),this.begin("com");break;case 20:return this.popState(),13;case 21:return 46;case 22:return 67;case 23:return 66;case 24:return 66;case 25:return 81;case 26:break;case 27:return this.popState(),52;case 28:return this.popState(),31;case 29:return b.yytext=e(1,2).replace(/\\"/g,'"'),74;case 30:return b.yytext=e(1,2).replace(/\\'/g,"'"),74;case 31:return 79;case 32:return 76;case 33:return 76;case 34:return 77;case 35:return 78;case 36:return 75;case 37:return 69;case 38:return 71;case 39:return 66;case 40:return 66;case 41:return"INVALID";case 42:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{\/)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[5],inclusive:!1},raw:{rules:[3,4],inclusive:!1},INITIAL:{rules:[0,1,42],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();b.exports=c}),define("handlebars/compiler/visitor",["exports","module","../exception","./ast"],function(a,b,c,d){function e(){this.parents=[]}var f=function(a){return a&&a.__esModule?a["default"]:a},g=f(c),h=f(d);e.prototype={constructor:e,mutating:!1,acceptKey:function(a,b){var c=this.accept(a[b]);if(this.mutating){if(c&&(!c.type||!h[c.type]))throw new g('Unexpected node type "'+c.type+'" found when accepting '+b+" on "+a.type);a[b]=c}},acceptRequired:function(a,b){if(this.acceptKey(a,b),!a[b])throw new g(a.type+" requires "+b)},acceptArray:function(a){for(var b=0,c=a.length;c>b;b++)this.acceptKey(a,b),a[b]||(a.splice(b,1),b--,c--)},accept:function(a){if(a){this.current&&this.parents.unshift(this.current),this.current=a;var b=this[a.type](a);return this.current=this.parents.shift(),!this.mutating||b?b:b!==!1?a:void 0}},Program:function(a){this.acceptArray(a.body)},MustacheStatement:function(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")},BlockStatement:function(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash"),this.acceptKey(a,"program"),this.acceptKey(a,"inverse")},PartialStatement:function(a){this.acceptRequired(a,"name"),this.acceptArray(a.params),this.acceptKey(a,"hash")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:function(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")},PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(a){this.acceptArray(a.pairs)},HashPair:function(a){this.acceptRequired(a,"value")}},b.exports=e}),define("handlebars/compiler/whitespace-control",["exports","module","./visitor"],function(a,b,c){function d(){}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"ContentStatement"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"ContentStatement"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"ContentStatement"===d.type&&(c||!d.rightStripped)){var e=d.value;d.value=d.value.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.value!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"ContentStatement"===d.type&&(c||!d.leftStripped)){var e=d.value;return d.value=d.value.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.value!==e,d.leftStripped}}var i=function(a){return a&&a.__esModule?a["default"]:a},j=i(c);d.prototype=new j,d.prototype.Program=function(a){var b=!this.isRootSeen;this.isRootSeen=!0;for(var c=a.body,d=0,i=c.length;i>d;d++){var j=c[d],k=this.accept(j);if(k){var l=e(c,d,b),m=f(c,d,b),n=k.openStandalone&&l,o=k.closeStandalone&&m,p=k.inlineStandalone&&l&&m;k.close&&g(c,d,!0),k.open&&h(c,d,!0),p&&(g(c,d),h(c,d)&&"PartialStatement"===j.type&&(j.indent=/([ \t]+$)/.exec(c[d-1].original)[1])),n&&(g((j.program||j.inverse).body),h(c,d)),o&&(g(c,d),h((j.inverse||j.program).body))}}return a},d.prototype.BlockStatement=function(a){this.accept(a.program),this.accept(a.inverse);var b=a.program||a.inverse,c=a.program&&a.inverse,d=c,i=c;if(c&&c.chained)for(d=c.body[0].program;i.chained;)i=i.body[i.body.length-1].program;var j={open:a.openStrip.open,close:a.closeStrip.close,openStandalone:f(b.body),closeStandalone:e((d||b).body)};if(a.openStrip.close&&g(b.body,null,!0),c){var k=a.inverseStrip;k.open&&h(b.body,null,!0),k.close&&g(d.body,null,!0),a.closeStrip.open&&h(i.body,null,!0),e(b.body)&&f(d.body)&&(h(b.body),g(d.body))}else a.closeStrip.open&&h(b.body,null,!0);return j},d.prototype.MustacheStatement=function(a){return a.strip},d.prototype.PartialStatement=d.prototype.CommentStatement=function(a){var b=a.strip||{};return{inlineStandalone:!0,open:b.open,close:b.close}},b.exports=d}),define("handlebars/compiler/helpers",["exports","../exception"],function(a,b){function c(a,b){this.source=a,this.start={line:b.first_line,column:b.first_column},this.end={line:b.last_line,column:b.last_column}}function d(a){return/^\[.*\]$/.test(a)?a.substr(1,a.length-2):a}function e(a,b){return{open:"~"===a.charAt(2),close:"~"===b.charAt(b.length-3)}}function f(a){return a.replace(/^\{\{~?\!-?-?/,"").replace(/-?-?~?\}\}$/,"")}function g(a,b,c){c=this.locInfo(c);for(var d=a?"@":"",e=[],f=0,g="",h=0,i=b.length;i>h;h++){var j=b[h].part,k=b[h].original!==j;if(d+=(b[h].separator||"")+j,k||".."!==j&&"."!==j&&"this"!==j)e.push(j);else{if(e.length>0)throw new l("Invalid path: "+d,{loc:c});".."===j&&(f++,g+="../")}}return new this.PathExpression(a,f,e,d,c)}function h(a,b,c,d,e,f){var g=d.charAt(3)||d.charAt(2),h="{"!==g&&"&"!==g;return new this.MustacheStatement(a,b,c,h,e,this.locInfo(f))}function i(a,b,c,d){if(a.path.original!==c){var e={loc:a.path.loc};throw new l(a.path.original+" doesn't match "+c,e)}d=this.locInfo(d);var f=new this.Program([b],null,{},d);return new this.BlockStatement(a.path,a.params,a.hash,f,void 0,{},{},{},d)}function j(a,b,c,d,e,f){if(d&&d.path&&a.path.original!==d.path.original){var g={loc:a.path.loc};throw new l(a.path.original+" doesn't match "+d.path.original,g)}b.blockParams=a.blockParams;var h=void 0,i=void 0;return c&&(c.chain&&(c.program.body[0].closeStrip=d.strip),i=c.strip,h=c.program),e&&(e=h,h=b,b=e),new this.BlockStatement(a.path,a.params,a.hash,b,h,a.strip,i,d&&d.strip,this.locInfo(f))}var k=function(a){return a&&a.__esModule?a["default"]:a};a.__esModule=!0,a.SourceLocation=c,a.id=d,a.stripFlags=e,a.stripComment=f,a.preparePath=g,a.prepareMustache=h,a.prepareRawBlock=i,a.prepareBlock=j;var l=k(b)}),define("handlebars/compiler/base",["exports","./parser","./ast","./whitespace-control","./helpers","../utils"],function(a,b,c,d,e,f){function g(a,b){if("Program"===a.type)return a;i.yy=l,l.locInfo=function(a){return new l.SourceLocation(b&&b.srcName,a)};var c=new k;return c.accept(i.parse(a))}var h=function(a){return a&&a.__esModule?a["default"]:a};a.__esModule=!0,a.parse=g;var i=h(b),j=h(c),k=h(d);a.parser=i;var l={};f.extend(l,e,j)}),define("handlebars/compiler/compiler",["exports","../exception","../utils","./ast"],function(a,b,c,d){function e(){}function f(a,b,c){if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a,b),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function g(a,b,c){function d(){var b=c.parse(a,f),d=(new c.Compiler).compile(b,f),e=(new c.JavaScriptCompiler).compile(d,f,void 0,!0);return c.template(e)}function e(a,b){return g||(g=d()),g.call(this,a,b)}var f=void 0===arguments[1]?{}:arguments[1];if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);"data"in f||(f.data=!0),f.compat&&(f.useDepths=!0);var g=void 0;return e._setup=function(a){return g||(g=d()),g._setup(a)},e._child=function(a,b,c,e){return g||(g=d()),g._child(a,b,c,e)},e}function h(a,b){if(a===b)return!0;if(c.isArray(a)&&c.isArray(b)&&a.length===b.length){for(var d=0;dc;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||!h(d.args,e.args))return!1}b=this.children.length;for(var c=0;b>c;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[];var c=b.knownHelpers;if(b.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)d in c&&(b.knownHelpers[d]=c[d]);return this.accept(a)},compileProgram:function(a){var b=new this.compiler,c=b.compile(a,this.options),d=this.guid++;return this.usePartial=this.usePartial||c.usePartial,this.children[d]=c,this.useDepths=this.useDepths||c.useDepths,d},accept:function(a){this.sourceNode.unshift(a);var b=this[a.type](a);return this.sourceNode.shift(),b},Program:function(a){this.options.blockParams.unshift(a.blockParams);for(var b=a.body,c=b.length,d=0;c>d;d++)this.accept(b[d]);return this.options.blockParams.shift(),this.isSimple=1===c,this.blockParams=a.blockParams?a.blockParams.length:0,this},BlockStatement:function(a){i(a);var b=a.program,c=a.inverse;b=b&&this.compileProgram(b),c=c&&this.compileProgram(c);var d=this.classifySexpr(a);"helper"===d?this.helperSexpr(a,b,c):"simple"===d?(this.simpleSexpr(a),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("blockValue",a.path.original)):(this.ambiguousSexpr(a,b,c),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},PartialStatement:function(a){this.usePartial=!0;var b=a.params;if(b.length>1)throw new k("Unsupported number of partial arguments: "+b.length,a);b.length||b.push({type:"PathExpression",parts:[],depth:0});var c=a.name.original,d="SubExpression"===a.name.type;d&&this.accept(a.name),this.setupFullMustacheParams(a,void 0,void 0,!0);var e=a.indent||"";this.options.preventIndent&&e&&(this.opcode("appendContent",e),e=""),this.opcode("invokePartial",d,c,e),this.opcode("append")},MustacheStatement:function(a){this.SubExpression(a),this.opcode(a.escaped&&!this.options.noEscape?"appendEscaped":"append")},ContentStatement:function(a){a.value&&this.opcode("appendContent",a.value)},CommentStatement:function(){},SubExpression:function(a){i(a);var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ambiguousSexpr:function(a,b,c){var d=a.path,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.accept(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){this.accept(a.path),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.path,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new k("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.falsy=!0,this.accept(e),this.opcode("invokeHelper",d.length,e.original,l.helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=l.helpers.scopedId(a),d=!a.depth&&!c&&this.blockParamIndex(b);d?this.opcode("lookupBlockParam",d,a.parts):b?a.data?(this.options.data=!0,this.opcode("lookupData",a.depth,a.parts)):this.opcode("lookupOnContext",a.parts,a.falsy,c):this.opcode("pushContext")},StringLiteral:function(a){this.opcode("pushString",a.value)},NumberLiteral:function(a){this.opcode("pushLiteral",a.value)},BooleanLiteral:function(a){this.opcode("pushLiteral",a.value)},UndefinedLiteral:function(){this.opcode("pushLiteral","undefined")},NullLiteral:function(){this.opcode("pushLiteral","null")},Hash:function(a){var b=a.pairs,c=0,d=b.length;for(this.opcode("pushHash");d>c;c++)this.pushParam(b[c].value);for(;c--;)this.opcode("assignToHash",b[c].key);this.opcode("popHash")},opcode:function(a){this.opcodes.push({opcode:a,args:m.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=l.helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&l.helpers.helperExpression(a),e=!c&&(d||b);if(e&&!d){var f=a.path.parts[0],g=this.options;g.knownHelpers[f]?d=!0:g.knownHelpersOnly&&(e=!1)}return d?"helper":e?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;c>b;b++)this.pushParam(a[b])},pushParam:function(a){var b=null!=a.value?a.value:a.original||"";if(this.stringParams)b.replace&&(b=b.replace(/^(\.?\.\/)*/g,"").replace(/\//g,".")),a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",b,a.type),"SubExpression"===a.type&&this.accept(a);else{if(this.trackIds){var c=void 0;if(!a.parts||l.helpers.scopedId(a)||a.depth||(c=this.blockParamIndex(a.parts[0])),c){var d=a.parts.slice(1).join(".");this.opcode("pushId","BlockParam",c,d)}else b=a.original||b,b.replace&&(b=b.replace(/^\.\//g,"").replace(/^\.$/g,"")),this.opcode("pushId",a.type,b)}this.accept(a)}},setupFullMustacheParams:function(a,b,c,d){var e=a.params;return this.pushParams(e),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.accept(a.hash):this.opcode("emptyHash",d),e},blockParamIndex:function(a){for(var b=0,d=this.options.blockParams.length;d>b;b++){var e=this.options.blockParams[b],f=e&&c.indexOf(e,a);if(e&&f>=0)return[b,f]}}}}),define("handlebars/compiler/code-gen",["exports","module","../utils"],function(a,b,c){function d(a,b,d){if(c.isArray(a)){for(var e=[],f=0,g=a.length;g>f;f++)e.push(b.wrap(a[f],d));return e}return"boolean"==typeof a||"number"==typeof a?a+"":a}function e(a){this.srcFile=a,this.source=[]}var f=void 0;try{if("function"!=typeof define||!define.amd){var g=require("source-map");f=g.SourceNode}}catch(h){}f||(f=function(a,b,c,d){this.src="",d&&this.add(d)},f.prototype={add:function(a){c.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){c.isArray(a)&&(a=a.join("")),this.src=a+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),e.prototype={prepend:function(a,b){this.source.unshift(this.wrap(a,b))},push:function(a,b){this.source.push(this.wrap(a,b))},merge:function(){var a=this.empty();return this.each(function(b){a.add([" ",b,"\n"])}),a},each:function(a){for(var b=0,c=this.source.length;c>b;b++)a(this.source[b])},empty:function(){var a=void 0===arguments[0]?this.currentLocation||{start:{}}:arguments[0];return new f(a.start.line,a.start.column,this.srcFile)},wrap:function(a){var b=void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return a instanceof f?a:(a=d(a,this,b),new f(b.start.line,b.start.column,this.srcFile,a))},functionCall:function(a,b,c){return c=this.generateList(c),this.wrap([a,b?"."+b+"(":"(",c,")"])},quotedString:function(a){return'"'+(a+"").replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},objectLiteral:function(a){var b=[];for(var c in a)if(a.hasOwnProperty(c)){var e=d(a[c],this);"undefined"!==e&&b.push([this.quotedString(c),":",e])}var f=this.generateList(b);return f.prepend("{"),f.add("}"),f},generateList:function(a,b){for(var c=this.empty(b),e=0,f=a.length;f>e;e++)e&&c.add(","),c.add(d(a[e],this,b));return c},generateArray:function(a,b){var c=this.generateList(a,b);return c.prepend("["),c.add("]"),c}},b.exports=e}),define("handlebars/compiler/javascript-compiler",["exports","module","../base","../exception","../utils","./code-gen"],function(a,b,c,d,e,f){function g(a){this.value=a}function h(){}function i(a,b,c,d){var e=b.popStack(),f=0,g=c.length;for(a&&g--;g>f;f++)e=b.nameLookup(e,c[f],d);return a?[b.aliasable("this.strict"),"(",e,", ",b.quotedString(c[f]),")"]:e}var j=function(a){return a&&a.__esModule?a["default"]:a},k=j(d),l=j(f);h.prototype={nameLookup:function(a,b){return h.isValidJavaScriptVariableName(b)?[a,".",b]:[a,"['",b,"']"]},depthedLookup:function(a){return[this.aliasable("this.lookup"),'(depths, "',a,'")']},compilerInfo:function(){var a=c.COMPILER_REVISION,b=c.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return e.isArray(a)||(a=[a]),a=this.source.wrap(a,b),this.environment.isSimple?["return ",a,";"]:c?["buffer += ",a,";"]:(a.appendToBuffer=!0,a)},initializeBuffer:function(){return this.quotedString("")},compile:function(a,b,c,d){this.environment=a,this.options=b,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,this.name=this.environment.name,this.isChild=!!c,this.context=c||{programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(a,b),this.useDepths=this.useDepths||a.useDepths||this.options.compat,this.useBlockParams=this.useBlockParams||a.useBlockParams;var e=a.opcodes,f=void 0,g=void 0,h=void 0,i=void 0;for(h=0,i=e.length;i>h;h++)f=e[h],this.source.currentLocation=f.loc,g=g||f.loc,this[f.opcode].apply(this,f.args);if(this.source.currentLocation=g,this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new k("Compile completed with content left on stack");var j=this.createFunctionContext(d);if(this.isChild)return j;var l={compiler:this.compilerInfo(),main:j},m=this.context.programs;for(h=0,i=m.length;i>h;h++)m[h]&&(l[h]=m[h]);return this.environment.usePartial&&(l.usePartial=!0),this.options.data&&(l.useData=!0),this.useDepths&&(l.useDepths=!0),this.useBlockParams&&(l.useBlockParams=!0),this.options.compat&&(l.compat=!0),d?l.compilerOptions=this.options:(l.compiler=JSON.stringify(l.compiler),this.source.currentLocation={start:{line:1,column:0}},l=this.objectLiteral(l),b.srcName?(l=l.toStringWithSourceMap({file:b.destName}),l.map=l.map&&l.map.toString()):l=l.toString()),l},preamble:function(){this.lastContext=0,this.source=new l(this.options.srcName)},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));var d=0;for(var e in this.aliases){var f=this.aliases[e];this.aliases.hasOwnProperty(e)&&f.children&&f.referenceCount>1&&(b+=", alias"+ ++d+"="+e,f.children[0]="alias"+d)}var g=["depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&g.push("blockParams"),this.useDepths&&g.push("depths");var h=this.mergeSource(b);return a?(g.push(h),Function.apply(this,g)):this.source.wrap(["function(",g.join(","),") {\n ",h,"}"])},mergeSource:function(a){var b=this.environment.isSimple,c=!this.forceBuffer,d=void 0,e=void 0,f=void 0,g=void 0;return this.source.each(function(a){a.appendToBuffer?(f?a.prepend(" + "):f=a,g=a):(f&&(e?f.prepend("buffer += "):d=!0,g.add(";"),f=g=void 0),e=!0,b||(c=!1))}),c?f?(f.prepend("return "),g.add(";")):e||this.source.push('return "";'):(a+=", buffer = "+(d?"":this.initializeBuffer()),f?(f.prepend("return buffer + "),g.add(";")):this.source.push("return buffer;")),a&&this.source.prepend("var "+a.substring(2)+(d?"":";\n")),this.source.merge()},blockValue:function(a){var b=this.aliasable("helpers.blockHelperMissing"),c=[this.contextName(0)];this.setupHelperArgs(a,0,c);var d=this.popStack();c.splice(1,0,d),this.push(this.source.functionCall(b,"call",c))},ambiguousBlockValue:function(){var a=this.aliasable("helpers.blockHelperMissing"),b=[this.contextName(0)];this.setupHelperArgs("",0,b,!0),this.flushInline();var c=this.topStack();b.splice(1,0,c),this.pushSource(["if (!",this.lastHelper,") { ",c," = ",this.source.functionCall(a,"call",b),"}"])},appendContent:function(a){this.pendingContent?a=this.pendingContent+a:this.pendingLocation=this.source.currentLocation,this.pendingContent=a},append:function(){if(this.isInline())this.replaceStack(function(a){return[" != null ? ",a,' : ""']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var a=this.popStack();this.pushSource(["if (",a," != null) { ",this.appendToBuffer(a,void 0,!0)," }"]),this.environment.isSimple&&this.pushSource(["else { ",this.appendToBuffer("''",void 0,!0)," }"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable("this.escapeExpression"),"(",this.popStack(),")"]))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c){var d=0;c||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[d++])),this.resolvePath("context",a,d,b)},lookupBlockParam:function(a,b){this.useBlockParams=!0,this.push(["blockParams[",a[0],"][",a[1],"]"]),this.resolvePath("context",b,1)},lookupData:function(a,b){this.pushStackLiteral(a?"this.data(data, "+a+")":"data"),this.resolvePath("data",b,0,!0)},resolvePath:function(a,b,c,d){var e=this;if(this.options.strict||this.options.assumeObjects)return void this.push(i(this.options.strict,this,b,a));for(var f=b.length;f>c;c++)this.replaceStack(function(f){var g=e.nameLookup(f,b[c],a);return d?[" && ",g]:[" != null ? ",g," : ",f]})},resolvePossibleLambda:function(){this.push([this.aliasable("this.lambda"),"(",this.popStack(),", ",this.contextName(0),")"])},pushStringParam:function(a,b){this.pushContext(),this.pushString(b),"SubExpression"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(a){this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}")),this.pushStackLiteral(a?"undefined":"{}")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(a.ids)),this.stringParams&&(this.push(this.objectLiteral(a.contexts)),this.push(this.objectLiteral(a.types))),this.push(this.objectLiteral(a.values))},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){this.pushStackLiteral(null!=a?this.programExpression(a):null)},invokeHelper:function(a,b,c){var d=this.popStack(),e=this.setupHelper(a,b),f=c?[e.name," || "]:"",g=["("].concat(f,d);this.options.strict||g.push(" || ",this.aliasable("helpers.helperMissing")),g.push(")"),this.push(this.source.functionCall(g,"call",e.callParams))},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(this.source.functionCall(c.name,"call",c.callParams))},invokeAmbiguous:function(a,b){this.useRegister("helper");var c=this.popStack();this.emptyHash();var d=this.setupHelper(0,a,b),e=this.lastHelper=this.nameLookup("helpers",a,"helper"),f=["(","(helper = ",e," || ",c,")"];this.options.strict||(f[0]="(helper = ",f.push(" != null ? helper : ",this.aliasable("helpers.helperMissing"))),this.push(["(",f,d.paramsInit?["),(",d.paramsInit]:[],"),","(typeof helper === ",this.aliasable('"function"')," ? ",this.source.functionCall("helper","call",d.callParams)," : helper))"])},invokePartial:function(a,b,c){var d=[],e=this.setupParams(b,1,d,!1);a&&(b=this.popStack(),delete e.name),c&&(e.indent=JSON.stringify(c)),e.helpers="helpers",e.partials="partials",d.unshift(a?b:this.nameLookup("partials",b,"partial")),this.options.compat&&(e.depths="depths"),e=this.objectLiteral(e),d.push(e),this.push(this.source.functionCall("this.invokePartial","",d))},assignToHash:function(a){var b=this.popStack(),c=void 0,d=void 0,e=void 0;this.trackIds&&(e=this.popStack()),this.stringParams&&(d=this.popStack(),c=this.popStack());var f=this.hash;c&&(f.contexts[a]=c),d&&(f.types[a]=d),e&&(f.ids[a]=e),f.values[a]=b},pushId:function(a,b,c){"BlockParam"===a?this.pushStackLiteral("blockParams["+b[0]+"].path["+b[1]+"]"+(c?" + "+JSON.stringify("."+c):"")):"PathExpression"===a?this.pushString(b):this.pushStackLiteral("SubExpression"===a?"true":"null")},compiler:h,compileChildren:function(a,b){for(var c=a.children,d=void 0,e=void 0,f=0,g=c.length;g>f;f++){d=c[f],e=new this.compiler;var h=this.matchExistingProgram(d);null==h?(this.context.programs.push(""),h=this.context.programs.length,d.index=h,d.name="program"+h,this.context.programs[h]=e.compile(d,b,this.context,!this.precompile),this.context.environments[h]=d,this.useDepths=this.useDepths||e.useDepths,this.useBlockParams=this.useBlockParams||e.useBlockParams):(d.index=h,d.name="program"+h,this.useDepths=this.useDepths||d.useDepths,this.useBlockParams=this.useBlockParams||d.useBlockParams)}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;c>b;b++){var d=this.context.environments[b];if(d&&d.equals(a))return b}},programExpression:function(a){var b=this.environment.children[a],c=[b.index,"data",b.blockParams];return(this.useBlockParams||this.useDepths)&&c.push("blockParams"),this.useDepths&&c.push("depths"),"this.program("+c.join(", ")+")"},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},push:function(a){return a instanceof g||(a=this.source.wrap(a)),this.inlineStack.push(a),a},pushStackLiteral:function(a){this.push(new g(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),a&&this.source.push(a)},replaceStack:function(a){var b=["("],c=void 0,d=void 0,e=void 0;if(!this.isInline())throw new k("replaceStack on non-inline");var f=this.popStack(!0);if(f instanceof g)c=[f.value],b=["(",c],e=!0;else{d=!0;var h=this.incrStack();b=["((",this.push(h)," = ",f,")"],c=this.topStack()}var i=a.call(this,c);e||this.popStack(),d&&this.stackSlot--,this.push(b.concat(i,")"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;this.inlineStack=[];for(var b=0,c=a.length;c>b;b++){var d=a[b];if(d instanceof g)this.compileStack.push(d);else{var e=this.incrStack();this.pushSource([e," = ",d,";"]),this.compileStack.push(e)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),c=(b?this.inlineStack:this.compileStack).pop();if(!a&&c instanceof g)return c.value;if(!b){if(!this.stackSlot)throw new k("Invalid stack pop");this.stackSlot--}return c},topStack:function(){var a=this.isInline()?this.inlineStack:this.compileStack,b=a[a.length-1];return b instanceof g?b.value:b},contextName:function(a){return this.useDepths&&a?"depths["+a+"]":"depth"+a},quotedString:function(a){return this.source.quotedString(a)},objectLiteral:function(a){return this.source.objectLiteral(a)},aliasable:function(a){var b=this.aliases[a];return b?(b.referenceCount++,b):(b=this.aliases[a]=this.source.wrap(a),b.aliasable=!0,b.referenceCount=1,b)},setupHelper:function(a,b,c){var d=[],e=this.setupHelperArgs(b,a,d,c),f=this.nameLookup("helpers",b,"helper");return{params:d,paramsInit:e,name:f,callParams:[this.contextName(0)].concat(d)}},setupParams:function(a,b,c){var d={},e=[],f=[],g=[],h=void 0;d.name=this.quotedString(a),d.hash=this.popStack(),this.trackIds&&(d.hashIds=this.popStack()),this.stringParams&&(d.hashTypes=this.popStack(),d.hashContexts=this.popStack());var i=this.popStack(),j=this.popStack();(j||i)&&(d.fn=j||"this.noop",d.inverse=i||"this.noop");for(var k=b;k--;)h=this.popStack(),c[k]=h,this.trackIds&&(g[k]=this.popStack()),this.stringParams&&(f[k]=this.popStack(),e[k]=this.popStack());return this.trackIds&&(d.ids=this.source.generateArray(g)),this.stringParams&&(d.types=this.source.generateArray(f),d.contexts=this.source.generateArray(e)),this.options.data&&(d.data="data"),this.useBlockParams&&(d.blockParams="blockParams"),d},setupHelperArgs:function(a,b,c,d){var e=this.setupParams(a,b,c,!0);return e=this.objectLiteral(e),d?(this.useRegister("options"),c.push("options"),["options=",e]):(c.push(e),"")}},function(){for(var a="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false".split(" "),b=h.RESERVED_WORDS={},c=0,d=a.length;d>c;c++)b[a[c]]=!0}(),h.isValidJavaScriptVariableName=function(a){return!h.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},b.exports=h}),define("handlebars",["exports","module","./handlebars.runtime","./handlebars/compiler/ast","./handlebars/compiler/base","./handlebars/compiler/compiler","./handlebars/compiler/javascript-compiler","./handlebars/compiler/visitor","./handlebars/no-conflict"],function(a,b,c,d,e,f,g,h,i){function j(){var a=q();return a.compile=function(b,c){return f.compile(b,c,a)},a.precompile=function(b,c){return f.precompile(b,c,a)},a.AST=m,a.Compiler=f.Compiler,a.JavaScriptCompiler=n,a.Parser=e.parser,a.parse=e.parse,a}var k=function(a){return a&&a.__esModule?a["default"]:a -},l=k(c),m=k(d),n=k(g),o=k(h),p=k(i),q=l.create,r=j();r.create=j,p(r),r.Visitor=o,r["default"]=r,b.exports=r}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.js deleted file mode 100644 index e0f7535..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.js +++ /dev/null @@ -1,4098 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define(factory); - else if(typeof exports === 'object') - exports["Handlebars"] = factory(); - else - root["Handlebars"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; - -/******/ // The require function -/******/ function __webpack_require__(moduleId) { - -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; - -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; - -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - -/******/ // Flag the module as loaded -/******/ module.loaded = true; - -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } - - -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; - -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; - -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; - -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - - var _runtime = __webpack_require__(1); - - var _runtime2 = _interopRequireWildcard(_runtime); - - // Compiler imports - - var _AST = __webpack_require__(2); - - var _AST2 = _interopRequireWildcard(_AST); - - var _Parser$parse = __webpack_require__(3); - - var _Compiler$compile$precompile = __webpack_require__(4); - - var _JavaScriptCompiler = __webpack_require__(5); - - var _JavaScriptCompiler2 = _interopRequireWildcard(_JavaScriptCompiler); - - var _Visitor = __webpack_require__(6); - - var _Visitor2 = _interopRequireWildcard(_Visitor); - - var _noConflict = __webpack_require__(7); - - var _noConflict2 = _interopRequireWildcard(_noConflict); - - var _create = _runtime2['default'].create; - function create() { - var hb = _create(); - - hb.compile = function (input, options) { - return _Compiler$compile$precompile.compile(input, options, hb); - }; - hb.precompile = function (input, options) { - return _Compiler$compile$precompile.precompile(input, options, hb); - }; - - hb.AST = _AST2['default']; - hb.Compiler = _Compiler$compile$precompile.Compiler; - hb.JavaScriptCompiler = _JavaScriptCompiler2['default']; - hb.Parser = _Parser$parse.parser; - hb.parse = _Parser$parse.parse; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict2['default'](inst); - - inst.Visitor = _Visitor2['default']; - - inst['default'] = inst; - - exports['default'] = inst; - module.exports = exports['default']; - -/***/ }, -/* 1 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - - var _import = __webpack_require__(9); - - var base = _interopRequireWildcard(_import); - - // Each of these augment the Handlebars object. No need to setup here. - // (This is done to easily share code between commonjs and browse envs) - - var _SafeString = __webpack_require__(10); - - var _SafeString2 = _interopRequireWildcard(_SafeString); - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _import2 = __webpack_require__(12); - - var Utils = _interopRequireWildcard(_import2); - - var _import3 = __webpack_require__(13); - - var runtime = _interopRequireWildcard(_import3); - - var _noConflict = __webpack_require__(7); - - var _noConflict2 = _interopRequireWildcard(_noConflict); - - // For compatibility and usage outside of module systems, make the Handlebars object a namespace - function create() { - var hb = new base.HandlebarsEnvironment(); - - Utils.extend(hb, base); - hb.SafeString = _SafeString2['default']; - hb.Exception = _Exception2['default']; - hb.Utils = Utils; - hb.escapeExpression = Utils.escapeExpression; - - hb.VM = runtime; - hb.template = function (spec) { - return runtime.template(spec, hb); - }; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict2['default'](inst); - - inst['default'] = inst; - - exports['default'] = inst; - module.exports = exports['default']; - -/***/ }, -/* 2 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - var AST = { - Program: function Program(statements, blockParams, strip, locInfo) { - this.loc = locInfo; - this.type = 'Program'; - this.body = statements; - - this.blockParams = blockParams; - this.strip = strip; - }, - - MustacheStatement: function MustacheStatement(path, params, hash, escaped, strip, locInfo) { - this.loc = locInfo; - this.type = 'MustacheStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.escaped = escaped; - - this.strip = strip; - }, - - BlockStatement: function BlockStatement(path, params, hash, program, inverse, openStrip, inverseStrip, closeStrip, locInfo) { - this.loc = locInfo; - this.type = 'BlockStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.program = program; - this.inverse = inverse; - - this.openStrip = openStrip; - this.inverseStrip = inverseStrip; - this.closeStrip = closeStrip; - }, - - PartialStatement: function PartialStatement(name, params, hash, strip, locInfo) { - this.loc = locInfo; - this.type = 'PartialStatement'; - - this.name = name; - this.params = params || []; - this.hash = hash; - - this.indent = ''; - this.strip = strip; - }, - - ContentStatement: function ContentStatement(string, locInfo) { - this.loc = locInfo; - this.type = 'ContentStatement'; - this.original = this.value = string; - }, - - CommentStatement: function CommentStatement(comment, strip, locInfo) { - this.loc = locInfo; - this.type = 'CommentStatement'; - this.value = comment; - - this.strip = strip; - }, - - SubExpression: function SubExpression(path, params, hash, locInfo) { - this.loc = locInfo; - - this.type = 'SubExpression'; - this.path = path; - this.params = params || []; - this.hash = hash; - }, - - PathExpression: function PathExpression(data, depth, parts, original, locInfo) { - this.loc = locInfo; - this.type = 'PathExpression'; - - this.data = data; - this.original = original; - this.parts = parts; - this.depth = depth; - }, - - StringLiteral: function StringLiteral(string, locInfo) { - this.loc = locInfo; - this.type = 'StringLiteral'; - this.original = this.value = string; - }, - - NumberLiteral: function NumberLiteral(number, locInfo) { - this.loc = locInfo; - this.type = 'NumberLiteral'; - this.original = this.value = Number(number); - }, - - BooleanLiteral: function BooleanLiteral(bool, locInfo) { - this.loc = locInfo; - this.type = 'BooleanLiteral'; - this.original = this.value = bool === 'true'; - }, - - UndefinedLiteral: function UndefinedLiteral(locInfo) { - this.loc = locInfo; - this.type = 'UndefinedLiteral'; - this.original = this.value = undefined; - }, - - NullLiteral: function NullLiteral(locInfo) { - this.loc = locInfo; - this.type = 'NullLiteral'; - this.original = this.value = null; - }, - - Hash: function Hash(pairs, locInfo) { - this.loc = locInfo; - this.type = 'Hash'; - this.pairs = pairs; - }, - HashPair: function HashPair(key, value, locInfo) { - this.loc = locInfo; - this.type = 'HashPair'; - this.key = key; - this.value = value; - }, - - // Public API used to evaluate derived attributes regarding AST nodes - helpers: { - // a mustache is definitely a helper if: - // * it is an eligible helper, and - // * it has at least one parameter or hash segment - helperExpression: function helperExpression(node) { - return !!(node.type === 'SubExpression' || node.params.length || node.hash); - }, - - scopedId: function scopedId(path) { - return /^\.|this\b/.test(path.original); - }, - - // an ID is simple if it only has one part, and that part is not - // `..` or `this`. - simpleId: function simpleId(path) { - return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; - } - } - }; - - // Must be exported as an object rather than the root of the module as the jison lexer - // must modify the object to operate properly. - exports['default'] = AST; - module.exports = exports['default']; - -/***/ }, -/* 3 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - exports.parse = parse; - - var _parser = __webpack_require__(14); - - var _parser2 = _interopRequireWildcard(_parser); - - var _AST = __webpack_require__(2); - - var _AST2 = _interopRequireWildcard(_AST); - - var _WhitespaceControl = __webpack_require__(15); - - var _WhitespaceControl2 = _interopRequireWildcard(_WhitespaceControl); - - var _import = __webpack_require__(16); - - var Helpers = _interopRequireWildcard(_import); - - var _extend = __webpack_require__(12); - - exports.parser = _parser2['default']; - - var yy = {}; - _extend.extend(yy, Helpers, _AST2['default']); - - function parse(input, options) { - // Just return if an already-compiled AST was passed in. - if (input.type === 'Program') { - return input; - } - - _parser2['default'].yy = yy; - - // Altering the shared object here, but this is ok as parser is a sync operation - yy.locInfo = function (locInfo) { - return new yy.SourceLocation(options && options.srcName, locInfo); - }; - - var strip = new _WhitespaceControl2['default'](); - return strip.accept(_parser2['default'].parse(input)); - } - -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - exports.Compiler = Compiler; - exports.precompile = precompile; - exports.compile = compile; - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _isArray$indexOf = __webpack_require__(12); - - var _AST = __webpack_require__(2); - - var _AST2 = _interopRequireWildcard(_AST); - - var slice = [].slice; - - function Compiler() {} - - // the foundHelper register will disambiguate helper lookup from finding a - // function in a context. This is necessary for mustache compatibility, which - // requires that context functions in blocks are evaluated by blockHelperMissing, - // and then proceed as if the resulting value was provided to blockHelperMissing. - - Compiler.prototype = { - compiler: Compiler, - - equals: function equals(other) { - var len = this.opcodes.length; - if (other.opcodes.length !== len) { - return false; - } - - for (var i = 0; i < len; i++) { - var opcode = this.opcodes[i], - otherOpcode = other.opcodes[i]; - if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { - return false; - } - } - - // We know that length is the same between the two arrays because they are directly tied - // to the opcode behavior above. - len = this.children.length; - for (var i = 0; i < len; i++) { - if (!this.children[i].equals(other.children[i])) { - return false; - } - } - - return true; - }, - - guid: 0, - - compile: function compile(program, options) { - this.sourceNode = []; - this.opcodes = []; - this.children = []; - this.options = options; - this.stringParams = options.stringParams; - this.trackIds = options.trackIds; - - options.blockParams = options.blockParams || []; - - // These changes will propagate to the other compiler components - var knownHelpers = options.knownHelpers; - options.knownHelpers = { - helperMissing: true, - blockHelperMissing: true, - each: true, - 'if': true, - unless: true, - 'with': true, - log: true, - lookup: true - }; - if (knownHelpers) { - for (var _name in knownHelpers) { - if (_name in knownHelpers) { - options.knownHelpers[_name] = knownHelpers[_name]; - } - } - } - - return this.accept(program); - }, - - compileProgram: function compileProgram(program) { - var childCompiler = new this.compiler(), - // eslint-disable-line new-cap - result = childCompiler.compile(program, this.options), - guid = this.guid++; - - this.usePartial = this.usePartial || result.usePartial; - - this.children[guid] = result; - this.useDepths = this.useDepths || result.useDepths; - - return guid; - }, - - accept: function accept(node) { - this.sourceNode.unshift(node); - var ret = this[node.type](node); - this.sourceNode.shift(); - return ret; - }, - - Program: function Program(program) { - this.options.blockParams.unshift(program.blockParams); - - var body = program.body, - bodyLength = body.length; - for (var i = 0; i < bodyLength; i++) { - this.accept(body[i]); - } - - this.options.blockParams.shift(); - - this.isSimple = bodyLength === 1; - this.blockParams = program.blockParams ? program.blockParams.length : 0; - - return this; - }, - - BlockStatement: function BlockStatement(block) { - transformLiteralToPath(block); - - var program = block.program, - inverse = block.inverse; - - program = program && this.compileProgram(program); - inverse = inverse && this.compileProgram(inverse); - - var type = this.classifySexpr(block); - - if (type === 'helper') { - this.helperSexpr(block, program, inverse); - } else if (type === 'simple') { - this.simpleSexpr(block); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('blockValue', block.path.original); - } else { - this.ambiguousSexpr(block, program, inverse); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('ambiguousBlockValue'); - } - - this.opcode('append'); - }, - - PartialStatement: function PartialStatement(partial) { - this.usePartial = true; - - var params = partial.params; - if (params.length > 1) { - throw new _Exception2['default']('Unsupported number of partial arguments: ' + params.length, partial); - } else if (!params.length) { - params.push({ type: 'PathExpression', parts: [], depth: 0 }); - } - - var partialName = partial.name.original, - isDynamic = partial.name.type === 'SubExpression'; - if (isDynamic) { - this.accept(partial.name); - } - - this.setupFullMustacheParams(partial, undefined, undefined, true); - - var indent = partial.indent || ''; - if (this.options.preventIndent && indent) { - this.opcode('appendContent', indent); - indent = ''; - } - - this.opcode('invokePartial', isDynamic, partialName, indent); - this.opcode('append'); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.SubExpression(mustache); // eslint-disable-line new-cap - - if (mustache.escaped && !this.options.noEscape) { - this.opcode('appendEscaped'); - } else { - this.opcode('append'); - } - }, - - ContentStatement: function ContentStatement(content) { - if (content.value) { - this.opcode('appendContent', content.value); - } - }, - - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - transformLiteralToPath(sexpr); - var type = this.classifySexpr(sexpr); - - if (type === 'simple') { - this.simpleSexpr(sexpr); - } else if (type === 'helper') { - this.helperSexpr(sexpr); - } else { - this.ambiguousSexpr(sexpr); - } - }, - ambiguousSexpr: function ambiguousSexpr(sexpr, program, inverse) { - var path = sexpr.path, - name = path.parts[0], - isBlock = program != null || inverse != null; - - this.opcode('getContext', path.depth); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - this.accept(path); - - this.opcode('invokeAmbiguous', name, isBlock); - }, - - simpleSexpr: function simpleSexpr(sexpr) { - this.accept(sexpr.path); - this.opcode('resolvePossibleLambda'); - }, - - helperSexpr: function helperSexpr(sexpr, program, inverse) { - var params = this.setupFullMustacheParams(sexpr, program, inverse), - path = sexpr.path, - name = path.parts[0]; - - if (this.options.knownHelpers[name]) { - this.opcode('invokeKnownHelper', params.length, name); - } else if (this.options.knownHelpersOnly) { - throw new _Exception2['default']('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); - } else { - path.falsy = true; - - this.accept(path); - this.opcode('invokeHelper', params.length, path.original, _AST2['default'].helpers.simpleId(path)); - } - }, - - PathExpression: function PathExpression(path) { - this.addDepth(path.depth); - this.opcode('getContext', path.depth); - - var name = path.parts[0], - scoped = _AST2['default'].helpers.scopedId(path), - blockParamId = !path.depth && !scoped && this.blockParamIndex(name); - - if (blockParamId) { - this.opcode('lookupBlockParam', blockParamId, path.parts); - } else if (!name) { - // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` - this.opcode('pushContext'); - } else if (path.data) { - this.options.data = true; - this.opcode('lookupData', path.depth, path.parts); - } else { - this.opcode('lookupOnContext', path.parts, path.falsy, scoped); - } - }, - - StringLiteral: function StringLiteral(string) { - this.opcode('pushString', string.value); - }, - - NumberLiteral: function NumberLiteral(number) { - this.opcode('pushLiteral', number.value); - }, - - BooleanLiteral: function BooleanLiteral(bool) { - this.opcode('pushLiteral', bool.value); - }, - - UndefinedLiteral: function UndefinedLiteral() { - this.opcode('pushLiteral', 'undefined'); - }, - - NullLiteral: function NullLiteral() { - this.opcode('pushLiteral', 'null'); - }, - - Hash: function Hash(hash) { - var pairs = hash.pairs, - i = 0, - l = pairs.length; - - this.opcode('pushHash'); - - for (; i < l; i++) { - this.pushParam(pairs[i].value); - } - while (i--) { - this.opcode('assignToHash', pairs[i].key); - } - this.opcode('popHash'); - }, - - // HELPERS - opcode: function opcode(name) { - this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); - }, - - addDepth: function addDepth(depth) { - if (!depth) { - return; - } - - this.useDepths = true; - }, - - classifySexpr: function classifySexpr(sexpr) { - var isSimple = _AST2['default'].helpers.simpleId(sexpr.path); - - var isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); - - // a mustache is an eligible helper if: - // * its id is simple (a single part, not `this` or `..`) - var isHelper = !isBlockParam && _AST2['default'].helpers.helperExpression(sexpr); - - // if a mustache is an eligible helper but not a definite - // helper, it is ambiguous, and will be resolved in a later - // pass or at runtime. - var isEligible = !isBlockParam && (isHelper || isSimple); - - // if ambiguous, we can possibly resolve the ambiguity now - // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. - if (isEligible && !isHelper) { - var _name2 = sexpr.path.parts[0], - options = this.options; - - if (options.knownHelpers[_name2]) { - isHelper = true; - } else if (options.knownHelpersOnly) { - isEligible = false; - } - } - - if (isHelper) { - return 'helper'; - } else if (isEligible) { - return 'ambiguous'; - } else { - return 'simple'; - } - }, - - pushParams: function pushParams(params) { - for (var i = 0, l = params.length; i < l; i++) { - this.pushParam(params[i]); - } - }, - - pushParam: function pushParam(val) { - var value = val.value != null ? val.value : val.original || ''; - - if (this.stringParams) { - if (value.replace) { - value = value.replace(/^(\.?\.\/)*/g, '').replace(/\//g, '.'); - } - - if (val.depth) { - this.addDepth(val.depth); - } - this.opcode('getContext', val.depth || 0); - this.opcode('pushStringParam', value, val.type); - - if (val.type === 'SubExpression') { - // SubExpressions get evaluated and passed in - // in string params mode. - this.accept(val); - } - } else { - if (this.trackIds) { - var blockParamIndex = undefined; - if (val.parts && !_AST2['default'].helpers.scopedId(val) && !val.depth) { - blockParamIndex = this.blockParamIndex(val.parts[0]); - } - if (blockParamIndex) { - var blockParamChild = val.parts.slice(1).join('.'); - this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); - } else { - value = val.original || value; - if (value.replace) { - value = value.replace(/^\.\//g, '').replace(/^\.$/g, ''); - } - - this.opcode('pushId', val.type, value); - } - } - this.accept(val); - } - }, - - setupFullMustacheParams: function setupFullMustacheParams(sexpr, program, inverse, omitEmpty) { - var params = sexpr.params; - this.pushParams(params); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - if (sexpr.hash) { - this.accept(sexpr.hash); - } else { - this.opcode('emptyHash', omitEmpty); - } - - return params; - }, - - blockParamIndex: function blockParamIndex(name) { - for (var depth = 0, len = this.options.blockParams.length; depth < len; depth++) { - var blockParams = this.options.blockParams[depth], - param = blockParams && _isArray$indexOf.indexOf(blockParams, name); - if (blockParams && param >= 0) { - return [depth, param]; - } - } - } - }; - - function precompile(input, options, env) { - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception2['default']('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); - } - - options = options || {}; - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options); - return new env.JavaScriptCompiler().compile(environment, options); - } - - function compile(input, _x, env) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - if (input == null || typeof input !== 'string' && input.type !== 'Program') { - throw new _Exception2['default']('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); - } - - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - var compiled = undefined; - - function compileInput() { - var ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options), - templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); - return env.template(templateSpec); - } - - // Template is only compiled on first use and cached after that point. - function ret(context, execOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled.call(this, context, execOptions); - } - ret._setup = function (setupOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._setup(setupOptions); - }; - ret._child = function (i, data, blockParams, depths) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._child(i, data, blockParams, depths); - }; - return ret; - } - - function argEquals(a, b) { - if (a === b) { - return true; - } - - if (_isArray$indexOf.isArray(a) && _isArray$indexOf.isArray(b) && a.length === b.length) { - for (var i = 0; i < a.length; i++) { - if (!argEquals(a[i], b[i])) { - return false; - } - } - return true; - } - } - - function transformLiteralToPath(sexpr) { - if (!sexpr.path.parts) { - var literal = sexpr.path; - // Casting to string here to make false and 0 literal values play nicely with the rest - // of the system. - sexpr.path = new _AST2['default'].PathExpression(false, 0, [literal.original + ''], literal.original + '', literal.loc); - } - } - -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - - var _COMPILER_REVISION$REVISION_CHANGES = __webpack_require__(9); - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _isArray = __webpack_require__(12); - - var _CodeGen = __webpack_require__(17); - - var _CodeGen2 = _interopRequireWildcard(_CodeGen); - - function Literal(value) { - this.value = value; - } - - function JavaScriptCompiler() {} - - JavaScriptCompiler.prototype = { - // PUBLIC API: You can override these methods in a subclass to provide - // alternative compiled forms for name lookup and buffering semantics - nameLookup: function nameLookup(parent, name /* , type*/) { - if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { - return [parent, '.', name]; - } else { - return [parent, '[\'', name, '\']']; - } - }, - depthedLookup: function depthedLookup(name) { - return [this.aliasable('this.lookup'), '(depths, "', name, '")']; - }, - - compilerInfo: function compilerInfo() { - var revision = _COMPILER_REVISION$REVISION_CHANGES.COMPILER_REVISION, - versions = _COMPILER_REVISION$REVISION_CHANGES.REVISION_CHANGES[revision]; - return [revision, versions]; - }, - - appendToBuffer: function appendToBuffer(source, location, explicit) { - // Force a source as this simplifies the merge logic. - if (!_isArray.isArray(source)) { - source = [source]; - } - source = this.source.wrap(source, location); - - if (this.environment.isSimple) { - return ['return ', source, ';']; - } else if (explicit) { - // This is a case where the buffer operation occurs as a child of another - // construct, generally braces. We have to explicitly output these buffer - // operations to ensure that the emitted code goes in the correct location. - return ['buffer += ', source, ';']; - } else { - source.appendToBuffer = true; - return source; - } - }, - - initializeBuffer: function initializeBuffer() { - return this.quotedString(''); - }, - // END PUBLIC API - - compile: function compile(environment, options, context, asObject) { - this.environment = environment; - this.options = options; - this.stringParams = this.options.stringParams; - this.trackIds = this.options.trackIds; - this.precompile = !asObject; - - this.name = this.environment.name; - this.isChild = !!context; - this.context = context || { - programs: [], - environments: [] - }; - - this.preamble(); - - this.stackSlot = 0; - this.stackVars = []; - this.aliases = {}; - this.registers = { list: [] }; - this.hashes = []; - this.compileStack = []; - this.inlineStack = []; - this.blockParams = []; - - this.compileChildren(environment, options); - - this.useDepths = this.useDepths || environment.useDepths || this.options.compat; - this.useBlockParams = this.useBlockParams || environment.useBlockParams; - - var opcodes = environment.opcodes, - opcode = undefined, - firstLoc = undefined, - i = undefined, - l = undefined; - - for (i = 0, l = opcodes.length; i < l; i++) { - opcode = opcodes[i]; - - this.source.currentLocation = opcode.loc; - firstLoc = firstLoc || opcode.loc; - this[opcode.opcode].apply(this, opcode.args); - } - - // Flush any trailing content that might be pending. - this.source.currentLocation = firstLoc; - this.pushSource(''); - - /* istanbul ignore next */ - if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { - throw new _Exception2['default']('Compile completed with content left on stack'); - } - - var fn = this.createFunctionContext(asObject); - if (!this.isChild) { - var ret = { - compiler: this.compilerInfo(), - main: fn - }; - var programs = this.context.programs; - for (i = 0, l = programs.length; i < l; i++) { - if (programs[i]) { - ret[i] = programs[i]; - } - } - - if (this.environment.usePartial) { - ret.usePartial = true; - } - if (this.options.data) { - ret.useData = true; - } - if (this.useDepths) { - ret.useDepths = true; - } - if (this.useBlockParams) { - ret.useBlockParams = true; - } - if (this.options.compat) { - ret.compat = true; - } - - if (!asObject) { - ret.compiler = JSON.stringify(ret.compiler); - - this.source.currentLocation = { start: { line: 1, column: 0 } }; - ret = this.objectLiteral(ret); - - if (options.srcName) { - ret = ret.toStringWithSourceMap({ file: options.destName }); - ret.map = ret.map && ret.map.toString(); - } else { - ret = ret.toString(); - } - } else { - ret.compilerOptions = this.options; - } - - return ret; - } else { - return fn; - } - }, - - preamble: function preamble() { - // track the last context pushed into place to allow skipping the - // getContext opcode when it would be a noop - this.lastContext = 0; - this.source = new _CodeGen2['default'](this.options.srcName); - }, - - createFunctionContext: function createFunctionContext(asObject) { - var varDeclarations = ''; - - var locals = this.stackVars.concat(this.registers.list); - if (locals.length > 0) { - varDeclarations += ', ' + locals.join(', '); - } - - // Generate minimizer alias mappings - // - // When using true SourceNodes, this will update all references to the given alias - // as the source nodes are reused in situ. For the non-source node compilation mode, - // aliases will not be used, but this case is already being run on the client and - // we aren't concern about minimizing the template size. - var aliasCount = 0; - for (var alias in this.aliases) { - // eslint-disable-line guard-for-in - var node = this.aliases[alias]; - - if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) { - varDeclarations += ', alias' + ++aliasCount + '=' + alias; - node.children[0] = 'alias' + aliasCount; - } - } - - var params = ['depth0', 'helpers', 'partials', 'data']; - - if (this.useBlockParams || this.useDepths) { - params.push('blockParams'); - } - if (this.useDepths) { - params.push('depths'); - } - - // Perform a second pass over the output to merge content when possible - var source = this.mergeSource(varDeclarations); - - if (asObject) { - params.push(source); - - return Function.apply(this, params); - } else { - return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); - } - }, - mergeSource: function mergeSource(varDeclarations) { - var isSimple = this.environment.isSimple, - appendOnly = !this.forceBuffer, - appendFirst = undefined, - sourceSeen = undefined, - bufferStart = undefined, - bufferEnd = undefined; - this.source.each(function (line) { - if (line.appendToBuffer) { - if (bufferStart) { - line.prepend(' + '); - } else { - bufferStart = line; - } - bufferEnd = line; - } else { - if (bufferStart) { - if (!sourceSeen) { - appendFirst = true; - } else { - bufferStart.prepend('buffer += '); - } - bufferEnd.add(';'); - bufferStart = bufferEnd = undefined; - } - - sourceSeen = true; - if (!isSimple) { - appendOnly = false; - } - } - }); - - if (appendOnly) { - if (bufferStart) { - bufferStart.prepend('return '); - bufferEnd.add(';'); - } else if (!sourceSeen) { - this.source.push('return "";'); - } - } else { - varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); - - if (bufferStart) { - bufferStart.prepend('return buffer + '); - bufferEnd.add(';'); - } else { - this.source.push('return buffer;'); - } - } - - if (varDeclarations) { - this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); - } - - return this.source.merge(); - }, - - // [blockValue] - // - // On stack, before: hash, inverse, program, value - // On stack, after: return value of blockHelperMissing - // - // The purpose of this opcode is to take a block of the form - // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and - // replace it on the stack with the result of properly - // invoking blockHelperMissing. - blockValue: function blockValue(name) { - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs(name, 0, params); - - var blockName = this.popStack(); - params.splice(1, 0, blockName); - - this.push(this.source.functionCall(blockHelperMissing, 'call', params)); - }, - - // [ambiguousBlockValue] - // - // On stack, before: hash, inverse, program, value - // Compiler value, before: lastHelper=value of last found helper, if any - // On stack, after, if no lastHelper: same as [blockValue] - // On stack, after, if lastHelper: value - ambiguousBlockValue: function ambiguousBlockValue() { - // We're being a bit cheeky and reusing the options value from the prior exec - var blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs('', 0, params, true); - - this.flushInline(); - - var current = this.topStack(); - params.splice(1, 0, current); - - this.pushSource(['if (!', this.lastHelper, ') { ', current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), '}']); - }, - - // [appendContent] - // - // On stack, before: ... - // On stack, after: ... - // - // Appends the string value of `content` to the current buffer - appendContent: function appendContent(content) { - if (this.pendingContent) { - content = this.pendingContent + content; - } else { - this.pendingLocation = this.source.currentLocation; - } - - this.pendingContent = content; - }, - - // [append] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Coerces `value` to a String and appends it to the current buffer. - // - // If `value` is truthy, or 0, it is coerced into a string and appended - // Otherwise, the empty string is appended - append: function append() { - if (this.isInline()) { - this.replaceStack(function (current) { - return [' != null ? ', current, ' : ""']; - }); - - this.pushSource(this.appendToBuffer(this.popStack())); - } else { - var local = this.popStack(); - this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); - if (this.environment.isSimple) { - this.pushSource(['else { ', this.appendToBuffer('\'\'', undefined, true), ' }']); - } - } - }, - - // [appendEscaped] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Escape `value` and append it to the buffer - appendEscaped: function appendEscaped() { - this.pushSource(this.appendToBuffer([this.aliasable('this.escapeExpression'), '(', this.popStack(), ')'])); - }, - - // [getContext] - // - // On stack, before: ... - // On stack, after: ... - // Compiler value, after: lastContext=depth - // - // Set the value of the `lastContext` compiler value to the depth - getContext: function getContext(depth) { - this.lastContext = depth; - }, - - // [pushContext] - // - // On stack, before: ... - // On stack, after: currentContext, ... - // - // Pushes the value of the current context onto the stack. - pushContext: function pushContext() { - this.pushStackLiteral(this.contextName(this.lastContext)); - }, - - // [lookupOnContext] - // - // On stack, before: ... - // On stack, after: currentContext[name], ... - // - // Looks up the value of `name` on the current context and pushes - // it onto the stack. - lookupOnContext: function lookupOnContext(parts, falsy, scoped) { - var i = 0; - - if (!scoped && this.options.compat && !this.lastContext) { - // The depthed query is expected to handle the undefined logic for the root level that - // is implemented below, so we evaluate that directly in compat mode - this.push(this.depthedLookup(parts[i++])); - } else { - this.pushContext(); - } - - this.resolvePath('context', parts, i, falsy); - }, - - // [lookupBlockParam] - // - // On stack, before: ... - // On stack, after: blockParam[name], ... - // - // Looks up the value of `parts` on the given block param and pushes - // it onto the stack. - lookupBlockParam: function lookupBlockParam(blockParamId, parts) { - this.useBlockParams = true; - - this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); - this.resolvePath('context', parts, 1); - }, - - // [lookupData] - // - // On stack, before: ... - // On stack, after: data, ... - // - // Push the data lookup operator - lookupData: function lookupData(depth, parts) { - if (!depth) { - this.pushStackLiteral('data'); - } else { - this.pushStackLiteral('this.data(data, ' + depth + ')'); - } - - this.resolvePath('data', parts, 0, true); - }, - - resolvePath: function resolvePath(type, parts, i, falsy) { - var _this = this; - - if (this.options.strict || this.options.assumeObjects) { - this.push(strictLookup(this.options.strict, this, parts, type)); - return; - } - - var len = parts.length; - for (; i < len; i++) { - /*eslint-disable no-loop-func */ - this.replaceStack(function (current) { - var lookup = _this.nameLookup(current, parts[i], type); - // We want to ensure that zero and false are handled properly if the context (falsy flag) - // needs to have the special handling for these values. - if (!falsy) { - return [' != null ? ', lookup, ' : ', current]; - } else { - // Otherwise we can use generic falsy handling - return [' && ', lookup]; - } - }); - /*eslint-enable no-loop-func */ - } - }, - - // [resolvePossibleLambda] - // - // On stack, before: value, ... - // On stack, after: resolved value, ... - // - // If the `value` is a lambda, replace it on the stack by - // the return value of the lambda - resolvePossibleLambda: function resolvePossibleLambda() { - this.push([this.aliasable('this.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); - }, - - // [pushStringParam] - // - // On stack, before: ... - // On stack, after: string, currentContext, ... - // - // This opcode is designed for use in string mode, which - // provides the string value of a parameter along with its - // depth rather than resolving it immediately. - pushStringParam: function pushStringParam(string, type) { - this.pushContext(); - this.pushString(type); - - // If it's a subexpression, the string result - // will be pushed after this opcode. - if (type !== 'SubExpression') { - if (typeof string === 'string') { - this.pushString(string); - } else { - this.pushStackLiteral(string); - } - } - }, - - emptyHash: function emptyHash(omitEmpty) { - if (this.trackIds) { - this.push('{}'); // hashIds - } - if (this.stringParams) { - this.push('{}'); // hashContexts - this.push('{}'); // hashTypes - } - this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); - }, - pushHash: function pushHash() { - if (this.hash) { - this.hashes.push(this.hash); - } - this.hash = { values: [], types: [], contexts: [], ids: [] }; - }, - popHash: function popHash() { - var hash = this.hash; - this.hash = this.hashes.pop(); - - if (this.trackIds) { - this.push(this.objectLiteral(hash.ids)); - } - if (this.stringParams) { - this.push(this.objectLiteral(hash.contexts)); - this.push(this.objectLiteral(hash.types)); - } - - this.push(this.objectLiteral(hash.values)); - }, - - // [pushString] - // - // On stack, before: ... - // On stack, after: quotedString(string), ... - // - // Push a quoted version of `string` onto the stack - pushString: function pushString(string) { - this.pushStackLiteral(this.quotedString(string)); - }, - - // [pushLiteral] - // - // On stack, before: ... - // On stack, after: value, ... - // - // Pushes a value onto the stack. This operation prevents - // the compiler from creating a temporary variable to hold - // it. - pushLiteral: function pushLiteral(value) { - this.pushStackLiteral(value); - }, - - // [pushProgram] - // - // On stack, before: ... - // On stack, after: program(guid), ... - // - // Push a program expression onto the stack. This takes - // a compile-time guid and converts it into a runtime-accessible - // expression. - pushProgram: function pushProgram(guid) { - if (guid != null) { - this.pushStackLiteral(this.programExpression(guid)); - } else { - this.pushStackLiteral(null); - } - }, - - // [invokeHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // Pops off the helper's parameters, invokes the helper, - // and pushes the helper's return value onto the stack. - // - // If the helper is not found, `helperMissing` is called. - invokeHelper: function invokeHelper(paramSize, name, isSimple) { - var nonHelper = this.popStack(), - helper = this.setupHelper(paramSize, name), - simple = isSimple ? [helper.name, ' || '] : ''; - - var lookup = ['('].concat(simple, nonHelper); - if (!this.options.strict) { - lookup.push(' || ', this.aliasable('helpers.helperMissing')); - } - lookup.push(')'); - - this.push(this.source.functionCall(lookup, 'call', helper.callParams)); - }, - - // [invokeKnownHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // This operation is used when the helper is known to exist, - // so a `helperMissing` fallback is not required. - invokeKnownHelper: function invokeKnownHelper(paramSize, name) { - var helper = this.setupHelper(paramSize, name); - this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); - }, - - // [invokeAmbiguous] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of disambiguation - // - // This operation is used when an expression like `{{foo}}` - // is provided, but we don't know at compile-time whether it - // is a helper or a path. - // - // This operation emits more code than the other options, - // and can be avoided by passing the `knownHelpers` and - // `knownHelpersOnly` flags at compile-time. - invokeAmbiguous: function invokeAmbiguous(name, helperCall) { - this.useRegister('helper'); - - var nonHelper = this.popStack(); - - this.emptyHash(); - var helper = this.setupHelper(0, name, helperCall); - - var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); - - var lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; - if (!this.options.strict) { - lookup[0] = '(helper = '; - lookup.push(' != null ? helper : ', this.aliasable('helpers.helperMissing')); - } - - this.push(['(', lookup, helper.paramsInit ? ['),(', helper.paramsInit] : [], '),', '(typeof helper === ', this.aliasable('"function"'), ' ? ', this.source.functionCall('helper', 'call', helper.callParams), ' : helper))']); - }, - - // [invokePartial] - // - // On stack, before: context, ... - // On stack after: result of partial invocation - // - // This operation pops off a context, invokes a partial with that context, - // and pushes the result of the invocation back. - invokePartial: function invokePartial(isDynamic, name, indent) { - var params = [], - options = this.setupParams(name, 1, params, false); - - if (isDynamic) { - name = this.popStack(); - delete options.name; - } - - if (indent) { - options.indent = JSON.stringify(indent); - } - options.helpers = 'helpers'; - options.partials = 'partials'; - - if (!isDynamic) { - params.unshift(this.nameLookup('partials', name, 'partial')); - } else { - params.unshift(name); - } - - if (this.options.compat) { - options.depths = 'depths'; - } - options = this.objectLiteral(options); - params.push(options); - - this.push(this.source.functionCall('this.invokePartial', '', params)); - }, - - // [assignToHash] - // - // On stack, before: value, ..., hash, ... - // On stack, after: ..., hash, ... - // - // Pops a value off the stack and assigns it to the current hash - assignToHash: function assignToHash(key) { - var value = this.popStack(), - context = undefined, - type = undefined, - id = undefined; - - if (this.trackIds) { - id = this.popStack(); - } - if (this.stringParams) { - type = this.popStack(); - context = this.popStack(); - } - - var hash = this.hash; - if (context) { - hash.contexts[key] = context; - } - if (type) { - hash.types[key] = type; - } - if (id) { - hash.ids[key] = id; - } - hash.values[key] = value; - }, - - pushId: function pushId(type, name, child) { - if (type === 'BlockParam') { - this.pushStackLiteral('blockParams[' + name[0] + '].path[' + name[1] + ']' + (child ? ' + ' + JSON.stringify('.' + child) : '')); - } else if (type === 'PathExpression') { - this.pushString(name); - } else if (type === 'SubExpression') { - this.pushStackLiteral('true'); - } else { - this.pushStackLiteral('null'); - } - }, - - // HELPERS - - compiler: JavaScriptCompiler, - - compileChildren: function compileChildren(environment, options) { - var children = environment.children, - child = undefined, - compiler = undefined; - - for (var i = 0, l = children.length; i < l; i++) { - child = children[i]; - compiler = new this.compiler(); // eslint-disable-line new-cap - - var index = this.matchExistingProgram(child); - - if (index == null) { - this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children - index = this.context.programs.length; - child.index = index; - child.name = 'program' + index; - this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); - this.context.environments[index] = child; - - this.useDepths = this.useDepths || compiler.useDepths; - this.useBlockParams = this.useBlockParams || compiler.useBlockParams; - } else { - child.index = index; - child.name = 'program' + index; - - this.useDepths = this.useDepths || child.useDepths; - this.useBlockParams = this.useBlockParams || child.useBlockParams; - } - } - }, - matchExistingProgram: function matchExistingProgram(child) { - for (var i = 0, len = this.context.environments.length; i < len; i++) { - var environment = this.context.environments[i]; - if (environment && environment.equals(child)) { - return i; - } - } - }, - - programExpression: function programExpression(guid) { - var child = this.environment.children[guid], - programParams = [child.index, 'data', child.blockParams]; - - if (this.useBlockParams || this.useDepths) { - programParams.push('blockParams'); - } - if (this.useDepths) { - programParams.push('depths'); - } - - return 'this.program(' + programParams.join(', ') + ')'; - }, - - useRegister: function useRegister(name) { - if (!this.registers[name]) { - this.registers[name] = true; - this.registers.list.push(name); - } - }, - - push: function push(expr) { - if (!(expr instanceof Literal)) { - expr = this.source.wrap(expr); - } - - this.inlineStack.push(expr); - return expr; - }, - - pushStackLiteral: function pushStackLiteral(item) { - this.push(new Literal(item)); - }, - - pushSource: function pushSource(source) { - if (this.pendingContent) { - this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); - this.pendingContent = undefined; - } - - if (source) { - this.source.push(source); - } - }, - - replaceStack: function replaceStack(callback) { - var prefix = ['('], - stack = undefined, - createdStack = undefined, - usedLiteral = undefined; - - /* istanbul ignore next */ - if (!this.isInline()) { - throw new _Exception2['default']('replaceStack on non-inline'); - } - - // We want to merge the inline statement into the replacement statement via ',' - var top = this.popStack(true); - - if (top instanceof Literal) { - // Literals do not need to be inlined - stack = [top.value]; - prefix = ['(', stack]; - usedLiteral = true; - } else { - // Get or create the current stack name for use by the inline - createdStack = true; - var _name = this.incrStack(); - - prefix = ['((', this.push(_name), ' = ', top, ')']; - stack = this.topStack(); - } - - var item = callback.call(this, stack); - - if (!usedLiteral) { - this.popStack(); - } - if (createdStack) { - this.stackSlot--; - } - this.push(prefix.concat(item, ')')); - }, - - incrStack: function incrStack() { - this.stackSlot++; - if (this.stackSlot > this.stackVars.length) { - this.stackVars.push('stack' + this.stackSlot); - } - return this.topStackName(); - }, - topStackName: function topStackName() { - return 'stack' + this.stackSlot; - }, - flushInline: function flushInline() { - var inlineStack = this.inlineStack; - this.inlineStack = []; - for (var i = 0, len = inlineStack.length; i < len; i++) { - var entry = inlineStack[i]; - /* istanbul ignore if */ - if (entry instanceof Literal) { - this.compileStack.push(entry); - } else { - var stack = this.incrStack(); - this.pushSource([stack, ' = ', entry, ';']); - this.compileStack.push(stack); - } - } - }, - isInline: function isInline() { - return this.inlineStack.length; - }, - - popStack: function popStack(wrapped) { - var inline = this.isInline(), - item = (inline ? this.inlineStack : this.compileStack).pop(); - - if (!wrapped && item instanceof Literal) { - return item.value; - } else { - if (!inline) { - /* istanbul ignore next */ - if (!this.stackSlot) { - throw new _Exception2['default']('Invalid stack pop'); - } - this.stackSlot--; - } - return item; - } - }, - - topStack: function topStack() { - var stack = this.isInline() ? this.inlineStack : this.compileStack, - item = stack[stack.length - 1]; - - /* istanbul ignore if */ - if (item instanceof Literal) { - return item.value; - } else { - return item; - } - }, - - contextName: function contextName(context) { - if (this.useDepths && context) { - return 'depths[' + context + ']'; - } else { - return 'depth' + context; - } - }, - - quotedString: function quotedString(str) { - return this.source.quotedString(str); - }, - - objectLiteral: function objectLiteral(obj) { - return this.source.objectLiteral(obj); - }, - - aliasable: function aliasable(name) { - var ret = this.aliases[name]; - if (ret) { - ret.referenceCount++; - return ret; - } - - ret = this.aliases[name] = this.source.wrap(name); - ret.aliasable = true; - ret.referenceCount = 1; - - return ret; - }, - - setupHelper: function setupHelper(paramSize, name, blockHelper) { - var params = [], - paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); - var foundHelper = this.nameLookup('helpers', name, 'helper'); - - return { - params: params, - paramsInit: paramsInit, - name: foundHelper, - callParams: [this.contextName(0)].concat(params) - }; - }, - - setupParams: function setupParams(helper, paramSize, params) { - var options = {}, - contexts = [], - types = [], - ids = [], - param = undefined; - - options.name = this.quotedString(helper); - options.hash = this.popStack(); - - if (this.trackIds) { - options.hashIds = this.popStack(); - } - if (this.stringParams) { - options.hashTypes = this.popStack(); - options.hashContexts = this.popStack(); - } - - var inverse = this.popStack(), - program = this.popStack(); - - // Avoid setting fn and inverse if neither are set. This allows - // helpers to do a check for `if (options.fn)` - if (program || inverse) { - options.fn = program || 'this.noop'; - options.inverse = inverse || 'this.noop'; - } - - // The parameters go on to the stack in order (making sure that they are evaluated in order) - // so we need to pop them off the stack in reverse order - var i = paramSize; - while (i--) { - param = this.popStack(); - params[i] = param; - - if (this.trackIds) { - ids[i] = this.popStack(); - } - if (this.stringParams) { - types[i] = this.popStack(); - contexts[i] = this.popStack(); - } - } - - if (this.trackIds) { - options.ids = this.source.generateArray(ids); - } - if (this.stringParams) { - options.types = this.source.generateArray(types); - options.contexts = this.source.generateArray(contexts); - } - - if (this.options.data) { - options.data = 'data'; - } - if (this.useBlockParams) { - options.blockParams = 'blockParams'; - } - return options; - }, - - setupHelperArgs: function setupHelperArgs(helper, paramSize, params, useRegister) { - var options = this.setupParams(helper, paramSize, params, true); - options = this.objectLiteral(options); - if (useRegister) { - this.useRegister('options'); - params.push('options'); - return ['options=', options]; - } else { - params.push(options); - return ''; - } - } - }; - - (function () { - var reservedWords = ('break else new var' + ' case finally return void' + ' catch for switch while' + ' continue function this with' + ' default if throw' + ' delete in try' + ' do instanceof typeof' + ' abstract enum int short' + ' boolean export interface static' + ' byte extends long super' + ' char final native synchronized' + ' class float package throws' + ' const goto private transient' + ' debugger implements protected volatile' + ' double import public let yield await' + ' null true false').split(' '); - - var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; - - for (var i = 0, l = reservedWords.length; i < l; i++) { - compilerWords[reservedWords[i]] = true; - } - })(); - - JavaScriptCompiler.isValidJavaScriptVariableName = function (name) { - return !JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name); - }; - - function strictLookup(requireTerminal, compiler, parts, type) { - var stack = compiler.popStack(), - i = 0, - len = parts.length; - if (requireTerminal) { - len--; - } - - for (; i < len; i++) { - stack = compiler.nameLookup(stack, parts[i], type); - } - - if (requireTerminal) { - return [compiler.aliasable('this.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')']; - } else { - return stack; - } - } - - exports['default'] = JavaScriptCompiler; - module.exports = exports['default']; - -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _AST = __webpack_require__(2); - - var _AST2 = _interopRequireWildcard(_AST); - - function Visitor() { - this.parents = []; - } - - Visitor.prototype = { - constructor: Visitor, - mutating: false, - - // Visits a given value. If mutating, will replace the value if necessary. - acceptKey: function acceptKey(node, name) { - var value = this.accept(node[name]); - if (this.mutating) { - // Hacky sanity check: - if (value && (!value.type || !_AST2['default'][value.type])) { - throw new _Exception2['default']('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); - } - node[name] = value; - } - }, - - // Performs an accept operation with added sanity check to ensure - // required keys are not removed. - acceptRequired: function acceptRequired(node, name) { - this.acceptKey(node, name); - - if (!node[name]) { - throw new _Exception2['default'](node.type + ' requires ' + name); - } - }, - - // Traverses a given array. If mutating, empty respnses will be removed - // for child elements. - acceptArray: function acceptArray(array) { - for (var i = 0, l = array.length; i < l; i++) { - this.acceptKey(array, i); - - if (!array[i]) { - array.splice(i, 1); - i--; - l--; - } - } - }, - - accept: function accept(object) { - if (!object) { - return; - } - - if (this.current) { - this.parents.unshift(this.current); - } - this.current = object; - - var ret = this[object.type](object); - - this.current = this.parents.shift(); - - if (!this.mutating || ret) { - return ret; - } else if (ret !== false) { - return object; - } - }, - - Program: function Program(program) { - this.acceptArray(program.body); - }, - - MustacheStatement: function MustacheStatement(mustache) { - this.acceptRequired(mustache, 'path'); - this.acceptArray(mustache.params); - this.acceptKey(mustache, 'hash'); - }, - - BlockStatement: function BlockStatement(block) { - this.acceptRequired(block, 'path'); - this.acceptArray(block.params); - this.acceptKey(block, 'hash'); - - this.acceptKey(block, 'program'); - this.acceptKey(block, 'inverse'); - }, - - PartialStatement: function PartialStatement(partial) { - this.acceptRequired(partial, 'name'); - this.acceptArray(partial.params); - this.acceptKey(partial, 'hash'); - }, - - ContentStatement: function ContentStatement() {}, - CommentStatement: function CommentStatement() {}, - - SubExpression: function SubExpression(sexpr) { - this.acceptRequired(sexpr, 'path'); - this.acceptArray(sexpr.params); - this.acceptKey(sexpr, 'hash'); - }, - - PathExpression: function PathExpression() {}, - - StringLiteral: function StringLiteral() {}, - NumberLiteral: function NumberLiteral() {}, - BooleanLiteral: function BooleanLiteral() {}, - UndefinedLiteral: function UndefinedLiteral() {}, - NullLiteral: function NullLiteral() {}, - - Hash: function Hash(hash) { - this.acceptArray(hash.pairs); - }, - HashPair: function HashPair(pair) { - this.acceptRequired(pair, 'value'); - } - }; - - exports['default'] = Visitor; - module.exports = exports['default']; - /* content */ /* comment */ /* path */ /* string */ /* number */ /* bool */ /* literal */ /* literal */ - -/***/ }, -/* 7 */ -/***/ function(module, exports, __webpack_require__) { - - /* WEBPACK VAR INJECTION */(function(global) {'use strict'; - - exports.__esModule = true; - /*global window */ - - exports['default'] = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; - }; - - module.exports = exports['default']; - /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) - -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - exports["default"] = function (obj) { - return obj && obj.__esModule ? obj : { - "default": obj - }; - }; - - exports.__esModule = true; - -/***/ }, -/* 9 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - exports.HandlebarsEnvironment = HandlebarsEnvironment; - exports.createFrame = createFrame; - - var _import = __webpack_require__(12); - - var Utils = _interopRequireWildcard(_import); - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var VERSION = '3.0.1'; - exports.VERSION = VERSION; - var COMPILER_REVISION = 6; - - exports.COMPILER_REVISION = COMPILER_REVISION; - var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' - }; - - exports.REVISION_CHANGES = REVISION_CHANGES; - var isArray = Utils.isArray, - isFunction = Utils.isFunction, - toString = Utils.toString, - objectType = '[object Object]'; - - function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); - } - - HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function registerHelper(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { - throw new _Exception2['default']('Arg not supported with multiple helpers'); - } - Utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (toString.call(name) === objectType) { - Utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _Exception2['default']('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - } - }; - - function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function () { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _Exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _Exception2['default']('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: Utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (var j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function (conditional, options) { - if (isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || Utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - - instance.registerHelper('with', function (context, options) { - if (isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!Utils.isEmpty(context)) { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = { data: data }; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function (message, options) { - var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); - } - - var logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function log(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - var method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } - }; - - exports.logger = logger; - var log = logger.log; - - exports.log = log; - - function createFrame(object) { - var frame = Utils.extend({}, object); - frame._parent = object; - return frame; - } - - /* [args, ]options */ - -/***/ }, -/* 10 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - // Build out our basic SafeString type - function SafeString(string) { - this.string = string; - } - - SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; - }; - - exports['default'] = SafeString; - module.exports = exports['default']; - -/***/ }, -/* 11 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - - function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } - } - - Exception.prototype = new Error(); - - exports['default'] = Exception; - module.exports = exports['default']; - -/***/ }, -/* 12 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - exports.extend = extend; - - // Older IE versions do not directly support indexOf so we must implement our own, sadly. - exports.indexOf = indexOf; - exports.escapeExpression = escapeExpression; - exports.isEmpty = isEmpty; - exports.blockParams = blockParams; - exports.appendContextPath = appendContextPath; - var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '`': '`' - }; - - var badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - - function escapeChar(chr) { - return escape[chr]; - } - - function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; - } - - var toString = Object.prototype.toString; - - exports.toString = toString; - // Sourced from lodash - // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt - /*eslint-disable func-style, no-var */ - var isFunction = function isFunction(value) { - return typeof value === 'function'; - }; - // fallback for older versions of Chrome and Safari - /* istanbul ignore next */ - if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; - } - var isFunction; - exports.isFunction = isFunction; - /*eslint-enable func-style, no-var */ - - /* istanbul ignore next */ - var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; - };exports.isArray = isArray; - - function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; - } - - function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); - } - - function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } - } - - function blockParams(params, ids) { - params.path = ids; - return params; - } - - function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; - } - -/***/ }, -/* 13 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - exports.checkRevision = checkRevision; - - // TODO: Remove this line and break up compilePartial - - exports.template = template; - exports.wrapProgram = wrapProgram; - exports.resolvePartial = resolvePartial; - exports.invokePartial = invokePartial; - exports.noop = noop; - - var _import = __webpack_require__(12); - - var Utils = _interopRequireWildcard(_import); - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _COMPILER_REVISION$REVISION_CHANGES$createFrame = __webpack_require__(9); - - function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _COMPILER_REVISION$REVISION_CHANGES$createFrame.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[currentRevision], - compilerVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[compilerRevision]; - throw new _Exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _Exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } - } - - function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _Exception2['default']('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _Exception2['default']('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = Utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _Exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _Exception2['default']('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: Utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - return templateSpec[i]; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = Utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _Exception2['default']('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _Exception2['default']('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; - } - - function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; - } - - function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; - } - - function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new _Exception2['default']('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } - } - - function noop() { - return ''; - } - - function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _COMPILER_REVISION$REVISION_CHANGES$createFrame.createFrame(data) : {}; - data.root = context; - } - return data; - } - -/***/ }, -/* 14 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - exports.__esModule = true; - /* istanbul ignore next */ - /* Jison generated parser */ - var handlebars = (function () { - var parser = { trace: function trace() {}, - yy: {}, - symbols_: { error: 2, root: 3, program: 4, EOF: 5, program_repetition0: 6, statement: 7, mustache: 8, block: 9, rawBlock: 10, partial: 11, content: 12, COMMENT: 13, CONTENT: 14, openRawBlock: 15, END_RAW_BLOCK: 16, OPEN_RAW_BLOCK: 17, helperName: 18, openRawBlock_repetition0: 19, openRawBlock_option0: 20, CLOSE_RAW_BLOCK: 21, openBlock: 22, block_option0: 23, closeBlock: 24, openInverse: 25, block_option1: 26, OPEN_BLOCK: 27, openBlock_repetition0: 28, openBlock_option0: 29, openBlock_option1: 30, CLOSE: 31, OPEN_INVERSE: 32, openInverse_repetition0: 33, openInverse_option0: 34, openInverse_option1: 35, openInverseChain: 36, OPEN_INVERSE_CHAIN: 37, openInverseChain_repetition0: 38, openInverseChain_option0: 39, openInverseChain_option1: 40, inverseAndProgram: 41, INVERSE: 42, inverseChain: 43, inverseChain_option0: 44, OPEN_ENDBLOCK: 45, OPEN: 46, mustache_repetition0: 47, mustache_option0: 48, OPEN_UNESCAPED: 49, mustache_repetition1: 50, mustache_option1: 51, CLOSE_UNESCAPED: 52, OPEN_PARTIAL: 53, partialName: 54, partial_repetition0: 55, partial_option0: 56, param: 57, sexpr: 58, OPEN_SEXPR: 59, sexpr_repetition0: 60, sexpr_option0: 61, CLOSE_SEXPR: 62, hash: 63, hash_repetition_plus0: 64, hashSegment: 65, ID: 66, EQUALS: 67, blockParams: 68, OPEN_BLOCK_PARAMS: 69, blockParams_repetition_plus0: 70, CLOSE_BLOCK_PARAMS: 71, path: 72, dataName: 73, STRING: 74, NUMBER: 75, BOOLEAN: 76, UNDEFINED: 77, NULL: 78, DATA: 79, pathSegments: 80, SEP: 81, $accept: 0, $end: 1 }, - terminals_: { 2: "error", 5: "EOF", 13: "COMMENT", 14: "CONTENT", 16: "END_RAW_BLOCK", 17: "OPEN_RAW_BLOCK", 21: "CLOSE_RAW_BLOCK", 27: "OPEN_BLOCK", 31: "CLOSE", 32: "OPEN_INVERSE", 37: "OPEN_INVERSE_CHAIN", 42: "INVERSE", 45: "OPEN_ENDBLOCK", 46: "OPEN", 49: "OPEN_UNESCAPED", 52: "CLOSE_UNESCAPED", 53: "OPEN_PARTIAL", 59: "OPEN_SEXPR", 62: "CLOSE_SEXPR", 66: "ID", 67: "EQUALS", 69: "OPEN_BLOCK_PARAMS", 71: "CLOSE_BLOCK_PARAMS", 74: "STRING", 75: "NUMBER", 76: "BOOLEAN", 77: "UNDEFINED", 78: "NULL", 79: "DATA", 81: "SEP" }, - productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [12, 1], [10, 3], [15, 5], [9, 4], [9, 4], [22, 6], [25, 6], [36, 6], [41, 2], [43, 3], [43, 1], [24, 3], [8, 5], [8, 5], [11, 5], [57, 1], [57, 1], [58, 5], [63, 1], [65, 3], [68, 3], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [18, 1], [54, 1], [54, 1], [73, 2], [72, 1], [80, 3], [80, 1], [6, 0], [6, 2], [19, 0], [19, 2], [20, 0], [20, 1], [23, 0], [23, 1], [26, 0], [26, 1], [28, 0], [28, 2], [29, 0], [29, 1], [30, 0], [30, 1], [33, 0], [33, 2], [34, 0], [34, 1], [35, 0], [35, 1], [38, 0], [38, 2], [39, 0], [39, 1], [40, 0], [40, 1], [44, 0], [44, 1], [47, 0], [47, 2], [48, 0], [48, 1], [50, 0], [50, 2], [51, 0], [51, 1], [55, 0], [55, 2], [56, 0], [56, 1], [60, 0], [60, 2], [61, 0], [61, 1], [64, 1], [64, 2], [70, 1], [70, 2]], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) { - - var $0 = $$.length - 1; - switch (yystate) { - case 1: - return $$[$0 - 1]; - break; - case 2: - this.$ = new yy.Program($$[$0], null, {}, yy.locInfo(this._$)); - break; - case 3: - this.$ = $$[$0]; - break; - case 4: - this.$ = $$[$0]; - break; - case 5: - this.$ = $$[$0]; - break; - case 6: - this.$ = $$[$0]; - break; - case 7: - this.$ = $$[$0]; - break; - case 8: - this.$ = new yy.CommentStatement(yy.stripComment($$[$0]), yy.stripFlags($$[$0], $$[$0]), yy.locInfo(this._$)); - break; - case 9: - this.$ = new yy.ContentStatement($$[$0], yy.locInfo(this._$)); - break; - case 10: - this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$); - break; - case 11: - this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] }; - break; - case 12: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$); - break; - case 13: - this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$); - break; - case 14: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 15: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 16: - this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) }; - break; - case 17: - this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] }; - break; - case 18: - var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$), - program = new yy.Program([inverse], null, {}, yy.locInfo(this._$)); - program.chained = true; - - this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true }; - - break; - case 19: - this.$ = $$[$0]; - break; - case 20: - this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) }; - break; - case 21: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 22: - this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$); - break; - case 23: - this.$ = new yy.PartialStatement($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.stripFlags($$[$0 - 4], $$[$0]), yy.locInfo(this._$)); - break; - case 24: - this.$ = $$[$0]; - break; - case 25: - this.$ = $$[$0]; - break; - case 26: - this.$ = new yy.SubExpression($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], yy.locInfo(this._$)); - break; - case 27: - this.$ = new yy.Hash($$[$0], yy.locInfo(this._$)); - break; - case 28: - this.$ = new yy.HashPair(yy.id($$[$0 - 2]), $$[$0], yy.locInfo(this._$)); - break; - case 29: - this.$ = yy.id($$[$0 - 1]); - break; - case 30: - this.$ = $$[$0]; - break; - case 31: - this.$ = $$[$0]; - break; - case 32: - this.$ = new yy.StringLiteral($$[$0], yy.locInfo(this._$)); - break; - case 33: - this.$ = new yy.NumberLiteral($$[$0], yy.locInfo(this._$)); - break; - case 34: - this.$ = new yy.BooleanLiteral($$[$0], yy.locInfo(this._$)); - break; - case 35: - this.$ = new yy.UndefinedLiteral(yy.locInfo(this._$)); - break; - case 36: - this.$ = new yy.NullLiteral(yy.locInfo(this._$)); - break; - case 37: - this.$ = $$[$0]; - break; - case 38: - this.$ = $$[$0]; - break; - case 39: - this.$ = yy.preparePath(true, $$[$0], this._$); - break; - case 40: - this.$ = yy.preparePath(false, $$[$0], this._$); - break; - case 41: - $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2]; - break; - case 42: - this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }]; - break; - case 43: - this.$ = []; - break; - case 44: - $$[$0 - 1].push($$[$0]); - break; - case 45: - this.$ = []; - break; - case 46: - $$[$0 - 1].push($$[$0]); - break; - case 53: - this.$ = []; - break; - case 54: - $$[$0 - 1].push($$[$0]); - break; - case 59: - this.$ = []; - break; - case 60: - $$[$0 - 1].push($$[$0]); - break; - case 65: - this.$ = []; - break; - case 66: - $$[$0 - 1].push($$[$0]); - break; - case 73: - this.$ = []; - break; - case 74: - $$[$0 - 1].push($$[$0]); - break; - case 77: - this.$ = []; - break; - case 78: - $$[$0 - 1].push($$[$0]); - break; - case 81: - this.$ = []; - break; - case 82: - $$[$0 - 1].push($$[$0]); - break; - case 85: - this.$ = []; - break; - case 86: - $$[$0 - 1].push($$[$0]); - break; - case 89: - this.$ = [$$[$0]]; - break; - case 90: - $$[$0 - 1].push($$[$0]); - break; - case 91: - this.$ = [$$[$0]]; - break; - case 92: - $$[$0 - 1].push($$[$0]); - break; - } - }, - table: [{ 3: 1, 4: 2, 5: [2, 43], 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: [1, 11], 14: [1, 18], 15: 16, 17: [1, 21], 22: 14, 25: 15, 27: [1, 19], 32: [1, 20], 37: [2, 2], 42: [2, 2], 45: [2, 2], 46: [1, 12], 49: [1, 13], 53: [1, 17] }, { 1: [2, 1] }, { 5: [2, 44], 13: [2, 44], 14: [2, 44], 17: [2, 44], 27: [2, 44], 32: [2, 44], 37: [2, 44], 42: [2, 44], 45: [2, 44], 46: [2, 44], 49: [2, 44], 53: [2, 44] }, { 5: [2, 3], 13: [2, 3], 14: [2, 3], 17: [2, 3], 27: [2, 3], 32: [2, 3], 37: [2, 3], 42: [2, 3], 45: [2, 3], 46: [2, 3], 49: [2, 3], 53: [2, 3] }, { 5: [2, 4], 13: [2, 4], 14: [2, 4], 17: [2, 4], 27: [2, 4], 32: [2, 4], 37: [2, 4], 42: [2, 4], 45: [2, 4], 46: [2, 4], 49: [2, 4], 53: [2, 4] }, { 5: [2, 5], 13: [2, 5], 14: [2, 5], 17: [2, 5], 27: [2, 5], 32: [2, 5], 37: [2, 5], 42: [2, 5], 45: [2, 5], 46: [2, 5], 49: [2, 5], 53: [2, 5] }, { 5: [2, 6], 13: [2, 6], 14: [2, 6], 17: [2, 6], 27: [2, 6], 32: [2, 6], 37: [2, 6], 42: [2, 6], 45: [2, 6], 46: [2, 6], 49: [2, 6], 53: [2, 6] }, { 5: [2, 7], 13: [2, 7], 14: [2, 7], 17: [2, 7], 27: [2, 7], 32: [2, 7], 37: [2, 7], 42: [2, 7], 45: [2, 7], 46: [2, 7], 49: [2, 7], 53: [2, 7] }, { 5: [2, 8], 13: [2, 8], 14: [2, 8], 17: [2, 8], 27: [2, 8], 32: [2, 8], 37: [2, 8], 42: [2, 8], 45: [2, 8], 46: [2, 8], 49: [2, 8], 53: [2, 8] }, { 18: 22, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 33, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 34, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 4: 35, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 12: 36, 14: [1, 18] }, { 18: 38, 54: 37, 58: 39, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 9], 13: [2, 9], 14: [2, 9], 16: [2, 9], 17: [2, 9], 27: [2, 9], 32: [2, 9], 37: [2, 9], 42: [2, 9], 45: [2, 9], 46: [2, 9], 49: [2, 9], 53: [2, 9] }, { 18: 41, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 42, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 43, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [2, 73], 47: 44, 59: [2, 73], 66: [2, 73], 74: [2, 73], 75: [2, 73], 76: [2, 73], 77: [2, 73], 78: [2, 73], 79: [2, 73] }, { 21: [2, 30], 31: [2, 30], 52: [2, 30], 59: [2, 30], 62: [2, 30], 66: [2, 30], 69: [2, 30], 74: [2, 30], 75: [2, 30], 76: [2, 30], 77: [2, 30], 78: [2, 30], 79: [2, 30] }, { 21: [2, 31], 31: [2, 31], 52: [2, 31], 59: [2, 31], 62: [2, 31], 66: [2, 31], 69: [2, 31], 74: [2, 31], 75: [2, 31], 76: [2, 31], 77: [2, 31], 78: [2, 31], 79: [2, 31] }, { 21: [2, 32], 31: [2, 32], 52: [2, 32], 59: [2, 32], 62: [2, 32], 66: [2, 32], 69: [2, 32], 74: [2, 32], 75: [2, 32], 76: [2, 32], 77: [2, 32], 78: [2, 32], 79: [2, 32] }, { 21: [2, 33], 31: [2, 33], 52: [2, 33], 59: [2, 33], 62: [2, 33], 66: [2, 33], 69: [2, 33], 74: [2, 33], 75: [2, 33], 76: [2, 33], 77: [2, 33], 78: [2, 33], 79: [2, 33] }, { 21: [2, 34], 31: [2, 34], 52: [2, 34], 59: [2, 34], 62: [2, 34], 66: [2, 34], 69: [2, 34], 74: [2, 34], 75: [2, 34], 76: [2, 34], 77: [2, 34], 78: [2, 34], 79: [2, 34] }, { 21: [2, 35], 31: [2, 35], 52: [2, 35], 59: [2, 35], 62: [2, 35], 66: [2, 35], 69: [2, 35], 74: [2, 35], 75: [2, 35], 76: [2, 35], 77: [2, 35], 78: [2, 35], 79: [2, 35] }, { 21: [2, 36], 31: [2, 36], 52: [2, 36], 59: [2, 36], 62: [2, 36], 66: [2, 36], 69: [2, 36], 74: [2, 36], 75: [2, 36], 76: [2, 36], 77: [2, 36], 78: [2, 36], 79: [2, 36] }, { 21: [2, 40], 31: [2, 40], 52: [2, 40], 59: [2, 40], 62: [2, 40], 66: [2, 40], 69: [2, 40], 74: [2, 40], 75: [2, 40], 76: [2, 40], 77: [2, 40], 78: [2, 40], 79: [2, 40], 81: [1, 45] }, { 66: [1, 32], 80: 46 }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 50: 47, 52: [2, 77], 59: [2, 77], 66: [2, 77], 74: [2, 77], 75: [2, 77], 76: [2, 77], 77: [2, 77], 78: [2, 77], 79: [2, 77] }, { 23: 48, 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 49, 45: [2, 49] }, { 26: 54, 41: 55, 42: [1, 53], 45: [2, 51] }, { 16: [1, 56] }, { 31: [2, 81], 55: 57, 59: [2, 81], 66: [2, 81], 74: [2, 81], 75: [2, 81], 76: [2, 81], 77: [2, 81], 78: [2, 81], 79: [2, 81] }, { 31: [2, 37], 59: [2, 37], 66: [2, 37], 74: [2, 37], 75: [2, 37], 76: [2, 37], 77: [2, 37], 78: [2, 37], 79: [2, 37] }, { 31: [2, 38], 59: [2, 38], 66: [2, 38], 74: [2, 38], 75: [2, 38], 76: [2, 38], 77: [2, 38], 78: [2, 38], 79: [2, 38] }, { 18: 58, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 28: 59, 31: [2, 53], 59: [2, 53], 66: [2, 53], 69: [2, 53], 74: [2, 53], 75: [2, 53], 76: [2, 53], 77: [2, 53], 78: [2, 53], 79: [2, 53] }, { 31: [2, 59], 33: 60, 59: [2, 59], 66: [2, 59], 69: [2, 59], 74: [2, 59], 75: [2, 59], 76: [2, 59], 77: [2, 59], 78: [2, 59], 79: [2, 59] }, { 19: 61, 21: [2, 45], 59: [2, 45], 66: [2, 45], 74: [2, 45], 75: [2, 45], 76: [2, 45], 77: [2, 45], 78: [2, 45], 79: [2, 45] }, { 18: 65, 31: [2, 75], 48: 62, 57: 63, 58: 66, 59: [1, 40], 63: 64, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 66: [1, 70] }, { 21: [2, 39], 31: [2, 39], 52: [2, 39], 59: [2, 39], 62: [2, 39], 66: [2, 39], 69: [2, 39], 74: [2, 39], 75: [2, 39], 76: [2, 39], 77: [2, 39], 78: [2, 39], 79: [2, 39], 81: [1, 45] }, { 18: 65, 51: 71, 52: [2, 79], 57: 72, 58: 66, 59: [1, 40], 63: 73, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 24: 74, 45: [1, 75] }, { 45: [2, 50] }, { 4: 76, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 37: [2, 43], 42: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 45: [2, 19] }, { 18: 77, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 4: 78, 6: 3, 13: [2, 43], 14: [2, 43], 17: [2, 43], 27: [2, 43], 32: [2, 43], 45: [2, 43], 46: [2, 43], 49: [2, 43], 53: [2, 43] }, { 24: 79, 45: [1, 75] }, { 45: [2, 52] }, { 5: [2, 10], 13: [2, 10], 14: [2, 10], 17: [2, 10], 27: [2, 10], 32: [2, 10], 37: [2, 10], 42: [2, 10], 45: [2, 10], 46: [2, 10], 49: [2, 10], 53: [2, 10] }, { 18: 65, 31: [2, 83], 56: 80, 57: 81, 58: 66, 59: [1, 40], 63: 82, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 59: [2, 85], 60: 83, 62: [2, 85], 66: [2, 85], 74: [2, 85], 75: [2, 85], 76: [2, 85], 77: [2, 85], 78: [2, 85], 79: [2, 85] }, { 18: 65, 29: 84, 31: [2, 55], 57: 85, 58: 66, 59: [1, 40], 63: 86, 64: 67, 65: 68, 66: [1, 69], 69: [2, 55], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 31: [2, 61], 34: 87, 57: 88, 58: 66, 59: [1, 40], 63: 89, 64: 67, 65: 68, 66: [1, 69], 69: [2, 61], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 18: 65, 20: 90, 21: [2, 47], 57: 91, 58: 66, 59: [1, 40], 63: 92, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 31: [1, 93] }, { 31: [2, 74], 59: [2, 74], 66: [2, 74], 74: [2, 74], 75: [2, 74], 76: [2, 74], 77: [2, 74], 78: [2, 74], 79: [2, 74] }, { 31: [2, 76] }, { 21: [2, 24], 31: [2, 24], 52: [2, 24], 59: [2, 24], 62: [2, 24], 66: [2, 24], 69: [2, 24], 74: [2, 24], 75: [2, 24], 76: [2, 24], 77: [2, 24], 78: [2, 24], 79: [2, 24] }, { 21: [2, 25], 31: [2, 25], 52: [2, 25], 59: [2, 25], 62: [2, 25], 66: [2, 25], 69: [2, 25], 74: [2, 25], 75: [2, 25], 76: [2, 25], 77: [2, 25], 78: [2, 25], 79: [2, 25] }, { 21: [2, 27], 31: [2, 27], 52: [2, 27], 62: [2, 27], 65: 94, 66: [1, 95], 69: [2, 27] }, { 21: [2, 89], 31: [2, 89], 52: [2, 89], 62: [2, 89], 66: [2, 89], 69: [2, 89] }, { 21: [2, 42], 31: [2, 42], 52: [2, 42], 59: [2, 42], 62: [2, 42], 66: [2, 42], 67: [1, 96], 69: [2, 42], 74: [2, 42], 75: [2, 42], 76: [2, 42], 77: [2, 42], 78: [2, 42], 79: [2, 42], 81: [2, 42] }, { 21: [2, 41], 31: [2, 41], 52: [2, 41], 59: [2, 41], 62: [2, 41], 66: [2, 41], 69: [2, 41], 74: [2, 41], 75: [2, 41], 76: [2, 41], 77: [2, 41], 78: [2, 41], 79: [2, 41], 81: [2, 41] }, { 52: [1, 97] }, { 52: [2, 78], 59: [2, 78], 66: [2, 78], 74: [2, 78], 75: [2, 78], 76: [2, 78], 77: [2, 78], 78: [2, 78], 79: [2, 78] }, { 52: [2, 80] }, { 5: [2, 12], 13: [2, 12], 14: [2, 12], 17: [2, 12], 27: [2, 12], 32: [2, 12], 37: [2, 12], 42: [2, 12], 45: [2, 12], 46: [2, 12], 49: [2, 12], 53: [2, 12] }, { 18: 98, 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 36: 50, 37: [1, 52], 41: 51, 42: [1, 53], 43: 100, 44: 99, 45: [2, 71] }, { 31: [2, 65], 38: 101, 59: [2, 65], 66: [2, 65], 69: [2, 65], 74: [2, 65], 75: [2, 65], 76: [2, 65], 77: [2, 65], 78: [2, 65], 79: [2, 65] }, { 45: [2, 17] }, { 5: [2, 13], 13: [2, 13], 14: [2, 13], 17: [2, 13], 27: [2, 13], 32: [2, 13], 37: [2, 13], 42: [2, 13], 45: [2, 13], 46: [2, 13], 49: [2, 13], 53: [2, 13] }, { 31: [1, 102] }, { 31: [2, 82], 59: [2, 82], 66: [2, 82], 74: [2, 82], 75: [2, 82], 76: [2, 82], 77: [2, 82], 78: [2, 82], 79: [2, 82] }, { 31: [2, 84] }, { 18: 65, 57: 104, 58: 66, 59: [1, 40], 61: 103, 62: [2, 87], 63: 105, 64: 67, 65: 68, 66: [1, 69], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 30: 106, 31: [2, 57], 68: 107, 69: [1, 108] }, { 31: [2, 54], 59: [2, 54], 66: [2, 54], 69: [2, 54], 74: [2, 54], 75: [2, 54], 76: [2, 54], 77: [2, 54], 78: [2, 54], 79: [2, 54] }, { 31: [2, 56], 69: [2, 56] }, { 31: [2, 63], 35: 109, 68: 110, 69: [1, 108] }, { 31: [2, 60], 59: [2, 60], 66: [2, 60], 69: [2, 60], 74: [2, 60], 75: [2, 60], 76: [2, 60], 77: [2, 60], 78: [2, 60], 79: [2, 60] }, { 31: [2, 62], 69: [2, 62] }, { 21: [1, 111] }, { 21: [2, 46], 59: [2, 46], 66: [2, 46], 74: [2, 46], 75: [2, 46], 76: [2, 46], 77: [2, 46], 78: [2, 46], 79: [2, 46] }, { 21: [2, 48] }, { 5: [2, 21], 13: [2, 21], 14: [2, 21], 17: [2, 21], 27: [2, 21], 32: [2, 21], 37: [2, 21], 42: [2, 21], 45: [2, 21], 46: [2, 21], 49: [2, 21], 53: [2, 21] }, { 21: [2, 90], 31: [2, 90], 52: [2, 90], 62: [2, 90], 66: [2, 90], 69: [2, 90] }, { 67: [1, 96] }, { 18: 65, 57: 112, 58: 66, 59: [1, 40], 66: [1, 32], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 22], 13: [2, 22], 14: [2, 22], 17: [2, 22], 27: [2, 22], 32: [2, 22], 37: [2, 22], 42: [2, 22], 45: [2, 22], 46: [2, 22], 49: [2, 22], 53: [2, 22] }, { 31: [1, 113] }, { 45: [2, 18] }, { 45: [2, 72] }, { 18: 65, 31: [2, 67], 39: 114, 57: 115, 58: 66, 59: [1, 40], 63: 116, 64: 67, 65: 68, 66: [1, 69], 69: [2, 67], 72: 23, 73: 24, 74: [1, 25], 75: [1, 26], 76: [1, 27], 77: [1, 28], 78: [1, 29], 79: [1, 31], 80: 30 }, { 5: [2, 23], 13: [2, 23], 14: [2, 23], 17: [2, 23], 27: [2, 23], 32: [2, 23], 37: [2, 23], 42: [2, 23], 45: [2, 23], 46: [2, 23], 49: [2, 23], 53: [2, 23] }, { 62: [1, 117] }, { 59: [2, 86], 62: [2, 86], 66: [2, 86], 74: [2, 86], 75: [2, 86], 76: [2, 86], 77: [2, 86], 78: [2, 86], 79: [2, 86] }, { 62: [2, 88] }, { 31: [1, 118] }, { 31: [2, 58] }, { 66: [1, 120], 70: 119 }, { 31: [1, 121] }, { 31: [2, 64] }, { 14: [2, 11] }, { 21: [2, 28], 31: [2, 28], 52: [2, 28], 62: [2, 28], 66: [2, 28], 69: [2, 28] }, { 5: [2, 20], 13: [2, 20], 14: [2, 20], 17: [2, 20], 27: [2, 20], 32: [2, 20], 37: [2, 20], 42: [2, 20], 45: [2, 20], 46: [2, 20], 49: [2, 20], 53: [2, 20] }, { 31: [2, 69], 40: 122, 68: 123, 69: [1, 108] }, { 31: [2, 66], 59: [2, 66], 66: [2, 66], 69: [2, 66], 74: [2, 66], 75: [2, 66], 76: [2, 66], 77: [2, 66], 78: [2, 66], 79: [2, 66] }, { 31: [2, 68], 69: [2, 68] }, { 21: [2, 26], 31: [2, 26], 52: [2, 26], 59: [2, 26], 62: [2, 26], 66: [2, 26], 69: [2, 26], 74: [2, 26], 75: [2, 26], 76: [2, 26], 77: [2, 26], 78: [2, 26], 79: [2, 26] }, { 13: [2, 14], 14: [2, 14], 17: [2, 14], 27: [2, 14], 32: [2, 14], 37: [2, 14], 42: [2, 14], 45: [2, 14], 46: [2, 14], 49: [2, 14], 53: [2, 14] }, { 66: [1, 125], 71: [1, 124] }, { 66: [2, 91], 71: [2, 91] }, { 13: [2, 15], 14: [2, 15], 17: [2, 15], 27: [2, 15], 32: [2, 15], 42: [2, 15], 45: [2, 15], 46: [2, 15], 49: [2, 15], 53: [2, 15] }, { 31: [1, 126] }, { 31: [2, 70] }, { 31: [2, 29] }, { 66: [2, 92], 71: [2, 92] }, { 13: [2, 16], 14: [2, 16], 17: [2, 16], 27: [2, 16], 32: [2, 16], 37: [2, 16], 42: [2, 16], 45: [2, 16], 46: [2, 16], 49: [2, 16], 53: [2, 16] }], - defaultActions: { 4: [2, 1], 49: [2, 50], 51: [2, 19], 55: [2, 52], 64: [2, 76], 73: [2, 80], 78: [2, 17], 82: [2, 84], 92: [2, 48], 99: [2, 18], 100: [2, 72], 105: [2, 88], 107: [2, 58], 110: [2, 64], 111: [2, 11], 123: [2, 70], 124: [2, 29] }, - parseError: function parseError(str, hash) { - throw new Error(str); - }, - parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], - lstack = [], - table = this.table, - yytext = "", - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - this.yy.parser = this; - if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - var ranges = this.lexer.options && this.lexer.options.ranges; - if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError; - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - function lex() { - var token; - token = self.lexer.lex() || 1; - if (typeof token !== "number") { - token = self.symbols_[token] || token; - } - return token; - } - var symbol, - preErrorSymbol, - state, - action, - a, - r, - yyval = {}, - p, - len, - newState, - expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == "undefined") { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === "undefined" || !action.length || !action[0]) { - var errStr = ""; - if (!recovering) { - expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected }); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; - if (ranges) { - yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; - } - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; - } - }; - /* Jison generated lexer */ - var lexer = (function () { - var lexer = { EOF: 1, - parseError: function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, - setInput: function setInput(input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ""; - this.conditionStack = ["INITIAL"]; - this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; - if (this.options.ranges) this.yylloc.range = [0, 0]; - this.offset = 0; - return this; - }, - input: function input() { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) this.yylloc.range[1]++; - - this._input = this._input.slice(1); - return ch; - }, - unput: function unput(ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len - 1); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); - - if (lines.length - 1) this.yylineno -= lines.length - 1; - var r = this.yylloc.range; - - this.yylloc = { first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - return this; - }, - more: function more() { - this._more = true; - return this; - }, - less: function less(n) { - this.unput(this.match.slice(n)); - }, - pastInput: function pastInput() { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? "..." : "") + past.substr(-20).replace(/\n/g, ""); - }, - upcomingInput: function upcomingInput() { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20 - next.length); - } - return (next.substr(0, 20) + (next.length > 20 ? "..." : "")).replace(/\n/g, ""); - }, - showPosition: function showPosition() { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, - next: function next() { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, match, tempMatch, index, col, lines; - if (!this._more) { - this.yytext = ""; - this.match = ""; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = { first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) this.done = false; - if (token) { - return token; - } else { - return; - } - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError("Lexical error on line " + (this.yylineno + 1) + ". Unrecognized text.\n" + this.showPosition(), { text: "", token: null, line: this.yylineno }); - } - }, - lex: function lex() { - var r = this.next(); - if (typeof r !== "undefined") { - return r; - } else { - return this.lex(); - } - }, - begin: function begin(condition) { - this.conditionStack.push(condition); - }, - popState: function popState() { - return this.conditionStack.pop(); - }, - _currentRules: function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - }, - topState: function topState() { - return this.conditionStack[this.conditionStack.length - 2]; - }, - pushState: function begin(condition) { - this.begin(condition); - } }; - lexer.options = {}; - lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { - - function strip(start, end) { - return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end); - } - - var YYSTATE = YY_START; - switch ($avoiding_name_collisions) { - case 0: - if (yy_.yytext.slice(-2) === "\\\\") { - strip(0, 1); - this.begin("mu"); - } else if (yy_.yytext.slice(-1) === "\\") { - strip(0, 1); - this.begin("emu"); - } else { - this.begin("mu"); - } - if (yy_.yytext) { - return 14; - }break; - case 1: - return 14; - break; - case 2: - this.popState(); - return 14; - - break; - case 3: - yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9); - this.popState(); - return 16; - - break; - case 4: - return 14; - break; - case 5: - this.popState(); - return 13; - - break; - case 6: - return 59; - break; - case 7: - return 62; - break; - case 8: - return 17; - break; - case 9: - this.popState(); - this.begin("raw"); - return 21; - - break; - case 10: - return 53; - break; - case 11: - return 27; - break; - case 12: - return 45; - break; - case 13: - this.popState();return 42; - break; - case 14: - this.popState();return 42; - break; - case 15: - return 32; - break; - case 16: - return 37; - break; - case 17: - return 49; - break; - case 18: - return 46; - break; - case 19: - this.unput(yy_.yytext); - this.popState(); - this.begin("com"); - - break; - case 20: - this.popState(); - return 13; - - break; - case 21: - return 46; - break; - case 22: - return 67; - break; - case 23: - return 66; - break; - case 24: - return 66; - break; - case 25: - return 81; - break; - case 26: - // ignore whitespace - break; - case 27: - this.popState();return 52; - break; - case 28: - this.popState();return 31; - break; - case 29: - yy_.yytext = strip(1, 2).replace(/\\"/g, "\"");return 74; - break; - case 30: - yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 74; - break; - case 31: - return 79; - break; - case 32: - return 76; - break; - case 33: - return 76; - break; - case 34: - return 77; - break; - case 35: - return 78; - break; - case 36: - return 75; - break; - case 37: - return 69; - break; - case 38: - return 71; - break; - case 39: - return 66; - break; - case 40: - return 66; - break; - case 41: - return "INVALID"; - break; - case 42: - return 5; - break; - } - }; - lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]*?(?=(\{\{\{\{\/)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[[^\]]*\])/, /^(?:.)/, /^(?:$)/]; - lexer.conditions = { mu: { rules: [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], inclusive: false }, emu: { rules: [2], inclusive: false }, com: { rules: [5], inclusive: false }, raw: { rules: [3, 4], inclusive: false }, INITIAL: { rules: [0, 1, 42], inclusive: true } }; - return lexer; - })(); - parser.lexer = lexer; - function Parser() { - this.yy = {}; - }Parser.prototype = parser;parser.Parser = Parser; - return new Parser(); - })();exports["default"] = handlebars; - module.exports = exports["default"]; - -/***/ }, -/* 15 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - - var _Visitor = __webpack_require__(6); - - var _Visitor2 = _interopRequireWildcard(_Visitor); - - function WhitespaceControl() {} - WhitespaceControl.prototype = new _Visitor2['default'](); - - WhitespaceControl.prototype.Program = function (program) { - var isRoot = !this.isRootSeen; - this.isRootSeen = true; - - var body = program.body; - for (var i = 0, l = body.length; i < l; i++) { - var current = body[i], - strip = this.accept(current); - - if (!strip) { - continue; - } - - var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), - _isNextWhitespace = isNextWhitespace(body, i, isRoot), - openStandalone = strip.openStandalone && _isPrevWhitespace, - closeStandalone = strip.closeStandalone && _isNextWhitespace, - inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; - - if (strip.close) { - omitRight(body, i, true); - } - if (strip.open) { - omitLeft(body, i, true); - } - - if (inlineStandalone) { - omitRight(body, i); - - if (omitLeft(body, i)) { - // If we are on a standalone node, save the indent info for partials - if (current.type === 'PartialStatement') { - // Pull out the whitespace from the final line - current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1]; - } - } - } - if (openStandalone) { - omitRight((current.program || current.inverse).body); - - // Strip out the previous content node if it's whitespace only - omitLeft(body, i); - } - if (closeStandalone) { - // Always strip the next node - omitRight(body, i); - - omitLeft((current.inverse || current.program).body); - } - } - - return program; - }; - WhitespaceControl.prototype.BlockStatement = function (block) { - this.accept(block.program); - this.accept(block.inverse); - - // Find the inverse program that is involed with whitespace stripping. - var program = block.program || block.inverse, - inverse = block.program && block.inverse, - firstInverse = inverse, - lastInverse = inverse; - - if (inverse && inverse.chained) { - firstInverse = inverse.body[0].program; - - // Walk the inverse chain to find the last inverse that is actually in the chain. - while (lastInverse.chained) { - lastInverse = lastInverse.body[lastInverse.body.length - 1].program; - } - } - - var strip = { - open: block.openStrip.open, - close: block.closeStrip.close, - - // Determine the standalone candiacy. Basically flag our content as being possibly standalone - // so our parent can determine if we actually are standalone - openStandalone: isNextWhitespace(program.body), - closeStandalone: isPrevWhitespace((firstInverse || program).body) - }; - - if (block.openStrip.close) { - omitRight(program.body, null, true); - } - - if (inverse) { - var inverseStrip = block.inverseStrip; - - if (inverseStrip.open) { - omitLeft(program.body, null, true); - } - - if (inverseStrip.close) { - omitRight(firstInverse.body, null, true); - } - if (block.closeStrip.open) { - omitLeft(lastInverse.body, null, true); - } - - // Find standalone else statments - if (isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) { - omitLeft(program.body); - omitRight(firstInverse.body); - } - } else if (block.closeStrip.open) { - omitLeft(program.body, null, true); - } - - return strip; - }; - - WhitespaceControl.prototype.MustacheStatement = function (mustache) { - return mustache.strip; - }; - - WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) { - /* istanbul ignore next */ - var strip = node.strip || {}; - return { - inlineStandalone: true, - open: strip.open, - close: strip.close - }; - }; - - function isPrevWhitespace(body, i, isRoot) { - if (i === undefined) { - i = body.length; - } - - // Nodes that end with newlines are considered whitespace (but are special - // cased for strip operations) - var prev = body[i - 1], - sibling = body[i - 2]; - if (!prev) { - return isRoot; - } - - if (prev.type === 'ContentStatement') { - return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original); - } - } - function isNextWhitespace(body, i, isRoot) { - if (i === undefined) { - i = -1; - } - - var next = body[i + 1], - sibling = body[i + 2]; - if (!next) { - return isRoot; - } - - if (next.type === 'ContentStatement') { - return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original); - } - } - - // Marks the node to the right of the position as omitted. - // I.e. {{foo}}' ' will mark the ' ' node as omitted. - // - // If i is undefined, then the first child will be marked as such. - // - // If mulitple is truthy then all whitespace will be stripped out until non-whitespace - // content is met. - function omitRight(body, i, multiple) { - var current = body[i == null ? 0 : i + 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) { - return; - } - - var original = current.value; - current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, ''); - current.rightStripped = current.value !== original; - } - - // Marks the node to the left of the position as omitted. - // I.e. ' '{{foo}} will mark the ' ' node as omitted. - // - // If i is undefined then the last child will be marked as such. - // - // If mulitple is truthy then all whitespace will be stripped out until non-whitespace - // content is met. - function omitLeft(body, i, multiple) { - var current = body[i == null ? body.length - 1 : i - 1]; - if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) { - return; - } - - // We omit the last node if it's whitespace only and not preceeded by a non-content node. - var original = current.value; - current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, ''); - current.leftStripped = current.value !== original; - return current.leftStripped; - } - - exports['default'] = WhitespaceControl; - module.exports = exports['default']; - -/***/ }, -/* 16 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(8)['default']; - - exports.__esModule = true; - exports.SourceLocation = SourceLocation; - exports.id = id; - exports.stripFlags = stripFlags; - exports.stripComment = stripComment; - exports.preparePath = preparePath; - exports.prepareMustache = prepareMustache; - exports.prepareRawBlock = prepareRawBlock; - exports.prepareBlock = prepareBlock; - - var _Exception = __webpack_require__(11); - - var _Exception2 = _interopRequireWildcard(_Exception); - - function SourceLocation(source, locInfo) { - this.source = source; - this.start = { - line: locInfo.first_line, - column: locInfo.first_column - }; - this.end = { - line: locInfo.last_line, - column: locInfo.last_column - }; - } - - function id(token) { - if (/^\[.*\]$/.test(token)) { - return token.substr(1, token.length - 2); - } else { - return token; - } - } - - function stripFlags(open, close) { - return { - open: open.charAt(2) === '~', - close: close.charAt(close.length - 3) === '~' - }; - } - - function stripComment(comment) { - return comment.replace(/^\{\{~?\!-?-?/, '').replace(/-?-?~?\}\}$/, ''); - } - - function preparePath(data, parts, locInfo) { - locInfo = this.locInfo(locInfo); - - var original = data ? '@' : '', - dig = [], - depth = 0, - depthString = ''; - - for (var i = 0, l = parts.length; i < l; i++) { - var part = parts[i].part, - - // If we have [] syntax then we do not treat path references as operators, - // i.e. foo.[this] resolves to approximately context.foo['this'] - isLiteral = parts[i].original !== part; - original += (parts[i].separator || '') + part; - - if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { - if (dig.length > 0) { - throw new _Exception2['default']('Invalid path: ' + original, { loc: locInfo }); - } else if (part === '..') { - depth++; - depthString += '../'; - } - } else { - dig.push(part); - } - } - - return new this.PathExpression(data, depth, dig, original, locInfo); - } - - function prepareMustache(path, params, hash, open, strip, locInfo) { - // Must use charAt to support IE pre-10 - var escapeFlag = open.charAt(3) || open.charAt(2), - escaped = escapeFlag !== '{' && escapeFlag !== '&'; - - return new this.MustacheStatement(path, params, hash, escaped, strip, this.locInfo(locInfo)); - } - - function prepareRawBlock(openRawBlock, content, close, locInfo) { - if (openRawBlock.path.original !== close) { - var errorNode = { loc: openRawBlock.path.loc }; - - throw new _Exception2['default'](openRawBlock.path.original + ' doesn\'t match ' + close, errorNode); - } - - locInfo = this.locInfo(locInfo); - var program = new this.Program([content], null, {}, locInfo); - - return new this.BlockStatement(openRawBlock.path, openRawBlock.params, openRawBlock.hash, program, undefined, {}, {}, {}, locInfo); - } - - function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { - // When we are chaining inverse calls, we will not have a close path - if (close && close.path && openBlock.path.original !== close.path.original) { - var errorNode = { loc: openBlock.path.loc }; - - throw new _Exception2['default'](openBlock.path.original + ' doesn\'t match ' + close.path.original, errorNode); - } - - program.blockParams = openBlock.blockParams; - - var inverse = undefined, - inverseStrip = undefined; - - if (inverseAndProgram) { - if (inverseAndProgram.chain) { - inverseAndProgram.program.body[0].closeStrip = close.strip; - } - - inverseStrip = inverseAndProgram.strip; - inverse = inverseAndProgram.program; - } - - if (inverted) { - inverted = inverse; - inverse = program; - program = inverted; - } - - return new this.BlockStatement(openBlock.path, openBlock.params, openBlock.hash, program, inverse, openBlock.strip, inverseStrip, close && close.strip, this.locInfo(locInfo)); - } - -/***/ }, -/* 17 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - /*global define */ - - var _isArray = __webpack_require__(12); - - var SourceNode = undefined; - - try { - /* istanbul ignore next */ - if (false) { - // We don't support this in AMD environments. For these environments, we asusme that - // they are running on the browser and thus have no need for the source-map library. - var SourceMap = require('source-map'); - SourceNode = SourceMap.SourceNode; - } - } catch (err) {} - - /* istanbul ignore if: tested but not covered in istanbul due to dist build */ - if (!SourceNode) { - SourceNode = function (line, column, srcFile, chunks) { - this.src = ''; - if (chunks) { - this.add(chunks); - } - }; - /* istanbul ignore next */ - SourceNode.prototype = { - add: function add(chunks) { - if (_isArray.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src += chunks; - }, - prepend: function prepend(chunks) { - if (_isArray.isArray(chunks)) { - chunks = chunks.join(''); - } - this.src = chunks + this.src; - }, - toStringWithSourceMap: function toStringWithSourceMap() { - return { code: this.toString() }; - }, - toString: function toString() { - return this.src; - } - }; - } - - function castChunk(chunk, codeGen, loc) { - if (_isArray.isArray(chunk)) { - var ret = []; - - for (var i = 0, len = chunk.length; i < len; i++) { - ret.push(codeGen.wrap(chunk[i], loc)); - } - return ret; - } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { - // Handle primitives that the SourceNode will throw up on - return chunk + ''; - } - return chunk; - } - - function CodeGen(srcFile) { - this.srcFile = srcFile; - this.source = []; - } - - CodeGen.prototype = { - prepend: function prepend(source, loc) { - this.source.unshift(this.wrap(source, loc)); - }, - push: function push(source, loc) { - this.source.push(this.wrap(source, loc)); - }, - - merge: function merge() { - var source = this.empty(); - this.each(function (line) { - source.add([' ', line, '\n']); - }); - return source; - }, - - each: function each(iter) { - for (var i = 0, len = this.source.length; i < len; i++) { - iter(this.source[i]); - } - }, - - empty: function empty() { - var loc = arguments[0] === undefined ? this.currentLocation || { start: {} } : arguments[0]; - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile); - }, - wrap: function wrap(chunk) { - var loc = arguments[1] === undefined ? this.currentLocation || { start: {} } : arguments[1]; - - if (chunk instanceof SourceNode) { - return chunk; - } - - chunk = castChunk(chunk, this, loc); - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); - }, - - functionCall: function functionCall(fn, type, params) { - params = this.generateList(params); - return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); - }, - - quotedString: function quotedString(str) { - return '"' + (str + '').replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 - .replace(/\u2029/g, '\\u2029') + '"'; - }, - - objectLiteral: function objectLiteral(obj) { - var pairs = []; - - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - var value = castChunk(obj[key], this); - if (value !== 'undefined') { - pairs.push([this.quotedString(key), ':', value]); - } - } - } - - var ret = this.generateList(pairs); - ret.prepend('{'); - ret.add('}'); - return ret; - }, - - generateList: function generateList(entries, loc) { - var ret = this.empty(loc); - - for (var i = 0, len = entries.length; i < len; i++) { - if (i) { - ret.add(','); - } - - ret.add(castChunk(entries[i], this, loc)); - } - - return ret; - }, - - generateArray: function generateArray(entries, loc) { - var ret = this.generateList(entries, loc); - ret.prepend('['); - ret.add(']'); - - return ret; - } - }; - - exports['default'] = CodeGen; - module.exports = exports['default']; - - /* NOP */ - -/***/ } -/******/ ]) -}); -; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.min.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.min.js deleted file mode 100644 index 150df8a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.min.js +++ /dev/null @@ -1,29 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=r();return a.compile=function(b,c){return k.compile(b,c,a)},a.precompile=function(b,c){return k.precompile(b,c,a)},a.AST=i["default"],a.Compiler=k.Compiler,a.JavaScriptCompiler=m["default"],a.Parser=j.parser,a.parse=j.parse,a}var e=c(8)["default"];b.__esModule=!0;var f=c(1),g=e(f),h=c(2),i=e(h),j=c(3),k=c(4),l=c(5),m=e(l),n=c(6),o=e(n),p=c(7),q=e(p),r=g["default"].create,s=d();s.create=d,q["default"](s),s.Visitor=o["default"],s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b,c){"use strict";function d(){var a=new g.HandlebarsEnvironment;return m.extend(a,g),a.SafeString=i["default"],a.Exception=k["default"],a.Utils=m,a.escapeExpression=m.escapeExpression,a.VM=o,a.template=function(b){return o.template(b,a)},a}var e=c(8)["default"];b.__esModule=!0;var f=c(9),g=e(f),h=c(10),i=e(h),j=c(11),k=e(j),l=c(12),m=e(l),n=c(13),o=e(n),p=c(7),q=e(p),r=d();r.create=d,q["default"](r),r["default"]=r,b["default"]=r,a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0;var c={Program:function(a,b,c,d){this.loc=d,this.type="Program",this.body=a,this.blockParams=b,this.strip=c},MustacheStatement:function(a,b,c,d,e,f){this.loc=f,this.type="MustacheStatement",this.path=a,this.params=b||[],this.hash=c,this.escaped=d,this.strip=e},BlockStatement:function(a,b,c,d,e,f,g,h,i){this.loc=i,this.type="BlockStatement",this.path=a,this.params=b||[],this.hash=c,this.program=d,this.inverse=e,this.openStrip=f,this.inverseStrip=g,this.closeStrip=h},PartialStatement:function(a,b,c,d,e){this.loc=e,this.type="PartialStatement",this.name=a,this.params=b||[],this.hash=c,this.indent="",this.strip=d},ContentStatement:function(a,b){this.loc=b,this.type="ContentStatement",this.original=this.value=a},CommentStatement:function(a,b,c){this.loc=c,this.type="CommentStatement",this.value=a,this.strip=b},SubExpression:function(a,b,c,d){this.loc=d,this.type="SubExpression",this.path=a,this.params=b||[],this.hash=c},PathExpression:function(a,b,c,d,e){this.loc=e,this.type="PathExpression",this.data=a,this.original=d,this.parts=c,this.depth=b},StringLiteral:function(a,b){this.loc=b,this.type="StringLiteral",this.original=this.value=a},NumberLiteral:function(a,b){this.loc=b,this.type="NumberLiteral",this.original=this.value=Number(a)},BooleanLiteral:function(a,b){this.loc=b,this.type="BooleanLiteral",this.original=this.value="true"===a},UndefinedLiteral:function(a){this.loc=a,this.type="UndefinedLiteral",this.original=this.value=void 0},NullLiteral:function(a){this.loc=a,this.type="NullLiteral",this.original=this.value=null},Hash:function(a,b){this.loc=b,this.type="Hash",this.pairs=a},HashPair:function(a,b,c){this.loc=c,this.type="HashPair",this.key=a,this.value=b},helpers:{helperExpression:function(a){return!("SubExpression"!==a.type&&!a.params.length&&!a.hash)},scopedId:function(a){return/^\.|this\b/.test(a.original)},simpleId:function(a){return 1===a.parts.length&&!c.helpers.scopedId(a)&&!a.depth}}};b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if("Program"===a.type)return a;g["default"].yy=o,o.locInfo=function(a){return new o.SourceLocation(b&&b.srcName,a)};var c=new k["default"];return c.accept(g["default"].parse(a))}var e=c(8)["default"];b.__esModule=!0,b.parse=d;var f=c(14),g=e(f),h=c(2),i=e(h),j=c(15),k=e(j),l=c(16),m=e(l),n=c(12);b.parser=g["default"];var o={};n.extend(o,m,i["default"])},function(a,b,c){"use strict";function d(){}function e(a,b,c){if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a,b),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function f(a,b,c){function d(){var b=c.parse(a,f),d=(new c.Compiler).compile(b,f),e=(new c.JavaScriptCompiler).compile(d,f,void 0,!0);return c.template(e)}function e(a,b){return g||(g=d()),g.call(this,a,b)}var f=void 0===arguments[1]?{}:arguments[1];if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);"data"in f||(f.data=!0),f.compat&&(f.useDepths=!0);var g=void 0;return e._setup=function(a){return g||(g=d()),g._setup(a)},e._child=function(a,b,c,e){return g||(g=d()),g._child(a,b,c,e)},e}function g(a,b){if(a===b)return!0;if(l.isArray(a)&&l.isArray(b)&&a.length===b.length){for(var c=0;cc;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||!g(d.args,e.args))return!1}b=this.children.length;for(var c=0;b>c;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[];var c=b.knownHelpers;if(b.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)d in c&&(b.knownHelpers[d]=c[d]);return this.accept(a)},compileProgram:function(a){var b=new this.compiler,c=b.compile(a,this.options),d=this.guid++;return this.usePartial=this.usePartial||c.usePartial,this.children[d]=c,this.useDepths=this.useDepths||c.useDepths,d},accept:function(a){this.sourceNode.unshift(a);var b=this[a.type](a);return this.sourceNode.shift(),b},Program:function(a){this.options.blockParams.unshift(a.blockParams);for(var b=a.body,c=b.length,d=0;c>d;d++)this.accept(b[d]);return this.options.blockParams.shift(),this.isSimple=1===c,this.blockParams=a.blockParams?a.blockParams.length:0,this},BlockStatement:function(a){h(a);var b=a.program,c=a.inverse;b=b&&this.compileProgram(b),c=c&&this.compileProgram(c);var d=this.classifySexpr(a);"helper"===d?this.helperSexpr(a,b,c):"simple"===d?(this.simpleSexpr(a),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("blockValue",a.path.original)):(this.ambiguousSexpr(a,b,c),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},PartialStatement:function(a){this.usePartial=!0;var b=a.params;if(b.length>1)throw new k["default"]("Unsupported number of partial arguments: "+b.length,a);b.length||b.push({type:"PathExpression",parts:[],depth:0});var c=a.name.original,d="SubExpression"===a.name.type;d&&this.accept(a.name),this.setupFullMustacheParams(a,void 0,void 0,!0);var e=a.indent||"";this.options.preventIndent&&e&&(this.opcode("appendContent",e),e=""),this.opcode("invokePartial",d,c,e),this.opcode("append")},MustacheStatement:function(a){this.SubExpression(a),this.opcode(a.escaped&&!this.options.noEscape?"appendEscaped":"append")},ContentStatement:function(a){a.value&&this.opcode("appendContent",a.value)},CommentStatement:function(){},SubExpression:function(a){h(a);var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ambiguousSexpr:function(a,b,c){var d=a.path,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.accept(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){this.accept(a.path),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.path,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new k["default"]("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.falsy=!0,this.accept(e),this.opcode("invokeHelper",d.length,e.original,n["default"].helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=n["default"].helpers.scopedId(a),d=!a.depth&&!c&&this.blockParamIndex(b);d?this.opcode("lookupBlockParam",d,a.parts):b?a.data?(this.options.data=!0,this.opcode("lookupData",a.depth,a.parts)):this.opcode("lookupOnContext",a.parts,a.falsy,c):this.opcode("pushContext")},StringLiteral:function(a){this.opcode("pushString",a.value)},NumberLiteral:function(a){this.opcode("pushLiteral",a.value)},BooleanLiteral:function(a){this.opcode("pushLiteral",a.value)},UndefinedLiteral:function(){this.opcode("pushLiteral","undefined")},NullLiteral:function(){this.opcode("pushLiteral","null")},Hash:function(a){var b=a.pairs,c=0,d=b.length;for(this.opcode("pushHash");d>c;c++)this.pushParam(b[c].value);for(;c--;)this.opcode("assignToHash",b[c].key);this.opcode("popHash")},opcode:function(a){this.opcodes.push({opcode:a,args:o.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=n["default"].helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&n["default"].helpers.helperExpression(a),e=!c&&(d||b);if(e&&!d){var f=a.path.parts[0],g=this.options;g.knownHelpers[f]?d=!0:g.knownHelpersOnly&&(e=!1)}return d?"helper":e?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;c>b;b++)this.pushParam(a[b])},pushParam:function(a){var b=null!=a.value?a.value:a.original||"";if(this.stringParams)b.replace&&(b=b.replace(/^(\.?\.\/)*/g,"").replace(/\//g,".")),a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",b,a.type),"SubExpression"===a.type&&this.accept(a);else{if(this.trackIds){var c=void 0;if(!a.parts||n["default"].helpers.scopedId(a)||a.depth||(c=this.blockParamIndex(a.parts[0])),c){var d=a.parts.slice(1).join(".");this.opcode("pushId","BlockParam",c,d)}else b=a.original||b,b.replace&&(b=b.replace(/^\.\//g,"").replace(/^\.$/g,"")),this.opcode("pushId",a.type,b)}this.accept(a)}},setupFullMustacheParams:function(a,b,c,d){var e=a.params;return this.pushParams(e),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.accept(a.hash):this.opcode("emptyHash",d),e},blockParamIndex:function(a){for(var b=0,c=this.options.blockParams.length;c>b;b++){var d=this.options.blockParams[b],e=d&&l.indexOf(d,a);if(d&&e>=0)return[b,e]}}}},function(a,b,c){"use strict";function d(a){this.value=a}function e(){}function f(a,b,c,d){var e=b.popStack(),f=0,g=c.length;for(a&&g--;g>f;f++)e=b.nameLookup(e,c[f],d);return a?[b.aliasable("this.strict"),"(",e,", ",b.quotedString(c[f]),")"]:e}var g=c(8)["default"];b.__esModule=!0;var h=c(9),i=c(11),j=g(i),k=c(12),l=c(17),m=g(l);e.prototype={nameLookup:function(a,b){return e.isValidJavaScriptVariableName(b)?[a,".",b]:[a,"['",b,"']"]},depthedLookup:function(a){return[this.aliasable("this.lookup"),'(depths, "',a,'")']},compilerInfo:function(){var a=h.COMPILER_REVISION,b=h.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return k.isArray(a)||(a=[a]),a=this.source.wrap(a,b),this.environment.isSimple?["return ",a,";"]:c?["buffer += ",a,";"]:(a.appendToBuffer=!0,a)},initializeBuffer:function(){return this.quotedString("")},compile:function(a,b,c,d){this.environment=a,this.options=b,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,this.name=this.environment.name,this.isChild=!!c,this.context=c||{programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(a,b),this.useDepths=this.useDepths||a.useDepths||this.options.compat,this.useBlockParams=this.useBlockParams||a.useBlockParams;var e=a.opcodes,f=void 0,g=void 0,h=void 0,i=void 0;for(h=0,i=e.length;i>h;h++)f=e[h],this.source.currentLocation=f.loc,g=g||f.loc,this[f.opcode].apply(this,f.args);if(this.source.currentLocation=g,this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new j["default"]("Compile completed with content left on stack");var k=this.createFunctionContext(d);if(this.isChild)return k;var l={compiler:this.compilerInfo(),main:k},m=this.context.programs;for(h=0,i=m.length;i>h;h++)m[h]&&(l[h]=m[h]);return this.environment.usePartial&&(l.usePartial=!0),this.options.data&&(l.useData=!0),this.useDepths&&(l.useDepths=!0),this.useBlockParams&&(l.useBlockParams=!0),this.options.compat&&(l.compat=!0),d?l.compilerOptions=this.options:(l.compiler=JSON.stringify(l.compiler),this.source.currentLocation={start:{line:1,column:0}},l=this.objectLiteral(l),b.srcName?(l=l.toStringWithSourceMap({file:b.destName}),l.map=l.map&&l.map.toString()):l=l.toString()),l},preamble:function(){this.lastContext=0,this.source=new m["default"](this.options.srcName)},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));var d=0;for(var e in this.aliases){var f=this.aliases[e];this.aliases.hasOwnProperty(e)&&f.children&&f.referenceCount>1&&(b+=", alias"+ ++d+"="+e,f.children[0]="alias"+d)}var g=["depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&g.push("blockParams"),this.useDepths&&g.push("depths");var h=this.mergeSource(b);return a?(g.push(h),Function.apply(this,g)):this.source.wrap(["function(",g.join(","),") {\n ",h,"}"])},mergeSource:function(a){var b=this.environment.isSimple,c=!this.forceBuffer,d=void 0,e=void 0,f=void 0,g=void 0;return this.source.each(function(a){a.appendToBuffer?(f?a.prepend(" + "):f=a,g=a):(f&&(e?f.prepend("buffer += "):d=!0,g.add(";"),f=g=void 0),e=!0,b||(c=!1))}),c?f?(f.prepend("return "),g.add(";")):e||this.source.push('return "";'):(a+=", buffer = "+(d?"":this.initializeBuffer()),f?(f.prepend("return buffer + "),g.add(";")):this.source.push("return buffer;")),a&&this.source.prepend("var "+a.substring(2)+(d?"":";\n")),this.source.merge()},blockValue:function(a){var b=this.aliasable("helpers.blockHelperMissing"),c=[this.contextName(0)];this.setupHelperArgs(a,0,c);var d=this.popStack();c.splice(1,0,d),this.push(this.source.functionCall(b,"call",c))},ambiguousBlockValue:function(){var a=this.aliasable("helpers.blockHelperMissing"),b=[this.contextName(0)];this.setupHelperArgs("",0,b,!0),this.flushInline();var c=this.topStack();b.splice(1,0,c),this.pushSource(["if (!",this.lastHelper,") { ",c," = ",this.source.functionCall(a,"call",b),"}"])},appendContent:function(a){this.pendingContent?a=this.pendingContent+a:this.pendingLocation=this.source.currentLocation,this.pendingContent=a},append:function(){if(this.isInline())this.replaceStack(function(a){return[" != null ? ",a,' : ""']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var a=this.popStack();this.pushSource(["if (",a," != null) { ",this.appendToBuffer(a,void 0,!0)," }"]),this.environment.isSimple&&this.pushSource(["else { ",this.appendToBuffer("''",void 0,!0)," }"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable("this.escapeExpression"),"(",this.popStack(),")"]))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c){var d=0;c||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[d++])),this.resolvePath("context",a,d,b)},lookupBlockParam:function(a,b){this.useBlockParams=!0,this.push(["blockParams[",a[0],"][",a[1],"]"]),this.resolvePath("context",b,1)},lookupData:function(a,b){this.pushStackLiteral(a?"this.data(data, "+a+")":"data"),this.resolvePath("data",b,0,!0)},resolvePath:function(a,b,c,d){var e=this;if(this.options.strict||this.options.assumeObjects)return void this.push(f(this.options.strict,this,b,a));for(var g=b.length;g>c;c++)this.replaceStack(function(f){var g=e.nameLookup(f,b[c],a);return d?[" && ",g]:[" != null ? ",g," : ",f]})},resolvePossibleLambda:function(){this.push([this.aliasable("this.lambda"),"(",this.popStack(),", ",this.contextName(0),")"])},pushStringParam:function(a,b){this.pushContext(),this.pushString(b),"SubExpression"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(a){this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}")),this.pushStackLiteral(a?"undefined":"{}")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(a.ids)),this.stringParams&&(this.push(this.objectLiteral(a.contexts)),this.push(this.objectLiteral(a.types))),this.push(this.objectLiteral(a.values))},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){this.pushStackLiteral(null!=a?this.programExpression(a):null)},invokeHelper:function(a,b,c){var d=this.popStack(),e=this.setupHelper(a,b),f=c?[e.name," || "]:"",g=["("].concat(f,d);this.options.strict||g.push(" || ",this.aliasable("helpers.helperMissing")),g.push(")"),this.push(this.source.functionCall(g,"call",e.callParams))},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(this.source.functionCall(c.name,"call",c.callParams))},invokeAmbiguous:function(a,b){this.useRegister("helper");var c=this.popStack();this.emptyHash();var d=this.setupHelper(0,a,b),e=this.lastHelper=this.nameLookup("helpers",a,"helper"),f=["(","(helper = ",e," || ",c,")"];this.options.strict||(f[0]="(helper = ",f.push(" != null ? helper : ",this.aliasable("helpers.helperMissing"))),this.push(["(",f,d.paramsInit?["),(",d.paramsInit]:[],"),","(typeof helper === ",this.aliasable('"function"')," ? ",this.source.functionCall("helper","call",d.callParams)," : helper))"])},invokePartial:function(a,b,c){var d=[],e=this.setupParams(b,1,d,!1);a&&(b=this.popStack(),delete e.name),c&&(e.indent=JSON.stringify(c)),e.helpers="helpers",e.partials="partials",d.unshift(a?b:this.nameLookup("partials",b,"partial")),this.options.compat&&(e.depths="depths"),e=this.objectLiteral(e),d.push(e),this.push(this.source.functionCall("this.invokePartial","",d))},assignToHash:function(a){var b=this.popStack(),c=void 0,d=void 0,e=void 0;this.trackIds&&(e=this.popStack()),this.stringParams&&(d=this.popStack(),c=this.popStack());var f=this.hash;c&&(f.contexts[a]=c),d&&(f.types[a]=d),e&&(f.ids[a]=e),f.values[a]=b},pushId:function(a,b,c){"BlockParam"===a?this.pushStackLiteral("blockParams["+b[0]+"].path["+b[1]+"]"+(c?" + "+JSON.stringify("."+c):"")):"PathExpression"===a?this.pushString(b):this.pushStackLiteral("SubExpression"===a?"true":"null")},compiler:e,compileChildren:function(a,b){for(var c=a.children,d=void 0,e=void 0,f=0,g=c.length;g>f;f++){d=c[f],e=new this.compiler;var h=this.matchExistingProgram(d);null==h?(this.context.programs.push(""),h=this.context.programs.length,d.index=h,d.name="program"+h,this.context.programs[h]=e.compile(d,b,this.context,!this.precompile),this.context.environments[h]=d,this.useDepths=this.useDepths||e.useDepths,this.useBlockParams=this.useBlockParams||e.useBlockParams):(d.index=h,d.name="program"+h,this.useDepths=this.useDepths||d.useDepths,this.useBlockParams=this.useBlockParams||d.useBlockParams)}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;c>b;b++){var d=this.context.environments[b];if(d&&d.equals(a))return b}},programExpression:function(a){var b=this.environment.children[a],c=[b.index,"data",b.blockParams];return(this.useBlockParams||this.useDepths)&&c.push("blockParams"),this.useDepths&&c.push("depths"),"this.program("+c.join(", ")+")"},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},push:function(a){return a instanceof d||(a=this.source.wrap(a)),this.inlineStack.push(a),a},pushStackLiteral:function(a){this.push(new d(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),a&&this.source.push(a)},replaceStack:function(a){var b=["("],c=void 0,e=void 0,f=void 0;if(!this.isInline())throw new j["default"]("replaceStack on non-inline");var g=this.popStack(!0);if(g instanceof d)c=[g.value],b=["(",c],f=!0;else{e=!0;var h=this.incrStack();b=["((",this.push(h)," = ",g,")"],c=this.topStack()}var i=a.call(this,c);f||this.popStack(),e&&this.stackSlot--,this.push(b.concat(i,")"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;this.inlineStack=[];for(var b=0,c=a.length;c>b;b++){var e=a[b];if(e instanceof d)this.compileStack.push(e);else{var f=this.incrStack();this.pushSource([f," = ",e,";"]),this.compileStack.push(f)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),c=(b?this.inlineStack:this.compileStack).pop();if(!a&&c instanceof d)return c.value;if(!b){if(!this.stackSlot)throw new j["default"]("Invalid stack pop");this.stackSlot--}return c},topStack:function(){var a=this.isInline()?this.inlineStack:this.compileStack,b=a[a.length-1];return b instanceof d?b.value:b},contextName:function(a){return this.useDepths&&a?"depths["+a+"]":"depth"+a},quotedString:function(a){return this.source.quotedString(a)},objectLiteral:function(a){return this.source.objectLiteral(a)},aliasable:function(a){var b=this.aliases[a];return b?(b.referenceCount++,b):(b=this.aliases[a]=this.source.wrap(a),b.aliasable=!0,b.referenceCount=1,b)},setupHelper:function(a,b,c){var d=[],e=this.setupHelperArgs(b,a,d,c),f=this.nameLookup("helpers",b,"helper");return{params:d,paramsInit:e,name:f,callParams:[this.contextName(0)].concat(d)}},setupParams:function(a,b,c){var d={},e=[],f=[],g=[],h=void 0;d.name=this.quotedString(a),d.hash=this.popStack(),this.trackIds&&(d.hashIds=this.popStack()),this.stringParams&&(d.hashTypes=this.popStack(),d.hashContexts=this.popStack());var i=this.popStack(),j=this.popStack();(j||i)&&(d.fn=j||"this.noop",d.inverse=i||"this.noop");for(var k=b;k--;)h=this.popStack(),c[k]=h,this.trackIds&&(g[k]=this.popStack()),this.stringParams&&(f[k]=this.popStack(),e[k]=this.popStack());return this.trackIds&&(d.ids=this.source.generateArray(g)),this.stringParams&&(d.types=this.source.generateArray(f),d.contexts=this.source.generateArray(e)),this.options.data&&(d.data="data"),this.useBlockParams&&(d.blockParams="blockParams"),d},setupHelperArgs:function(a,b,c,d){var e=this.setupParams(a,b,c,!0);return e=this.objectLiteral(e),d?(this.useRegister("options"),c.push("options"),["options=",e]):(c.push(e),"")}},function(){for(var a="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false".split(" "),b=e.RESERVED_WORDS={},c=0,d=a.length;d>c;c++)b[a[c]]=!0}(),e.isValidJavaScriptVariableName=function(a){return!e.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},b["default"]=e,a.exports=b["default"]},function(a,b,c){"use strict";function d(){this.parents=[]}var e=c(8)["default"];b.__esModule=!0;var f=c(11),g=e(f),h=c(2),i=e(h);d.prototype={constructor:d,mutating:!1,acceptKey:function(a,b){var c=this.accept(a[b]);if(this.mutating){if(c&&(!c.type||!i["default"][c.type]))throw new g["default"]('Unexpected node type "'+c.type+'" found when accepting '+b+" on "+a.type);a[b]=c}},acceptRequired:function(a,b){if(this.acceptKey(a,b),!a[b])throw new g["default"](a.type+" requires "+b)},acceptArray:function(a){for(var b=0,c=a.length;c>b;b++)this.acceptKey(a,b),a[b]||(a.splice(b,1),b--,c--)},accept:function(a){if(a){this.current&&this.parents.unshift(this.current),this.current=a;var b=this[a.type](a);return this.current=this.parents.shift(),!this.mutating||b?b:b!==!1?a:void 0}},Program:function(a){this.acceptArray(a.body)},MustacheStatement:function(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")},BlockStatement:function(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash"),this.acceptKey(a,"program"),this.acceptKey(a,"inverse")},PartialStatement:function(a){this.acceptRequired(a,"name"),this.acceptArray(a.params),this.acceptKey(a,"hash")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:function(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")},PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(a){this.acceptArray(a.pairs)},HashPair:function(a){this.acceptRequired(a,"value")}},b["default"]=d,a.exports=b["default"]},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){b.Handlebars===a&&(b.Handlebars=d)}},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0},function(a,b,c){"use strict";function d(a,b){this.helpers=a||{},this.partials=b||{},e(this)}function e(a){a.registerHelper("helperMissing",function(){if(1===arguments.length)return void 0;throw new k["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')}),a.registerHelper("blockHelperMissing",function(b,c){var d=c.inverse,e=c.fn;if(b===!0)return e(this);if(b===!1||null==b)return d(this);if(o(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):d(this);if(c.data&&c.ids){var g=f(c.data);g.contextPath=i.appendContextPath(c.data.contextPath,c.name),c={data:g}}return e(b,c)}),a.registerHelper("each",function(a,b){function c(b,c,e){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!e,l&&(j.contextPath=l+b)),h+=d(a[b],{data:j,blockParams:i.blockParams([a[b],b],[l+b,null])})}if(!b)throw new k["default"]("Must pass iterator to #each");var d=b.fn,e=b.inverse,g=0,h="",j=void 0,l=void 0;if(b.data&&b.ids&&(l=i.appendContextPath(b.data.contextPath,b.ids[0])+"."),p(a)&&(a=a.call(this)),b.data&&(j=f(b.data)),a&&"object"==typeof a)if(o(a))for(var m=a.length;m>g;g++)c(g,g,g===a.length-1);else{var n=void 0;for(var q in a)a.hasOwnProperty(q)&&(n&&c(n,g-1),n=q,g++);n&&c(n,g-1,!0)}return 0===g&&(h=e(this)),h}),a.registerHelper("if",function(a,b){return p(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||i.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,b){p(a)&&(a=a.call(this));var c=b.fn;if(i.isEmpty(a))return b.inverse(this);if(b.data&&b.ids){var d=f(b.data);d.contextPath=i.appendContextPath(b.data.contextPath,b.ids[0]),b={data:d}}return c(a,b)}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)}),a.registerHelper("lookup",function(a,b){return a&&a[b]})}function f(a){var b=i.extend({},a);return b._parent=a,b}var g=c(8)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d,b.createFrame=f;var h=c(12),i=g(h),j=c(11),k=g(j),l="3.0.1";b.VERSION=l;var m=6;b.COMPILER_REVISION=m;var n={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1"};b.REVISION_CHANGES=n;var o=i.isArray,p=i.isFunction,q=i.toString,r="[object Object]";d.prototype={constructor:d,logger:s,log:t,registerHelper:function(a,b){if(q.call(a)===r){if(b)throw new k["default"]("Arg not supported with multiple helpers");i.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(q.call(a)===r)i.extend(this.partials,a);else{if("undefined"==typeof b)throw new k["default"]("Attempting to register a partial as undefined");this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]}};var s={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:1,log:function(a,b){if("undefined"!=typeof console&&s.level<=a){var c=s.methodMap[a];(console[c]||console.log).call(console,b)}}};b.logger=s;var t=s.log;b.log=t},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b){"use strict";function c(a,b){var e=b&&b.loc,f=void 0,g=void 0;e&&(f=e.start.line,g=e.start.column,a+=" - "+f+":"+g);for(var h=Error.prototype.constructor.call(this,a),i=0;ic;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return l.test(a)?a.replace(k,c):a}function g(a){return a||0===a?o(a)&&0===a.length?!0:!1:!0}function h(a,b){return a.path=b,a}function i(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.blockParams=h,b.appendContextPath=i;var j={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},k=/[&<>"'`]/g,l=/[&<>"'`]/,m=Object.prototype.toString;b.toString=m;var n=function(a){return"function"==typeof a};n(/x/)&&(b.isFunction=n=function(a){return"function"==typeof a&&"[object Function]"===m.call(a)});var n;b.isFunction=n;var o=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===m.call(a):!1};b.isArray=o},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=p.COMPILER_REVISION;if(b!==c){if(c>b){var d=p.REVISION_CHANGES[c],e=p.REVISION_CHANGES[b];throw new o["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new o["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=m.extend({},d,e.hash)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;i>h&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new o["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){var c=void 0===arguments[1]?{}:arguments[1],f=c.data; -d._setup(c),!c.partial&&a.useData&&(f=j(b,f));var g=void 0,h=a.useBlockParams?[]:void 0;return a.useDepths&&(g=c.depths?[b].concat(c.depths):[b]),a.main.call(e,b,e.helpers,e.partials,f,h,g)}if(!b)throw new o["default"]("No environment passed to template");if(!a||!a.main)throw new o["default"]("Unknown template object: "+typeof a);b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new o["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;c>d;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:m.escapeExpression,invokePartial:c,fn:function(b){return a[b]},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=m.extend({},b,a)),c},noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new o["default"]("must pass block params");if(a.useDepths&&!g)throw new o["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=void 0===arguments[1]?{}:arguments[1];return c.call(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),g&&[b].concat(g))}return h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a=c.partials[c.name],a}function h(a,b,c){if(c.partial=!0,void 0===a)throw new o["default"]("The partial "+c.name+" could not be found");return a instanceof Function?a(b,c):void 0}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?p.createFrame(b):{},b.root=a),b}var k=c(8)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var l=c(12),m=k(l),n=c(11),o=k(n),p=c(9)},function(a,b){"use strict";b.__esModule=!0;var c=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,content:12,COMMENT:13,CONTENT:14,openRawBlock:15,END_RAW_BLOCK:16,OPEN_RAW_BLOCK:17,helperName:18,openRawBlock_repetition0:19,openRawBlock_option0:20,CLOSE_RAW_BLOCK:21,openBlock:22,block_option0:23,closeBlock:24,openInverse:25,block_option1:26,OPEN_BLOCK:27,openBlock_repetition0:28,openBlock_option0:29,openBlock_option1:30,CLOSE:31,OPEN_INVERSE:32,openInverse_repetition0:33,openInverse_option0:34,openInverse_option1:35,openInverseChain:36,OPEN_INVERSE_CHAIN:37,openInverseChain_repetition0:38,openInverseChain_option0:39,openInverseChain_option1:40,inverseAndProgram:41,INVERSE:42,inverseChain:43,inverseChain_option0:44,OPEN_ENDBLOCK:45,OPEN:46,mustache_repetition0:47,mustache_option0:48,OPEN_UNESCAPED:49,mustache_repetition1:50,mustache_option1:51,CLOSE_UNESCAPED:52,OPEN_PARTIAL:53,partialName:54,partial_repetition0:55,partial_option0:56,param:57,sexpr:58,OPEN_SEXPR:59,sexpr_repetition0:60,sexpr_option0:61,CLOSE_SEXPR:62,hash:63,hash_repetition_plus0:64,hashSegment:65,ID:66,EQUALS:67,blockParams:68,OPEN_BLOCK_PARAMS:69,blockParams_repetition_plus0:70,CLOSE_BLOCK_PARAMS:71,path:72,dataName:73,STRING:74,NUMBER:75,BOOLEAN:76,UNDEFINED:77,NULL:78,DATA:79,pathSegments:80,SEP:81,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",13:"COMMENT",14:"CONTENT",16:"END_RAW_BLOCK",17:"OPEN_RAW_BLOCK",21:"CLOSE_RAW_BLOCK",27:"OPEN_BLOCK",31:"CLOSE",32:"OPEN_INVERSE",37:"OPEN_INVERSE_CHAIN",42:"INVERSE",45:"OPEN_ENDBLOCK",46:"OPEN",49:"OPEN_UNESCAPED",52:"CLOSE_UNESCAPED",53:"OPEN_PARTIAL",59:"OPEN_SEXPR",62:"CLOSE_SEXPR",66:"ID",67:"EQUALS",69:"OPEN_BLOCK_PARAMS",71:"CLOSE_BLOCK_PARAMS",74:"STRING",75:"NUMBER",76:"BOOLEAN",77:"UNDEFINED",78:"NULL",79:"DATA",81:"SEP"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[12,1],[10,3],[15,5],[9,4],[9,4],[22,6],[25,6],[36,6],[41,2],[43,3],[43,1],[24,3],[8,5],[8,5],[11,5],[57,1],[57,1],[58,5],[63,1],[65,3],[68,3],[18,1],[18,1],[18,1],[18,1],[18,1],[18,1],[18,1],[54,1],[54,1],[73,2],[72,1],[80,3],[80,1],[6,0],[6,2],[19,0],[19,2],[20,0],[20,1],[23,0],[23,1],[26,0],[26,1],[28,0],[28,2],[29,0],[29,1],[30,0],[30,1],[33,0],[33,2],[34,0],[34,1],[35,0],[35,1],[38,0],[38,2],[39,0],[39,1],[40,0],[40,1],[44,0],[44,1],[47,0],[47,2],[48,0],[48,1],[50,0],[50,2],[51,0],[51,1],[55,0],[55,2],[56,0],[56,1],[60,0],[60,2],[61,0],[61,1],[64,1],[64,2],[70,1],[70,2]],performAction:function(a,b,c,d,e,f){var g=f.length-1;switch(e){case 1:return f[g-1];case 2:this.$=new d.Program(f[g],null,{},d.locInfo(this._$));break;case 3:this.$=f[g];break;case 4:this.$=f[g];break;case 5:this.$=f[g];break;case 6:this.$=f[g];break;case 7:this.$=f[g];break;case 8:this.$=new d.CommentStatement(d.stripComment(f[g]),d.stripFlags(f[g],f[g]),d.locInfo(this._$));break;case 9:this.$=new d.ContentStatement(f[g],d.locInfo(this._$));break;case 10:this.$=d.prepareRawBlock(f[g-2],f[g-1],f[g],this._$);break;case 11:this.$={path:f[g-3],params:f[g-2],hash:f[g-1]};break;case 12:this.$=d.prepareBlock(f[g-3],f[g-2],f[g-1],f[g],!1,this._$);break;case 13:this.$=d.prepareBlock(f[g-3],f[g-2],f[g-1],f[g],!0,this._$);break;case 14:this.$={path:f[g-4],params:f[g-3],hash:f[g-2],blockParams:f[g-1],strip:d.stripFlags(f[g-5],f[g])};break;case 15:this.$={path:f[g-4],params:f[g-3],hash:f[g-2],blockParams:f[g-1],strip:d.stripFlags(f[g-5],f[g])};break;case 16:this.$={path:f[g-4],params:f[g-3],hash:f[g-2],blockParams:f[g-1],strip:d.stripFlags(f[g-5],f[g])};break;case 17:this.$={strip:d.stripFlags(f[g-1],f[g-1]),program:f[g]};break;case 18:var h=d.prepareBlock(f[g-2],f[g-1],f[g],f[g],!1,this._$),i=new d.Program([h],null,{},d.locInfo(this._$));i.chained=!0,this.$={strip:f[g-2].strip,program:i,chain:!0};break;case 19:this.$=f[g];break;case 20:this.$={path:f[g-1],strip:d.stripFlags(f[g-2],f[g])};break;case 21:this.$=d.prepareMustache(f[g-3],f[g-2],f[g-1],f[g-4],d.stripFlags(f[g-4],f[g]),this._$);break;case 22:this.$=d.prepareMustache(f[g-3],f[g-2],f[g-1],f[g-4],d.stripFlags(f[g-4],f[g]),this._$);break;case 23:this.$=new d.PartialStatement(f[g-3],f[g-2],f[g-1],d.stripFlags(f[g-4],f[g]),d.locInfo(this._$));break;case 24:this.$=f[g];break;case 25:this.$=f[g];break;case 26:this.$=new d.SubExpression(f[g-3],f[g-2],f[g-1],d.locInfo(this._$));break;case 27:this.$=new d.Hash(f[g],d.locInfo(this._$));break;case 28:this.$=new d.HashPair(d.id(f[g-2]),f[g],d.locInfo(this._$));break;case 29:this.$=d.id(f[g-1]);break;case 30:this.$=f[g];break;case 31:this.$=f[g];break;case 32:this.$=new d.StringLiteral(f[g],d.locInfo(this._$));break;case 33:this.$=new d.NumberLiteral(f[g],d.locInfo(this._$));break;case 34:this.$=new d.BooleanLiteral(f[g],d.locInfo(this._$));break;case 35:this.$=new d.UndefinedLiteral(d.locInfo(this._$));break;case 36:this.$=new d.NullLiteral(d.locInfo(this._$));break;case 37:this.$=f[g];break;case 38:this.$=f[g];break;case 39:this.$=d.preparePath(!0,f[g],this._$);break;case 40:this.$=d.preparePath(!1,f[g],this._$);break;case 41:f[g-2].push({part:d.id(f[g]),original:f[g],separator:f[g-1]}),this.$=f[g-2];break;case 42:this.$=[{part:d.id(f[g]),original:f[g]}];break;case 43:this.$=[];break;case 44:f[g-1].push(f[g]);break;case 45:this.$=[];break;case 46:f[g-1].push(f[g]);break;case 53:this.$=[];break;case 54:f[g-1].push(f[g]);break;case 59:this.$=[];break;case 60:f[g-1].push(f[g]);break;case 65:this.$=[];break;case 66:f[g-1].push(f[g]);break;case 73:this.$=[];break;case 74:f[g-1].push(f[g]);break;case 77:this.$=[];break;case 78:f[g-1].push(f[g]);break;case 81:this.$=[];break;case 82:f[g-1].push(f[g]);break;case 85:this.$=[];break;case 86:f[g-1].push(f[g]);break;case 89:this.$=[f[g]];break;case 90:f[g-1].push(f[g]);break;case 91:this.$=[f[g]];break;case 92:f[g-1].push(f[g])}},table:[{3:1,4:2,5:[2,43],6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],46:[2,43],49:[2,43],53:[2,43]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:[1,11],14:[1,18],15:16,17:[1,21],22:14,25:15,27:[1,19],32:[1,20],37:[2,2],42:[2,2],45:[2,2],46:[1,12],49:[1,13],53:[1,17]},{1:[2,1]},{5:[2,44],13:[2,44],14:[2,44],17:[2,44],27:[2,44],32:[2,44],37:[2,44],42:[2,44],45:[2,44],46:[2,44],49:[2,44],53:[2,44]},{5:[2,3],13:[2,3],14:[2,3],17:[2,3],27:[2,3],32:[2,3],37:[2,3],42:[2,3],45:[2,3],46:[2,3],49:[2,3],53:[2,3]},{5:[2,4],13:[2,4],14:[2,4],17:[2,4],27:[2,4],32:[2,4],37:[2,4],42:[2,4],45:[2,4],46:[2,4],49:[2,4],53:[2,4]},{5:[2,5],13:[2,5],14:[2,5],17:[2,5],27:[2,5],32:[2,5],37:[2,5],42:[2,5],45:[2,5],46:[2,5],49:[2,5],53:[2,5]},{5:[2,6],13:[2,6],14:[2,6],17:[2,6],27:[2,6],32:[2,6],37:[2,6],42:[2,6],45:[2,6],46:[2,6],49:[2,6],53:[2,6]},{5:[2,7],13:[2,7],14:[2,7],17:[2,7],27:[2,7],32:[2,7],37:[2,7],42:[2,7],45:[2,7],46:[2,7],49:[2,7],53:[2,7]},{5:[2,8],13:[2,8],14:[2,8],17:[2,8],27:[2,8],32:[2,8],37:[2,8],42:[2,8],45:[2,8],46:[2,8],49:[2,8],53:[2,8]},{18:22,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:33,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{4:34,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],37:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{4:35,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{12:36,14:[1,18]},{18:38,54:37,58:39,59:[1,40],66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,9],13:[2,9],14:[2,9],16:[2,9],17:[2,9],27:[2,9],32:[2,9],37:[2,9],42:[2,9],45:[2,9],46:[2,9],49:[2,9],53:[2,9]},{18:41,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:42,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:43,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{31:[2,73],47:44,59:[2,73],66:[2,73],74:[2,73],75:[2,73],76:[2,73],77:[2,73],78:[2,73],79:[2,73]},{21:[2,30],31:[2,30],52:[2,30],59:[2,30],62:[2,30],66:[2,30],69:[2,30],74:[2,30],75:[2,30],76:[2,30],77:[2,30],78:[2,30],79:[2,30]},{21:[2,31],31:[2,31],52:[2,31],59:[2,31],62:[2,31],66:[2,31],69:[2,31],74:[2,31],75:[2,31],76:[2,31],77:[2,31],78:[2,31],79:[2,31]},{21:[2,32],31:[2,32],52:[2,32],59:[2,32],62:[2,32],66:[2,32],69:[2,32],74:[2,32],75:[2,32],76:[2,32],77:[2,32],78:[2,32],79:[2,32]},{21:[2,33],31:[2,33],52:[2,33],59:[2,33],62:[2,33],66:[2,33],69:[2,33],74:[2,33],75:[2,33],76:[2,33],77:[2,33],78:[2,33],79:[2,33]},{21:[2,34],31:[2,34],52:[2,34],59:[2,34],62:[2,34],66:[2,34],69:[2,34],74:[2,34],75:[2,34],76:[2,34],77:[2,34],78:[2,34],79:[2,34]},{21:[2,35],31:[2,35],52:[2,35],59:[2,35],62:[2,35],66:[2,35],69:[2,35],74:[2,35],75:[2,35],76:[2,35],77:[2,35],78:[2,35],79:[2,35]},{21:[2,36],31:[2,36],52:[2,36],59:[2,36],62:[2,36],66:[2,36],69:[2,36],74:[2,36],75:[2,36],76:[2,36],77:[2,36],78:[2,36],79:[2,36]},{21:[2,40],31:[2,40],52:[2,40],59:[2,40],62:[2,40],66:[2,40],69:[2,40],74:[2,40],75:[2,40],76:[2,40],77:[2,40],78:[2,40],79:[2,40],81:[1,45]},{66:[1,32],80:46},{21:[2,42],31:[2,42],52:[2,42],59:[2,42],62:[2,42],66:[2,42],69:[2,42],74:[2,42],75:[2,42],76:[2,42],77:[2,42],78:[2,42],79:[2,42],81:[2,42]},{50:47,52:[2,77],59:[2,77],66:[2,77],74:[2,77],75:[2,77],76:[2,77],77:[2,77],78:[2,77],79:[2,77]},{23:48,36:50,37:[1,52],41:51,42:[1,53],43:49,45:[2,49]},{26:54,41:55,42:[1,53],45:[2,51]},{16:[1,56]},{31:[2,81],55:57,59:[2,81],66:[2,81],74:[2,81],75:[2,81],76:[2,81],77:[2,81],78:[2,81],79:[2,81]},{31:[2,37],59:[2,37],66:[2,37],74:[2,37],75:[2,37],76:[2,37],77:[2,37],78:[2,37],79:[2,37]},{31:[2,38],59:[2,38],66:[2,38],74:[2,38],75:[2,38],76:[2,38],77:[2,38],78:[2,38],79:[2,38]},{18:58,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{28:59,31:[2,53],59:[2,53],66:[2,53],69:[2,53],74:[2,53],75:[2,53],76:[2,53],77:[2,53],78:[2,53],79:[2,53]},{31:[2,59],33:60,59:[2,59],66:[2,59],69:[2,59],74:[2,59],75:[2,59],76:[2,59],77:[2,59],78:[2,59],79:[2,59]},{19:61,21:[2,45],59:[2,45],66:[2,45],74:[2,45],75:[2,45],76:[2,45],77:[2,45],78:[2,45],79:[2,45]},{18:65,31:[2,75],48:62,57:63,58:66,59:[1,40],63:64,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{66:[1,70]},{21:[2,39],31:[2,39],52:[2,39],59:[2,39],62:[2,39],66:[2,39],69:[2,39],74:[2,39],75:[2,39],76:[2,39],77:[2,39],78:[2,39],79:[2,39],81:[1,45]},{18:65,51:71,52:[2,79],57:72,58:66,59:[1,40],63:73,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{24:74,45:[1,75]},{45:[2,50]},{4:76,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],37:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{45:[2,19]},{18:77,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{4:78,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{24:79,45:[1,75]},{45:[2,52]},{5:[2,10],13:[2,10],14:[2,10],17:[2,10],27:[2,10],32:[2,10],37:[2,10],42:[2,10],45:[2,10],46:[2,10],49:[2,10],53:[2,10]},{18:65,31:[2,83],56:80,57:81,58:66,59:[1,40],63:82,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{59:[2,85],60:83,62:[2,85],66:[2,85],74:[2,85],75:[2,85],76:[2,85],77:[2,85],78:[2,85],79:[2,85]},{18:65,29:84,31:[2,55],57:85,58:66,59:[1,40],63:86,64:67,65:68,66:[1,69],69:[2,55],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:65,31:[2,61],34:87,57:88,58:66,59:[1,40],63:89,64:67,65:68,66:[1,69],69:[2,61],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:65,20:90,21:[2,47],57:91,58:66,59:[1,40],63:92,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{31:[1,93]},{31:[2,74],59:[2,74],66:[2,74],74:[2,74],75:[2,74],76:[2,74],77:[2,74],78:[2,74],79:[2,74]},{31:[2,76]},{21:[2,24],31:[2,24],52:[2,24],59:[2,24],62:[2,24],66:[2,24],69:[2,24],74:[2,24],75:[2,24],76:[2,24],77:[2,24],78:[2,24],79:[2,24]},{21:[2,25],31:[2,25],52:[2,25],59:[2,25],62:[2,25],66:[2,25],69:[2,25],74:[2,25],75:[2,25],76:[2,25],77:[2,25],78:[2,25],79:[2,25]},{21:[2,27],31:[2,27],52:[2,27],62:[2,27],65:94,66:[1,95],69:[2,27]},{21:[2,89],31:[2,89],52:[2,89],62:[2,89],66:[2,89],69:[2,89]},{21:[2,42],31:[2,42],52:[2,42],59:[2,42],62:[2,42],66:[2,42],67:[1,96],69:[2,42],74:[2,42],75:[2,42],76:[2,42],77:[2,42],78:[2,42],79:[2,42],81:[2,42]},{21:[2,41],31:[2,41],52:[2,41],59:[2,41],62:[2,41],66:[2,41],69:[2,41],74:[2,41],75:[2,41],76:[2,41],77:[2,41],78:[2,41],79:[2,41],81:[2,41]},{52:[1,97]},{52:[2,78],59:[2,78],66:[2,78],74:[2,78],75:[2,78],76:[2,78],77:[2,78],78:[2,78],79:[2,78]},{52:[2,80]},{5:[2,12],13:[2,12],14:[2,12],17:[2,12],27:[2,12],32:[2,12],37:[2,12],42:[2,12],45:[2,12],46:[2,12],49:[2,12],53:[2,12]},{18:98,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{36:50,37:[1,52],41:51,42:[1,53],43:100,44:99,45:[2,71]},{31:[2,65],38:101,59:[2,65],66:[2,65],69:[2,65],74:[2,65],75:[2,65],76:[2,65],77:[2,65],78:[2,65],79:[2,65]},{45:[2,17]},{5:[2,13],13:[2,13],14:[2,13],17:[2,13],27:[2,13],32:[2,13],37:[2,13],42:[2,13],45:[2,13],46:[2,13],49:[2,13],53:[2,13]},{31:[1,102]},{31:[2,82],59:[2,82],66:[2,82],74:[2,82],75:[2,82],76:[2,82],77:[2,82],78:[2,82],79:[2,82]},{31:[2,84]},{18:65,57:104,58:66,59:[1,40],61:103,62:[2,87],63:105,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{30:106,31:[2,57],68:107,69:[1,108]},{31:[2,54],59:[2,54],66:[2,54],69:[2,54],74:[2,54],75:[2,54],76:[2,54],77:[2,54],78:[2,54],79:[2,54]},{31:[2,56],69:[2,56]},{31:[2,63],35:109,68:110,69:[1,108]},{31:[2,60],59:[2,60],66:[2,60],69:[2,60],74:[2,60],75:[2,60],76:[2,60],77:[2,60],78:[2,60],79:[2,60]},{31:[2,62],69:[2,62]},{21:[1,111]},{21:[2,46],59:[2,46],66:[2,46],74:[2,46],75:[2,46],76:[2,46],77:[2,46],78:[2,46],79:[2,46]},{21:[2,48]},{5:[2,21],13:[2,21],14:[2,21],17:[2,21],27:[2,21],32:[2,21],37:[2,21],42:[2,21],45:[2,21],46:[2,21],49:[2,21],53:[2,21]},{21:[2,90],31:[2,90],52:[2,90],62:[2,90],66:[2,90],69:[2,90]},{67:[1,96]},{18:65,57:112,58:66,59:[1,40],66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,22],13:[2,22],14:[2,22],17:[2,22],27:[2,22],32:[2,22],37:[2,22],42:[2,22],45:[2,22],46:[2,22],49:[2,22],53:[2,22]},{31:[1,113]},{45:[2,18]},{45:[2,72]},{18:65,31:[2,67],39:114,57:115,58:66,59:[1,40],63:116,64:67,65:68,66:[1,69],69:[2,67],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,23],13:[2,23],14:[2,23],17:[2,23],27:[2,23],32:[2,23],37:[2,23],42:[2,23],45:[2,23],46:[2,23],49:[2,23],53:[2,23]},{62:[1,117]},{59:[2,86],62:[2,86],66:[2,86],74:[2,86],75:[2,86],76:[2,86],77:[2,86],78:[2,86],79:[2,86]},{62:[2,88]},{31:[1,118]},{31:[2,58]},{66:[1,120],70:119},{31:[1,121]},{31:[2,64]},{14:[2,11]},{21:[2,28],31:[2,28],52:[2,28],62:[2,28],66:[2,28],69:[2,28]},{5:[2,20],13:[2,20],14:[2,20],17:[2,20],27:[2,20],32:[2,20],37:[2,20],42:[2,20],45:[2,20],46:[2,20],49:[2,20],53:[2,20]},{31:[2,69],40:122,68:123,69:[1,108]},{31:[2,66],59:[2,66],66:[2,66],69:[2,66],74:[2,66],75:[2,66],76:[2,66],77:[2,66],78:[2,66],79:[2,66]},{31:[2,68],69:[2,68]},{21:[2,26],31:[2,26],52:[2,26],59:[2,26],62:[2,26],66:[2,26],69:[2,26],74:[2,26],75:[2,26],76:[2,26],77:[2,26],78:[2,26],79:[2,26]},{13:[2,14],14:[2,14],17:[2,14],27:[2,14],32:[2,14],37:[2,14],42:[2,14],45:[2,14],46:[2,14],49:[2,14],53:[2,14]},{66:[1,125],71:[1,124]},{66:[2,91],71:[2,91]},{13:[2,15],14:[2,15],17:[2,15],27:[2,15],32:[2,15],42:[2,15],45:[2,15],46:[2,15],49:[2,15],53:[2,15]},{31:[1,126]},{31:[2,70]},{31:[2,29]},{66:[2,92],71:[2,92]},{13:[2,16],14:[2,16],17:[2,16],27:[2,16],32:[2,16],37:[2,16],42:[2,16],45:[2,16],46:[2,16],49:[2,16],53:[2,16]}],defaultActions:{4:[2,1],49:[2,50],51:[2,19],55:[2,52],64:[2,76],73:[2,80],78:[2,17],82:[2,84],92:[2,48],99:[2,18],100:[2,72],105:[2,88],107:[2,58],110:[2,64],111:[2,11],123:[2,70],124:[2,29]},parseError:function(a){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:((null===n||"undefined"==typeof n)&&(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;gb[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 14;break;case 1:return 14;case 2:return this.popState(),14;case 3:return b.yytext=b.yytext.substr(5,b.yyleng-9),this.popState(),16;case 4:return 14;case 5:return this.popState(),13;case 6:return 59;case 7:return 62;case 8:return 17;case 9:return this.popState(),this.begin("raw"),21;case 10:return 53;case 11:return 27;case 12:return 45;case 13:return this.popState(),42;case 14:return this.popState(),42;case 15:return 32;case 16:return 37;case 17:return 49;case 18:return 46;case 19:this.unput(b.yytext),this.popState(),this.begin("com");break;case 20:return this.popState(),13;case 21:return 46;case 22:return 67;case 23:return 66;case 24:return 66;case 25:return 81;case 26:break;case 27:return this.popState(),52;case 28:return this.popState(),31;case 29:return b.yytext=e(1,2).replace(/\\"/g,'"'),74;case 30:return b.yytext=e(1,2).replace(/\\'/g,"'"),74;case 31:return 79;case 32:return 76;case 33:return 76;case 34:return 77;case 35:return 78;case 36:return 75;case 37:return 69;case 38:return 71;case 39:return 66;case 40:return 66;case 41:return"INVALID";case 42:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{\/)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[5],inclusive:!1},raw:{rules:[3,4],inclusive:!1},INITIAL:{rules:[0,1,42],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(){}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"ContentStatement"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"ContentStatement"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"ContentStatement"===d.type&&(c||!d.rightStripped)){var e=d.value;d.value=d.value.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.value!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"ContentStatement"===d.type&&(c||!d.leftStripped)){var e=d.value;return d.value=d.value.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.value!==e,d.leftStripped}}var i=c(8)["default"];b.__esModule=!0;var j=c(6),k=i(j);d.prototype=new k["default"],d.prototype.Program=function(a){var b=!this.isRootSeen;this.isRootSeen=!0;for(var c=a.body,d=0,i=c.length;i>d;d++){var j=c[d],k=this.accept(j);if(k){var l=e(c,d,b),m=f(c,d,b),n=k.openStandalone&&l,o=k.closeStandalone&&m,p=k.inlineStandalone&&l&&m;k.close&&g(c,d,!0),k.open&&h(c,d,!0),p&&(g(c,d),h(c,d)&&"PartialStatement"===j.type&&(j.indent=/([ \t]+$)/.exec(c[d-1].original)[1])),n&&(g((j.program||j.inverse).body),h(c,d)),o&&(g(c,d),h((j.inverse||j.program).body))}}return a},d.prototype.BlockStatement=function(a){this.accept(a.program),this.accept(a.inverse);var b=a.program||a.inverse,c=a.program&&a.inverse,d=c,i=c;if(c&&c.chained)for(d=c.body[0].program;i.chained;)i=i.body[i.body.length-1].program;var j={open:a.openStrip.open,close:a.closeStrip.close,openStandalone:f(b.body),closeStandalone:e((d||b).body)};if(a.openStrip.close&&g(b.body,null,!0),c){var k=a.inverseStrip;k.open&&h(b.body,null,!0),k.close&&g(d.body,null,!0),a.closeStrip.open&&h(i.body,null,!0),e(b.body)&&f(d.body)&&(h(b.body),g(d.body))}else a.closeStrip.open&&h(b.body,null,!0);return j},d.prototype.MustacheStatement=function(a){return a.strip},d.prototype.PartialStatement=d.prototype.CommentStatement=function(a){var b=a.strip||{};return{inlineStandalone:!0,open:b.open,close:b.close}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){this.source=a,this.start={line:b.first_line,column:b.first_column},this.end={line:b.last_line,column:b.last_column}}function e(a){return/^\[.*\]$/.test(a)?a.substr(1,a.length-2):a}function f(a,b){return{open:"~"===a.charAt(2),close:"~"===b.charAt(b.length-3)}}function g(a){return a.replace(/^\{\{~?\!-?-?/,"").replace(/-?-?~?\}\}$/,"")}function h(a,b,c){c=this.locInfo(c);for(var d=a?"@":"",e=[],f=0,g="",h=0,i=b.length;i>h;h++){var j=b[h].part,k=b[h].original!==j;if(d+=(b[h].separator||"")+j,k||".."!==j&&"."!==j&&"this"!==j)e.push(j);else{if(e.length>0)throw new n["default"]("Invalid path: "+d,{loc:c});".."===j&&(f++,g+="../")}}return new this.PathExpression(a,f,e,d,c)}function i(a,b,c,d,e,f){var g=d.charAt(3)||d.charAt(2),h="{"!==g&&"&"!==g;return new this.MustacheStatement(a,b,c,h,e,this.locInfo(f))}function j(a,b,c,d){if(a.path.original!==c){var e={loc:a.path.loc};throw new n["default"](a.path.original+" doesn't match "+c,e)}d=this.locInfo(d);var f=new this.Program([b],null,{},d);return new this.BlockStatement(a.path,a.params,a.hash,f,void 0,{},{},{},d)}function k(a,b,c,d,e,f){if(d&&d.path&&a.path.original!==d.path.original){var g={loc:a.path.loc};throw new n["default"](a.path.original+" doesn't match "+d.path.original,g)}b.blockParams=a.blockParams;var h=void 0,i=void 0;return c&&(c.chain&&(c.program.body[0].closeStrip=d.strip),i=c.strip,h=c.program),e&&(e=h,h=b,b=e),new this.BlockStatement(a.path,a.params,a.hash,b,h,a.strip,i,d&&d.strip,this.locInfo(f))}var l=c(8)["default"];b.__esModule=!0,b.SourceLocation=d,b.id=e,b.stripFlags=f,b.stripComment=g,b.preparePath=h,b.prepareMustache=i,b.prepareRawBlock=j,b.prepareBlock=k;var m=c(11),n=l(m)},function(a,b,c){"use strict";function d(a,b,c){if(f.isArray(a)){for(var d=[],e=0,g=a.length;g>e;e++)d.push(b.wrap(a[e],c));return d}return"boolean"==typeof a||"number"==typeof a?a+"":a}function e(a){this.srcFile=a,this.source=[]}b.__esModule=!0;var f=c(12),g=void 0;try{}catch(h){}g||(g=function(a,b,c,d){this.src="",d&&this.add(d)},g.prototype={add:function(a){f.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){f.isArray(a)&&(a=a.join("")),this.src=a+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),e.prototype={prepend:function(a,b){this.source.unshift(this.wrap(a,b))},push:function(a,b){this.source.push(this.wrap(a,b))},merge:function(){var a=this.empty();return this.each(function(b){a.add([" ",b,"\n"])}),a},each:function(a){for(var b=0,c=this.source.length;c>b;b++)a(this.source[b])},empty:function(){var a=void 0===arguments[0]?this.currentLocation||{start:{}}:arguments[0];return new g(a.start.line,a.start.column,this.srcFile)},wrap:function(a){var b=void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return a instanceof g?a:(a=d(a,this,b),new g(b.start.line,b.start.column,this.srcFile,a))},functionCall:function(a,b,c){return c=this.generateList(c),this.wrap([a,b?"."+b+"(":"(",c,")"])},quotedString:function(a){return'"'+(a+"").replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},objectLiteral:function(a){var b=[];for(var c in a)if(a.hasOwnProperty(c)){var e=d(a[c],this);"undefined"!==e&&b.push([this.quotedString(c),":",e]) -}var f=this.generateList(b);return f.prepend("{"),f.add("}"),f},generateList:function(a,b){for(var c=this.empty(b),e=0,f=a.length;f>e;e++)e&&c.add(","),c.add(d(a[e],this,b));return c},generateArray:function(a,b){var c=this.generateList(a,b);return c.prepend("["),c.add("]"),c}},b["default"]=e,a.exports=b["default"]}])}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.js deleted file mode 100644 index 9b5c9dd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.js +++ /dev/null @@ -1,744 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -define('handlebars/utils',['exports'], function (exports) { - - - exports.__esModule = true; - exports.extend = extend; - - // Older IE versions do not directly support indexOf so we must implement our own, sadly. - exports.indexOf = indexOf; - exports.escapeExpression = escapeExpression; - exports.isEmpty = isEmpty; - exports.blockParams = blockParams; - exports.appendContextPath = appendContextPath; - var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '`': '`' - }; - - var badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - - function escapeChar(chr) { - return escape[chr]; - } - - function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; - } - - var toString = Object.prototype.toString; - - exports.toString = toString; - // Sourced from lodash - // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt - /*eslint-disable func-style, no-var */ - var isFunction = function isFunction(value) { - return typeof value === 'function'; - }; - // fallback for older versions of Chrome and Safari - /* istanbul ignore next */ - if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; - } - var isFunction; - exports.isFunction = isFunction; - /*eslint-enable func-style, no-var */ - - /* istanbul ignore next */ - var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; - };exports.isArray = isArray; - - function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; - } - - function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); - } - - function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } - } - - function blockParams(params, ids) { - params.path = ids; - return params; - } - - function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; - } -}); -define('handlebars/exception',['exports', 'module'], function (exports, module) { - - - var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - - function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } - } - - Exception.prototype = new Error(); - - module.exports = Exception; -}); -define('handlebars/base',['exports', './utils', './exception'], function (exports, _utils, _exception) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.HandlebarsEnvironment = HandlebarsEnvironment; - exports.createFrame = createFrame; - - var _Exception = _interopRequire(_exception); - - var VERSION = '3.0.1'; - exports.VERSION = VERSION; - var COMPILER_REVISION = 6; - - exports.COMPILER_REVISION = COMPILER_REVISION; - var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' - }; - - exports.REVISION_CHANGES = REVISION_CHANGES; - var isArray = _utils.isArray, - isFunction = _utils.isFunction, - toString = _utils.toString, - objectType = '[object Object]'; - - function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); - } - - HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function registerHelper(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { - throw new _Exception('Arg not supported with multiple helpers'); - } - _utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (toString.call(name) === objectType) { - _utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _Exception('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - } - }; - - function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function () { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _Exception('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _Exception('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (var j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function (conditional, options) { - if (isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - - instance.registerHelper('with', function (context, options) { - if (isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!_utils.isEmpty(context)) { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = { data: data }; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function (message, options) { - var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); - } - - var logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function log(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - var method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } - }; - - exports.logger = logger; - var log = logger.log; - - exports.log = log; - - function createFrame(object) { - var frame = _utils.extend({}, object); - frame._parent = object; - return frame; - } -}); -/* [args, ]options */; -define('handlebars/safe-string',['exports', 'module'], function (exports, module) { - // Build out our basic SafeString type - - - function SafeString(string) { - this.string = string; - } - - SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; - }; - - module.exports = SafeString; -}); -define('handlebars/runtime',['exports', './utils', './exception', './base'], function (exports, _utils, _exception, _base) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - exports.__esModule = true; - exports.checkRevision = checkRevision; - - // TODO: Remove this line and break up compilePartial - - exports.template = template; - exports.wrapProgram = wrapProgram; - exports.resolvePartial = resolvePartial; - exports.invokePartial = invokePartial; - exports.noop = noop; - - var _Exception = _interopRequire(_exception); - - function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _base.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _base.REVISION_CHANGES[currentRevision], - compilerVersions = _base.REVISION_CHANGES[compilerRevision]; - throw new _Exception('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _Exception('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } - } - - function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _Exception('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _Exception('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = _utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _Exception('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _Exception('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: _utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - return templateSpec[i]; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = _utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _Exception('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _Exception('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; - } - - function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; - } - - function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; - } - - function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new _Exception('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } - } - - function noop() { - return ''; - } - - function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _base.createFrame(data) : {}; - data.root = context; - } - return data; - } -}); -define('handlebars/no-conflict',['exports', 'module'], function (exports, module) { - /*global window */ - - - module.exports = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; - }; -}); -define('handlebars.runtime',['exports', 'module', './handlebars/base', './handlebars/safe-string', './handlebars/exception', './handlebars/utils', './handlebars/runtime', './handlebars/no-conflict'], function (exports, module, _handlebarsBase, _handlebarsSafeString, _handlebarsException, _handlebarsUtils, _handlebarsRuntime, _handlebarsNoConflict) { - - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj['default'] : obj; }; - - // Each of these augment the Handlebars object. No need to setup here. - // (This is done to easily share code between commonjs and browse envs) - - var _SafeString = _interopRequire(_handlebarsSafeString); - - var _Exception = _interopRequire(_handlebarsException); - - var _noConflict = _interopRequire(_handlebarsNoConflict); - - // For compatibility and usage outside of module systems, make the Handlebars object a namespace - function create() { - var hb = new _handlebarsBase.HandlebarsEnvironment(); - - _handlebarsUtils.extend(hb, _handlebarsBase); - hb.SafeString = _SafeString; - hb.Exception = _Exception; - hb.Utils = _handlebarsUtils; - hb.escapeExpression = _handlebarsUtils.escapeExpression; - - hb.VM = _handlebarsRuntime; - hb.template = function (spec) { - return _handlebarsRuntime.template(spec, hb); - }; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict(inst); - - inst['default'] = inst; - - module.exports = inst; -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.min.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.min.js deleted file mode 100644 index c5f872f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.amd.min.js +++ /dev/null @@ -1,27 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -define("handlebars/utils",["exports"],function(a){function b(a){return i[a]}function c(a){for(var b=1;bc;c++)if(a[c]===b)return c;return-1}function e(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return k.test(a)?a.replace(j,b):a}function f(a){return a||0===a?n(a)&&0===a.length?!0:!1:!0}function g(a,b){return a.path=b,a}function h(a,b){return(a?a+".":"")+b}a.__esModule=!0,a.extend=c,a.indexOf=d,a.escapeExpression=e,a.isEmpty=f,a.blockParams=g,a.appendContextPath=h;var i={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},j=/[&<>"'`]/g,k=/[&<>"'`]/,l=Object.prototype.toString;a.toString=l;var m=function(a){return"function"==typeof a};m(/x/)&&(a.isFunction=m=function(a){return"function"==typeof a&&"[object Function]"===l.call(a)});var m;a.isFunction=m;var n=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===l.call(a):!1};a.isArray=n}),define("handlebars/exception",["exports","module"],function(a,b){function c(a,b){var e=b&&b.loc,f=void 0,g=void 0;e&&(f=e.start.line,g=e.start.column,a+=" - "+f+":"+g);for(var h=Error.prototype.constructor.call(this,a),i=0;i0?(d.ids&&(d.ids=[d.name]),a.helpers.each(c,d)):e(this);if(d.data&&d.ids){var h=f(d.data);h.contextPath=b.appendContextPath(d.data.contextPath,d.name),d={data:h}}return g(c,d)}),a.registerHelper("each",function(a,c){function d(c,d,f){k&&(k.key=c,k.index=d,k.first=0===d,k.last=!!f,n&&(k.contextPath=n+c)),j+=e(a[c],{data:k,blockParams:b.blockParams([a[c],c],[n+c,null])})}if(!c)throw new h("Must pass iterator to #each");var e=c.fn,g=c.inverse,i=0,j="",k=void 0,n=void 0;if(c.data&&c.ids&&(n=b.appendContextPath(c.data.contextPath,c.ids[0])+"."),m(a)&&(a=a.call(this)),c.data&&(k=f(c.data)),a&&"object"==typeof a)if(l(a))for(var o=a.length;o>i;i++)d(i,i,i===a.length-1);else{var p=void 0;for(var q in a)a.hasOwnProperty(q)&&(p&&d(p,i-1),p=q,i++);p&&d(p,i-1,!0)}return 0===i&&(j=g(this)),j}),a.registerHelper("if",function(a,c){return m(a)&&(a=a.call(this)),!c.hash.includeZero&&!a||b.isEmpty(a)?c.inverse(this):c.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,c){m(a)&&(a=a.call(this));var d=c.fn;if(b.isEmpty(a))return c.inverse(this);if(c.data&&c.ids){var e=f(c.data);e.contextPath=b.appendContextPath(c.data.contextPath,c.ids[0]),c={data:e}}return d(a,c)}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)}),a.registerHelper("lookup",function(a,b){return a&&a[b]})}function f(a){var c=b.extend({},a);return c._parent=a,c}var g=function(a){return a&&a.__esModule?a["default"]:a};a.__esModule=!0,a.HandlebarsEnvironment=d,a.createFrame=f;var h=g(c),i="3.0.1";a.VERSION=i;var j=6;a.COMPILER_REVISION=j;var k={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1"};a.REVISION_CHANGES=k;var l=b.isArray,m=b.isFunction,n=b.toString,o="[object Object]";d.prototype={constructor:d,logger:p,log:q,registerHelper:function(a,c){if(n.call(a)===o){if(c)throw new h("Arg not supported with multiple helpers");b.extend(this.helpers,a)}else this.helpers[a]=c},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,c){if(n.call(a)===o)b.extend(this.partials,a);else{if("undefined"==typeof c)throw new h("Attempting to register a partial as undefined");this.partials[a]=c}},unregisterPartial:function(a){delete this.partials[a]}};var p={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:1,log:function(a,b){if("undefined"!=typeof console&&p.level<=a){var c=p.methodMap[a];(console[c]||console.log).call(console,b)}}};a.logger=p;var q=p.log;a.log=q}),define("handlebars/safe-string",["exports","module"],function(a,b){function c(a){this.string=a}c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b.exports=c}),define("handlebars/runtime",["exports","./utils","./exception","./base"],function(a,b,c,d){function e(a){var b=a&&a[0]||1,c=d.COMPILER_REVISION;if(b!==c){if(c>b){var e=d.REVISION_CHANGES[c],f=d.REVISION_CHANGES[b];throw new m("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+e+") or downgrade your runtime to an older version ("+f+").")}throw new m("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function f(a,c){function d(d,e,f){f.hash&&(e=b.extend({},e,f.hash)),d=c.VM.resolvePartial.call(this,d,e,f);var g=c.VM.invokePartial.call(this,d,e,f);if(null==g&&c.compile&&(f.partials[f.name]=c.compile(d,a.compilerOptions,c),g=f.partials[f.name](e,f)),null!=g){if(f.indent){for(var h=g.split("\n"),i=0,j=h.length;j>i&&(h[i]||i+1!==j);i++)h[i]=f.indent+h[i];g=h.join("\n")}return g}throw new m("The partial "+f.name+" could not be compiled when running in runtime-only mode")}function e(b){var c=void 0===arguments[1]?{}:arguments[1],d=c.data;e._setup(c),!c.partial&&a.useData&&(d=k(b,d));var g=void 0,h=a.useBlockParams?[]:void 0;return a.useDepths&&(g=c.depths?[b].concat(c.depths):[b]),a.main.call(f,b,f.helpers,f.partials,d,h,g)}if(!c)throw new m("No environment passed to template");if(!a||!a.main)throw new m("Unknown template object: "+typeof a);c.VM.checkRevision(a.compiler);var f={strict:function(a,b){if(!(b in a))throw new m('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;c>d;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:b.escapeExpression,invokePartial:d,fn:function(b){return a[b]},programs:[],program:function(a,b,c,d,e){var f=this.programs[a],h=this.fn(a);return b||e||d||c?f=g(this,a,h,b,c,d,e):f||(f=this.programs[a]=g(this,a,h)),f},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,c){var d=a||c;return a&&c&&a!==c&&(d=b.extend({},c,a)),d},noop:c.VM.noop,compilerInfo:a.compiler};return e.isTop=!0,e._setup=function(b){b.partial?(f.helpers=b.helpers,f.partials=b.partials):(f.helpers=f.merge(b.helpers,c.helpers),a.usePartial&&(f.partials=f.merge(b.partials,c.partials)))},e._child=function(b,c,d,e){if(a.useBlockParams&&!d)throw new m("must pass block params");if(a.useDepths&&!e)throw new m("must pass parent depths");return g(f,b,a[b],c,0,d,e)},e}function g(a,b,c,d,e,f,g){function h(b){var e=void 0===arguments[1]?{}:arguments[1];return c.call(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),g&&[b].concat(g))}return h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function h(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a=c.partials[c.name],a}function i(a,b,c){if(c.partial=!0,void 0===a)throw new m("The partial "+c.name+" could not be found");return a instanceof Function?a(b,c):void 0}function j(){return""}function k(a,b){return b&&"root"in b||(b=b?d.createFrame(b):{},b.root=a),b}var l=function(a){return a&&a.__esModule?a["default"]:a};a.__esModule=!0,a.checkRevision=e,a.template=f,a.wrapProgram=g,a.resolvePartial=h,a.invokePartial=i,a.noop=j;var m=l(c)}),define("handlebars/no-conflict",["exports","module"],function(a,b){b.exports=function(a){var b="undefined"!=typeof global?global:window,c=b.Handlebars;a.noConflict=function(){b.Handlebars===a&&(b.Handlebars=c)}}}),define("handlebars.runtime",["exports","module","./handlebars/base","./handlebars/safe-string","./handlebars/exception","./handlebars/utils","./handlebars/runtime","./handlebars/no-conflict"],function(a,b,c,d,e,f,g,h){function i(){var a=new c.HandlebarsEnvironment;return f.extend(a,c),a.SafeString=k,a.Exception=l,a.Utils=f,a.escapeExpression=f.escapeExpression,a.VM=g,a.template=function(b){return g.template(b,a)},a}var j=function(a){return a&&a.__esModule?a["default"]:a},k=j(d),l=j(e),m=j(h),n=i();n.create=i,m(n),n["default"]=n,b.exports=n}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.js deleted file mode 100644 index 2263826..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.js +++ /dev/null @@ -1,881 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define(factory); - else if(typeof exports === 'object') - exports["Handlebars"] = factory(); - else - root["Handlebars"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; - -/******/ // The require function -/******/ function __webpack_require__(moduleId) { - -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; - -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; - -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - -/******/ // Flag the module as loaded -/******/ module.loaded = true; - -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } - - -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; - -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; - -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; - -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(7)['default']; - - exports.__esModule = true; - - var _import = __webpack_require__(1); - - var base = _interopRequireWildcard(_import); - - // Each of these augment the Handlebars object. No need to setup here. - // (This is done to easily share code between commonjs and browse envs) - - var _SafeString = __webpack_require__(2); - - var _SafeString2 = _interopRequireWildcard(_SafeString); - - var _Exception = __webpack_require__(3); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _import2 = __webpack_require__(4); - - var Utils = _interopRequireWildcard(_import2); - - var _import3 = __webpack_require__(5); - - var runtime = _interopRequireWildcard(_import3); - - var _noConflict = __webpack_require__(6); - - var _noConflict2 = _interopRequireWildcard(_noConflict); - - // For compatibility and usage outside of module systems, make the Handlebars object a namespace - function create() { - var hb = new base.HandlebarsEnvironment(); - - Utils.extend(hb, base); - hb.SafeString = _SafeString2['default']; - hb.Exception = _Exception2['default']; - hb.Utils = Utils; - hb.escapeExpression = Utils.escapeExpression; - - hb.VM = runtime; - hb.template = function (spec) { - return runtime.template(spec, hb); - }; - - return hb; - } - - var inst = create(); - inst.create = create; - - _noConflict2['default'](inst); - - inst['default'] = inst; - - exports['default'] = inst; - module.exports = exports['default']; - -/***/ }, -/* 1 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(7)['default']; - - exports.__esModule = true; - exports.HandlebarsEnvironment = HandlebarsEnvironment; - exports.createFrame = createFrame; - - var _import = __webpack_require__(4); - - var Utils = _interopRequireWildcard(_import); - - var _Exception = __webpack_require__(3); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var VERSION = '3.0.1'; - exports.VERSION = VERSION; - var COMPILER_REVISION = 6; - - exports.COMPILER_REVISION = COMPILER_REVISION; - var REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' - }; - - exports.REVISION_CHANGES = REVISION_CHANGES; - var isArray = Utils.isArray, - isFunction = Utils.isFunction, - toString = Utils.toString, - objectType = '[object Object]'; - - function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); - } - - HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function registerHelper(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { - throw new _Exception2['default']('Arg not supported with multiple helpers'); - } - Utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function unregisterHelper(name) { - delete this.helpers[name]; - }, - - registerPartial: function registerPartial(name, partial) { - if (toString.call(name) === objectType) { - Utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new _Exception2['default']('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function unregisterPartial(name) { - delete this.partials[name]; - } - }; - - function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function () { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new _Exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function (context, options) { - var inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name); - options = { data: data }; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function (context, options) { - if (!options) { - throw new _Exception2['default']('Must pass iterator to #each'); - } - - var fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data = undefined, - contextPath = undefined; - - if (options.data && options.ids) { - contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { - context = context.call(this); - } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: Utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (var j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - var priorKey = undefined; - - for (var key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function (conditional, options) { - if (isFunction(conditional)) { - conditional = conditional.call(this); - } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if (!options.hash.includeZero && !conditional || Utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function (conditional, options) { - return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); - }); - - instance.registerHelper('with', function (context, options) { - if (isFunction(context)) { - context = context.call(this); - } - - var fn = options.fn; - - if (!Utils.isEmpty(context)) { - if (options.data && options.ids) { - var data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = { data: data }; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function (message, options) { - var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function (obj, field) { - return obj && obj[field]; - }); - } - - var logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function log(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - var method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } - }; - - exports.logger = logger; - var log = logger.log; - - exports.log = log; - - function createFrame(object) { - var frame = Utils.extend({}, object); - frame._parent = object; - return frame; - } - - /* [args, ]options */ - -/***/ }, -/* 2 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - // Build out our basic SafeString type - function SafeString(string) { - this.string = string; - } - - SafeString.prototype.toString = SafeString.prototype.toHTML = function () { - return '' + this.string; - }; - - exports['default'] = SafeString; - module.exports = exports['default']; - -/***/ }, -/* 3 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - - var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - - function Exception(message, node) { - var loc = node && node.loc, - line = undefined, - column = undefined; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - var tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (var idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } - } - - Exception.prototype = new Error(); - - exports['default'] = Exception; - module.exports = exports['default']; - -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - exports.__esModule = true; - exports.extend = extend; - - // Older IE versions do not directly support indexOf so we must implement our own, sadly. - exports.indexOf = indexOf; - exports.escapeExpression = escapeExpression; - exports.isEmpty = isEmpty; - exports.blockParams = blockParams; - exports.appendContextPath = appendContextPath; - var escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '`': '`' - }; - - var badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - - function escapeChar(chr) { - return escape[chr]; - } - - function extend(obj /* , ...source */) { - for (var i = 1; i < arguments.length; i++) { - for (var key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; - } - - var toString = Object.prototype.toString; - - exports.toString = toString; - // Sourced from lodash - // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt - /*eslint-disable func-style, no-var */ - var isFunction = function isFunction(value) { - return typeof value === 'function'; - }; - // fallback for older versions of Chrome and Safari - /* istanbul ignore next */ - if (isFunction(/x/)) { - exports.isFunction = isFunction = function (value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; - } - var isFunction; - exports.isFunction = isFunction; - /*eslint-enable func-style, no-var */ - - /* istanbul ignore next */ - var isArray = Array.isArray || function (value) { - return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; - };exports.isArray = isArray; - - function indexOf(array, value) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; - } - - function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { - return string; - } - return string.replace(badChars, escapeChar); - } - - function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } - } - - function blockParams(params, ids) { - params.path = ids; - return params; - } - - function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; - } - -/***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var _interopRequireWildcard = __webpack_require__(7)['default']; - - exports.__esModule = true; - exports.checkRevision = checkRevision; - - // TODO: Remove this line and break up compilePartial - - exports.template = template; - exports.wrapProgram = wrapProgram; - exports.resolvePartial = resolvePartial; - exports.invokePartial = invokePartial; - exports.noop = noop; - - var _import = __webpack_require__(4); - - var Utils = _interopRequireWildcard(_import); - - var _Exception = __webpack_require__(3); - - var _Exception2 = _interopRequireWildcard(_Exception); - - var _COMPILER_REVISION$REVISION_CHANGES$createFrame = __webpack_require__(1); - - function checkRevision(compilerInfo) { - var compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = _COMPILER_REVISION$REVISION_CHANGES$createFrame.COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - var runtimeVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[currentRevision], - compilerVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[compilerRevision]; - throw new _Exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new _Exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } - } - - function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new _Exception2['default']('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new _Exception2['default']('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = Utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - var result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - var lines = result.split('\n'); - for (var i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new _Exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - var container = { - strict: function strict(obj, name) { - if (!(name in obj)) { - throw new _Exception2['default']('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function lookup(depths, name) { - var len = depths.length; - for (var i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function lambda(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: Utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function fn(i) { - return templateSpec[i]; - }, - - programs: [], - program: function program(i, data, declaredBlockParams, blockParams, depths) { - var programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function data(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function merge(param, common) { - var obj = param || common; - - if (param && common && param !== common) { - obj = Utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - var data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - var depths = undefined, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function (options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function (i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new _Exception2['default']('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new _Exception2['default']('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; - } - - function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context) { - var options = arguments[1] === undefined ? {} : arguments[1]; - - return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; - } - - function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; - } - - function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new _Exception2['default']('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } - } - - function noop() { - return ''; - } - - function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? _COMPILER_REVISION$REVISION_CHANGES$createFrame.createFrame(data) : {}; - data.root = context; - } - return data; - } - -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { - - /* WEBPACK VAR INJECTION */(function(global) {'use strict'; - - exports.__esModule = true; - /*global window */ - - exports['default'] = function (Handlebars) { - /* istanbul ignore next */ - var root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function () { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; - }; - - module.exports = exports['default']; - /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) - -/***/ }, -/* 7 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - exports["default"] = function (obj) { - return obj && obj.__esModule ? obj : { - "default": obj - }; - }; - - exports.__esModule = true; - -/***/ } -/******/ ]) -}); -; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.min.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.min.js deleted file mode 100644 index 9571216..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/dist/handlebars.runtime.min.js +++ /dev/null @@ -1,27 +0,0 @@ -/*! - - handlebars v3.0.3 - -Copyright (C) 2011-2014 by Yehuda Katz - -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. - -@license -*/ -!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=new g.HandlebarsEnvironment;return m.extend(a,g),a.SafeString=i["default"],a.Exception=k["default"],a.Utils=m,a.escapeExpression=m.escapeExpression,a.VM=o,a.template=function(b){return o.template(b,a)},a}var e=c(7)["default"];b.__esModule=!0;var f=c(1),g=e(f),h=c(2),i=e(h),j=c(3),k=e(j),l=c(4),m=e(l),n=c(5),o=e(n),p=c(6),q=e(p),r=d();r.create=d,q["default"](r),r["default"]=r,b["default"]=r,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){this.helpers=a||{},this.partials=b||{},e(this)}function e(a){a.registerHelper("helperMissing",function(){if(1===arguments.length)return void 0;throw new k["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')}),a.registerHelper("blockHelperMissing",function(b,c){var d=c.inverse,e=c.fn;if(b===!0)return e(this);if(b===!1||null==b)return d(this);if(o(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):d(this);if(c.data&&c.ids){var g=f(c.data);g.contextPath=i.appendContextPath(c.data.contextPath,c.name),c={data:g}}return e(b,c)}),a.registerHelper("each",function(a,b){function c(b,c,e){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!e,l&&(j.contextPath=l+b)),h+=d(a[b],{data:j,blockParams:i.blockParams([a[b],b],[l+b,null])})}if(!b)throw new k["default"]("Must pass iterator to #each");var d=b.fn,e=b.inverse,g=0,h="",j=void 0,l=void 0;if(b.data&&b.ids&&(l=i.appendContextPath(b.data.contextPath,b.ids[0])+"."),p(a)&&(a=a.call(this)),b.data&&(j=f(b.data)),a&&"object"==typeof a)if(o(a))for(var m=a.length;m>g;g++)c(g,g,g===a.length-1);else{var n=void 0;for(var q in a)a.hasOwnProperty(q)&&(n&&c(n,g-1),n=q,g++);n&&c(n,g-1,!0)}return 0===g&&(h=e(this)),h}),a.registerHelper("if",function(a,b){return p(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||i.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,b){p(a)&&(a=a.call(this));var c=b.fn;if(i.isEmpty(a))return b.inverse(this);if(b.data&&b.ids){var d=f(b.data);d.contextPath=i.appendContextPath(b.data.contextPath,b.ids[0]),b={data:d}}return c(a,b)}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)}),a.registerHelper("lookup",function(a,b){return a&&a[b]})}function f(a){var b=i.extend({},a);return b._parent=a,b}var g=c(7)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d,b.createFrame=f;var h=c(4),i=g(h),j=c(3),k=g(j),l="3.0.1";b.VERSION=l;var m=6;b.COMPILER_REVISION=m;var n={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1"};b.REVISION_CHANGES=n;var o=i.isArray,p=i.isFunction,q=i.toString,r="[object Object]";d.prototype={constructor:d,logger:s,log:t,registerHelper:function(a,b){if(q.call(a)===r){if(b)throw new k["default"]("Arg not supported with multiple helpers");i.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(q.call(a)===r)i.extend(this.partials,a);else{if("undefined"==typeof b)throw new k["default"]("Attempting to register a partial as undefined");this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]}};var s={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:1,log:function(a,b){if("undefined"!=typeof console&&s.level<=a){var c=s.methodMap[a];(console[c]||console.log).call(console,b)}}};b.logger=s;var t=s.log;b.log=t},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b){"use strict";function c(a,b){var e=b&&b.loc,f=void 0,g=void 0;e&&(f=e.start.line,g=e.start.column,a+=" - "+f+":"+g);for(var h=Error.prototype.constructor.call(this,a),i=0;ic;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return l.test(a)?a.replace(k,c):a}function g(a){return a||0===a?o(a)&&0===a.length?!0:!1:!0}function h(a,b){return a.path=b,a}function i(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.blockParams=h,b.appendContextPath=i;var j={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},k=/[&<>"'`]/g,l=/[&<>"'`]/,m=Object.prototype.toString;b.toString=m;var n=function(a){return"function"==typeof a};n(/x/)&&(b.isFunction=n=function(a){return"function"==typeof a&&"[object Function]"===m.call(a)});var n;b.isFunction=n;var o=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===m.call(a):!1};b.isArray=o},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=p.COMPILER_REVISION;if(b!==c){if(c>b){var d=p.REVISION_CHANGES[c],e=p.REVISION_CHANGES[b];throw new o["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new o["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=m.extend({},d,e.hash)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;i>h&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new o["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){var c=void 0===arguments[1]?{}:arguments[1],f=c.data;d._setup(c),!c.partial&&a.useData&&(f=j(b,f));var g=void 0,h=a.useBlockParams?[]:void 0;return a.useDepths&&(g=c.depths?[b].concat(c.depths):[b]),a.main.call(e,b,e.helpers,e.partials,f,h,g)}if(!b)throw new o["default"]("No environment passed to template");if(!a||!a.main)throw new o["default"]("Unknown template object: "+typeof a);b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new o["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;c>d;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:m.escapeExpression,invokePartial:c,fn:function(b){return a[b]},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=m.extend({},b,a)),c},noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new o["default"]("must pass block params");if(a.useDepths&&!g)throw new o["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=void 0===arguments[1]?{}:arguments[1];return c.call(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),g&&[b].concat(g))}return h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a=c.partials[c.name],a}function h(a,b,c){if(c.partial=!0,void 0===a)throw new o["default"]("The partial "+c.name+" could not be found");return a instanceof Function?a(b,c):void 0}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?p.createFrame(b):{},b.root=a),b}var k=c(7)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var l=c(4),m=k(l),n=c(3),o=k(n),p=c(1)},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){b.Handlebars===a&&(b.Handlebars=d)}},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0}])}); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/docs/compiler-api.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/docs/compiler-api.md deleted file mode 100644 index c09414f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/docs/compiler-api.md +++ /dev/null @@ -1,276 +0,0 @@ -# Handlebars Compiler APIs - -There are a number of formal APIs that tool implementors may interact with. - -## AST - -Other tools may interact with the formal AST as defined below. Any JSON structure matching this pattern may be used and passed into the `compile` and `precompile` methods in the same way as the text for a template. - -AST structures may be generated either with the `Handlebars.parse` method and then manipulated, via the `Handlebars.AST` objects of the same name, or constructed manually as a generic JavaScript object matching the structure defined below. - -```javascript -var ast = Handlebars.parse(myTemplate); - -// Modify ast - -Handlebars.precompile(ast); -``` - - -### Basic - -```java -interface Node { - type: string; - loc: SourceLocation | null; -} - -interface SourceLocation { - source: string | null; - start: Position; - end: Position; -} - -interface Position { - line: uint >= 1; - column: uint >= 0; -} -``` - -### Programs - -```java -interface Program <: Node { - type: "Program"; - body: [ Statement ]; - - blockParams: [ string ]; -} -``` - -### Statements - -```java -interface Statement <: Node { } - -interface MustacheStatement <: Statement { - type: "MustacheStatement"; - - path: PathExpression | Literal; - params: [ Expression ]; - hash: Hash; - - escaped: boolean; - strip: StripFlags | null; -} - -interface BlockStatement <: Statement { - type: "BlockStatement"; - path: PathExpression; - params: [ Expression ]; - hash: Hash; - - program: Program | null; - inverse: Program | null; - - openStrip: StripFlags | null; - inverseStrip: StripFlags | null; - closeStrip: StripFlags | null; -} - -interface PartialStatement <: Statement { - type: "PartialStatement"; - name: PathExpression | SubExpression; - params: [ Expression ]; - hash: Hash; - - indent: string; - strip: StripFlags | null; -} -``` - -`name` will be a `SubExpression` when tied to a dynamic partial, i.e. `{{> (foo) }}`, otherwise this is a path or literal whose `original` value is used to lookup the desired partial. - - -```java -interface ContentStatement <: Statement { - type: "ContentStatement"; - value: string; - original: string; -} - -interface CommentStatement <: Statement { - type: "CommentStatement"; - value: string; - - strip: StripFlags | null; -} -``` - -### Expressions - -```java -interface Expression <: Node { } -``` - -##### SubExpressions - -```java -interface SubExpression <: Expression { - type: "SubExpression"; - path: PathExpression; - params: [ Expression ]; - hash: Hash; -} -``` - -##### Paths - -```java -interface PathExpression <: Expression { - type: "PathExpression"; - data: boolean; - depth: uint >= 0; - parts: [ string ]; - original: string; -} -``` - -- `data` is true when the given expression is a `@data` reference. -- `depth` is an integer representation of which context the expression references. `0` represents the current context, `1` would be `../`, etc. -- `parts` is an array of the names in the path. `foo.bar` would be `['foo', 'bar']`. Scope references, `.`, `..`, and `this` should be omitted from this array. -- `original` is the path as entered by the user. Separator and scope references are left untouched. - - -##### Literals - -```java -interface Literal <: Expression { } - -interface StringLiteral <: Literal { - type: "StringLiteral"; - value: string; - original: string; -} - -interface BooleanLiteral <: Literal { - type: "BooleanLiteral"; - value: boolean; - original: boolean; -} - -interface NumberLiteral <: Literal { - type: "NumberLiteral"; - value: number; - original: number; -} - -interface UndefinedLiteral <: Literal { - type: "UndefinedLiteral"; -} - -interface NullLiteral <: Literal { - type: "NullLiteral"; -} -``` - - -### Miscellaneous - -```java -interface Hash <: Node { - type: "Hash"; - pairs: [ HashPair ]; -} - -interface HashPair <: Node { - type: "HashPair"; - key: string; - value: Expression; -} - -interface StripFlags { - open: boolean; - close: boolean; -} -``` - -`StripFlags` are used to signify whitespace control character that may have been entered on a given statement. - -## AST Visitor - -`Handlebars.Visitor` is available as a base class for general interaction with AST structures. This will by default traverse the entire tree and individual methods may be overridden to provide specific responses to particular nodes. - -Recording all referenced partial names: - -```javascript -var Visitor = Handlebars.Visitor; - -function ImportScanner() { - this.partials = []; -} -ImportScanner.prototype = new Visitor(); - -ImportScanner.prototype.PartialStatement = function(partial) { - this.partials.push({request: partial.name.original}); - - Visitor.prototype.PartialStatement.call(this, partial); -}; - -var scanner = new ImportScanner(); -scanner.accept(ast); -``` - -The current node's ancestors will be maintained in the `parents` array, with the most recent parent listed first. - -The visitor may also be configured to operate in mutation mode by setting the `mutation` field to true. When in this mode, handler methods may return any valid AST node and it will replace the one they are currently operating on. Returning `false` will remove the given value (if valid) and returning `undefined` will leave the node in tact. This return structure only apply to mutation mode and non-mutation mode visitors are free to return whatever values they wish. - -Implementors that may need to support mutation mode are encouraged to utilize the `acceptKey`, `acceptRequired` and `acceptArray` helpers which provide the conditional overwrite behavior as well as implement sanity checks where pertinent. - -## JavaScript Compiler - -The `Handlebars.JavaScriptCompiler` object has a number of methods that may be customized to alter the output of the compiler: - -- `nameLookup(parent, name, type)` - Used to generate the code to resolve a give path component. - - - `parent` is the existing code in the path resolution - - `name` is the current path component - - `type` is the type of name being evaluated. May be one of `context`, `data`, `helper`, or `partial`. - - Note that this does not impact dynamic partials, which implementors need to be aware of. Overriding `VM.resolvePartial` may be required to support dynamic cases. - -- `depthedLookup(name)` - Used to generate code that resolves parameters within any context in the stack. Is only used in `compat` mode. - -- `compilerInfo()` - Allows for custom compiler flags used in the runtime version checking logic. - -- `appendToBuffer(source, location, explicit)` - Allows for code buffer emitting code. Defaults behavior is string concatenation. - - - `source` is the source code whose result is to be appending - - `location` is the location of the source in the source map. - - `explicit` is a flag signaling that the emit operation must occur, vs. the lazy evaled options otherwise. - -- `initializeBuffer()` - Allows for buffers other than the default string buffer to be used. Generally needs to be paired with a custom `appendToBuffer` implementation. - -```javascript -function MyCompiler() { - Handlebars.JavaScriptCompiler.apply(this, arguments); -} -MyCompiler.prototype = Object.create(Handlebars.JavaScriptCompiler); - -MyCompiler.nameLookup = function(parent, name, type) { - if (type === 'partial') { - return 'MyPartialList[' + JSON.stringify(name) ']'; - } else { - return Handlebars.JavaScriptCompiler.prototype.nameLookup.call(this, parent, name, type); - } -}; - -var env = Handlebars.create(); -env.JavaScriptCompiler = MyCompiler; -env.compile('my template'); -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.js deleted file mode 100644 index f114959..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.js +++ /dev/null @@ -1,41 +0,0 @@ -import runtime from './handlebars.runtime'; - -// Compiler imports -import AST from './handlebars/compiler/ast'; -import { parser as Parser, parse } from './handlebars/compiler/base'; -import { Compiler, compile, precompile } from './handlebars/compiler/compiler'; -import JavaScriptCompiler from './handlebars/compiler/javascript-compiler'; -import Visitor from './handlebars/compiler/visitor'; - -import noConflict from './handlebars/no-conflict'; - -let _create = runtime.create; -function create() { - let hb = _create(); - - hb.compile = function(input, options) { - return compile(input, options, hb); - }; - hb.precompile = function(input, options) { - return precompile(input, options, hb); - }; - - hb.AST = AST; - hb.Compiler = Compiler; - hb.JavaScriptCompiler = JavaScriptCompiler; - hb.Parser = Parser; - hb.parse = parse; - - return hb; -} - -let inst = create(); -inst.create = create; - -noConflict(inst); - -inst.Visitor = Visitor; - -inst['default'] = inst; - -export default inst; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.runtime.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.runtime.js deleted file mode 100644 index 3d05b54..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars.runtime.js +++ /dev/null @@ -1,37 +0,0 @@ -import * as base from './handlebars/base'; - -// Each of these augment the Handlebars object. No need to setup here. -// (This is done to easily share code between commonjs and browse envs) -import SafeString from './handlebars/safe-string'; -import Exception from './handlebars/exception'; -import * as Utils from './handlebars/utils'; -import * as runtime from './handlebars/runtime'; - -import noConflict from './handlebars/no-conflict'; - -// For compatibility and usage outside of module systems, make the Handlebars object a namespace -function create() { - let hb = new base.HandlebarsEnvironment(); - - Utils.extend(hb, base); - hb.SafeString = SafeString; - hb.Exception = Exception; - hb.Utils = Utils; - hb.escapeExpression = Utils.escapeExpression; - - hb.VM = runtime; - hb.template = function(spec) { - return runtime.template(spec, hb); - }; - - return hb; -} - -let inst = create(); -inst.create = create; - -noConflict(inst); - -inst['default'] = inst; - -export default inst; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/base.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/base.js deleted file mode 100644 index cfe1e91..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/base.js +++ /dev/null @@ -1,244 +0,0 @@ -import * as Utils from './utils'; -import Exception from './exception'; - -export const VERSION = '3.0.1'; -export const COMPILER_REVISION = 6; - -export const REVISION_CHANGES = { - 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it - 2: '== 1.0.0-rc.3', - 3: '== 1.0.0-rc.4', - 4: '== 1.x.x', - 5: '== 2.0.0-alpha.x', - 6: '>= 2.0.0-beta.1' -}; - -const isArray = Utils.isArray, - isFunction = Utils.isFunction, - toString = Utils.toString, - objectType = '[object Object]'; - -export function HandlebarsEnvironment(helpers, partials) { - this.helpers = helpers || {}; - this.partials = partials || {}; - - registerDefaultHelpers(this); -} - -HandlebarsEnvironment.prototype = { - constructor: HandlebarsEnvironment, - - logger: logger, - log: log, - - registerHelper: function(name, fn) { - if (toString.call(name) === objectType) { - if (fn) { throw new Exception('Arg not supported with multiple helpers'); } - Utils.extend(this.helpers, name); - } else { - this.helpers[name] = fn; - } - }, - unregisterHelper: function(name) { - delete this.helpers[name]; - }, - - registerPartial: function(name, partial) { - if (toString.call(name) === objectType) { - Utils.extend(this.partials, name); - } else { - if (typeof partial === 'undefined') { - throw new Exception('Attempting to register a partial as undefined'); - } - this.partials[name] = partial; - } - }, - unregisterPartial: function(name) { - delete this.partials[name]; - } -}; - -function registerDefaultHelpers(instance) { - instance.registerHelper('helperMissing', function(/* [args, ]options */) { - if (arguments.length === 1) { - // A missing field in a {{foo}} constuct. - return undefined; - } else { - // Someone is actually trying to call something, blow up. - throw new Exception('Missing helper: "' + arguments[arguments.length - 1].name + '"'); - } - }); - - instance.registerHelper('blockHelperMissing', function(context, options) { - let inverse = options.inverse, - fn = options.fn; - - if (context === true) { - return fn(this); - } else if (context === false || context == null) { - return inverse(this); - } else if (isArray(context)) { - if (context.length > 0) { - if (options.ids) { - options.ids = [options.name]; - } - - return instance.helpers.each(context, options); - } else { - return inverse(this); - } - } else { - if (options.data && options.ids) { - let data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name); - options = {data: data}; - } - - return fn(context, options); - } - }); - - instance.registerHelper('each', function(context, options) { - if (!options) { - throw new Exception('Must pass iterator to #each'); - } - - let fn = options.fn, - inverse = options.inverse, - i = 0, - ret = '', - data, - contextPath; - - if (options.data && options.ids) { - contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; - } - - if (isFunction(context)) { context = context.call(this); } - - if (options.data) { - data = createFrame(options.data); - } - - function execIteration(field, index, last) { - if (data) { - data.key = field; - data.index = index; - data.first = index === 0; - data.last = !!last; - - if (contextPath) { - data.contextPath = contextPath + field; - } - } - - ret = ret + fn(context[field], { - data: data, - blockParams: Utils.blockParams([context[field], field], [contextPath + field, null]) - }); - } - - if (context && typeof context === 'object') { - if (isArray(context)) { - for (let j = context.length; i < j; i++) { - execIteration(i, i, i === context.length - 1); - } - } else { - let priorKey; - - for (let key in context) { - if (context.hasOwnProperty(key)) { - // We're running the iterations one step out of sync so we can detect - // the last iteration without have to scan the object twice and create - // an itermediate keys array. - if (priorKey) { - execIteration(priorKey, i - 1); - } - priorKey = key; - i++; - } - } - if (priorKey) { - execIteration(priorKey, i - 1, true); - } - } - } - - if (i === 0) { - ret = inverse(this); - } - - return ret; - }); - - instance.registerHelper('if', function(conditional, options) { - if (isFunction(conditional)) { conditional = conditional.call(this); } - - // Default behavior is to render the positive path if the value is truthy and not empty. - // The `includeZero` option may be set to treat the condtional as purely not empty based on the - // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. - if ((!options.hash.includeZero && !conditional) || Utils.isEmpty(conditional)) { - return options.inverse(this); - } else { - return options.fn(this); - } - }); - - instance.registerHelper('unless', function(conditional, options) { - return instance.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn, hash: options.hash}); - }); - - instance.registerHelper('with', function(context, options) { - if (isFunction(context)) { context = context.call(this); } - - let fn = options.fn; - - if (!Utils.isEmpty(context)) { - if (options.data && options.ids) { - let data = createFrame(options.data); - data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]); - options = {data: data}; - } - - return fn(context, options); - } else { - return options.inverse(this); - } - }); - - instance.registerHelper('log', function(message, options) { - let level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1; - instance.log(level, message); - }); - - instance.registerHelper('lookup', function(obj, field) { - return obj && obj[field]; - }); -} - -export let logger = { - methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' }, - - // State enum - DEBUG: 0, - INFO: 1, - WARN: 2, - ERROR: 3, - level: 1, - - // Can be overridden in the host environment - log: function(level, message) { - if (typeof console !== 'undefined' && logger.level <= level) { - let method = logger.methodMap[level]; - (console[method] || console.log).call(console, message); // eslint-disable-line no-console - } - } -}; - -export let log = logger.log; - -export function createFrame(object) { - let frame = Utils.extend({}, object); - frame._parent = object; - return frame; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/ast.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/ast.js deleted file mode 100644 index 08b127f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/ast.js +++ /dev/null @@ -1,152 +0,0 @@ -let AST = { - Program: function(statements, blockParams, strip, locInfo) { - this.loc = locInfo; - this.type = 'Program'; - this.body = statements; - - this.blockParams = blockParams; - this.strip = strip; - }, - - MustacheStatement: function(path, params, hash, escaped, strip, locInfo) { - this.loc = locInfo; - this.type = 'MustacheStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.escaped = escaped; - - this.strip = strip; - }, - - BlockStatement: function(path, params, hash, program, inverse, openStrip, inverseStrip, closeStrip, locInfo) { - this.loc = locInfo; - this.type = 'BlockStatement'; - - this.path = path; - this.params = params || []; - this.hash = hash; - this.program = program; - this.inverse = inverse; - - this.openStrip = openStrip; - this.inverseStrip = inverseStrip; - this.closeStrip = closeStrip; - }, - - PartialStatement: function(name, params, hash, strip, locInfo) { - this.loc = locInfo; - this.type = 'PartialStatement'; - - this.name = name; - this.params = params || []; - this.hash = hash; - - this.indent = ''; - this.strip = strip; - }, - - ContentStatement: function(string, locInfo) { - this.loc = locInfo; - this.type = 'ContentStatement'; - this.original = this.value = string; - }, - - CommentStatement: function(comment, strip, locInfo) { - this.loc = locInfo; - this.type = 'CommentStatement'; - this.value = comment; - - this.strip = strip; - }, - - SubExpression: function(path, params, hash, locInfo) { - this.loc = locInfo; - - this.type = 'SubExpression'; - this.path = path; - this.params = params || []; - this.hash = hash; - }, - - PathExpression: function(data, depth, parts, original, locInfo) { - this.loc = locInfo; - this.type = 'PathExpression'; - - this.data = data; - this.original = original; - this.parts = parts; - this.depth = depth; - }, - - StringLiteral: function(string, locInfo) { - this.loc = locInfo; - this.type = 'StringLiteral'; - this.original = - this.value = string; - }, - - NumberLiteral: function(number, locInfo) { - this.loc = locInfo; - this.type = 'NumberLiteral'; - this.original = - this.value = Number(number); - }, - - BooleanLiteral: function(bool, locInfo) { - this.loc = locInfo; - this.type = 'BooleanLiteral'; - this.original = - this.value = bool === 'true'; - }, - - UndefinedLiteral: function(locInfo) { - this.loc = locInfo; - this.type = 'UndefinedLiteral'; - this.original = this.value = undefined; - }, - - NullLiteral: function(locInfo) { - this.loc = locInfo; - this.type = 'NullLiteral'; - this.original = this.value = null; - }, - - Hash: function(pairs, locInfo) { - this.loc = locInfo; - this.type = 'Hash'; - this.pairs = pairs; - }, - HashPair: function(key, value, locInfo) { - this.loc = locInfo; - this.type = 'HashPair'; - this.key = key; - this.value = value; - }, - - // Public API used to evaluate derived attributes regarding AST nodes - helpers: { - // a mustache is definitely a helper if: - // * it is an eligible helper, and - // * it has at least one parameter or hash segment - helperExpression: function(node) { - return !!(node.type === 'SubExpression' || node.params.length || node.hash); - }, - - scopedId: function(path) { - return (/^\.|this\b/).test(path.original); - }, - - // an ID is simple if it only has one part, and that part is not - // `..` or `this`. - simpleId: function(path) { - return path.parts.length === 1 && !AST.helpers.scopedId(path) && !path.depth; - } - } -}; - - -// Must be exported as an object rather than the root of the module as the jison lexer -// must modify the object to operate properly. -export default AST; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/base.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/base.js deleted file mode 100644 index 7075d9b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/base.js +++ /dev/null @@ -1,25 +0,0 @@ -import parser from './parser'; -import AST from './ast'; -import WhitespaceControl from './whitespace-control'; -import * as Helpers from './helpers'; -import { extend } from '../utils'; - -export { parser }; - -let yy = {}; -extend(yy, Helpers, AST); - -export function parse(input, options) { - // Just return if an already-compiled AST was passed in. - if (input.type === 'Program') { return input; } - - parser.yy = yy; - - // Altering the shared object here, but this is ok as parser is a sync operation - yy.locInfo = function(locInfo) { - return new yy.SourceLocation(options && options.srcName, locInfo); - }; - - let strip = new WhitespaceControl(); - return strip.accept(parser.parse(input)); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/code-gen.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/code-gen.js deleted file mode 100644 index bc7bc07..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/code-gen.js +++ /dev/null @@ -1,164 +0,0 @@ -/*global define */ -import {isArray} from '../utils'; - -let SourceNode; - -try { - /* istanbul ignore next */ - if (typeof define !== 'function' || !define.amd) { - // We don't support this in AMD environments. For these environments, we asusme that - // they are running on the browser and thus have no need for the source-map library. - let SourceMap = require('source-map'); - SourceNode = SourceMap.SourceNode; - } -} catch (err) { - /* NOP */ -} - -/* istanbul ignore if: tested but not covered in istanbul due to dist build */ -if (!SourceNode) { - SourceNode = function(line, column, srcFile, chunks) { - this.src = ''; - if (chunks) { - this.add(chunks); - } - }; - /* istanbul ignore next */ - SourceNode.prototype = { - add: function(chunks) { - if (isArray(chunks)) { - chunks = chunks.join(''); - } - this.src += chunks; - }, - prepend: function(chunks) { - if (isArray(chunks)) { - chunks = chunks.join(''); - } - this.src = chunks + this.src; - }, - toStringWithSourceMap: function() { - return {code: this.toString()}; - }, - toString: function() { - return this.src; - } - }; -} - - -function castChunk(chunk, codeGen, loc) { - if (isArray(chunk)) { - let ret = []; - - for (let i = 0, len = chunk.length; i < len; i++) { - ret.push(codeGen.wrap(chunk[i], loc)); - } - return ret; - } else if (typeof chunk === 'boolean' || typeof chunk === 'number') { - // Handle primitives that the SourceNode will throw up on - return chunk + ''; - } - return chunk; -} - - -function CodeGen(srcFile) { - this.srcFile = srcFile; - this.source = []; -} - -CodeGen.prototype = { - prepend: function(source, loc) { - this.source.unshift(this.wrap(source, loc)); - }, - push: function(source, loc) { - this.source.push(this.wrap(source, loc)); - }, - - merge: function() { - let source = this.empty(); - this.each(function(line) { - source.add([' ', line, '\n']); - }); - return source; - }, - - each: function(iter) { - for (let i = 0, len = this.source.length; i < len; i++) { - iter(this.source[i]); - } - }, - - empty: function(loc = this.currentLocation || {start: {}}) { - return new SourceNode(loc.start.line, loc.start.column, this.srcFile); - }, - wrap: function(chunk, loc = this.currentLocation || {start: {}}) { - if (chunk instanceof SourceNode) { - return chunk; - } - - chunk = castChunk(chunk, this, loc); - - return new SourceNode(loc.start.line, loc.start.column, this.srcFile, chunk); - }, - - functionCall: function(fn, type, params) { - params = this.generateList(params); - return this.wrap([fn, type ? '.' + type + '(' : '(', params, ')']); - }, - - quotedString: function(str) { - return '"' + (str + '') - .replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') - .replace(/\u2028/g, '\\u2028') // Per Ecma-262 7.3 + 7.8.4 - .replace(/\u2029/g, '\\u2029') + '"'; - }, - - objectLiteral: function(obj) { - let pairs = []; - - for (let key in obj) { - if (obj.hasOwnProperty(key)) { - let value = castChunk(obj[key], this); - if (value !== 'undefined') { - pairs.push([this.quotedString(key), ':', value]); - } - } - } - - let ret = this.generateList(pairs); - ret.prepend('{'); - ret.add('}'); - return ret; - }, - - - generateList: function(entries, loc) { - let ret = this.empty(loc); - - for (let i = 0, len = entries.length; i < len; i++) { - if (i) { - ret.add(','); - } - - ret.add(castChunk(entries[i], this, loc)); - } - - return ret; - }, - - generateArray: function(entries, loc) { - let ret = this.generateList(entries, loc); - ret.prepend('['); - ret.add(']'); - - return ret; - } -}; - -export default CodeGen; - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/compiler.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/compiler.js deleted file mode 100644 index 4575421..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/compiler.js +++ /dev/null @@ -1,513 +0,0 @@ -import Exception from '../exception'; -import {isArray, indexOf} from '../utils'; -import AST from './ast'; - -const slice = [].slice; - -export function Compiler() {} - -// the foundHelper register will disambiguate helper lookup from finding a -// function in a context. This is necessary for mustache compatibility, which -// requires that context functions in blocks are evaluated by blockHelperMissing, -// and then proceed as if the resulting value was provided to blockHelperMissing. - -Compiler.prototype = { - compiler: Compiler, - - equals: function(other) { - let len = this.opcodes.length; - if (other.opcodes.length !== len) { - return false; - } - - for (let i = 0; i < len; i++) { - let opcode = this.opcodes[i], - otherOpcode = other.opcodes[i]; - if (opcode.opcode !== otherOpcode.opcode || !argEquals(opcode.args, otherOpcode.args)) { - return false; - } - } - - // We know that length is the same between the two arrays because they are directly tied - // to the opcode behavior above. - len = this.children.length; - for (let i = 0; i < len; i++) { - if (!this.children[i].equals(other.children[i])) { - return false; - } - } - - return true; - }, - - guid: 0, - - compile: function(program, options) { - this.sourceNode = []; - this.opcodes = []; - this.children = []; - this.options = options; - this.stringParams = options.stringParams; - this.trackIds = options.trackIds; - - options.blockParams = options.blockParams || []; - - // These changes will propagate to the other compiler components - let knownHelpers = options.knownHelpers; - options.knownHelpers = { - 'helperMissing': true, - 'blockHelperMissing': true, - 'each': true, - 'if': true, - 'unless': true, - 'with': true, - 'log': true, - 'lookup': true - }; - if (knownHelpers) { - for (let name in knownHelpers) { - if (name in knownHelpers) { - options.knownHelpers[name] = knownHelpers[name]; - } - } - } - - return this.accept(program); - }, - - compileProgram: function(program) { - let childCompiler = new this.compiler(), // eslint-disable-line new-cap - result = childCompiler.compile(program, this.options), - guid = this.guid++; - - this.usePartial = this.usePartial || result.usePartial; - - this.children[guid] = result; - this.useDepths = this.useDepths || result.useDepths; - - return guid; - }, - - accept: function(node) { - this.sourceNode.unshift(node); - let ret = this[node.type](node); - this.sourceNode.shift(); - return ret; - }, - - Program: function(program) { - this.options.blockParams.unshift(program.blockParams); - - let body = program.body, - bodyLength = body.length; - for (let i = 0; i < bodyLength; i++) { - this.accept(body[i]); - } - - this.options.blockParams.shift(); - - this.isSimple = bodyLength === 1; - this.blockParams = program.blockParams ? program.blockParams.length : 0; - - return this; - }, - - BlockStatement: function(block) { - transformLiteralToPath(block); - - let program = block.program, - inverse = block.inverse; - - program = program && this.compileProgram(program); - inverse = inverse && this.compileProgram(inverse); - - let type = this.classifySexpr(block); - - if (type === 'helper') { - this.helperSexpr(block, program, inverse); - } else if (type === 'simple') { - this.simpleSexpr(block); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('blockValue', block.path.original); - } else { - this.ambiguousSexpr(block, program, inverse); - - // now that the simple mustache is resolved, we need to - // evaluate it by executing `blockHelperMissing` - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - this.opcode('emptyHash'); - this.opcode('ambiguousBlockValue'); - } - - this.opcode('append'); - }, - - PartialStatement: function(partial) { - this.usePartial = true; - - let params = partial.params; - if (params.length > 1) { - throw new Exception('Unsupported number of partial arguments: ' + params.length, partial); - } else if (!params.length) { - params.push({type: 'PathExpression', parts: [], depth: 0}); - } - - let partialName = partial.name.original, - isDynamic = partial.name.type === 'SubExpression'; - if (isDynamic) { - this.accept(partial.name); - } - - this.setupFullMustacheParams(partial, undefined, undefined, true); - - let indent = partial.indent || ''; - if (this.options.preventIndent && indent) { - this.opcode('appendContent', indent); - indent = ''; - } - - this.opcode('invokePartial', isDynamic, partialName, indent); - this.opcode('append'); - }, - - MustacheStatement: function(mustache) { - this.SubExpression(mustache); // eslint-disable-line new-cap - - if (mustache.escaped && !this.options.noEscape) { - this.opcode('appendEscaped'); - } else { - this.opcode('append'); - } - }, - - ContentStatement: function(content) { - if (content.value) { - this.opcode('appendContent', content.value); - } - }, - - CommentStatement: function() {}, - - SubExpression: function(sexpr) { - transformLiteralToPath(sexpr); - let type = this.classifySexpr(sexpr); - - if (type === 'simple') { - this.simpleSexpr(sexpr); - } else if (type === 'helper') { - this.helperSexpr(sexpr); - } else { - this.ambiguousSexpr(sexpr); - } - }, - ambiguousSexpr: function(sexpr, program, inverse) { - let path = sexpr.path, - name = path.parts[0], - isBlock = program != null || inverse != null; - - this.opcode('getContext', path.depth); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - this.accept(path); - - this.opcode('invokeAmbiguous', name, isBlock); - }, - - simpleSexpr: function(sexpr) { - this.accept(sexpr.path); - this.opcode('resolvePossibleLambda'); - }, - - helperSexpr: function(sexpr, program, inverse) { - let params = this.setupFullMustacheParams(sexpr, program, inverse), - path = sexpr.path, - name = path.parts[0]; - - if (this.options.knownHelpers[name]) { - this.opcode('invokeKnownHelper', params.length, name); - } else if (this.options.knownHelpersOnly) { - throw new Exception('You specified knownHelpersOnly, but used the unknown helper ' + name, sexpr); - } else { - path.falsy = true; - - this.accept(path); - this.opcode('invokeHelper', params.length, path.original, AST.helpers.simpleId(path)); - } - }, - - PathExpression: function(path) { - this.addDepth(path.depth); - this.opcode('getContext', path.depth); - - let name = path.parts[0], - scoped = AST.helpers.scopedId(path), - blockParamId = !path.depth && !scoped && this.blockParamIndex(name); - - if (blockParamId) { - this.opcode('lookupBlockParam', blockParamId, path.parts); - } else if (!name) { - // Context reference, i.e. `{{foo .}}` or `{{foo ..}}` - this.opcode('pushContext'); - } else if (path.data) { - this.options.data = true; - this.opcode('lookupData', path.depth, path.parts); - } else { - this.opcode('lookupOnContext', path.parts, path.falsy, scoped); - } - }, - - StringLiteral: function(string) { - this.opcode('pushString', string.value); - }, - - NumberLiteral: function(number) { - this.opcode('pushLiteral', number.value); - }, - - BooleanLiteral: function(bool) { - this.opcode('pushLiteral', bool.value); - }, - - UndefinedLiteral: function() { - this.opcode('pushLiteral', 'undefined'); - }, - - NullLiteral: function() { - this.opcode('pushLiteral', 'null'); - }, - - Hash: function(hash) { - let pairs = hash.pairs, - i = 0, - l = pairs.length; - - this.opcode('pushHash'); - - for (; i < l; i++) { - this.pushParam(pairs[i].value); - } - while (i--) { - this.opcode('assignToHash', pairs[i].key); - } - this.opcode('popHash'); - }, - - // HELPERS - opcode: function(name) { - this.opcodes.push({ opcode: name, args: slice.call(arguments, 1), loc: this.sourceNode[0].loc }); - }, - - addDepth: function(depth) { - if (!depth) { - return; - } - - this.useDepths = true; - }, - - classifySexpr: function(sexpr) { - let isSimple = AST.helpers.simpleId(sexpr.path); - - let isBlockParam = isSimple && !!this.blockParamIndex(sexpr.path.parts[0]); - - // a mustache is an eligible helper if: - // * its id is simple (a single part, not `this` or `..`) - let isHelper = !isBlockParam && AST.helpers.helperExpression(sexpr); - - // if a mustache is an eligible helper but not a definite - // helper, it is ambiguous, and will be resolved in a later - // pass or at runtime. - let isEligible = !isBlockParam && (isHelper || isSimple); - - // if ambiguous, we can possibly resolve the ambiguity now - // An eligible helper is one that does not have a complex path, i.e. `this.foo`, `../foo` etc. - if (isEligible && !isHelper) { - let name = sexpr.path.parts[0], - options = this.options; - - if (options.knownHelpers[name]) { - isHelper = true; - } else if (options.knownHelpersOnly) { - isEligible = false; - } - } - - if (isHelper) { - return 'helper'; - } else if (isEligible) { - return 'ambiguous'; - } else { - return 'simple'; - } - }, - - pushParams: function(params) { - for (let i = 0, l = params.length; i < l; i++) { - this.pushParam(params[i]); - } - }, - - pushParam: function(val) { - let value = val.value != null ? val.value : val.original || ''; - - if (this.stringParams) { - if (value.replace) { - value = value - .replace(/^(\.?\.\/)*/g, '') - .replace(/\//g, '.'); - } - - if (val.depth) { - this.addDepth(val.depth); - } - this.opcode('getContext', val.depth || 0); - this.opcode('pushStringParam', value, val.type); - - if (val.type === 'SubExpression') { - // SubExpressions get evaluated and passed in - // in string params mode. - this.accept(val); - } - } else { - if (this.trackIds) { - let blockParamIndex; - if (val.parts && !AST.helpers.scopedId(val) && !val.depth) { - blockParamIndex = this.blockParamIndex(val.parts[0]); - } - if (blockParamIndex) { - let blockParamChild = val.parts.slice(1).join('.'); - this.opcode('pushId', 'BlockParam', blockParamIndex, blockParamChild); - } else { - value = val.original || value; - if (value.replace) { - value = value - .replace(/^\.\//g, '') - .replace(/^\.$/g, ''); - } - - this.opcode('pushId', val.type, value); - } - } - this.accept(val); - } - }, - - setupFullMustacheParams: function(sexpr, program, inverse, omitEmpty) { - let params = sexpr.params; - this.pushParams(params); - - this.opcode('pushProgram', program); - this.opcode('pushProgram', inverse); - - if (sexpr.hash) { - this.accept(sexpr.hash); - } else { - this.opcode('emptyHash', omitEmpty); - } - - return params; - }, - - blockParamIndex: function(name) { - for (let depth = 0, len = this.options.blockParams.length; depth < len; depth++) { - let blockParams = this.options.blockParams[depth], - param = blockParams && indexOf(blockParams, name); - if (blockParams && param >= 0) { - return [depth, param]; - } - } - } -}; - -export function precompile(input, options, env) { - if (input == null || (typeof input !== 'string' && input.type !== 'Program')) { - throw new Exception('You must pass a string or Handlebars AST to Handlebars.precompile. You passed ' + input); - } - - options = options || {}; - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - let ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options); - return new env.JavaScriptCompiler().compile(environment, options); -} - -export function compile(input, options = {}, env) { - if (input == null || (typeof input !== 'string' && input.type !== 'Program')) { - throw new Exception('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input); - } - - if (!('data' in options)) { - options.data = true; - } - if (options.compat) { - options.useDepths = true; - } - - let compiled; - - function compileInput() { - let ast = env.parse(input, options), - environment = new env.Compiler().compile(ast, options), - templateSpec = new env.JavaScriptCompiler().compile(environment, options, undefined, true); - return env.template(templateSpec); - } - - // Template is only compiled on first use and cached after that point. - function ret(context, execOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled.call(this, context, execOptions); - } - ret._setup = function(setupOptions) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._setup(setupOptions); - }; - ret._child = function(i, data, blockParams, depths) { - if (!compiled) { - compiled = compileInput(); - } - return compiled._child(i, data, blockParams, depths); - }; - return ret; -} - -function argEquals(a, b) { - if (a === b) { - return true; - } - - if (isArray(a) && isArray(b) && a.length === b.length) { - for (let i = 0; i < a.length; i++) { - if (!argEquals(a[i], b[i])) { - return false; - } - } - return true; - } -} - -function transformLiteralToPath(sexpr) { - if (!sexpr.path.parts) { - let literal = sexpr.path; - // Casting to string here to make false and 0 literal values play nicely with the rest - // of the system. - sexpr.path = new AST.PathExpression(false, 0, [literal.original + ''], literal.original + '', literal.loc); - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/helpers.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/helpers.js deleted file mode 100644 index fc0120c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/helpers.js +++ /dev/null @@ -1,123 +0,0 @@ -import Exception from '../exception'; - -export function SourceLocation(source, locInfo) { - this.source = source; - this.start = { - line: locInfo.first_line, - column: locInfo.first_column - }; - this.end = { - line: locInfo.last_line, - column: locInfo.last_column - }; -} - -export function id(token) { - if (/^\[.*\]$/.test(token)) { - return token.substr(1, token.length - 2); - } else { - return token; - } -} - -export function stripFlags(open, close) { - return { - open: open.charAt(2) === '~', - close: close.charAt(close.length - 3) === '~' - }; -} - -export function stripComment(comment) { - return comment.replace(/^\{\{~?\!-?-?/, '') - .replace(/-?-?~?\}\}$/, ''); -} - -export function preparePath(data, parts, locInfo) { - locInfo = this.locInfo(locInfo); - - let original = data ? '@' : '', - dig = [], - depth = 0, - depthString = ''; - - for (let i = 0, l = parts.length; i < l; i++) { - let part = parts[i].part, - // If we have [] syntax then we do not treat path references as operators, - // i.e. foo.[this] resolves to approximately context.foo['this'] - isLiteral = parts[i].original !== part; - original += (parts[i].separator || '') + part; - - if (!isLiteral && (part === '..' || part === '.' || part === 'this')) { - if (dig.length > 0) { - throw new Exception('Invalid path: ' + original, {loc: locInfo}); - } else if (part === '..') { - depth++; - depthString += '../'; - } - } else { - dig.push(part); - } - } - - return new this.PathExpression(data, depth, dig, original, locInfo); -} - -export function prepareMustache(path, params, hash, open, strip, locInfo) { - // Must use charAt to support IE pre-10 - let escapeFlag = open.charAt(3) || open.charAt(2), - escaped = escapeFlag !== '{' && escapeFlag !== '&'; - - return new this.MustacheStatement(path, params, hash, escaped, strip, this.locInfo(locInfo)); -} - -export function prepareRawBlock(openRawBlock, content, close, locInfo) { - if (openRawBlock.path.original !== close) { - let errorNode = {loc: openRawBlock.path.loc}; - - throw new Exception(openRawBlock.path.original + " doesn't match " + close, errorNode); - } - - locInfo = this.locInfo(locInfo); - let program = new this.Program([content], null, {}, locInfo); - - return new this.BlockStatement( - openRawBlock.path, openRawBlock.params, openRawBlock.hash, - program, undefined, - {}, {}, {}, - locInfo); -} - -export function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) { - // When we are chaining inverse calls, we will not have a close path - if (close && close.path && openBlock.path.original !== close.path.original) { - let errorNode = {loc: openBlock.path.loc}; - - throw new Exception(openBlock.path.original + ' doesn\'t match ' + close.path.original, errorNode); - } - - program.blockParams = openBlock.blockParams; - - let inverse, - inverseStrip; - - if (inverseAndProgram) { - if (inverseAndProgram.chain) { - inverseAndProgram.program.body[0].closeStrip = close.strip; - } - - inverseStrip = inverseAndProgram.strip; - inverse = inverseAndProgram.program; - } - - if (inverted) { - inverted = inverse; - inverse = program; - program = inverted; - } - - return new this.BlockStatement( - openBlock.path, openBlock.params, openBlock.hash, - program, inverse, - openBlock.strip, inverseStrip, close && close.strip, - this.locInfo(locInfo)); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/javascript-compiler.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/javascript-compiler.js deleted file mode 100644 index 8830661..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/javascript-compiler.js +++ /dev/null @@ -1,1070 +0,0 @@ -import { COMPILER_REVISION, REVISION_CHANGES } from '../base'; -import Exception from '../exception'; -import {isArray} from '../utils'; -import CodeGen from './code-gen'; - -function Literal(value) { - this.value = value; -} - -function JavaScriptCompiler() {} - -JavaScriptCompiler.prototype = { - // PUBLIC API: You can override these methods in a subclass to provide - // alternative compiled forms for name lookup and buffering semantics - nameLookup: function(parent, name /* , type*/) { - if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) { - return [parent, '.', name]; - } else { - return [parent, "['", name, "']"]; - } - }, - depthedLookup: function(name) { - return [this.aliasable('this.lookup'), '(depths, "', name, '")']; - }, - - compilerInfo: function() { - const revision = COMPILER_REVISION, - versions = REVISION_CHANGES[revision]; - return [revision, versions]; - }, - - appendToBuffer: function(source, location, explicit) { - // Force a source as this simplifies the merge logic. - if (!isArray(source)) { - source = [source]; - } - source = this.source.wrap(source, location); - - if (this.environment.isSimple) { - return ['return ', source, ';']; - } else if (explicit) { - // This is a case where the buffer operation occurs as a child of another - // construct, generally braces. We have to explicitly output these buffer - // operations to ensure that the emitted code goes in the correct location. - return ['buffer += ', source, ';']; - } else { - source.appendToBuffer = true; - return source; - } - }, - - initializeBuffer: function() { - return this.quotedString(''); - }, - // END PUBLIC API - - compile: function(environment, options, context, asObject) { - this.environment = environment; - this.options = options; - this.stringParams = this.options.stringParams; - this.trackIds = this.options.trackIds; - this.precompile = !asObject; - - this.name = this.environment.name; - this.isChild = !!context; - this.context = context || { - programs: [], - environments: [] - }; - - this.preamble(); - - this.stackSlot = 0; - this.stackVars = []; - this.aliases = {}; - this.registers = { list: [] }; - this.hashes = []; - this.compileStack = []; - this.inlineStack = []; - this.blockParams = []; - - this.compileChildren(environment, options); - - this.useDepths = this.useDepths || environment.useDepths || this.options.compat; - this.useBlockParams = this.useBlockParams || environment.useBlockParams; - - let opcodes = environment.opcodes, - opcode, - firstLoc, - i, - l; - - for (i = 0, l = opcodes.length; i < l; i++) { - opcode = opcodes[i]; - - this.source.currentLocation = opcode.loc; - firstLoc = firstLoc || opcode.loc; - this[opcode.opcode].apply(this, opcode.args); - } - - // Flush any trailing content that might be pending. - this.source.currentLocation = firstLoc; - this.pushSource(''); - - /* istanbul ignore next */ - if (this.stackSlot || this.inlineStack.length || this.compileStack.length) { - throw new Exception('Compile completed with content left on stack'); - } - - let fn = this.createFunctionContext(asObject); - if (!this.isChild) { - let ret = { - compiler: this.compilerInfo(), - main: fn - }; - let programs = this.context.programs; - for (i = 0, l = programs.length; i < l; i++) { - if (programs[i]) { - ret[i] = programs[i]; - } - } - - if (this.environment.usePartial) { - ret.usePartial = true; - } - if (this.options.data) { - ret.useData = true; - } - if (this.useDepths) { - ret.useDepths = true; - } - if (this.useBlockParams) { - ret.useBlockParams = true; - } - if (this.options.compat) { - ret.compat = true; - } - - if (!asObject) { - ret.compiler = JSON.stringify(ret.compiler); - - this.source.currentLocation = {start: {line: 1, column: 0}}; - ret = this.objectLiteral(ret); - - if (options.srcName) { - ret = ret.toStringWithSourceMap({file: options.destName}); - ret.map = ret.map && ret.map.toString(); - } else { - ret = ret.toString(); - } - } else { - ret.compilerOptions = this.options; - } - - return ret; - } else { - return fn; - } - }, - - preamble: function() { - // track the last context pushed into place to allow skipping the - // getContext opcode when it would be a noop - this.lastContext = 0; - this.source = new CodeGen(this.options.srcName); - }, - - createFunctionContext: function(asObject) { - let varDeclarations = ''; - - let locals = this.stackVars.concat(this.registers.list); - if (locals.length > 0) { - varDeclarations += ', ' + locals.join(', '); - } - - // Generate minimizer alias mappings - // - // When using true SourceNodes, this will update all references to the given alias - // as the source nodes are reused in situ. For the non-source node compilation mode, - // aliases will not be used, but this case is already being run on the client and - // we aren't concern about minimizing the template size. - let aliasCount = 0; - for (let alias in this.aliases) { // eslint-disable-line guard-for-in - let node = this.aliases[alias]; - - if (this.aliases.hasOwnProperty(alias) && node.children && node.referenceCount > 1) { - varDeclarations += ', alias' + (++aliasCount) + '=' + alias; - node.children[0] = 'alias' + aliasCount; - } - } - - let params = ['depth0', 'helpers', 'partials', 'data']; - - if (this.useBlockParams || this.useDepths) { - params.push('blockParams'); - } - if (this.useDepths) { - params.push('depths'); - } - - // Perform a second pass over the output to merge content when possible - let source = this.mergeSource(varDeclarations); - - if (asObject) { - params.push(source); - - return Function.apply(this, params); - } else { - return this.source.wrap(['function(', params.join(','), ') {\n ', source, '}']); - } - }, - mergeSource: function(varDeclarations) { - let isSimple = this.environment.isSimple, - appendOnly = !this.forceBuffer, - appendFirst, - - sourceSeen, - bufferStart, - bufferEnd; - this.source.each((line) => { - if (line.appendToBuffer) { - if (bufferStart) { - line.prepend(' + '); - } else { - bufferStart = line; - } - bufferEnd = line; - } else { - if (bufferStart) { - if (!sourceSeen) { - appendFirst = true; - } else { - bufferStart.prepend('buffer += '); - } - bufferEnd.add(';'); - bufferStart = bufferEnd = undefined; - } - - sourceSeen = true; - if (!isSimple) { - appendOnly = false; - } - } - }); - - - if (appendOnly) { - if (bufferStart) { - bufferStart.prepend('return '); - bufferEnd.add(';'); - } else if (!sourceSeen) { - this.source.push('return "";'); - } - } else { - varDeclarations += ', buffer = ' + (appendFirst ? '' : this.initializeBuffer()); - - if (bufferStart) { - bufferStart.prepend('return buffer + '); - bufferEnd.add(';'); - } else { - this.source.push('return buffer;'); - } - } - - if (varDeclarations) { - this.source.prepend('var ' + varDeclarations.substring(2) + (appendFirst ? '' : ';\n')); - } - - return this.source.merge(); - }, - - // [blockValue] - // - // On stack, before: hash, inverse, program, value - // On stack, after: return value of blockHelperMissing - // - // The purpose of this opcode is to take a block of the form - // `{{#this.foo}}...{{/this.foo}}`, resolve the value of `foo`, and - // replace it on the stack with the result of properly - // invoking blockHelperMissing. - blockValue: function(name) { - let blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs(name, 0, params); - - let blockName = this.popStack(); - params.splice(1, 0, blockName); - - this.push(this.source.functionCall(blockHelperMissing, 'call', params)); - }, - - // [ambiguousBlockValue] - // - // On stack, before: hash, inverse, program, value - // Compiler value, before: lastHelper=value of last found helper, if any - // On stack, after, if no lastHelper: same as [blockValue] - // On stack, after, if lastHelper: value - ambiguousBlockValue: function() { - // We're being a bit cheeky and reusing the options value from the prior exec - let blockHelperMissing = this.aliasable('helpers.blockHelperMissing'), - params = [this.contextName(0)]; - this.setupHelperArgs('', 0, params, true); - - this.flushInline(); - - let current = this.topStack(); - params.splice(1, 0, current); - - this.pushSource([ - 'if (!', this.lastHelper, ') { ', - current, ' = ', this.source.functionCall(blockHelperMissing, 'call', params), - '}']); - }, - - // [appendContent] - // - // On stack, before: ... - // On stack, after: ... - // - // Appends the string value of `content` to the current buffer - appendContent: function(content) { - if (this.pendingContent) { - content = this.pendingContent + content; - } else { - this.pendingLocation = this.source.currentLocation; - } - - this.pendingContent = content; - }, - - // [append] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Coerces `value` to a String and appends it to the current buffer. - // - // If `value` is truthy, or 0, it is coerced into a string and appended - // Otherwise, the empty string is appended - append: function() { - if (this.isInline()) { - this.replaceStack((current) => [' != null ? ', current, ' : ""']); - - this.pushSource(this.appendToBuffer(this.popStack())); - } else { - let local = this.popStack(); - this.pushSource(['if (', local, ' != null) { ', this.appendToBuffer(local, undefined, true), ' }']); - if (this.environment.isSimple) { - this.pushSource(['else { ', this.appendToBuffer("''", undefined, true), ' }']); - } - } - }, - - // [appendEscaped] - // - // On stack, before: value, ... - // On stack, after: ... - // - // Escape `value` and append it to the buffer - appendEscaped: function() { - this.pushSource(this.appendToBuffer( - [this.aliasable('this.escapeExpression'), '(', this.popStack(), ')'])); - }, - - // [getContext] - // - // On stack, before: ... - // On stack, after: ... - // Compiler value, after: lastContext=depth - // - // Set the value of the `lastContext` compiler value to the depth - getContext: function(depth) { - this.lastContext = depth; - }, - - // [pushContext] - // - // On stack, before: ... - // On stack, after: currentContext, ... - // - // Pushes the value of the current context onto the stack. - pushContext: function() { - this.pushStackLiteral(this.contextName(this.lastContext)); - }, - - // [lookupOnContext] - // - // On stack, before: ... - // On stack, after: currentContext[name], ... - // - // Looks up the value of `name` on the current context and pushes - // it onto the stack. - lookupOnContext: function(parts, falsy, scoped) { - let i = 0; - - if (!scoped && this.options.compat && !this.lastContext) { - // The depthed query is expected to handle the undefined logic for the root level that - // is implemented below, so we evaluate that directly in compat mode - this.push(this.depthedLookup(parts[i++])); - } else { - this.pushContext(); - } - - this.resolvePath('context', parts, i, falsy); - }, - - // [lookupBlockParam] - // - // On stack, before: ... - // On stack, after: blockParam[name], ... - // - // Looks up the value of `parts` on the given block param and pushes - // it onto the stack. - lookupBlockParam: function(blockParamId, parts) { - this.useBlockParams = true; - - this.push(['blockParams[', blockParamId[0], '][', blockParamId[1], ']']); - this.resolvePath('context', parts, 1); - }, - - // [lookupData] - // - // On stack, before: ... - // On stack, after: data, ... - // - // Push the data lookup operator - lookupData: function(depth, parts) { - if (!depth) { - this.pushStackLiteral('data'); - } else { - this.pushStackLiteral('this.data(data, ' + depth + ')'); - } - - this.resolvePath('data', parts, 0, true); - }, - - resolvePath: function(type, parts, i, falsy) { - if (this.options.strict || this.options.assumeObjects) { - this.push(strictLookup(this.options.strict, this, parts, type)); - return; - } - - let len = parts.length; - for (; i < len; i++) { - /*eslint-disable no-loop-func */ - this.replaceStack((current) => { - let lookup = this.nameLookup(current, parts[i], type); - // We want to ensure that zero and false are handled properly if the context (falsy flag) - // needs to have the special handling for these values. - if (!falsy) { - return [' != null ? ', lookup, ' : ', current]; - } else { - // Otherwise we can use generic falsy handling - return [' && ', lookup]; - } - }); - /*eslint-enable no-loop-func */ - } - }, - - // [resolvePossibleLambda] - // - // On stack, before: value, ... - // On stack, after: resolved value, ... - // - // If the `value` is a lambda, replace it on the stack by - // the return value of the lambda - resolvePossibleLambda: function() { - this.push([this.aliasable('this.lambda'), '(', this.popStack(), ', ', this.contextName(0), ')']); - }, - - // [pushStringParam] - // - // On stack, before: ... - // On stack, after: string, currentContext, ... - // - // This opcode is designed for use in string mode, which - // provides the string value of a parameter along with its - // depth rather than resolving it immediately. - pushStringParam: function(string, type) { - this.pushContext(); - this.pushString(type); - - // If it's a subexpression, the string result - // will be pushed after this opcode. - if (type !== 'SubExpression') { - if (typeof string === 'string') { - this.pushString(string); - } else { - this.pushStackLiteral(string); - } - } - }, - - emptyHash: function(omitEmpty) { - if (this.trackIds) { - this.push('{}'); // hashIds - } - if (this.stringParams) { - this.push('{}'); // hashContexts - this.push('{}'); // hashTypes - } - this.pushStackLiteral(omitEmpty ? 'undefined' : '{}'); - }, - pushHash: function() { - if (this.hash) { - this.hashes.push(this.hash); - } - this.hash = {values: [], types: [], contexts: [], ids: []}; - }, - popHash: function() { - let hash = this.hash; - this.hash = this.hashes.pop(); - - if (this.trackIds) { - this.push(this.objectLiteral(hash.ids)); - } - if (this.stringParams) { - this.push(this.objectLiteral(hash.contexts)); - this.push(this.objectLiteral(hash.types)); - } - - this.push(this.objectLiteral(hash.values)); - }, - - // [pushString] - // - // On stack, before: ... - // On stack, after: quotedString(string), ... - // - // Push a quoted version of `string` onto the stack - pushString: function(string) { - this.pushStackLiteral(this.quotedString(string)); - }, - - // [pushLiteral] - // - // On stack, before: ... - // On stack, after: value, ... - // - // Pushes a value onto the stack. This operation prevents - // the compiler from creating a temporary variable to hold - // it. - pushLiteral: function(value) { - this.pushStackLiteral(value); - }, - - // [pushProgram] - // - // On stack, before: ... - // On stack, after: program(guid), ... - // - // Push a program expression onto the stack. This takes - // a compile-time guid and converts it into a runtime-accessible - // expression. - pushProgram: function(guid) { - if (guid != null) { - this.pushStackLiteral(this.programExpression(guid)); - } else { - this.pushStackLiteral(null); - } - }, - - // [invokeHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // Pops off the helper's parameters, invokes the helper, - // and pushes the helper's return value onto the stack. - // - // If the helper is not found, `helperMissing` is called. - invokeHelper: function(paramSize, name, isSimple) { - let nonHelper = this.popStack(), - helper = this.setupHelper(paramSize, name), - simple = isSimple ? [helper.name, ' || '] : ''; - - let lookup = ['('].concat(simple, nonHelper); - if (!this.options.strict) { - lookup.push(' || ', this.aliasable('helpers.helperMissing')); - } - lookup.push(')'); - - this.push(this.source.functionCall(lookup, 'call', helper.callParams)); - }, - - // [invokeKnownHelper] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of helper invocation - // - // This operation is used when the helper is known to exist, - // so a `helperMissing` fallback is not required. - invokeKnownHelper: function(paramSize, name) { - let helper = this.setupHelper(paramSize, name); - this.push(this.source.functionCall(helper.name, 'call', helper.callParams)); - }, - - // [invokeAmbiguous] - // - // On stack, before: hash, inverse, program, params..., ... - // On stack, after: result of disambiguation - // - // This operation is used when an expression like `{{foo}}` - // is provided, but we don't know at compile-time whether it - // is a helper or a path. - // - // This operation emits more code than the other options, - // and can be avoided by passing the `knownHelpers` and - // `knownHelpersOnly` flags at compile-time. - invokeAmbiguous: function(name, helperCall) { - this.useRegister('helper'); - - let nonHelper = this.popStack(); - - this.emptyHash(); - let helper = this.setupHelper(0, name, helperCall); - - let helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper'); - - let lookup = ['(', '(helper = ', helperName, ' || ', nonHelper, ')']; - if (!this.options.strict) { - lookup[0] = '(helper = '; - lookup.push( - ' != null ? helper : ', - this.aliasable('helpers.helperMissing') - ); - } - - this.push([ - '(', lookup, - (helper.paramsInit ? ['),(', helper.paramsInit] : []), '),', - '(typeof helper === ', this.aliasable('"function"'), ' ? ', - this.source.functionCall('helper', 'call', helper.callParams), ' : helper))' - ]); - }, - - // [invokePartial] - // - // On stack, before: context, ... - // On stack after: result of partial invocation - // - // This operation pops off a context, invokes a partial with that context, - // and pushes the result of the invocation back. - invokePartial: function(isDynamic, name, indent) { - let params = [], - options = this.setupParams(name, 1, params, false); - - if (isDynamic) { - name = this.popStack(); - delete options.name; - } - - if (indent) { - options.indent = JSON.stringify(indent); - } - options.helpers = 'helpers'; - options.partials = 'partials'; - - if (!isDynamic) { - params.unshift(this.nameLookup('partials', name, 'partial')); - } else { - params.unshift(name); - } - - if (this.options.compat) { - options.depths = 'depths'; - } - options = this.objectLiteral(options); - params.push(options); - - this.push(this.source.functionCall('this.invokePartial', '', params)); - }, - - // [assignToHash] - // - // On stack, before: value, ..., hash, ... - // On stack, after: ..., hash, ... - // - // Pops a value off the stack and assigns it to the current hash - assignToHash: function(key) { - let value = this.popStack(), - context, - type, - id; - - if (this.trackIds) { - id = this.popStack(); - } - if (this.stringParams) { - type = this.popStack(); - context = this.popStack(); - } - - let hash = this.hash; - if (context) { - hash.contexts[key] = context; - } - if (type) { - hash.types[key] = type; - } - if (id) { - hash.ids[key] = id; - } - hash.values[key] = value; - }, - - pushId: function(type, name, child) { - if (type === 'BlockParam') { - this.pushStackLiteral( - 'blockParams[' + name[0] + '].path[' + name[1] + ']' - + (child ? ' + ' + JSON.stringify('.' + child) : '')); - } else if (type === 'PathExpression') { - this.pushString(name); - } else if (type === 'SubExpression') { - this.pushStackLiteral('true'); - } else { - this.pushStackLiteral('null'); - } - }, - - // HELPERS - - compiler: JavaScriptCompiler, - - compileChildren: function(environment, options) { - let children = environment.children, child, compiler; - - for (let i = 0, l = children.length; i < l; i++) { - child = children[i]; - compiler = new this.compiler(); // eslint-disable-line new-cap - - let index = this.matchExistingProgram(child); - - if (index == null) { - this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children - index = this.context.programs.length; - child.index = index; - child.name = 'program' + index; - this.context.programs[index] = compiler.compile(child, options, this.context, !this.precompile); - this.context.environments[index] = child; - - this.useDepths = this.useDepths || compiler.useDepths; - this.useBlockParams = this.useBlockParams || compiler.useBlockParams; - } else { - child.index = index; - child.name = 'program' + index; - - this.useDepths = this.useDepths || child.useDepths; - this.useBlockParams = this.useBlockParams || child.useBlockParams; - } - } - }, - matchExistingProgram: function(child) { - for (let i = 0, len = this.context.environments.length; i < len; i++) { - let environment = this.context.environments[i]; - if (environment && environment.equals(child)) { - return i; - } - } - }, - - programExpression: function(guid) { - let child = this.environment.children[guid], - programParams = [child.index, 'data', child.blockParams]; - - if (this.useBlockParams || this.useDepths) { - programParams.push('blockParams'); - } - if (this.useDepths) { - programParams.push('depths'); - } - - return 'this.program(' + programParams.join(', ') + ')'; - }, - - useRegister: function(name) { - if (!this.registers[name]) { - this.registers[name] = true; - this.registers.list.push(name); - } - }, - - push: function(expr) { - if (!(expr instanceof Literal)) { - expr = this.source.wrap(expr); - } - - this.inlineStack.push(expr); - return expr; - }, - - pushStackLiteral: function(item) { - this.push(new Literal(item)); - }, - - pushSource: function(source) { - if (this.pendingContent) { - this.source.push( - this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation)); - this.pendingContent = undefined; - } - - if (source) { - this.source.push(source); - } - }, - - replaceStack: function(callback) { - let prefix = ['('], - stack, - createdStack, - usedLiteral; - - /* istanbul ignore next */ - if (!this.isInline()) { - throw new Exception('replaceStack on non-inline'); - } - - // We want to merge the inline statement into the replacement statement via ',' - let top = this.popStack(true); - - if (top instanceof Literal) { - // Literals do not need to be inlined - stack = [top.value]; - prefix = ['(', stack]; - usedLiteral = true; - } else { - // Get or create the current stack name for use by the inline - createdStack = true; - let name = this.incrStack(); - - prefix = ['((', this.push(name), ' = ', top, ')']; - stack = this.topStack(); - } - - let item = callback.call(this, stack); - - if (!usedLiteral) { - this.popStack(); - } - if (createdStack) { - this.stackSlot--; - } - this.push(prefix.concat(item, ')')); - }, - - incrStack: function() { - this.stackSlot++; - if (this.stackSlot > this.stackVars.length) { this.stackVars.push('stack' + this.stackSlot); } - return this.topStackName(); - }, - topStackName: function() { - return 'stack' + this.stackSlot; - }, - flushInline: function() { - let inlineStack = this.inlineStack; - this.inlineStack = []; - for (let i = 0, len = inlineStack.length; i < len; i++) { - let entry = inlineStack[i]; - /* istanbul ignore if */ - if (entry instanceof Literal) { - this.compileStack.push(entry); - } else { - let stack = this.incrStack(); - this.pushSource([stack, ' = ', entry, ';']); - this.compileStack.push(stack); - } - } - }, - isInline: function() { - return this.inlineStack.length; - }, - - popStack: function(wrapped) { - let inline = this.isInline(), - item = (inline ? this.inlineStack : this.compileStack).pop(); - - if (!wrapped && (item instanceof Literal)) { - return item.value; - } else { - if (!inline) { - /* istanbul ignore next */ - if (!this.stackSlot) { - throw new Exception('Invalid stack pop'); - } - this.stackSlot--; - } - return item; - } - }, - - topStack: function() { - let stack = (this.isInline() ? this.inlineStack : this.compileStack), - item = stack[stack.length - 1]; - - /* istanbul ignore if */ - if (item instanceof Literal) { - return item.value; - } else { - return item; - } - }, - - contextName: function(context) { - if (this.useDepths && context) { - return 'depths[' + context + ']'; - } else { - return 'depth' + context; - } - }, - - quotedString: function(str) { - return this.source.quotedString(str); - }, - - objectLiteral: function(obj) { - return this.source.objectLiteral(obj); - }, - - aliasable: function(name) { - let ret = this.aliases[name]; - if (ret) { - ret.referenceCount++; - return ret; - } - - ret = this.aliases[name] = this.source.wrap(name); - ret.aliasable = true; - ret.referenceCount = 1; - - return ret; - }, - - setupHelper: function(paramSize, name, blockHelper) { - let params = [], - paramsInit = this.setupHelperArgs(name, paramSize, params, blockHelper); - let foundHelper = this.nameLookup('helpers', name, 'helper'); - - return { - params: params, - paramsInit: paramsInit, - name: foundHelper, - callParams: [this.contextName(0)].concat(params) - }; - }, - - setupParams: function(helper, paramSize, params) { - let options = {}, contexts = [], types = [], ids = [], param; - - options.name = this.quotedString(helper); - options.hash = this.popStack(); - - if (this.trackIds) { - options.hashIds = this.popStack(); - } - if (this.stringParams) { - options.hashTypes = this.popStack(); - options.hashContexts = this.popStack(); - } - - let inverse = this.popStack(), - program = this.popStack(); - - // Avoid setting fn and inverse if neither are set. This allows - // helpers to do a check for `if (options.fn)` - if (program || inverse) { - options.fn = program || 'this.noop'; - options.inverse = inverse || 'this.noop'; - } - - // The parameters go on to the stack in order (making sure that they are evaluated in order) - // so we need to pop them off the stack in reverse order - let i = paramSize; - while (i--) { - param = this.popStack(); - params[i] = param; - - if (this.trackIds) { - ids[i] = this.popStack(); - } - if (this.stringParams) { - types[i] = this.popStack(); - contexts[i] = this.popStack(); - } - } - - if (this.trackIds) { - options.ids = this.source.generateArray(ids); - } - if (this.stringParams) { - options.types = this.source.generateArray(types); - options.contexts = this.source.generateArray(contexts); - } - - if (this.options.data) { - options.data = 'data'; - } - if (this.useBlockParams) { - options.blockParams = 'blockParams'; - } - return options; - }, - - setupHelperArgs: function(helper, paramSize, params, useRegister) { - let options = this.setupParams(helper, paramSize, params, true); - options = this.objectLiteral(options); - if (useRegister) { - this.useRegister('options'); - params.push('options'); - return ['options=', options]; - } else { - params.push(options); - return ''; - } - } -}; - - -(function() { - const reservedWords = ( - 'break else new var' + - ' case finally return void' + - ' catch for switch while' + - ' continue function this with' + - ' default if throw' + - ' delete in try' + - ' do instanceof typeof' + - ' abstract enum int short' + - ' boolean export interface static' + - ' byte extends long super' + - ' char final native synchronized' + - ' class float package throws' + - ' const goto private transient' + - ' debugger implements protected volatile' + - ' double import public let yield await' + - ' null true false' - ).split(' '); - - const compilerWords = JavaScriptCompiler.RESERVED_WORDS = {}; - - for (let i = 0, l = reservedWords.length; i < l; i++) { - compilerWords[reservedWords[i]] = true; - } -}()); - -JavaScriptCompiler.isValidJavaScriptVariableName = function(name) { - return !JavaScriptCompiler.RESERVED_WORDS[name] && (/^[a-zA-Z_$][0-9a-zA-Z_$]*$/).test(name); -}; - -function strictLookup(requireTerminal, compiler, parts, type) { - let stack = compiler.popStack(), - i = 0, - len = parts.length; - if (requireTerminal) { - len--; - } - - for (; i < len; i++) { - stack = compiler.nameLookup(stack, parts[i], type); - } - - if (requireTerminal) { - return [compiler.aliasable('this.strict'), '(', stack, ', ', compiler.quotedString(parts[i]), ')']; - } else { - return stack; - } -} - -export default JavaScriptCompiler; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/parser.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/parser.js deleted file mode 100644 index f961a50..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/parser.js +++ /dev/null @@ -1,563 +0,0 @@ -/* istanbul ignore next */ -/* Jison generated parser */ -var handlebars = (function(){ -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"root":3,"program":4,"EOF":5,"program_repetition0":6,"statement":7,"mustache":8,"block":9,"rawBlock":10,"partial":11,"content":12,"COMMENT":13,"CONTENT":14,"openRawBlock":15,"END_RAW_BLOCK":16,"OPEN_RAW_BLOCK":17,"helperName":18,"openRawBlock_repetition0":19,"openRawBlock_option0":20,"CLOSE_RAW_BLOCK":21,"openBlock":22,"block_option0":23,"closeBlock":24,"openInverse":25,"block_option1":26,"OPEN_BLOCK":27,"openBlock_repetition0":28,"openBlock_option0":29,"openBlock_option1":30,"CLOSE":31,"OPEN_INVERSE":32,"openInverse_repetition0":33,"openInverse_option0":34,"openInverse_option1":35,"openInverseChain":36,"OPEN_INVERSE_CHAIN":37,"openInverseChain_repetition0":38,"openInverseChain_option0":39,"openInverseChain_option1":40,"inverseAndProgram":41,"INVERSE":42,"inverseChain":43,"inverseChain_option0":44,"OPEN_ENDBLOCK":45,"OPEN":46,"mustache_repetition0":47,"mustache_option0":48,"OPEN_UNESCAPED":49,"mustache_repetition1":50,"mustache_option1":51,"CLOSE_UNESCAPED":52,"OPEN_PARTIAL":53,"partialName":54,"partial_repetition0":55,"partial_option0":56,"param":57,"sexpr":58,"OPEN_SEXPR":59,"sexpr_repetition0":60,"sexpr_option0":61,"CLOSE_SEXPR":62,"hash":63,"hash_repetition_plus0":64,"hashSegment":65,"ID":66,"EQUALS":67,"blockParams":68,"OPEN_BLOCK_PARAMS":69,"blockParams_repetition_plus0":70,"CLOSE_BLOCK_PARAMS":71,"path":72,"dataName":73,"STRING":74,"NUMBER":75,"BOOLEAN":76,"UNDEFINED":77,"NULL":78,"DATA":79,"pathSegments":80,"SEP":81,"$accept":0,"$end":1}, -terminals_: {2:"error",5:"EOF",13:"COMMENT",14:"CONTENT",16:"END_RAW_BLOCK",17:"OPEN_RAW_BLOCK",21:"CLOSE_RAW_BLOCK",27:"OPEN_BLOCK",31:"CLOSE",32:"OPEN_INVERSE",37:"OPEN_INVERSE_CHAIN",42:"INVERSE",45:"OPEN_ENDBLOCK",46:"OPEN",49:"OPEN_UNESCAPED",52:"CLOSE_UNESCAPED",53:"OPEN_PARTIAL",59:"OPEN_SEXPR",62:"CLOSE_SEXPR",66:"ID",67:"EQUALS",69:"OPEN_BLOCK_PARAMS",71:"CLOSE_BLOCK_PARAMS",74:"STRING",75:"NUMBER",76:"BOOLEAN",77:"UNDEFINED",78:"NULL",79:"DATA",81:"SEP"}, -productions_: [0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[12,1],[10,3],[15,5],[9,4],[9,4],[22,6],[25,6],[36,6],[41,2],[43,3],[43,1],[24,3],[8,5],[8,5],[11,5],[57,1],[57,1],[58,5],[63,1],[65,3],[68,3],[18,1],[18,1],[18,1],[18,1],[18,1],[18,1],[18,1],[54,1],[54,1],[73,2],[72,1],[80,3],[80,1],[6,0],[6,2],[19,0],[19,2],[20,0],[20,1],[23,0],[23,1],[26,0],[26,1],[28,0],[28,2],[29,0],[29,1],[30,0],[30,1],[33,0],[33,2],[34,0],[34,1],[35,0],[35,1],[38,0],[38,2],[39,0],[39,1],[40,0],[40,1],[44,0],[44,1],[47,0],[47,2],[48,0],[48,1],[50,0],[50,2],[51,0],[51,1],[55,0],[55,2],[56,0],[56,1],[60,0],[60,2],[61,0],[61,1],[64,1],[64,2],[70,1],[70,2]], -performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { - -var $0 = $$.length - 1; -switch (yystate) { -case 1: return $$[$0-1]; -break; -case 2:this.$ = new yy.Program($$[$0], null, {}, yy.locInfo(this._$)); -break; -case 3:this.$ = $$[$0]; -break; -case 4:this.$ = $$[$0]; -break; -case 5:this.$ = $$[$0]; -break; -case 6:this.$ = $$[$0]; -break; -case 7:this.$ = $$[$0]; -break; -case 8:this.$ = new yy.CommentStatement(yy.stripComment($$[$0]), yy.stripFlags($$[$0], $$[$0]), yy.locInfo(this._$)); -break; -case 9:this.$ = new yy.ContentStatement($$[$0], yy.locInfo(this._$)); -break; -case 10:this.$ = yy.prepareRawBlock($$[$0-2], $$[$0-1], $$[$0], this._$); -break; -case 11:this.$ = { path: $$[$0-3], params: $$[$0-2], hash: $$[$0-1] }; -break; -case 12:this.$ = yy.prepareBlock($$[$0-3], $$[$0-2], $$[$0-1], $$[$0], false, this._$); -break; -case 13:this.$ = yy.prepareBlock($$[$0-3], $$[$0-2], $$[$0-1], $$[$0], true, this._$); -break; -case 14:this.$ = { path: $$[$0-4], params: $$[$0-3], hash: $$[$0-2], blockParams: $$[$0-1], strip: yy.stripFlags($$[$0-5], $$[$0]) }; -break; -case 15:this.$ = { path: $$[$0-4], params: $$[$0-3], hash: $$[$0-2], blockParams: $$[$0-1], strip: yy.stripFlags($$[$0-5], $$[$0]) }; -break; -case 16:this.$ = { path: $$[$0-4], params: $$[$0-3], hash: $$[$0-2], blockParams: $$[$0-1], strip: yy.stripFlags($$[$0-5], $$[$0]) }; -break; -case 17:this.$ = { strip: yy.stripFlags($$[$0-1], $$[$0-1]), program: $$[$0] }; -break; -case 18: - var inverse = yy.prepareBlock($$[$0-2], $$[$0-1], $$[$0], $$[$0], false, this._$), - program = new yy.Program([inverse], null, {}, yy.locInfo(this._$)); - program.chained = true; - - this.$ = { strip: $$[$0-2].strip, program: program, chain: true }; - -break; -case 19:this.$ = $$[$0]; -break; -case 20:this.$ = {path: $$[$0-1], strip: yy.stripFlags($$[$0-2], $$[$0])}; -break; -case 21:this.$ = yy.prepareMustache($$[$0-3], $$[$0-2], $$[$0-1], $$[$0-4], yy.stripFlags($$[$0-4], $$[$0]), this._$); -break; -case 22:this.$ = yy.prepareMustache($$[$0-3], $$[$0-2], $$[$0-1], $$[$0-4], yy.stripFlags($$[$0-4], $$[$0]), this._$); -break; -case 23:this.$ = new yy.PartialStatement($$[$0-3], $$[$0-2], $$[$0-1], yy.stripFlags($$[$0-4], $$[$0]), yy.locInfo(this._$)); -break; -case 24:this.$ = $$[$0]; -break; -case 25:this.$ = $$[$0]; -break; -case 26:this.$ = new yy.SubExpression($$[$0-3], $$[$0-2], $$[$0-1], yy.locInfo(this._$)); -break; -case 27:this.$ = new yy.Hash($$[$0], yy.locInfo(this._$)); -break; -case 28:this.$ = new yy.HashPair(yy.id($$[$0-2]), $$[$0], yy.locInfo(this._$)); -break; -case 29:this.$ = yy.id($$[$0-1]); -break; -case 30:this.$ = $$[$0]; -break; -case 31:this.$ = $$[$0]; -break; -case 32:this.$ = new yy.StringLiteral($$[$0], yy.locInfo(this._$)); -break; -case 33:this.$ = new yy.NumberLiteral($$[$0], yy.locInfo(this._$)); -break; -case 34:this.$ = new yy.BooleanLiteral($$[$0], yy.locInfo(this._$)); -break; -case 35:this.$ = new yy.UndefinedLiteral(yy.locInfo(this._$)); -break; -case 36:this.$ = new yy.NullLiteral(yy.locInfo(this._$)); -break; -case 37:this.$ = $$[$0]; -break; -case 38:this.$ = $$[$0]; -break; -case 39:this.$ = yy.preparePath(true, $$[$0], this._$); -break; -case 40:this.$ = yy.preparePath(false, $$[$0], this._$); -break; -case 41: $$[$0-2].push({part: yy.id($$[$0]), original: $$[$0], separator: $$[$0-1]}); this.$ = $$[$0-2]; -break; -case 42:this.$ = [{part: yy.id($$[$0]), original: $$[$0]}]; -break; -case 43:this.$ = []; -break; -case 44:$$[$0-1].push($$[$0]); -break; -case 45:this.$ = []; -break; -case 46:$$[$0-1].push($$[$0]); -break; -case 53:this.$ = []; -break; -case 54:$$[$0-1].push($$[$0]); -break; -case 59:this.$ = []; -break; -case 60:$$[$0-1].push($$[$0]); -break; -case 65:this.$ = []; -break; -case 66:$$[$0-1].push($$[$0]); -break; -case 73:this.$ = []; -break; -case 74:$$[$0-1].push($$[$0]); -break; -case 77:this.$ = []; -break; -case 78:$$[$0-1].push($$[$0]); -break; -case 81:this.$ = []; -break; -case 82:$$[$0-1].push($$[$0]); -break; -case 85:this.$ = []; -break; -case 86:$$[$0-1].push($$[$0]); -break; -case 89:this.$ = [$$[$0]]; -break; -case 90:$$[$0-1].push($$[$0]); -break; -case 91:this.$ = [$$[$0]]; -break; -case 92:$$[$0-1].push($$[$0]); -break; -} -}, -table: [{3:1,4:2,5:[2,43],6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],46:[2,43],49:[2,43],53:[2,43]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:[1,11],14:[1,18],15:16,17:[1,21],22:14,25:15,27:[1,19],32:[1,20],37:[2,2],42:[2,2],45:[2,2],46:[1,12],49:[1,13],53:[1,17]},{1:[2,1]},{5:[2,44],13:[2,44],14:[2,44],17:[2,44],27:[2,44],32:[2,44],37:[2,44],42:[2,44],45:[2,44],46:[2,44],49:[2,44],53:[2,44]},{5:[2,3],13:[2,3],14:[2,3],17:[2,3],27:[2,3],32:[2,3],37:[2,3],42:[2,3],45:[2,3],46:[2,3],49:[2,3],53:[2,3]},{5:[2,4],13:[2,4],14:[2,4],17:[2,4],27:[2,4],32:[2,4],37:[2,4],42:[2,4],45:[2,4],46:[2,4],49:[2,4],53:[2,4]},{5:[2,5],13:[2,5],14:[2,5],17:[2,5],27:[2,5],32:[2,5],37:[2,5],42:[2,5],45:[2,5],46:[2,5],49:[2,5],53:[2,5]},{5:[2,6],13:[2,6],14:[2,6],17:[2,6],27:[2,6],32:[2,6],37:[2,6],42:[2,6],45:[2,6],46:[2,6],49:[2,6],53:[2,6]},{5:[2,7],13:[2,7],14:[2,7],17:[2,7],27:[2,7],32:[2,7],37:[2,7],42:[2,7],45:[2,7],46:[2,7],49:[2,7],53:[2,7]},{5:[2,8],13:[2,8],14:[2,8],17:[2,8],27:[2,8],32:[2,8],37:[2,8],42:[2,8],45:[2,8],46:[2,8],49:[2,8],53:[2,8]},{18:22,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:33,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{4:34,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],37:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{4:35,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{12:36,14:[1,18]},{18:38,54:37,58:39,59:[1,40],66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,9],13:[2,9],14:[2,9],16:[2,9],17:[2,9],27:[2,9],32:[2,9],37:[2,9],42:[2,9],45:[2,9],46:[2,9],49:[2,9],53:[2,9]},{18:41,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:42,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:43,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{31:[2,73],47:44,59:[2,73],66:[2,73],74:[2,73],75:[2,73],76:[2,73],77:[2,73],78:[2,73],79:[2,73]},{21:[2,30],31:[2,30],52:[2,30],59:[2,30],62:[2,30],66:[2,30],69:[2,30],74:[2,30],75:[2,30],76:[2,30],77:[2,30],78:[2,30],79:[2,30]},{21:[2,31],31:[2,31],52:[2,31],59:[2,31],62:[2,31],66:[2,31],69:[2,31],74:[2,31],75:[2,31],76:[2,31],77:[2,31],78:[2,31],79:[2,31]},{21:[2,32],31:[2,32],52:[2,32],59:[2,32],62:[2,32],66:[2,32],69:[2,32],74:[2,32],75:[2,32],76:[2,32],77:[2,32],78:[2,32],79:[2,32]},{21:[2,33],31:[2,33],52:[2,33],59:[2,33],62:[2,33],66:[2,33],69:[2,33],74:[2,33],75:[2,33],76:[2,33],77:[2,33],78:[2,33],79:[2,33]},{21:[2,34],31:[2,34],52:[2,34],59:[2,34],62:[2,34],66:[2,34],69:[2,34],74:[2,34],75:[2,34],76:[2,34],77:[2,34],78:[2,34],79:[2,34]},{21:[2,35],31:[2,35],52:[2,35],59:[2,35],62:[2,35],66:[2,35],69:[2,35],74:[2,35],75:[2,35],76:[2,35],77:[2,35],78:[2,35],79:[2,35]},{21:[2,36],31:[2,36],52:[2,36],59:[2,36],62:[2,36],66:[2,36],69:[2,36],74:[2,36],75:[2,36],76:[2,36],77:[2,36],78:[2,36],79:[2,36]},{21:[2,40],31:[2,40],52:[2,40],59:[2,40],62:[2,40],66:[2,40],69:[2,40],74:[2,40],75:[2,40],76:[2,40],77:[2,40],78:[2,40],79:[2,40],81:[1,45]},{66:[1,32],80:46},{21:[2,42],31:[2,42],52:[2,42],59:[2,42],62:[2,42],66:[2,42],69:[2,42],74:[2,42],75:[2,42],76:[2,42],77:[2,42],78:[2,42],79:[2,42],81:[2,42]},{50:47,52:[2,77],59:[2,77],66:[2,77],74:[2,77],75:[2,77],76:[2,77],77:[2,77],78:[2,77],79:[2,77]},{23:48,36:50,37:[1,52],41:51,42:[1,53],43:49,45:[2,49]},{26:54,41:55,42:[1,53],45:[2,51]},{16:[1,56]},{31:[2,81],55:57,59:[2,81],66:[2,81],74:[2,81],75:[2,81],76:[2,81],77:[2,81],78:[2,81],79:[2,81]},{31:[2,37],59:[2,37],66:[2,37],74:[2,37],75:[2,37],76:[2,37],77:[2,37],78:[2,37],79:[2,37]},{31:[2,38],59:[2,38],66:[2,38],74:[2,38],75:[2,38],76:[2,38],77:[2,38],78:[2,38],79:[2,38]},{18:58,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{28:59,31:[2,53],59:[2,53],66:[2,53],69:[2,53],74:[2,53],75:[2,53],76:[2,53],77:[2,53],78:[2,53],79:[2,53]},{31:[2,59],33:60,59:[2,59],66:[2,59],69:[2,59],74:[2,59],75:[2,59],76:[2,59],77:[2,59],78:[2,59],79:[2,59]},{19:61,21:[2,45],59:[2,45],66:[2,45],74:[2,45],75:[2,45],76:[2,45],77:[2,45],78:[2,45],79:[2,45]},{18:65,31:[2,75],48:62,57:63,58:66,59:[1,40],63:64,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{66:[1,70]},{21:[2,39],31:[2,39],52:[2,39],59:[2,39],62:[2,39],66:[2,39],69:[2,39],74:[2,39],75:[2,39],76:[2,39],77:[2,39],78:[2,39],79:[2,39],81:[1,45]},{18:65,51:71,52:[2,79],57:72,58:66,59:[1,40],63:73,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{24:74,45:[1,75]},{45:[2,50]},{4:76,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],37:[2,43],42:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{45:[2,19]},{18:77,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{4:78,6:3,13:[2,43],14:[2,43],17:[2,43],27:[2,43],32:[2,43],45:[2,43],46:[2,43],49:[2,43],53:[2,43]},{24:79,45:[1,75]},{45:[2,52]},{5:[2,10],13:[2,10],14:[2,10],17:[2,10],27:[2,10],32:[2,10],37:[2,10],42:[2,10],45:[2,10],46:[2,10],49:[2,10],53:[2,10]},{18:65,31:[2,83],56:80,57:81,58:66,59:[1,40],63:82,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{59:[2,85],60:83,62:[2,85],66:[2,85],74:[2,85],75:[2,85],76:[2,85],77:[2,85],78:[2,85],79:[2,85]},{18:65,29:84,31:[2,55],57:85,58:66,59:[1,40],63:86,64:67,65:68,66:[1,69],69:[2,55],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:65,31:[2,61],34:87,57:88,58:66,59:[1,40],63:89,64:67,65:68,66:[1,69],69:[2,61],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{18:65,20:90,21:[2,47],57:91,58:66,59:[1,40],63:92,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{31:[1,93]},{31:[2,74],59:[2,74],66:[2,74],74:[2,74],75:[2,74],76:[2,74],77:[2,74],78:[2,74],79:[2,74]},{31:[2,76]},{21:[2,24],31:[2,24],52:[2,24],59:[2,24],62:[2,24],66:[2,24],69:[2,24],74:[2,24],75:[2,24],76:[2,24],77:[2,24],78:[2,24],79:[2,24]},{21:[2,25],31:[2,25],52:[2,25],59:[2,25],62:[2,25],66:[2,25],69:[2,25],74:[2,25],75:[2,25],76:[2,25],77:[2,25],78:[2,25],79:[2,25]},{21:[2,27],31:[2,27],52:[2,27],62:[2,27],65:94,66:[1,95],69:[2,27]},{21:[2,89],31:[2,89],52:[2,89],62:[2,89],66:[2,89],69:[2,89]},{21:[2,42],31:[2,42],52:[2,42],59:[2,42],62:[2,42],66:[2,42],67:[1,96],69:[2,42],74:[2,42],75:[2,42],76:[2,42],77:[2,42],78:[2,42],79:[2,42],81:[2,42]},{21:[2,41],31:[2,41],52:[2,41],59:[2,41],62:[2,41],66:[2,41],69:[2,41],74:[2,41],75:[2,41],76:[2,41],77:[2,41],78:[2,41],79:[2,41],81:[2,41]},{52:[1,97]},{52:[2,78],59:[2,78],66:[2,78],74:[2,78],75:[2,78],76:[2,78],77:[2,78],78:[2,78],79:[2,78]},{52:[2,80]},{5:[2,12],13:[2,12],14:[2,12],17:[2,12],27:[2,12],32:[2,12],37:[2,12],42:[2,12],45:[2,12],46:[2,12],49:[2,12],53:[2,12]},{18:98,66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{36:50,37:[1,52],41:51,42:[1,53],43:100,44:99,45:[2,71]},{31:[2,65],38:101,59:[2,65],66:[2,65],69:[2,65],74:[2,65],75:[2,65],76:[2,65],77:[2,65],78:[2,65],79:[2,65]},{45:[2,17]},{5:[2,13],13:[2,13],14:[2,13],17:[2,13],27:[2,13],32:[2,13],37:[2,13],42:[2,13],45:[2,13],46:[2,13],49:[2,13],53:[2,13]},{31:[1,102]},{31:[2,82],59:[2,82],66:[2,82],74:[2,82],75:[2,82],76:[2,82],77:[2,82],78:[2,82],79:[2,82]},{31:[2,84]},{18:65,57:104,58:66,59:[1,40],61:103,62:[2,87],63:105,64:67,65:68,66:[1,69],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{30:106,31:[2,57],68:107,69:[1,108]},{31:[2,54],59:[2,54],66:[2,54],69:[2,54],74:[2,54],75:[2,54],76:[2,54],77:[2,54],78:[2,54],79:[2,54]},{31:[2,56],69:[2,56]},{31:[2,63],35:109,68:110,69:[1,108]},{31:[2,60],59:[2,60],66:[2,60],69:[2,60],74:[2,60],75:[2,60],76:[2,60],77:[2,60],78:[2,60],79:[2,60]},{31:[2,62],69:[2,62]},{21:[1,111]},{21:[2,46],59:[2,46],66:[2,46],74:[2,46],75:[2,46],76:[2,46],77:[2,46],78:[2,46],79:[2,46]},{21:[2,48]},{5:[2,21],13:[2,21],14:[2,21],17:[2,21],27:[2,21],32:[2,21],37:[2,21],42:[2,21],45:[2,21],46:[2,21],49:[2,21],53:[2,21]},{21:[2,90],31:[2,90],52:[2,90],62:[2,90],66:[2,90],69:[2,90]},{67:[1,96]},{18:65,57:112,58:66,59:[1,40],66:[1,32],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,22],13:[2,22],14:[2,22],17:[2,22],27:[2,22],32:[2,22],37:[2,22],42:[2,22],45:[2,22],46:[2,22],49:[2,22],53:[2,22]},{31:[1,113]},{45:[2,18]},{45:[2,72]},{18:65,31:[2,67],39:114,57:115,58:66,59:[1,40],63:116,64:67,65:68,66:[1,69],69:[2,67],72:23,73:24,74:[1,25],75:[1,26],76:[1,27],77:[1,28],78:[1,29],79:[1,31],80:30},{5:[2,23],13:[2,23],14:[2,23],17:[2,23],27:[2,23],32:[2,23],37:[2,23],42:[2,23],45:[2,23],46:[2,23],49:[2,23],53:[2,23]},{62:[1,117]},{59:[2,86],62:[2,86],66:[2,86],74:[2,86],75:[2,86],76:[2,86],77:[2,86],78:[2,86],79:[2,86]},{62:[2,88]},{31:[1,118]},{31:[2,58]},{66:[1,120],70:119},{31:[1,121]},{31:[2,64]},{14:[2,11]},{21:[2,28],31:[2,28],52:[2,28],62:[2,28],66:[2,28],69:[2,28]},{5:[2,20],13:[2,20],14:[2,20],17:[2,20],27:[2,20],32:[2,20],37:[2,20],42:[2,20],45:[2,20],46:[2,20],49:[2,20],53:[2,20]},{31:[2,69],40:122,68:123,69:[1,108]},{31:[2,66],59:[2,66],66:[2,66],69:[2,66],74:[2,66],75:[2,66],76:[2,66],77:[2,66],78:[2,66],79:[2,66]},{31:[2,68],69:[2,68]},{21:[2,26],31:[2,26],52:[2,26],59:[2,26],62:[2,26],66:[2,26],69:[2,26],74:[2,26],75:[2,26],76:[2,26],77:[2,26],78:[2,26],79:[2,26]},{13:[2,14],14:[2,14],17:[2,14],27:[2,14],32:[2,14],37:[2,14],42:[2,14],45:[2,14],46:[2,14],49:[2,14],53:[2,14]},{66:[1,125],71:[1,124]},{66:[2,91],71:[2,91]},{13:[2,15],14:[2,15],17:[2,15],27:[2,15],32:[2,15],42:[2,15],45:[2,15],46:[2,15],49:[2,15],53:[2,15]},{31:[1,126]},{31:[2,70]},{31:[2,29]},{66:[2,92],71:[2,92]},{13:[2,16],14:[2,16],17:[2,16],27:[2,16],32:[2,16],37:[2,16],42:[2,16],45:[2,16],46:[2,16],49:[2,16],53:[2,16]}], -defaultActions: {4:[2,1],49:[2,50],51:[2,19],55:[2,52],64:[2,76],73:[2,80],78:[2,17],82:[2,84],92:[2,48],99:[2,18],100:[2,72],105:[2,88],107:[2,58],110:[2,64],111:[2,11],123:[2,70],124:[2,29]}, -parseError: function parseError(str, hash) { - throw new Error(str); -}, -parse: function parse(input) { - var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - this.yy.parser = this; - if (typeof this.lexer.yylloc == "undefined") - this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - var ranges = this.lexer.options && this.lexer.options.ranges; - if (typeof this.yy.parseError === "function") - this.parseError = this.yy.parseError; - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - function lex() { - var token; - token = self.lexer.lex() || 1; - if (typeof token !== "number") { - token = self.symbols_[token] || token; - } - return token; - } - var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == "undefined") { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === "undefined" || !action.length || !action[0]) { - var errStr = ""; - if (!recovering) { - expected = []; - for (p in table[state]) - if (this.terminals_[p] && p > 2) { - expected.push("'" + this.terminals_[p] + "'"); - } - if (this.lexer.showPosition) { - errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'"; - } else { - errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'"); - } - this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); - } - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) - recovering--; - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column}; - if (ranges) { - yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; - } - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - if (typeof r !== "undefined") { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; -} -}; -/* Jison generated lexer */ -var lexer = (function(){ -var lexer = ({EOF:1, -parseError:function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, -setInput:function (input) { - this._input = input; - this._more = this._less = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0}; - if (this.options.ranges) this.yylloc.range = [0,0]; - this.offset = 0; - return this; - }, -input:function () { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) this.yylloc.range[1]++; - - this._input = this._input.slice(1); - return ch; - }, -unput:function (ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length-len-1); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length-1); - this.matched = this.matched.substr(0, this.matched.length-1); - - if (lines.length-1) this.yylineno -= lines.length-1; - var r = this.yylloc.range; - - this.yylloc = {first_line: this.yylloc.first_line, - last_line: this.yylineno+1, - first_column: this.yylloc.first_column, - last_column: lines ? - (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length: - this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - return this; - }, -more:function () { - this._more = true; - return this; - }, -less:function (n) { - this.unput(this.match.slice(n)); - }, -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, ""); - }, -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c+"^"; - }, -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) this.done = true; - - var token, - match, - tempMatch, - index, - col, - lines; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i=0;i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (!this.options.flex) break; - } - } - if (match) { - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) this.yylineno += lines.length; - this.yylloc = {first_line: this.yylloc.last_line, - last_line: this.yylineno+1, - first_column: this.yylloc.last_column, - last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length}; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]); - if (this.done && this._input) this.done = false; - if (token) return token; - else return; - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(), - {text: "", token: null, line: this.yylineno}); - } - }, -lex:function lex() { - var r = this.next(); - if (typeof r !== 'undefined') { - return r; - } else { - return this.lex(); - } - }, -begin:function begin(condition) { - this.conditionStack.push(condition); - }, -popState:function popState() { - return this.conditionStack.pop(); - }, -_currentRules:function _currentRules() { - return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules; - }, -topState:function () { - return this.conditionStack[this.conditionStack.length-2]; - }, -pushState:function begin(condition) { - this.begin(condition); - }}); -lexer.options = {}; -lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { - - -function strip(start, end) { - return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng-end); -} - - -var YYSTATE=YY_START -switch($avoiding_name_collisions) { -case 0: - if(yy_.yytext.slice(-2) === "\\\\") { - strip(0,1); - this.begin("mu"); - } else if(yy_.yytext.slice(-1) === "\\") { - strip(0,1); - this.begin("emu"); - } else { - this.begin("mu"); - } - if(yy_.yytext) return 14; - -break; -case 1:return 14; -break; -case 2: - this.popState(); - return 14; - -break; -case 3: - yy_.yytext = yy_.yytext.substr(5, yy_.yyleng-9); - this.popState(); - return 16; - -break; -case 4: return 14; -break; -case 5: - this.popState(); - return 13; - -break; -case 6:return 59; -break; -case 7:return 62; -break; -case 8: return 17; -break; -case 9: - this.popState(); - this.begin('raw'); - return 21; - -break; -case 10:return 53; -break; -case 11:return 27; -break; -case 12:return 45; -break; -case 13:this.popState(); return 42; -break; -case 14:this.popState(); return 42; -break; -case 15:return 32; -break; -case 16:return 37; -break; -case 17:return 49; -break; -case 18:return 46; -break; -case 19: - this.unput(yy_.yytext); - this.popState(); - this.begin('com'); - -break; -case 20: - this.popState(); - return 13; - -break; -case 21:return 46; -break; -case 22:return 67; -break; -case 23:return 66; -break; -case 24:return 66; -break; -case 25:return 81; -break; -case 26:// ignore whitespace -break; -case 27:this.popState(); return 52; -break; -case 28:this.popState(); return 31; -break; -case 29:yy_.yytext = strip(1,2).replace(/\\"/g,'"'); return 74; -break; -case 30:yy_.yytext = strip(1,2).replace(/\\'/g,"'"); return 74; -break; -case 31:return 79; -break; -case 32:return 76; -break; -case 33:return 76; -break; -case 34:return 77; -break; -case 35:return 78; -break; -case 36:return 75; -break; -case 37:return 69; -break; -case 38:return 71; -break; -case 39:return 66; -break; -case 40:return 66; -break; -case 41:return 'INVALID'; -break; -case 42:return 5; -break; -} -}; -lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{\/)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/]; -lexer.conditions = {"mu":{"rules":[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"com":{"rules":[5],"inclusive":false},"raw":{"rules":[3,4],"inclusive":false},"INITIAL":{"rules":[0,1,42],"inclusive":true}}; -return lexer;})() -parser.lexer = lexer; -function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser; -return new Parser; -})();export default handlebars; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/printer.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/printer.js deleted file mode 100644 index 691a356..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/printer.js +++ /dev/null @@ -1,151 +0,0 @@ -/*eslint-disable new-cap */ -import Visitor from './visitor'; - -export function print(ast) { - return new PrintVisitor().accept(ast); -} - -export function PrintVisitor() { - this.padding = 0; -} - -PrintVisitor.prototype = new Visitor(); - -PrintVisitor.prototype.pad = function(string) { - let out = ''; - - for (let i = 0, l = this.padding; i < l; i++) { - out = out + ' '; - } - - out = out + string + '\n'; - return out; -}; - -PrintVisitor.prototype.Program = function(program) { - let out = '', - body = program.body, - i, l; - - if (program.blockParams) { - let blockParams = 'BLOCK PARAMS: ['; - for (i = 0, l = program.blockParams.length; i < l; i++) { - blockParams += ' ' + program.blockParams[i]; - } - blockParams += ' ]'; - out += this.pad(blockParams); - } - - for (i = 0, l = body.length; i < l; i++) { - out = out + this.accept(body[i]); - } - - this.padding--; - - return out; -}; - -PrintVisitor.prototype.MustacheStatement = function(mustache) { - return this.pad('{{ ' + this.SubExpression(mustache) + ' }}'); -}; - -PrintVisitor.prototype.BlockStatement = function(block) { - let out = ''; - - out = out + this.pad('BLOCK:'); - this.padding++; - out = out + this.pad(this.SubExpression(block)); - if (block.program) { - out = out + this.pad('PROGRAM:'); - this.padding++; - out = out + this.accept(block.program); - this.padding--; - } - if (block.inverse) { - if (block.program) { this.padding++; } - out = out + this.pad('{{^}}'); - this.padding++; - out = out + this.accept(block.inverse); - this.padding--; - if (block.program) { this.padding--; } - } - this.padding--; - - return out; -}; - -PrintVisitor.prototype.PartialStatement = function(partial) { - let content = 'PARTIAL:' + partial.name.original; - if (partial.params[0]) { - content += ' ' + this.accept(partial.params[0]); - } - if (partial.hash) { - content += ' ' + this.accept(partial.hash); - } - return this.pad('{{> ' + content + ' }}'); -}; - -PrintVisitor.prototype.ContentStatement = function(content) { - return this.pad("CONTENT[ '" + content.value + "' ]"); -}; - -PrintVisitor.prototype.CommentStatement = function(comment) { - return this.pad("{{! '" + comment.value + "' }}"); -}; - -PrintVisitor.prototype.SubExpression = function(sexpr) { - let params = sexpr.params, - paramStrings = [], - hash; - - for (let i = 0, l = params.length; i < l; i++) { - paramStrings.push(this.accept(params[i])); - } - - params = '[' + paramStrings.join(', ') + ']'; - - hash = sexpr.hash ? ' ' + this.accept(sexpr.hash) : ''; - - return this.accept(sexpr.path) + ' ' + params + hash; -}; - -PrintVisitor.prototype.PathExpression = function(id) { - let path = id.parts.join('/'); - return (id.data ? '@' : '') + 'PATH:' + path; -}; - - -PrintVisitor.prototype.StringLiteral = function(string) { - return '"' + string.value + '"'; -}; - -PrintVisitor.prototype.NumberLiteral = function(number) { - return 'NUMBER{' + number.value + '}'; -}; - -PrintVisitor.prototype.BooleanLiteral = function(bool) { - return 'BOOLEAN{' + bool.value + '}'; -}; - -PrintVisitor.prototype.UndefinedLiteral = function() { - return 'UNDEFINED'; -}; - -PrintVisitor.prototype.NullLiteral = function() { - return 'NULL'; -}; - -PrintVisitor.prototype.Hash = function(hash) { - let pairs = hash.pairs, - joinedPairs = []; - - for (let i = 0, l = pairs.length; i < l; i++) { - joinedPairs.push(this.accept(pairs[i])); - } - - return 'HASH{' + joinedPairs.join(', ') + '}'; -}; -PrintVisitor.prototype.HashPair = function(pair) { - return pair.key + '=' + this.accept(pair.value); -}; -/*eslint-enable new-cap */ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/visitor.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/visitor.js deleted file mode 100644 index ba7b376..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/visitor.js +++ /dev/null @@ -1,119 +0,0 @@ -import Exception from '../exception'; -import AST from './ast'; - -function Visitor() { - this.parents = []; -} - -Visitor.prototype = { - constructor: Visitor, - mutating: false, - - // Visits a given value. If mutating, will replace the value if necessary. - acceptKey: function(node, name) { - let value = this.accept(node[name]); - if (this.mutating) { - // Hacky sanity check: - if (value && (!value.type || !AST[value.type])) { - throw new Exception('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type); - } - node[name] = value; - } - }, - - // Performs an accept operation with added sanity check to ensure - // required keys are not removed. - acceptRequired: function(node, name) { - this.acceptKey(node, name); - - if (!node[name]) { - throw new Exception(node.type + ' requires ' + name); - } - }, - - // Traverses a given array. If mutating, empty respnses will be removed - // for child elements. - acceptArray: function(array) { - for (let i = 0, l = array.length; i < l; i++) { - this.acceptKey(array, i); - - if (!array[i]) { - array.splice(i, 1); - i--; - l--; - } - } - }, - - accept: function(object) { - if (!object) { - return; - } - - if (this.current) { - this.parents.unshift(this.current); - } - this.current = object; - - let ret = this[object.type](object); - - this.current = this.parents.shift(); - - if (!this.mutating || ret) { - return ret; - } else if (ret !== false) { - return object; - } - }, - - Program: function(program) { - this.acceptArray(program.body); - }, - - MustacheStatement: function(mustache) { - this.acceptRequired(mustache, 'path'); - this.acceptArray(mustache.params); - this.acceptKey(mustache, 'hash'); - }, - - BlockStatement: function(block) { - this.acceptRequired(block, 'path'); - this.acceptArray(block.params); - this.acceptKey(block, 'hash'); - - this.acceptKey(block, 'program'); - this.acceptKey(block, 'inverse'); - }, - - PartialStatement: function(partial) { - this.acceptRequired(partial, 'name'); - this.acceptArray(partial.params); - this.acceptKey(partial, 'hash'); - }, - - ContentStatement: function(/* content */) {}, - CommentStatement: function(/* comment */) {}, - - SubExpression: function(sexpr) { - this.acceptRequired(sexpr, 'path'); - this.acceptArray(sexpr.params); - this.acceptKey(sexpr, 'hash'); - }, - - PathExpression: function(/* path */) {}, - - StringLiteral: function(/* string */) {}, - NumberLiteral: function(/* number */) {}, - BooleanLiteral: function(/* bool */) {}, - UndefinedLiteral: function(/* literal */) {}, - NullLiteral: function(/* literal */) {}, - - Hash: function(hash) { - this.acceptArray(hash.pairs); - }, - HashPair: function(pair) { - this.acceptRequired(pair, 'value'); - } -}; - -export default Visitor; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/whitespace-control.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/whitespace-control.js deleted file mode 100644 index 5b76944..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/compiler/whitespace-control.js +++ /dev/null @@ -1,208 +0,0 @@ -import Visitor from './visitor'; - -function WhitespaceControl() { -} -WhitespaceControl.prototype = new Visitor(); - -WhitespaceControl.prototype.Program = function(program) { - let isRoot = !this.isRootSeen; - this.isRootSeen = true; - - let body = program.body; - for (let i = 0, l = body.length; i < l; i++) { - let current = body[i], - strip = this.accept(current); - - if (!strip) { - continue; - } - - let _isPrevWhitespace = isPrevWhitespace(body, i, isRoot), - _isNextWhitespace = isNextWhitespace(body, i, isRoot), - - openStandalone = strip.openStandalone && _isPrevWhitespace, - closeStandalone = strip.closeStandalone && _isNextWhitespace, - inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace; - - if (strip.close) { - omitRight(body, i, true); - } - if (strip.open) { - omitLeft(body, i, true); - } - - if (inlineStandalone) { - omitRight(body, i); - - if (omitLeft(body, i)) { - // If we are on a standalone node, save the indent info for partials - if (current.type === 'PartialStatement') { - // Pull out the whitespace from the final line - current.indent = (/([ \t]+$)/).exec(body[i - 1].original)[1]; - } - } - } - if (openStandalone) { - omitRight((current.program || current.inverse).body); - - // Strip out the previous content node if it's whitespace only - omitLeft(body, i); - } - if (closeStandalone) { - // Always strip the next node - omitRight(body, i); - - omitLeft((current.inverse || current.program).body); - } - } - - return program; -}; -WhitespaceControl.prototype.BlockStatement = function(block) { - this.accept(block.program); - this.accept(block.inverse); - - // Find the inverse program that is involed with whitespace stripping. - let program = block.program || block.inverse, - inverse = block.program && block.inverse, - firstInverse = inverse, - lastInverse = inverse; - - if (inverse && inverse.chained) { - firstInverse = inverse.body[0].program; - - // Walk the inverse chain to find the last inverse that is actually in the chain. - while (lastInverse.chained) { - lastInverse = lastInverse.body[lastInverse.body.length - 1].program; - } - } - - let strip = { - open: block.openStrip.open, - close: block.closeStrip.close, - - // Determine the standalone candiacy. Basically flag our content as being possibly standalone - // so our parent can determine if we actually are standalone - openStandalone: isNextWhitespace(program.body), - closeStandalone: isPrevWhitespace((firstInverse || program).body) - }; - - if (block.openStrip.close) { - omitRight(program.body, null, true); - } - - if (inverse) { - let inverseStrip = block.inverseStrip; - - if (inverseStrip.open) { - omitLeft(program.body, null, true); - } - - if (inverseStrip.close) { - omitRight(firstInverse.body, null, true); - } - if (block.closeStrip.open) { - omitLeft(lastInverse.body, null, true); - } - - // Find standalone else statments - if (isPrevWhitespace(program.body) - && isNextWhitespace(firstInverse.body)) { - omitLeft(program.body); - omitRight(firstInverse.body); - } - } else if (block.closeStrip.open) { - omitLeft(program.body, null, true); - } - - return strip; -}; - -WhitespaceControl.prototype.MustacheStatement = function(mustache) { - return mustache.strip; -}; - -WhitespaceControl.prototype.PartialStatement = - WhitespaceControl.prototype.CommentStatement = function(node) { - /* istanbul ignore next */ - let strip = node.strip || {}; - return { - inlineStandalone: true, - open: strip.open, - close: strip.close - }; -}; - - -function isPrevWhitespace(body, i, isRoot) { - if (i === undefined) { - i = body.length; - } - - // Nodes that end with newlines are considered whitespace (but are special - // cased for strip operations) - let prev = body[i - 1], - sibling = body[i - 2]; - if (!prev) { - return isRoot; - } - - if (prev.type === 'ContentStatement') { - return (sibling || !isRoot ? (/\r?\n\s*?$/) : (/(^|\r?\n)\s*?$/)).test(prev.original); - } -} -function isNextWhitespace(body, i, isRoot) { - if (i === undefined) { - i = -1; - } - - let next = body[i + 1], - sibling = body[i + 2]; - if (!next) { - return isRoot; - } - - if (next.type === 'ContentStatement') { - return (sibling || !isRoot ? (/^\s*?\r?\n/) : (/^\s*?(\r?\n|$)/)).test(next.original); - } -} - -// Marks the node to the right of the position as omitted. -// I.e. {{foo}}' ' will mark the ' ' node as omitted. -// -// If i is undefined, then the first child will be marked as such. -// -// If mulitple is truthy then all whitespace will be stripped out until non-whitespace -// content is met. -function omitRight(body, i, multiple) { - let current = body[i == null ? 0 : i + 1]; - if (!current || current.type !== 'ContentStatement' || (!multiple && current.rightStripped)) { - return; - } - - let original = current.value; - current.value = current.value.replace(multiple ? (/^\s+/) : (/^[ \t]*\r?\n?/), ''); - current.rightStripped = current.value !== original; -} - -// Marks the node to the left of the position as omitted. -// I.e. ' '{{foo}} will mark the ' ' node as omitted. -// -// If i is undefined then the last child will be marked as such. -// -// If mulitple is truthy then all whitespace will be stripped out until non-whitespace -// content is met. -function omitLeft(body, i, multiple) { - let current = body[i == null ? body.length - 1 : i - 1]; - if (!current || current.type !== 'ContentStatement' || (!multiple && current.leftStripped)) { - return; - } - - // We omit the last node if it's whitespace only and not preceeded by a non-content node. - let original = current.value; - current.value = current.value.replace(multiple ? (/\s+$/) : (/[ \t]+$/), ''); - current.leftStripped = current.value !== original; - return current.leftStripped; -} - -export default WhitespaceControl; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/exception.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/exception.js deleted file mode 100644 index 46ce18e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/exception.js +++ /dev/null @@ -1,34 +0,0 @@ - -const errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; - -function Exception(message, node) { - let loc = node && node.loc, - line, - column; - if (loc) { - line = loc.start.line; - column = loc.start.column; - - message += ' - ' + line + ':' + column; - } - - let tmp = Error.prototype.constructor.call(this, message); - - // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. - for (let idx = 0; idx < errorProps.length; idx++) { - this[errorProps[idx]] = tmp[errorProps[idx]]; - } - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, Exception); - } - - if (loc) { - this.lineNumber = line; - this.column = column; - } -} - -Exception.prototype = new Error(); - -export default Exception; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/no-conflict.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/no-conflict.js deleted file mode 100644 index a421f57..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/no-conflict.js +++ /dev/null @@ -1,12 +0,0 @@ -/*global window */ -export default function(Handlebars) { - /* istanbul ignore next */ - let root = typeof global !== 'undefined' ? global : window, - $Handlebars = root.Handlebars; - /* istanbul ignore next */ - Handlebars.noConflict = function() { - if (root.Handlebars === Handlebars) { - root.Handlebars = $Handlebars; - } - }; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/runtime.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/runtime.js deleted file mode 100644 index 874728f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/runtime.js +++ /dev/null @@ -1,214 +0,0 @@ -import * as Utils from './utils'; -import Exception from './exception'; -import { COMPILER_REVISION, REVISION_CHANGES, createFrame } from './base'; - -export function checkRevision(compilerInfo) { - const compilerRevision = compilerInfo && compilerInfo[0] || 1, - currentRevision = COMPILER_REVISION; - - if (compilerRevision !== currentRevision) { - if (compilerRevision < currentRevision) { - const runtimeVersions = REVISION_CHANGES[currentRevision], - compilerVersions = REVISION_CHANGES[compilerRevision]; - throw new Exception('Template was precompiled with an older version of Handlebars than the current runtime. ' + - 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); - } else { - // Use the embedded version info since the runtime doesn't know about this revision yet - throw new Exception('Template was precompiled with a newer version of Handlebars than the current runtime. ' + - 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); - } - } -} - -// TODO: Remove this line and break up compilePartial - -export function template(templateSpec, env) { - /* istanbul ignore next */ - if (!env) { - throw new Exception('No environment passed to template'); - } - if (!templateSpec || !templateSpec.main) { - throw new Exception('Unknown template object: ' + typeof templateSpec); - } - - // Note: Using env.VM references rather than local var references throughout this section to allow - // for external users to override these as psuedo-supported APIs. - env.VM.checkRevision(templateSpec.compiler); - - function invokePartialWrapper(partial, context, options) { - if (options.hash) { - context = Utils.extend({}, context, options.hash); - } - - partial = env.VM.resolvePartial.call(this, partial, context, options); - let result = env.VM.invokePartial.call(this, partial, context, options); - - if (result == null && env.compile) { - options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); - result = options.partials[options.name](context, options); - } - if (result != null) { - if (options.indent) { - let lines = result.split('\n'); - for (let i = 0, l = lines.length; i < l; i++) { - if (!lines[i] && i + 1 === l) { - break; - } - - lines[i] = options.indent + lines[i]; - } - result = lines.join('\n'); - } - return result; - } else { - throw new Exception('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); - } - } - - // Just add water - let container = { - strict: function(obj, name) { - if (!(name in obj)) { - throw new Exception('"' + name + '" not defined in ' + obj); - } - return obj[name]; - }, - lookup: function(depths, name) { - const len = depths.length; - for (let i = 0; i < len; i++) { - if (depths[i] && depths[i][name] != null) { - return depths[i][name]; - } - } - }, - lambda: function(current, context) { - return typeof current === 'function' ? current.call(context) : current; - }, - - escapeExpression: Utils.escapeExpression, - invokePartial: invokePartialWrapper, - - fn: function(i) { - return templateSpec[i]; - }, - - programs: [], - program: function(i, data, declaredBlockParams, blockParams, depths) { - let programWrapper = this.programs[i], - fn = this.fn(i); - if (data || depths || blockParams || declaredBlockParams) { - programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); - } else if (!programWrapper) { - programWrapper = this.programs[i] = wrapProgram(this, i, fn); - } - return programWrapper; - }, - - data: function(value, depth) { - while (value && depth--) { - value = value._parent; - } - return value; - }, - merge: function(param, common) { - let obj = param || common; - - if (param && common && (param !== common)) { - obj = Utils.extend({}, common, param); - } - - return obj; - }, - - noop: env.VM.noop, - compilerInfo: templateSpec.compiler - }; - - function ret(context, options = {}) { - let data = options.data; - - ret._setup(options); - if (!options.partial && templateSpec.useData) { - data = initData(context, data); - } - let depths, - blockParams = templateSpec.useBlockParams ? [] : undefined; - if (templateSpec.useDepths) { - depths = options.depths ? [context].concat(options.depths) : [context]; - } - - return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths); - } - ret.isTop = true; - - ret._setup = function(options) { - if (!options.partial) { - container.helpers = container.merge(options.helpers, env.helpers); - - if (templateSpec.usePartial) { - container.partials = container.merge(options.partials, env.partials); - } - } else { - container.helpers = options.helpers; - container.partials = options.partials; - } - }; - - ret._child = function(i, data, blockParams, depths) { - if (templateSpec.useBlockParams && !blockParams) { - throw new Exception('must pass block params'); - } - if (templateSpec.useDepths && !depths) { - throw new Exception('must pass parent depths'); - } - - return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); - }; - return ret; -} - -export function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { - function prog(context, options = {}) { - return fn.call(container, - context, - container.helpers, container.partials, - options.data || data, - blockParams && [options.blockParams].concat(blockParams), - depths && [context].concat(depths)); - } - prog.program = i; - prog.depth = depths ? depths.length : 0; - prog.blockParams = declaredBlockParams || 0; - return prog; -} - -export function resolvePartial(partial, context, options) { - if (!partial) { - partial = options.partials[options.name]; - } else if (!partial.call && !options.name) { - // This is a dynamic partial that returned a string - options.name = partial; - partial = options.partials[partial]; - } - return partial; -} - -export function invokePartial(partial, context, options) { - options.partial = true; - - if (partial === undefined) { - throw new Exception('The partial ' + options.name + ' could not be found'); - } else if (partial instanceof Function) { - return partial(context, options); - } -} - -export function noop() { return ''; } - -function initData(context, data) { - if (!data || !('root' in data)) { - data = data ? createFrame(data) : {}; - data.root = context; - } - return data; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/safe-string.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/safe-string.js deleted file mode 100644 index 4680194..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/safe-string.js +++ /dev/null @@ -1,10 +0,0 @@ -// Build out our basic SafeString type -function SafeString(string) { - this.string = string; -} - -SafeString.prototype.toString = SafeString.prototype.toHTML = function() { - return '' + this.string; -}; - -export default SafeString; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/utils.js deleted file mode 100644 index c522394..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/handlebars/utils.js +++ /dev/null @@ -1,101 +0,0 @@ -const escape = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '`': '`' -}; - -const badChars = /[&<>"'`]/g, - possible = /[&<>"'`]/; - -function escapeChar(chr) { - return escape[chr]; -} - -export function extend(obj /* , ...source */) { - for (let i = 1; i < arguments.length; i++) { - for (let key in arguments[i]) { - if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { - obj[key] = arguments[i][key]; - } - } - } - - return obj; -} - -export let toString = Object.prototype.toString; - -// Sourced from lodash -// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt -/*eslint-disable func-style, no-var */ -var isFunction = function(value) { - return typeof value === 'function'; -}; -// fallback for older versions of Chrome and Safari -/* istanbul ignore next */ -if (isFunction(/x/)) { - isFunction = function(value) { - return typeof value === 'function' && toString.call(value) === '[object Function]'; - }; -} -export var isFunction; -/*eslint-enable func-style, no-var */ - -/* istanbul ignore next */ -export const isArray = Array.isArray || function(value) { - return (value && typeof value === 'object') ? toString.call(value) === '[object Array]' : false; -}; - -// Older IE versions do not directly support indexOf so we must implement our own, sadly. -export function indexOf(array, value) { - for (let i = 0, len = array.length; i < len; i++) { - if (array[i] === value) { - return i; - } - } - return -1; -} - - -export function escapeExpression(string) { - if (typeof string !== 'string') { - // don't escape SafeStrings, since they're already safe - if (string && string.toHTML) { - return string.toHTML(); - } else if (string == null) { - return ''; - } else if (!string) { - return string + ''; - } - - // Force a string conversion as this will be done by the append regardless and - // the regex test will do this transparently behind the scenes, causing issues if - // an object's to string has escaped characters in it. - string = '' + string; - } - - if (!possible.test(string)) { return string; } - return string.replace(badChars, escapeChar); -} - -export function isEmpty(value) { - if (!value && value !== 0) { - return true; - } else if (isArray(value) && value.length === 0) { - return true; - } else { - return false; - } -} - -export function blockParams(params, ids) { - params.path = ids; - return params; -} - -export function appendContextPath(contextPath, id) { - return (contextPath ? contextPath + '.' : '') + id; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/index.js deleted file mode 100644 index 0383c02..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/index.js +++ /dev/null @@ -1,25 +0,0 @@ -// USAGE: -// var handlebars = require('handlebars'); -/* eslint-disable no-var */ - -// var local = handlebars.create(); - -var handlebars = require('../dist/cjs/handlebars')['default']; - -var printer = require('../dist/cjs/handlebars/compiler/printer'); -handlebars.PrintVisitor = printer.PrintVisitor; -handlebars.print = printer.print; - -module.exports = handlebars; - -// Publish a Node.js require() handler for .handlebars and .hbs files -function extension(module, filename) { - var fs = require('fs'); - var templateString = fs.readFileSync(filename, 'utf8'); - module.exports = handlebars.compile(templateString); -} -/* istanbul ignore else */ -if (typeof require !== 'undefined' && require.extensions) { - require.extensions['.handlebars'] = extension; - require.extensions['.hbs'] = extension; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/precompiler.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/precompiler.js deleted file mode 100644 index 48cfebd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/lib/precompiler.js +++ /dev/null @@ -1,178 +0,0 @@ -/*eslint-disable no-console */ -import fs from 'fs'; -import * as Handlebars from './handlebars'; -import {basename} from 'path'; -import {SourceMapConsumer, SourceNode} from 'source-map'; -import uglify from 'uglify-js'; - -module.exports.cli = function(opts) { - if (opts.version) { - console.log(Handlebars.VERSION); - return; - } - - if (!opts.templates.length) { - throw new Handlebars.Exception('Must define at least one template or directory.'); - } - - opts.templates.forEach(function(template) { - try { - fs.statSync(template); - } catch (err) { - throw new Handlebars.Exception(`Unable to open template file "${template}"`); - } - }); - - if (opts.simple && opts.min) { - throw new Handlebars.Exception('Unable to minimize simple output'); - } - if (opts.simple && (opts.templates.length !== 1 || fs.statSync(opts.templates[0]).isDirectory())) { - throw new Handlebars.Exception('Unable to output multiple templates in simple mode'); - } - - // Convert the known list into a hash - let known = {}; - if (opts.known && !Array.isArray(opts.known)) { - opts.known = [opts.known]; - } - if (opts.known) { - for (let i = 0, len = opts.known.length; i < len; i++) { - known[opts.known[i]] = true; - } - } - - // Build file extension pattern - let extension = opts.extension.replace(/[\\^$*+?.():=!|{}\-\[\]]/g, function(arg) { return '\\' + arg; }); - extension = new RegExp('\\.' + extension + '$'); - - let output = new SourceNode(); - if (!opts.simple) { - if (opts.amd) { - output.add('define([\'' + opts.handlebarPath + 'handlebars.runtime\'], function(Handlebars) {\n Handlebars = Handlebars["default"];'); - } else if (opts.commonjs) { - output.add('var Handlebars = require("' + opts.commonjs + '");'); - } else { - output.add('(function() {\n'); - } - output.add(' var template = Handlebars.template, templates = '); - if (opts.namespace) { - output.add(opts.namespace); - output.add(' = '); - output.add(opts.namespace); - output.add(' || '); - } - output.add('{};\n'); - } - function processTemplate(template, root) { - let path = template, - stat = fs.statSync(path); - if (stat.isDirectory()) { - fs.readdirSync(template).map(function(file) { - let childPath = template + '/' + file; - - if (extension.test(childPath) || fs.statSync(childPath).isDirectory()) { - processTemplate(childPath, root || template); - } - }); - } else { - let data = fs.readFileSync(path, 'utf8'); - - if (opts.bom && data.indexOf('\uFEFF') === 0) { - data = data.substring(1); - } - - let options = { - knownHelpers: known, - knownHelpersOnly: opts.o - }; - - if (opts.map) { - options.srcName = path; - } - if (opts.data) { - options.data = true; - } - - // Clean the template name - if (!root) { - template = basename(template); - } else if (template.indexOf(root) === 0) { - template = template.substring(root.length + 1); - } - template = template.replace(extension, ''); - - let precompiled = Handlebars.precompile(data, options); - - // If we are generating a source map, we have to reconstruct the SourceNode object - if (opts.map) { - let consumer = new SourceMapConsumer(precompiled.map); - precompiled = SourceNode.fromStringWithSourceMap(precompiled.code, consumer); - } - - if (opts.simple) { - output.add([precompiled, '\n']); - } else if (opts.partial) { - if (opts.amd && (opts.templates.length == 1 && !fs.statSync(opts.templates[0]).isDirectory())) { - output.add('return '); - } - output.add(['Handlebars.partials[\'', template, '\'] = template(', precompiled, ');\n']); - } else { - if (opts.amd && (opts.templates.length == 1 && !fs.statSync(opts.templates[0]).isDirectory())) { - output.add('return '); - } - output.add(['templates[\'', template, '\'] = template(', precompiled, ');\n']); - } - } - } - - opts.templates.forEach(function(template) { - processTemplate(template, opts.root); - }); - - // Output the content - if (!opts.simple) { - if (opts.amd) { - if (opts.templates.length > 1 || (opts.templates.length == 1 && fs.statSync(opts.templates[0]).isDirectory())) { - if (opts.partial) { - output.add('return Handlebars.partials;\n'); - } else { - output.add('return templates;\n'); - } - } - output.add('});'); - } else if (!opts.commonjs) { - output.add('})();'); - } - } - - - if (opts.map) { - output.add('\n//# sourceMappingURL=' + opts.map + '\n'); - } - - output = output.toStringWithSourceMap(); - output.map = output.map + ''; - - if (opts.min) { - output = uglify.minify(output.code, { - fromString: true, - - outSourceMap: opts.map, - inSourceMap: JSON.parse(output.map) - }); - if (opts.map) { - output.code += '\n//# sourceMappingURL=' + opts.map + '\n'; - } - } - - if (opts.map) { - fs.writeFileSync(opts.map, output.map, 'utf8'); - } - output = output.code; - - if (opts.output) { - fs.writeFileSync(opts.output, output, 'utf8'); - } else { - console.log(output); - } -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/.bin/uglifyjs b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/.bin/uglifyjs deleted file mode 120000 index fef3468..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/.bin/uglifyjs +++ /dev/null @@ -1 +0,0 @@ -../uglify-js/bin/uglifyjs \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/.travis.yml deleted file mode 100644 index cc4dba2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/LICENSE deleted file mode 100644 index 432d1ae..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright 2010 James Halliday (mail@substack.net) - -This project is free software released under the MIT/X11 license: - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/bool.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/bool.js deleted file mode 100644 index a998fb7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/bool.js +++ /dev/null @@ -1,10 +0,0 @@ -#!/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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_double.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_double.js deleted file mode 100644 index a35a7e6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_double.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_single.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_single.js deleted file mode 100644 index 017bb68..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/boolean_single.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var argv = require('optimist') - .boolean('v') - .argv -; -console.dir(argv.v); -console.dir(argv._); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_hash.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_hash.js deleted file mode 100644 index ade7768..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_hash.js +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env node - -var argv = require('optimist') - .default({ x : 10, y : 10 }) - .argv -; - -console.log(argv.x + argv.y); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_singles.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_singles.js deleted file mode 100644 index d9b1ff4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/default_singles.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var argv = require('optimist') - .default('x', 10) - .default('y', 10) - .argv -; -console.log(argv.x + argv.y); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/divide.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/divide.js deleted file mode 100644 index 5e2ee82..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/divide.js +++ /dev/null @@ -1,8 +0,0 @@ -#!/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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count.js deleted file mode 100644 index b5f95bf..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count.js +++ /dev/null @@ -1,20 +0,0 @@ -#!/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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_options.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_options.js deleted file mode 100644 index d9ac709..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_options.js +++ /dev/null @@ -1,29 +0,0 @@ -#!/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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_wrap.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_wrap.js deleted file mode 100644 index 4267511..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/line_count_wrap.js +++ /dev/null @@ -1,29 +0,0 @@ -#!/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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/nonopt.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/nonopt.js deleted file mode 100644 index ee633ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/nonopt.js +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env node -var argv = require('optimist').argv; -console.log('(%d,%d)', argv.x, argv.y); -console.log(argv._); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/reflect.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/reflect.js deleted file mode 100644 index 816b3e1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/reflect.js +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -console.dir(require('optimist').argv); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/short.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/short.js deleted file mode 100644 index 1db0ad0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/short.js +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node -var argv = require('optimist').argv; -console.log('(%d,%d)', argv.x, argv.y); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/string.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/string.js deleted file mode 100644 index a8e5aeb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/string.js +++ /dev/null @@ -1,11 +0,0 @@ -#!/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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/usage-options.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/usage-options.js deleted file mode 100644 index b999977..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/usage-options.js +++ /dev/null @@ -1,19 +0,0 @@ -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/xup.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/xup.js deleted file mode 100644 index 8f6ecd2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/example/xup.js +++ /dev/null @@ -1,10 +0,0 @@ -#!/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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/index.js deleted file mode 100644 index 4da5a6d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/index.js +++ /dev/null @@ -1,343 +0,0 @@ -var path = require('path'); -var minimist = require('minimist'); -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 (processArgs, 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 options = { - boolean: [], - string: [], - alias: {}, - default: [] - }; - - self.boolean = function (bools) { - options.boolean.push.apply(options.boolean, [].concat(bools)); - return self; - }; - - self.string = function (strings) { - options.string.push.apply(options.string, [].concat(strings)); - return self; - }; - - self.default = function (key, value) { - if (typeof key === 'object') { - Object.keys(key).forEach(function (k) { - self.default(k, key[k]); - }); - } - else { - options.default[key] = value; - } - return self; - }; - - self.alias = function (x, y) { - if (typeof x === 'object') { - Object.keys(x).forEach(function (key) { - self.alias(key, x[key]); - }); - } - else { - options.alias[x] = (options.alias[x] || []).concat(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 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 parseArgs(args); - }; - - 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(options.default)) - .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(options.alias[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 (options.boolean[key]) type = '[boolean]'; - if (options.string[key]) type = '[string]'; - - if (!wrap && dpadding.length > 0) { - desc += dpadding; - } - - var prelude = ' ' + kswitch + spadding; - var extra = [ - type, - demanded[key] - ? '[required]' - : null - , - options.default[key] !== undefined - ? '[default: ' + JSON.stringify(options.default[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 : function () { return parseArgs(processArgs) }, - enumerable : true, - }); - - function parseArgs (args) { - var argv = minimist(args, options); - argv.$0 = self.$0; - - 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; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/.travis.yml deleted file mode 100644 index cc4dba2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/LICENSE deleted file mode 100644 index ee27ba4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -This software is released under the MIT 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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/example/parse.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/example/parse.js deleted file mode 100644 index abff3e8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/example/parse.js +++ /dev/null @@ -1,2 +0,0 @@ -var argv = require('../')(process.argv.slice(2)); -console.dir(argv); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/index.js deleted file mode 100644 index 71fb830..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/index.js +++ /dev/null @@ -1,187 +0,0 @@ -module.exports = function (args, opts) { - if (!opts) opts = {}; - - var flags = { bools : {}, strings : {} }; - - [].concat(opts['boolean']).filter(Boolean).forEach(function (key) { - flags.bools[key] = true; - }); - - var aliases = {}; - Object.keys(opts.alias || {}).forEach(function (key) { - aliases[key] = [].concat(opts.alias[key]); - aliases[key].forEach(function (x) { - aliases[x] = [key].concat(aliases[key].filter(function (y) { - return x !== y; - })); - }); - }); - - [].concat(opts.string).filter(Boolean).forEach(function (key) { - flags.strings[key] = true; - if (aliases[key]) { - flags.strings[aliases[key]] = true; - } - }); - - var defaults = opts['default'] || {}; - - var argv = { _ : [] }; - Object.keys(flags.bools).forEach(function (key) { - setArg(key, defaults[key] === undefined ? false : defaults[key]); - }); - - var notFlags = []; - - if (args.indexOf('--') !== -1) { - notFlags = args.slice(args.indexOf('--')+1); - args = args.slice(0, args.indexOf('--')); - } - - function setArg (key, val) { - var value = !flags.strings[key] && isNumber(val) - ? Number(val) : val - ; - setKey(argv, key.split('.'), value); - - (aliases[key] || []).forEach(function (x) { - setKey(argv, x.split('.'), value); - }); - } - - for (var i = 0; i < args.length; i++) { - var arg = args[i]; - - if (/^--.+=/.test(arg)) { - // 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 (/^--no-.+/.test(arg)) { - var key = arg.match(/^--no-(.+)/)[1]; - setArg(key, false); - } - else if (/^--.+/.test(arg)) { - var key = arg.match(/^--(.+)/)[1]; - var next = args[i + 1]; - if (next !== undefined && !/^-/.test(next) - && !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, flags.strings[key] ? '' : true); - } - } - else if (/^-[^-]+/.test(arg)) { - 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 (next === '-') { - setArg(letters[j], next) - continue; - } - - if (/[A-Za-z]/.test(letters[j]) - && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) { - setArg(letters[j], next); - broken = true; - break; - } - - if (letters[j+1] && letters[j+1].match(/\W/)) { - setArg(letters[j], arg.slice(j+2)); - broken = true; - break; - } - else { - setArg(letters[j], flags.strings[letters[j]] ? '' : true); - } - } - - var key = arg.slice(-1)[0]; - if (!broken && key !== '-') { - if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1]) - && !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, flags.strings[key] ? '' : true); - } - } - } - else { - argv._.push( - flags.strings['_'] || !isNumber(arg) ? arg : Number(arg) - ); - } - } - - Object.keys(defaults).forEach(function (key) { - if (!hasKey(argv, key.split('.'))) { - setKey(argv, key.split('.'), defaults[key]); - - (aliases[key] || []).forEach(function (x) { - setKey(argv, x.split('.'), defaults[key]); - }); - } - }); - - notFlags.forEach(function(key) { - argv._.push(key); - }); - - return argv; -}; - -function hasKey (obj, keys) { - var o = obj; - keys.slice(0,-1).forEach(function (key) { - o = (o[key] || {}); - }); - - var key = keys[keys.length - 1]; - return key in o; -} - -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 ]; - } -} - -function isNumber (x) { - if (typeof x === 'number') return true; - if (/^0x[0-9a-f]+$/i.test(x)) return true; - return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x); -} - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/package.json deleted file mode 100644 index 6c08d0a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "minimist", - "version": "0.0.10", - "description": "parse argument options", - "main": "index.js", - "devDependencies": { - "tape": "~1.0.4", - "tap": "~0.4.0" - }, - "scripts": { - "test": "tap test/*.js" - }, - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/6..latest", - "ff/5", - "firefox/latest", - "chrome/10", - "chrome/latest", - "safari/5.1", - "safari/latest", - "opera/12" - ] - }, - "repository": { - "type": "git", - "url": "git://github.com/substack/minimist.git" - }, - "homepage": "https://github.com/substack/minimist", - "keywords": [ - "argv", - "getopt", - "parser", - "optimist" - ], - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/substack/minimist/issues" - }, - "_id": "minimist@0.0.10", - "dist": { - "shasum": "de3f98543dbf96082be48ad1a0c7cda836301dcf", - "tarball": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" - }, - "_from": "minimist@>=0.0.1 <0.1.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "substack", - "email": "mail@substack.net" - }, - "maintainers": [ - { - "name": "substack", - "email": "mail@substack.net" - } - ], - "directories": {}, - "_shasum": "de3f98543dbf96082be48ad1a0c7cda836301dcf", - "_resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/readme.markdown b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/readme.markdown deleted file mode 100644 index c256353..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/readme.markdown +++ /dev/null @@ -1,73 +0,0 @@ -# minimist - -parse argument options - -This module is the guts of optimist's argument parser without all the -fanciful decoration. - -[![browser support](https://ci.testling.com/substack/minimist.png)](http://ci.testling.com/substack/minimist) - -[![build status](https://secure.travis-ci.org/substack/minimist.png)](http://travis-ci.org/substack/minimist) - -# example - -``` js -var argv = require('minimist')(process.argv.slice(2)); -console.dir(argv); -``` - -``` -$ node example/parse.js -a beep -b boop -{ _: [], a: 'beep', b: 'boop' } -``` - -``` -$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz -{ _: [ 'foo', 'bar', 'baz' ], - x: 3, - y: 4, - n: 5, - a: true, - b: true, - c: true, - beep: 'boop' } -``` - -# methods - -``` js -var parseArgs = require('minimist') -``` - -## var argv = parseArgs(args, opts={}) - -Return an argument object `argv` populated with the array arguments from `args`. - -`argv._` contains all the arguments that didn't have an option associated with -them. - -Numeric-looking arguments will be returned as numbers unless `opts.string` or -`opts.boolean` is set for that argument name. - -Any arguments after `'--'` will not be parsed and will end up in `argv._`. - -options can be: - -* `opts.string` - a string or array of strings argument names to always treat as -strings -* `opts.boolean` - a string or array of strings to always treat as booleans -* `opts.alias` - an object mapping string names to strings or arrays of string -argument names to use as aliases -* `opts.default` - an object mapping string argument names to default values - -# install - -With [npm](https://npmjs.org) do: - -``` -npm install minimist -``` - -# license - -MIT diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/bool.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/bool.js deleted file mode 100644 index 749e083..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/bool.js +++ /dev/null @@ -1,119 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('flag boolean default false', function (t) { - var argv = parse(['moo'], { - boolean: ['t', 'verbose'], - default: { verbose: false, t: false } - }); - - t.deepEqual(argv, { - verbose: false, - t: false, - _: ['moo'] - }); - - t.deepEqual(typeof argv.verbose, 'boolean'); - t.deepEqual(typeof argv.t, 'boolean'); - t.end(); - -}); - -test('boolean groups', function (t) { - var argv = parse([ '-x', '-z', 'one', 'two', 'three' ], { - boolean: ['x','y','z'] - }); - - t.deepEqual(argv, { - x : true, - y : false, - z : true, - _ : [ 'one', 'two', 'three' ] - }); - - t.deepEqual(typeof argv.x, 'boolean'); - t.deepEqual(typeof argv.y, 'boolean'); - t.deepEqual(typeof argv.z, 'boolean'); - t.end(); -}); -test('boolean and alias with chainable api', function (t) { - var aliased = [ '-h', 'derp' ]; - var regular = [ '--herp', 'derp' ]; - var opts = { - herp: { alias: 'h', boolean: true } - }; - var aliasedArgv = parse(aliased, { - boolean: 'herp', - alias: { h: 'herp' } - }); - var propertyArgv = parse(regular, { - boolean: 'herp', - alias: { h: 'herp' } - }); - var expected = { - herp: true, - h: true, - '_': [ 'derp' ] - }; - - t.same(aliasedArgv, expected); - t.same(propertyArgv, expected); - t.end(); -}); - -test('boolean and alias with options hash', function (t) { - var aliased = [ '-h', 'derp' ]; - var regular = [ '--herp', 'derp' ]; - var opts = { - alias: { 'h': 'herp' }, - boolean: 'herp' - }; - var aliasedArgv = parse(aliased, opts); - var propertyArgv = parse(regular, opts); - var expected = { - herp: true, - h: true, - '_': [ 'derp' ] - }; - t.same(aliasedArgv, expected); - t.same(propertyArgv, expected); - t.end(); -}); - -test('boolean and alias using explicit true', function (t) { - var aliased = [ '-h', 'true' ]; - var regular = [ '--herp', 'true' ]; - var opts = { - alias: { h: 'herp' }, - boolean: 'h' - }; - var aliasedArgv = parse(aliased, opts); - var propertyArgv = parse(regular, opts); - var expected = { - herp: true, - h: true, - '_': [ ] - }; - - t.same(aliasedArgv, expected); - t.same(propertyArgv, expected); - t.end(); -}); - -// regression, see https://github.com/substack/node-optimist/issues/71 -test('boolean and --x=true', function(t) { - var parsed = parse(['--boool', '--other=true'], { - boolean: 'boool' - }); - - t.same(parsed.boool, true); - t.same(parsed.other, 'true'); - - parsed = parse(['--boool', '--other=false'], { - boolean: 'boool' - }); - - t.same(parsed.boool, true); - t.same(parsed.other, 'false'); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dash.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dash.js deleted file mode 100644 index 8b034b9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dash.js +++ /dev/null @@ -1,24 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('-', function (t) { - t.plan(5); - t.deepEqual(parse([ '-n', '-' ]), { n: '-', _: [] }); - t.deepEqual(parse([ '-' ]), { _: [ '-' ] }); - t.deepEqual(parse([ '-f-' ]), { f: '-', _: [] }); - t.deepEqual( - parse([ '-b', '-' ], { boolean: 'b' }), - { b: true, _: [ '-' ] } - ); - t.deepEqual( - parse([ '-s', '-' ], { string: 's' }), - { s: '-', _: [] } - ); -}); - -test('-a -- b', function (t) { - t.plan(3); - t.deepEqual(parse([ '-a', '--', 'b' ]), { a: true, _: [ 'b' ] }); - t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] }); - t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/default_bool.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/default_bool.js deleted file mode 100644 index f0041ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/default_bool.js +++ /dev/null @@ -1,20 +0,0 @@ -var test = require('tape'); -var parse = require('../'); - -test('boolean default true', function (t) { - var argv = parse([], { - boolean: 'sometrue', - default: { sometrue: true } - }); - t.equal(argv.sometrue, true); - t.end(); -}); - -test('boolean default false', function (t) { - var argv = parse([], { - boolean: 'somefalse', - default: { somefalse: false } - }); - t.equal(argv.somefalse, false); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dotted.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dotted.js deleted file mode 100644 index d8b3e85..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/dotted.js +++ /dev/null @@ -1,22 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('dotted alias', function (t) { - var argv = parse(['--a.b', '22'], {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}}); - t.equal(argv.a.b, 22); - t.equal(argv.aa.bb, 22); - t.end(); -}); - -test('dotted default', function (t) { - var argv = parse('', {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}}); - t.equal(argv.a.b, 11); - t.equal(argv.aa.bb, 11); - t.end(); -}); - -test('dotted default with no alias', function (t) { - var argv = parse('', {default: {'a.b': 11}}); - t.equal(argv.a.b, 11); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/long.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/long.js deleted file mode 100644 index 5d3a1e0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/long.js +++ /dev/null @@ -1,31 +0,0 @@ -var test = require('tape'); -var parse = require('../'); - -test('long opts', function (t) { - t.deepEqual( - parse([ '--bool' ]), - { bool : true, _ : [] }, - 'long boolean' - ); - t.deepEqual( - parse([ '--pow', 'xixxle' ]), - { pow : 'xixxle', _ : [] }, - 'long capture sp' - ); - t.deepEqual( - parse([ '--pow=xixxle' ]), - { pow : 'xixxle', _ : [] }, - 'long capture eq' - ); - t.deepEqual( - parse([ '--host', 'localhost', '--port', '555' ]), - { host : 'localhost', port : 555, _ : [] }, - 'long captures sp' - ); - t.deepEqual( - parse([ '--host=localhost', '--port=555' ]), - { host : 'localhost', port : 555, _ : [] }, - 'long captures eq' - ); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/num.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/num.js deleted file mode 100644 index 2cc77f4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/num.js +++ /dev/null @@ -1,36 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('nums', function (t) { - var argv = parse([ - '-x', '1234', - '-y', '5.67', - '-z', '1e7', - '-w', '10f', - '--hex', '0xdeadbeef', - '789' - ]); - t.deepEqual(argv, { - x : 1234, - y : 5.67, - z : 1e7, - w : '10f', - hex : 0xdeadbeef, - _ : [ 789 ] - }); - t.deepEqual(typeof argv.x, 'number'); - t.deepEqual(typeof argv.y, 'number'); - t.deepEqual(typeof argv.z, 'number'); - t.deepEqual(typeof argv.w, 'string'); - t.deepEqual(typeof argv.hex, 'number'); - t.deepEqual(typeof argv._[0], 'number'); - t.end(); -}); - -test('already a number', function (t) { - var argv = parse([ '-x', 1234, 789 ]); - t.deepEqual(argv, { x : 1234, _ : [ 789 ] }); - t.deepEqual(typeof argv.x, 'number'); - t.deepEqual(typeof argv._[0], 'number'); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse.js deleted file mode 100644 index 7b4a2a1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse.js +++ /dev/null @@ -1,197 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('parse args', function (t) { - t.deepEqual( - parse([ '--no-moo' ]), - { moo : false, _ : [] }, - 'no' - ); - t.deepEqual( - parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]), - { v : ['a','b','c'], _ : [] }, - 'multi' - ); - t.end(); -}); - -test('comprehensive', function (t) { - t.deepEqual( - parse([ - '--name=meowmers', 'bare', '-cats', 'woo', - '-h', 'awesome', '--multi=quux', - '--key', 'value', - '-b', '--bool', '--no-meep', '--multi=baz', - '--', '--not-a-flag', 'eek' - ]), - { - c : true, - a : true, - t : true, - s : 'woo', - h : 'awesome', - b : true, - bool : true, - key : 'value', - multi : [ 'quux', 'baz' ], - meep : false, - name : 'meowmers', - _ : [ 'bare', '--not-a-flag', 'eek' ] - } - ); - t.end(); -}); - -test('flag boolean', function (t) { - var argv = parse([ '-t', 'moo' ], { boolean: 't' }); - t.deepEqual(argv, { t : true, _ : [ 'moo' ] }); - t.deepEqual(typeof argv.t, 'boolean'); - t.end(); -}); - -test('flag boolean value', function (t) { - var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], { - boolean: [ 't', 'verbose' ], - default: { verbose: true } - }); - - t.deepEqual(argv, { - verbose: false, - t: true, - _: ['moo'] - }); - - t.deepEqual(typeof argv.verbose, 'boolean'); - t.deepEqual(typeof argv.t, 'boolean'); - t.end(); -}); - -test('newlines in params' , function (t) { - var args = parse([ '-s', "X\nX" ]) - t.deepEqual(args, { _ : [], s : "X\nX" }); - - // reproduce in bash: - // VALUE="new - // line" - // node program.js --s="$VALUE" - args = parse([ "--s=X\nX" ]) - t.deepEqual(args, { _ : [], s : "X\nX" }); - t.end(); -}); - -test('strings' , function (t) { - var s = parse([ '-s', '0001234' ], { string: 's' }).s; - t.equal(s, '0001234'); - t.equal(typeof s, 'string'); - - var x = parse([ '-x', '56' ], { string: 'x' }).x; - t.equal(x, '56'); - t.equal(typeof x, 'string'); - t.end(); -}); - -test('stringArgs', function (t) { - var s = parse([ ' ', ' ' ], { string: '_' })._; - t.same(s.length, 2); - t.same(typeof s[0], 'string'); - t.same(s[0], ' '); - t.same(typeof s[1], 'string'); - t.same(s[1], ' '); - t.end(); -}); - -test('empty strings', function(t) { - var s = parse([ '-s' ], { string: 's' }).s; - t.equal(s, ''); - t.equal(typeof s, 'string'); - - var str = parse([ '--str' ], { string: 'str' }).str; - t.equal(str, ''); - t.equal(typeof str, 'string'); - - var letters = parse([ '-art' ], { - string: [ 'a', 't' ] - }); - - t.equal(letters.a, ''); - t.equal(letters.r, true); - t.equal(letters.t, ''); - - t.end(); -}); - - -test('string and alias', function(t) { - var x = parse([ '--str', '000123' ], { - string: 's', - alias: { s: 'str' } - }); - - t.equal(x.str, '000123'); - t.equal(typeof x.str, 'string'); - t.equal(x.s, '000123'); - t.equal(typeof x.s, 'string'); - - var y = parse([ '-s', '000123' ], { - string: 'str', - alias: { str: 's' } - }); - - t.equal(y.str, '000123'); - t.equal(typeof y.str, 'string'); - t.equal(y.s, '000123'); - t.equal(typeof y.s, 'string'); - t.end(); -}); - -test('slashBreak', function (t) { - t.same( - parse([ '-I/foo/bar/baz' ]), - { I : '/foo/bar/baz', _ : [] } - ); - t.same( - parse([ '-xyz/foo/bar/baz' ]), - { x : true, y : true, z : '/foo/bar/baz', _ : [] } - ); - t.end(); -}); - -test('alias', function (t) { - var argv = parse([ '-f', '11', '--zoom', '55' ], { - alias: { z: 'zoom' } - }); - t.equal(argv.zoom, 55); - t.equal(argv.z, argv.zoom); - t.equal(argv.f, 11); - t.end(); -}); - -test('multiAlias', function (t) { - var argv = parse([ '-f', '11', '--zoom', '55' ], { - alias: { z: [ 'zm', 'zoom' ] } - }); - t.equal(argv.zoom, 55); - t.equal(argv.z, argv.zoom); - t.equal(argv.z, argv.zm); - t.equal(argv.f, 11); - t.end(); -}); - -test('nested dotted objects', function (t) { - var argv = parse([ - '--foo.bar', '3', '--foo.baz', '4', - '--foo.quux.quibble', '5', '--foo.quux.o_O', - '--beep.boop' - ]); - - t.same(argv.foo, { - bar : 3, - baz : 4, - quux : { - quibble : 5, - o_O : true - } - }); - t.same(argv.beep, { boop : true }); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse_modified.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse_modified.js deleted file mode 100644 index 21851b0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/parse_modified.js +++ /dev/null @@ -1,9 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('parse with modifier functions' , function (t) { - t.plan(1); - - var argv = parse([ '-b', '123' ], { boolean: 'b' }); - t.deepEqual(argv, { b: true, _: ['123'] }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/short.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/short.js deleted file mode 100644 index d513a1c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/short.js +++ /dev/null @@ -1,67 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('numeric short args', function (t) { - t.plan(2); - t.deepEqual(parse([ '-n123' ]), { n: 123, _: [] }); - t.deepEqual( - parse([ '-123', '456' ]), - { 1: true, 2: true, 3: 456, _: [] } - ); -}); - -test('short', function (t) { - t.deepEqual( - parse([ '-b' ]), - { b : true, _ : [] }, - 'short boolean' - ); - t.deepEqual( - parse([ 'foo', 'bar', 'baz' ]), - { _ : [ 'foo', 'bar', 'baz' ] }, - 'bare' - ); - t.deepEqual( - parse([ '-cats' ]), - { c : true, a : true, t : true, s : true, _ : [] }, - 'group' - ); - t.deepEqual( - parse([ '-cats', 'meow' ]), - { c : true, a : true, t : true, s : 'meow', _ : [] }, - 'short group next' - ); - t.deepEqual( - parse([ '-h', 'localhost' ]), - { h : 'localhost', _ : [] }, - 'short capture' - ); - t.deepEqual( - parse([ '-h', 'localhost', '-p', '555' ]), - { h : 'localhost', p : 555, _ : [] }, - 'short captures' - ); - t.end(); -}); - -test('mixed short bool and capture', function (t) { - t.same( - parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), - { - f : true, p : 555, h : 'localhost', - _ : [ 'script.js' ] - } - ); - t.end(); -}); - -test('short and long', function (t) { - t.deepEqual( - parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), - { - f : true, p : 555, h : 'localhost', - _ : [ 'script.js' ] - } - ); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/whitespace.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/whitespace.js deleted file mode 100644 index 8a52a58..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/minimist/test/whitespace.js +++ /dev/null @@ -1,8 +0,0 @@ -var parse = require('../'); -var test = require('tape'); - -test('whitespace should be whitespace' , function (t) { - t.plan(1); - var x = parse([ '-x', '\t' ]).x; - t.equal(x, '\t'); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/LICENSE deleted file mode 100644 index ee27ba4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -This software is released under the MIT 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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/README.markdown b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/README.markdown deleted file mode 100644 index 346374e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/README.markdown +++ /dev/null @@ -1,70 +0,0 @@ -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/center.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/center.js deleted file mode 100644 index a3fbaae..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/center.js +++ /dev/null @@ -1,10 +0,0 @@ -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/meat.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/meat.js deleted file mode 100644 index a4665e1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/example/meat.js +++ /dev/null @@ -1,3 +0,0 @@ -var wrap = require('wordwrap')(15); - -console.log(wrap('You and your whole family are made out of meat.')); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/index.js deleted file mode 100644 index c9bc945..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/index.js +++ /dev/null @@ -1,76 +0,0 @@ -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/package.json deleted file mode 100644 index 1f0527e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "wordwrap", - "description": "Wrap those words. Show them at what columns to start and stop.", - "version": "0.0.3", - "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", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "gitHead": "e59aa1bd338914019456bdfba034508c9c4cb29d", - "bugs": { - "url": "https://github.com/substack/node-wordwrap/issues" - }, - "homepage": "https://github.com/substack/node-wordwrap#readme", - "_id": "wordwrap@0.0.3", - "_shasum": "a3d5da6cd5c0bc0008d37234bbaf1bed63059107", - "_from": "wordwrap@>=0.0.2 <0.1.0", - "_npmVersion": "2.9.0", - "_nodeVersion": "2.0.0", - "_npmUser": { - "name": "substack", - "email": "substack@gmail.com" - }, - "dist": { - "shasum": "a3d5da6cd5c0bc0008d37234bbaf1bed63059107", - "tarball": "http://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" - }, - "maintainers": [ - { - "name": "substack", - "email": "mail@substack.net" - } - ], - "_resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/break.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/break.js deleted file mode 100644 index 749292e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/break.js +++ /dev/null @@ -1,30 +0,0 @@ -var assert = require('assert'); -var wordwrap = require('../'); - -exports.hard = function () { - var s = 'Assert from {"type":"equal","ok":false,"found":1,"wanted":2,' - + '"stack":[],"id":"b7ddcd4c409de8799542a74d1a04689b",' - + '"browser":"chrome/6.0"}' - ; - var s_ = wordwrap.hard(80)(s); - - var lines = s_.split('\n'); - assert.equal(lines.length, 2); - assert.ok(lines[0].length < 80); - assert.ok(lines[1].length < 80); - - assert.equal(s, s_.replace(/\n/g, '')); -}; - -exports.break = function () { - var s = new Array(55+1).join('a'); - var s_ = wordwrap.hard(20)(s); - - var lines = s_.split('\n'); - assert.equal(lines.length, 3); - assert.ok(lines[0].length === 20); - assert.ok(lines[1].length === 20); - assert.ok(lines[2].length === 15); - - assert.equal(s, s_.replace(/\n/g, '')); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/idleness.txt b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/idleness.txt deleted file mode 100644 index aa3f490..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/idleness.txt +++ /dev/null @@ -1,63 +0,0 @@ -In Praise of Idleness - -By Bertrand Russell - -[1932] - -Like most of my generation, I was brought up on the saying: 'Satan finds some mischief for idle hands to do.' Being a highly virtuous child, I believed all that I was told, and acquired a conscience which has kept me working hard down to the present moment. But although my conscience has controlled my actions, my opinions have undergone a revolution. I think that there is far too much work done in the world, that immense harm is caused by the belief that work is virtuous, and that what needs to be preached in modern industrial countries is quite different from what always has been preached. Everyone knows the story of the traveler in Naples who saw twelve beggars lying in the sun (it was before the days of Mussolini), and offered a lira to the laziest of them. Eleven of them jumped up to claim it, so he gave it to the twelfth. this traveler was on the right lines. But in countries which do not enjoy Mediterranean sunshine idleness is more difficult, and a great public propaganda will be required to inaugurate it. I hope that, after reading the following pages, the leaders of the YMCA will start a campaign to induce good young men to do nothing. If so, I shall not have lived in vain. - -Before advancing my own arguments for laziness, I must dispose of one which I cannot accept. Whenever a person who already has enough to live on proposes to engage in some everyday kind of job, such as school-teaching or typing, he or she is told that such conduct takes the bread out of other people's mouths, and is therefore wicked. If this argument were valid, it would only be necessary for us all to be idle in order that we should all have our mouths full of bread. What people who say such things forget is that what a man earns he usually spends, and in spending he gives employment. As long as a man spends his income, he puts just as much bread into people's mouths in spending as he takes out of other people's mouths in earning. The real villain, from this point of view, is the man who saves. If he merely puts his savings in a stocking, like the proverbial French peasant, it is obvious that they do not give employment. If he invests his savings, the matter is less obvious, and different cases arise. - -One of the commonest things to do with savings is to lend them to some Government. In view of the fact that the bulk of the public expenditure of most civilized Governments consists in payment for past wars or preparation for future wars, the man who lends his money to a Government is in the same position as the bad men in Shakespeare who hire murderers. The net result of the man's economical habits is to increase the armed forces of the State to which he lends his savings. Obviously it would be better if he spent the money, even if he spent it in drink or gambling. - -But, I shall be told, the case is quite different when savings are invested in industrial enterprises. When such enterprises succeed, and produce something useful, this may be conceded. In these days, however, no one will deny that most enterprises fail. That means that a large amount of human labor, which might have been devoted to producing something that could be enjoyed, was expended on producing machines which, when produced, lay idle and did no good to anyone. The man who invests his savings in a concern that goes bankrupt is therefore injuring others as well as himself. If he spent his money, say, in giving parties for his friends, they (we may hope) would get pleasure, and so would all those upon whom he spent money, such as the butcher, the baker, and the bootlegger. But if he spends it (let us say) upon laying down rails for surface card in some place where surface cars turn out not to be wanted, he has diverted a mass of labor into channels where it gives pleasure to no one. Nevertheless, when he becomes poor through failure of his investment he will be regarded as a victim of undeserved misfortune, whereas the gay spendthrift, who has spent his money philanthropically, will be despised as a fool and a frivolous person. - -All this is only preliminary. I want to say, in all seriousness, that a great deal of harm is being done in the modern world by belief in the virtuousness of work, and that the road to happiness and prosperity lies in an organized diminution of work. - -First of all: what is work? Work is of two kinds: first, altering the position of matter at or near the earth's surface relatively to other such matter; second, telling other people to do so. The first kind is unpleasant and ill paid; the second is pleasant and highly paid. The second kind is capable of indefinite extension: there are not only those who give orders, but those who give advice as to what orders should be given. Usually two opposite kinds of advice are given simultaneously by two organized bodies of men; this is called politics. The skill required for this kind of work is not knowledge of the subjects as to which advice is given, but knowledge of the art of persuasive speaking and writing, i.e. of advertising. - -Throughout Europe, though not in America, there is a third class of men, more respected than either of the classes of workers. There are men who, through ownership of land, are able to make others pay for the privilege of being allowed to exist and to work. These landowners are idle, and I might therefore be expected to praise them. Unfortunately, their idleness is only rendered possible by the industry of others; indeed their desire for comfortable idleness is historically the source of the whole gospel of work. The last thing they have ever wished is that others should follow their example. - -From the beginning of civilization until the Industrial Revolution, a man could, as a rule, produce by hard work little more than was required for the subsistence of himself and his family, although his wife worked at least as hard as he did, and his children added their labor as soon as they were old enough to do so. The small surplus above bare necessaries was not left to those who produced it, but was appropriated by warriors and priests. In times of famine there was no surplus; the warriors and priests, however, still secured as much as at other times, with the result that many of the workers died of hunger. This system persisted in Russia until 1917 [1], and still persists in the East; in England, in spite of the Industrial Revolution, it remained in full force throughout the Napoleonic wars, and until a hundred years ago, when the new class of manufacturers acquired power. In America, the system came to an end with the Revolution, except in the South, where it persisted until the Civil War. A system which lasted so long and ended so recently has naturally left a profound impress upon men's thoughts and opinions. Much that we take for granted about the desirability of work is derived from this system, and, being pre-industrial, is not adapted to the modern world. Modern technique has made it possible for leisure, within limits, to be not the prerogative of small privileged classes, but a right evenly distributed throughout the community. The morality of work is the morality of slaves, and the modern world has no need of slavery. - -It is obvious that, in primitive communities, peasants, left to themselves, would not have parted with the slender surplus upon which the warriors and priests subsisted, but would have either produced less or consumed more. At first, sheer force compelled them to produce and part with the surplus. Gradually, however, it was found possible to induce many of them to accept an ethic according to which it was their duty to work hard, although part of their work went to support others in idleness. By this means the amount of compulsion required was lessened, and the expenses of government were diminished. To this day, 99 per cent of British wage-earners would be genuinely shocked if it were proposed that the King should not have a larger income than a working man. The conception of duty, speaking historically, has been a means used by the holders of power to induce others to live for the interests of their masters rather than for their own. Of course the holders of power conceal this fact from themselves by managing to believe that their interests are identical with the larger interests of humanity. Sometimes this is true; Athenian slave-owners, for instance, employed part of their leisure in making a permanent contribution to civilization which would have been impossible under a just economic system. Leisure is essential to civilization, and in former times leisure for the few was only rendered possible by the labors of the many. But their labors were valuable, not because work is good, but because leisure is good. And with modern technique it would be possible to distribute leisure justly without injury to civilization. - -Modern technique has made it possible to diminish enormously the amount of labor required to secure the necessaries of life for everyone. This was made obvious during the war. At that time all the men in the armed forces, and all the men and women engaged in the production of munitions, all the men and women engaged in spying, war propaganda, or Government offices connected with the war, were withdrawn from productive occupations. In spite of this, the general level of well-being among unskilled wage-earners on the side of the Allies was higher than before or since. The significance of this fact was concealed by finance: borrowing made it appear as if the future was nourishing the present. But that, of course, would have been impossible; a man cannot eat a loaf of bread that does not yet exist. The war showed conclusively that, by the scientific organization of production, it is possible to keep modern populations in fair comfort on a small part of the working capacity of the modern world. If, at the end of the war, the scientific organization, which had been created in order to liberate men for fighting and munition work, had been preserved, and the hours of the week had been cut down to four, all would have been well. Instead of that the old chaos was restored, those whose work was demanded were made to work long hours, and the rest were left to starve as unemployed. Why? Because work is a duty, and a man should not receive wages in proportion to what he has produced, but in proportion to his virtue as exemplified by his industry. - -This is the morality of the Slave State, applied in circumstances totally unlike those in which it arose. No wonder the result has been disastrous. Let us take an illustration. Suppose that, at a given moment, a certain number of people are engaged in the manufacture of pins. They make as many pins as the world needs, working (say) eight hours a day. Someone makes an invention by which the same number of men can make twice as many pins: pins are already so cheap that hardly any more will be bought at a lower price. In a sensible world, everybody concerned in the manufacturing of pins would take to working four hours instead of eight, and everything else would go on as before. But in the actual world this would be thought demoralizing. The men still work eight hours, there are too many pins, some employers go bankrupt, and half the men previously concerned in making pins are thrown out of work. There is, in the end, just as much leisure as on the other plan, but half the men are totally idle while half are still overworked. In this way, it is insured that the unavoidable leisure shall cause misery all round instead of being a universal source of happiness. Can anything more insane be imagined? - -The idea that the poor should have leisure has always been shocking to the rich. In England, in the early nineteenth century, fifteen hours was the ordinary day's work for a man; children sometimes did as much, and very commonly did twelve hours a day. When meddlesome busybodies suggested that perhaps these hours were rather long, they were told that work kept adults from drink and children from mischief. When I was a child, shortly after urban working men had acquired the vote, certain public holidays were established by law, to the great indignation of the upper classes. I remember hearing an old Duchess say: 'What do the poor want with holidays? They ought to work.' People nowadays are less frank, but the sentiment persists, and is the source of much of our economic confusion. - -Let us, for a moment, consider the ethics of work frankly, without superstition. Every human being, of necessity, consumes, in the course of his life, a certain amount of the produce of human labor. Assuming, as we may, that labor is on the whole disagreeable, it is unjust that a man should consume more than he produces. Of course he may provide services rather than commodities, like a medical man, for example; but he should provide something in return for his board and lodging. to this extent, the duty of work must be admitted, but to this extent only. - -I shall not dwell upon the fact that, in all modern societies outside the USSR, many people escape even this minimum amount of work, namely all those who inherit money and all those who marry money. I do not think the fact that these people are allowed to be idle is nearly so harmful as the fact that wage-earners are expected to overwork or starve. - -If the ordinary wage-earner worked four hours a day, there would be enough for everybody and no unemployment -- assuming a certain very moderate amount of sensible organization. This idea shocks the well-to-do, because they are convinced that the poor would not know how to use so much leisure. In America men often work long hours even when they are well off; such men, naturally, are indignant at the idea of leisure for wage-earners, except as the grim punishment of unemployment; in fact, they dislike leisure even for their sons. Oddly enough, while they wish their sons to work so hard as to have no time to be civilized, they do not mind their wives and daughters having no work at all. the snobbish admiration of uselessness, which, in an aristocratic society, extends to both sexes, is, under a plutocracy, confined to women; this, however, does not make it any more in agreement with common sense. - -The wise use of leisure, it must be conceded, is a product of civilization and education. A man who has worked long hours all his life will become bored if he becomes suddenly idle. But without a considerable amount of leisure a man is cut off from many of the best things. There is no longer any reason why the bulk of the population should suffer this deprivation; only a foolish asceticism, usually vicarious, makes us continue to insist on work in excessive quantities now that the need no longer exists. - -In the new creed which controls the government of Russia, while there is much that is very different from the traditional teaching of the West, there are some things that are quite unchanged. The attitude of the governing classes, and especially of those who conduct educational propaganda, on the subject of the dignity of labor, is almost exactly that which the governing classes of the world have always preached to what were called the 'honest poor'. Industry, sobriety, willingness to work long hours for distant advantages, even submissiveness to authority, all these reappear; moreover authority still represents the will of the Ruler of the Universe, Who, however, is now called by a new name, Dialectical Materialism. - -The victory of the proletariat in Russia has some points in common with the victory of the feminists in some other countries. For ages, men had conceded the superior saintliness of women, and had consoled women for their inferiority by maintaining that saintliness is more desirable than power. At last the feminists decided that they would have both, since the pioneers among them believed all that the men had told them about the desirability of virtue, but not what they had told them about the worthlessness of political power. A similar thing has happened in Russia as regards manual work. For ages, the rich and their sycophants have written in praise of 'honest toil', have praised the simple life, have professed a religion which teaches that the poor are much more likely to go to heaven than the rich, and in general have tried to make manual workers believe that there is some special nobility about altering the position of matter in space, just as men tried to make women believe that they derived some special nobility from their sexual enslavement. In Russia, all this teaching about the excellence of manual work has been taken seriously, with the result that the manual worker is more honored than anyone else. What are, in essence, revivalist appeals are made, but not for the old purposes: they are made to secure shock workers for special tasks. Manual work is the ideal which is held before the young, and is the basis of all ethical teaching. - -For the present, possibly, this is all to the good. A large country, full of natural resources, awaits development, and has has to be developed with very little use of credit. In these circumstances, hard work is necessary, and is likely to bring a great reward. But what will happen when the point has been reached where everybody could be comfortable without working long hours? - -In the West, we have various ways of dealing with this problem. We have no attempt at economic justice, so that a large proportion of the total produce goes to a small minority of the population, many of whom do no work at all. Owing to the absence of any central control over production, we produce hosts of things that are not wanted. We keep a large percentage of the working population idle, because we can dispense with their labor by making the others overwork. When all these methods prove inadequate, we have a war: we cause a number of people to manufacture high explosives, and a number of others to explode them, as if we were children who had just discovered fireworks. By a combination of all these devices we manage, though with difficulty, to keep alive the notion that a great deal of severe manual work must be the lot of the average man. - -In Russia, owing to more economic justice and central control over production, the problem will have to be differently solved. the rational solution would be, as soon as the necessaries and elementary comforts can be provided for all, to reduce the hours of labor gradually, allowing a popular vote to decide, at each stage, whether more leisure or more goods were to be preferred. But, having taught the supreme virtue of hard work, it is difficult to see how the authorities can aim at a paradise in which there will be much leisure and little work. It seems more likely that they will find continually fresh schemes, by which present leisure is to be sacrificed to future productivity. I read recently of an ingenious plan put forward by Russian engineers, for making the White Sea and the northern coasts of Siberia warm, by putting a dam across the Kara Sea. An admirable project, but liable to postpone proletarian comfort for a generation, while the nobility of toil is being displayed amid the ice-fields and snowstorms of the Arctic Ocean. This sort of thing, if it happens, will be the result of regarding the virtue of hard work as an end in itself, rather than as a means to a state of affairs in which it is no longer needed. - -The fact is that moving matter about, while a certain amount of it is necessary to our existence, is emphatically not one of the ends of human life. If it were, we should have to consider every navvy superior to Shakespeare. We have been misled in this matter by two causes. One is the necessity of keeping the poor contented, which has led the rich, for thousands of years, to preach the dignity of labor, while taking care themselves to remain undignified in this respect. The other is the new pleasure in mechanism, which makes us delight in the astonishingly clever changes that we can produce on the earth's surface. Neither of these motives makes any great appeal to the actual worker. If you ask him what he thinks the best part of his life, he is not likely to say: 'I enjoy manual work because it makes me feel that I am fulfilling man's noblest task, and because I like to think how much man can transform his planet. It is true that my body demands periods of rest, which I have to fill in as best I may, but I am never so happy as when the morning comes and I can return to the toil from which my contentment springs.' I have never heard working men say this sort of thing. They consider work, as it should be considered, a necessary means to a livelihood, and it is from their leisure that they derive whatever happiness they may enjoy. - -It will be said that, while a little leisure is pleasant, men would not know how to fill their days if they had only four hours of work out of the twenty-four. In so far as this is true in the modern world, it is a condemnation of our civilization; it would not have been true at any earlier period. There was formerly a capacity for light-heartedness and play which has been to some extent inhibited by the cult of efficiency. The modern man thinks that everything ought to be done for the sake of something else, and never for its own sake. Serious-minded persons, for example, are continually condemning the habit of going to the cinema, and telling us that it leads the young into crime. But all the work that goes to producing a cinema is respectable, because it is work, and because it brings a money profit. The notion that the desirable activities are those that bring a profit has made everything topsy-turvy. The butcher who provides you with meat and the baker who provides you with bread are praiseworthy, because they are making money; but when you enjoy the food they have provided, you are merely frivolous, unless you eat only to get strength for your work. Broadly speaking, it is held that getting money is good and spending money is bad. Seeing that they are two sides of one transaction, this is absurd; one might as well maintain that keys are good, but keyholes are bad. Whatever merit there may be in the production of goods must be entirely derivative from the advantage to be obtained by consuming them. The individual, in our society, works for profit; but the social purpose of his work lies in the consumption of what he produces. It is this divorce between the individual and the social purpose of production that makes it so difficult for men to think clearly in a world in which profit-making is the incentive to industry. We think too much of production, and too little of consumption. One result is that we attach too little importance to enjoyment and simple happiness, and that we do not judge production by the pleasure that it gives to the consumer. - -When I suggest that working hours should be reduced to four, I am not meaning to imply that all the remaining time should necessarily be spent in pure frivolity. I mean that four hours' work a day should entitle a man to the necessities and elementary comforts of life, and that the rest of his time should be his to use as he might see fit. It is an essential part of any such social system that education should be carried further than it usually is at present, and should aim, in part, at providing tastes which would enable a man to use leisure intelligently. I am not thinking mainly of the sort of things that would be considered 'highbrow'. Peasant dances have died out except in remote rural areas, but the impulses which caused them to be cultivated must still exist in human nature. The pleasures of urban populations have become mainly passive: seeing cinemas, watching football matches, listening to the radio, and so on. This results from the fact that their active energies are fully taken up with work; if they had more leisure, they would again enjoy pleasures in which they took an active part. - -In the past, there was a small leisure class and a larger working class. The leisure class enjoyed advantages for which there was no basis in social justice; this necessarily made it oppressive, limited its sympathies, and caused it to invent theories by which to justify its privileges. These facts greatly diminished its excellence, but in spite of this drawback it contributed nearly the whole of what we call civilization. It cultivated the arts and discovered the sciences; it wrote the books, invented the philosophies, and refined social relations. Even the liberation of the oppressed has usually been inaugurated from above. Without the leisure class, mankind would never have emerged from barbarism. - -The method of a leisure class without duties was, however, extraordinarily wasteful. None of the members of the class had to be taught to be industrious, and the class as a whole was not exceptionally intelligent. The class might produce one Darwin, but against him had to be set tens of thousands of country gentlemen who never thought of anything more intelligent than fox-hunting and punishing poachers. At present, the universities are supposed to provide, in a more systematic way, what the leisure class provided accidentally and as a by-product. This is a great improvement, but it has certain drawbacks. University life is so different from life in the world at large that men who live in academic milieu tend to be unaware of the preoccupations and problems of ordinary men and women; moreover their ways of expressing themselves are usually such as to rob their opinions of the influence that they ought to have upon the general public. Another disadvantage is that in universities studies are organized, and the man who thinks of some original line of research is likely to be discouraged. Academic institutions, therefore, useful as they are, are not adequate guardians of the interests of civilization in a world where everyone outside their walls is too busy for unutilitarian pursuits. - -In a world where no one is compelled to work more than four hours a day, every person possessed of scientific curiosity will be able to indulge it, and every painter will be able to paint without starving, however excellent his pictures may be. Young writers will not be obliged to draw attention to themselves by sensational pot-boilers, with a view to acquiring the economic independence needed for monumental works, for which, when the time at last comes, they will have lost the taste and capacity. Men who, in their professional work, have become interested in some phase of economics or government, will be able to develop their ideas without the academic detachment that makes the work of university economists often seem lacking in reality. Medical men will have the time to learn about the progress of medicine, teachers will not be exasperatedly struggling to teach by routine methods things which they learnt in their youth, which may, in the interval, have been proved to be untrue. - -Above all, there will be happiness and joy of life, instead of frayed nerves, weariness, and dyspepsia. The work exacted will be enough to make leisure delightful, but not enough to produce exhaustion. Since men will not be tired in their spare time, they will not demand only such amusements as are passive and vapid. At least one per cent will probably devote the time not spent in professional work to pursuits of some public importance, and, since they will not depend upon these pursuits for their livelihood, their originality will be unhampered, and there will be no need to conform to the standards set by elderly pundits. But it is not only in these exceptional cases that the advantages of leisure will appear. Ordinary men and women, having the opportunity of a happy life, will become more kindly and less persecuting and less inclined to view others with suspicion. The taste for war will die out, partly for this reason, and partly because it will involve long and severe work for all. Good nature is, of all moral qualities, the one that the world needs most, and good nature is the result of ease and security, not of a life of arduous struggle. Modern methods of production have given us the possibility of ease and security for all; we have chosen, instead, to have overwork for some and starvation for others. Hitherto we have continued to be as energetic as we were before there were machines; in this we have been foolish, but there is no reason to go on being foolish forever. - -[1] Since then, members of the Communist Party have succeeded to this privilege of the warriors and priests. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/wrap.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/wrap.js deleted file mode 100644 index 0cfb76d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/node_modules/wordwrap/test/wrap.js +++ /dev/null @@ -1,31 +0,0 @@ -var assert = require('assert'); -var wordwrap = require('wordwrap'); - -var fs = require('fs'); -var idleness = fs.readFileSync(__dirname + '/idleness.txt', 'utf8'); - -exports.stop80 = function () { - var lines = wordwrap(80)(idleness).split(/\n/); - var words = idleness.split(/\s+/); - - lines.forEach(function (line) { - assert.ok(line.length <= 80, 'line > 80 columns'); - var chunks = line.match(/\S/) ? line.split(/\s+/) : []; - assert.deepEqual(chunks, words.splice(0, chunks.length)); - }); -}; - -exports.start20stop60 = function () { - var lines = wordwrap(20, 100)(idleness).split(/\n/); - var words = idleness.split(/\s+/); - - lines.forEach(function (line) { - assert.ok(line.length <= 100, 'line > 100 columns'); - var chunks = line - .split(/\s+/) - .filter(function (x) { return x.match(/\S/) }) - ; - assert.deepEqual(chunks, words.splice(0, chunks.length)); - assert.deepEqual(line.slice(0, 20), new Array(20 + 1).join(' ')); - }); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/package.json deleted file mode 100644 index 4b2334e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "optimist", - "version": "0.6.1", - "description": "Light-weight option parsing with an argv hash. No optstrings attached.", - "main": "./index.js", - "dependencies": { - "wordwrap": "~0.0.2", - "minimist": "~0.0.1" - }, - "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@substack.net", - "url": "http://substack.net" - }, - "license": "MIT/X11", - "engine": { - "node": ">=0.4" - }, - "bugs": { - "url": "https://github.com/substack/node-optimist/issues" - }, - "homepage": "https://github.com/substack/node-optimist", - "_id": "optimist@0.6.1", - "dist": { - "shasum": "da3ea74686fa21a19a111c326e90eb15a0196686", - "tarball": "http://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz" - }, - "_from": "optimist@>=0.6.1 <0.7.0", - "_npmVersion": "1.3.21", - "_npmUser": { - "name": "substack", - "email": "mail@substack.net" - }, - "maintainers": [ - { - "name": "substack", - "email": "mail@substack.net" - } - ], - "directories": {}, - "_shasum": "da3ea74686fa21a19a111c326e90eb15a0196686", - "_resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/readme.markdown b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/readme.markdown deleted file mode 100644 index b74b437..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/readme.markdown +++ /dev/null @@ -1,513 +0,0 @@ -# DEPRECATION NOTICE - -I don't want to maintain this module anymore since I just use -[minimist](https://npmjs.org/package/minimist), the argument parsing engine, -directly instead nowadays. - -See [yargs](https://github.com/chevex/yargs) for the modern, pirate-themed -successor to optimist. - -[![yarrrrrrrgs!](http://i.imgur.com/4WFGVJ9.png)](https://github.com/chevex/yargs) - -You should also consider [nomnom](https://github.com/harthur/nomnom). - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_.js deleted file mode 100644 index d9c58b3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_.js +++ /dev/null @@ -1,71 +0,0 @@ -var spawn = require('child_process').spawn; -var test = require('tap').test; - -test('dotSlashEmpty', testCmd('./bin.js', [])); - -test('dotSlashArgs', testCmd('./bin.js', [ 'a', 'b', 'c' ])); - -test('nodeEmpty', testCmd('node bin.js', [])); - -test('nodeArgs', testCmd('node bin.js', [ 'x', 'y', 'z' ])); - -test('whichNodeEmpty', function (t) { - var which = spawn('which', ['node']); - - which.stdout.on('data', function (buf) { - t.test( - testCmd(buf.toString().trim() + ' bin.js', []) - ); - t.end(); - }); - - which.stderr.on('data', function (err) { - assert.error(err); - t.end(); - }); -}); - -test('whichNodeArgs', function (t) { - var which = spawn('which', ['node']); - - which.stdout.on('data', function (buf) { - t.test( - testCmd(buf.toString().trim() + ' bin.js', [ 'q', 'r' ]) - ); - t.end(); - }); - - which.stderr.on('data', function (err) { - t.error(err); - t.end(); - }); -}); - -function testCmd (cmd, args) { - - return function (t) { - var to = setTimeout(function () { - assert.fail('Never got stdout data.') - }, 5000); - - var oldDir = process.cwd(); - process.chdir(__dirname + '/_'); - - var cmds = cmd.split(' '); - - var bin = spawn(cmds[0], cmds.slice(1).concat(args.map(String))); - process.chdir(oldDir); - - bin.stderr.on('data', function (err) { - t.error(err); - t.end(); - }); - - bin.stdout.on('data', function (buf) { - clearTimeout(to); - var _ = JSON.parse(buf.toString()); - t.same(_.map(String), args.map(String)); - t.end(); - }); - }; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/argv.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/argv.js deleted file mode 100644 index 3d09606..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/argv.js +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -console.log(JSON.stringify(process.argv)); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/bin.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/bin.js deleted file mode 100755 index 4a18d85..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/_/bin.js +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node -var argv = require('../../index').argv -console.log(JSON.stringify(argv._)); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/dash.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/dash.js deleted file mode 100644 index af8ed6f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/dash.js +++ /dev/null @@ -1,31 +0,0 @@ -var optimist = require('../index'); -var test = require('tap').test; - -test('-', function (t) { - t.plan(5); - t.deepEqual( - fix(optimist.parse([ '-n', '-' ])), - { n: '-', _: [] } - ); - t.deepEqual( - fix(optimist.parse([ '-' ])), - { _: [ '-' ] } - ); - t.deepEqual( - fix(optimist.parse([ '-f-' ])), - { f: '-', _: [] } - ); - t.deepEqual( - fix(optimist([ '-b', '-' ]).boolean('b').argv), - { b: true, _: [ '-' ] } - ); - t.deepEqual( - fix(optimist([ '-s', '-' ]).string('s').argv), - { s: '-', _: [] } - ); -}); - -function fix (obj) { - delete obj.$0; - return obj; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse.js deleted file mode 100644 index d320f43..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse.js +++ /dev/null @@ -1,446 +0,0 @@ -var optimist = require('../index'); -var path = require('path'); -var test = require('tap').test; - -var $0 = 'node ./' + path.relative(process.cwd(), __filename); - -test('short boolean', function (t) { - var parse = optimist.parse([ '-b' ]); - t.same(parse, { b : true, _ : [], $0 : $0 }); - t.same(typeof parse.b, 'boolean'); - t.end(); -}); - -test('long boolean', function (t) { - t.same( - optimist.parse([ '--bool' ]), - { bool : true, _ : [], $0 : $0 } - ); - t.end(); -}); - -test('bare', function (t) { - t.same( - optimist.parse([ 'foo', 'bar', 'baz' ]), - { _ : [ 'foo', 'bar', 'baz' ], $0 : $0 } - ); - t.end(); -}); - -test('short group', function (t) { - t.same( - optimist.parse([ '-cats' ]), - { c : true, a : true, t : true, s : true, _ : [], $0 : $0 } - ); - t.end(); -}); - -test('short group next', function (t) { - t.same( - optimist.parse([ '-cats', 'meow' ]), - { c : true, a : true, t : true, s : 'meow', _ : [], $0 : $0 } - ); - t.end(); -}); - -test('short capture', function (t) { - t.same( - optimist.parse([ '-h', 'localhost' ]), - { h : 'localhost', _ : [], $0 : $0 } - ); - t.end(); -}); - -test('short captures', function (t) { - t.same( - optimist.parse([ '-h', 'localhost', '-p', '555' ]), - { h : 'localhost', p : 555, _ : [], $0 : $0 } - ); - t.end(); -}); - -test('long capture sp', function (t) { - t.same( - optimist.parse([ '--pow', 'xixxle' ]), - { pow : 'xixxle', _ : [], $0 : $0 } - ); - t.end(); -}); - -test('long capture eq', function (t) { - t.same( - optimist.parse([ '--pow=xixxle' ]), - { pow : 'xixxle', _ : [], $0 : $0 } - ); - t.end() -}); - -test('long captures sp', function (t) { - t.same( - optimist.parse([ '--host', 'localhost', '--port', '555' ]), - { host : 'localhost', port : 555, _ : [], $0 : $0 } - ); - t.end(); -}); - -test('long captures eq', function (t) { - t.same( - optimist.parse([ '--host=localhost', '--port=555' ]), - { host : 'localhost', port : 555, _ : [], $0 : $0 } - ); - t.end(); -}); - -test('mixed short bool and capture', function (t) { - t.same( - optimist.parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), - { - f : true, p : 555, h : 'localhost', - _ : [ 'script.js' ], $0 : $0, - } - ); - t.end(); -}); - -test('short and long', function (t) { - t.same( - optimist.parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), - { - f : true, p : 555, h : 'localhost', - _ : [ 'script.js' ], $0 : $0, - } - ); - t.end(); -}); - -test('no', function (t) { - t.same( - optimist.parse([ '--no-moo' ]), - { moo : false, _ : [], $0 : $0 } - ); - t.end(); -}); - -test('multi', function (t) { - t.same( - optimist.parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]), - { v : ['a','b','c'], _ : [], $0 : $0 } - ); - t.end(); -}); - -test('comprehensive', function (t) { - t.same( - optimist.parse([ - '--name=meowmers', 'bare', '-cats', 'woo', - '-h', 'awesome', '--multi=quux', - '--key', 'value', - '-b', '--bool', '--no-meep', '--multi=baz', - '--', '--not-a-flag', 'eek' - ]), - { - c : true, - a : true, - t : true, - s : 'woo', - h : 'awesome', - b : true, - bool : true, - key : 'value', - multi : [ 'quux', 'baz' ], - meep : false, - name : 'meowmers', - _ : [ 'bare', '--not-a-flag', 'eek' ], - $0 : $0 - } - ); - t.end(); -}); - -test('nums', function (t) { - var argv = optimist.parse([ - '-x', '1234', - '-y', '5.67', - '-z', '1e7', - '-w', '10f', - '--hex', '0xdeadbeef', - '789', - ]); - t.same(argv, { - x : 1234, - y : 5.67, - z : 1e7, - w : '10f', - hex : 0xdeadbeef, - _ : [ 789 ], - $0 : $0 - }); - t.same(typeof argv.x, 'number'); - t.same(typeof argv.y, 'number'); - t.same(typeof argv.z, 'number'); - t.same(typeof argv.w, 'string'); - t.same(typeof argv.hex, 'number'); - t.same(typeof argv._[0], 'number'); - t.end(); -}); - -test('flag boolean', function (t) { - var parse = optimist([ '-t', 'moo' ]).boolean(['t']).argv; - t.same(parse, { t : true, _ : [ 'moo' ], $0 : $0 }); - t.same(typeof parse.t, 'boolean'); - t.end(); -}); - -test('flag boolean value', function (t) { - var parse = optimist(['--verbose', 'false', 'moo', '-t', 'true']) - .boolean(['t', 'verbose']).default('verbose', true).argv; - - t.same(parse, { - verbose: false, - t: true, - _: ['moo'], - $0 : $0 - }); - - t.same(typeof parse.verbose, 'boolean'); - t.same(typeof parse.t, 'boolean'); - t.end(); -}); - -test('flag boolean default false', function (t) { - var parse = optimist(['moo']) - .boolean(['t', 'verbose']) - .default('verbose', false) - .default('t', false).argv; - - t.same(parse, { - verbose: false, - t: false, - _: ['moo'], - $0 : $0 - }); - - t.same(typeof parse.verbose, 'boolean'); - t.same(typeof parse.t, 'boolean'); - t.end(); - -}); - -test('boolean groups', function (t) { - var parse = optimist([ '-x', '-z', 'one', 'two', 'three' ]) - .boolean(['x','y','z']).argv; - - t.same(parse, { - x : true, - y : false, - z : true, - _ : [ 'one', 'two', 'three' ], - $0 : $0 - }); - - t.same(typeof parse.x, 'boolean'); - t.same(typeof parse.y, 'boolean'); - t.same(typeof parse.z, 'boolean'); - t.end(); -}); - -test('newlines in params' , function (t) { - var args = optimist.parse([ '-s', "X\nX" ]) - t.same(args, { _ : [], s : "X\nX", $0 : $0 }); - - // reproduce in bash: - // VALUE="new - // line" - // node program.js --s="$VALUE" - args = optimist.parse([ "--s=X\nX" ]) - t.same(args, { _ : [], s : "X\nX", $0 : $0 }); - t.end(); -}); - -test('strings' , function (t) { - var s = optimist([ '-s', '0001234' ]).string('s').argv.s; - t.same(s, '0001234'); - t.same(typeof s, 'string'); - - var x = optimist([ '-x', '56' ]).string('x').argv.x; - t.same(x, '56'); - t.same(typeof x, 'string'); - t.end(); -}); - -test('stringArgs', function (t) { - var s = optimist([ ' ', ' ' ]).string('_').argv._; - t.same(s.length, 2); - t.same(typeof s[0], 'string'); - t.same(s[0], ' '); - t.same(typeof s[1], 'string'); - t.same(s[1], ' '); - t.end(); -}); - -test('slashBreak', function (t) { - t.same( - optimist.parse([ '-I/foo/bar/baz' ]), - { I : '/foo/bar/baz', _ : [], $0 : $0 } - ); - t.same( - optimist.parse([ '-xyz/foo/bar/baz' ]), - { x : true, y : true, z : '/foo/bar/baz', _ : [], $0 : $0 } - ); - t.end(); -}); - -test('alias', function (t) { - var argv = optimist([ '-f', '11', '--zoom', '55' ]) - .alias('z', 'zoom') - .argv - ; - t.equal(argv.zoom, 55); - t.equal(argv.z, argv.zoom); - t.equal(argv.f, 11); - t.end(); -}); - -test('multiAlias', function (t) { - var argv = optimist([ '-f', '11', '--zoom', '55' ]) - .alias('z', [ 'zm', 'zoom' ]) - .argv - ; - t.equal(argv.zoom, 55); - t.equal(argv.z, argv.zoom); - t.equal(argv.z, argv.zm); - t.equal(argv.f, 11); - t.end(); -}); - -test('boolean default true', function (t) { - var argv = optimist.options({ - sometrue: { - boolean: true, - default: true - } - }).argv; - - t.equal(argv.sometrue, true); - t.end(); -}); - -test('boolean default false', function (t) { - var argv = optimist.options({ - somefalse: { - boolean: true, - default: false - } - }).argv; - - t.equal(argv.somefalse, false); - t.end(); -}); - -test('nested dotted objects', function (t) { - var argv = optimist([ - '--foo.bar', '3', '--foo.baz', '4', - '--foo.quux.quibble', '5', '--foo.quux.o_O', - '--beep.boop' - ]).argv; - - t.same(argv.foo, { - bar : 3, - baz : 4, - quux : { - quibble : 5, - o_O : true - }, - }); - t.same(argv.beep, { boop : true }); - t.end(); -}); - -test('boolean and alias with chainable api', function (t) { - var aliased = [ '-h', 'derp' ]; - var regular = [ '--herp', 'derp' ]; - var opts = { - herp: { alias: 'h', boolean: true } - }; - var aliasedArgv = optimist(aliased) - .boolean('herp') - .alias('h', 'herp') - .argv; - var propertyArgv = optimist(regular) - .boolean('herp') - .alias('h', 'herp') - .argv; - var expected = { - herp: true, - h: true, - '_': [ 'derp' ], - '$0': $0, - }; - - t.same(aliasedArgv, expected); - t.same(propertyArgv, expected); - t.end(); -}); - -test('boolean and alias with options hash', function (t) { - var aliased = [ '-h', 'derp' ]; - var regular = [ '--herp', 'derp' ]; - var opts = { - herp: { alias: 'h', boolean: true } - }; - var aliasedArgv = optimist(aliased) - .options(opts) - .argv; - var propertyArgv = optimist(regular).options(opts).argv; - var expected = { - herp: true, - h: true, - '_': [ 'derp' ], - '$0': $0, - }; - - t.same(aliasedArgv, expected); - t.same(propertyArgv, expected); - - t.end(); -}); - -test('boolean and alias using explicit true', function (t) { - var aliased = [ '-h', 'true' ]; - var regular = [ '--herp', 'true' ]; - var opts = { - herp: { alias: 'h', boolean: true } - }; - var aliasedArgv = optimist(aliased) - .boolean('h') - .alias('h', 'herp') - .argv; - var propertyArgv = optimist(regular) - .boolean('h') - .alias('h', 'herp') - .argv; - var expected = { - herp: true, - h: true, - '_': [ ], - '$0': $0, - }; - - t.same(aliasedArgv, expected); - t.same(propertyArgv, expected); - t.end(); -}); - -// regression, see https://github.com/substack/node-optimist/issues/71 -test('boolean and --x=true', function(t) { - var parsed = optimist(['--boool', '--other=true']).boolean('boool').argv; - - t.same(parsed.boool, true); - t.same(parsed.other, 'true'); - - parsed = optimist(['--boool', '--other=false']).boolean('boool').argv; - - t.same(parsed.boool, true); - t.same(parsed.other, 'false'); - t.end(); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse_modified.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse_modified.js deleted file mode 100644 index a57dc84..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/parse_modified.js +++ /dev/null @@ -1,14 +0,0 @@ -var optimist = require('../'); -var test = require('tap').test; - -test('parse with modifier functions' , function (t) { - t.plan(1); - - var argv = optimist().boolean('b').parse([ '-b', '123' ]); - t.deepEqual(fix(argv), { b: true, _: ['123'] }); -}); - -function fix (obj) { - delete obj.$0; - return obj; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/short.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/short.js deleted file mode 100644 index b2c38ad..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/short.js +++ /dev/null @@ -1,16 +0,0 @@ -var optimist = require('../index'); -var test = require('tap').test; - -test('-n123', function (t) { - t.plan(1); - var parse = optimist.parse([ '-n123' ]); - t.equal(parse.n, 123); -}); - -test('-123', function (t) { - t.plan(3); - var parse = optimist.parse([ '-123', '456' ]); - t.equal(parse['1'], true); - t.equal(parse['2'], true); - t.equal(parse['3'], 456); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/usage.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/usage.js deleted file mode 100644 index 300454c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/usage.js +++ /dev/null @@ -1,292 +0,0 @@ -var Hash = require('hashish'); -var optimist = require('../index'); -var test = require('tap').test; - -test('usageFail', function (t) { - var r = checkUsage(function () { - return optimist('-x 10 -z 20'.split(' ')) - .usage('Usage: $0 -x NUM -y NUM') - .demand(['x','y']) - .argv; - }); - t.same( - r.result, - { x : 10, z : 20, _ : [], $0 : './usage' } - ); - - t.same( - r.errors.join('\n').split(/\n+/), - [ - 'Usage: ./usage -x NUM -y NUM', - 'Options:', - ' -x [required]', - ' -y [required]', - 'Missing required arguments: y', - ] - ); - t.same(r.logs, []); - t.ok(r.exit); - t.end(); -}); - - -test('usagePass', function (t) { - var r = checkUsage(function () { - return optimist('-x 10 -y 20'.split(' ')) - .usage('Usage: $0 -x NUM -y NUM') - .demand(['x','y']) - .argv; - }); - t.same(r, { - result : { x : 10, y : 20, _ : [], $0 : './usage' }, - errors : [], - logs : [], - exit : false, - }); - t.end(); -}); - -test('checkPass', function (t) { - var r = checkUsage(function () { - return optimist('-x 10 -y 20'.split(' ')) - .usage('Usage: $0 -x NUM -y NUM') - .check(function (argv) { - if (!('x' in argv)) throw 'You forgot about -x'; - if (!('y' in argv)) throw 'You forgot about -y'; - }) - .argv; - }); - t.same(r, { - result : { x : 10, y : 20, _ : [], $0 : './usage' }, - errors : [], - logs : [], - exit : false, - }); - t.end(); -}); - -test('checkFail', function (t) { - var r = checkUsage(function () { - return optimist('-x 10 -z 20'.split(' ')) - .usage('Usage: $0 -x NUM -y NUM') - .check(function (argv) { - if (!('x' in argv)) throw 'You forgot about -x'; - if (!('y' in argv)) throw 'You forgot about -y'; - }) - .argv; - }); - - t.same( - r.result, - { x : 10, z : 20, _ : [], $0 : './usage' } - ); - - t.same( - r.errors.join('\n').split(/\n+/), - [ - 'Usage: ./usage -x NUM -y NUM', - 'You forgot about -y' - ] - ); - - t.same(r.logs, []); - t.ok(r.exit); - t.end(); -}); - -test('checkCondPass', function (t) { - function checker (argv) { - return 'x' in argv && 'y' in argv; - } - - var r = checkUsage(function () { - return optimist('-x 10 -y 20'.split(' ')) - .usage('Usage: $0 -x NUM -y NUM') - .check(checker) - .argv; - }); - t.same(r, { - result : { x : 10, y : 20, _ : [], $0 : './usage' }, - errors : [], - logs : [], - exit : false, - }); - t.end(); -}); - -test('checkCondFail', function (t) { - function checker (argv) { - return 'x' in argv && 'y' in argv; - } - - var r = checkUsage(function () { - return optimist('-x 10 -z 20'.split(' ')) - .usage('Usage: $0 -x NUM -y NUM') - .check(checker) - .argv; - }); - - t.same( - r.result, - { x : 10, z : 20, _ : [], $0 : './usage' } - ); - - t.same( - r.errors.join('\n').split(/\n+/).join('\n'), - 'Usage: ./usage -x NUM -y NUM\n' - + 'Argument check failed: ' + checker.toString() - ); - - t.same(r.logs, []); - t.ok(r.exit); - t.end(); -}); - -test('countPass', function (t) { - var r = checkUsage(function () { - return optimist('1 2 3 --moo'.split(' ')) - .usage('Usage: $0 [x] [y] [z] {OPTIONS}') - .demand(3) - .argv; - }); - t.same(r, { - result : { _ : [ '1', '2', '3' ], moo : true, $0 : './usage' }, - errors : [], - logs : [], - exit : false, - }); - t.end(); -}); - -test('countFail', function (t) { - var r = checkUsage(function () { - return optimist('1 2 --moo'.split(' ')) - .usage('Usage: $0 [x] [y] [z] {OPTIONS}') - .demand(3) - .argv; - }); - t.same( - r.result, - { _ : [ '1', '2' ], moo : true, $0 : './usage' } - ); - - t.same( - r.errors.join('\n').split(/\n+/), - [ - 'Usage: ./usage [x] [y] [z] {OPTIONS}', - 'Not enough non-option arguments: got 2, need at least 3', - ] - ); - - t.same(r.logs, []); - t.ok(r.exit); - t.end(); -}); - -test('defaultSingles', function (t) { - var r = checkUsage(function () { - return optimist('--foo 50 --baz 70 --powsy'.split(' ')) - .default('foo', 5) - .default('bar', 6) - .default('baz', 7) - .argv - ; - }); - t.same(r.result, { - foo : '50', - bar : 6, - baz : '70', - powsy : true, - _ : [], - $0 : './usage', - }); - t.end(); -}); - -test('defaultAliases', function (t) { - var r = checkUsage(function () { - return optimist('') - .alias('f', 'foo') - .default('f', 5) - .argv - ; - }); - t.same(r.result, { - f : '5', - foo : '5', - _ : [], - $0 : './usage', - }); - t.end(); -}); - -test('defaultHash', function (t) { - var r = checkUsage(function () { - return optimist('--foo 50 --baz 70'.split(' ')) - .default({ foo : 10, bar : 20, quux : 30 }) - .argv - ; - }); - t.same(r.result, { - _ : [], - $0 : './usage', - foo : 50, - baz : 70, - bar : 20, - quux : 30, - }); - t.end(); -}); - -test('rebase', function (t) { - t.equal( - optimist.rebase('/home/substack', '/home/substack/foo/bar/baz'), - './foo/bar/baz' - ); - t.equal( - optimist.rebase('/home/substack/foo/bar/baz', '/home/substack'), - '../../..' - ); - t.equal( - optimist.rebase('/home/substack/foo', '/home/substack/pow/zoom.txt'), - '../pow/zoom.txt' - ); - t.end(); -}); - -function checkUsage (f) { - - var exit = false; - - process._exit = process.exit; - process._env = process.env; - process._argv = process.argv; - - process.exit = function (t) { exit = true }; - process.env = Hash.merge(process.env, { _ : 'node' }); - process.argv = [ './usage' ]; - - var errors = []; - var logs = []; - - console._error = console.error; - console.error = function (msg) { errors.push(msg) }; - console._log = console.log; - console.log = function (msg) { logs.push(msg) }; - - var result = f(); - - process.exit = process._exit; - process.env = process._env; - process.argv = process._argv; - - console.error = console._error; - console.log = console._log; - - return { - errors : errors, - logs : logs, - exit : exit, - result : result, - }; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/whitespace.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/whitespace.js deleted file mode 100644 index 90b9075..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/optimist/test/whitespace.js +++ /dev/null @@ -1,8 +0,0 @@ -var optimist = require('../'); -var test = require('tap').test; - -test('whitespace should be whitespace' , function (t) { - t.plan(1); - var x = optimist.parse([ '-x', '\t' ]).x; - t.equal(x, '\t'); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.npmignore deleted file mode 100644 index 3dddf3f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -dist/* -node_modules/* diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.travis.yml deleted file mode 100644 index ddc9c4f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.8 - - "0.10" \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/CHANGELOG.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/CHANGELOG.md deleted file mode 100644 index 2e7ca5d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/CHANGELOG.md +++ /dev/null @@ -1,194 +0,0 @@ -# Change Log - -## 0.1.43 - -* Performance improvements for `SourceMapGenerator` and `SourceNode`. See issue - #148 for some discussion and issues #150, #151, and #152 for implementations. - -## 0.1.42 - -* Fix an issue where `SourceNode`s from different versions of the source-map - library couldn't be used in conjunction with each other. See issue #142. - -## 0.1.41 - -* Fix a bug with getting the source content of relative sources with a "./" - prefix. See issue #145 and [Bug 1090768](bugzil.la/1090768). - -* Add the `SourceMapConsumer.prototype.computeColumnSpans` method to compute the - column span of each mapping. - -* Add the `SourceMapConsumer.prototype.allGeneratedPositionsFor` method to find - all generated positions associated with a given original source and line. - -## 0.1.40 - -* Performance improvements for parsing source maps in SourceMapConsumer. - -## 0.1.39 - -* Fix a bug where setting a source's contents to null before any source content - had been set before threw a TypeError. See issue #131. - -## 0.1.38 - -* Fix a bug where finding relative paths from an empty path were creating - absolute paths. See issue #129. - -## 0.1.37 - -* Fix a bug where if the source root was an empty string, relative source paths - would turn into absolute source paths. Issue #124. - -## 0.1.36 - -* Allow the `names` mapping property to be an empty string. Issue #121. - -## 0.1.35 - -* A third optional parameter was added to `SourceNode.fromStringWithSourceMap` - to specify a path that relative sources in the second parameter should be - relative to. Issue #105. - -* If no file property is given to a `SourceMapGenerator`, then the resulting - source map will no longer have a `null` file property. The property will - simply not exist. Issue #104. - -* Fixed a bug where consecutive newlines were ignored in `SourceNode`s. - Issue #116. - -## 0.1.34 - -* Make `SourceNode` work with windows style ("\r\n") newlines. Issue #103. - -* Fix bug involving source contents and the - `SourceMapGenerator.prototype.applySourceMap`. Issue #100. - -## 0.1.33 - -* Fix some edge cases surrounding path joining and URL resolution. - -* Add a third parameter for relative path to - `SourceMapGenerator.prototype.applySourceMap`. - -* Fix issues with mappings and EOLs. - -## 0.1.32 - -* Fixed a bug where SourceMapConsumer couldn't handle negative relative columns - (issue 92). - -* Fixed test runner to actually report number of failed tests as its process - exit code. - -* Fixed a typo when reporting bad mappings (issue 87). - -## 0.1.31 - -* Delay parsing the mappings in SourceMapConsumer until queried for a source - location. - -* Support Sass source maps (which at the time of writing deviate from the spec - in small ways) in SourceMapConsumer. - -## 0.1.30 - -* Do not join source root with a source, when the source is a data URI. - -* Extend the test runner to allow running single specific test files at a time. - -* Performance improvements in `SourceNode.prototype.walk` and - `SourceMapConsumer.prototype.eachMapping`. - -* Source map browser builds will now work inside Workers. - -* Better error messages when attempting to add an invalid mapping to a - `SourceMapGenerator`. - -## 0.1.29 - -* Allow duplicate entries in the `names` and `sources` arrays of source maps - (usually from TypeScript) we are parsing. Fixes github issue 72. - -## 0.1.28 - -* Skip duplicate mappings when creating source maps from SourceNode; github - issue 75. - -## 0.1.27 - -* Don't throw an error when the `file` property is missing in SourceMapConsumer, - we don't use it anyway. - -## 0.1.26 - -* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70. - -## 0.1.25 - -* Make compatible with browserify - -## 0.1.24 - -* Fix issue with absolute paths and `file://` URIs. See - https://bugzilla.mozilla.org/show_bug.cgi?id=885597 - -## 0.1.23 - -* Fix issue with absolute paths and sourcesContent, github issue 64. - -## 0.1.22 - -* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21. - -## 0.1.21 - -* Fixed handling of sources that start with a slash so that they are relative to - the source root's host. - -## 0.1.20 - -* Fixed github issue #43: absolute URLs aren't joined with the source root - anymore. - -## 0.1.19 - -* Using Travis CI to run tests. - -## 0.1.18 - -* Fixed a bug in the handling of sourceRoot. - -## 0.1.17 - -* Added SourceNode.fromStringWithSourceMap. - -## 0.1.16 - -* Added missing documentation. - -* Fixed the generating of empty mappings in SourceNode. - -## 0.1.15 - -* Added SourceMapGenerator.applySourceMap. - -## 0.1.14 - -* The sourceRoot is now handled consistently. - -## 0.1.13 - -* Added SourceMapGenerator.fromSourceMap. - -## 0.1.12 - -* SourceNode now generates empty mappings too. - -## 0.1.11 - -* Added name support to SourceNode. - -## 0.1.10 - -* Added sourcesContent support to the customer and generator. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/LICENSE deleted file mode 100644 index ed1b7cf..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ - -Copyright (c) 2009-2011, Mozilla Foundation and contributors -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 names of the Mozilla Foundation nor the names of project - 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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/Makefile.dryice.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/Makefile.dryice.js deleted file mode 100644 index d6fc26a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/Makefile.dryice.js +++ /dev/null @@ -1,166 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -var path = require('path'); -var fs = require('fs'); -var copy = require('dryice').copy; - -function removeAmdefine(src) { - src = String(src).replace( - /if\s*\(typeof\s*define\s*!==\s*'function'\)\s*{\s*var\s*define\s*=\s*require\('amdefine'\)\(module,\s*require\);\s*}\s*/g, - ''); - src = src.replace( - /\b(define\(.*)('amdefine',?)/gm, - '$1'); - return src; -} -removeAmdefine.onRead = true; - -function makeNonRelative(src) { - return src - .replace(/require\('.\//g, 'require(\'source-map/') - .replace(/\.\.\/\.\.\/lib\//g, ''); -} -makeNonRelative.onRead = true; - -function buildBrowser() { - console.log('\nCreating dist/source-map.js'); - - var project = copy.createCommonJsProject({ - roots: [ path.join(__dirname, 'lib') ] - }); - - copy({ - source: [ - 'build/mini-require.js', - { - project: project, - require: [ 'source-map/source-map-generator', - 'source-map/source-map-consumer', - 'source-map/source-node'] - }, - 'build/suffix-browser.js' - ], - filter: [ - copy.filter.moduleDefines, - removeAmdefine - ], - dest: 'dist/source-map.js' - }); -} - -function buildBrowserMin() { - console.log('\nCreating dist/source-map.min.js'); - - copy({ - source: 'dist/source-map.js', - filter: copy.filter.uglifyjs, - dest: 'dist/source-map.min.js' - }); -} - -function buildFirefox() { - console.log('\nCreating dist/SourceMap.jsm'); - - var project = copy.createCommonJsProject({ - roots: [ path.join(__dirname, 'lib') ] - }); - - copy({ - source: [ - 'build/prefix-source-map.jsm', - { - project: project, - require: [ 'source-map/source-map-consumer', - 'source-map/source-map-generator', - 'source-map/source-node' ] - }, - 'build/suffix-source-map.jsm' - ], - filter: [ - copy.filter.moduleDefines, - removeAmdefine, - makeNonRelative - ], - dest: 'dist/SourceMap.jsm' - }); - - // Create dist/test/Utils.jsm - console.log('\nCreating dist/test/Utils.jsm'); - - project = copy.createCommonJsProject({ - roots: [ __dirname, path.join(__dirname, 'lib') ] - }); - - copy({ - source: [ - 'build/prefix-utils.jsm', - 'build/assert-shim.js', - { - project: project, - require: [ 'test/source-map/util' ] - }, - 'build/suffix-utils.jsm' - ], - filter: [ - copy.filter.moduleDefines, - removeAmdefine, - makeNonRelative - ], - dest: 'dist/test/Utils.jsm' - }); - - function isTestFile(f) { - return /^test\-.*?\.js/.test(f); - } - - var testFiles = fs.readdirSync(path.join(__dirname, 'test', 'source-map')).filter(isTestFile); - - testFiles.forEach(function (testFile) { - console.log('\nCreating', path.join('dist', 'test', testFile.replace(/\-/g, '_'))); - - copy({ - source: [ - 'build/test-prefix.js', - path.join('test', 'source-map', testFile), - 'build/test-suffix.js' - ], - filter: [ - removeAmdefine, - makeNonRelative, - function (input, source) { - return input.replace('define(', - 'define("' - + path.join('test', 'source-map', testFile.replace(/\.js$/, '')) - + '", ["require", "exports", "module"], '); - }, - function (input, source) { - return input.replace('{THIS_MODULE}', function () { - return "test/source-map/" + testFile.replace(/\.js$/, ''); - }); - } - ], - dest: path.join('dist', 'test', testFile.replace(/\-/g, '_')) - }); - }); -} - -function ensureDir(name) { - var dirExists = false; - try { - dirExists = fs.statSync(name).isDirectory(); - } catch (err) {} - - if (!dirExists) { - fs.mkdirSync(name, 0777); - } -} - -ensureDir("dist"); -ensureDir("dist/test"); -buildFirefox(); -buildBrowser(); -buildBrowserMin(); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/README.md deleted file mode 100644 index 59767aa..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/README.md +++ /dev/null @@ -1,475 +0,0 @@ -# Source Map - -This is a library to generate and consume the source map format -[described here][format]. - -This library is written in the Asynchronous Module Definition format, and works -in the following environments: - -* Modern Browsers supporting ECMAScript 5 (either after the build, or with an - AMD loader such as RequireJS) - -* Inside Firefox (as a JSM file, after the build) - -* With NodeJS versions 0.8.X and higher - -## Node - - $ npm install source-map - -## Building from Source (for everywhere else) - -Install Node and then run - - $ git clone https://fitzgen@github.com/mozilla/source-map.git - $ cd source-map - $ npm link . - -Next, run - - $ node Makefile.dryice.js - -This should spew a bunch of stuff to stdout, and create the following files: - -* `dist/source-map.js` - The unminified browser version. - -* `dist/source-map.min.js` - The minified browser version. - -* `dist/SourceMap.jsm` - The JavaScript Module for inclusion in Firefox source. - -## Examples - -### Consuming a source map - - var rawSourceMap = { - version: 3, - file: 'min.js', - names: ['bar', 'baz', 'n'], - sources: ['one.js', 'two.js'], - sourceRoot: 'http://example.com/www/js/', - mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' - }; - - var smc = new SourceMapConsumer(rawSourceMap); - - console.log(smc.sources); - // [ 'http://example.com/www/js/one.js', - // 'http://example.com/www/js/two.js' ] - - console.log(smc.originalPositionFor({ - line: 2, - column: 28 - })); - // { source: 'http://example.com/www/js/two.js', - // line: 2, - // column: 10, - // name: 'n' } - - console.log(smc.generatedPositionFor({ - source: 'http://example.com/www/js/two.js', - line: 2, - column: 10 - })); - // { line: 2, column: 28 } - - smc.eachMapping(function (m) { - // ... - }); - -### Generating a source map - -In depth guide: -[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/) - -#### With SourceNode (high level API) - - function compile(ast) { - switch (ast.type) { - case 'BinaryExpression': - return new SourceNode( - ast.location.line, - ast.location.column, - ast.location.source, - [compile(ast.left), " + ", compile(ast.right)] - ); - case 'Literal': - return new SourceNode( - ast.location.line, - ast.location.column, - ast.location.source, - String(ast.value) - ); - // ... - default: - throw new Error("Bad AST"); - } - } - - var ast = parse("40 + 2", "add.js"); - console.log(compile(ast).toStringWithSourceMap({ - file: 'add.js' - })); - // { code: '40 + 2', - // map: [object SourceMapGenerator] } - -#### With SourceMapGenerator (low level API) - - var map = new SourceMapGenerator({ - file: "source-mapped.js" - }); - - map.addMapping({ - generated: { - line: 10, - column: 35 - }, - source: "foo.js", - original: { - line: 33, - column: 2 - }, - name: "christopher" - }); - - console.log(map.toString()); - // '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}' - -## API - -Get a reference to the module: - - // NodeJS - var sourceMap = require('source-map'); - - // Browser builds - var sourceMap = window.sourceMap; - - // Inside Firefox - let sourceMap = {}; - Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap); - -### SourceMapConsumer - -A SourceMapConsumer instance represents a parsed source map which we can query -for information about the original file positions by giving it a file position -in the generated source. - -#### new SourceMapConsumer(rawSourceMap) - -The only parameter is the raw source map (either as a string which can be -`JSON.parse`'d, or an object). According to the spec, source maps have the -following attributes: - -* `version`: Which version of the source map spec this map is following. - -* `sources`: An array of URLs to the original source files. - -* `names`: An array of identifiers which can be referrenced by individual - mappings. - -* `sourceRoot`: Optional. The URL root from which all sources are relative. - -* `sourcesContent`: Optional. An array of contents of the original source files. - -* `mappings`: A string of base64 VLQs which contain the actual mappings. - -* `file`: Optional. The generated filename this source map is associated with. - -#### SourceMapConsumer.prototype.computeColumnSpans() - -Compute the last column for each generated mapping. The last column is -inclusive. - -#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition) - -Returns the original source, line, and column information for the generated -source's line and column positions provided. The only argument is an object with -the following properties: - -* `line`: The line number in the generated source. - -* `column`: The column number in the generated source. - -and an object is returned with the following properties: - -* `source`: The original source file, or null if this information is not - available. - -* `line`: The line number in the original source, or null if this information is - not available. - -* `column`: The column number in the original source, or null or null if this - information is not available. - -* `name`: The original identifier, or null if this information is not available. - -#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition) - -Returns the generated line and column information for the original source, -line, and column positions provided. The only argument is an object with -the following properties: - -* `source`: The filename of the original source. - -* `line`: The line number in the original source. - -* `column`: The column number in the original source. - -and an object is returned with the following properties: - -* `line`: The line number in the generated source, or null. - -* `column`: The column number in the generated source, or null. - -#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition) - -Returns all generated line and column information for the original source -and line provided. The only argument is an object with the following -properties: - -* `source`: The filename of the original source. - -* `line`: The line number in the original source. - -and an array of objects is returned, each with the following properties: - -* `line`: The line number in the generated source, or null. - -* `column`: The column number in the generated source, or null. - -#### SourceMapConsumer.prototype.sourceContentFor(source) - -Returns the original source content for the source provided. The only -argument is the URL of the original source file. - -#### SourceMapConsumer.prototype.eachMapping(callback, context, order) - -Iterate over each mapping between an original source/line/column and a -generated line/column in this source map. - -* `callback`: The function that is called with each mapping. Mappings have the - form `{ source, generatedLine, generatedColumn, originalLine, originalColumn, - name }` - -* `context`: Optional. If specified, this object will be the value of `this` - every time that `callback` is called. - -* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or - `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over - the mappings sorted by the generated file's line/column order or the - original's source/line/column order, respectively. Defaults to - `SourceMapConsumer.GENERATED_ORDER`. - -### SourceMapGenerator - -An instance of the SourceMapGenerator represents a source map which is being -built incrementally. - -#### new SourceMapGenerator([startOfSourceMap]) - -You may pass an object with the following properties: - -* `file`: The filename of the generated source that this source map is - associated with. - -* `sourceRoot`: A root for all relative URLs in this source map. - -* `skipValidation`: Optional. When `true`, disables validation of mappings as - they are added. This can improve performance but should be used with - discretion, as a last resort. Even then, one should avoid using this flag when - running tests, if possible. - -#### SourceMapGenerator.fromSourceMap(sourceMapConsumer) - -Creates a new SourceMapGenerator based on a SourceMapConsumer - -* `sourceMapConsumer` The SourceMap. - -#### SourceMapGenerator.prototype.addMapping(mapping) - -Add a single mapping from original source line and column to the generated -source's line and column for this source map being created. The mapping object -should have the following properties: - -* `generated`: An object with the generated line and column positions. - -* `original`: An object with the original line and column positions. - -* `source`: The original source file (relative to the sourceRoot). - -* `name`: An optional original token name for this mapping. - -#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent) - -Set the source content for an original source file. - -* `sourceFile` the URL of the original source file. - -* `sourceContent` the content of the source file. - -#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]]) - -Applies a SourceMap for a source file to the SourceMap. -Each mapping to the supplied source file is rewritten using the -supplied SourceMap. Note: The resolution for the resulting mappings -is the minimium of this map and the supplied map. - -* `sourceMapConsumer`: The SourceMap to be applied. - -* `sourceFile`: Optional. The filename of the source file. - If omitted, sourceMapConsumer.file will be used, if it exists. - Otherwise an error will be thrown. - -* `sourceMapPath`: Optional. The dirname of the path to the SourceMap - to be applied. If relative, it is relative to the SourceMap. - - This parameter is needed when the two SourceMaps aren't in the same - directory, and the SourceMap to be applied contains relative source - paths. If so, those relative source paths need to be rewritten - relative to the SourceMap. - - If omitted, it is assumed that both SourceMaps are in the same directory, - thus not needing any rewriting. (Supplying `'.'` has the same effect.) - -#### SourceMapGenerator.prototype.toString() - -Renders the source map being generated to a string. - -### SourceNode - -SourceNodes provide a way to abstract over interpolating and/or concatenating -snippets of generated JavaScript source code, while maintaining the line and -column information associated between those snippets and the original source -code. This is useful as the final intermediate representation a compiler might -use before outputting the generated JS and source map. - -#### new SourceNode([line, column, source[, chunk[, name]]]) - -* `line`: The original line number associated with this source node, or null if - it isn't associated with an original line. - -* `column`: The original column number associated with this source node, or null - if it isn't associated with an original column. - -* `source`: The original source's filename; null if no filename is provided. - -* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see - below. - -* `name`: Optional. The original identifier. - -#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath]) - -Creates a SourceNode from generated code and a SourceMapConsumer. - -* `code`: The generated code - -* `sourceMapConsumer` The SourceMap for the generated code - -* `relativePath` The optional path that relative sources in `sourceMapConsumer` - should be relative to. - -#### SourceNode.prototype.add(chunk) - -Add a chunk of generated JS to this source node. - -* `chunk`: A string snippet of generated JS code, another instance of - `SourceNode`, or an array where each member is one of those things. - -#### SourceNode.prototype.prepend(chunk) - -Prepend a chunk of generated JS to this source node. - -* `chunk`: A string snippet of generated JS code, another instance of - `SourceNode`, or an array where each member is one of those things. - -#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent) - -Set the source content for a source file. This will be added to the -`SourceMap` in the `sourcesContent` field. - -* `sourceFile`: The filename of the source file - -* `sourceContent`: The content of the source file - -#### SourceNode.prototype.walk(fn) - -Walk over the tree of JS snippets in this node and its children. The walking -function is called once for each snippet of JS and is passed that snippet and -the its original associated source's line/column location. - -* `fn`: The traversal function. - -#### SourceNode.prototype.walkSourceContents(fn) - -Walk over the tree of SourceNodes. The walking function is called for each -source file content and is passed the filename and source content. - -* `fn`: The traversal function. - -#### SourceNode.prototype.join(sep) - -Like `Array.prototype.join` except for SourceNodes. Inserts the separator -between each of this source node's children. - -* `sep`: The separator. - -#### SourceNode.prototype.replaceRight(pattern, replacement) - -Call `String.prototype.replace` on the very right-most source snippet. Useful -for trimming whitespace from the end of a source node, etc. - -* `pattern`: The pattern to replace. - -* `replacement`: The thing to replace the pattern with. - -#### SourceNode.prototype.toString() - -Return the string representation of this source node. Walks over the tree and -concatenates all the various snippets together to one string. - -#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap]) - -Returns the string representation of this tree of source nodes, plus a -SourceMapGenerator which contains all the mappings between the generated and -original sources. - -The arguments are the same as those to `new SourceMapGenerator`. - -## Tests - -[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map) - -Install NodeJS version 0.8.0 or greater, then run `node test/run-tests.js`. - -To add new tests, create a new file named `test/test-.js` -and export your test functions with names that start with "test", for example - - exports["test doing the foo bar"] = function (assert, util) { - ... - }; - -The new test will be located automatically when you run the suite. - -The `util` argument is the test utility module located at `test/source-map/util`. - -The `assert` argument is a cut down version of node's assert module. You have -access to the following assertion functions: - -* `doesNotThrow` - -* `equal` - -* `ok` - -* `strictEqual` - -* `throws` - -(The reason for the restricted set of test functions is because we need the -tests to run inside Firefox's test suite as well and so the assert module is -shimmed in that environment. See `build/assert-shim.js`.) - -[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit -[feature]: https://wiki.mozilla.org/DevTools/Features/SourceMap -[Dryice]: https://github.com/mozilla/dryice diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/assert-shim.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/assert-shim.js deleted file mode 100644 index daa1a62..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/assert-shim.js +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -define('test/source-map/assert', ['exports'], function (exports) { - - let do_throw = function (msg) { - throw new Error(msg); - }; - - exports.init = function (throw_fn) { - do_throw = throw_fn; - }; - - exports.doesNotThrow = function (fn) { - try { - fn(); - } - catch (e) { - do_throw(e.message); - } - }; - - exports.equal = function (actual, expected, msg) { - msg = msg || String(actual) + ' != ' + String(expected); - if (actual != expected) { - do_throw(msg); - } - }; - - exports.ok = function (val, msg) { - msg = msg || String(val) + ' is falsey'; - if (!Boolean(val)) { - do_throw(msg); - } - }; - - exports.strictEqual = function (actual, expected, msg) { - msg = msg || String(actual) + ' !== ' + String(expected); - if (actual !== expected) { - do_throw(msg); - } - }; - - exports.throws = function (fn) { - try { - fn(); - do_throw('Expected an error to be thrown, but it wasn\'t.'); - } - catch (e) { - } - }; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/mini-require.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/mini-require.js deleted file mode 100644 index 0daf453..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/mini-require.js +++ /dev/null @@ -1,152 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -/** - * Define a module along with a payload. - * @param {string} moduleName Name for the payload - * @param {ignored} deps Ignored. For compatibility with CommonJS AMD Spec - * @param {function} payload Function with (require, exports, module) params - */ -function define(moduleName, deps, payload) { - if (typeof moduleName != "string") { - throw new TypeError('Expected string, got: ' + moduleName); - } - - if (arguments.length == 2) { - payload = deps; - } - - if (moduleName in define.modules) { - throw new Error("Module already defined: " + moduleName); - } - define.modules[moduleName] = payload; -}; - -/** - * The global store of un-instantiated modules - */ -define.modules = {}; - - -/** - * We invoke require() in the context of a Domain so we can have multiple - * sets of modules running separate from each other. - * This contrasts with JSMs which are singletons, Domains allows us to - * optionally load a CommonJS module twice with separate data each time. - * Perhaps you want 2 command lines with a different set of commands in each, - * for example. - */ -function Domain() { - this.modules = {}; - this._currentModule = null; -} - -(function () { - - /** - * Lookup module names and resolve them by calling the definition function if - * needed. - * There are 2 ways to call this, either with an array of dependencies and a - * callback to call when the dependencies are found (which can happen - * asynchronously in an in-page context) or with a single string an no callback - * where the dependency is resolved synchronously and returned. - * The API is designed to be compatible with the CommonJS AMD spec and - * RequireJS. - * @param {string[]|string} deps A name, or names for the payload - * @param {function|undefined} callback Function to call when the dependencies - * are resolved - * @return {undefined|object} The module required or undefined for - * array/callback method - */ - Domain.prototype.require = function(deps, callback) { - if (Array.isArray(deps)) { - var params = deps.map(function(dep) { - return this.lookup(dep); - }, this); - if (callback) { - callback.apply(null, params); - } - return undefined; - } - else { - return this.lookup(deps); - } - }; - - function normalize(path) { - var bits = path.split('/'); - var i = 1; - while (i < bits.length) { - if (bits[i] === '..') { - bits.splice(i-1, 1); - } else if (bits[i] === '.') { - bits.splice(i, 1); - } else { - i++; - } - } - return bits.join('/'); - } - - function join(a, b) { - a = a.trim(); - b = b.trim(); - if (/^\//.test(b)) { - return b; - } else { - return a.replace(/\/*$/, '/') + b; - } - } - - function dirname(path) { - var bits = path.split('/'); - bits.pop(); - return bits.join('/'); - } - - /** - * Lookup module names and resolve them by calling the definition function if - * needed. - * @param {string} moduleName A name for the payload to lookup - * @return {object} The module specified by aModuleName or null if not found. - */ - Domain.prototype.lookup = function(moduleName) { - if (/^\./.test(moduleName)) { - moduleName = normalize(join(dirname(this._currentModule), moduleName)); - } - - if (moduleName in this.modules) { - var module = this.modules[moduleName]; - return module; - } - - if (!(moduleName in define.modules)) { - throw new Error("Module not defined: " + moduleName); - } - - var module = define.modules[moduleName]; - - if (typeof module == "function") { - var exports = {}; - var previousModule = this._currentModule; - this._currentModule = moduleName; - module(this.require.bind(this), exports, { id: moduleName, uri: "" }); - this._currentModule = previousModule; - module = exports; - } - - // cache the resulting module object for next time - this.modules[moduleName] = module; - - return module; - }; - -}()); - -define.Domain = Domain; -define.globalDomain = new Domain(); -var require = define.globalDomain.require.bind(define.globalDomain); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-source-map.jsm b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-source-map.jsm deleted file mode 100644 index ee2539d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-source-map.jsm +++ /dev/null @@ -1,20 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -/* - * WARNING! - * - * Do not edit this file directly, it is built from the sources at - * https://github.com/mozilla/source-map/ - */ - -/////////////////////////////////////////////////////////////////////////////// - - -this.EXPORTED_SYMBOLS = [ "SourceMapConsumer", "SourceMapGenerator", "SourceNode" ]; - -Components.utils.import('resource://gre/modules/devtools/Require.jsm'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-utils.jsm b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-utils.jsm deleted file mode 100644 index 80341d4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/prefix-utils.jsm +++ /dev/null @@ -1,18 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ - -/* - * WARNING! - * - * Do not edit this file directly, it is built from the sources at - * https://github.com/mozilla/source-map/ - */ - -Components.utils.import('resource://gre/modules/devtools/Require.jsm'); -Components.utils.import('resource://gre/modules/devtools/SourceMap.jsm'); - -this.EXPORTED_SYMBOLS = [ "define", "runSourceMapTests" ]; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-browser.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-browser.js deleted file mode 100644 index fb29ff5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-browser.js +++ /dev/null @@ -1,8 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/////////////////////////////////////////////////////////////////////////////// - -this.sourceMap = { - SourceMapConsumer: require('source-map/source-map-consumer').SourceMapConsumer, - SourceMapGenerator: require('source-map/source-map-generator').SourceMapGenerator, - SourceNode: require('source-map/source-node').SourceNode -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-source-map.jsm b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-source-map.jsm deleted file mode 100644 index cf3c2d8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-source-map.jsm +++ /dev/null @@ -1,6 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/////////////////////////////////////////////////////////////////////////////// - -this.SourceMapConsumer = require('source-map/source-map-consumer').SourceMapConsumer; -this.SourceMapGenerator = require('source-map/source-map-generator').SourceMapGenerator; -this.SourceNode = require('source-map/source-node').SourceNode; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-utils.jsm b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-utils.jsm deleted file mode 100644 index b31b84c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/suffix-utils.jsm +++ /dev/null @@ -1,21 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -function runSourceMapTests(modName, do_throw) { - let mod = require(modName); - let assert = require('test/source-map/assert'); - let util = require('test/source-map/util'); - - assert.init(do_throw); - - for (let k in mod) { - if (/^test/.test(k)) { - mod[k](assert, util); - } - } - -} -this.runSourceMapTests = runSourceMapTests; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-prefix.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-prefix.js deleted file mode 100644 index 1b13f30..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-prefix.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - * WARNING! - * - * Do not edit this file directly, it is built from the sources at - * https://github.com/mozilla/source-map/ - */ - -Components.utils.import('resource://test/Utils.jsm'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-suffix.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-suffix.js deleted file mode 100644 index bec2de3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/build/test-suffix.js +++ /dev/null @@ -1,3 +0,0 @@ -function run_test() { - runSourceMapTests('{THIS_MODULE}', do_throw); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map.js deleted file mode 100644 index 121ad24..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright 2009-2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE.txt or: - * http://opensource.org/licenses/BSD-3-Clause - */ -exports.SourceMapGenerator = require('./source-map/source-map-generator').SourceMapGenerator; -exports.SourceMapConsumer = require('./source-map/source-map-consumer').SourceMapConsumer; -exports.SourceNode = require('./source-map/source-node').SourceNode; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/array-set.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/array-set.js deleted file mode 100644 index 40f9a18..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/array-set.js +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var util = require('./util'); - - /** - * A data structure which is a combination of an array and a set. Adding a new - * member is O(1), testing for membership is O(1), and finding the index of an - * element is O(1). Removing elements from the set is not supported. Only - * strings are supported for membership. - */ - function ArraySet() { - this._array = []; - this._set = {}; - } - - /** - * Static method for creating ArraySet instances from an existing array. - */ - ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { - var set = new ArraySet(); - for (var i = 0, len = aArray.length; i < len; i++) { - set.add(aArray[i], aAllowDuplicates); - } - return set; - }; - - /** - * Add the given string to this set. - * - * @param String aStr - */ - ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { - var isDuplicate = this.has(aStr); - var idx = this._array.length; - if (!isDuplicate || aAllowDuplicates) { - this._array.push(aStr); - } - if (!isDuplicate) { - this._set[util.toSetString(aStr)] = idx; - } - }; - - /** - * Is the given string a member of this set? - * - * @param String aStr - */ - ArraySet.prototype.has = function ArraySet_has(aStr) { - return Object.prototype.hasOwnProperty.call(this._set, - util.toSetString(aStr)); - }; - - /** - * What is the index of the given string in the array? - * - * @param String aStr - */ - ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { - if (this.has(aStr)) { - return this._set[util.toSetString(aStr)]; - } - throw new Error('"' + aStr + '" is not in the set.'); - }; - - /** - * What is the element at the given index? - * - * @param Number aIdx - */ - ArraySet.prototype.at = function ArraySet_at(aIdx) { - if (aIdx >= 0 && aIdx < this._array.length) { - return this._array[aIdx]; - } - throw new Error('No element indexed by ' + aIdx); - }; - - /** - * Returns the array representation of this set (which has the proper indices - * indicated by indexOf). Note that this is a copy of the internal array used - * for storing the members so that no one can mess with internal state. - */ - ArraySet.prototype.toArray = function ArraySet_toArray() { - return this._array.slice(); - }; - - exports.ArraySet = ArraySet; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64-vlq.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64-vlq.js deleted file mode 100644 index e22dcae..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64-vlq.js +++ /dev/null @@ -1,142 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - * - * Based on the Base 64 VLQ implementation in Closure Compiler: - * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java - * - * Copyright 2011 The Closure Compiler Authors. All rights reserved. - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var base64 = require('./base64'); - - // A single base 64 digit can contain 6 bits of data. For the base 64 variable - // length quantities we use in the source map spec, the first bit is the sign, - // the next four bits are the actual value, and the 6th bit is the - // continuation bit. The continuation bit tells us whether there are more - // digits in this value following this digit. - // - // Continuation - // | Sign - // | | - // V V - // 101011 - - var VLQ_BASE_SHIFT = 5; - - // binary: 100000 - var VLQ_BASE = 1 << VLQ_BASE_SHIFT; - - // binary: 011111 - var VLQ_BASE_MASK = VLQ_BASE - 1; - - // binary: 100000 - var VLQ_CONTINUATION_BIT = VLQ_BASE; - - /** - * Converts from a two-complement value to a value where the sign bit is - * placed in the least significant bit. For example, as decimals: - * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) - * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) - */ - function toVLQSigned(aValue) { - return aValue < 0 - ? ((-aValue) << 1) + 1 - : (aValue << 1) + 0; - } - - /** - * Converts to a two-complement value from a value where the sign bit is - * placed in the least significant bit. For example, as decimals: - * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 - * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 - */ - function fromVLQSigned(aValue) { - var isNegative = (aValue & 1) === 1; - var shifted = aValue >> 1; - return isNegative - ? -shifted - : shifted; - } - - /** - * Returns the base 64 VLQ encoded value. - */ - exports.encode = function base64VLQ_encode(aValue) { - var encoded = ""; - var digit; - - var vlq = toVLQSigned(aValue); - - do { - digit = vlq & VLQ_BASE_MASK; - vlq >>>= VLQ_BASE_SHIFT; - if (vlq > 0) { - // There are still more digits in this value, so we must make sure the - // continuation bit is marked. - digit |= VLQ_CONTINUATION_BIT; - } - encoded += base64.encode(digit); - } while (vlq > 0); - - return encoded; - }; - - /** - * Decodes the next base 64 VLQ value from the given string and returns the - * value and the rest of the string via the out parameter. - */ - exports.decode = function base64VLQ_decode(aStr, aOutParam) { - var i = 0; - var strLen = aStr.length; - var result = 0; - var shift = 0; - var continuation, digit; - - do { - if (i >= strLen) { - throw new Error("Expected more digits in base 64 VLQ value."); - } - digit = base64.decode(aStr.charAt(i++)); - continuation = !!(digit & VLQ_CONTINUATION_BIT); - digit &= VLQ_BASE_MASK; - result = result + (digit << shift); - shift += VLQ_BASE_SHIFT; - } while (continuation); - - aOutParam.value = fromVLQSigned(result); - aOutParam.rest = aStr.slice(i); - }; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64.js deleted file mode 100644 index 863cc46..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/base64.js +++ /dev/null @@ -1,42 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var charToIntMap = {}; - var intToCharMap = {}; - - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' - .split('') - .forEach(function (ch, index) { - charToIntMap[ch] = index; - intToCharMap[index] = ch; - }); - - /** - * Encode an integer in the range of 0 to 63 to a single base 64 digit. - */ - exports.encode = function base64_encode(aNumber) { - if (aNumber in intToCharMap) { - return intToCharMap[aNumber]; - } - throw new TypeError("Must be between 0 and 63: " + aNumber); - }; - - /** - * Decode a single base 64 digit to an integer. - */ - exports.decode = function base64_decode(aChar) { - if (aChar in charToIntMap) { - return charToIntMap[aChar]; - } - throw new TypeError("Not a valid base 64 digit: " + aChar); - }; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/binary-search.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/binary-search.js deleted file mode 100644 index e085f81..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/binary-search.js +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - /** - * Recursive implementation of binary search. - * - * @param aLow Indices here and lower do not contain the needle. - * @param aHigh Indices here and higher do not contain the needle. - * @param aNeedle The element being searched for. - * @param aHaystack The non-empty array being searched. - * @param aCompare Function which takes two elements and returns -1, 0, or 1. - */ - function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) { - // This function terminates when one of the following is true: - // - // 1. We find the exact element we are looking for. - // - // 2. We did not find the exact element, but we can return the index of - // the next closest element that is less than that element. - // - // 3. We did not find the exact element, and there is no next-closest - // element which is less than the one we are searching for, so we - // return -1. - var mid = Math.floor((aHigh - aLow) / 2) + aLow; - var cmp = aCompare(aNeedle, aHaystack[mid], true); - if (cmp === 0) { - // Found the element we are looking for. - return mid; - } - else if (cmp > 0) { - // aHaystack[mid] is greater than our needle. - if (aHigh - mid > 1) { - // The element is in the upper half. - return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare); - } - // We did not find an exact match, return the next closest one - // (termination case 2). - return mid; - } - else { - // aHaystack[mid] is less than our needle. - if (mid - aLow > 1) { - // The element is in the lower half. - return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare); - } - // The exact needle element was not found in this haystack. Determine if - // we are in termination case (2) or (3) and return the appropriate thing. - return aLow < 0 ? -1 : aLow; - } - } - - /** - * This is an implementation of binary search which will always try and return - * the index of next lowest value checked if there is no exact hit. This is - * because mappings between original and generated line/col pairs are single - * points, and there is an implicit region between each of them, so a miss - * just means that you aren't on the very start of a region. - * - * @param aNeedle The element you are looking for. - * @param aHaystack The array that is being searched. - * @param aCompare A function which takes the needle and an element in the - * array and returns -1, 0, or 1 depending on whether the needle is less - * than, equal to, or greater than the element, respectively. - */ - exports.search = function search(aNeedle, aHaystack, aCompare) { - if (aHaystack.length === 0) { - return -1; - } - return recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare) - }; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/mapping-list.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/mapping-list.js deleted file mode 100644 index 2a4eb61..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/mapping-list.js +++ /dev/null @@ -1,86 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2014 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var util = require('./util'); - - /** - * Determine whether mappingB is after mappingA with respect to generated - * position. - */ - function generatedPositionAfter(mappingA, mappingB) { - // Optimized for most common case - var lineA = mappingA.generatedLine; - var lineB = mappingB.generatedLine; - var columnA = mappingA.generatedColumn; - var columnB = mappingB.generatedColumn; - return lineB > lineA || lineB == lineA && columnB >= columnA || - util.compareByGeneratedPositions(mappingA, mappingB) <= 0; - } - - /** - * A data structure to provide a sorted view of accumulated mappings in a - * performance conscious manner. It trades a neglibable overhead in general - * case for a large speedup in case of mappings being added in order. - */ - function MappingList() { - this._array = []; - this._sorted = true; - // Serves as infimum - this._last = {generatedLine: -1, generatedColumn: 0}; - } - - /** - * Iterate through internal items. This method takes the same arguments that - * `Array.prototype.forEach` takes. - * - * NOTE: The order of the mappings is NOT guaranteed. - */ - MappingList.prototype.unsortedForEach = - function MappingList_forEach(aCallback, aThisArg) { - this._array.forEach(aCallback, aThisArg); - }; - - /** - * Add the given source mapping. - * - * @param Object aMapping - */ - MappingList.prototype.add = function MappingList_add(aMapping) { - var mapping; - if (generatedPositionAfter(this._last, aMapping)) { - this._last = aMapping; - this._array.push(aMapping); - } else { - this._sorted = false; - this._array.push(aMapping); - } - }; - - /** - * Returns the flat, sorted array of mappings. The mappings are sorted by - * generated position. - * - * WARNING: This method returns internal data without copying, for - * performance. The return value must NOT be mutated, and should be treated as - * an immutable borrow. If you want to take ownership, you must make your own - * copy. - */ - MappingList.prototype.toArray = function MappingList_toArray() { - if (!this._sorted) { - this._array.sort(util.compareByGeneratedPositions); - this._sorted = true; - } - return this._array; - }; - - exports.MappingList = MappingList; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-consumer.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-consumer.js deleted file mode 100644 index cfaa299..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-consumer.js +++ /dev/null @@ -1,575 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var util = require('./util'); - var binarySearch = require('./binary-search'); - var ArraySet = require('./array-set').ArraySet; - var base64VLQ = require('./base64-vlq'); - - /** - * A SourceMapConsumer instance represents a parsed source map which we can - * query for information about the original file positions by giving it a file - * position in the generated source. - * - * The only parameter is the raw source map (either as a JSON string, or - * already parsed to an object). According to the spec, source maps have the - * following attributes: - * - * - version: Which version of the source map spec this map is following. - * - sources: An array of URLs to the original source files. - * - names: An array of identifiers which can be referrenced by individual mappings. - * - sourceRoot: Optional. The URL root from which all sources are relative. - * - sourcesContent: Optional. An array of contents of the original source files. - * - mappings: A string of base64 VLQs which contain the actual mappings. - * - file: Optional. The generated file this source map is associated with. - * - * Here is an example source map, taken from the source map spec[0]: - * - * { - * version : 3, - * file: "out.js", - * sourceRoot : "", - * sources: ["foo.js", "bar.js"], - * names: ["src", "maps", "are", "fun"], - * mappings: "AA,AB;;ABCDE;" - * } - * - * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# - */ - function SourceMapConsumer(aSourceMap) { - var sourceMap = aSourceMap; - if (typeof aSourceMap === 'string') { - sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, '')); - } - - var version = util.getArg(sourceMap, 'version'); - var sources = util.getArg(sourceMap, 'sources'); - // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which - // requires the array) to play nice here. - var names = util.getArg(sourceMap, 'names', []); - var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); - var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); - var mappings = util.getArg(sourceMap, 'mappings'); - var file = util.getArg(sourceMap, 'file', null); - - // Once again, Sass deviates from the spec and supplies the version as a - // string rather than a number, so we use loose equality checking here. - if (version != this._version) { - throw new Error('Unsupported version: ' + version); - } - - // Some source maps produce relative source paths like "./foo.js" instead of - // "foo.js". Normalize these first so that future comparisons will succeed. - // See bugzil.la/1090768. - sources = sources.map(util.normalize); - - // Pass `true` below to allow duplicate names and sources. While source maps - // are intended to be compressed and deduplicated, the TypeScript compiler - // sometimes generates source maps with duplicates in them. See Github issue - // #72 and bugzil.la/889492. - this._names = ArraySet.fromArray(names, true); - this._sources = ArraySet.fromArray(sources, true); - - this.sourceRoot = sourceRoot; - this.sourcesContent = sourcesContent; - this._mappings = mappings; - this.file = file; - } - - /** - * Create a SourceMapConsumer from a SourceMapGenerator. - * - * @param SourceMapGenerator aSourceMap - * The source map that will be consumed. - * @returns SourceMapConsumer - */ - SourceMapConsumer.fromSourceMap = - function SourceMapConsumer_fromSourceMap(aSourceMap) { - var smc = Object.create(SourceMapConsumer.prototype); - - smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); - smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); - smc.sourceRoot = aSourceMap._sourceRoot; - smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), - smc.sourceRoot); - smc.file = aSourceMap._file; - - smc.__generatedMappings = aSourceMap._mappings.toArray().slice(); - smc.__originalMappings = aSourceMap._mappings.toArray().slice() - .sort(util.compareByOriginalPositions); - - return smc; - }; - - /** - * The version of the source mapping spec that we are consuming. - */ - SourceMapConsumer.prototype._version = 3; - - /** - * The list of original sources. - */ - Object.defineProperty(SourceMapConsumer.prototype, 'sources', { - get: function () { - return this._sources.toArray().map(function (s) { - return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s; - }, this); - } - }); - - // `__generatedMappings` and `__originalMappings` are arrays that hold the - // parsed mapping coordinates from the source map's "mappings" attribute. They - // are lazily instantiated, accessed via the `_generatedMappings` and - // `_originalMappings` getters respectively, and we only parse the mappings - // and create these arrays once queried for a source location. We jump through - // these hoops because there can be many thousands of mappings, and parsing - // them is expensive, so we only want to do it if we must. - // - // Each object in the arrays is of the form: - // - // { - // generatedLine: The line number in the generated code, - // generatedColumn: The column number in the generated code, - // source: The path to the original source file that generated this - // chunk of code, - // originalLine: The line number in the original source that - // corresponds to this chunk of generated code, - // originalColumn: The column number in the original source that - // corresponds to this chunk of generated code, - // name: The name of the original symbol which generated this chunk of - // code. - // } - // - // All properties except for `generatedLine` and `generatedColumn` can be - // `null`. - // - // `_generatedMappings` is ordered by the generated positions. - // - // `_originalMappings` is ordered by the original positions. - - SourceMapConsumer.prototype.__generatedMappings = null; - Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', { - get: function () { - if (!this.__generatedMappings) { - this.__generatedMappings = []; - this.__originalMappings = []; - this._parseMappings(this._mappings, this.sourceRoot); - } - - return this.__generatedMappings; - } - }); - - SourceMapConsumer.prototype.__originalMappings = null; - Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', { - get: function () { - if (!this.__originalMappings) { - this.__generatedMappings = []; - this.__originalMappings = []; - this._parseMappings(this._mappings, this.sourceRoot); - } - - return this.__originalMappings; - } - }); - - SourceMapConsumer.prototype._nextCharIsMappingSeparator = - function SourceMapConsumer_nextCharIsMappingSeparator(aStr) { - var c = aStr.charAt(0); - return c === ";" || c === ","; - }; - - /** - * Parse the mappings in a string in to a data structure which we can easily - * query (the ordered arrays in the `this.__generatedMappings` and - * `this.__originalMappings` properties). - */ - SourceMapConsumer.prototype._parseMappings = - function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { - var generatedLine = 1; - var previousGeneratedColumn = 0; - var previousOriginalLine = 0; - var previousOriginalColumn = 0; - var previousSource = 0; - var previousName = 0; - var str = aStr; - var temp = {}; - var mapping; - - while (str.length > 0) { - if (str.charAt(0) === ';') { - generatedLine++; - str = str.slice(1); - previousGeneratedColumn = 0; - } - else if (str.charAt(0) === ',') { - str = str.slice(1); - } - else { - mapping = {}; - mapping.generatedLine = generatedLine; - - // Generated column. - base64VLQ.decode(str, temp); - mapping.generatedColumn = previousGeneratedColumn + temp.value; - previousGeneratedColumn = mapping.generatedColumn; - str = temp.rest; - - if (str.length > 0 && !this._nextCharIsMappingSeparator(str)) { - // Original source. - base64VLQ.decode(str, temp); - mapping.source = this._sources.at(previousSource + temp.value); - previousSource += temp.value; - str = temp.rest; - if (str.length === 0 || this._nextCharIsMappingSeparator(str)) { - throw new Error('Found a source, but no line and column'); - } - - // Original line. - base64VLQ.decode(str, temp); - mapping.originalLine = previousOriginalLine + temp.value; - previousOriginalLine = mapping.originalLine; - // Lines are stored 0-based - mapping.originalLine += 1; - str = temp.rest; - if (str.length === 0 || this._nextCharIsMappingSeparator(str)) { - throw new Error('Found a source and line, but no column'); - } - - // Original column. - base64VLQ.decode(str, temp); - mapping.originalColumn = previousOriginalColumn + temp.value; - previousOriginalColumn = mapping.originalColumn; - str = temp.rest; - - if (str.length > 0 && !this._nextCharIsMappingSeparator(str)) { - // Original name. - base64VLQ.decode(str, temp); - mapping.name = this._names.at(previousName + temp.value); - previousName += temp.value; - str = temp.rest; - } - } - - this.__generatedMappings.push(mapping); - if (typeof mapping.originalLine === 'number') { - this.__originalMappings.push(mapping); - } - } - } - - this.__generatedMappings.sort(util.compareByGeneratedPositions); - this.__originalMappings.sort(util.compareByOriginalPositions); - }; - - /** - * Find the mapping that best matches the hypothetical "needle" mapping that - * we are searching for in the given "haystack" of mappings. - */ - SourceMapConsumer.prototype._findMapping = - function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, - aColumnName, aComparator) { - // To return the position we are searching for, we must first find the - // mapping for the given position and then return the opposite position it - // points to. Because the mappings are sorted, we can use binary search to - // find the best mapping. - - if (aNeedle[aLineName] <= 0) { - throw new TypeError('Line must be greater than or equal to 1, got ' - + aNeedle[aLineName]); - } - if (aNeedle[aColumnName] < 0) { - throw new TypeError('Column must be greater than or equal to 0, got ' - + aNeedle[aColumnName]); - } - - return binarySearch.search(aNeedle, aMappings, aComparator); - }; - - /** - * Compute the last column for each generated mapping. The last column is - * inclusive. - */ - SourceMapConsumer.prototype.computeColumnSpans = - function SourceMapConsumer_computeColumnSpans() { - for (var index = 0; index < this._generatedMappings.length; ++index) { - var mapping = this._generatedMappings[index]; - - // Mappings do not contain a field for the last generated columnt. We - // can come up with an optimistic estimate, however, by assuming that - // mappings are contiguous (i.e. given two consecutive mappings, the - // first mapping ends where the second one starts). - if (index + 1 < this._generatedMappings.length) { - var nextMapping = this._generatedMappings[index + 1]; - - if (mapping.generatedLine === nextMapping.generatedLine) { - mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; - continue; - } - } - - // The last mapping for each line spans the entire line. - mapping.lastGeneratedColumn = Infinity; - } - }; - - /** - * Returns the original source, line, and column information for the generated - * source's line and column positions provided. The only argument is an object - * with the following properties: - * - * - line: The line number in the generated source. - * - column: The column number in the generated source. - * - * and an object is returned with the following properties: - * - * - source: The original source file, or null. - * - line: The line number in the original source, or null. - * - column: The column number in the original source, or null. - * - name: The original identifier, or null. - */ - SourceMapConsumer.prototype.originalPositionFor = - function SourceMapConsumer_originalPositionFor(aArgs) { - var needle = { - generatedLine: util.getArg(aArgs, 'line'), - generatedColumn: util.getArg(aArgs, 'column') - }; - - var index = this._findMapping(needle, - this._generatedMappings, - "generatedLine", - "generatedColumn", - util.compareByGeneratedPositions); - - if (index >= 0) { - var mapping = this._generatedMappings[index]; - - if (mapping.generatedLine === needle.generatedLine) { - var source = util.getArg(mapping, 'source', null); - if (source != null && this.sourceRoot != null) { - source = util.join(this.sourceRoot, source); - } - return { - source: source, - line: util.getArg(mapping, 'originalLine', null), - column: util.getArg(mapping, 'originalColumn', null), - name: util.getArg(mapping, 'name', null) - }; - } - } - - return { - source: null, - line: null, - column: null, - name: null - }; - }; - - /** - * Returns the original source content. The only argument is the url of the - * original source file. Returns null if no original source content is - * availible. - */ - SourceMapConsumer.prototype.sourceContentFor = - function SourceMapConsumer_sourceContentFor(aSource) { - if (!this.sourcesContent) { - return null; - } - - if (this.sourceRoot != null) { - aSource = util.relative(this.sourceRoot, aSource); - } - - if (this._sources.has(aSource)) { - return this.sourcesContent[this._sources.indexOf(aSource)]; - } - - var url; - if (this.sourceRoot != null - && (url = util.urlParse(this.sourceRoot))) { - // XXX: file:// URIs and absolute paths lead to unexpected behavior for - // many users. We can help them out when they expect file:// URIs to - // behave like it would if they were running a local HTTP server. See - // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. - var fileUriAbsPath = aSource.replace(/^file:\/\//, ""); - if (url.scheme == "file" - && this._sources.has(fileUriAbsPath)) { - return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] - } - - if ((!url.path || url.path == "/") - && this._sources.has("/" + aSource)) { - return this.sourcesContent[this._sources.indexOf("/" + aSource)]; - } - } - - throw new Error('"' + aSource + '" is not in the SourceMap.'); - }; - - /** - * Returns the generated line and column information for the original source, - * line, and column positions provided. The only argument is an object with - * the following properties: - * - * - source: The filename of the original source. - * - line: The line number in the original source. - * - column: The column number in the original source. - * - * and an object is returned with the following properties: - * - * - line: The line number in the generated source, or null. - * - column: The column number in the generated source, or null. - */ - SourceMapConsumer.prototype.generatedPositionFor = - function SourceMapConsumer_generatedPositionFor(aArgs) { - var needle = { - source: util.getArg(aArgs, 'source'), - originalLine: util.getArg(aArgs, 'line'), - originalColumn: util.getArg(aArgs, 'column') - }; - - if (this.sourceRoot != null) { - needle.source = util.relative(this.sourceRoot, needle.source); - } - - var index = this._findMapping(needle, - this._originalMappings, - "originalLine", - "originalColumn", - util.compareByOriginalPositions); - - if (index >= 0) { - var mapping = this._originalMappings[index]; - - return { - line: util.getArg(mapping, 'generatedLine', null), - column: util.getArg(mapping, 'generatedColumn', null), - lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) - }; - } - - return { - line: null, - column: null, - lastColumn: null - }; - }; - - /** - * Returns all generated line and column information for the original source - * and line provided. The only argument is an object with the following - * properties: - * - * - source: The filename of the original source. - * - line: The line number in the original source. - * - * and an array of objects is returned, each with the following properties: - * - * - line: The line number in the generated source, or null. - * - column: The column number in the generated source, or null. - */ - SourceMapConsumer.prototype.allGeneratedPositionsFor = - function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { - // When there is no exact match, SourceMapConsumer.prototype._findMapping - // returns the index of the closest mapping less than the needle. By - // setting needle.originalColumn to Infinity, we thus find the last - // mapping for the given line, provided such a mapping exists. - var needle = { - source: util.getArg(aArgs, 'source'), - originalLine: util.getArg(aArgs, 'line'), - originalColumn: Infinity - }; - - if (this.sourceRoot != null) { - needle.source = util.relative(this.sourceRoot, needle.source); - } - - var mappings = []; - - var index = this._findMapping(needle, - this._originalMappings, - "originalLine", - "originalColumn", - util.compareByOriginalPositions); - if (index >= 0) { - var mapping = this._originalMappings[index]; - - while (mapping && mapping.originalLine === needle.originalLine) { - mappings.push({ - line: util.getArg(mapping, 'generatedLine', null), - column: util.getArg(mapping, 'generatedColumn', null), - lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) - }); - - mapping = this._originalMappings[--index]; - } - } - - return mappings.reverse(); - }; - - SourceMapConsumer.GENERATED_ORDER = 1; - SourceMapConsumer.ORIGINAL_ORDER = 2; - - /** - * Iterate over each mapping between an original source/line/column and a - * generated line/column in this source map. - * - * @param Function aCallback - * The function that is called with each mapping. - * @param Object aContext - * Optional. If specified, this object will be the value of `this` every - * time that `aCallback` is called. - * @param aOrder - * Either `SourceMapConsumer.GENERATED_ORDER` or - * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to - * iterate over the mappings sorted by the generated file's line/column - * order or the original's source/line/column order, respectively. Defaults to - * `SourceMapConsumer.GENERATED_ORDER`. - */ - SourceMapConsumer.prototype.eachMapping = - function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { - var context = aContext || null; - var order = aOrder || SourceMapConsumer.GENERATED_ORDER; - - var mappings; - switch (order) { - case SourceMapConsumer.GENERATED_ORDER: - mappings = this._generatedMappings; - break; - case SourceMapConsumer.ORIGINAL_ORDER: - mappings = this._originalMappings; - break; - default: - throw new Error("Unknown order of iteration."); - } - - var sourceRoot = this.sourceRoot; - mappings.map(function (mapping) { - var source = mapping.source; - if (source != null && sourceRoot != null) { - source = util.join(sourceRoot, source); - } - return { - source: source, - generatedLine: mapping.generatedLine, - generatedColumn: mapping.generatedColumn, - originalLine: mapping.originalLine, - originalColumn: mapping.originalColumn, - name: mapping.name - }; - }).forEach(aCallback, context); - }; - - exports.SourceMapConsumer = SourceMapConsumer; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-generator.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-generator.js deleted file mode 100644 index 1ab7a47..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-map-generator.js +++ /dev/null @@ -1,400 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var base64VLQ = require('./base64-vlq'); - var util = require('./util'); - var ArraySet = require('./array-set').ArraySet; - var MappingList = require('./mapping-list').MappingList; - - /** - * An instance of the SourceMapGenerator represents a source map which is - * being built incrementally. You may pass an object with the following - * properties: - * - * - file: The filename of the generated source. - * - sourceRoot: A root for all relative URLs in this source map. - */ - function SourceMapGenerator(aArgs) { - if (!aArgs) { - aArgs = {}; - } - this._file = util.getArg(aArgs, 'file', null); - this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); - this._skipValidation = util.getArg(aArgs, 'skipValidation', false); - this._sources = new ArraySet(); - this._names = new ArraySet(); - this._mappings = new MappingList(); - this._sourcesContents = null; - } - - SourceMapGenerator.prototype._version = 3; - - /** - * Creates a new SourceMapGenerator based on a SourceMapConsumer - * - * @param aSourceMapConsumer The SourceMap. - */ - SourceMapGenerator.fromSourceMap = - function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { - var sourceRoot = aSourceMapConsumer.sourceRoot; - var generator = new SourceMapGenerator({ - file: aSourceMapConsumer.file, - sourceRoot: sourceRoot - }); - aSourceMapConsumer.eachMapping(function (mapping) { - var newMapping = { - generated: { - line: mapping.generatedLine, - column: mapping.generatedColumn - } - }; - - if (mapping.source != null) { - newMapping.source = mapping.source; - if (sourceRoot != null) { - newMapping.source = util.relative(sourceRoot, newMapping.source); - } - - newMapping.original = { - line: mapping.originalLine, - column: mapping.originalColumn - }; - - if (mapping.name != null) { - newMapping.name = mapping.name; - } - } - - generator.addMapping(newMapping); - }); - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content != null) { - generator.setSourceContent(sourceFile, content); - } - }); - return generator; - }; - - /** - * Add a single mapping from original source line and column to the generated - * source's line and column for this source map being created. The mapping - * object should have the following properties: - * - * - generated: An object with the generated line and column positions. - * - original: An object with the original line and column positions. - * - source: The original source file (relative to the sourceRoot). - * - name: An optional original token name for this mapping. - */ - SourceMapGenerator.prototype.addMapping = - function SourceMapGenerator_addMapping(aArgs) { - var generated = util.getArg(aArgs, 'generated'); - var original = util.getArg(aArgs, 'original', null); - var source = util.getArg(aArgs, 'source', null); - var name = util.getArg(aArgs, 'name', null); - - if (!this._skipValidation) { - this._validateMapping(generated, original, source, name); - } - - if (source != null && !this._sources.has(source)) { - this._sources.add(source); - } - - if (name != null && !this._names.has(name)) { - this._names.add(name); - } - - this._mappings.add({ - generatedLine: generated.line, - generatedColumn: generated.column, - originalLine: original != null && original.line, - originalColumn: original != null && original.column, - source: source, - name: name - }); - }; - - /** - * Set the source content for a source file. - */ - SourceMapGenerator.prototype.setSourceContent = - function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { - var source = aSourceFile; - if (this._sourceRoot != null) { - source = util.relative(this._sourceRoot, source); - } - - if (aSourceContent != null) { - // Add the source content to the _sourcesContents map. - // Create a new _sourcesContents map if the property is null. - if (!this._sourcesContents) { - this._sourcesContents = {}; - } - this._sourcesContents[util.toSetString(source)] = aSourceContent; - } else if (this._sourcesContents) { - // Remove the source file from the _sourcesContents map. - // If the _sourcesContents map is empty, set the property to null. - delete this._sourcesContents[util.toSetString(source)]; - if (Object.keys(this._sourcesContents).length === 0) { - this._sourcesContents = null; - } - } - }; - - /** - * Applies the mappings of a sub-source-map for a specific source file to the - * source map being generated. Each mapping to the supplied source file is - * rewritten using the supplied source map. Note: The resolution for the - * resulting mappings is the minimium of this map and the supplied map. - * - * @param aSourceMapConsumer The source map to be applied. - * @param aSourceFile Optional. The filename of the source file. - * If omitted, SourceMapConsumer's file property will be used. - * @param aSourceMapPath Optional. The dirname of the path to the source map - * to be applied. If relative, it is relative to the SourceMapConsumer. - * This parameter is needed when the two source maps aren't in the same - * directory, and the source map to be applied contains relative source - * paths. If so, those relative source paths need to be rewritten - * relative to the SourceMapGenerator. - */ - SourceMapGenerator.prototype.applySourceMap = - function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { - var sourceFile = aSourceFile; - // If aSourceFile is omitted, we will use the file property of the SourceMap - if (aSourceFile == null) { - if (aSourceMapConsumer.file == null) { - throw new Error( - 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + - 'or the source map\'s "file" property. Both were omitted.' - ); - } - sourceFile = aSourceMapConsumer.file; - } - var sourceRoot = this._sourceRoot; - // Make "sourceFile" relative if an absolute Url is passed. - if (sourceRoot != null) { - sourceFile = util.relative(sourceRoot, sourceFile); - } - // Applying the SourceMap can add and remove items from the sources and - // the names array. - var newSources = new ArraySet(); - var newNames = new ArraySet(); - - // Find mappings for the "sourceFile" - this._mappings.unsortedForEach(function (mapping) { - if (mapping.source === sourceFile && mapping.originalLine != null) { - // Check if it can be mapped by the source map, then update the mapping. - var original = aSourceMapConsumer.originalPositionFor({ - line: mapping.originalLine, - column: mapping.originalColumn - }); - if (original.source != null) { - // Copy mapping - mapping.source = original.source; - if (aSourceMapPath != null) { - mapping.source = util.join(aSourceMapPath, mapping.source) - } - if (sourceRoot != null) { - mapping.source = util.relative(sourceRoot, mapping.source); - } - mapping.originalLine = original.line; - mapping.originalColumn = original.column; - if (original.name != null) { - mapping.name = original.name; - } - } - } - - var source = mapping.source; - if (source != null && !newSources.has(source)) { - newSources.add(source); - } - - var name = mapping.name; - if (name != null && !newNames.has(name)) { - newNames.add(name); - } - - }, this); - this._sources = newSources; - this._names = newNames; - - // Copy sourcesContents of applied map. - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content != null) { - if (aSourceMapPath != null) { - sourceFile = util.join(aSourceMapPath, sourceFile); - } - if (sourceRoot != null) { - sourceFile = util.relative(sourceRoot, sourceFile); - } - this.setSourceContent(sourceFile, content); - } - }, this); - }; - - /** - * A mapping can have one of the three levels of data: - * - * 1. Just the generated position. - * 2. The Generated position, original position, and original source. - * 3. Generated and original position, original source, as well as a name - * token. - * - * To maintain consistency, we validate that any new mapping being added falls - * in to one of these categories. - */ - SourceMapGenerator.prototype._validateMapping = - function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, - aName) { - if (aGenerated && 'line' in aGenerated && 'column' in aGenerated - && aGenerated.line > 0 && aGenerated.column >= 0 - && !aOriginal && !aSource && !aName) { - // Case 1. - return; - } - else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated - && aOriginal && 'line' in aOriginal && 'column' in aOriginal - && aGenerated.line > 0 && aGenerated.column >= 0 - && aOriginal.line > 0 && aOriginal.column >= 0 - && aSource) { - // Cases 2 and 3. - return; - } - else { - throw new Error('Invalid mapping: ' + JSON.stringify({ - generated: aGenerated, - source: aSource, - original: aOriginal, - name: aName - })); - } - }; - - /** - * Serialize the accumulated mappings in to the stream of base 64 VLQs - * specified by the source map format. - */ - SourceMapGenerator.prototype._serializeMappings = - function SourceMapGenerator_serializeMappings() { - var previousGeneratedColumn = 0; - var previousGeneratedLine = 1; - var previousOriginalColumn = 0; - var previousOriginalLine = 0; - var previousName = 0; - var previousSource = 0; - var result = ''; - var mapping; - - var mappings = this._mappings.toArray(); - - for (var i = 0, len = mappings.length; i < len; i++) { - mapping = mappings[i]; - - if (mapping.generatedLine !== previousGeneratedLine) { - previousGeneratedColumn = 0; - while (mapping.generatedLine !== previousGeneratedLine) { - result += ';'; - previousGeneratedLine++; - } - } - else { - if (i > 0) { - if (!util.compareByGeneratedPositions(mapping, mappings[i - 1])) { - continue; - } - result += ','; - } - } - - result += base64VLQ.encode(mapping.generatedColumn - - previousGeneratedColumn); - previousGeneratedColumn = mapping.generatedColumn; - - if (mapping.source != null) { - result += base64VLQ.encode(this._sources.indexOf(mapping.source) - - previousSource); - previousSource = this._sources.indexOf(mapping.source); - - // lines are stored 0-based in SourceMap spec version 3 - result += base64VLQ.encode(mapping.originalLine - 1 - - previousOriginalLine); - previousOriginalLine = mapping.originalLine - 1; - - result += base64VLQ.encode(mapping.originalColumn - - previousOriginalColumn); - previousOriginalColumn = mapping.originalColumn; - - if (mapping.name != null) { - result += base64VLQ.encode(this._names.indexOf(mapping.name) - - previousName); - previousName = this._names.indexOf(mapping.name); - } - } - } - - return result; - }; - - SourceMapGenerator.prototype._generateSourcesContent = - function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { - return aSources.map(function (source) { - if (!this._sourcesContents) { - return null; - } - if (aSourceRoot != null) { - source = util.relative(aSourceRoot, source); - } - var key = util.toSetString(source); - return Object.prototype.hasOwnProperty.call(this._sourcesContents, - key) - ? this._sourcesContents[key] - : null; - }, this); - }; - - /** - * Externalize the source map. - */ - SourceMapGenerator.prototype.toJSON = - function SourceMapGenerator_toJSON() { - var map = { - version: this._version, - sources: this._sources.toArray(), - names: this._names.toArray(), - mappings: this._serializeMappings() - }; - if (this._file != null) { - map.file = this._file; - } - if (this._sourceRoot != null) { - map.sourceRoot = this._sourceRoot; - } - if (this._sourcesContents) { - map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); - } - - return map; - }; - - /** - * Render the source map being generated to a string. - */ - SourceMapGenerator.prototype.toString = - function SourceMapGenerator_toString() { - return JSON.stringify(this); - }; - - exports.SourceMapGenerator = SourceMapGenerator; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-node.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-node.js deleted file mode 100644 index 9ee90bd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/source-node.js +++ /dev/null @@ -1,414 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator; - var util = require('./util'); - - // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other - // operating systems these days (capturing the result). - var REGEX_NEWLINE = /(\r?\n)/; - - // Newline character code for charCodeAt() comparisons - var NEWLINE_CODE = 10; - - // Private symbol for identifying `SourceNode`s when multiple versions of - // the source-map library are loaded. This MUST NOT CHANGE across - // versions! - var isSourceNode = "$$$isSourceNode$$$"; - - /** - * SourceNodes provide a way to abstract over interpolating/concatenating - * snippets of generated JavaScript source code while maintaining the line and - * column information associated with the original source code. - * - * @param aLine The original line number. - * @param aColumn The original column number. - * @param aSource The original source's filename. - * @param aChunks Optional. An array of strings which are snippets of - * generated JS, or other SourceNodes. - * @param aName The original identifier. - */ - function SourceNode(aLine, aColumn, aSource, aChunks, aName) { - this.children = []; - this.sourceContents = {}; - this.line = aLine == null ? null : aLine; - this.column = aColumn == null ? null : aColumn; - this.source = aSource == null ? null : aSource; - this.name = aName == null ? null : aName; - this[isSourceNode] = true; - if (aChunks != null) this.add(aChunks); - } - - /** - * Creates a SourceNode from generated code and a SourceMapConsumer. - * - * @param aGeneratedCode The generated code - * @param aSourceMapConsumer The SourceMap for the generated code - * @param aRelativePath Optional. The path that relative sources in the - * SourceMapConsumer should be relative to. - */ - SourceNode.fromStringWithSourceMap = - function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { - // The SourceNode we want to fill with the generated code - // and the SourceMap - var node = new SourceNode(); - - // All even indices of this array are one line of the generated code, - // while all odd indices are the newlines between two adjacent lines - // (since `REGEX_NEWLINE` captures its match). - // Processed fragments are removed from this array, by calling `shiftNextLine`. - var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); - var shiftNextLine = function() { - var lineContents = remainingLines.shift(); - // The last line of a file might not have a newline. - var newLine = remainingLines.shift() || ""; - return lineContents + newLine; - }; - - // We need to remember the position of "remainingLines" - var lastGeneratedLine = 1, lastGeneratedColumn = 0; - - // The generate SourceNodes we need a code range. - // To extract it current and last mapping is used. - // Here we store the last mapping. - var lastMapping = null; - - aSourceMapConsumer.eachMapping(function (mapping) { - if (lastMapping !== null) { - // We add the code from "lastMapping" to "mapping": - // First check if there is a new line in between. - if (lastGeneratedLine < mapping.generatedLine) { - var code = ""; - // Associate first line with "lastMapping" - addMappingWithCode(lastMapping, shiftNextLine()); - lastGeneratedLine++; - lastGeneratedColumn = 0; - // The remaining code is added without mapping - } else { - // There is no new line in between. - // Associate the code between "lastGeneratedColumn" and - // "mapping.generatedColumn" with "lastMapping" - var nextLine = remainingLines[0]; - var code = nextLine.substr(0, mapping.generatedColumn - - lastGeneratedColumn); - remainingLines[0] = nextLine.substr(mapping.generatedColumn - - lastGeneratedColumn); - lastGeneratedColumn = mapping.generatedColumn; - addMappingWithCode(lastMapping, code); - // No more remaining code, continue - lastMapping = mapping; - return; - } - } - // We add the generated code until the first mapping - // to the SourceNode without any mapping. - // Each line is added as separate string. - while (lastGeneratedLine < mapping.generatedLine) { - node.add(shiftNextLine()); - lastGeneratedLine++; - } - if (lastGeneratedColumn < mapping.generatedColumn) { - var nextLine = remainingLines[0]; - node.add(nextLine.substr(0, mapping.generatedColumn)); - remainingLines[0] = nextLine.substr(mapping.generatedColumn); - lastGeneratedColumn = mapping.generatedColumn; - } - lastMapping = mapping; - }, this); - // We have processed all mappings. - if (remainingLines.length > 0) { - if (lastMapping) { - // Associate the remaining code in the current line with "lastMapping" - addMappingWithCode(lastMapping, shiftNextLine()); - } - // and add the remaining lines without any mapping - node.add(remainingLines.join("")); - } - - // Copy sourcesContent into SourceNode - aSourceMapConsumer.sources.forEach(function (sourceFile) { - var content = aSourceMapConsumer.sourceContentFor(sourceFile); - if (content != null) { - if (aRelativePath != null) { - sourceFile = util.join(aRelativePath, sourceFile); - } - node.setSourceContent(sourceFile, content); - } - }); - - return node; - - function addMappingWithCode(mapping, code) { - if (mapping === null || mapping.source === undefined) { - node.add(code); - } else { - var source = aRelativePath - ? util.join(aRelativePath, mapping.source) - : mapping.source; - node.add(new SourceNode(mapping.originalLine, - mapping.originalColumn, - source, - code, - mapping.name)); - } - } - }; - - /** - * Add a chunk of generated JS to this source node. - * - * @param aChunk A string snippet of generated JS code, another instance of - * SourceNode, or an array where each member is one of those things. - */ - SourceNode.prototype.add = function SourceNode_add(aChunk) { - if (Array.isArray(aChunk)) { - aChunk.forEach(function (chunk) { - this.add(chunk); - }, this); - } - else if (aChunk[isSourceNode] || typeof aChunk === "string") { - if (aChunk) { - this.children.push(aChunk); - } - } - else { - throw new TypeError( - "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk - ); - } - return this; - }; - - /** - * Add a chunk of generated JS to the beginning of this source node. - * - * @param aChunk A string snippet of generated JS code, another instance of - * SourceNode, or an array where each member is one of those things. - */ - SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) { - if (Array.isArray(aChunk)) { - for (var i = aChunk.length-1; i >= 0; i--) { - this.prepend(aChunk[i]); - } - } - else if (aChunk[isSourceNode] || typeof aChunk === "string") { - this.children.unshift(aChunk); - } - else { - throw new TypeError( - "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk - ); - } - return this; - }; - - /** - * Walk over the tree of JS snippets in this node and its children. The - * walking function is called once for each snippet of JS and is passed that - * snippet and the its original associated source's line/column location. - * - * @param aFn The traversal function. - */ - SourceNode.prototype.walk = function SourceNode_walk(aFn) { - var chunk; - for (var i = 0, len = this.children.length; i < len; i++) { - chunk = this.children[i]; - if (chunk[isSourceNode]) { - chunk.walk(aFn); - } - else { - if (chunk !== '') { - aFn(chunk, { source: this.source, - line: this.line, - column: this.column, - name: this.name }); - } - } - } - }; - - /** - * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between - * each of `this.children`. - * - * @param aSep The separator. - */ - SourceNode.prototype.join = function SourceNode_join(aSep) { - var newChildren; - var i; - var len = this.children.length; - if (len > 0) { - newChildren = []; - for (i = 0; i < len-1; i++) { - newChildren.push(this.children[i]); - newChildren.push(aSep); - } - newChildren.push(this.children[i]); - this.children = newChildren; - } - return this; - }; - - /** - * Call String.prototype.replace on the very right-most source snippet. Useful - * for trimming whitespace from the end of a source node, etc. - * - * @param aPattern The pattern to replace. - * @param aReplacement The thing to replace the pattern with. - */ - SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { - var lastChild = this.children[this.children.length - 1]; - if (lastChild[isSourceNode]) { - lastChild.replaceRight(aPattern, aReplacement); - } - else if (typeof lastChild === 'string') { - this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); - } - else { - this.children.push(''.replace(aPattern, aReplacement)); - } - return this; - }; - - /** - * Set the source content for a source file. This will be added to the SourceMapGenerator - * in the sourcesContent field. - * - * @param aSourceFile The filename of the source file - * @param aSourceContent The content of the source file - */ - SourceNode.prototype.setSourceContent = - function SourceNode_setSourceContent(aSourceFile, aSourceContent) { - this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; - }; - - /** - * Walk over the tree of SourceNodes. The walking function is called for each - * source file content and is passed the filename and source content. - * - * @param aFn The traversal function. - */ - SourceNode.prototype.walkSourceContents = - function SourceNode_walkSourceContents(aFn) { - for (var i = 0, len = this.children.length; i < len; i++) { - if (this.children[i][isSourceNode]) { - this.children[i].walkSourceContents(aFn); - } - } - - var sources = Object.keys(this.sourceContents); - for (var i = 0, len = sources.length; i < len; i++) { - aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); - } - }; - - /** - * Return the string representation of this source node. Walks over the tree - * and concatenates all the various snippets together to one string. - */ - SourceNode.prototype.toString = function SourceNode_toString() { - var str = ""; - this.walk(function (chunk) { - str += chunk; - }); - return str; - }; - - /** - * Returns the string representation of this source node along with a source - * map. - */ - SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { - var generated = { - code: "", - line: 1, - column: 0 - }; - var map = new SourceMapGenerator(aArgs); - var sourceMappingActive = false; - var lastOriginalSource = null; - var lastOriginalLine = null; - var lastOriginalColumn = null; - var lastOriginalName = null; - this.walk(function (chunk, original) { - generated.code += chunk; - if (original.source !== null - && original.line !== null - && original.column !== null) { - if(lastOriginalSource !== original.source - || lastOriginalLine !== original.line - || lastOriginalColumn !== original.column - || lastOriginalName !== original.name) { - map.addMapping({ - source: original.source, - original: { - line: original.line, - column: original.column - }, - generated: { - line: generated.line, - column: generated.column - }, - name: original.name - }); - } - lastOriginalSource = original.source; - lastOriginalLine = original.line; - lastOriginalColumn = original.column; - lastOriginalName = original.name; - sourceMappingActive = true; - } else if (sourceMappingActive) { - map.addMapping({ - generated: { - line: generated.line, - column: generated.column - } - }); - lastOriginalSource = null; - sourceMappingActive = false; - } - for (var idx = 0, length = chunk.length; idx < length; idx++) { - if (chunk.charCodeAt(idx) === NEWLINE_CODE) { - generated.line++; - generated.column = 0; - // Mappings end at eol - if (idx + 1 === length) { - lastOriginalSource = null; - sourceMappingActive = false; - } else if (sourceMappingActive) { - map.addMapping({ - source: original.source, - original: { - line: original.line, - column: original.column - }, - generated: { - line: generated.line, - column: generated.column - }, - name: original.name - }); - } - } else { - generated.column++; - } - } - }); - this.walkSourceContents(function (sourceFile, sourceContent) { - map.setSourceContent(sourceFile, sourceContent); - }); - - return { code: generated.code, map: map }; - }; - - exports.SourceNode = SourceNode; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/util.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/util.js deleted file mode 100644 index 976f6ca..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/lib/source-map/util.js +++ /dev/null @@ -1,319 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - /** - * This is a helper function for getting values from parameter/options - * objects. - * - * @param args The object we are extracting values from - * @param name The name of the property we are getting. - * @param defaultValue An optional value to return if the property is missing - * from the object. If this is not specified and the property is missing, an - * error will be thrown. - */ - function getArg(aArgs, aName, aDefaultValue) { - if (aName in aArgs) { - return aArgs[aName]; - } else if (arguments.length === 3) { - return aDefaultValue; - } else { - throw new Error('"' + aName + '" is a required argument.'); - } - } - exports.getArg = getArg; - - var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/; - var dataUrlRegexp = /^data:.+\,.+$/; - - function urlParse(aUrl) { - var match = aUrl.match(urlRegexp); - if (!match) { - return null; - } - return { - scheme: match[1], - auth: match[2], - host: match[3], - port: match[4], - path: match[5] - }; - } - exports.urlParse = urlParse; - - function urlGenerate(aParsedUrl) { - var url = ''; - if (aParsedUrl.scheme) { - url += aParsedUrl.scheme + ':'; - } - url += '//'; - if (aParsedUrl.auth) { - url += aParsedUrl.auth + '@'; - } - if (aParsedUrl.host) { - url += aParsedUrl.host; - } - if (aParsedUrl.port) { - url += ":" + aParsedUrl.port - } - if (aParsedUrl.path) { - url += aParsedUrl.path; - } - return url; - } - exports.urlGenerate = urlGenerate; - - /** - * Normalizes a path, or the path portion of a URL: - * - * - Replaces consequtive slashes with one slash. - * - Removes unnecessary '.' parts. - * - Removes unnecessary '/..' parts. - * - * Based on code in the Node.js 'path' core module. - * - * @param aPath The path or url to normalize. - */ - function normalize(aPath) { - var path = aPath; - var url = urlParse(aPath); - if (url) { - if (!url.path) { - return aPath; - } - path = url.path; - } - var isAbsolute = (path.charAt(0) === '/'); - - var parts = path.split(/\/+/); - for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { - part = parts[i]; - if (part === '.') { - parts.splice(i, 1); - } else if (part === '..') { - up++; - } else if (up > 0) { - if (part === '') { - // The first part is blank if the path is absolute. Trying to go - // above the root is a no-op. Therefore we can remove all '..' parts - // directly after the root. - parts.splice(i + 1, up); - up = 0; - } else { - parts.splice(i, 2); - up--; - } - } - } - path = parts.join('/'); - - if (path === '') { - path = isAbsolute ? '/' : '.'; - } - - if (url) { - url.path = path; - return urlGenerate(url); - } - return path; - } - exports.normalize = normalize; - - /** - * Joins two paths/URLs. - * - * @param aRoot The root path or URL. - * @param aPath The path or URL to be joined with the root. - * - * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a - * scheme-relative URL: Then the scheme of aRoot, if any, is prepended - * first. - * - Otherwise aPath is a path. If aRoot is a URL, then its path portion - * is updated with the result and aRoot is returned. Otherwise the result - * is returned. - * - If aPath is absolute, the result is aPath. - * - Otherwise the two paths are joined with a slash. - * - Joining for example 'http://' and 'www.example.com' is also supported. - */ - function join(aRoot, aPath) { - if (aRoot === "") { - aRoot = "."; - } - if (aPath === "") { - aPath = "."; - } - var aPathUrl = urlParse(aPath); - var aRootUrl = urlParse(aRoot); - if (aRootUrl) { - aRoot = aRootUrl.path || '/'; - } - - // `join(foo, '//www.example.org')` - if (aPathUrl && !aPathUrl.scheme) { - if (aRootUrl) { - aPathUrl.scheme = aRootUrl.scheme; - } - return urlGenerate(aPathUrl); - } - - if (aPathUrl || aPath.match(dataUrlRegexp)) { - return aPath; - } - - // `join('http://', 'www.example.com')` - if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { - aRootUrl.host = aPath; - return urlGenerate(aRootUrl); - } - - var joined = aPath.charAt(0) === '/' - ? aPath - : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); - - if (aRootUrl) { - aRootUrl.path = joined; - return urlGenerate(aRootUrl); - } - return joined; - } - exports.join = join; - - /** - * Make a path relative to a URL or another path. - * - * @param aRoot The root path or URL. - * @param aPath The path or URL to be made relative to aRoot. - */ - function relative(aRoot, aPath) { - if (aRoot === "") { - aRoot = "."; - } - - aRoot = aRoot.replace(/\/$/, ''); - - // XXX: It is possible to remove this block, and the tests still pass! - var url = urlParse(aRoot); - if (aPath.charAt(0) == "/" && url && url.path == "/") { - return aPath.slice(1); - } - - return aPath.indexOf(aRoot + '/') === 0 - ? aPath.substr(aRoot.length + 1) - : aPath; - } - exports.relative = relative; - - /** - * Because behavior goes wacky when you set `__proto__` on objects, we - * have to prefix all the strings in our set with an arbitrary character. - * - * See https://github.com/mozilla/source-map/pull/31 and - * https://github.com/mozilla/source-map/issues/30 - * - * @param String aStr - */ - function toSetString(aStr) { - return '$' + aStr; - } - exports.toSetString = toSetString; - - function fromSetString(aStr) { - return aStr.substr(1); - } - exports.fromSetString = fromSetString; - - function strcmp(aStr1, aStr2) { - var s1 = aStr1 || ""; - var s2 = aStr2 || ""; - return (s1 > s2) - (s1 < s2); - } - - /** - * Comparator between two mappings where the original positions are compared. - * - * Optionally pass in `true` as `onlyCompareGenerated` to consider two - * mappings with the same original source/line/column, but different generated - * line and column the same. Useful when searching for a mapping with a - * stubbed out mapping. - */ - function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { - var cmp; - - cmp = strcmp(mappingA.source, mappingB.source); - if (cmp) { - return cmp; - } - - cmp = mappingA.originalLine - mappingB.originalLine; - if (cmp) { - return cmp; - } - - cmp = mappingA.originalColumn - mappingB.originalColumn; - if (cmp || onlyCompareOriginal) { - return cmp; - } - - cmp = strcmp(mappingA.name, mappingB.name); - if (cmp) { - return cmp; - } - - cmp = mappingA.generatedLine - mappingB.generatedLine; - if (cmp) { - return cmp; - } - - return mappingA.generatedColumn - mappingB.generatedColumn; - }; - exports.compareByOriginalPositions = compareByOriginalPositions; - - /** - * Comparator between two mappings where the generated positions are - * compared. - * - * Optionally pass in `true` as `onlyCompareGenerated` to consider two - * mappings with the same generated line and column, but different - * source/name/original line and column the same. Useful when searching for a - * mapping with a stubbed out mapping. - */ - function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) { - var cmp; - - cmp = mappingA.generatedLine - mappingB.generatedLine; - if (cmp) { - return cmp; - } - - cmp = mappingA.generatedColumn - mappingB.generatedColumn; - if (cmp || onlyCompareGenerated) { - return cmp; - } - - cmp = strcmp(mappingA.source, mappingB.source); - if (cmp) { - return cmp; - } - - cmp = mappingA.originalLine - mappingB.originalLine; - if (cmp) { - return cmp; - } - - cmp = mappingA.originalColumn - mappingB.originalColumn; - if (cmp) { - return cmp; - } - - return strcmp(mappingA.name, mappingB.name); - }; - exports.compareByGeneratedPositions = compareByGeneratedPositions; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/LICENSE deleted file mode 100644 index af46c6d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/LICENSE +++ /dev/null @@ -1,58 +0,0 @@ -amdefine is released under two licenses: new BSD, and MIT. You may pick the -license that best suits your development needs. The text of both licenses are -provided below. - - -The "New" BSD License: ----------------------- - -Copyright (c) 2011-2015, The Dojo Foundation -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the Dojo Foundation nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - -MIT License ------------ - -Copyright (c) 2011-2015, The Dojo Foundation - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/README.md deleted file mode 100644 index 037a6e8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/README.md +++ /dev/null @@ -1,171 +0,0 @@ -# amdefine - -A module that can be used to implement AMD's define() in Node. This allows you -to code to the AMD API and have the module work in node programs without -requiring those other programs to use AMD. - -## Usage - -**1)** Update your package.json to indicate amdefine as a dependency: - -```javascript - "dependencies": { - "amdefine": ">=0.1.0" - } -``` - -Then run `npm install` to get amdefine into your project. - -**2)** At the top of each module that uses define(), place this code: - -```javascript -if (typeof define !== 'function') { var define = require('amdefine')(module) } -``` - -**Only use these snippets** when loading amdefine. If you preserve the basic structure, -with the braces, it will be stripped out when using the [RequireJS optimizer](#optimizer). - -You can add spaces, line breaks and even require amdefine with a local path, but -keep the rest of the structure to get the stripping behavior. - -As you may know, because `if` statements in JavaScript don't have their own scope, the var -declaration in the above snippet is made whether the `if` expression is truthy or not. If -RequireJS is loaded then the declaration is superfluous because `define` is already already -declared in the same scope in RequireJS. Fortunately JavaScript handles multiple `var` -declarations of the same variable in the same scope gracefully. - -If you want to deliver amdefine.js with your code rather than specifying it as a dependency -with npm, then just download the latest release and refer to it using a relative path: - -[Latest Version](https://github.com/jrburke/amdefine/raw/latest/amdefine.js) - -### amdefine/intercept - -Consider this very experimental. - -Instead of pasting the piece of text for the amdefine setup of a `define` -variable in each module you create or consume, you can use `amdefine/intercept` -instead. It will automatically insert the above snippet in each .js file loaded -by Node. - -**Warning**: you should only use this if you are creating an application that -is consuming AMD style defined()'d modules that are distributed via npm and want -to run that code in Node. - -For library code where you are not sure if it will be used by others in Node or -in the browser, then explicitly depending on amdefine and placing the code -snippet above is suggested path, instead of using `amdefine/intercept`. The -intercept module affects all .js files loaded in the Node app, and it is -inconsiderate to modify global state like that unless you are also controlling -the top level app. - -#### Why distribute AMD-style modules via npm? - -npm has a lot of weaknesses for front-end use (installed layout is not great, -should have better support for the `baseUrl + moduleID + '.js' style of loading, -single file JS installs), but some people want a JS package manager and are -willing to live with those constraints. If that is you, but still want to author -in AMD style modules to get dynamic require([]), better direct source usage and -powerful loader plugin support in the browser, then this tool can help. - -#### amdefine/intercept usage - -Just require it in your top level app module (for example index.js, server.js): - -```javascript -require('amdefine/intercept'); -``` - -The module does not return a value, so no need to assign the result to a local -variable. - -Then just require() code as you normally would with Node's require(). Any .js -loaded after the intercept require will have the amdefine check injected in -the .js source as it is loaded. It does not modify the source on disk, just -prepends some content to the text of the module as it is loaded by Node. - -#### How amdefine/intercept works - -It overrides the `Module._extensions['.js']` in Node to automatically prepend -the amdefine snippet above. So, it will affect any .js file loaded by your -app. - -## define() usage - -It is best if you use the anonymous forms of define() in your module: - -```javascript -define(function (require) { - var dependency = require('dependency'); -}); -``` - -or - -```javascript -define(['dependency'], function (dependency) { - -}); -``` - -## RequireJS optimizer integration. - -Version 1.0.3 of the [RequireJS optimizer](http://requirejs.org/docs/optimization.html) -will have support for stripping the `if (typeof define !== 'function')` check -mentioned above, so you can include this snippet for code that runs in the -browser, but avoid taking the cost of the if() statement once the code is -optimized for deployment. - -## Node 0.4 Support - -If you want to support Node 0.4, then add `require` as the second parameter to amdefine: - -```javascript -//Only if you want Node 0.4. If using 0.5 or later, use the above snippet. -if (typeof define !== 'function') { var define = require('amdefine')(module, require) } -``` - -## Limitations - -### Synchronous vs Asynchronous - -amdefine creates a define() function that is callable by your code. It will -execute and trace dependencies and call the factory function *synchronously*, -to keep the behavior in line with Node's synchronous dependency tracing. - -The exception: calling AMD's callback-style require() from inside a factory -function. The require callback is called on process.nextTick(): - -```javascript -define(function (require) { - require(['a'], function(a) { - //'a' is loaded synchronously, but - //this callback is called on process.nextTick(). - }); -}); -``` - -### Loader Plugins - -Loader plugins are supported as long as they call their load() callbacks -synchronously. So ones that do network requests will not work. However plugins -like [text](http://requirejs.org/docs/api.html#text) can load text files locally. - -The plugin API's `load.fromText()` is **not supported** in amdefine, so this means -transpiler plugins like the [CoffeeScript loader plugin](https://github.com/jrburke/require-cs) -will not work. This may be fixable, but it is a bit complex, and I do not have -enough node-fu to figure it out yet. See the source for amdefine.js if you want -to get an idea of the issues involved. - -## Tests - -To run the tests, cd to **tests** and run: - -``` -node all.js -node all-intercept.js -``` - -## License - -New BSD and MIT. Check the LICENSE file for all the details. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/amdefine.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/amdefine.js deleted file mode 100644 index 0c4a954..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/amdefine.js +++ /dev/null @@ -1,301 +0,0 @@ -/** vim: et:ts=4:sw=4:sts=4 - * @license amdefine 1.0.0 Copyright (c) 2011-2015, The Dojo Foundation All Rights Reserved. - * Available via the MIT or new BSD license. - * see: http://github.com/jrburke/amdefine for details - */ - -/*jslint node: true */ -/*global module, process */ -'use strict'; - -/** - * Creates a define for node. - * @param {Object} module the "module" object that is defined by Node for the - * current module. - * @param {Function} [requireFn]. Node's require function for the current module. - * It only needs to be passed in Node versions before 0.5, when module.require - * did not exist. - * @returns {Function} a define function that is usable for the current node - * module. - */ -function amdefine(module, requireFn) { - 'use strict'; - var defineCache = {}, - loaderCache = {}, - alreadyCalled = false, - path = require('path'), - makeRequire, stringRequire; - - /** - * Trims the . and .. from an array of path segments. - * It will keep a leading path segment if a .. will become - * the first path segment, to help with module name lookups, - * which act like paths, but can be remapped. But the end result, - * all paths that use this function should look normalized. - * NOTE: this method MODIFIES the input array. - * @param {Array} ary the array of path segments. - */ - function trimDots(ary) { - var i, part; - for (i = 0; ary[i]; i+= 1) { - part = ary[i]; - if (part === '.') { - ary.splice(i, 1); - i -= 1; - } else if (part === '..') { - if (i === 1 && (ary[2] === '..' || ary[0] === '..')) { - //End of the line. Keep at least one non-dot - //path segment at the front so it can be mapped - //correctly to disk. Otherwise, there is likely - //no path mapping for a path starting with '..'. - //This can still fail, but catches the most reasonable - //uses of .. - break; - } else if (i > 0) { - ary.splice(i - 1, 2); - i -= 2; - } - } - } - } - - function normalize(name, baseName) { - var baseParts; - - //Adjust any relative paths. - if (name && name.charAt(0) === '.') { - //If have a base name, try to normalize against it, - //otherwise, assume it is a top-level require that will - //be relative to baseUrl in the end. - if (baseName) { - baseParts = baseName.split('/'); - baseParts = baseParts.slice(0, baseParts.length - 1); - baseParts = baseParts.concat(name.split('/')); - trimDots(baseParts); - name = baseParts.join('/'); - } - } - - return name; - } - - /** - * Create the normalize() function passed to a loader plugin's - * normalize method. - */ - function makeNormalize(relName) { - return function (name) { - return normalize(name, relName); - }; - } - - function makeLoad(id) { - function load(value) { - loaderCache[id] = value; - } - - load.fromText = function (id, text) { - //This one is difficult because the text can/probably uses - //define, and any relative paths and requires should be relative - //to that id was it would be found on disk. But this would require - //bootstrapping a module/require fairly deeply from node core. - //Not sure how best to go about that yet. - throw new Error('amdefine does not implement load.fromText'); - }; - - return load; - } - - makeRequire = function (systemRequire, exports, module, relId) { - function amdRequire(deps, callback) { - if (typeof deps === 'string') { - //Synchronous, single module require('') - return stringRequire(systemRequire, exports, module, deps, relId); - } else { - //Array of dependencies with a callback. - - //Convert the dependencies to modules. - deps = deps.map(function (depName) { - return stringRequire(systemRequire, exports, module, depName, relId); - }); - - //Wait for next tick to call back the require call. - if (callback) { - process.nextTick(function () { - callback.apply(null, deps); - }); - } - } - } - - amdRequire.toUrl = function (filePath) { - if (filePath.indexOf('.') === 0) { - return normalize(filePath, path.dirname(module.filename)); - } else { - return filePath; - } - }; - - return amdRequire; - }; - - //Favor explicit value, passed in if the module wants to support Node 0.4. - requireFn = requireFn || function req() { - return module.require.apply(module, arguments); - }; - - function runFactory(id, deps, factory) { - var r, e, m, result; - - if (id) { - e = loaderCache[id] = {}; - m = { - id: id, - uri: __filename, - exports: e - }; - r = makeRequire(requireFn, e, m, id); - } else { - //Only support one define call per file - if (alreadyCalled) { - throw new Error('amdefine with no module ID cannot be called more than once per file.'); - } - alreadyCalled = true; - - //Use the real variables from node - //Use module.exports for exports, since - //the exports in here is amdefine exports. - e = module.exports; - m = module; - r = makeRequire(requireFn, e, m, module.id); - } - - //If there are dependencies, they are strings, so need - //to convert them to dependency values. - if (deps) { - deps = deps.map(function (depName) { - return r(depName); - }); - } - - //Call the factory with the right dependencies. - if (typeof factory === 'function') { - result = factory.apply(m.exports, deps); - } else { - result = factory; - } - - if (result !== undefined) { - m.exports = result; - if (id) { - loaderCache[id] = m.exports; - } - } - } - - stringRequire = function (systemRequire, exports, module, id, relId) { - //Split the ID by a ! so that - var index = id.indexOf('!'), - originalId = id, - prefix, plugin; - - if (index === -1) { - id = normalize(id, relId); - - //Straight module lookup. If it is one of the special dependencies, - //deal with it, otherwise, delegate to node. - if (id === 'require') { - return makeRequire(systemRequire, exports, module, relId); - } else if (id === 'exports') { - return exports; - } else if (id === 'module') { - return module; - } else if (loaderCache.hasOwnProperty(id)) { - return loaderCache[id]; - } else if (defineCache[id]) { - runFactory.apply(null, defineCache[id]); - return loaderCache[id]; - } else { - if(systemRequire) { - return systemRequire(originalId); - } else { - throw new Error('No module with ID: ' + id); - } - } - } else { - //There is a plugin in play. - prefix = id.substring(0, index); - id = id.substring(index + 1, id.length); - - plugin = stringRequire(systemRequire, exports, module, prefix, relId); - - if (plugin.normalize) { - id = plugin.normalize(id, makeNormalize(relId)); - } else { - //Normalize the ID normally. - id = normalize(id, relId); - } - - if (loaderCache[id]) { - return loaderCache[id]; - } else { - plugin.load(id, makeRequire(systemRequire, exports, module, relId), makeLoad(id), {}); - - return loaderCache[id]; - } - } - }; - - //Create a define function specific to the module asking for amdefine. - function define(id, deps, factory) { - if (Array.isArray(id)) { - factory = deps; - deps = id; - id = undefined; - } else if (typeof id !== 'string') { - factory = id; - id = deps = undefined; - } - - if (deps && !Array.isArray(deps)) { - factory = deps; - deps = undefined; - } - - if (!deps) { - deps = ['require', 'exports', 'module']; - } - - //Set up properties for this module. If an ID, then use - //internal cache. If no ID, then use the external variables - //for this node module. - if (id) { - //Put the module in deep freeze until there is a - //require call for it. - defineCache[id] = [id, deps, factory]; - } else { - runFactory(id, deps, factory); - } - } - - //define.require, which has access to all the values in the - //cache. Useful for AMD modules that all have IDs in the file, - //but need to finally export a value to node based on one of those - //IDs. - define.require = function (id) { - if (loaderCache[id]) { - return loaderCache[id]; - } - - if (defineCache[id]) { - runFactory.apply(null, defineCache[id]); - return loaderCache[id]; - } - }; - - define.amd = {}; - - return define; -} - -module.exports = amdefine; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/intercept.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/intercept.js deleted file mode 100644 index 771a983..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/intercept.js +++ /dev/null @@ -1,36 +0,0 @@ -/*jshint node: true */ -var inserted, - Module = require('module'), - fs = require('fs'), - existingExtFn = Module._extensions['.js'], - amdefineRegExp = /amdefine\.js/; - -inserted = "if (typeof define !== 'function') {var define = require('amdefine')(module)}"; - -//From the node/lib/module.js source: -function stripBOM(content) { - // Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) - // because the buffer-to-string conversion in `fs.readFileSync()` - // translates it to FEFF, the UTF-16 BOM. - if (content.charCodeAt(0) === 0xFEFF) { - content = content.slice(1); - } - return content; -} - -//Also adapted from the node/lib/module.js source: -function intercept(module, filename) { - var content = stripBOM(fs.readFileSync(filename, 'utf8')); - - if (!amdefineRegExp.test(module.id)) { - content = inserted + content; - } - - module._compile(content, filename); -} - -intercept._id = 'amdefine/intercept'; - -if (!existingExtFn._id || existingExtFn._id !== intercept._id) { - Module._extensions['.js'] = intercept; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/package.json deleted file mode 100644 index 897ee44..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/node_modules/amdefine/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "amdefine", - "description": "Provide AMD's define() API for declaring modules in the AMD format", - "version": "1.0.0", - "homepage": "http://github.com/jrburke/amdefine", - "author": { - "name": "James Burke", - "email": "jrburke@gmail.com", - "url": "http://github.com/jrburke" - }, - "license": "BSD-3-Clause AND MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/jrburke/amdefine.git" - }, - "main": "./amdefine.js", - "engines": { - "node": ">=0.4.2" - }, - "gitHead": "578bc4a3f7dede33f3f3e10edde0c1607005d761", - "bugs": { - "url": "https://github.com/jrburke/amdefine/issues" - }, - "_id": "amdefine@1.0.0", - "scripts": {}, - "_shasum": "fd17474700cb5cc9c2b709f0be9d23ce3c198c33", - "_from": "amdefine@>=0.0.4", - "_npmVersion": "2.12.1", - "_nodeVersion": "0.10.36", - "_npmUser": { - "name": "jrburke", - "email": "jrburke@gmail.com" - }, - "maintainers": [ - { - "name": "jrburke", - "email": "jrburke@gmail.com" - } - ], - "dist": { - "shasum": "fd17474700cb5cc9c2b709f0be9d23ce3c198c33", - "tarball": "http://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/package.json deleted file mode 100644 index d1bfb73..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/package.json +++ /dev/null @@ -1,186 +0,0 @@ -{ - "name": "source-map", - "description": "Generates and consumes source maps", - "version": "0.1.43", - "homepage": "https://github.com/mozilla/source-map", - "author": { - "name": "Nick Fitzgerald", - "email": "nfitzgerald@mozilla.com" - }, - "contributors": [ - { - "name": "Tobias Koppers", - "email": "tobias.koppers@googlemail.com" - }, - { - "name": "Duncan Beevers", - "email": "duncan@dweebd.com" - }, - { - "name": "Stephen Crane", - "email": "scrane@mozilla.com" - }, - { - "name": "Ryan Seddon", - "email": "seddon.ryan@gmail.com" - }, - { - "name": "Miles Elam", - "email": "miles.elam@deem.com" - }, - { - "name": "Mihai Bazon", - "email": "mihai.bazon@gmail.com" - }, - { - "name": "Michael Ficarra", - "email": "github.public.email@michael.ficarra.me" - }, - { - "name": "Todd Wolfson", - "email": "todd@twolfson.com" - }, - { - "name": "Alexander Solovyov", - "email": "alexander@solovyov.net" - }, - { - "name": "Felix Gnass", - "email": "fgnass@gmail.com" - }, - { - "name": "Conrad Irwin", - "email": "conrad.irwin@gmail.com" - }, - { - "name": "usrbincc", - "email": "usrbincc@yahoo.com" - }, - { - "name": "David Glasser", - "email": "glasser@davidglasser.net" - }, - { - "name": "Chase Douglas", - "email": "chase@newrelic.com" - }, - { - "name": "Evan Wallace", - "email": "evan.exe@gmail.com" - }, - { - "name": "Heather Arthur", - "email": "fayearthur@gmail.com" - }, - { - "name": "Hugh Kennedy", - "email": "hughskennedy@gmail.com" - }, - { - "name": "David Glasser", - "email": "glasser@davidglasser.net" - }, - { - "name": "Simon Lydell", - "email": "simon.lydell@gmail.com" - }, - { - "name": "Jmeas Smith", - "email": "jellyes2@gmail.com" - }, - { - "name": "Michael Z Goddard", - "email": "mzgoddard@gmail.com" - }, - { - "name": "azu", - "email": "azu@users.noreply.github.com" - }, - { - "name": "John Gozde", - "email": "john@gozde.ca" - }, - { - "name": "Adam Kirkton", - "email": "akirkton@truefitinnovation.com" - }, - { - "name": "Chris Montgomery", - "email": "christopher.montgomery@dowjones.com" - }, - { - "name": "J. Ryan Stinnett", - "email": "jryans@gmail.com" - }, - { - "name": "Jack Herrington", - "email": "jherrington@walmartlabs.com" - }, - { - "name": "Chris Truter", - "email": "jeffpalentine@gmail.com" - }, - { - "name": "Daniel Espeset", - "email": "daniel@danielespeset.com" - } - ], - "repository": { - "type": "git", - "url": "http://github.com/mozilla/source-map.git" - }, - "directories": { - "lib": "./lib" - }, - "main": "./lib/source-map.js", - "engines": { - "node": ">=0.8.0" - }, - "licenses": [ - { - "type": "BSD", - "url": "http://opensource.org/licenses/BSD-3-Clause" - } - ], - "dependencies": { - "amdefine": ">=0.0.4" - }, - "devDependencies": { - "dryice": ">=0.4.8" - }, - "scripts": { - "test": "node test/run-tests.js", - "build": "node Makefile.dryice.js" - }, - "bugs": { - "url": "https://github.com/mozilla/source-map/issues" - }, - "_id": "source-map@0.1.43", - "_shasum": "c24bc146ca517c1471f5dacbe2571b2b7f9e3346", - "_from": "source-map@>=0.1.40 <0.2.0", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "nickfitzgerald", - "email": "fitzgen@gmail.com" - }, - "maintainers": [ - { - "name": "mozilla-devtools", - "email": "mozilla-developer-tools@googlegroups.com" - }, - { - "name": "mozilla", - "email": "dherman@mozilla.com" - }, - { - "name": "nickfitzgerald", - "email": "fitzgen@gmail.com" - } - ], - "dist": { - "shasum": "c24bc146ca517c1471f5dacbe2571b2b7f9e3346", - "tarball": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz" - }, - "_resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/run-tests.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/run-tests.js deleted file mode 100755 index 64a7c3a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/run-tests.js +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env node -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -var assert = require('assert'); -var fs = require('fs'); -var path = require('path'); -var util = require('./source-map/util'); - -function run(tests) { - var total = 0; - var passed = 0; - - for (var i = 0; i < tests.length; i++) { - for (var k in tests[i].testCase) { - if (/^test/.test(k)) { - total++; - try { - tests[i].testCase[k](assert, util); - passed++; - } - catch (e) { - console.log('FAILED ' + tests[i].name + ': ' + k + '!'); - console.log(e.stack); - } - } - } - } - - console.log(''); - console.log(passed + ' / ' + total + ' tests passed.'); - console.log(''); - - return total - passed; -} - -function isTestFile(f) { - var testToRun = process.argv[2]; - return testToRun - ? path.basename(testToRun) === f - : /^test\-.*?\.js/.test(f); -} - -function toModule(f) { - return './source-map/' + f.replace(/\.js$/, ''); -} - -var requires = fs.readdirSync(path.join(__dirname, 'source-map')) - .filter(isTestFile) - .map(toModule); - -var code = run(requires.map(require).map(function (mod, i) { - return { - name: requires[i], - testCase: mod - }; -})); - -process.exit(code); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-api.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-api.js deleted file mode 100644 index 3801233..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-api.js +++ /dev/null @@ -1,26 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2012 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var sourceMap; - try { - sourceMap = require('../../lib/source-map'); - } catch (e) { - sourceMap = {}; - Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap); - } - - exports['test that the api is properly exposed in the top level'] = function (assert, util) { - assert.equal(typeof sourceMap.SourceMapGenerator, "function"); - assert.equal(typeof sourceMap.SourceMapConsumer, "function"); - assert.equal(typeof sourceMap.SourceNode, "function"); - }; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-array-set.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-array-set.js deleted file mode 100644 index b5797ed..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-array-set.js +++ /dev/null @@ -1,104 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var ArraySet = require('../../lib/source-map/array-set').ArraySet; - - function makeTestSet() { - var set = new ArraySet(); - for (var i = 0; i < 100; i++) { - set.add(String(i)); - } - return set; - } - - exports['test .has() membership'] = function (assert, util) { - var set = makeTestSet(); - for (var i = 0; i < 100; i++) { - assert.ok(set.has(String(i))); - } - }; - - exports['test .indexOf() elements'] = function (assert, util) { - var set = makeTestSet(); - for (var i = 0; i < 100; i++) { - assert.strictEqual(set.indexOf(String(i)), i); - } - }; - - exports['test .at() indexing'] = function (assert, util) { - var set = makeTestSet(); - for (var i = 0; i < 100; i++) { - assert.strictEqual(set.at(i), String(i)); - } - }; - - exports['test creating from an array'] = function (assert, util) { - var set = ArraySet.fromArray(['foo', 'bar', 'baz', 'quux', 'hasOwnProperty']); - - assert.ok(set.has('foo')); - assert.ok(set.has('bar')); - assert.ok(set.has('baz')); - assert.ok(set.has('quux')); - assert.ok(set.has('hasOwnProperty')); - - assert.strictEqual(set.indexOf('foo'), 0); - assert.strictEqual(set.indexOf('bar'), 1); - assert.strictEqual(set.indexOf('baz'), 2); - assert.strictEqual(set.indexOf('quux'), 3); - - assert.strictEqual(set.at(0), 'foo'); - assert.strictEqual(set.at(1), 'bar'); - assert.strictEqual(set.at(2), 'baz'); - assert.strictEqual(set.at(3), 'quux'); - }; - - exports['test that you can add __proto__; see github issue #30'] = function (assert, util) { - var set = new ArraySet(); - set.add('__proto__'); - assert.ok(set.has('__proto__')); - assert.strictEqual(set.at(0), '__proto__'); - assert.strictEqual(set.indexOf('__proto__'), 0); - }; - - exports['test .fromArray() with duplicates'] = function (assert, util) { - var set = ArraySet.fromArray(['foo', 'foo']); - assert.ok(set.has('foo')); - assert.strictEqual(set.at(0), 'foo'); - assert.strictEqual(set.indexOf('foo'), 0); - assert.strictEqual(set.toArray().length, 1); - - set = ArraySet.fromArray(['foo', 'foo'], true); - assert.ok(set.has('foo')); - assert.strictEqual(set.at(0), 'foo'); - assert.strictEqual(set.at(1), 'foo'); - assert.strictEqual(set.indexOf('foo'), 0); - assert.strictEqual(set.toArray().length, 2); - }; - - exports['test .add() with duplicates'] = function (assert, util) { - var set = new ArraySet(); - set.add('foo'); - - set.add('foo'); - assert.ok(set.has('foo')); - assert.strictEqual(set.at(0), 'foo'); - assert.strictEqual(set.indexOf('foo'), 0); - assert.strictEqual(set.toArray().length, 1); - - set.add('foo', true); - assert.ok(set.has('foo')); - assert.strictEqual(set.at(0), 'foo'); - assert.strictEqual(set.at(1), 'foo'); - assert.strictEqual(set.indexOf('foo'), 0); - assert.strictEqual(set.toArray().length, 2); - }; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64-vlq.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64-vlq.js deleted file mode 100644 index 6fd0d99..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64-vlq.js +++ /dev/null @@ -1,23 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var base64VLQ = require('../../lib/source-map/base64-vlq'); - - exports['test normal encoding and decoding'] = function (assert, util) { - var result = {}; - for (var i = -255; i < 256; i++) { - base64VLQ.decode(base64VLQ.encode(i), result); - assert.equal(result.value, i); - assert.equal(result.rest, ""); - } - }; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64.js deleted file mode 100644 index ff3a244..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-base64.js +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var base64 = require('../../lib/source-map/base64'); - - exports['test out of range encoding'] = function (assert, util) { - assert.throws(function () { - base64.encode(-1); - }); - assert.throws(function () { - base64.encode(64); - }); - }; - - exports['test out of range decoding'] = function (assert, util) { - assert.throws(function () { - base64.decode('='); - }); - }; - - exports['test normal encoding and decoding'] = function (assert, util) { - for (var i = 0; i < 64; i++) { - assert.equal(base64.decode(base64.encode(i)), i); - } - }; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-binary-search.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-binary-search.js deleted file mode 100644 index f1c9e0f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-binary-search.js +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var binarySearch = require('../../lib/source-map/binary-search'); - - function numberCompare(a, b) { - return a - b; - } - - exports['test too high'] = function (assert, util) { - var needle = 30; - var haystack = [2,4,6,8,10,12,14,16,18,20]; - - assert.doesNotThrow(function () { - binarySearch.search(needle, haystack, numberCompare); - }); - - assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare)], 20); - }; - - exports['test too low'] = function (assert, util) { - var needle = 1; - var haystack = [2,4,6,8,10,12,14,16,18,20]; - - assert.doesNotThrow(function () { - binarySearch.search(needle, haystack, numberCompare); - }); - - assert.equal(binarySearch.search(needle, haystack, numberCompare), -1); - }; - - exports['test exact search'] = function (assert, util) { - var needle = 4; - var haystack = [2,4,6,8,10,12,14,16,18,20]; - - assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare)], 4); - }; - - exports['test fuzzy search'] = function (assert, util) { - var needle = 19; - var haystack = [2,4,6,8,10,12,14,16,18,20]; - - assert.equal(haystack[binarySearch.search(needle, haystack, numberCompare)], 18); - }; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-dog-fooding.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-dog-fooding.js deleted file mode 100644 index 26757b2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-dog-fooding.js +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; - var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; - - exports['test eating our own dog food'] = function (assert, util) { - var smg = new SourceMapGenerator({ - file: 'testing.js', - sourceRoot: '/wu/tang' - }); - - smg.addMapping({ - source: 'gza.coffee', - original: { line: 1, column: 0 }, - generated: { line: 2, column: 2 } - }); - - smg.addMapping({ - source: 'gza.coffee', - original: { line: 2, column: 0 }, - generated: { line: 3, column: 2 } - }); - - smg.addMapping({ - source: 'gza.coffee', - original: { line: 3, column: 0 }, - generated: { line: 4, column: 2 } - }); - - smg.addMapping({ - source: 'gza.coffee', - original: { line: 4, column: 0 }, - generated: { line: 5, column: 2 } - }); - - smg.addMapping({ - source: 'gza.coffee', - original: { line: 5, column: 10 }, - generated: { line: 6, column: 12 } - }); - - var smc = new SourceMapConsumer(smg.toString()); - - // Exact - util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 0, null, smc, assert); - util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 0, null, smc, assert); - util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 0, null, smc, assert); - util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 0, null, smc, assert); - util.assertMapping(6, 12, '/wu/tang/gza.coffee', 5, 10, null, smc, assert); - - // Fuzzy - - // Generated to original - util.assertMapping(2, 0, null, null, null, null, smc, assert, true); - util.assertMapping(2, 9, '/wu/tang/gza.coffee', 1, 0, null, smc, assert, true); - util.assertMapping(3, 0, null, null, null, null, smc, assert, true); - util.assertMapping(3, 9, '/wu/tang/gza.coffee', 2, 0, null, smc, assert, true); - util.assertMapping(4, 0, null, null, null, null, smc, assert, true); - util.assertMapping(4, 9, '/wu/tang/gza.coffee', 3, 0, null, smc, assert, true); - util.assertMapping(5, 0, null, null, null, null, smc, assert, true); - util.assertMapping(5, 9, '/wu/tang/gza.coffee', 4, 0, null, smc, assert, true); - util.assertMapping(6, 0, null, null, null, null, smc, assert, true); - util.assertMapping(6, 9, null, null, null, null, smc, assert, true); - util.assertMapping(6, 13, '/wu/tang/gza.coffee', 5, 10, null, smc, assert, true); - - // Original to generated - util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 1, null, smc, assert, null, true); - util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 3, null, smc, assert, null, true); - util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 6, null, smc, assert, null, true); - util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 9, null, smc, assert, null, true); - util.assertMapping(5, 2, '/wu/tang/gza.coffee', 5, 9, null, smc, assert, null, true); - util.assertMapping(6, 12, '/wu/tang/gza.coffee', 6, 19, null, smc, assert, null, true); - }; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-consumer.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-consumer.js deleted file mode 100644 index c714943..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-consumer.js +++ /dev/null @@ -1,702 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; - var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; - - exports['test that we can instantiate with a string or an object'] = function (assert, util) { - assert.doesNotThrow(function () { - var map = new SourceMapConsumer(util.testMap); - }); - assert.doesNotThrow(function () { - var map = new SourceMapConsumer(JSON.stringify(util.testMap)); - }); - }; - - exports['test that the `sources` field has the original sources'] = function (assert, util) { - var map; - var sources; - - map = new SourceMapConsumer(util.testMap); - sources = map.sources; - assert.equal(sources[0], '/the/root/one.js'); - assert.equal(sources[1], '/the/root/two.js'); - assert.equal(sources.length, 2); - - map = new SourceMapConsumer(util.testMapNoSourceRoot); - sources = map.sources; - assert.equal(sources[0], 'one.js'); - assert.equal(sources[1], 'two.js'); - assert.equal(sources.length, 2); - - map = new SourceMapConsumer(util.testMapEmptySourceRoot); - sources = map.sources; - assert.equal(sources[0], 'one.js'); - assert.equal(sources[1], 'two.js'); - assert.equal(sources.length, 2); - }; - - exports['test that the source root is reflected in a mapping\'s source field'] = function (assert, util) { - var map; - var mapping; - - map = new SourceMapConsumer(util.testMap); - - mapping = map.originalPositionFor({ - line: 2, - column: 1 - }); - assert.equal(mapping.source, '/the/root/two.js'); - - mapping = map.originalPositionFor({ - line: 1, - column: 1 - }); - assert.equal(mapping.source, '/the/root/one.js'); - - - map = new SourceMapConsumer(util.testMapNoSourceRoot); - - mapping = map.originalPositionFor({ - line: 2, - column: 1 - }); - assert.equal(mapping.source, 'two.js'); - - mapping = map.originalPositionFor({ - line: 1, - column: 1 - }); - assert.equal(mapping.source, 'one.js'); - - - map = new SourceMapConsumer(util.testMapEmptySourceRoot); - - mapping = map.originalPositionFor({ - line: 2, - column: 1 - }); - assert.equal(mapping.source, 'two.js'); - - mapping = map.originalPositionFor({ - line: 1, - column: 1 - }); - assert.equal(mapping.source, 'one.js'); - }; - - exports['test mapping tokens back exactly'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMap); - - util.assertMapping(1, 1, '/the/root/one.js', 1, 1, null, map, assert); - util.assertMapping(1, 5, '/the/root/one.js', 1, 5, null, map, assert); - util.assertMapping(1, 9, '/the/root/one.js', 1, 11, null, map, assert); - util.assertMapping(1, 18, '/the/root/one.js', 1, 21, 'bar', map, assert); - util.assertMapping(1, 21, '/the/root/one.js', 2, 3, null, map, assert); - util.assertMapping(1, 28, '/the/root/one.js', 2, 10, 'baz', map, assert); - util.assertMapping(1, 32, '/the/root/one.js', 2, 14, 'bar', map, assert); - - util.assertMapping(2, 1, '/the/root/two.js', 1, 1, null, map, assert); - util.assertMapping(2, 5, '/the/root/two.js', 1, 5, null, map, assert); - util.assertMapping(2, 9, '/the/root/two.js', 1, 11, null, map, assert); - util.assertMapping(2, 18, '/the/root/two.js', 1, 21, 'n', map, assert); - util.assertMapping(2, 21, '/the/root/two.js', 2, 3, null, map, assert); - util.assertMapping(2, 28, '/the/root/two.js', 2, 10, 'n', map, assert); - }; - - exports['test mapping tokens fuzzy'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMap); - - // Finding original positions - util.assertMapping(1, 20, '/the/root/one.js', 1, 21, 'bar', map, assert, true); - util.assertMapping(1, 30, '/the/root/one.js', 2, 10, 'baz', map, assert, true); - util.assertMapping(2, 12, '/the/root/two.js', 1, 11, null, map, assert, true); - - // Finding generated positions - util.assertMapping(1, 18, '/the/root/one.js', 1, 22, 'bar', map, assert, null, true); - util.assertMapping(1, 28, '/the/root/one.js', 2, 13, 'baz', map, assert, null, true); - util.assertMapping(2, 9, '/the/root/two.js', 1, 16, null, map, assert, null, true); - }; - - exports['test mappings and end of lines'] = function (assert, util) { - var smg = new SourceMapGenerator({ - file: 'foo.js' - }); - smg.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 1, column: 1 }, - source: 'bar.js' - }); - smg.addMapping({ - original: { line: 2, column: 2 }, - generated: { line: 2, column: 2 }, - source: 'bar.js' - }); - - var map = SourceMapConsumer.fromSourceMap(smg); - - // When finding original positions, mappings end at the end of the line. - util.assertMapping(2, 1, null, null, null, null, map, assert, true) - - // When finding generated positions, mappings do not end at the end of the line. - util.assertMapping(1, 1, 'bar.js', 2, 1, null, map, assert, null, true); - }; - - exports['test creating source map consumers with )]}\' prefix'] = function (assert, util) { - assert.doesNotThrow(function () { - var map = new SourceMapConsumer(")]}'" + JSON.stringify(util.testMap)); - }); - }; - - exports['test eachMapping'] = function (assert, util) { - var map; - - map = new SourceMapConsumer(util.testMap); - var previousLine = -Infinity; - var previousColumn = -Infinity; - map.eachMapping(function (mapping) { - assert.ok(mapping.generatedLine >= previousLine); - - assert.ok(mapping.source === '/the/root/one.js' || mapping.source === '/the/root/two.js'); - - if (mapping.generatedLine === previousLine) { - assert.ok(mapping.generatedColumn >= previousColumn); - previousColumn = mapping.generatedColumn; - } - else { - previousLine = mapping.generatedLine; - previousColumn = -Infinity; - } - }); - - map = new SourceMapConsumer(util.testMapNoSourceRoot); - map.eachMapping(function (mapping) { - assert.ok(mapping.source === 'one.js' || mapping.source === 'two.js'); - }); - - map = new SourceMapConsumer(util.testMapEmptySourceRoot); - map.eachMapping(function (mapping) { - assert.ok(mapping.source === 'one.js' || mapping.source === 'two.js'); - }); - }; - - exports['test iterating over mappings in a different order'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMap); - var previousLine = -Infinity; - var previousColumn = -Infinity; - var previousSource = ""; - map.eachMapping(function (mapping) { - assert.ok(mapping.source >= previousSource); - - if (mapping.source === previousSource) { - assert.ok(mapping.originalLine >= previousLine); - - if (mapping.originalLine === previousLine) { - assert.ok(mapping.originalColumn >= previousColumn); - previousColumn = mapping.originalColumn; - } - else { - previousLine = mapping.originalLine; - previousColumn = -Infinity; - } - } - else { - previousSource = mapping.source; - previousLine = -Infinity; - previousColumn = -Infinity; - } - }, null, SourceMapConsumer.ORIGINAL_ORDER); - }; - - exports['test that we can set the context for `this` in eachMapping'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMap); - var context = {}; - map.eachMapping(function () { - assert.equal(this, context); - }, context); - }; - - exports['test that the `sourcesContent` field has the original sources'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMapWithSourcesContent); - var sourcesContent = map.sourcesContent; - - assert.equal(sourcesContent[0], ' ONE.foo = function (bar) {\n return baz(bar);\n };'); - assert.equal(sourcesContent[1], ' TWO.inc = function (n) {\n return n + 1;\n };'); - assert.equal(sourcesContent.length, 2); - }; - - exports['test that we can get the original sources for the sources'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMapWithSourcesContent); - var sources = map.sources; - - assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); - assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };'); - assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); - assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };'); - assert.throws(function () { - map.sourceContentFor(""); - }, Error); - assert.throws(function () { - map.sourceContentFor("/the/root/three.js"); - }, Error); - assert.throws(function () { - map.sourceContentFor("three.js"); - }, Error); - }; - - exports['test that we can get the original source content with relative source paths'] = function (assert, util) { - var map = new SourceMapConsumer(util.testMapRelativeSources); - var sources = map.sources; - - assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); - assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };'); - assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };'); - assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };'); - assert.throws(function () { - map.sourceContentFor(""); - }, Error); - assert.throws(function () { - map.sourceContentFor("/the/root/three.js"); - }, Error); - assert.throws(function () { - map.sourceContentFor("three.js"); - }, Error); - }; - - exports['test sourceRoot + generatedPositionFor'] = function (assert, util) { - var map = new SourceMapGenerator({ - sourceRoot: 'foo/bar', - file: 'baz.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'bang.coffee' - }); - map.addMapping({ - original: { line: 5, column: 5 }, - generated: { line: 6, column: 6 }, - source: 'bang.coffee' - }); - map = new SourceMapConsumer(map.toString()); - - // Should handle without sourceRoot. - var pos = map.generatedPositionFor({ - line: 1, - column: 1, - source: 'bang.coffee' - }); - - assert.equal(pos.line, 2); - assert.equal(pos.column, 2); - - // Should handle with sourceRoot. - var pos = map.generatedPositionFor({ - line: 1, - column: 1, - source: 'foo/bar/bang.coffee' - }); - - assert.equal(pos.line, 2); - assert.equal(pos.column, 2); - }; - - exports['test allGeneratedPositionsFor'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'bar.coffee' - }); - map.addMapping({ - original: { line: 2, column: 1 }, - generated: { line: 3, column: 2 }, - source: 'bar.coffee' - }); - map.addMapping({ - original: { line: 2, column: 2 }, - generated: { line: 3, column: 3 }, - source: 'bar.coffee' - }); - map.addMapping({ - original: { line: 3, column: 1 }, - generated: { line: 4, column: 2 }, - source: 'bar.coffee' - }); - map = new SourceMapConsumer(map.toString()); - - var mappings = map.allGeneratedPositionsFor({ - line: 2, - source: 'bar.coffee' - }); - - assert.equal(mappings.length, 2); - assert.equal(mappings[0].line, 3); - assert.equal(mappings[0].column, 2); - assert.equal(mappings[1].line, 3); - assert.equal(mappings[1].column, 3); - }; - - exports['test allGeneratedPositionsFor for line with no mappings'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'bar.coffee' - }); - map.addMapping({ - original: { line: 3, column: 1 }, - generated: { line: 4, column: 2 }, - source: 'bar.coffee' - }); - map = new SourceMapConsumer(map.toString()); - - var mappings = map.allGeneratedPositionsFor({ - line: 2, - source: 'bar.coffee' - }); - - assert.equal(mappings.length, 0); - }; - - exports['test allGeneratedPositionsFor source map with no mappings'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated.js' - }); - map = new SourceMapConsumer(map.toString()); - - var mappings = map.allGeneratedPositionsFor({ - line: 2, - source: 'bar.coffee' - }); - - assert.equal(mappings.length, 0); - }; - - exports['test computeColumnSpans'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 1, column: 1 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 2, column: 1 }, - generated: { line: 2, column: 1 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 2, column: 2 }, - generated: { line: 2, column: 10 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 2, column: 3 }, - generated: { line: 2, column: 20 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 3, column: 1 }, - generated: { line: 3, column: 1 }, - source: 'foo.coffee' - }); - map.addMapping({ - original: { line: 3, column: 2 }, - generated: { line: 3, column: 2 }, - source: 'foo.coffee' - }); - map = new SourceMapConsumer(map.toString()); - - map.computeColumnSpans(); - - var mappings = map.allGeneratedPositionsFor({ - line: 1, - source: 'foo.coffee' - }); - - assert.equal(mappings.length, 1); - assert.equal(mappings[0].lastColumn, Infinity); - - var mappings = map.allGeneratedPositionsFor({ - line: 2, - source: 'foo.coffee' - }); - - assert.equal(mappings.length, 3); - assert.equal(mappings[0].lastColumn, 9); - assert.equal(mappings[1].lastColumn, 19); - assert.equal(mappings[2].lastColumn, Infinity); - - var mappings = map.allGeneratedPositionsFor({ - line: 3, - source: 'foo.coffee' - }); - - assert.equal(mappings.length, 2); - assert.equal(mappings[0].lastColumn, 1); - assert.equal(mappings[1].lastColumn, Infinity); - }; - - exports['test sourceRoot + originalPositionFor'] = function (assert, util) { - var map = new SourceMapGenerator({ - sourceRoot: 'foo/bar', - file: 'baz.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'bang.coffee' - }); - map = new SourceMapConsumer(map.toString()); - - var pos = map.originalPositionFor({ - line: 2, - column: 2, - }); - - // Should always have the prepended source root - assert.equal(pos.source, 'foo/bar/bang.coffee'); - assert.equal(pos.line, 1); - assert.equal(pos.column, 1); - }; - - exports['test github issue #56'] = function (assert, util) { - var map = new SourceMapGenerator({ - sourceRoot: 'http://', - file: 'www.example.com/foo.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'www.example.com/original.js' - }); - map = new SourceMapConsumer(map.toString()); - - var sources = map.sources; - assert.equal(sources.length, 1); - assert.equal(sources[0], 'http://www.example.com/original.js'); - }; - - exports['test github issue #43'] = function (assert, util) { - var map = new SourceMapGenerator({ - sourceRoot: 'http://example.com', - file: 'foo.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'http://cdn.example.com/original.js' - }); - map = new SourceMapConsumer(map.toString()); - - var sources = map.sources; - assert.equal(sources.length, 1, - 'Should only be one source.'); - assert.equal(sources[0], 'http://cdn.example.com/original.js', - 'Should not be joined with the sourceRoot.'); - }; - - exports['test absolute path, but same host sources'] = function (assert, util) { - var map = new SourceMapGenerator({ - sourceRoot: 'http://example.com/foo/bar', - file: 'foo.js' - }); - map.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: '/original.js' - }); - map = new SourceMapConsumer(map.toString()); - - var sources = map.sources; - assert.equal(sources.length, 1, - 'Should only be one source.'); - assert.equal(sources[0], 'http://example.com/original.js', - 'Source should be relative the host of the source root.'); - }; - - exports['test github issue #64'] = function (assert, util) { - var map = new SourceMapConsumer({ - "version": 3, - "file": "foo.js", - "sourceRoot": "http://example.com/", - "sources": ["/a"], - "names": [], - "mappings": "AACA", - "sourcesContent": ["foo"] - }); - - assert.equal(map.sourceContentFor("a"), "foo"); - assert.equal(map.sourceContentFor("/a"), "foo"); - }; - - exports['test bug 885597'] = function (assert, util) { - var map = new SourceMapConsumer({ - "version": 3, - "file": "foo.js", - "sourceRoot": "file:///Users/AlGore/Invented/The/Internet/", - "sources": ["/a"], - "names": [], - "mappings": "AACA", - "sourcesContent": ["foo"] - }); - - var s = map.sources[0]; - assert.equal(map.sourceContentFor(s), "foo"); - }; - - exports['test github issue #72, duplicate sources'] = function (assert, util) { - var map = new SourceMapConsumer({ - "version": 3, - "file": "foo.js", - "sources": ["source1.js", "source1.js", "source3.js"], - "names": [], - "mappings": ";EAAC;;IAEE;;MEEE", - "sourceRoot": "http://example.com" - }); - - var pos = map.originalPositionFor({ - line: 2, - column: 2 - }); - assert.equal(pos.source, 'http://example.com/source1.js'); - assert.equal(pos.line, 1); - assert.equal(pos.column, 1); - - var pos = map.originalPositionFor({ - line: 4, - column: 4 - }); - assert.equal(pos.source, 'http://example.com/source1.js'); - assert.equal(pos.line, 3); - assert.equal(pos.column, 3); - - var pos = map.originalPositionFor({ - line: 6, - column: 6 - }); - assert.equal(pos.source, 'http://example.com/source3.js'); - assert.equal(pos.line, 5); - assert.equal(pos.column, 5); - }; - - exports['test github issue #72, duplicate names'] = function (assert, util) { - var map = new SourceMapConsumer({ - "version": 3, - "file": "foo.js", - "sources": ["source.js"], - "names": ["name1", "name1", "name3"], - "mappings": ";EAACA;;IAEEA;;MAEEE", - "sourceRoot": "http://example.com" - }); - - var pos = map.originalPositionFor({ - line: 2, - column: 2 - }); - assert.equal(pos.name, 'name1'); - assert.equal(pos.line, 1); - assert.equal(pos.column, 1); - - var pos = map.originalPositionFor({ - line: 4, - column: 4 - }); - assert.equal(pos.name, 'name1'); - assert.equal(pos.line, 3); - assert.equal(pos.column, 3); - - var pos = map.originalPositionFor({ - line: 6, - column: 6 - }); - assert.equal(pos.name, 'name3'); - assert.equal(pos.line, 5); - assert.equal(pos.column, 5); - }; - - exports['test SourceMapConsumer.fromSourceMap'] = function (assert, util) { - var smg = new SourceMapGenerator({ - sourceRoot: 'http://example.com/', - file: 'foo.js' - }); - smg.addMapping({ - original: { line: 1, column: 1 }, - generated: { line: 2, column: 2 }, - source: 'bar.js' - }); - smg.addMapping({ - original: { line: 2, column: 2 }, - generated: { line: 4, column: 4 }, - source: 'baz.js', - name: 'dirtMcGirt' - }); - smg.setSourceContent('baz.js', 'baz.js content'); - - var smc = SourceMapConsumer.fromSourceMap(smg); - assert.equal(smc.file, 'foo.js'); - assert.equal(smc.sourceRoot, 'http://example.com/'); - assert.equal(smc.sources.length, 2); - assert.equal(smc.sources[0], 'http://example.com/bar.js'); - assert.equal(smc.sources[1], 'http://example.com/baz.js'); - assert.equal(smc.sourceContentFor('baz.js'), 'baz.js content'); - - var pos = smc.originalPositionFor({ - line: 2, - column: 2 - }); - assert.equal(pos.line, 1); - assert.equal(pos.column, 1); - assert.equal(pos.source, 'http://example.com/bar.js'); - assert.equal(pos.name, null); - - pos = smc.generatedPositionFor({ - line: 1, - column: 1, - source: 'http://example.com/bar.js' - }); - assert.equal(pos.line, 2); - assert.equal(pos.column, 2); - - pos = smc.originalPositionFor({ - line: 4, - column: 4 - }); - assert.equal(pos.line, 2); - assert.equal(pos.column, 2); - assert.equal(pos.source, 'http://example.com/baz.js'); - assert.equal(pos.name, 'dirtMcGirt'); - - pos = smc.generatedPositionFor({ - line: 2, - column: 2, - source: 'http://example.com/baz.js' - }); - assert.equal(pos.line, 4); - assert.equal(pos.column, 4); - }; -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-generator.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-generator.js deleted file mode 100644 index d748bb1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-map-generator.js +++ /dev/null @@ -1,679 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; - var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; - var SourceNode = require('../../lib/source-map/source-node').SourceNode; - var util = require('./util'); - - exports['test some simple stuff'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'foo.js', - sourceRoot: '.' - }); - assert.ok(true); - - var map = new SourceMapGenerator().toJSON(); - assert.ok(!('file' in map)); - assert.ok(!('sourceRoot' in map)); - }; - - exports['test JSON serialization'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'foo.js', - sourceRoot: '.' - }); - assert.equal(map.toString(), JSON.stringify(map)); - }; - - exports['test adding mappings (case 1)'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated-foo.js', - sourceRoot: '.' - }); - - assert.doesNotThrow(function () { - map.addMapping({ - generated: { line: 1, column: 1 } - }); - }); - }; - - exports['test adding mappings (case 2)'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated-foo.js', - sourceRoot: '.' - }); - - assert.doesNotThrow(function () { - map.addMapping({ - generated: { line: 1, column: 1 }, - source: 'bar.js', - original: { line: 1, column: 1 } - }); - }); - }; - - exports['test adding mappings (case 3)'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated-foo.js', - sourceRoot: '.' - }); - - assert.doesNotThrow(function () { - map.addMapping({ - generated: { line: 1, column: 1 }, - source: 'bar.js', - original: { line: 1, column: 1 }, - name: 'someToken' - }); - }); - }; - - exports['test adding mappings (invalid)'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated-foo.js', - sourceRoot: '.' - }); - - // Not enough info. - assert.throws(function () { - map.addMapping({}); - }); - - // Original file position, but no source. - assert.throws(function () { - map.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 1, column: 1 } - }); - }); - }; - - exports['test adding mappings with skipValidation'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated-foo.js', - sourceRoot: '.', - skipValidation: true - }); - - // Not enough info, caught by `util.getArgs` - assert.throws(function () { - map.addMapping({}); - }); - - // Original file position, but no source. Not checked. - assert.doesNotThrow(function () { - map.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 1, column: 1 } - }); - }); - }; - - exports['test that the correct mappings are being generated'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'min.js', - sourceRoot: '/the/root' - }); - - map.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 1, column: 1 }, - source: 'one.js' - }); - map.addMapping({ - generated: { line: 1, column: 5 }, - original: { line: 1, column: 5 }, - source: 'one.js' - }); - map.addMapping({ - generated: { line: 1, column: 9 }, - original: { line: 1, column: 11 }, - source: 'one.js' - }); - map.addMapping({ - generated: { line: 1, column: 18 }, - original: { line: 1, column: 21 }, - source: 'one.js', - name: 'bar' - }); - map.addMapping({ - generated: { line: 1, column: 21 }, - original: { line: 2, column: 3 }, - source: 'one.js' - }); - map.addMapping({ - generated: { line: 1, column: 28 }, - original: { line: 2, column: 10 }, - source: 'one.js', - name: 'baz' - }); - map.addMapping({ - generated: { line: 1, column: 32 }, - original: { line: 2, column: 14 }, - source: 'one.js', - name: 'bar' - }); - - map.addMapping({ - generated: { line: 2, column: 1 }, - original: { line: 1, column: 1 }, - source: 'two.js' - }); - map.addMapping({ - generated: { line: 2, column: 5 }, - original: { line: 1, column: 5 }, - source: 'two.js' - }); - map.addMapping({ - generated: { line: 2, column: 9 }, - original: { line: 1, column: 11 }, - source: 'two.js' - }); - map.addMapping({ - generated: { line: 2, column: 18 }, - original: { line: 1, column: 21 }, - source: 'two.js', - name: 'n' - }); - map.addMapping({ - generated: { line: 2, column: 21 }, - original: { line: 2, column: 3 }, - source: 'two.js' - }); - map.addMapping({ - generated: { line: 2, column: 28 }, - original: { line: 2, column: 10 }, - source: 'two.js', - name: 'n' - }); - - map = JSON.parse(map.toString()); - - util.assertEqualMaps(assert, map, util.testMap); - }; - - exports['test that adding a mapping with an empty string name does not break generation'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'generated-foo.js', - sourceRoot: '.' - }); - - map.addMapping({ - generated: { line: 1, column: 1 }, - source: 'bar.js', - original: { line: 1, column: 1 }, - name: '' - }); - - assert.doesNotThrow(function () { - JSON.parse(map.toString()); - }); - }; - - exports['test that source content can be set'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'min.js', - sourceRoot: '/the/root' - }); - map.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 1, column: 1 }, - source: 'one.js' - }); - map.addMapping({ - generated: { line: 2, column: 1 }, - original: { line: 1, column: 1 }, - source: 'two.js' - }); - map.setSourceContent('one.js', 'one file content'); - - map = JSON.parse(map.toString()); - assert.equal(map.sources[0], 'one.js'); - assert.equal(map.sources[1], 'two.js'); - assert.equal(map.sourcesContent[0], 'one file content'); - assert.equal(map.sourcesContent[1], null); - }; - - exports['test .fromSourceMap'] = function (assert, util) { - var map = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(util.testMap)); - util.assertEqualMaps(assert, map.toJSON(), util.testMap); - }; - - exports['test .fromSourceMap with sourcesContent'] = function (assert, util) { - var map = SourceMapGenerator.fromSourceMap( - new SourceMapConsumer(util.testMapWithSourcesContent)); - util.assertEqualMaps(assert, map.toJSON(), util.testMapWithSourcesContent); - }; - - exports['test applySourceMap'] = function (assert, util) { - var node = new SourceNode(null, null, null, [ - new SourceNode(2, 0, 'fileX', 'lineX2\n'), - 'genA1\n', - new SourceNode(2, 0, 'fileY', 'lineY2\n'), - 'genA2\n', - new SourceNode(1, 0, 'fileX', 'lineX1\n'), - 'genA3\n', - new SourceNode(1, 0, 'fileY', 'lineY1\n') - ]); - var mapStep1 = node.toStringWithSourceMap({ - file: 'fileA' - }).map; - mapStep1.setSourceContent('fileX', 'lineX1\nlineX2\n'); - mapStep1 = mapStep1.toJSON(); - - node = new SourceNode(null, null, null, [ - 'gen1\n', - new SourceNode(1, 0, 'fileA', 'lineA1\n'), - new SourceNode(2, 0, 'fileA', 'lineA2\n'), - new SourceNode(3, 0, 'fileA', 'lineA3\n'), - new SourceNode(4, 0, 'fileA', 'lineA4\n'), - new SourceNode(1, 0, 'fileB', 'lineB1\n'), - new SourceNode(2, 0, 'fileB', 'lineB2\n'), - 'gen2\n' - ]); - var mapStep2 = node.toStringWithSourceMap({ - file: 'fileGen' - }).map; - mapStep2.setSourceContent('fileB', 'lineB1\nlineB2\n'); - mapStep2 = mapStep2.toJSON(); - - node = new SourceNode(null, null, null, [ - 'gen1\n', - new SourceNode(2, 0, 'fileX', 'lineA1\n'), - new SourceNode(2, 0, 'fileA', 'lineA2\n'), - new SourceNode(2, 0, 'fileY', 'lineA3\n'), - new SourceNode(4, 0, 'fileA', 'lineA4\n'), - new SourceNode(1, 0, 'fileB', 'lineB1\n'), - new SourceNode(2, 0, 'fileB', 'lineB2\n'), - 'gen2\n' - ]); - var expectedMap = node.toStringWithSourceMap({ - file: 'fileGen' - }).map; - expectedMap.setSourceContent('fileX', 'lineX1\nlineX2\n'); - expectedMap.setSourceContent('fileB', 'lineB1\nlineB2\n'); - expectedMap = expectedMap.toJSON(); - - // apply source map "mapStep1" to "mapStep2" - var generator = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(mapStep2)); - generator.applySourceMap(new SourceMapConsumer(mapStep1)); - var actualMap = generator.toJSON(); - - util.assertEqualMaps(assert, actualMap, expectedMap); - }; - - exports['test applySourceMap throws when file is missing'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'test.js' - }); - var map2 = new SourceMapGenerator(); - assert.throws(function() { - map.applySourceMap(new SourceMapConsumer(map2.toJSON())); - }); - }; - - exports['test the two additional parameters of applySourceMap'] = function (assert, util) { - // Assume the following directory structure: - // - // http://foo.org/ - // bar.coffee - // app/ - // coffee/ - // foo.coffee - // temp/ - // bundle.js - // temp_maps/ - // bundle.js.map - // public/ - // bundle.min.js - // bundle.min.js.map - // - // http://www.example.com/ - // baz.coffee - - var bundleMap = new SourceMapGenerator({ - file: 'bundle.js' - }); - bundleMap.addMapping({ - generated: { line: 3, column: 3 }, - original: { line: 2, column: 2 }, - source: '../../coffee/foo.coffee' - }); - bundleMap.setSourceContent('../../coffee/foo.coffee', 'foo coffee'); - bundleMap.addMapping({ - generated: { line: 13, column: 13 }, - original: { line: 12, column: 12 }, - source: '/bar.coffee' - }); - bundleMap.setSourceContent('/bar.coffee', 'bar coffee'); - bundleMap.addMapping({ - generated: { line: 23, column: 23 }, - original: { line: 22, column: 22 }, - source: 'http://www.example.com/baz.coffee' - }); - bundleMap.setSourceContent( - 'http://www.example.com/baz.coffee', - 'baz coffee' - ); - bundleMap = new SourceMapConsumer(bundleMap.toJSON()); - - var minifiedMap = new SourceMapGenerator({ - file: 'bundle.min.js', - sourceRoot: '..' - }); - minifiedMap.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 3, column: 3 }, - source: 'temp/bundle.js' - }); - minifiedMap.addMapping({ - generated: { line: 11, column: 11 }, - original: { line: 13, column: 13 }, - source: 'temp/bundle.js' - }); - minifiedMap.addMapping({ - generated: { line: 21, column: 21 }, - original: { line: 23, column: 23 }, - source: 'temp/bundle.js' - }); - minifiedMap = new SourceMapConsumer(minifiedMap.toJSON()); - - var expectedMap = function (sources) { - var map = new SourceMapGenerator({ - file: 'bundle.min.js', - sourceRoot: '..' - }); - map.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 2, column: 2 }, - source: sources[0] - }); - map.setSourceContent(sources[0], 'foo coffee'); - map.addMapping({ - generated: { line: 11, column: 11 }, - original: { line: 12, column: 12 }, - source: sources[1] - }); - map.setSourceContent(sources[1], 'bar coffee'); - map.addMapping({ - generated: { line: 21, column: 21 }, - original: { line: 22, column: 22 }, - source: sources[2] - }); - map.setSourceContent(sources[2], 'baz coffee'); - return map.toJSON(); - } - - var actualMap = function (aSourceMapPath) { - var map = SourceMapGenerator.fromSourceMap(minifiedMap); - // Note that relying on `bundleMap.file` (which is simply 'bundle.js') - // instead of supplying the second parameter wouldn't work here. - map.applySourceMap(bundleMap, '../temp/bundle.js', aSourceMapPath); - return map.toJSON(); - } - - util.assertEqualMaps(assert, actualMap('../temp/temp_maps'), expectedMap([ - 'coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - - util.assertEqualMaps(assert, actualMap('/app/temp/temp_maps'), expectedMap([ - '/app/coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - - util.assertEqualMaps(assert, actualMap('http://foo.org/app/temp/temp_maps'), expectedMap([ - 'http://foo.org/app/coffee/foo.coffee', - 'http://foo.org/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - - // If the third parameter is omitted or set to the current working - // directory we get incorrect source paths: - - util.assertEqualMaps(assert, actualMap(), expectedMap([ - '../coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - - util.assertEqualMaps(assert, actualMap(''), expectedMap([ - '../coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - - util.assertEqualMaps(assert, actualMap('.'), expectedMap([ - '../coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - - util.assertEqualMaps(assert, actualMap('./'), expectedMap([ - '../coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee' - ])); - }; - - exports['test applySourceMap name handling'] = function (assert, util) { - // Imagine some CoffeeScript code being compiled into JavaScript and then - // minified. - - var assertName = function(coffeeName, jsName, expectedName) { - var minifiedMap = new SourceMapGenerator({ - file: 'test.js.min' - }); - minifiedMap.addMapping({ - generated: { line: 1, column: 4 }, - original: { line: 1, column: 4 }, - source: 'test.js', - name: jsName - }); - - var coffeeMap = new SourceMapGenerator({ - file: 'test.js' - }); - coffeeMap.addMapping({ - generated: { line: 1, column: 4 }, - original: { line: 1, column: 0 }, - source: 'test.coffee', - name: coffeeName - }); - - minifiedMap.applySourceMap(new SourceMapConsumer(coffeeMap.toJSON())); - - new SourceMapConsumer(minifiedMap.toJSON()).eachMapping(function(mapping) { - assert.equal(mapping.name, expectedName); - }); - }; - - // `foo = 1` -> `var foo = 1;` -> `var a=1` - // CoffeeScript doesn’t rename variables, so there’s no need for it to - // provide names in its source maps. Minifiers do rename variables and - // therefore do provide names in their source maps. So that name should be - // retained if the original map lacks names. - assertName(null, 'foo', 'foo'); - - // `foo = 1` -> `var coffee$foo = 1;` -> `var a=1` - // Imagine that CoffeeScript prefixed all variables with `coffee$`. Even - // though the minifier then also provides a name, the original name is - // what corresponds to the source. - assertName('foo', 'coffee$foo', 'foo'); - - // `foo = 1` -> `var coffee$foo = 1;` -> `var coffee$foo=1` - // Minifiers can turn off variable mangling. Then there’s no need to - // provide names in the source map, but the names from the original map are - // still needed. - assertName('foo', null, 'foo'); - - // `foo = 1` -> `var foo = 1;` -> `var foo=1` - // No renaming at all. - assertName(null, null, null); - }; - - exports['test sorting with duplicate generated mappings'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'test.js' - }); - map.addMapping({ - generated: { line: 3, column: 0 }, - original: { line: 2, column: 0 }, - source: 'a.js' - }); - map.addMapping({ - generated: { line: 2, column: 0 } - }); - map.addMapping({ - generated: { line: 2, column: 0 } - }); - map.addMapping({ - generated: { line: 1, column: 0 }, - original: { line: 1, column: 0 }, - source: 'a.js' - }); - - util.assertEqualMaps(assert, map.toJSON(), { - version: 3, - file: 'test.js', - sources: ['a.js'], - names: [], - mappings: 'AAAA;A;AACA' - }); - }; - - exports['test ignore duplicate mappings.'] = function (assert, util) { - var init = { file: 'min.js', sourceRoot: '/the/root' }; - var map1, map2; - - // null original source location - var nullMapping1 = { - generated: { line: 1, column: 0 } - }; - var nullMapping2 = { - generated: { line: 2, column: 2 } - }; - - map1 = new SourceMapGenerator(init); - map2 = new SourceMapGenerator(init); - - map1.addMapping(nullMapping1); - map1.addMapping(nullMapping1); - - map2.addMapping(nullMapping1); - - util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); - - map1.addMapping(nullMapping2); - map1.addMapping(nullMapping1); - - map2.addMapping(nullMapping2); - - util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); - - // original source location - var srcMapping1 = { - generated: { line: 1, column: 0 }, - original: { line: 11, column: 0 }, - source: 'srcMapping1.js' - }; - var srcMapping2 = { - generated: { line: 2, column: 2 }, - original: { line: 11, column: 0 }, - source: 'srcMapping2.js' - }; - - map1 = new SourceMapGenerator(init); - map2 = new SourceMapGenerator(init); - - map1.addMapping(srcMapping1); - map1.addMapping(srcMapping1); - - map2.addMapping(srcMapping1); - - util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); - - map1.addMapping(srcMapping2); - map1.addMapping(srcMapping1); - - map2.addMapping(srcMapping2); - - util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); - - // full original source and name information - var fullMapping1 = { - generated: { line: 1, column: 0 }, - original: { line: 11, column: 0 }, - source: 'fullMapping1.js', - name: 'fullMapping1' - }; - var fullMapping2 = { - generated: { line: 2, column: 2 }, - original: { line: 11, column: 0 }, - source: 'fullMapping2.js', - name: 'fullMapping2' - }; - - map1 = new SourceMapGenerator(init); - map2 = new SourceMapGenerator(init); - - map1.addMapping(fullMapping1); - map1.addMapping(fullMapping1); - - map2.addMapping(fullMapping1); - - util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); - - map1.addMapping(fullMapping2); - map1.addMapping(fullMapping1); - - map2.addMapping(fullMapping2); - - util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON()); - }; - - exports['test github issue #72, check for duplicate names or sources'] = function (assert, util) { - var map = new SourceMapGenerator({ - file: 'test.js' - }); - map.addMapping({ - generated: { line: 1, column: 1 }, - original: { line: 2, column: 2 }, - source: 'a.js', - name: 'foo' - }); - map.addMapping({ - generated: { line: 3, column: 3 }, - original: { line: 4, column: 4 }, - source: 'a.js', - name: 'foo' - }); - util.assertEqualMaps(assert, map.toJSON(), { - version: 3, - file: 'test.js', - sources: ['a.js'], - names: ['foo'], - mappings: 'CACEA;;GAEEA' - }); - }; - - exports['test setting sourcesContent to null when already null'] = function (assert, util) { - var smg = new SourceMapGenerator({ file: "foo.js" }); - assert.doesNotThrow(function() { - smg.setSourceContent("bar.js", null); - }); - }; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-node.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-node.js deleted file mode 100644 index 139af4e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-source-node.js +++ /dev/null @@ -1,612 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator; - var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer; - var SourceNode = require('../../lib/source-map/source-node').SourceNode; - - function forEachNewline(fn) { - return function (assert, util) { - ['\n', '\r\n'].forEach(fn.bind(null, assert, util)); - } - } - - exports['test .add()'] = function (assert, util) { - var node = new SourceNode(null, null, null); - - // Adding a string works. - node.add('function noop() {}'); - - // Adding another source node works. - node.add(new SourceNode(null, null, null)); - - // Adding an array works. - node.add(['function foo() {', - new SourceNode(null, null, null, - 'return 10;'), - '}']); - - // Adding other stuff doesn't. - assert.throws(function () { - node.add({}); - }); - assert.throws(function () { - node.add(function () {}); - }); - }; - - exports['test .prepend()'] = function (assert, util) { - var node = new SourceNode(null, null, null); - - // Prepending a string works. - node.prepend('function noop() {}'); - assert.equal(node.children[0], 'function noop() {}'); - assert.equal(node.children.length, 1); - - // Prepending another source node works. - node.prepend(new SourceNode(null, null, null)); - assert.equal(node.children[0], ''); - assert.equal(node.children[1], 'function noop() {}'); - assert.equal(node.children.length, 2); - - // Prepending an array works. - node.prepend(['function foo() {', - new SourceNode(null, null, null, - 'return 10;'), - '}']); - assert.equal(node.children[0], 'function foo() {'); - assert.equal(node.children[1], 'return 10;'); - assert.equal(node.children[2], '}'); - assert.equal(node.children[3], ''); - assert.equal(node.children[4], 'function noop() {}'); - assert.equal(node.children.length, 5); - - // Prepending other stuff doesn't. - assert.throws(function () { - node.prepend({}); - }); - assert.throws(function () { - node.prepend(function () {}); - }); - }; - - exports['test .toString()'] = function (assert, util) { - assert.equal((new SourceNode(null, null, null, - ['function foo() {', - new SourceNode(null, null, null, 'return 10;'), - '}'])).toString(), - 'function foo() {return 10;}'); - }; - - exports['test .join()'] = function (assert, util) { - assert.equal((new SourceNode(null, null, null, - ['a', 'b', 'c', 'd'])).join(', ').toString(), - 'a, b, c, d'); - }; - - exports['test .walk()'] = function (assert, util) { - var node = new SourceNode(null, null, null, - ['(function () {\n', - ' ', new SourceNode(1, 0, 'a.js', ['someCall()']), ';\n', - ' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';\n', - '}());']); - var expected = [ - { str: '(function () {\n', source: null, line: null, column: null }, - { str: ' ', source: null, line: null, column: null }, - { str: 'someCall()', source: 'a.js', line: 1, column: 0 }, - { str: ';\n', source: null, line: null, column: null }, - { str: ' ', source: null, line: null, column: null }, - { str: 'if (foo) bar()', source: 'b.js', line: 2, column: 0 }, - { str: ';\n', source: null, line: null, column: null }, - { str: '}());', source: null, line: null, column: null }, - ]; - var i = 0; - node.walk(function (chunk, loc) { - assert.equal(expected[i].str, chunk); - assert.equal(expected[i].source, loc.source); - assert.equal(expected[i].line, loc.line); - assert.equal(expected[i].column, loc.column); - i++; - }); - }; - - exports['test .replaceRight'] = function (assert, util) { - var node; - - // Not nested - node = new SourceNode(null, null, null, 'hello world'); - node.replaceRight(/world/, 'universe'); - assert.equal(node.toString(), 'hello universe'); - - // Nested - node = new SourceNode(null, null, null, - [new SourceNode(null, null, null, 'hey sexy mama, '), - new SourceNode(null, null, null, 'want to kill all humans?')]); - node.replaceRight(/kill all humans/, 'watch Futurama'); - assert.equal(node.toString(), 'hey sexy mama, want to watch Futurama?'); - }; - - exports['test .toStringWithSourceMap()'] = forEachNewline(function (assert, util, nl) { - var node = new SourceNode(null, null, null, - ['(function () {' + nl, - ' ', - new SourceNode(1, 0, 'a.js', 'someCall', 'originalCall'), - new SourceNode(1, 8, 'a.js', '()'), - ';' + nl, - ' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';' + nl, - '}());']); - var result = node.toStringWithSourceMap({ - file: 'foo.js' - }); - - assert.equal(result.code, [ - '(function () {', - ' someCall();', - ' if (foo) bar();', - '}());' - ].join(nl)); - - var map = result.map; - var mapWithoutOptions = node.toStringWithSourceMap().map; - - assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); - assert.ok(mapWithoutOptions instanceof SourceMapGenerator, 'mapWithoutOptions instanceof SourceMapGenerator'); - assert.ok(!('file' in mapWithoutOptions)); - mapWithoutOptions._file = 'foo.js'; - util.assertEqualMaps(assert, map.toJSON(), mapWithoutOptions.toJSON()); - - map = new SourceMapConsumer(map.toString()); - - var actual; - - actual = map.originalPositionFor({ - line: 1, - column: 4 - }); - assert.equal(actual.source, null); - assert.equal(actual.line, null); - assert.equal(actual.column, null); - - actual = map.originalPositionFor({ - line: 2, - column: 2 - }); - assert.equal(actual.source, 'a.js'); - assert.equal(actual.line, 1); - assert.equal(actual.column, 0); - assert.equal(actual.name, 'originalCall'); - - actual = map.originalPositionFor({ - line: 3, - column: 2 - }); - assert.equal(actual.source, 'b.js'); - assert.equal(actual.line, 2); - assert.equal(actual.column, 0); - - actual = map.originalPositionFor({ - line: 3, - column: 16 - }); - assert.equal(actual.source, null); - assert.equal(actual.line, null); - assert.equal(actual.column, null); - - actual = map.originalPositionFor({ - line: 4, - column: 2 - }); - assert.equal(actual.source, null); - assert.equal(actual.line, null); - assert.equal(actual.column, null); - }); - - exports['test .fromStringWithSourceMap()'] = forEachNewline(function (assert, util, nl) { - var testCode = util.testGeneratedCode.replace(/\n/g, nl); - var node = SourceNode.fromStringWithSourceMap( - testCode, - new SourceMapConsumer(util.testMap)); - - var result = node.toStringWithSourceMap({ - file: 'min.js' - }); - var map = result.map; - var code = result.code; - - assert.equal(code, testCode); - assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); - map = map.toJSON(); - assert.equal(map.version, util.testMap.version); - assert.equal(map.file, util.testMap.file); - assert.equal(map.mappings, util.testMap.mappings); - }); - - exports['test .fromStringWithSourceMap() empty map'] = forEachNewline(function (assert, util, nl) { - var node = SourceNode.fromStringWithSourceMap( - util.testGeneratedCode.replace(/\n/g, nl), - new SourceMapConsumer(util.emptyMap)); - var result = node.toStringWithSourceMap({ - file: 'min.js' - }); - var map = result.map; - var code = result.code; - - assert.equal(code, util.testGeneratedCode.replace(/\n/g, nl)); - assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); - map = map.toJSON(); - assert.equal(map.version, util.emptyMap.version); - assert.equal(map.file, util.emptyMap.file); - assert.equal(map.mappings.length, util.emptyMap.mappings.length); - assert.equal(map.mappings, util.emptyMap.mappings); - }); - - exports['test .fromStringWithSourceMap() complex version'] = forEachNewline(function (assert, util, nl) { - var input = new SourceNode(null, null, null, [ - "(function() {" + nl, - " var Test = {};" + nl, - " ", new SourceNode(1, 0, "a.js", "Test.A = { value: 1234 };" + nl), - " ", new SourceNode(2, 0, "a.js", "Test.A.x = 'xyz';"), nl, - "}());" + nl, - "/* Generated Source */"]); - input = input.toStringWithSourceMap({ - file: 'foo.js' - }); - - var node = SourceNode.fromStringWithSourceMap( - input.code, - new SourceMapConsumer(input.map.toString())); - - var result = node.toStringWithSourceMap({ - file: 'foo.js' - }); - var map = result.map; - var code = result.code; - - assert.equal(code, input.code); - assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); - map = map.toJSON(); - var inputMap = input.map.toJSON(); - util.assertEqualMaps(assert, map, inputMap); - }); - - exports['test .fromStringWithSourceMap() third argument'] = function (assert, util) { - // Assume the following directory structure: - // - // http://foo.org/ - // bar.coffee - // app/ - // coffee/ - // foo.coffee - // coffeeBundle.js # Made from {foo,bar,baz}.coffee - // maps/ - // coffeeBundle.js.map - // js/ - // foo.js - // public/ - // app.js # Made from {foo,coffeeBundle}.js - // app.js.map - // - // http://www.example.com/ - // baz.coffee - - var coffeeBundle = new SourceNode(1, 0, 'foo.coffee', 'foo(coffee);\n'); - coffeeBundle.setSourceContent('foo.coffee', 'foo coffee'); - coffeeBundle.add(new SourceNode(2, 0, '/bar.coffee', 'bar(coffee);\n')); - coffeeBundle.add(new SourceNode(3, 0, 'http://www.example.com/baz.coffee', 'baz(coffee);')); - coffeeBundle = coffeeBundle.toStringWithSourceMap({ - file: 'foo.js', - sourceRoot: '..' - }); - - var foo = new SourceNode(1, 0, 'foo.js', 'foo(js);'); - - var test = function(relativePath, expectedSources) { - var app = new SourceNode(); - app.add(SourceNode.fromStringWithSourceMap( - coffeeBundle.code, - new SourceMapConsumer(coffeeBundle.map.toString()), - relativePath)); - app.add(foo); - var i = 0; - app.walk(function (chunk, loc) { - assert.equal(loc.source, expectedSources[i]); - i++; - }); - app.walkSourceContents(function (sourceFile, sourceContent) { - assert.equal(sourceFile, expectedSources[0]); - assert.equal(sourceContent, 'foo coffee'); - }) - }; - - test('../coffee/maps', [ - '../coffee/foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee', - 'foo.js' - ]); - - // If the third parameter is omitted or set to the current working - // directory we get incorrect source paths: - - test(undefined, [ - '../foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee', - 'foo.js' - ]); - - test('', [ - '../foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee', - 'foo.js' - ]); - - test('.', [ - '../foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee', - 'foo.js' - ]); - - test('./', [ - '../foo.coffee', - '/bar.coffee', - 'http://www.example.com/baz.coffee', - 'foo.js' - ]); - }; - - exports['test .toStringWithSourceMap() merging duplicate mappings'] = forEachNewline(function (assert, util, nl) { - var input = new SourceNode(null, null, null, [ - new SourceNode(1, 0, "a.js", "(function"), - new SourceNode(1, 0, "a.js", "() {" + nl), - " ", - new SourceNode(1, 0, "a.js", "var Test = "), - new SourceNode(1, 0, "b.js", "{};" + nl), - new SourceNode(2, 0, "b.js", "Test"), - new SourceNode(2, 0, "b.js", ".A", "A"), - new SourceNode(2, 20, "b.js", " = { value: ", "A"), - "1234", - new SourceNode(2, 40, "b.js", " };" + nl, "A"), - "}());" + nl, - "/* Generated Source */" - ]); - input = input.toStringWithSourceMap({ - file: 'foo.js' - }); - - assert.equal(input.code, [ - "(function() {", - " var Test = {};", - "Test.A = { value: 1234 };", - "}());", - "/* Generated Source */" - ].join(nl)) - - var correctMap = new SourceMapGenerator({ - file: 'foo.js' - }); - correctMap.addMapping({ - generated: { line: 1, column: 0 }, - source: 'a.js', - original: { line: 1, column: 0 } - }); - // Here is no need for a empty mapping, - // because mappings ends at eol - correctMap.addMapping({ - generated: { line: 2, column: 2 }, - source: 'a.js', - original: { line: 1, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 2, column: 13 }, - source: 'b.js', - original: { line: 1, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 3, column: 0 }, - source: 'b.js', - original: { line: 2, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 3, column: 4 }, - source: 'b.js', - name: 'A', - original: { line: 2, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 3, column: 6 }, - source: 'b.js', - name: 'A', - original: { line: 2, column: 20 } - }); - // This empty mapping is required, - // because there is a hole in the middle of the line - correctMap.addMapping({ - generated: { line: 3, column: 18 } - }); - correctMap.addMapping({ - generated: { line: 3, column: 22 }, - source: 'b.js', - name: 'A', - original: { line: 2, column: 40 } - }); - // Here is no need for a empty mapping, - // because mappings ends at eol - - var inputMap = input.map.toJSON(); - correctMap = correctMap.toJSON(); - util.assertEqualMaps(assert, inputMap, correctMap); - }); - - exports['test .toStringWithSourceMap() multi-line SourceNodes'] = forEachNewline(function (assert, util, nl) { - var input = new SourceNode(null, null, null, [ - new SourceNode(1, 0, "a.js", "(function() {" + nl + "var nextLine = 1;" + nl + "anotherLine();" + nl), - new SourceNode(2, 2, "b.js", "Test.call(this, 123);" + nl), - new SourceNode(2, 2, "b.js", "this['stuff'] = 'v';" + nl), - new SourceNode(2, 2, "b.js", "anotherLine();" + nl), - "/*" + nl + "Generated" + nl + "Source" + nl + "*/" + nl, - new SourceNode(3, 4, "c.js", "anotherLine();" + nl), - "/*" + nl + "Generated" + nl + "Source" + nl + "*/" - ]); - input = input.toStringWithSourceMap({ - file: 'foo.js' - }); - - assert.equal(input.code, [ - "(function() {", - "var nextLine = 1;", - "anotherLine();", - "Test.call(this, 123);", - "this['stuff'] = 'v';", - "anotherLine();", - "/*", - "Generated", - "Source", - "*/", - "anotherLine();", - "/*", - "Generated", - "Source", - "*/" - ].join(nl)); - - var correctMap = new SourceMapGenerator({ - file: 'foo.js' - }); - correctMap.addMapping({ - generated: { line: 1, column: 0 }, - source: 'a.js', - original: { line: 1, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 2, column: 0 }, - source: 'a.js', - original: { line: 1, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 3, column: 0 }, - source: 'a.js', - original: { line: 1, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 4, column: 0 }, - source: 'b.js', - original: { line: 2, column: 2 } - }); - correctMap.addMapping({ - generated: { line: 5, column: 0 }, - source: 'b.js', - original: { line: 2, column: 2 } - }); - correctMap.addMapping({ - generated: { line: 6, column: 0 }, - source: 'b.js', - original: { line: 2, column: 2 } - }); - correctMap.addMapping({ - generated: { line: 11, column: 0 }, - source: 'c.js', - original: { line: 3, column: 4 } - }); - - var inputMap = input.map.toJSON(); - correctMap = correctMap.toJSON(); - util.assertEqualMaps(assert, inputMap, correctMap); - }); - - exports['test .toStringWithSourceMap() with empty string'] = function (assert, util) { - var node = new SourceNode(1, 0, 'empty.js', ''); - var result = node.toStringWithSourceMap(); - assert.equal(result.code, ''); - }; - - exports['test .toStringWithSourceMap() with consecutive newlines'] = forEachNewline(function (assert, util, nl) { - var input = new SourceNode(null, null, null, [ - "/***/" + nl + nl, - new SourceNode(1, 0, "a.js", "'use strict';" + nl), - new SourceNode(2, 0, "a.js", "a();"), - ]); - input = input.toStringWithSourceMap({ - file: 'foo.js' - }); - - assert.equal(input.code, [ - "/***/", - "", - "'use strict';", - "a();", - ].join(nl)); - - var correctMap = new SourceMapGenerator({ - file: 'foo.js' - }); - correctMap.addMapping({ - generated: { line: 3, column: 0 }, - source: 'a.js', - original: { line: 1, column: 0 } - }); - correctMap.addMapping({ - generated: { line: 4, column: 0 }, - source: 'a.js', - original: { line: 2, column: 0 } - }); - - var inputMap = input.map.toJSON(); - correctMap = correctMap.toJSON(); - util.assertEqualMaps(assert, inputMap, correctMap); - }); - - exports['test setSourceContent with toStringWithSourceMap'] = function (assert, util) { - var aNode = new SourceNode(1, 1, 'a.js', 'a'); - aNode.setSourceContent('a.js', 'someContent'); - var node = new SourceNode(null, null, null, - ['(function () {\n', - ' ', aNode, - ' ', new SourceNode(1, 1, 'b.js', 'b'), - '}());']); - node.setSourceContent('b.js', 'otherContent'); - var map = node.toStringWithSourceMap({ - file: 'foo.js' - }).map; - - assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator'); - map = new SourceMapConsumer(map.toString()); - - assert.equal(map.sources.length, 2); - assert.equal(map.sources[0], 'a.js'); - assert.equal(map.sources[1], 'b.js'); - assert.equal(map.sourcesContent.length, 2); - assert.equal(map.sourcesContent[0], 'someContent'); - assert.equal(map.sourcesContent[1], 'otherContent'); - }; - - exports['test walkSourceContents'] = function (assert, util) { - var aNode = new SourceNode(1, 1, 'a.js', 'a'); - aNode.setSourceContent('a.js', 'someContent'); - var node = new SourceNode(null, null, null, - ['(function () {\n', - ' ', aNode, - ' ', new SourceNode(1, 1, 'b.js', 'b'), - '}());']); - node.setSourceContent('b.js', 'otherContent'); - var results = []; - node.walkSourceContents(function (sourceFile, sourceContent) { - results.push([sourceFile, sourceContent]); - }); - assert.equal(results.length, 2); - assert.equal(results[0][0], 'a.js'); - assert.equal(results[0][1], 'someContent'); - assert.equal(results[1][0], 'b.js'); - assert.equal(results[1][1], 'otherContent'); - }; -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-util.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-util.js deleted file mode 100644 index 997d1a2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/test-util.js +++ /dev/null @@ -1,216 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2014 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var libUtil = require('../../lib/source-map/util'); - - exports['test urls'] = function (assert, util) { - var assertUrl = function (url) { - assert.equal(url, libUtil.urlGenerate(libUtil.urlParse(url))); - }; - assertUrl('http://'); - assertUrl('http://www.example.com'); - assertUrl('http://user:pass@www.example.com'); - assertUrl('http://www.example.com:80'); - assertUrl('http://www.example.com/'); - assertUrl('http://www.example.com/foo/bar'); - assertUrl('http://www.example.com/foo/bar/'); - assertUrl('http://user:pass@www.example.com:80/foo/bar/'); - - assertUrl('//'); - assertUrl('//www.example.com'); - assertUrl('file:///www.example.com'); - - assert.equal(libUtil.urlParse(''), null); - assert.equal(libUtil.urlParse('.'), null); - assert.equal(libUtil.urlParse('..'), null); - assert.equal(libUtil.urlParse('a'), null); - assert.equal(libUtil.urlParse('a/b'), null); - assert.equal(libUtil.urlParse('a//b'), null); - assert.equal(libUtil.urlParse('/a'), null); - assert.equal(libUtil.urlParse('data:foo,bar'), null); - }; - - exports['test normalize()'] = function (assert, util) { - assert.equal(libUtil.normalize('/..'), '/'); - assert.equal(libUtil.normalize('/../'), '/'); - assert.equal(libUtil.normalize('/../../../..'), '/'); - assert.equal(libUtil.normalize('/../../../../a/b/c'), '/a/b/c'); - assert.equal(libUtil.normalize('/a/b/c/../../../d/../../e'), '/e'); - - assert.equal(libUtil.normalize('..'), '..'); - assert.equal(libUtil.normalize('../'), '../'); - assert.equal(libUtil.normalize('../../a/'), '../../a/'); - assert.equal(libUtil.normalize('a/..'), '.'); - assert.equal(libUtil.normalize('a/../../..'), '../..'); - - assert.equal(libUtil.normalize('/.'), '/'); - assert.equal(libUtil.normalize('/./'), '/'); - assert.equal(libUtil.normalize('/./././.'), '/'); - assert.equal(libUtil.normalize('/././././a/b/c'), '/a/b/c'); - assert.equal(libUtil.normalize('/a/b/c/./././d/././e'), '/a/b/c/d/e'); - - assert.equal(libUtil.normalize(''), '.'); - assert.equal(libUtil.normalize('.'), '.'); - assert.equal(libUtil.normalize('./'), '.'); - assert.equal(libUtil.normalize('././a'), 'a'); - assert.equal(libUtil.normalize('a/./'), 'a/'); - assert.equal(libUtil.normalize('a/././.'), 'a'); - - assert.equal(libUtil.normalize('/a/b//c////d/////'), '/a/b/c/d/'); - assert.equal(libUtil.normalize('///a/b//c////d/////'), '///a/b/c/d/'); - assert.equal(libUtil.normalize('a/b//c////d'), 'a/b/c/d'); - - assert.equal(libUtil.normalize('.///.././../a/b//./..'), '../../a') - - assert.equal(libUtil.normalize('http://www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.normalize('http://www.example.com/'), 'http://www.example.com/'); - assert.equal(libUtil.normalize('http://www.example.com/./..//a/b/c/.././d//'), 'http://www.example.com/a/b/d/'); - }; - - exports['test join()'] = function (assert, util) { - assert.equal(libUtil.join('a', 'b'), 'a/b'); - assert.equal(libUtil.join('a/', 'b'), 'a/b'); - assert.equal(libUtil.join('a//', 'b'), 'a/b'); - assert.equal(libUtil.join('a', 'b/'), 'a/b/'); - assert.equal(libUtil.join('a', 'b//'), 'a/b/'); - assert.equal(libUtil.join('a/', '/b'), '/b'); - assert.equal(libUtil.join('a//', '//b'), '//b'); - - assert.equal(libUtil.join('a', '..'), '.'); - assert.equal(libUtil.join('a', '../b'), 'b'); - assert.equal(libUtil.join('a/b', '../c'), 'a/c'); - - assert.equal(libUtil.join('a', '.'), 'a'); - assert.equal(libUtil.join('a', './b'), 'a/b'); - assert.equal(libUtil.join('a/b', './c'), 'a/b/c'); - - assert.equal(libUtil.join('a', 'http://www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.join('a', 'data:foo,bar'), 'data:foo,bar'); - - - assert.equal(libUtil.join('', 'b'), 'b'); - assert.equal(libUtil.join('.', 'b'), 'b'); - assert.equal(libUtil.join('', 'b/'), 'b/'); - assert.equal(libUtil.join('.', 'b/'), 'b/'); - assert.equal(libUtil.join('', 'b//'), 'b/'); - assert.equal(libUtil.join('.', 'b//'), 'b/'); - - assert.equal(libUtil.join('', '..'), '..'); - assert.equal(libUtil.join('.', '..'), '..'); - assert.equal(libUtil.join('', '../b'), '../b'); - assert.equal(libUtil.join('.', '../b'), '../b'); - - assert.equal(libUtil.join('', '.'), '.'); - assert.equal(libUtil.join('.', '.'), '.'); - assert.equal(libUtil.join('', './b'), 'b'); - assert.equal(libUtil.join('.', './b'), 'b'); - - assert.equal(libUtil.join('', 'http://www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.join('.', 'http://www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.join('', 'data:foo,bar'), 'data:foo,bar'); - assert.equal(libUtil.join('.', 'data:foo,bar'), 'data:foo,bar'); - - - assert.equal(libUtil.join('..', 'b'), '../b'); - assert.equal(libUtil.join('..', 'b/'), '../b/'); - assert.equal(libUtil.join('..', 'b//'), '../b/'); - - assert.equal(libUtil.join('..', '..'), '../..'); - assert.equal(libUtil.join('..', '../b'), '../../b'); - - assert.equal(libUtil.join('..', '.'), '..'); - assert.equal(libUtil.join('..', './b'), '../b'); - - assert.equal(libUtil.join('..', 'http://www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.join('..', 'data:foo,bar'), 'data:foo,bar'); - - - assert.equal(libUtil.join('a', ''), 'a'); - assert.equal(libUtil.join('a', '.'), 'a'); - assert.equal(libUtil.join('a/', ''), 'a'); - assert.equal(libUtil.join('a/', '.'), 'a'); - assert.equal(libUtil.join('a//', ''), 'a'); - assert.equal(libUtil.join('a//', '.'), 'a'); - assert.equal(libUtil.join('/a', ''), '/a'); - assert.equal(libUtil.join('/a', '.'), '/a'); - assert.equal(libUtil.join('', ''), '.'); - assert.equal(libUtil.join('.', ''), '.'); - assert.equal(libUtil.join('.', ''), '.'); - assert.equal(libUtil.join('.', '.'), '.'); - assert.equal(libUtil.join('..', ''), '..'); - assert.equal(libUtil.join('..', '.'), '..'); - assert.equal(libUtil.join('http://foo.org/a', ''), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/a', '.'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/a/', ''), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/a/', '.'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/a//', ''), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/a//', '.'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org', ''), 'http://foo.org/'); - assert.equal(libUtil.join('http://foo.org', '.'), 'http://foo.org/'); - assert.equal(libUtil.join('http://foo.org/', ''), 'http://foo.org/'); - assert.equal(libUtil.join('http://foo.org/', '.'), 'http://foo.org/'); - assert.equal(libUtil.join('http://foo.org//', ''), 'http://foo.org/'); - assert.equal(libUtil.join('http://foo.org//', '.'), 'http://foo.org/'); - assert.equal(libUtil.join('//www.example.com', ''), '//www.example.com/'); - assert.equal(libUtil.join('//www.example.com', '.'), '//www.example.com/'); - - - assert.equal(libUtil.join('http://foo.org/a', 'b'), 'http://foo.org/a/b'); - assert.equal(libUtil.join('http://foo.org/a/', 'b'), 'http://foo.org/a/b'); - assert.equal(libUtil.join('http://foo.org/a//', 'b'), 'http://foo.org/a/b'); - assert.equal(libUtil.join('http://foo.org/a', 'b/'), 'http://foo.org/a/b/'); - assert.equal(libUtil.join('http://foo.org/a', 'b//'), 'http://foo.org/a/b/'); - assert.equal(libUtil.join('http://foo.org/a/', '/b'), 'http://foo.org/b'); - assert.equal(libUtil.join('http://foo.org/a//', '//b'), 'http://b'); - - assert.equal(libUtil.join('http://foo.org/a', '..'), 'http://foo.org/'); - assert.equal(libUtil.join('http://foo.org/a', '../b'), 'http://foo.org/b'); - assert.equal(libUtil.join('http://foo.org/a/b', '../c'), 'http://foo.org/a/c'); - - assert.equal(libUtil.join('http://foo.org/a', '.'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/a', './b'), 'http://foo.org/a/b'); - assert.equal(libUtil.join('http://foo.org/a/b', './c'), 'http://foo.org/a/b/c'); - - assert.equal(libUtil.join('http://foo.org/a', 'http://www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.join('http://foo.org/a', 'data:foo,bar'), 'data:foo,bar'); - - - assert.equal(libUtil.join('http://foo.org', 'a'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/', 'a'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org//', 'a'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org', '/a'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org/', '/a'), 'http://foo.org/a'); - assert.equal(libUtil.join('http://foo.org//', '/a'), 'http://foo.org/a'); - - - assert.equal(libUtil.join('http://', 'www.example.com'), 'http://www.example.com'); - assert.equal(libUtil.join('file:///', 'www.example.com'), 'file:///www.example.com'); - assert.equal(libUtil.join('http://', 'ftp://example.com'), 'ftp://example.com'); - - assert.equal(libUtil.join('http://www.example.com', '//foo.org/bar'), 'http://foo.org/bar'); - assert.equal(libUtil.join('//www.example.com', '//foo.org/bar'), '//foo.org/bar'); - }; - - // TODO Issue #128: Define and test this function properly. - exports['test relative()'] = function (assert, util) { - assert.equal(libUtil.relative('/the/root', '/the/root/one.js'), 'one.js'); - assert.equal(libUtil.relative('/the/root', '/the/rootone.js'), '/the/rootone.js'); - - assert.equal(libUtil.relative('', '/the/root/one.js'), '/the/root/one.js'); - assert.equal(libUtil.relative('.', '/the/root/one.js'), '/the/root/one.js'); - assert.equal(libUtil.relative('', 'the/root/one.js'), 'the/root/one.js'); - assert.equal(libUtil.relative('.', 'the/root/one.js'), 'the/root/one.js'); - - assert.equal(libUtil.relative('/', '/the/root/one.js'), 'the/root/one.js'); - assert.equal(libUtil.relative('/', 'the/root/one.js'), 'the/root/one.js'); - }; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/util.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/util.js deleted file mode 100644 index 56bbe2c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/source-map/test/source-map/util.js +++ /dev/null @@ -1,192 +0,0 @@ -/* -*- Mode: js; js-indent-level: 2; -*- */ -/* - * Copyright 2011 Mozilla Foundation and contributors - * Licensed under the New BSD license. See LICENSE or: - * http://opensource.org/licenses/BSD-3-Clause - */ -if (typeof define !== 'function') { - var define = require('amdefine')(module, require); -} -define(function (require, exports, module) { - - var util = require('../../lib/source-map/util'); - - // This is a test mapping which maps functions from two different files - // (one.js and two.js) to a minified generated source. - // - // Here is one.js: - // - // ONE.foo = function (bar) { - // return baz(bar); - // }; - // - // Here is two.js: - // - // TWO.inc = function (n) { - // return n + 1; - // }; - // - // And here is the generated code (min.js): - // - // ONE.foo=function(a){return baz(a);}; - // TWO.inc=function(a){return a+1;}; - exports.testGeneratedCode = " ONE.foo=function(a){return baz(a);};\n"+ - " TWO.inc=function(a){return a+1;};"; - exports.testMap = { - version: 3, - file: 'min.js', - names: ['bar', 'baz', 'n'], - sources: ['one.js', 'two.js'], - sourceRoot: '/the/root', - mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' - }; - exports.testMapNoSourceRoot = { - version: 3, - file: 'min.js', - names: ['bar', 'baz', 'n'], - sources: ['one.js', 'two.js'], - mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' - }; - exports.testMapEmptySourceRoot = { - version: 3, - file: 'min.js', - names: ['bar', 'baz', 'n'], - sources: ['one.js', 'two.js'], - sourceRoot: '', - mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' - }; - exports.testMapWithSourcesContent = { - version: 3, - file: 'min.js', - names: ['bar', 'baz', 'n'], - sources: ['one.js', 'two.js'], - sourcesContent: [ - ' ONE.foo = function (bar) {\n' + - ' return baz(bar);\n' + - ' };', - ' TWO.inc = function (n) {\n' + - ' return n + 1;\n' + - ' };' - ], - sourceRoot: '/the/root', - mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' - }; - exports.testMapRelativeSources = { - version: 3, - file: 'min.js', - names: ['bar', 'baz', 'n'], - sources: ['./one.js', './two.js'], - sourcesContent: [ - ' ONE.foo = function (bar) {\n' + - ' return baz(bar);\n' + - ' };', - ' TWO.inc = function (n) {\n' + - ' return n + 1;\n' + - ' };' - ], - sourceRoot: '/the/root', - mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' - }; - exports.emptyMap = { - version: 3, - file: 'min.js', - names: [], - sources: [], - mappings: '' - }; - - - function assertMapping(generatedLine, generatedColumn, originalSource, - originalLine, originalColumn, name, map, assert, - dontTestGenerated, dontTestOriginal) { - if (!dontTestOriginal) { - var origMapping = map.originalPositionFor({ - line: generatedLine, - column: generatedColumn - }); - assert.equal(origMapping.name, name, - 'Incorrect name, expected ' + JSON.stringify(name) - + ', got ' + JSON.stringify(origMapping.name)); - assert.equal(origMapping.line, originalLine, - 'Incorrect line, expected ' + JSON.stringify(originalLine) - + ', got ' + JSON.stringify(origMapping.line)); - assert.equal(origMapping.column, originalColumn, - 'Incorrect column, expected ' + JSON.stringify(originalColumn) - + ', got ' + JSON.stringify(origMapping.column)); - - var expectedSource; - - if (originalSource && map.sourceRoot && originalSource.indexOf(map.sourceRoot) === 0) { - expectedSource = originalSource; - } else if (originalSource) { - expectedSource = map.sourceRoot - ? util.join(map.sourceRoot, originalSource) - : originalSource; - } else { - expectedSource = null; - } - - assert.equal(origMapping.source, expectedSource, - 'Incorrect source, expected ' + JSON.stringify(expectedSource) - + ', got ' + JSON.stringify(origMapping.source)); - } - - if (!dontTestGenerated) { - var genMapping = map.generatedPositionFor({ - source: originalSource, - line: originalLine, - column: originalColumn - }); - assert.equal(genMapping.line, generatedLine, - 'Incorrect line, expected ' + JSON.stringify(generatedLine) - + ', got ' + JSON.stringify(genMapping.line)); - assert.equal(genMapping.column, generatedColumn, - 'Incorrect column, expected ' + JSON.stringify(generatedColumn) - + ', got ' + JSON.stringify(genMapping.column)); - } - } - exports.assertMapping = assertMapping; - - function assertEqualMaps(assert, actualMap, expectedMap) { - assert.equal(actualMap.version, expectedMap.version, "version mismatch"); - assert.equal(actualMap.file, expectedMap.file, "file mismatch"); - assert.equal(actualMap.names.length, - expectedMap.names.length, - "names length mismatch: " + - actualMap.names.join(", ") + " != " + expectedMap.names.join(", ")); - for (var i = 0; i < actualMap.names.length; i++) { - assert.equal(actualMap.names[i], - expectedMap.names[i], - "names[" + i + "] mismatch: " + - actualMap.names.join(", ") + " != " + expectedMap.names.join(", ")); - } - assert.equal(actualMap.sources.length, - expectedMap.sources.length, - "sources length mismatch: " + - actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", ")); - for (var i = 0; i < actualMap.sources.length; i++) { - assert.equal(actualMap.sources[i], - expectedMap.sources[i], - "sources[" + i + "] length mismatch: " + - actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", ")); - } - assert.equal(actualMap.sourceRoot, - expectedMap.sourceRoot, - "sourceRoot mismatch: " + - actualMap.sourceRoot + " != " + expectedMap.sourceRoot); - assert.equal(actualMap.mappings, expectedMap.mappings, - "mappings mismatch:\nActual: " + actualMap.mappings + "\nExpected: " + expectedMap.mappings); - if (actualMap.sourcesContent) { - assert.equal(actualMap.sourcesContent.length, - expectedMap.sourcesContent.length, - "sourcesContent length mismatch"); - for (var i = 0; i < actualMap.sourcesContent.length; i++) { - assert.equal(actualMap.sourcesContent[i], - expectedMap.sourcesContent[i], - "sourcesContent[" + i + "] mismatch"); - } - } - } - exports.assertEqualMaps = assertEqualMaps; - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.npmignore deleted file mode 100644 index 94fceeb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -tmp/ -node_modules/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.travis.yml deleted file mode 100644 index d959127..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: node_js -node_js: - - "0.4" - - "0.6" - - "0.8" - - "0.10" - - "0.11" diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/LICENSE deleted file mode 100644 index dd7706f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -UglifyJS is released under the BSD license: - -Copyright 2012-2013 (c) Mihai Bazon - -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. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/README.md deleted file mode 100644 index 749b8ce..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/README.md +++ /dev/null @@ -1,588 +0,0 @@ -UglifyJS 2 -========== -[![Build Status](https://travis-ci.org/mishoo/UglifyJS2.png)](https://travis-ci.org/mishoo/UglifyJS2) - -UglifyJS is a JavaScript parser, minifier, compressor or beautifier toolkit. - -This page documents the command line utility. For -[API and internals documentation see my website](http://lisperator.net/uglifyjs/). -There's also an -[in-browser online demo](http://lisperator.net/uglifyjs/#demo) (for Firefox, -Chrome and probably Safari). - -Install -------- - -First make sure you have installed the latest version of [node.js](http://nodejs.org/) -(You may need to restart your computer after this step). - -From NPM for use as a command line app: - - npm install uglify-js -g - -From NPM for programmatic use: - - npm install uglify-js - -From Git: - - git clone git://github.com/mishoo/UglifyJS2.git - cd UglifyJS2 - npm link . - -Usage ------ - - uglifyjs [input files] [options] - -UglifyJS2 can take multiple input files. It's recommended that you pass the -input files first, then pass the options. UglifyJS will parse input files -in sequence and apply any compression options. The files are parsed in the -same global scope, that is, a reference from a file to some -variable/function declared in another file will be matched properly. - -If you want to read from STDIN instead, pass a single dash instead of input -files. - -The available options are: - - --source-map Specify an output file where to generate source map. - [string] - --source-map-root The path to the original source to be included in the - source map. [string] - --source-map-url The path to the source map to be added in //@ - sourceMappingURL. Defaults to the value passed with - --source-map. [string] - --in-source-map Input source map, useful if you're compressing JS that was - generated from some other original code. - --screw-ie8 Pass this flag if you don't care about full compliance with - Internet Explorer 6-8 quirks (by default UglifyJS will try - to be IE-proof). - -p, --prefix Skip prefix for original filenames that appear in source - maps. For example -p 3 will drop 3 directories from file - names and ensure they are relative paths. - -o, --output Output file (default STDOUT). - -b, --beautify Beautify output/specify output options. [string] - -m, --mangle Mangle names/pass mangler options. [string] - -r, --reserved Reserved names to exclude from mangling. - -c, --compress Enable compressor/pass compressor options. Pass options - like -c hoist_vars=false,if_return=false. Use -c with no - argument to use the default compression options. [string] - -d, --define Global definitions [string] - --comments Preserve copyright comments in the output. By default this - works like Google Closure, keeping JSDoc-style comments - that contain "@license" or "@preserve". You can optionally - pass one of the following arguments to this flag: - - "all" to keep all comments - - a valid JS regexp (needs to start with a slash) to keep - only comments that match. - Note that currently not *all* comments can be kept when - compression is on, because of dead code removal or - cascading statements into sequences. [string] - --stats Display operations run time on STDERR. [boolean] - --acorn Use Acorn for parsing. [boolean] - --spidermonkey Assume input files are SpiderMonkey AST format (as JSON). - [boolean] - --self Build itself (UglifyJS2) as a library (implies - --wrap=UglifyJS --export-all) [boolean] - --wrap Embed everything in a big function, making the “exports” - and “global” variables available. You need to pass an - argument to this option to specify the name that your - module will take when included in, say, a browser. - [string] - --export-all Only used when --wrap, this tells UglifyJS to add code to - automatically export all globals. [boolean] - --lint Display some scope warnings [boolean] - -v, --verbose Verbose [boolean] - -V, --version Print version number and exit. [boolean] - -Specify `--output` (`-o`) to declare the output file. Otherwise the output -goes to STDOUT. - -## Source map options - -UglifyJS2 can generate a source map file, which is highly useful for -debugging your compressed JavaScript. To get a source map, pass -`--source-map output.js.map` (full path to the file where you want the -source map dumped). - -Additionally you might need `--source-map-root` to pass the URL where the -original files can be found. In case you are passing full paths to input -files to UglifyJS, you can use `--prefix` (`-p`) to specify the number of -directories to drop from the path prefix when declaring files in the source -map. - -For example: - - uglifyjs /home/doe/work/foo/src/js/file1.js \ - /home/doe/work/foo/src/js/file2.js \ - -o foo.min.js \ - --source-map foo.min.js.map \ - --source-map-root http://foo.com/src \ - -p 5 -c -m - -The above will compress and mangle `file1.js` and `file2.js`, will drop the -output in `foo.min.js` and the source map in `foo.min.js.map`. The source -mapping will refer to `http://foo.com/src/js/file1.js` and -`http://foo.com/src/js/file2.js` (in fact it will list `http://foo.com/src` -as the source map root, and the original files as `js/file1.js` and -`js/file2.js`). - -### Composed source map - -When you're compressing JS code that was output by a compiler such as -CoffeeScript, mapping to the JS code won't be too helpful. Instead, you'd -like to map back to the original code (i.e. CoffeeScript). UglifyJS has an -option to take an input source map. Assuming you have a mapping from -CoffeeScript → compiled JS, UglifyJS can generate a map from CoffeeScript → -compressed JS by mapping every token in the compiled JS to its original -location. - -To use this feature you need to pass `--in-source-map -/path/to/input/source.map`. Normally the input source map should also point -to the file containing the generated JS, so if that's correct you can omit -input files from the command line. - -## Mangler options - -To enable the mangler you need to pass `--mangle` (`-m`). The following -(comma-separated) options are supported: - -- `sort` — to assign shorter names to most frequently used variables. This - saves a few hundred bytes on jQuery before gzip, but the output is - _bigger_ after gzip (and seems to happen for other libraries I tried it - on) therefore it's not enabled by default. - -- `toplevel` — mangle names declared in the toplevel scope (disabled by - default). - -- `eval` — mangle names visible in scopes where `eval` or `when` are used - (disabled by default). - -When mangling is enabled but you want to prevent certain names from being -mangled, you can declare those names with `--reserved` (`-r`) — pass a -comma-separated list of names. For example: - - uglifyjs ... -m -r '$,require,exports' - -to prevent the `require`, `exports` and `$` names from being changed. - -## Compressor options - -You need to pass `--compress` (`-c`) to enable the compressor. Optionally -you can pass a comma-separated list of options. Options are in the form -`foo=bar`, or just `foo` (the latter implies a boolean option that you want -to set `true`; it's effectively a shortcut for `foo=true`). - -- `sequences` -- join consecutive simple statements using the comma operator -- `properties` -- rewrite property access using the dot notation, for - example `foo["bar"] → foo.bar` -- `dead_code` -- remove unreachable code -- `drop_debugger` -- remove `debugger;` statements -- `unsafe` (default: false) -- apply "unsafe" transformations (discussion below) -- `conditionals` -- apply optimizations for `if`-s and conditional - expressions -- `comparisons` -- apply certain optimizations to binary nodes, for example: - `!(a <= b) → a > b` (only when `unsafe`), attempts to negate binary nodes, - e.g. `a = !b && !c && !d && !e → a=!(b||c||d||e)` etc. -- `evaluate` -- attempt to evaluate constant expressions -- `booleans` -- various optimizations for boolean context, for example `!!a - ? b : c → a ? b : c` -- `loops` -- optimizations for `do`, `while` and `for` loops when we can - statically determine the condition -- `unused` -- drop unreferenced functions and variables -- `hoist_funs` -- hoist function declarations -- `hoist_vars` (default: false) -- hoist `var` declarations (this is `false` - by default because it seems to increase the size of the output in general) -- `if_return` -- optimizations for if/return and if/continue -- `join_vars` -- join consecutive `var` statements -- `cascade` -- small optimization for sequences, transform `x, x` into `x` - and `x = something(), x` into `x = something()` -- `warnings` -- display warnings when dropping unreachable code or unused - declarations etc. - -### The `unsafe` option - -It enables some transformations that *might* break code logic in certain -contrived cases, but should be fine for most code. You might want to try it -on your own code, it should reduce the minified size. Here's what happens -when this flag is on: - -- `new Array(1, 2, 3)` or `Array(1, 2, 3)` → `[1, 2, 3 ]` -- `new Object()` → `{}` -- `String(exp)` or `exp.toString()` → `"" + exp` -- `new Object/RegExp/Function/Error/Array (...)` → we discard the `new` -- `typeof foo == "undefined"` → `foo === void 0` -- `void 0` → `"undefined"` (if there is a variable named "undefined" in - scope; we do it because the variable name will be mangled, typically - reduced to a single character). - -### Conditional compilation - -You can use the `--define` (`-d`) switch in order to declare global -variables that UglifyJS will assume to be constants (unless defined in -scope). For example if you pass `--define DEBUG=false` then, coupled with -dead code removal UglifyJS will discard the following from the output: -```javascript -if (DEBUG) { - console.log("debug stuff"); -} -``` - -UglifyJS will warn about the condition being always false and about dropping -unreachable code; for now there is no option to turn off only this specific -warning, you can pass `warnings=false` to turn off *all* warnings. - -Another way of doing that is to declare your globals as constants in a -separate file and include it into the build. For example you can have a -`build/defines.js` file with the following: -```javascript -const DEBUG = false; -const PRODUCTION = true; -// etc. -``` - -and build your code like this: - - uglifyjs build/defines.js js/foo.js js/bar.js... -c - -UglifyJS will notice the constants and, since they cannot be altered, it -will evaluate references to them to the value itself and drop unreachable -code as usual. The possible downside of this approach is that the build -will contain the `const` declarations. - - -## Beautifier options - -The code generator tries to output shortest code possible by default. In -case you want beautified output, pass `--beautify` (`-b`). Optionally you -can pass additional arguments that control the code output: - -- `beautify` (default `true`) -- whether to actually beautify the output. - Passing `-b` will set this to true, but you might need to pass `-b` even - when you want to generate minified code, in order to specify additional - arguments, so you can use `-b beautify=false` to override it. -- `indent-level` (default 4) -- `indent-start` (default 0) -- prefix all lines by that many spaces -- `quote-keys` (default `false`) -- pass `true` to quote all keys in literal - objects -- `space-colon` (default `true`) -- insert a space after the colon signs -- `ascii-only` (default `false`) -- escape Unicode characters in strings and - regexps -- `inline-script` (default `false`) -- escape the slash in occurrences of - ` 0) { - sys.error("WARN: Ignoring input files since --self was passed"); - } - files = UglifyJS.FILES; - if (!ARGS.wrap) ARGS.wrap = "UglifyJS"; - ARGS.export_all = true; -} - -var ORIG_MAP = ARGS.in_source_map; - -if (ORIG_MAP) { - ORIG_MAP = JSON.parse(fs.readFileSync(ORIG_MAP)); - if (files.length == 0) { - sys.error("INFO: Using file from the input source map: " + ORIG_MAP.file); - files = [ ORIG_MAP.file ]; - } - if (ARGS.source_map_root == null) { - ARGS.source_map_root = ORIG_MAP.sourceRoot; - } -} - -if (files.length == 0) { - files = [ "-" ]; -} - -if (files.indexOf("-") >= 0 && ARGS.source_map) { - sys.error("ERROR: Source map doesn't work with input from STDIN"); - process.exit(1); -} - -if (files.filter(function(el){ return el == "-" }).length > 1) { - sys.error("ERROR: Can read a single file from STDIN (two or more dashes specified)"); - process.exit(1); -} - -var STATS = {}; -var OUTPUT_FILE = ARGS.o; -var TOPLEVEL = null; - -var SOURCE_MAP = ARGS.source_map ? UglifyJS.SourceMap({ - file: OUTPUT_FILE, - root: ARGS.source_map_root, - orig: ORIG_MAP, -}) : null; - -OUTPUT_OPTIONS.source_map = SOURCE_MAP; - -try { - var output = UglifyJS.OutputStream(OUTPUT_OPTIONS); - var compressor = COMPRESS && UglifyJS.Compressor(COMPRESS); -} catch(ex) { - if (ex instanceof UglifyJS.DefaultsError) { - sys.error(ex.msg); - sys.error("Supported options:"); - sys.error(sys.inspect(ex.defs)); - process.exit(1); - } -} - -async.eachLimit(files, 1, function (file, cb) { - read_whole_file(file, function (err, code) { - if (err) { - sys.error("ERROR: can't read file: " + filename); - process.exit(1); - } - if (ARGS.p != null) { - file = file.replace(/^\/+/, "").split(/\/+/).slice(ARGS.p).join("/"); - } - time_it("parse", function(){ - if (ARGS.spidermonkey) { - var program = JSON.parse(code); - if (!TOPLEVEL) TOPLEVEL = program; - else TOPLEVEL.body = TOPLEVEL.body.concat(program.body); - } - else if (ARGS.acorn) { - TOPLEVEL = acorn.parse(code, { - locations : true, - trackComments : true, - sourceFile : file, - program : TOPLEVEL - }); - } - else { - TOPLEVEL = UglifyJS.parse(code, { - filename : file, - toplevel : TOPLEVEL, - expression : ARGS.expr, - }); - }; - }); - cb(); - }); -}, function () { - if (ARGS.acorn || ARGS.spidermonkey) time_it("convert_ast", function(){ - TOPLEVEL = UglifyJS.AST_Node.from_mozilla_ast(TOPLEVEL); - }); - - if (ARGS.wrap) { - TOPLEVEL = TOPLEVEL.wrap_commonjs(ARGS.wrap, ARGS.export_all); - } - - if (ARGS.enclose) { - var arg_parameter_list = ARGS.enclose; - - if (!(arg_parameter_list instanceof Array)) { - arg_parameter_list = [arg_parameter_list]; - } - - TOPLEVEL = TOPLEVEL.wrap_enclose(arg_parameter_list); - } - - var SCOPE_IS_NEEDED = COMPRESS || MANGLE || ARGS.lint; - - if (SCOPE_IS_NEEDED) { - time_it("scope", function(){ - TOPLEVEL.figure_out_scope({ screw_ie8: ARGS.screw_ie8 }); - if (ARGS.lint) { - TOPLEVEL.scope_warnings(); - } - }); - } - - if (COMPRESS) { - time_it("squeeze", function(){ - TOPLEVEL = TOPLEVEL.transform(compressor); - }); - } - - if (SCOPE_IS_NEEDED) { - time_it("scope", function(){ - TOPLEVEL.figure_out_scope({ screw_ie8: ARGS.screw_ie8 }); - if (MANGLE) { - TOPLEVEL.compute_char_frequency(MANGLE); - } - }); - } - - if (MANGLE) time_it("mangle", function(){ - TOPLEVEL.mangle_names(MANGLE); - }); - time_it("generate", function(){ - TOPLEVEL.print(output); - }); - - output = output.get(); - - if (SOURCE_MAP) { - fs.writeFileSync(ARGS.source_map, SOURCE_MAP, "utf8"); - output += "\n//# sourceMappingURL=" + (ARGS.source_map_url || ARGS.source_map); - } - - if (OUTPUT_FILE) { - fs.writeFileSync(OUTPUT_FILE, output, "utf8"); - } else { - sys.print(output); - sys.error("\n"); - } - - if (ARGS.stats) { - sys.error(UglifyJS.string_template("Timing information (compressed {count} files):", { - count: files.length - })); - for (var i in STATS) if (STATS.hasOwnProperty(i)) { - sys.error(UglifyJS.string_template("- {name}: {time}s", { - name: i, - time: (STATS[i] / 1000).toFixed(3) - })); - } - } -}); - -/* -----[ functions ]----- */ - -function normalize(o) { - for (var i in o) if (o.hasOwnProperty(i) && /-/.test(i)) { - o[i.replace(/-/g, "_")] = o[i]; - delete o[i]; - } -} - -function getOptions(x, constants) { - x = ARGS[x]; - if (!x) return null; - var ret = {}; - if (x !== true) { - var ast; - try { - ast = UglifyJS.parse(x); - } catch(ex) { - if (ex instanceof UglifyJS.JS_Parse_Error) { - sys.error("Error parsing arguments in: " + x); - process.exit(1); - } - } - ast.walk(new UglifyJS.TreeWalker(function(node){ - if (node instanceof UglifyJS.AST_Toplevel) return; // descend - if (node instanceof UglifyJS.AST_SimpleStatement) return; // descend - if (node instanceof UglifyJS.AST_Seq) return; // descend - if (node instanceof UglifyJS.AST_Assign) { - var name = node.left.print_to_string({ beautify: false }).replace(/-/g, "_"); - var value = node.right; - if (constants) - value = new Function("return (" + value.print_to_string() + ")")(); - ret[name] = value; - return true; // no descend - } - sys.error(node.TYPE) - sys.error("Error parsing arguments in: " + x); - process.exit(1); - })); - } - return ret; -} - -function read_whole_file(filename, cb) { - if (filename == "-") { - var chunks = []; - process.stdin.setEncoding('utf-8'); - process.stdin.on('data', function (chunk) { - chunks.push(chunk); - }).on('end', function () { - cb(null, chunks.join("")); - }); - process.openStdin(); - } else { - fs.readFile(filename, "utf-8", cb); - } -} - -function time_it(name, cont) { - var t1 = new Date().getTime(); - var ret = cont(); - if (ARGS.stats) { - var spent = new Date().getTime() - t1; - if (STATS[name]) STATS[name] += spent; - else STATS[name] = spent; - } - return ret; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/ast.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/ast.js deleted file mode 100644 index a1301da..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/ast.js +++ /dev/null @@ -1,985 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -function DEFNODE(type, props, methods, base) { - if (arguments.length < 4) base = AST_Node; - if (!props) props = []; - else props = props.split(/\s+/); - var self_props = props; - if (base && base.PROPS) - props = props.concat(base.PROPS); - var code = "return function AST_" + type + "(props){ if (props) { "; - for (var i = props.length; --i >= 0;) { - code += "this." + props[i] + " = props." + props[i] + ";"; - } - var proto = base && new base; - if (proto && proto.initialize || (methods && methods.initialize)) - code += "this.initialize();"; - code += "}}"; - var ctor = new Function(code)(); - if (proto) { - ctor.prototype = proto; - ctor.BASE = base; - } - if (base) base.SUBCLASSES.push(ctor); - ctor.prototype.CTOR = ctor; - ctor.PROPS = props || null; - ctor.SELF_PROPS = self_props; - ctor.SUBCLASSES = []; - if (type) { - ctor.prototype.TYPE = ctor.TYPE = type; - } - if (methods) for (i in methods) if (methods.hasOwnProperty(i)) { - if (/^\$/.test(i)) { - ctor[i.substr(1)] = methods[i]; - } else { - ctor.prototype[i] = methods[i]; - } - } - ctor.DEFMETHOD = function(name, method) { - this.prototype[name] = method; - }; - return ctor; -}; - -var AST_Token = DEFNODE("Token", "type value line col pos endpos nlb comments_before file", { -}, null); - -var AST_Node = DEFNODE("Node", "start end", { - clone: function() { - return new this.CTOR(this); - }, - $documentation: "Base class of all AST nodes", - $propdoc: { - start: "[AST_Token] The first token of this node", - end: "[AST_Token] The last token of this node" - }, - _walk: function(visitor) { - return visitor._visit(this); - }, - walk: function(visitor) { - return this._walk(visitor); // not sure the indirection will be any help - } -}, null); - -AST_Node.warn_function = null; -AST_Node.warn = function(txt, props) { - if (AST_Node.warn_function) - AST_Node.warn_function(string_template(txt, props)); -}; - -/* -----[ statements ]----- */ - -var AST_Statement = DEFNODE("Statement", null, { - $documentation: "Base class of all statements", -}); - -var AST_Debugger = DEFNODE("Debugger", null, { - $documentation: "Represents a debugger statement", -}, AST_Statement); - -var AST_Directive = DEFNODE("Directive", "value scope", { - $documentation: "Represents a directive, like \"use strict\";", - $propdoc: { - value: "[string] The value of this directive as a plain string (it's not an AST_String!)", - scope: "[AST_Scope/S] The scope that this directive affects" - }, -}, AST_Statement); - -var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", { - $documentation: "A statement consisting of an expression, i.e. a = 1 + 2", - $propdoc: { - body: "[AST_Node] an expression node (should not be instanceof AST_Statement)" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.body._walk(visitor); - }); - } -}, AST_Statement); - -function walk_body(node, visitor) { - if (node.body instanceof AST_Statement) { - node.body._walk(visitor); - } - else node.body.forEach(function(stat){ - stat._walk(visitor); - }); -}; - -var AST_Block = DEFNODE("Block", "body", { - $documentation: "A body of statements (usually bracketed)", - $propdoc: { - body: "[AST_Statement*] an array of statements" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - walk_body(this, visitor); - }); - } -}, AST_Statement); - -var AST_BlockStatement = DEFNODE("BlockStatement", null, { - $documentation: "A block statement", -}, AST_Block); - -var AST_EmptyStatement = DEFNODE("EmptyStatement", null, { - $documentation: "The empty statement (empty block or simply a semicolon)", - _walk: function(visitor) { - return visitor._visit(this); - } -}, AST_Statement); - -var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", { - $documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`", - $propdoc: { - body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.body._walk(visitor); - }); - } -}, AST_Statement); - -var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", { - $documentation: "Statement with a label", - $propdoc: { - label: "[AST_Label] a label definition" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.label._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_StatementWithBody); - -var AST_DWLoop = DEFNODE("DWLoop", "condition", { - $documentation: "Base class for do/while statements", - $propdoc: { - condition: "[AST_Node] the loop condition. Should not be instanceof AST_Statement" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.condition._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_StatementWithBody); - -var AST_Do = DEFNODE("Do", null, { - $documentation: "A `do` statement", -}, AST_DWLoop); - -var AST_While = DEFNODE("While", null, { - $documentation: "A `while` statement", -}, AST_DWLoop); - -var AST_For = DEFNODE("For", "init condition step", { - $documentation: "A `for` statement", - $propdoc: { - init: "[AST_Node?] the `for` initialization code, or null if empty", - condition: "[AST_Node?] the `for` termination clause, or null if empty", - step: "[AST_Node?] the `for` update clause, or null if empty" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - if (this.init) this.init._walk(visitor); - if (this.condition) this.condition._walk(visitor); - if (this.step) this.step._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_StatementWithBody); - -var AST_ForIn = DEFNODE("ForIn", "init name object", { - $documentation: "A `for ... in` statement", - $propdoc: { - init: "[AST_Node] the `for/in` initialization code", - name: "[AST_SymbolRef?] the loop variable, only if `init` is AST_Var", - object: "[AST_Node] the object that we're looping through" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.init._walk(visitor); - this.object._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_StatementWithBody); - -var AST_With = DEFNODE("With", "expression", { - $documentation: "A `with` statement", - $propdoc: { - expression: "[AST_Node] the `with` expression" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - this.body._walk(visitor); - }); - } -}, AST_StatementWithBody); - -/* -----[ scope and functions ]----- */ - -var AST_Scope = DEFNODE("Scope", "directives variables functions uses_with uses_eval parent_scope enclosed cname", { - $documentation: "Base class for all statements introducing a lexical scope", - $propdoc: { - directives: "[string*/S] an array of directives declared in this scope", - variables: "[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope", - functions: "[Object/S] like `variables`, but only lists function declarations", - uses_with: "[boolean/S] tells whether this scope uses the `with` statement", - uses_eval: "[boolean/S] tells whether this scope contains a direct call to the global `eval`", - parent_scope: "[AST_Scope?/S] link to the parent scope", - enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes", - cname: "[integer/S] current index for mangling variables (used internally by the mangler)", - }, -}, AST_Block); - -var AST_Toplevel = DEFNODE("Toplevel", "globals", { - $documentation: "The toplevel scope", - $propdoc: { - globals: "[Object/S] a map of name -> SymbolDef for all undeclared names", - }, - wrap_enclose: function(arg_parameter_pairs) { - var self = this; - var args = []; - var parameters = []; - - arg_parameter_pairs.forEach(function(pair) { - var split = pair.split(":"); - - args.push(split[0]); - parameters.push(split[1]); - }); - - var wrapped_tl = "(function(" + parameters.join(",") + "){ '$ORIG'; })(" + args.join(",") + ")"; - wrapped_tl = parse(wrapped_tl); - wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){ - if (node instanceof AST_Directive && node.value == "$ORIG") { - return MAP.splice(self.body); - } - })); - return wrapped_tl; - }, - wrap_commonjs: function(name, export_all) { - var self = this; - var to_export = []; - if (export_all) { - self.figure_out_scope(); - self.walk(new TreeWalker(function(node){ - if (node instanceof AST_SymbolDeclaration && node.definition().global) { - if (!find_if(function(n){ return n.name == node.name }, to_export)) - to_export.push(node); - } - })); - } - var wrapped_tl = "(function(exports, global){ global['" + name + "'] = exports; '$ORIG'; '$EXPORTS'; }({}, (function(){return this}())))"; - wrapped_tl = parse(wrapped_tl); - wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){ - if (node instanceof AST_SimpleStatement) { - node = node.body; - if (node instanceof AST_String) switch (node.getValue()) { - case "$ORIG": - return MAP.splice(self.body); - case "$EXPORTS": - var body = []; - to_export.forEach(function(sym){ - body.push(new AST_SimpleStatement({ - body: new AST_Assign({ - left: new AST_Sub({ - expression: new AST_SymbolRef({ name: "exports" }), - property: new AST_String({ value: sym.name }), - }), - operator: "=", - right: new AST_SymbolRef(sym), - }), - })); - }); - return MAP.splice(body); - } - } - })); - return wrapped_tl; - } -}, AST_Scope); - -var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments", { - $documentation: "Base class for functions", - $propdoc: { - name: "[AST_SymbolDeclaration?] the name of this function", - argnames: "[AST_SymbolFunarg*] array of function arguments", - uses_arguments: "[boolean/S] tells whether this function accesses the arguments array" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - if (this.name) this.name._walk(visitor); - this.argnames.forEach(function(arg){ - arg._walk(visitor); - }); - walk_body(this, visitor); - }); - } -}, AST_Scope); - -var AST_Accessor = DEFNODE("Accessor", null, { - $documentation: "A setter/getter function" -}, AST_Lambda); - -var AST_Function = DEFNODE("Function", null, { - $documentation: "A function expression" -}, AST_Lambda); - -var AST_Defun = DEFNODE("Defun", null, { - $documentation: "A function definition" -}, AST_Lambda); - -/* -----[ JUMPS ]----- */ - -var AST_Jump = DEFNODE("Jump", null, { - $documentation: "Base class for “jumps” (for now that's `return`, `throw`, `break` and `continue`)" -}, AST_Statement); - -var AST_Exit = DEFNODE("Exit", "value", { - $documentation: "Base class for “exits” (`return` and `throw`)", - $propdoc: { - value: "[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return" - }, - _walk: function(visitor) { - return visitor._visit(this, this.value && function(){ - this.value._walk(visitor); - }); - } -}, AST_Jump); - -var AST_Return = DEFNODE("Return", null, { - $documentation: "A `return` statement" -}, AST_Exit); - -var AST_Throw = DEFNODE("Throw", null, { - $documentation: "A `throw` statement" -}, AST_Exit); - -var AST_LoopControl = DEFNODE("LoopControl", "label", { - $documentation: "Base class for loop control statements (`break` and `continue`)", - $propdoc: { - label: "[AST_LabelRef?] the label, or null if none", - }, - _walk: function(visitor) { - return visitor._visit(this, this.label && function(){ - this.label._walk(visitor); - }); - } -}, AST_Jump); - -var AST_Break = DEFNODE("Break", null, { - $documentation: "A `break` statement" -}, AST_LoopControl); - -var AST_Continue = DEFNODE("Continue", null, { - $documentation: "A `continue` statement" -}, AST_LoopControl); - -/* -----[ IF ]----- */ - -var AST_If = DEFNODE("If", "condition alternative", { - $documentation: "A `if` statement", - $propdoc: { - condition: "[AST_Node] the `if` condition", - alternative: "[AST_Statement?] the `else` part, or null if not present" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.condition._walk(visitor); - this.body._walk(visitor); - if (this.alternative) this.alternative._walk(visitor); - }); - } -}, AST_StatementWithBody); - -/* -----[ SWITCH ]----- */ - -var AST_Switch = DEFNODE("Switch", "expression", { - $documentation: "A `switch` statement", - $propdoc: { - expression: "[AST_Node] the `switch` “discriminant”" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - walk_body(this, visitor); - }); - } -}, AST_Block); - -var AST_SwitchBranch = DEFNODE("SwitchBranch", null, { - $documentation: "Base class for `switch` branches", -}, AST_Block); - -var AST_Default = DEFNODE("Default", null, { - $documentation: "A `default` switch branch", -}, AST_SwitchBranch); - -var AST_Case = DEFNODE("Case", "expression", { - $documentation: "A `case` switch branch", - $propdoc: { - expression: "[AST_Node] the `case` expression" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - walk_body(this, visitor); - }); - } -}, AST_SwitchBranch); - -/* -----[ EXCEPTIONS ]----- */ - -var AST_Try = DEFNODE("Try", "bcatch bfinally", { - $documentation: "A `try` statement", - $propdoc: { - bcatch: "[AST_Catch?] the catch block, or null if not present", - bfinally: "[AST_Finally?] the finally block, or null if not present" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - walk_body(this, visitor); - if (this.bcatch) this.bcatch._walk(visitor); - if (this.bfinally) this.bfinally._walk(visitor); - }); - } -}, AST_Block); - -// XXX: this is wrong according to ECMA-262 (12.4). the catch block -// should introduce another scope, as the argname should be visible -// only inside the catch block. However, doing it this way because of -// IE which simply introduces the name in the surrounding scope. If -// we ever want to fix this then AST_Catch should inherit from -// AST_Scope. -var AST_Catch = DEFNODE("Catch", "argname", { - $documentation: "A `catch` node; only makes sense as part of a `try` statement", - $propdoc: { - argname: "[AST_SymbolCatch] symbol for the exception" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.argname._walk(visitor); - walk_body(this, visitor); - }); - } -}, AST_Block); - -var AST_Finally = DEFNODE("Finally", null, { - $documentation: "A `finally` node; only makes sense as part of a `try` statement" -}, AST_Block); - -/* -----[ VAR/CONST ]----- */ - -var AST_Definitions = DEFNODE("Definitions", "definitions", { - $documentation: "Base class for `var` or `const` nodes (variable declarations/initializations)", - $propdoc: { - definitions: "[AST_VarDef*] array of variable definitions" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.definitions.forEach(function(def){ - def._walk(visitor); - }); - }); - } -}, AST_Statement); - -var AST_Var = DEFNODE("Var", null, { - $documentation: "A `var` statement" -}, AST_Definitions); - -var AST_Const = DEFNODE("Const", null, { - $documentation: "A `const` statement" -}, AST_Definitions); - -var AST_VarDef = DEFNODE("VarDef", "name value", { - $documentation: "A variable declaration; only appears in a AST_Definitions node", - $propdoc: { - name: "[AST_SymbolVar|AST_SymbolConst] name of the variable", - value: "[AST_Node?] initializer, or null of there's no initializer" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.name._walk(visitor); - if (this.value) this.value._walk(visitor); - }); - } -}); - -/* -----[ OTHER ]----- */ - -var AST_Call = DEFNODE("Call", "expression args", { - $documentation: "A function call expression", - $propdoc: { - expression: "[AST_Node] expression to invoke as function", - args: "[AST_Node*] array of arguments" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - this.args.forEach(function(arg){ - arg._walk(visitor); - }); - }); - } -}); - -var AST_New = DEFNODE("New", null, { - $documentation: "An object instantiation. Derives from a function call since it has exactly the same properties" -}, AST_Call); - -var AST_Seq = DEFNODE("Seq", "car cdr", { - $documentation: "A sequence expression (two comma-separated expressions)", - $propdoc: { - car: "[AST_Node] first element in sequence", - cdr: "[AST_Node] second element in sequence" - }, - $cons: function(x, y) { - var seq = new AST_Seq(x); - seq.car = x; - seq.cdr = y; - return seq; - }, - $from_array: function(array) { - if (array.length == 0) return null; - if (array.length == 1) return array[0].clone(); - var list = null; - for (var i = array.length; --i >= 0;) { - list = AST_Seq.cons(array[i], list); - } - var p = list; - while (p) { - if (p.cdr && !p.cdr.cdr) { - p.cdr = p.cdr.car; - break; - } - p = p.cdr; - } - return list; - }, - to_array: function() { - var p = this, a = []; - while (p) { - a.push(p.car); - if (p.cdr && !(p.cdr instanceof AST_Seq)) { - a.push(p.cdr); - break; - } - p = p.cdr; - } - return a; - }, - add: function(node) { - var p = this; - while (p) { - if (!(p.cdr instanceof AST_Seq)) { - var cell = AST_Seq.cons(p.cdr, node); - return p.cdr = cell; - } - p = p.cdr; - } - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.car._walk(visitor); - if (this.cdr) this.cdr._walk(visitor); - }); - } -}); - -var AST_PropAccess = DEFNODE("PropAccess", "expression property", { - $documentation: "Base class for property access expressions, i.e. `a.foo` or `a[\"foo\"]`", - $propdoc: { - expression: "[AST_Node] the “container” expression", - property: "[AST_Node|string] the property to access. For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node" - } -}); - -var AST_Dot = DEFNODE("Dot", null, { - $documentation: "A dotted property access expression", - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - }); - } -}, AST_PropAccess); - -var AST_Sub = DEFNODE("Sub", null, { - $documentation: "Index-style property access, i.e. `a[\"foo\"]`", - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - this.property._walk(visitor); - }); - } -}, AST_PropAccess); - -var AST_Unary = DEFNODE("Unary", "operator expression", { - $documentation: "Base class for unary expressions", - $propdoc: { - operator: "[string] the operator", - expression: "[AST_Node] expression that this unary operator applies to" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.expression._walk(visitor); - }); - } -}); - -var AST_UnaryPrefix = DEFNODE("UnaryPrefix", null, { - $documentation: "Unary prefix expression, i.e. `typeof i` or `++i`" -}, AST_Unary); - -var AST_UnaryPostfix = DEFNODE("UnaryPostfix", null, { - $documentation: "Unary postfix expression, i.e. `i++`" -}, AST_Unary); - -var AST_Binary = DEFNODE("Binary", "left operator right", { - $documentation: "Binary expression, i.e. `a + b`", - $propdoc: { - left: "[AST_Node] left-hand side expression", - operator: "[string] the operator", - right: "[AST_Node] right-hand side expression" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.left._walk(visitor); - this.right._walk(visitor); - }); - } -}); - -var AST_Conditional = DEFNODE("Conditional", "condition consequent alternative", { - $documentation: "Conditional expression using the ternary operator, i.e. `a ? b : c`", - $propdoc: { - condition: "[AST_Node]", - consequent: "[AST_Node]", - alternative: "[AST_Node]" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.condition._walk(visitor); - this.consequent._walk(visitor); - this.alternative._walk(visitor); - }); - } -}); - -var AST_Assign = DEFNODE("Assign", null, { - $documentation: "An assignment expression — `a = b + 5`", -}, AST_Binary); - -/* -----[ LITERALS ]----- */ - -var AST_Array = DEFNODE("Array", "elements", { - $documentation: "An array literal", - $propdoc: { - elements: "[AST_Node*] array of elements" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.elements.forEach(function(el){ - el._walk(visitor); - }); - }); - } -}); - -var AST_Object = DEFNODE("Object", "properties", { - $documentation: "An object literal", - $propdoc: { - properties: "[AST_ObjectProperty*] array of properties" - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.properties.forEach(function(prop){ - prop._walk(visitor); - }); - }); - } -}); - -var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", { - $documentation: "Base class for literal object properties", - $propdoc: { - key: "[string] the property name; it's always a plain string in our AST, no matter if it was a string, number or identifier in original code", - value: "[AST_Node] property value. For setters and getters this is an AST_Function." - }, - _walk: function(visitor) { - return visitor._visit(this, function(){ - this.value._walk(visitor); - }); - } -}); - -var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", null, { - $documentation: "A key: value object property", -}, AST_ObjectProperty); - -var AST_ObjectSetter = DEFNODE("ObjectSetter", null, { - $documentation: "An object setter property", -}, AST_ObjectProperty); - -var AST_ObjectGetter = DEFNODE("ObjectGetter", null, { - $documentation: "An object getter property", -}, AST_ObjectProperty); - -var AST_Symbol = DEFNODE("Symbol", "scope name thedef", { - $propdoc: { - name: "[string] name of this symbol", - scope: "[AST_Scope/S] the current scope (not necessarily the definition scope)", - thedef: "[SymbolDef/S] the definition of this symbol" - }, - $documentation: "Base class for all symbols", -}); - -var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, { - $documentation: "The name of a property accessor (setter/getter function)" -}, AST_Symbol); - -var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", { - $documentation: "A declaration symbol (symbol in var/const, function name or argument, symbol in catch)", - $propdoc: { - init: "[AST_Node*/S] array of initializers for this declaration." - } -}, AST_Symbol); - -var AST_SymbolVar = DEFNODE("SymbolVar", null, { - $documentation: "Symbol defining a variable", -}, AST_SymbolDeclaration); - -var AST_SymbolConst = DEFNODE("SymbolConst", null, { - $documentation: "A constant declaration" -}, AST_SymbolDeclaration); - -var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, { - $documentation: "Symbol naming a function argument", -}, AST_SymbolVar); - -var AST_SymbolDefun = DEFNODE("SymbolDefun", null, { - $documentation: "Symbol defining a function", -}, AST_SymbolDeclaration); - -var AST_SymbolLambda = DEFNODE("SymbolLambda", null, { - $documentation: "Symbol naming a function expression", -}, AST_SymbolDeclaration); - -var AST_SymbolCatch = DEFNODE("SymbolCatch", null, { - $documentation: "Symbol naming the exception in catch", -}, AST_SymbolDeclaration); - -var AST_Label = DEFNODE("Label", "references", { - $documentation: "Symbol naming a label (declaration)", - $propdoc: { - references: "[AST_LabelRef*] a list of nodes referring to this label" - } -}, AST_Symbol); - -var AST_SymbolRef = DEFNODE("SymbolRef", null, { - $documentation: "Reference to some symbol (not definition/declaration)", -}, AST_Symbol); - -var AST_LabelRef = DEFNODE("LabelRef", null, { - $documentation: "Reference to a label symbol", -}, AST_Symbol); - -var AST_This = DEFNODE("This", null, { - $documentation: "The `this` symbol", -}, AST_Symbol); - -var AST_Constant = DEFNODE("Constant", null, { - $documentation: "Base class for all constants", - getValue: function() { - return this.value; - } -}); - -var AST_String = DEFNODE("String", "value", { - $documentation: "A string literal", - $propdoc: { - value: "[string] the contents of this string" - } -}, AST_Constant); - -var AST_Number = DEFNODE("Number", "value", { - $documentation: "A number literal", - $propdoc: { - value: "[number] the numeric value" - } -}, AST_Constant); - -var AST_RegExp = DEFNODE("RegExp", "value", { - $documentation: "A regexp literal", - $propdoc: { - value: "[RegExp] the actual regexp" - } -}, AST_Constant); - -var AST_Atom = DEFNODE("Atom", null, { - $documentation: "Base class for atoms", -}, AST_Constant); - -var AST_Null = DEFNODE("Null", null, { - $documentation: "The `null` atom", - value: null -}, AST_Atom); - -var AST_NaN = DEFNODE("NaN", null, { - $documentation: "The impossible value", - value: 0/0 -}, AST_Atom); - -var AST_Undefined = DEFNODE("Undefined", null, { - $documentation: "The `undefined` value", - value: (function(){}()) -}, AST_Atom); - -var AST_Hole = DEFNODE("Hole", null, { - $documentation: "A hole in an array", - value: (function(){}()) -}, AST_Atom); - -var AST_Infinity = DEFNODE("Infinity", null, { - $documentation: "The `Infinity` value", - value: 1/0 -}, AST_Atom); - -var AST_Boolean = DEFNODE("Boolean", null, { - $documentation: "Base class for booleans", -}, AST_Atom); - -var AST_False = DEFNODE("False", null, { - $documentation: "The `false` atom", - value: false -}, AST_Boolean); - -var AST_True = DEFNODE("True", null, { - $documentation: "The `true` atom", - value: true -}, AST_Boolean); - -/* -----[ TreeWalker ]----- */ - -function TreeWalker(callback) { - this.visit = callback; - this.stack = []; -}; -TreeWalker.prototype = { - _visit: function(node, descend) { - this.stack.push(node); - var ret = this.visit(node, descend ? function(){ - descend.call(node); - } : noop); - if (!ret && descend) { - descend.call(node); - } - this.stack.pop(); - return ret; - }, - parent: function(n) { - return this.stack[this.stack.length - 2 - (n || 0)]; - }, - push: function (node) { - this.stack.push(node); - }, - pop: function() { - return this.stack.pop(); - }, - self: function() { - return this.stack[this.stack.length - 1]; - }, - find_parent: function(type) { - var stack = this.stack; - for (var i = stack.length; --i >= 0;) { - var x = stack[i]; - if (x instanceof type) return x; - } - }, - in_boolean_context: function() { - var stack = this.stack; - var i = stack.length, self = stack[--i]; - while (i > 0) { - var p = stack[--i]; - if ((p instanceof AST_If && p.condition === self) || - (p instanceof AST_Conditional && p.condition === self) || - (p instanceof AST_DWLoop && p.condition === self) || - (p instanceof AST_For && p.condition === self) || - (p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self)) - { - return true; - } - if (!(p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||"))) - return false; - self = p; - } - }, - loopcontrol_target: function(label) { - var stack = this.stack; - if (label) { - for (var i = stack.length; --i >= 0;) { - var x = stack[i]; - if (x instanceof AST_LabeledStatement && x.label.name == label.name) { - return x.body; - } - } - } else { - for (var i = stack.length; --i >= 0;) { - var x = stack[i]; - if (x instanceof AST_Switch - || x instanceof AST_For - || x instanceof AST_ForIn - || x instanceof AST_DWLoop) return x; - } - } - } -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/compress.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/compress.js deleted file mode 100644 index 57554fa..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/compress.js +++ /dev/null @@ -1,2028 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -function Compressor(options, false_by_default) { - if (!(this instanceof Compressor)) - return new Compressor(options, false_by_default); - TreeTransformer.call(this, this.before, this.after); - this.options = defaults(options, { - sequences : !false_by_default, - properties : !false_by_default, - dead_code : !false_by_default, - drop_debugger : !false_by_default, - unsafe : false, - unsafe_comps : false, - conditionals : !false_by_default, - comparisons : !false_by_default, - evaluate : !false_by_default, - booleans : !false_by_default, - loops : !false_by_default, - unused : !false_by_default, - hoist_funs : !false_by_default, - hoist_vars : false, - if_return : !false_by_default, - join_vars : !false_by_default, - cascade : !false_by_default, - side_effects : !false_by_default, - screw_ie8 : false, - - warnings : true, - global_defs : {} - }, true); -}; - -Compressor.prototype = new TreeTransformer; -merge(Compressor.prototype, { - option: function(key) { return this.options[key] }, - warn: function() { - if (this.options.warnings) - AST_Node.warn.apply(AST_Node, arguments); - }, - before: function(node, descend, in_list) { - if (node._squeezed) return node; - if (node instanceof AST_Scope) { - node.drop_unused(this); - node = node.hoist_declarations(this); - } - descend(node, this); - node = node.optimize(this); - if (node instanceof AST_Scope) { - // dead code removal might leave further unused declarations. - // this'll usually save very few bytes, but the performance - // hit seems negligible so I'll just drop it here. - - // no point to repeat warnings. - var save_warnings = this.options.warnings; - this.options.warnings = false; - node.drop_unused(this); - this.options.warnings = save_warnings; - } - node._squeezed = true; - return node; - } -}); - -(function(){ - - function OPT(node, optimizer) { - node.DEFMETHOD("optimize", function(compressor){ - var self = this; - if (self._optimized) return self; - var opt = optimizer(self, compressor); - opt._optimized = true; - if (opt === self) return opt; - return opt.transform(compressor); - }); - }; - - OPT(AST_Node, function(self, compressor){ - return self; - }); - - AST_Node.DEFMETHOD("equivalent_to", function(node){ - // XXX: this is a rather expensive way to test two node's equivalence: - return this.print_to_string() == node.print_to_string(); - }); - - function make_node(ctor, orig, props) { - if (!props) props = {}; - if (orig) { - if (!props.start) props.start = orig.start; - if (!props.end) props.end = orig.end; - } - return new ctor(props); - }; - - function make_node_from_constant(compressor, val, orig) { - // XXX: WIP. - // if (val instanceof AST_Node) return val.transform(new TreeTransformer(null, function(node){ - // if (node instanceof AST_SymbolRef) { - // var scope = compressor.find_parent(AST_Scope); - // var def = scope.find_variable(node); - // node.thedef = def; - // return node; - // } - // })).transform(compressor); - - if (val instanceof AST_Node) return val.transform(compressor); - switch (typeof val) { - case "string": - return make_node(AST_String, orig, { - value: val - }).optimize(compressor); - case "number": - return make_node(isNaN(val) ? AST_NaN : AST_Number, orig, { - value: val - }).optimize(compressor); - case "boolean": - return make_node(val ? AST_True : AST_False, orig).optimize(compressor); - case "undefined": - return make_node(AST_Undefined, orig).optimize(compressor); - default: - if (val === null) { - return make_node(AST_Null, orig).optimize(compressor); - } - if (val instanceof RegExp) { - return make_node(AST_RegExp, orig).optimize(compressor); - } - throw new Error(string_template("Can't handle constant of type: {type}", { - type: typeof val - })); - } - }; - - function as_statement_array(thing) { - if (thing === null) return []; - if (thing instanceof AST_BlockStatement) return thing.body; - if (thing instanceof AST_EmptyStatement) return []; - if (thing instanceof AST_Statement) return [ thing ]; - throw new Error("Can't convert thing to statement array"); - }; - - function is_empty(thing) { - if (thing === null) return true; - if (thing instanceof AST_EmptyStatement) return true; - if (thing instanceof AST_BlockStatement) return thing.body.length == 0; - return false; - }; - - function loop_body(x) { - if (x instanceof AST_Switch) return x; - if (x instanceof AST_For || x instanceof AST_ForIn || x instanceof AST_DWLoop) { - return (x.body instanceof AST_BlockStatement ? x.body : x); - } - return x; - }; - - function tighten_body(statements, compressor) { - var CHANGED; - do { - CHANGED = false; - statements = eliminate_spurious_blocks(statements); - if (compressor.option("dead_code")) { - statements = eliminate_dead_code(statements, compressor); - } - if (compressor.option("if_return")) { - statements = handle_if_return(statements, compressor); - } - if (compressor.option("sequences")) { - statements = sequencesize(statements, compressor); - } - if (compressor.option("join_vars")) { - statements = join_consecutive_vars(statements, compressor); - } - } while (CHANGED); - return statements; - - function eliminate_spurious_blocks(statements) { - var seen_dirs = []; - return statements.reduce(function(a, stat){ - if (stat instanceof AST_BlockStatement) { - CHANGED = true; - a.push.apply(a, eliminate_spurious_blocks(stat.body)); - } else if (stat instanceof AST_EmptyStatement) { - CHANGED = true; - } else if (stat instanceof AST_Directive) { - if (seen_dirs.indexOf(stat.value) < 0) { - a.push(stat); - seen_dirs.push(stat.value); - } else { - CHANGED = true; - } - } else { - a.push(stat); - } - return a; - }, []); - }; - - function handle_if_return(statements, compressor) { - var self = compressor.self(); - var in_lambda = self instanceof AST_Lambda; - var ret = []; - loop: for (var i = statements.length; --i >= 0;) { - var stat = statements[i]; - switch (true) { - case (in_lambda && stat instanceof AST_Return && !stat.value && ret.length == 0): - CHANGED = true; - // note, ret.length is probably always zero - // because we drop unreachable code before this - // step. nevertheless, it's good to check. - continue loop; - case stat instanceof AST_If: - if (stat.body instanceof AST_Return) { - //--- - // pretty silly case, but: - // if (foo()) return; return; ==> foo(); return; - if (((in_lambda && ret.length == 0) - || (ret[0] instanceof AST_Return && !ret[0].value)) - && !stat.body.value && !stat.alternative) { - CHANGED = true; - var cond = make_node(AST_SimpleStatement, stat.condition, { - body: stat.condition - }); - ret.unshift(cond); - continue loop; - } - //--- - // if (foo()) return x; return y; ==> return foo() ? x : y; - if (ret[0] instanceof AST_Return && stat.body.value && ret[0].value && !stat.alternative) { - CHANGED = true; - stat = stat.clone(); - stat.alternative = ret[0]; - ret[0] = stat.transform(compressor); - continue loop; - } - //--- - // if (foo()) return x; [ return ; ] ==> return foo() ? x : undefined; - if ((ret.length == 0 || ret[0] instanceof AST_Return) && stat.body.value && !stat.alternative && in_lambda) { - CHANGED = true; - stat = stat.clone(); - stat.alternative = ret[0] || make_node(AST_Return, stat, { - value: make_node(AST_Undefined, stat) - }); - ret[0] = stat.transform(compressor); - continue loop; - } - //--- - // if (foo()) return; [ else x... ]; y... ==> if (!foo()) { x...; y... } - if (!stat.body.value && in_lambda) { - CHANGED = true; - stat = stat.clone(); - stat.condition = stat.condition.negate(compressor); - stat.body = make_node(AST_BlockStatement, stat, { - body: as_statement_array(stat.alternative).concat(ret) - }); - stat.alternative = null; - ret = [ stat.transform(compressor) ]; - continue loop; - } - //--- - if (ret.length == 1 && in_lambda && ret[0] instanceof AST_SimpleStatement - && (!stat.alternative || stat.alternative instanceof AST_SimpleStatement)) { - CHANGED = true; - ret.push(make_node(AST_Return, ret[0], { - value: make_node(AST_Undefined, ret[0]) - }).transform(compressor)); - ret = as_statement_array(stat.alternative).concat(ret); - ret.unshift(stat); - continue loop; - } - } - - var ab = aborts(stat.body); - var lct = ab instanceof AST_LoopControl ? compressor.loopcontrol_target(ab.label) : null; - if (ab && ((ab instanceof AST_Return && !ab.value && in_lambda) - || (ab instanceof AST_Continue && self === loop_body(lct)) - || (ab instanceof AST_Break && lct instanceof AST_BlockStatement && self === lct))) { - if (ab.label) { - remove(ab.label.thedef.references, ab.label); - } - CHANGED = true; - var body = as_statement_array(stat.body).slice(0, -1); - stat = stat.clone(); - stat.condition = stat.condition.negate(compressor); - stat.body = make_node(AST_BlockStatement, stat, { - body: ret - }); - stat.alternative = make_node(AST_BlockStatement, stat, { - body: body - }); - ret = [ stat.transform(compressor) ]; - continue loop; - } - - var ab = aborts(stat.alternative); - var lct = ab instanceof AST_LoopControl ? compressor.loopcontrol_target(ab.label) : null; - if (ab && ((ab instanceof AST_Return && !ab.value && in_lambda) - || (ab instanceof AST_Continue && self === loop_body(lct)) - || (ab instanceof AST_Break && lct instanceof AST_BlockStatement && self === lct))) { - if (ab.label) { - remove(ab.label.thedef.references, ab.label); - } - CHANGED = true; - stat = stat.clone(); - stat.body = make_node(AST_BlockStatement, stat.body, { - body: as_statement_array(stat.body).concat(ret) - }); - stat.alternative = make_node(AST_BlockStatement, stat.alternative, { - body: as_statement_array(stat.alternative).slice(0, -1) - }); - ret = [ stat.transform(compressor) ]; - continue loop; - } - - ret.unshift(stat); - break; - default: - ret.unshift(stat); - break; - } - } - return ret; - }; - - function eliminate_dead_code(statements, compressor) { - var has_quit = false; - var orig = statements.length; - var self = compressor.self(); - statements = statements.reduce(function(a, stat){ - if (has_quit) { - extract_declarations_from_unreachable_code(compressor, stat, a); - } else { - if (stat instanceof AST_LoopControl) { - var lct = compressor.loopcontrol_target(stat.label); - if ((stat instanceof AST_Break - && lct instanceof AST_BlockStatement - && loop_body(lct) === self) || (stat instanceof AST_Continue - && loop_body(lct) === self)) { - if (stat.label) { - remove(stat.label.thedef.references, stat.label); - } - } else { - a.push(stat); - } - } else { - a.push(stat); - } - if (aborts(stat)) has_quit = true; - } - return a; - }, []); - CHANGED = statements.length != orig; - return statements; - }; - - function sequencesize(statements, compressor) { - if (statements.length < 2) return statements; - var seq = [], ret = []; - function push_seq() { - seq = AST_Seq.from_array(seq); - if (seq) ret.push(make_node(AST_SimpleStatement, seq, { - body: seq - })); - seq = []; - }; - statements.forEach(function(stat){ - if (stat instanceof AST_SimpleStatement) seq.push(stat.body); - else push_seq(), ret.push(stat); - }); - push_seq(); - ret = sequencesize_2(ret, compressor); - CHANGED = ret.length != statements.length; - return ret; - }; - - function sequencesize_2(statements, compressor) { - function cons_seq(right) { - ret.pop(); - var left = prev.body; - if (left instanceof AST_Seq) { - left.add(right); - } else { - left = AST_Seq.cons(left, right); - } - return left.transform(compressor); - }; - var ret = [], prev = null; - statements.forEach(function(stat){ - if (prev) { - if (stat instanceof AST_For) { - var opera = {}; - try { - prev.body.walk(new TreeWalker(function(node){ - if (node instanceof AST_Binary && node.operator == "in") - throw opera; - })); - if (stat.init && !(stat.init instanceof AST_Definitions)) { - stat.init = cons_seq(stat.init); - } - else if (!stat.init) { - stat.init = prev.body; - ret.pop(); - } - } catch(ex) { - if (ex !== opera) throw ex; - } - } - else if (stat instanceof AST_If) { - stat.condition = cons_seq(stat.condition); - } - else if (stat instanceof AST_With) { - stat.expression = cons_seq(stat.expression); - } - else if (stat instanceof AST_Exit && stat.value) { - stat.value = cons_seq(stat.value); - } - else if (stat instanceof AST_Exit) { - stat.value = cons_seq(make_node(AST_Undefined, stat)); - } - else if (stat instanceof AST_Switch) { - stat.expression = cons_seq(stat.expression); - } - } - ret.push(stat); - prev = stat instanceof AST_SimpleStatement ? stat : null; - }); - return ret; - }; - - function join_consecutive_vars(statements, compressor) { - var prev = null; - return statements.reduce(function(a, stat){ - if (stat instanceof AST_Definitions && prev && prev.TYPE == stat.TYPE) { - prev.definitions = prev.definitions.concat(stat.definitions); - CHANGED = true; - } - else if (stat instanceof AST_For - && prev instanceof AST_Definitions - && (!stat.init || stat.init.TYPE == prev.TYPE)) { - CHANGED = true; - a.pop(); - if (stat.init) { - stat.init.definitions = prev.definitions.concat(stat.init.definitions); - } else { - stat.init = prev; - } - a.push(stat); - prev = stat; - } - else { - prev = stat; - a.push(stat); - } - return a; - }, []); - }; - - }; - - function extract_declarations_from_unreachable_code(compressor, stat, target) { - compressor.warn("Dropping unreachable code [{file}:{line},{col}]", stat.start); - stat.walk(new TreeWalker(function(node){ - if (node instanceof AST_Definitions) { - compressor.warn("Declarations in unreachable code! [{file}:{line},{col}]", node.start); - node.remove_initializers(); - target.push(node); - return true; - } - if (node instanceof AST_Defun) { - target.push(node); - return true; - } - if (node instanceof AST_Scope) { - return true; - } - })); - }; - - /* -----[ boolean/negation helpers ]----- */ - - // methods to determine whether an expression has a boolean result type - (function (def){ - var unary_bool = [ "!", "delete" ]; - var binary_bool = [ "in", "instanceof", "==", "!=", "===", "!==", "<", "<=", ">=", ">" ]; - def(AST_Node, function(){ return false }); - def(AST_UnaryPrefix, function(){ - return member(this.operator, unary_bool); - }); - def(AST_Binary, function(){ - return member(this.operator, binary_bool) || - ( (this.operator == "&&" || this.operator == "||") && - this.left.is_boolean() && this.right.is_boolean() ); - }); - def(AST_Conditional, function(){ - return this.consequent.is_boolean() && this.alternative.is_boolean(); - }); - def(AST_Assign, function(){ - return this.operator == "=" && this.right.is_boolean(); - }); - def(AST_Seq, function(){ - return this.cdr.is_boolean(); - }); - def(AST_True, function(){ return true }); - def(AST_False, function(){ return true }); - })(function(node, func){ - node.DEFMETHOD("is_boolean", func); - }); - - // methods to determine if an expression has a string result type - (function (def){ - def(AST_Node, function(){ return false }); - def(AST_String, function(){ return true }); - def(AST_UnaryPrefix, function(){ - return this.operator == "typeof"; - }); - def(AST_Binary, function(compressor){ - return this.operator == "+" && - (this.left.is_string(compressor) || this.right.is_string(compressor)); - }); - def(AST_Assign, function(compressor){ - return (this.operator == "=" || this.operator == "+=") && this.right.is_string(compressor); - }); - def(AST_Seq, function(compressor){ - return this.cdr.is_string(compressor); - }); - def(AST_Conditional, function(compressor){ - return this.consequent.is_string(compressor) && this.alternative.is_string(compressor); - }); - def(AST_Call, function(compressor){ - return compressor.option("unsafe") - && this.expression instanceof AST_SymbolRef - && this.expression.name == "String" - && this.expression.undeclared(); - }); - })(function(node, func){ - node.DEFMETHOD("is_string", func); - }); - - function best_of(ast1, ast2) { - return ast1.print_to_string().length > - ast2.print_to_string().length - ? ast2 : ast1; - }; - - // methods to evaluate a constant expression - (function (def){ - // The evaluate method returns an array with one or two - // elements. If the node has been successfully reduced to a - // constant, then the second element tells us the value; - // otherwise the second element is missing. The first element - // of the array is always an AST_Node descendant; when - // evaluation was successful it's a node that represents the - // constant; otherwise it's the original node. - AST_Node.DEFMETHOD("evaluate", function(compressor){ - if (!compressor.option("evaluate")) return [ this ]; - try { - var val = this._eval(), ast = make_node_from_constant(compressor, val, this); - return [ best_of(ast, this), val ]; - } catch(ex) { - if (ex !== def) throw ex; - return [ this ]; - } - }); - def(AST_Statement, function(){ - throw new Error(string_template("Cannot evaluate a statement [{file}:{line},{col}]", this.start)); - }); - def(AST_Function, function(){ - // XXX: AST_Function inherits from AST_Scope, which itself - // inherits from AST_Statement; however, an AST_Function - // isn't really a statement. This could byte in other - // places too. :-( Wish JS had multiple inheritance. - return [ this ]; - }); - function ev(node) { - return node._eval(); - }; - def(AST_Node, function(){ - throw def; // not constant - }); - def(AST_Constant, function(){ - return this.getValue(); - }); - def(AST_UnaryPrefix, function(){ - var e = this.expression; - switch (this.operator) { - case "!": return !ev(e); - case "typeof": - // Function would be evaluated to an array and so typeof would - // incorrectly return 'object'. Hence making is a special case. - if (e instanceof AST_Function) return typeof function(){}; - - e = ev(e); - - // typeof returns "object" or "function" on different platforms - // so cannot evaluate reliably - if (e instanceof RegExp) throw def; - - return typeof e; - case "void": return void ev(e); - case "~": return ~ev(e); - case "-": - e = ev(e); - if (e === 0) throw def; - return -e; - case "+": return +ev(e); - } - throw def; - }); - def(AST_Binary, function(){ - var left = this.left, right = this.right; - switch (this.operator) { - case "&&" : return ev(left) && ev(right); - case "||" : return ev(left) || ev(right); - case "|" : return ev(left) | ev(right); - case "&" : return ev(left) & ev(right); - case "^" : return ev(left) ^ ev(right); - case "+" : return ev(left) + ev(right); - case "*" : return ev(left) * ev(right); - case "/" : return ev(left) / ev(right); - case "%" : return ev(left) % ev(right); - case "-" : return ev(left) - ev(right); - case "<<" : return ev(left) << ev(right); - case ">>" : return ev(left) >> ev(right); - case ">>>" : return ev(left) >>> ev(right); - case "==" : return ev(left) == ev(right); - case "===" : return ev(left) === ev(right); - case "!=" : return ev(left) != ev(right); - case "!==" : return ev(left) !== ev(right); - case "<" : return ev(left) < ev(right); - case "<=" : return ev(left) <= ev(right); - case ">" : return ev(left) > ev(right); - case ">=" : return ev(left) >= ev(right); - case "in" : return ev(left) in ev(right); - case "instanceof" : return ev(left) instanceof ev(right); - } - throw def; - }); - def(AST_Conditional, function(){ - return ev(this.condition) - ? ev(this.consequent) - : ev(this.alternative); - }); - def(AST_SymbolRef, function(){ - var d = this.definition(); - if (d && d.constant && d.init) return ev(d.init); - throw def; - }); - })(function(node, func){ - node.DEFMETHOD("_eval", func); - }); - - // method to negate an expression - (function(def){ - function basic_negation(exp) { - return make_node(AST_UnaryPrefix, exp, { - operator: "!", - expression: exp - }); - }; - def(AST_Node, function(){ - return basic_negation(this); - }); - def(AST_Statement, function(){ - throw new Error("Cannot negate a statement"); - }); - def(AST_Function, function(){ - return basic_negation(this); - }); - def(AST_UnaryPrefix, function(){ - if (this.operator == "!") - return this.expression; - return basic_negation(this); - }); - def(AST_Seq, function(compressor){ - var self = this.clone(); - self.cdr = self.cdr.negate(compressor); - return self; - }); - def(AST_Conditional, function(compressor){ - var self = this.clone(); - self.consequent = self.consequent.negate(compressor); - self.alternative = self.alternative.negate(compressor); - return best_of(basic_negation(this), self); - }); - def(AST_Binary, function(compressor){ - var self = this.clone(), op = this.operator; - if (compressor.option("unsafe_comps")) { - switch (op) { - case "<=" : self.operator = ">" ; return self; - case "<" : self.operator = ">=" ; return self; - case ">=" : self.operator = "<" ; return self; - case ">" : self.operator = "<=" ; return self; - } - } - switch (op) { - case "==" : self.operator = "!="; return self; - case "!=" : self.operator = "=="; return self; - case "===": self.operator = "!=="; return self; - case "!==": self.operator = "==="; return self; - case "&&": - self.operator = "||"; - self.left = self.left.negate(compressor); - self.right = self.right.negate(compressor); - return best_of(basic_negation(this), self); - case "||": - self.operator = "&&"; - self.left = self.left.negate(compressor); - self.right = self.right.negate(compressor); - return best_of(basic_negation(this), self); - } - return basic_negation(this); - }); - })(function(node, func){ - node.DEFMETHOD("negate", function(compressor){ - return func.call(this, compressor); - }); - }); - - // determine if expression has side effects - (function(def){ - def(AST_Node, function(){ return true }); - - def(AST_EmptyStatement, function(){ return false }); - def(AST_Constant, function(){ return false }); - def(AST_This, function(){ return false }); - - def(AST_Block, function(){ - for (var i = this.body.length; --i >= 0;) { - if (this.body[i].has_side_effects()) - return true; - } - return false; - }); - - def(AST_SimpleStatement, function(){ - return this.body.has_side_effects(); - }); - def(AST_Defun, function(){ return true }); - def(AST_Function, function(){ return false }); - def(AST_Binary, function(){ - return this.left.has_side_effects() - || this.right.has_side_effects(); - }); - def(AST_Assign, function(){ return true }); - def(AST_Conditional, function(){ - return this.condition.has_side_effects() - || this.consequent.has_side_effects() - || this.alternative.has_side_effects(); - }); - def(AST_Unary, function(){ - return this.operator == "delete" - || this.operator == "++" - || this.operator == "--" - || this.expression.has_side_effects(); - }); - def(AST_SymbolRef, function(){ return false }); - def(AST_Object, function(){ - for (var i = this.properties.length; --i >= 0;) - if (this.properties[i].has_side_effects()) - return true; - return false; - }); - def(AST_ObjectProperty, function(){ - return this.value.has_side_effects(); - }); - def(AST_Array, function(){ - for (var i = this.elements.length; --i >= 0;) - if (this.elements[i].has_side_effects()) - return true; - return false; - }); - // def(AST_Dot, function(){ - // return this.expression.has_side_effects(); - // }); - // def(AST_Sub, function(){ - // return this.expression.has_side_effects() - // || this.property.has_side_effects(); - // }); - def(AST_PropAccess, function(){ - return true; - }); - def(AST_Seq, function(){ - return this.car.has_side_effects() - || this.cdr.has_side_effects(); - }); - })(function(node, func){ - node.DEFMETHOD("has_side_effects", func); - }); - - // tell me if a statement aborts - function aborts(thing) { - return thing && thing.aborts(); - }; - (function(def){ - def(AST_Statement, function(){ return null }); - def(AST_Jump, function(){ return this }); - function block_aborts(){ - var n = this.body.length; - return n > 0 && aborts(this.body[n - 1]); - }; - def(AST_BlockStatement, block_aborts); - def(AST_SwitchBranch, block_aborts); - def(AST_If, function(){ - return this.alternative && aborts(this.body) && aborts(this.alternative); - }); - })(function(node, func){ - node.DEFMETHOD("aborts", func); - }); - - /* -----[ optimizers ]----- */ - - OPT(AST_Directive, function(self, compressor){ - if (self.scope.has_directive(self.value) !== self.scope) { - return make_node(AST_EmptyStatement, self); - } - return self; - }); - - OPT(AST_Debugger, function(self, compressor){ - if (compressor.option("drop_debugger")) - return make_node(AST_EmptyStatement, self); - return self; - }); - - OPT(AST_LabeledStatement, function(self, compressor){ - if (self.body instanceof AST_Break - && compressor.loopcontrol_target(self.body.label) === self.body) { - return make_node(AST_EmptyStatement, self); - } - return self.label.references.length == 0 ? self.body : self; - }); - - OPT(AST_Block, function(self, compressor){ - self.body = tighten_body(self.body, compressor); - return self; - }); - - OPT(AST_BlockStatement, function(self, compressor){ - self.body = tighten_body(self.body, compressor); - switch (self.body.length) { - case 1: return self.body[0]; - case 0: return make_node(AST_EmptyStatement, self); - } - return self; - }); - - AST_Scope.DEFMETHOD("drop_unused", function(compressor){ - var self = this; - if (compressor.option("unused") - && !(self instanceof AST_Toplevel) - && !self.uses_eval - ) { - var in_use = []; - var initializations = new Dictionary(); - // pass 1: find out which symbols are directly used in - // this scope (not in nested scopes). - var scope = this; - var tw = new TreeWalker(function(node, descend){ - if (node !== self) { - if (node instanceof AST_Defun) { - initializations.add(node.name.name, node); - return true; // don't go in nested scopes - } - if (node instanceof AST_Definitions && scope === self) { - node.definitions.forEach(function(def){ - if (def.value) { - initializations.add(def.name.name, def.value); - if (def.value.has_side_effects()) { - def.value.walk(tw); - } - } - }); - return true; - } - if (node instanceof AST_SymbolRef) { - push_uniq(in_use, node.definition()); - return true; - } - if (node instanceof AST_Scope) { - var save_scope = scope; - scope = node; - descend(); - scope = save_scope; - return true; - } - } - }); - self.walk(tw); - // pass 2: for every used symbol we need to walk its - // initialization code to figure out if it uses other - // symbols (that may not be in_use). - for (var i = 0; i < in_use.length; ++i) { - in_use[i].orig.forEach(function(decl){ - // undeclared globals will be instanceof AST_SymbolRef - var init = initializations.get(decl.name); - if (init) init.forEach(function(init){ - var tw = new TreeWalker(function(node){ - if (node instanceof AST_SymbolRef) { - push_uniq(in_use, node.definition()); - } - }); - init.walk(tw); - }); - }); - } - // pass 3: we should drop declarations not in_use - var tt = new TreeTransformer( - function before(node, descend, in_list) { - if (node instanceof AST_Lambda) { - for (var a = node.argnames, i = a.length; --i >= 0;) { - var sym = a[i]; - if (sym.unreferenced()) { - a.pop(); - compressor.warn("Dropping unused function argument {name} [{file}:{line},{col}]", { - name : sym.name, - file : sym.start.file, - line : sym.start.line, - col : sym.start.col - }); - } - else break; - } - } - if (node instanceof AST_Defun && node !== self) { - if (!member(node.name.definition(), in_use)) { - compressor.warn("Dropping unused function {name} [{file}:{line},{col}]", { - name : node.name.name, - file : node.name.start.file, - line : node.name.start.line, - col : node.name.start.col - }); - return make_node(AST_EmptyStatement, node); - } - return node; - } - if (node instanceof AST_Definitions && !(tt.parent() instanceof AST_ForIn)) { - var def = node.definitions.filter(function(def){ - if (member(def.name.definition(), in_use)) return true; - var w = { - name : def.name.name, - file : def.name.start.file, - line : def.name.start.line, - col : def.name.start.col - }; - if (def.value && def.value.has_side_effects()) { - def._unused_side_effects = true; - compressor.warn("Side effects in initialization of unused variable {name} [{file}:{line},{col}]", w); - return true; - } - compressor.warn("Dropping unused variable {name} [{file}:{line},{col}]", w); - return false; - }); - // place uninitialized names at the start - def = mergeSort(def, function(a, b){ - if (!a.value && b.value) return -1; - if (!b.value && a.value) return 1; - return 0; - }); - // for unused names whose initialization has - // side effects, we can cascade the init. code - // into the next one, or next statement. - var side_effects = []; - for (var i = 0; i < def.length;) { - var x = def[i]; - if (x._unused_side_effects) { - side_effects.push(x.value); - def.splice(i, 1); - } else { - if (side_effects.length > 0) { - side_effects.push(x.value); - x.value = AST_Seq.from_array(side_effects); - side_effects = []; - } - ++i; - } - } - if (side_effects.length > 0) { - side_effects = make_node(AST_BlockStatement, node, { - body: [ make_node(AST_SimpleStatement, node, { - body: AST_Seq.from_array(side_effects) - }) ] - }); - } else { - side_effects = null; - } - if (def.length == 0 && !side_effects) { - return make_node(AST_EmptyStatement, node); - } - if (def.length == 0) { - return side_effects; - } - node.definitions = def; - if (side_effects) { - side_effects.body.unshift(node); - node = side_effects; - } - return node; - } - if (node instanceof AST_For && node.init instanceof AST_BlockStatement) { - descend(node, this); - // certain combination of unused name + side effect leads to: - // https://github.com/mishoo/UglifyJS2/issues/44 - // that's an invalid AST. - // We fix it at this stage by moving the `var` outside the `for`. - var body = node.init.body.slice(0, -1); - node.init = node.init.body.slice(-1)[0].body; - body.push(node); - return in_list ? MAP.splice(body) : make_node(AST_BlockStatement, node, { - body: body - }); - } - if (node instanceof AST_Scope && node !== self) - return node; - } - ); - self.transform(tt); - } - }); - - AST_Scope.DEFMETHOD("hoist_declarations", function(compressor){ - var hoist_funs = compressor.option("hoist_funs"); - var hoist_vars = compressor.option("hoist_vars"); - var self = this; - if (hoist_funs || hoist_vars) { - var dirs = []; - var hoisted = []; - var vars = new Dictionary(), vars_found = 0, var_decl = 0; - // let's count var_decl first, we seem to waste a lot of - // space if we hoist `var` when there's only one. - self.walk(new TreeWalker(function(node){ - if (node instanceof AST_Scope && node !== self) - return true; - if (node instanceof AST_Var) { - ++var_decl; - return true; - } - })); - hoist_vars = hoist_vars && var_decl > 1; - var tt = new TreeTransformer( - function before(node) { - if (node !== self) { - if (node instanceof AST_Directive) { - dirs.push(node); - return make_node(AST_EmptyStatement, node); - } - if (node instanceof AST_Defun && hoist_funs) { - hoisted.push(node); - return make_node(AST_EmptyStatement, node); - } - if (node instanceof AST_Var && hoist_vars) { - node.definitions.forEach(function(def){ - vars.set(def.name.name, def); - ++vars_found; - }); - var seq = node.to_assignments(); - var p = tt.parent(); - if (p instanceof AST_ForIn && p.init === node) { - if (seq == null) return node.definitions[0].name; - return seq; - } - if (p instanceof AST_For && p.init === node) { - return seq; - } - if (!seq) return make_node(AST_EmptyStatement, node); - return make_node(AST_SimpleStatement, node, { - body: seq - }); - } - if (node instanceof AST_Scope) - return node; // to avoid descending in nested scopes - } - } - ); - self = self.transform(tt); - if (vars_found > 0) { - // collect only vars which don't show up in self's arguments list - var defs = []; - vars.each(function(def, name){ - if (self instanceof AST_Lambda - && find_if(function(x){ return x.name == def.name.name }, - self.argnames)) { - vars.del(name); - } else { - def = def.clone(); - def.value = null; - defs.push(def); - vars.set(name, def); - } - }); - if (defs.length > 0) { - // try to merge in assignments - for (var i = 0; i < self.body.length;) { - if (self.body[i] instanceof AST_SimpleStatement) { - var expr = self.body[i].body, sym, assign; - if (expr instanceof AST_Assign - && expr.operator == "=" - && (sym = expr.left) instanceof AST_Symbol - && vars.has(sym.name)) - { - var def = vars.get(sym.name); - if (def.value) break; - def.value = expr.right; - remove(defs, def); - defs.push(def); - self.body.splice(i, 1); - continue; - } - if (expr instanceof AST_Seq - && (assign = expr.car) instanceof AST_Assign - && assign.operator == "=" - && (sym = assign.left) instanceof AST_Symbol - && vars.has(sym.name)) - { - var def = vars.get(sym.name); - if (def.value) break; - def.value = assign.right; - remove(defs, def); - defs.push(def); - self.body[i].body = expr.cdr; - continue; - } - } - if (self.body[i] instanceof AST_EmptyStatement) { - self.body.splice(i, 1); - continue; - } - if (self.body[i] instanceof AST_BlockStatement) { - var tmp = [ i, 1 ].concat(self.body[i].body); - self.body.splice.apply(self.body, tmp); - continue; - } - break; - } - defs = make_node(AST_Var, self, { - definitions: defs - }); - hoisted.push(defs); - }; - } - self.body = dirs.concat(hoisted, self.body); - } - return self; - }); - - OPT(AST_SimpleStatement, function(self, compressor){ - if (compressor.option("side_effects")) { - if (!self.body.has_side_effects()) { - compressor.warn("Dropping side-effect-free statement [{file}:{line},{col}]", self.start); - return make_node(AST_EmptyStatement, self); - } - } - return self; - }); - - OPT(AST_DWLoop, function(self, compressor){ - var cond = self.condition.evaluate(compressor); - self.condition = cond[0]; - if (!compressor.option("loops")) return self; - if (cond.length > 1) { - if (cond[1]) { - return make_node(AST_For, self, { - body: self.body - }); - } else if (self instanceof AST_While) { - if (compressor.option("dead_code")) { - var a = []; - extract_declarations_from_unreachable_code(compressor, self.body, a); - return make_node(AST_BlockStatement, self, { body: a }); - } - } - } - return self; - }); - - function if_break_in_loop(self, compressor) { - function drop_it(rest) { - rest = as_statement_array(rest); - if (self.body instanceof AST_BlockStatement) { - self.body = self.body.clone(); - self.body.body = rest.concat(self.body.body.slice(1)); - self.body = self.body.transform(compressor); - } else { - self.body = make_node(AST_BlockStatement, self.body, { - body: rest - }).transform(compressor); - } - if_break_in_loop(self, compressor); - } - var first = self.body instanceof AST_BlockStatement ? self.body.body[0] : self.body; - if (first instanceof AST_If) { - if (first.body instanceof AST_Break - && compressor.loopcontrol_target(first.body.label) === self) { - if (self.condition) { - self.condition = make_node(AST_Binary, self.condition, { - left: self.condition, - operator: "&&", - right: first.condition.negate(compressor), - }); - } else { - self.condition = first.condition.negate(compressor); - } - drop_it(first.alternative); - } - else if (first.alternative instanceof AST_Break - && compressor.loopcontrol_target(first.alternative.label) === self) { - if (self.condition) { - self.condition = make_node(AST_Binary, self.condition, { - left: self.condition, - operator: "&&", - right: first.condition, - }); - } else { - self.condition = first.condition; - } - drop_it(first.body); - } - } - }; - - OPT(AST_While, function(self, compressor) { - if (!compressor.option("loops")) return self; - self = AST_DWLoop.prototype.optimize.call(self, compressor); - if (self instanceof AST_While) { - if_break_in_loop(self, compressor); - self = make_node(AST_For, self, self).transform(compressor); - } - return self; - }); - - OPT(AST_For, function(self, compressor){ - var cond = self.condition; - if (cond) { - cond = cond.evaluate(compressor); - self.condition = cond[0]; - } - if (!compressor.option("loops")) return self; - if (cond) { - if (cond.length > 1 && !cond[1]) { - if (compressor.option("dead_code")) { - var a = []; - if (self.init instanceof AST_Statement) { - a.push(self.init); - } - else if (self.init) { - a.push(make_node(AST_SimpleStatement, self.init, { - body: self.init - })); - } - extract_declarations_from_unreachable_code(compressor, self.body, a); - return make_node(AST_BlockStatement, self, { body: a }); - } - } - } - if_break_in_loop(self, compressor); - return self; - }); - - OPT(AST_If, function(self, compressor){ - if (!compressor.option("conditionals")) return self; - // if condition can be statically determined, warn and drop - // one of the blocks. note, statically determined implies - // “has no side effects”; also it doesn't work for cases like - // `x && true`, though it probably should. - var cond = self.condition.evaluate(compressor); - self.condition = cond[0]; - if (cond.length > 1) { - if (cond[1]) { - compressor.warn("Condition always true [{file}:{line},{col}]", self.condition.start); - if (compressor.option("dead_code")) { - var a = []; - if (self.alternative) { - extract_declarations_from_unreachable_code(compressor, self.alternative, a); - } - a.push(self.body); - return make_node(AST_BlockStatement, self, { body: a }).transform(compressor); - } - } else { - compressor.warn("Condition always false [{file}:{line},{col}]", self.condition.start); - if (compressor.option("dead_code")) { - var a = []; - extract_declarations_from_unreachable_code(compressor, self.body, a); - if (self.alternative) a.push(self.alternative); - return make_node(AST_BlockStatement, self, { body: a }).transform(compressor); - } - } - } - if (is_empty(self.alternative)) self.alternative = null; - var negated = self.condition.negate(compressor); - var negated_is_best = best_of(self.condition, negated) === negated; - if (self.alternative && negated_is_best) { - negated_is_best = false; // because we already do the switch here. - self.condition = negated; - var tmp = self.body; - self.body = self.alternative || make_node(AST_EmptyStatement); - self.alternative = tmp; - } - if (is_empty(self.body) && is_empty(self.alternative)) { - return make_node(AST_SimpleStatement, self.condition, { - body: self.condition - }).transform(compressor); - } - if (self.body instanceof AST_SimpleStatement - && self.alternative instanceof AST_SimpleStatement) { - return make_node(AST_SimpleStatement, self, { - body: make_node(AST_Conditional, self, { - condition : self.condition, - consequent : self.body.body, - alternative : self.alternative.body - }) - }).transform(compressor); - } - if (is_empty(self.alternative) && self.body instanceof AST_SimpleStatement) { - if (negated_is_best) return make_node(AST_SimpleStatement, self, { - body: make_node(AST_Binary, self, { - operator : "||", - left : negated, - right : self.body.body - }) - }).transform(compressor); - return make_node(AST_SimpleStatement, self, { - body: make_node(AST_Binary, self, { - operator : "&&", - left : self.condition, - right : self.body.body - }) - }).transform(compressor); - } - if (self.body instanceof AST_EmptyStatement - && self.alternative - && self.alternative instanceof AST_SimpleStatement) { - return make_node(AST_SimpleStatement, self, { - body: make_node(AST_Binary, self, { - operator : "||", - left : self.condition, - right : self.alternative.body - }) - }).transform(compressor); - } - if (self.body instanceof AST_Exit - && self.alternative instanceof AST_Exit - && self.body.TYPE == self.alternative.TYPE) { - return make_node(self.body.CTOR, self, { - value: make_node(AST_Conditional, self, { - condition : self.condition, - consequent : self.body.value || make_node(AST_Undefined, self.body).optimize(compressor), - alternative : self.alternative.value || make_node(AST_Undefined, self.alternative).optimize(compressor) - }) - }).transform(compressor); - } - if (self.body instanceof AST_If - && !self.body.alternative - && !self.alternative) { - self.condition = make_node(AST_Binary, self.condition, { - operator: "&&", - left: self.condition, - right: self.body.condition - }).transform(compressor); - self.body = self.body.body; - } - if (aborts(self.body)) { - if (self.alternative) { - var alt = self.alternative; - self.alternative = null; - return make_node(AST_BlockStatement, self, { - body: [ self, alt ] - }).transform(compressor); - } - } - if (aborts(self.alternative)) { - var body = self.body; - self.body = self.alternative; - self.condition = negated_is_best ? negated : self.condition.negate(compressor); - self.alternative = null; - return make_node(AST_BlockStatement, self, { - body: [ self, body ] - }).transform(compressor); - } - return self; - }); - - OPT(AST_Switch, function(self, compressor){ - if (self.body.length == 0 && compressor.option("conditionals")) { - return make_node(AST_SimpleStatement, self, { - body: self.expression - }).transform(compressor); - } - for(;;) { - var last_branch = self.body[self.body.length - 1]; - if (last_branch) { - var stat = last_branch.body[last_branch.body.length - 1]; // last statement - if (stat instanceof AST_Break && loop_body(compressor.loopcontrol_target(stat.label)) === self) - last_branch.body.pop(); - if (last_branch instanceof AST_Default && last_branch.body.length == 0) { - self.body.pop(); - continue; - } - } - break; - } - var exp = self.expression.evaluate(compressor); - out: if (exp.length == 2) try { - // constant expression - self.expression = exp[0]; - if (!compressor.option("dead_code")) break out; - var value = exp[1]; - var in_if = false; - var in_block = false; - var started = false; - var stopped = false; - var ruined = false; - var tt = new TreeTransformer(function(node, descend, in_list){ - if (node instanceof AST_Lambda || node instanceof AST_SimpleStatement) { - // no need to descend these node types - return node; - } - else if (node instanceof AST_Switch && node === self) { - node = node.clone(); - descend(node, this); - return ruined ? node : make_node(AST_BlockStatement, node, { - body: node.body.reduce(function(a, branch){ - return a.concat(branch.body); - }, []) - }).transform(compressor); - } - else if (node instanceof AST_If || node instanceof AST_Try) { - var save = in_if; - in_if = !in_block; - descend(node, this); - in_if = save; - return node; - } - else if (node instanceof AST_StatementWithBody || node instanceof AST_Switch) { - var save = in_block; - in_block = true; - descend(node, this); - in_block = save; - return node; - } - else if (node instanceof AST_Break && this.loopcontrol_target(node.label) === self) { - if (in_if) { - ruined = true; - return node; - } - if (in_block) return node; - stopped = true; - return in_list ? MAP.skip : make_node(AST_EmptyStatement, node); - } - else if (node instanceof AST_SwitchBranch && this.parent() === self) { - if (stopped) return MAP.skip; - if (node instanceof AST_Case) { - var exp = node.expression.evaluate(compressor); - if (exp.length < 2) { - // got a case with non-constant expression, baling out - throw self; - } - if (exp[1] === value || started) { - started = true; - if (aborts(node)) stopped = true; - descend(node, this); - return node; - } - return MAP.skip; - } - descend(node, this); - return node; - } - }); - tt.stack = compressor.stack.slice(); // so that's able to see parent nodes - self = self.transform(tt); - } catch(ex) { - if (ex !== self) throw ex; - } - return self; - }); - - OPT(AST_Case, function(self, compressor){ - self.body = tighten_body(self.body, compressor); - return self; - }); - - OPT(AST_Try, function(self, compressor){ - self.body = tighten_body(self.body, compressor); - return self; - }); - - AST_Definitions.DEFMETHOD("remove_initializers", function(){ - this.definitions.forEach(function(def){ def.value = null }); - }); - - AST_Definitions.DEFMETHOD("to_assignments", function(){ - var assignments = this.definitions.reduce(function(a, def){ - if (def.value) { - var name = make_node(AST_SymbolRef, def.name, def.name); - a.push(make_node(AST_Assign, def, { - operator : "=", - left : name, - right : def.value - })); - } - return a; - }, []); - if (assignments.length == 0) return null; - return AST_Seq.from_array(assignments); - }); - - OPT(AST_Definitions, function(self, compressor){ - if (self.definitions.length == 0) - return make_node(AST_EmptyStatement, self); - return self; - }); - - OPT(AST_Function, function(self, compressor){ - self = AST_Lambda.prototype.optimize.call(self, compressor); - if (compressor.option("unused")) { - if (self.name && self.name.unreferenced()) { - self.name = null; - } - } - return self; - }); - - OPT(AST_Call, function(self, compressor){ - if (compressor.option("unsafe")) { - var exp = self.expression; - if (exp instanceof AST_SymbolRef && exp.undeclared()) { - switch (exp.name) { - case "Array": - if (self.args.length != 1) { - return make_node(AST_Array, self, { - elements: self.args - }); - } - break; - case "Object": - if (self.args.length == 0) { - return make_node(AST_Object, self, { - properties: [] - }); - } - break; - case "String": - if (self.args.length == 0) return make_node(AST_String, self, { - value: "" - }); - return make_node(AST_Binary, self, { - left: self.args[0], - operator: "+", - right: make_node(AST_String, self, { value: "" }) - }); - case "Function": - if (all(self.args, function(x){ return x instanceof AST_String })) { - // quite a corner-case, but we can handle it: - // https://github.com/mishoo/UglifyJS2/issues/203 - // if the code argument is a constant, then we can minify it. - try { - var code = "(function(" + self.args.slice(0, -1).map(function(arg){ - return arg.value; - }).join(",") + "){" + self.args[self.args.length - 1].value + "})()"; - var ast = parse(code); - ast.figure_out_scope(); - var comp = new Compressor(compressor.options); - ast = ast.transform(comp); - ast.figure_out_scope(); - ast.mangle_names(); - var fun = ast.body[0].body.expression; - var args = fun.argnames.map(function(arg, i){ - return make_node(AST_String, self.args[i], { - value: arg.print_to_string() - }); - }); - var code = OutputStream(); - AST_BlockStatement.prototype._codegen.call(fun, fun, code); - code = code.toString().replace(/^\{|\}$/g, ""); - args.push(make_node(AST_String, self.args[self.args.length - 1], { - value: code - })); - self.args = args; - return self; - } catch(ex) { - if (ex instanceof JS_Parse_Error) { - compressor.warn("Error parsing code passed to new Function [{file}:{line},{col}]", self.args[self.args.length - 1].start); - compressor.warn(ex.toString()); - } else { - console.log(ex); - } - } - } - break; - } - } - else if (exp instanceof AST_Dot && exp.property == "toString" && self.args.length == 0) { - return make_node(AST_Binary, self, { - left: make_node(AST_String, self, { value: "" }), - operator: "+", - right: exp.expression - }).transform(compressor); - } - } - if (compressor.option("side_effects")) { - if (self.expression instanceof AST_Function - && self.args.length == 0 - && !AST_Block.prototype.has_side_effects.call(self.expression)) { - return make_node(AST_Undefined, self).transform(compressor); - } - } - return self; - }); - - OPT(AST_New, function(self, compressor){ - if (compressor.option("unsafe")) { - var exp = self.expression; - if (exp instanceof AST_SymbolRef && exp.undeclared()) { - switch (exp.name) { - case "Object": - case "RegExp": - case "Function": - case "Error": - case "Array": - return make_node(AST_Call, self, self).transform(compressor); - } - } - } - return self; - }); - - OPT(AST_Seq, function(self, compressor){ - if (!compressor.option("side_effects")) - return self; - if (!self.car.has_side_effects()) { - // we shouldn't compress (1,eval)(something) to - // eval(something) because that changes the meaning of - // eval (becomes lexical instead of global). - var p; - if (!(self.cdr instanceof AST_SymbolRef - && self.cdr.name == "eval" - && self.cdr.undeclared() - && (p = compressor.parent()) instanceof AST_Call - && p.expression === self)) { - return self.cdr; - } - } - if (compressor.option("cascade")) { - if (self.car instanceof AST_Assign - && !self.car.left.has_side_effects() - && self.car.left.equivalent_to(self.cdr)) { - return self.car; - } - if (!self.car.has_side_effects() - && !self.cdr.has_side_effects() - && self.car.equivalent_to(self.cdr)) { - return self.car; - } - } - return self; - }); - - AST_Unary.DEFMETHOD("lift_sequences", function(compressor){ - if (compressor.option("sequences")) { - if (this.expression instanceof AST_Seq) { - var seq = this.expression; - var x = seq.to_array(); - this.expression = x.pop(); - x.push(this); - seq = AST_Seq.from_array(x).transform(compressor); - return seq; - } - } - return this; - }); - - OPT(AST_UnaryPostfix, function(self, compressor){ - return self.lift_sequences(compressor); - }); - - OPT(AST_UnaryPrefix, function(self, compressor){ - self = self.lift_sequences(compressor); - var e = self.expression; - if (compressor.option("booleans") && compressor.in_boolean_context()) { - switch (self.operator) { - case "!": - if (e instanceof AST_UnaryPrefix && e.operator == "!") { - // !!foo ==> foo, if we're in boolean context - return e.expression; - } - break; - case "typeof": - // typeof always returns a non-empty string, thus it's - // always true in booleans - compressor.warn("Boolean expression always true [{file}:{line},{col}]", self.start); - return make_node(AST_True, self); - } - if (e instanceof AST_Binary && self.operator == "!") { - self = best_of(self, e.negate(compressor)); - } - } - return self.evaluate(compressor)[0]; - }); - - AST_Binary.DEFMETHOD("lift_sequences", function(compressor){ - if (compressor.option("sequences")) { - if (this.left instanceof AST_Seq) { - var seq = this.left; - var x = seq.to_array(); - this.left = x.pop(); - x.push(this); - seq = AST_Seq.from_array(x).transform(compressor); - return seq; - } - if (this.right instanceof AST_Seq - && !(this.operator == "||" || this.operator == "&&") - && !this.left.has_side_effects()) { - var seq = this.right; - var x = seq.to_array(); - this.right = x.pop(); - x.push(this); - seq = AST_Seq.from_array(x).transform(compressor); - return seq; - } - } - return this; - }); - - var commutativeOperators = makePredicate("== === != !== * & | ^"); - - OPT(AST_Binary, function(self, compressor){ - function reverse(op, force) { - if (force || !(self.left.has_side_effects() || self.right.has_side_effects())) { - if (op) self.operator = op; - var tmp = self.left; - self.left = self.right; - self.right = tmp; - } - }; - if (commutativeOperators(self.operator)) { - if (self.right instanceof AST_Constant - && !(self.left instanceof AST_Constant)) { - // if right is a constant, whatever side effects the - // left side might have could not influence the - // result. hence, force switch. - reverse(null, true); - } - } - self = self.lift_sequences(compressor); - if (compressor.option("comparisons")) switch (self.operator) { - case "===": - case "!==": - if ((self.left.is_string(compressor) && self.right.is_string(compressor)) || - (self.left.is_boolean() && self.right.is_boolean())) { - self.operator = self.operator.substr(0, 2); - } - // XXX: intentionally falling down to the next case - case "==": - case "!=": - if (self.left instanceof AST_String - && self.left.value == "undefined" - && self.right instanceof AST_UnaryPrefix - && self.right.operator == "typeof" - && compressor.option("unsafe")) { - if (!(self.right.expression instanceof AST_SymbolRef) - || !self.right.expression.undeclared()) { - self.right = self.right.expression; - self.left = make_node(AST_Undefined, self.left).optimize(compressor); - if (self.operator.length == 2) self.operator += "="; - } - } - break; - } - if (compressor.option("booleans") && compressor.in_boolean_context()) switch (self.operator) { - case "&&": - var ll = self.left.evaluate(compressor); - var rr = self.right.evaluate(compressor); - if ((ll.length > 1 && !ll[1]) || (rr.length > 1 && !rr[1])) { - compressor.warn("Boolean && always false [{file}:{line},{col}]", self.start); - return make_node(AST_False, self); - } - if (ll.length > 1 && ll[1]) { - return rr[0]; - } - if (rr.length > 1 && rr[1]) { - return ll[0]; - } - break; - case "||": - var ll = self.left.evaluate(compressor); - var rr = self.right.evaluate(compressor); - if ((ll.length > 1 && ll[1]) || (rr.length > 1 && rr[1])) { - compressor.warn("Boolean || always true [{file}:{line},{col}]", self.start); - return make_node(AST_True, self); - } - if (ll.length > 1 && !ll[1]) { - return rr[0]; - } - if (rr.length > 1 && !rr[1]) { - return ll[0]; - } - break; - case "+": - var ll = self.left.evaluate(compressor); - var rr = self.right.evaluate(compressor); - if ((ll.length > 1 && ll[0] instanceof AST_String && ll[1]) || - (rr.length > 1 && rr[0] instanceof AST_String && rr[1])) { - compressor.warn("+ in boolean context always true [{file}:{line},{col}]", self.start); - return make_node(AST_True, self); - } - break; - } - var exp = self.evaluate(compressor); - if (exp.length > 1) { - if (best_of(exp[0], self) !== self) - return exp[0]; - } - if (compressor.option("comparisons")) { - if (!(compressor.parent() instanceof AST_Binary) - || compressor.parent() instanceof AST_Assign) { - var negated = make_node(AST_UnaryPrefix, self, { - operator: "!", - expression: self.negate(compressor) - }); - self = best_of(self, negated); - } - switch (self.operator) { - case "<": reverse(">"); break; - case "<=": reverse(">="); break; - } - } - if (self.operator == "+" && self.right instanceof AST_String - && self.right.getValue() === "" && self.left instanceof AST_Binary - && self.left.operator == "+" && self.left.is_string(compressor)) { - return self.left; - } - return self; - }); - - OPT(AST_SymbolRef, function(self, compressor){ - if (self.undeclared()) { - var defines = compressor.option("global_defs"); - if (defines && defines.hasOwnProperty(self.name)) { - return make_node_from_constant(compressor, defines[self.name], self); - } - switch (self.name) { - case "undefined": - return make_node(AST_Undefined, self); - case "NaN": - return make_node(AST_NaN, self); - case "Infinity": - return make_node(AST_Infinity, self); - } - } - return self; - }); - - OPT(AST_Undefined, function(self, compressor){ - if (compressor.option("unsafe")) { - var scope = compressor.find_parent(AST_Scope); - var undef = scope.find_variable("undefined"); - if (undef) { - var ref = make_node(AST_SymbolRef, self, { - name : "undefined", - scope : scope, - thedef : undef - }); - ref.reference(); - return ref; - } - } - return self; - }); - - var ASSIGN_OPS = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ]; - OPT(AST_Assign, function(self, compressor){ - self = self.lift_sequences(compressor); - if (self.operator == "=" - && self.left instanceof AST_SymbolRef - && self.right instanceof AST_Binary - && self.right.left instanceof AST_SymbolRef - && self.right.left.name == self.left.name - && member(self.right.operator, ASSIGN_OPS)) { - self.operator = self.right.operator + "="; - self.right = self.right.right; - } - return self; - }); - - OPT(AST_Conditional, function(self, compressor){ - if (!compressor.option("conditionals")) return self; - if (self.condition instanceof AST_Seq) { - var car = self.condition.car; - self.condition = self.condition.cdr; - return AST_Seq.cons(car, self); - } - var cond = self.condition.evaluate(compressor); - if (cond.length > 1) { - if (cond[1]) { - compressor.warn("Condition always true [{file}:{line},{col}]", self.start); - return self.consequent; - } else { - compressor.warn("Condition always false [{file}:{line},{col}]", self.start); - return self.alternative; - } - } - var negated = cond[0].negate(compressor); - if (best_of(cond[0], negated) === negated) { - self = make_node(AST_Conditional, self, { - condition: negated, - consequent: self.alternative, - alternative: self.consequent - }); - } - var consequent = self.consequent; - var alternative = self.alternative; - if (consequent instanceof AST_Assign - && alternative instanceof AST_Assign - && consequent.operator == alternative.operator - && consequent.left.equivalent_to(alternative.left) - ) { - /* - * Stuff like this: - * if (foo) exp = something; else exp = something_else; - * ==> - * exp = foo ? something : something_else; - */ - self = make_node(AST_Assign, self, { - operator: consequent.operator, - left: consequent.left, - right: make_node(AST_Conditional, self, { - condition: self.condition, - consequent: consequent.right, - alternative: alternative.right - }) - }); - } - return self; - }); - - OPT(AST_Boolean, function(self, compressor){ - if (compressor.option("booleans")) { - var p = compressor.parent(); - if (p instanceof AST_Binary && (p.operator == "==" - || p.operator == "!=")) { - compressor.warn("Non-strict equality against boolean: {operator} {value} [{file}:{line},{col}]", { - operator : p.operator, - value : self.value, - file : p.start.file, - line : p.start.line, - col : p.start.col, - }); - return make_node(AST_Number, self, { - value: +self.value - }); - } - return make_node(AST_UnaryPrefix, self, { - operator: "!", - expression: make_node(AST_Number, self, { - value: 1 - self.value - }) - }); - } - return self; - }); - - OPT(AST_Sub, function(self, compressor){ - var prop = self.property; - if (prop instanceof AST_String && compressor.option("properties")) { - prop = prop.getValue(); - if ((compressor.option("screw_ie8") && RESERVED_WORDS(prop)) - || (!(RESERVED_WORDS(prop)) && is_identifier_string(prop))) { - return make_node(AST_Dot, self, { - expression : self.expression, - property : prop - }); - } - } - return self; - }); - - function literals_in_boolean_context(self, compressor) { - if (compressor.option("booleans") && compressor.in_boolean_context()) { - return make_node(AST_True, self); - } - return self; - }; - OPT(AST_Array, literals_in_boolean_context); - OPT(AST_Object, literals_in_boolean_context); - OPT(AST_RegExp, literals_in_boolean_context); - -})(); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/mozilla-ast.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/mozilla-ast.js deleted file mode 100644 index d795094..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/mozilla-ast.js +++ /dev/null @@ -1,267 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -(function(){ - - var MOZ_TO_ME = { - TryStatement : function(M) { - return new AST_Try({ - start : my_start_token(M), - end : my_end_token(M), - body : from_moz(M.block).body, - bcatch : from_moz(M.handlers[0]), - bfinally : M.finalizer ? new AST_Finally(from_moz(M.finalizer)) : null - }); - }, - CatchClause : function(M) { - return new AST_Catch({ - start : my_start_token(M), - end : my_end_token(M), - argname : from_moz(M.param), - body : from_moz(M.body).body - }); - }, - ObjectExpression : function(M) { - return new AST_Object({ - start : my_start_token(M), - end : my_end_token(M), - properties : M.properties.map(function(prop){ - var key = prop.key; - var name = key.type == "Identifier" ? key.name : key.value; - var args = { - start : my_start_token(key), - end : my_end_token(prop.value), - key : name, - value : from_moz(prop.value) - }; - switch (prop.kind) { - case "init": - return new AST_ObjectKeyVal(args); - case "set": - args.value.name = from_moz(key); - return new AST_ObjectSetter(args); - case "get": - args.value.name = from_moz(key); - return new AST_ObjectGetter(args); - } - }) - }); - }, - SequenceExpression : function(M) { - return AST_Seq.from_array(M.expressions.map(from_moz)); - }, - MemberExpression : function(M) { - return new (M.computed ? AST_Sub : AST_Dot)({ - start : my_start_token(M), - end : my_end_token(M), - property : M.computed ? from_moz(M.property) : M.property.name, - expression : from_moz(M.object) - }); - }, - SwitchCase : function(M) { - return new (M.test ? AST_Case : AST_Default)({ - start : my_start_token(M), - end : my_end_token(M), - expression : from_moz(M.test), - body : M.consequent.map(from_moz) - }); - }, - Literal : function(M) { - var val = M.value, args = { - start : my_start_token(M), - end : my_end_token(M) - }; - if (val === null) return new AST_Null(args); - switch (typeof val) { - case "string": - args.value = val; - return new AST_String(args); - case "number": - args.value = val; - return new AST_Number(args); - case "boolean": - return new (val ? AST_True : AST_False)(args); - default: - args.value = val; - return new AST_RegExp(args); - } - }, - UnaryExpression: From_Moz_Unary, - UpdateExpression: From_Moz_Unary, - Identifier: function(M) { - var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2]; - return new (M.name == "this" ? AST_This - : p.type == "LabeledStatement" ? AST_Label - : p.type == "VariableDeclarator" && p.id === M ? (p.kind == "const" ? AST_SymbolConst : AST_SymbolVar) - : p.type == "FunctionExpression" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg) - : p.type == "FunctionDeclaration" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg) - : p.type == "CatchClause" ? AST_SymbolCatch - : p.type == "BreakStatement" || p.type == "ContinueStatement" ? AST_LabelRef - : AST_SymbolRef)({ - start : my_start_token(M), - end : my_end_token(M), - name : M.name - }); - } - }; - - function From_Moz_Unary(M) { - var prefix = "prefix" in M ? M.prefix - : M.type == "UnaryExpression" ? true : false; - return new (prefix ? AST_UnaryPrefix : AST_UnaryPostfix)({ - start : my_start_token(M), - end : my_end_token(M), - operator : M.operator, - expression : from_moz(M.argument) - }); - }; - - var ME_TO_MOZ = {}; - - map("Node", AST_Node); - map("Program", AST_Toplevel, "body@body"); - map("Function", AST_Function, "id>name, params@argnames, body%body"); - map("EmptyStatement", AST_EmptyStatement); - map("BlockStatement", AST_BlockStatement, "body@body"); - map("ExpressionStatement", AST_SimpleStatement, "expression>body"); - map("IfStatement", AST_If, "test>condition, consequent>body, alternate>alternative"); - map("LabeledStatement", AST_LabeledStatement, "label>label, body>body"); - map("BreakStatement", AST_Break, "label>label"); - map("ContinueStatement", AST_Continue, "label>label"); - map("WithStatement", AST_With, "object>expression, body>body"); - map("SwitchStatement", AST_Switch, "discriminant>expression, cases@body"); - map("ReturnStatement", AST_Return, "argument>value"); - map("ThrowStatement", AST_Throw, "argument>value"); - map("WhileStatement", AST_While, "test>condition, body>body"); - map("DoWhileStatement", AST_Do, "test>condition, body>body"); - map("ForStatement", AST_For, "init>init, test>condition, update>step, body>body"); - map("ForInStatement", AST_ForIn, "left>init, right>object, body>body"); - map("DebuggerStatement", AST_Debugger); - map("FunctionDeclaration", AST_Defun, "id>name, params@argnames, body%body"); - map("VariableDeclaration", AST_Var, "declarations@definitions"); - map("VariableDeclarator", AST_VarDef, "id>name, init>value"); - - map("ThisExpression", AST_This); - map("ArrayExpression", AST_Array, "elements@elements"); - map("FunctionExpression", AST_Function, "id>name, params@argnames, body%body"); - map("BinaryExpression", AST_Binary, "operator=operator, left>left, right>right"); - map("AssignmentExpression", AST_Assign, "operator=operator, left>left, right>right"); - map("LogicalExpression", AST_Binary, "operator=operator, left>left, right>right"); - map("ConditionalExpression", AST_Conditional, "test>condition, consequent>consequent, alternate>alternative"); - map("NewExpression", AST_New, "callee>expression, arguments@args"); - map("CallExpression", AST_Call, "callee>expression, arguments@args"); - - /* -----[ tools ]----- */ - - function my_start_token(moznode) { - return new AST_Token({ - file : moznode.loc && moznode.loc.source, - line : moznode.loc && moznode.loc.start.line, - col : moznode.loc && moznode.loc.start.column, - pos : moznode.start, - endpos : moznode.start - }); - }; - - function my_end_token(moznode) { - return new AST_Token({ - file : moznode.loc && moznode.loc.source, - line : moznode.loc && moznode.loc.end.line, - col : moznode.loc && moznode.loc.end.column, - pos : moznode.end, - endpos : moznode.end - }); - }; - - function map(moztype, mytype, propmap) { - var moz_to_me = "function From_Moz_" + moztype + "(M){\n"; - moz_to_me += "return new mytype({\n" + - "start: my_start_token(M),\n" + - "end: my_end_token(M)"; - - if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop){ - var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop); - if (!m) throw new Error("Can't understand property map: " + prop); - var moz = "M." + m[1], how = m[2], my = m[3]; - moz_to_me += ",\n" + my + ": "; - if (how == "@") { - moz_to_me += moz + ".map(from_moz)"; - } else if (how == ">") { - moz_to_me += "from_moz(" + moz + ")"; - } else if (how == "=") { - moz_to_me += moz; - } else if (how == "%") { - moz_to_me += "from_moz(" + moz + ").body"; - } else throw new Error("Can't understand operator in propmap: " + prop); - }); - moz_to_me += "\n})}"; - - // moz_to_me = parse(moz_to_me).print_to_string({ beautify: true }); - // console.log(moz_to_me); - - moz_to_me = new Function("mytype", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")( - mytype, my_start_token, my_end_token, from_moz - ); - return MOZ_TO_ME[moztype] = moz_to_me; - }; - - var FROM_MOZ_STACK = null; - - function from_moz(node) { - FROM_MOZ_STACK.push(node); - var ret = node != null ? MOZ_TO_ME[node.type](node) : null; - FROM_MOZ_STACK.pop(); - return ret; - }; - - AST_Node.from_mozilla_ast = function(node){ - var save_stack = FROM_MOZ_STACK; - FROM_MOZ_STACK = []; - var ast = from_moz(node); - FROM_MOZ_STACK = save_stack; - return ast; - }; - -})(); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/output.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/output.js deleted file mode 100644 index 60a4a26..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/output.js +++ /dev/null @@ -1,1229 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -function OutputStream(options) { - - options = defaults(options, { - indent_start : 0, - indent_level : 4, - quote_keys : false, - space_colon : true, - ascii_only : false, - inline_script : false, - width : 80, - max_line_len : 32000, - ie_proof : true, - beautify : false, - source_map : null, - bracketize : false, - semicolons : true, - comments : false, - preserve_line : false, - negate_iife : !(options && options.beautify), - }, true); - - var indentation = 0; - var current_col = 0; - var current_line = 1; - var current_pos = 0; - var OUTPUT = ""; - - function to_ascii(str, identifier) { - return str.replace(/[\u0080-\uffff]/g, function(ch) { - var code = ch.charCodeAt(0).toString(16); - if (code.length <= 2 && !identifier) { - while (code.length < 2) code = "0" + code; - return "\\x" + code; - } else { - while (code.length < 4) code = "0" + code; - return "\\u" + code; - } - }); - }; - - function make_string(str) { - var dq = 0, sq = 0; - str = str.replace(/[\\\b\f\n\r\t\x22\x27\u2028\u2029\0]/g, function(s){ - switch (s) { - case "\\": return "\\\\"; - case "\b": return "\\b"; - case "\f": return "\\f"; - case "\n": return "\\n"; - case "\r": return "\\r"; - case "\u2028": return "\\u2028"; - case "\u2029": return "\\u2029"; - case '"': ++dq; return '"'; - case "'": ++sq; return "'"; - case "\0": return "\\0"; - } - return s; - }); - if (options.ascii_only) str = to_ascii(str); - if (dq > sq) return "'" + str.replace(/\x27/g, "\\'") + "'"; - else return '"' + str.replace(/\x22/g, '\\"') + '"'; - }; - - function encode_string(str) { - var ret = make_string(str); - if (options.inline_script) - ret = ret.replace(/<\x2fscript([>\/\t\n\f\r ])/gi, "<\\/script$1"); - return ret; - }; - - function make_name(name) { - name = name.toString(); - if (options.ascii_only) - name = to_ascii(name, true); - return name; - }; - - function make_indent(back) { - return repeat_string(" ", options.indent_start + indentation - back * options.indent_level); - }; - - /* -----[ beautification/minification ]----- */ - - var might_need_space = false; - var might_need_semicolon = false; - var last = null; - - function last_char() { - return last.charAt(last.length - 1); - }; - - function maybe_newline() { - if (options.max_line_len && current_col > options.max_line_len) - print("\n"); - }; - - var requireSemicolonChars = makePredicate("( [ + * / - , ."); - - function print(str) { - str = String(str); - var ch = str.charAt(0); - if (might_need_semicolon) { - if ((!ch || ";}".indexOf(ch) < 0) && !/[;]$/.test(last)) { - if (options.semicolons || requireSemicolonChars(ch)) { - OUTPUT += ";"; - current_col++; - current_pos++; - } else { - OUTPUT += "\n"; - current_pos++; - current_line++; - current_col = 0; - } - if (!options.beautify) - might_need_space = false; - } - might_need_semicolon = false; - maybe_newline(); - } - - if (!options.beautify && options.preserve_line && stack[stack.length - 1]) { - var target_line = stack[stack.length - 1].start.line; - while (current_line < target_line) { - OUTPUT += "\n"; - current_pos++; - current_line++; - current_col = 0; - might_need_space = false; - } - } - - if (might_need_space) { - var prev = last_char(); - if ((is_identifier_char(prev) - && (is_identifier_char(ch) || ch == "\\")) - || (/^[\+\-\/]$/.test(ch) && ch == prev)) - { - OUTPUT += " "; - current_col++; - current_pos++; - } - might_need_space = false; - } - var a = str.split(/\r?\n/), n = a.length - 1; - current_line += n; - if (n == 0) { - current_col += a[n].length; - } else { - current_col = a[n].length; - } - current_pos += str.length; - last = str; - OUTPUT += str; - }; - - var space = options.beautify ? function() { - print(" "); - } : function() { - might_need_space = true; - }; - - var indent = options.beautify ? function(half) { - if (options.beautify) { - print(make_indent(half ? 0.5 : 0)); - } - } : noop; - - var with_indent = options.beautify ? function(col, cont) { - if (col === true) col = next_indent(); - var save_indentation = indentation; - indentation = col; - var ret = cont(); - indentation = save_indentation; - return ret; - } : function(col, cont) { return cont() }; - - var newline = options.beautify ? function() { - print("\n"); - } : noop; - - var semicolon = options.beautify ? function() { - print(";"); - } : function() { - might_need_semicolon = true; - }; - - function force_semicolon() { - might_need_semicolon = false; - print(";"); - }; - - function next_indent() { - return indentation + options.indent_level; - }; - - function with_block(cont) { - var ret; - print("{"); - newline(); - with_indent(next_indent(), function(){ - ret = cont(); - }); - indent(); - print("}"); - return ret; - }; - - function with_parens(cont) { - print("("); - //XXX: still nice to have that for argument lists - //var ret = with_indent(current_col, cont); - var ret = cont(); - print(")"); - return ret; - }; - - function with_square(cont) { - print("["); - //var ret = with_indent(current_col, cont); - var ret = cont(); - print("]"); - return ret; - }; - - function comma() { - print(","); - space(); - }; - - function colon() { - print(":"); - if (options.space_colon) space(); - }; - - var add_mapping = options.source_map ? function(token, name) { - try { - if (token) options.source_map.add( - token.file || "?", - current_line, current_col, - token.line, token.col, - (!name && token.type == "name") ? token.value : name - ); - } catch(ex) { - AST_Node.warn("Couldn't figure out mapping for {file}:{line},{col} → {cline},{ccol} [{name}]", { - file: token.file, - line: token.line, - col: token.col, - cline: current_line, - ccol: current_col, - name: name || "" - }) - } - } : noop; - - function get() { - return OUTPUT; - }; - - var stack = []; - return { - get : get, - toString : get, - indent : indent, - indentation : function() { return indentation }, - current_width : function() { return current_col - indentation }, - should_break : function() { return options.width && this.current_width() >= options.width }, - newline : newline, - print : print, - space : space, - comma : comma, - colon : colon, - last : function() { return last }, - semicolon : semicolon, - force_semicolon : force_semicolon, - to_ascii : to_ascii, - print_name : function(name) { print(make_name(name)) }, - print_string : function(str) { print(encode_string(str)) }, - next_indent : next_indent, - with_indent : with_indent, - with_block : with_block, - with_parens : with_parens, - with_square : with_square, - add_mapping : add_mapping, - option : function(opt) { return options[opt] }, - line : function() { return current_line }, - col : function() { return current_col }, - pos : function() { return current_pos }, - push_node : function(node) { stack.push(node) }, - pop_node : function() { return stack.pop() }, - stack : function() { return stack }, - parent : function(n) { - return stack[stack.length - 2 - (n || 0)]; - } - }; - -}; - -/* -----[ code generators ]----- */ - -(function(){ - - /* -----[ utils ]----- */ - - function DEFPRINT(nodetype, generator) { - nodetype.DEFMETHOD("_codegen", generator); - }; - - AST_Node.DEFMETHOD("print", function(stream, force_parens){ - var self = this, generator = self._codegen; - stream.push_node(self); - var needs_parens = self.needs_parens(stream); - var fc = self instanceof AST_Function && stream.option("negate_iife"); - if (force_parens || (needs_parens && !fc)) { - stream.with_parens(function(){ - self.add_comments(stream); - self.add_source_map(stream); - generator(self, stream); - }); - } else { - self.add_comments(stream); - if (needs_parens && fc) stream.print("!"); - self.add_source_map(stream); - generator(self, stream); - } - stream.pop_node(); - }); - - AST_Node.DEFMETHOD("print_to_string", function(options){ - var s = OutputStream(options); - this.print(s); - return s.get(); - }); - - /* -----[ comments ]----- */ - - AST_Node.DEFMETHOD("add_comments", function(output){ - var c = output.option("comments"), self = this; - if (c) { - var start = self.start; - if (start && !start._comments_dumped) { - start._comments_dumped = true; - var comments = start.comments_before; - - // XXX: ugly fix for https://github.com/mishoo/UglifyJS2/issues/112 - // if this node is `return` or `throw`, we cannot allow comments before - // the returned or thrown value. - if (self instanceof AST_Exit && - self.value && self.value.start.comments_before.length > 0) { - comments = (comments || []).concat(self.value.start.comments_before); - self.value.start.comments_before = []; - } - - if (c.test) { - comments = comments.filter(function(comment){ - return c.test(comment.value); - }); - } else if (typeof c == "function") { - comments = comments.filter(function(comment){ - return c(self, comment); - }); - } - comments.forEach(function(c){ - if (c.type == "comment1") { - output.print("//" + c.value + "\n"); - output.indent(); - } - else if (c.type == "comment2") { - output.print("/*" + c.value + "*/"); - if (start.nlb) { - output.print("\n"); - output.indent(); - } else { - output.space(); - } - } - }); - } - } - }); - - /* -----[ PARENTHESES ]----- */ - - function PARENS(nodetype, func) { - nodetype.DEFMETHOD("needs_parens", func); - }; - - PARENS(AST_Node, function(){ - return false; - }); - - // a function expression needs parens around it when it's provably - // the first token to appear in a statement. - PARENS(AST_Function, function(output){ - return first_in_statement(output); - }); - - // same goes for an object literal, because otherwise it would be - // interpreted as a block of code. - PARENS(AST_Object, function(output){ - return first_in_statement(output); - }); - - PARENS(AST_Unary, function(output){ - var p = output.parent(); - return p instanceof AST_PropAccess && p.expression === this; - }); - - PARENS(AST_Seq, function(output){ - var p = output.parent(); - return p instanceof AST_Call // (foo, bar)() or foo(1, (2, 3), 4) - || p instanceof AST_Unary // !(foo, bar, baz) - || p instanceof AST_Binary // 1 + (2, 3) + 4 ==> 8 - || p instanceof AST_VarDef // var a = (1, 2), b = a + a; ==> b == 4 - || p instanceof AST_Dot // (1, {foo:2}).foo ==> 2 - || p instanceof AST_Array // [ 1, (2, 3), 4 ] ==> [ 1, 3, 4 ] - || p instanceof AST_ObjectProperty // { foo: (1, 2) }.foo ==> 2 - || p instanceof AST_Conditional /* (false, true) ? (a = 10, b = 20) : (c = 30) - * ==> 20 (side effect, set a := 10 and b := 20) */ - ; - }); - - PARENS(AST_Binary, function(output){ - var p = output.parent(); - // (foo && bar)() - if (p instanceof AST_Call && p.expression === this) - return true; - // typeof (foo && bar) - if (p instanceof AST_Unary) - return true; - // (foo && bar)["prop"], (foo && bar).prop - if (p instanceof AST_PropAccess && p.expression === this) - return true; - // this deals with precedence: 3 * (2 + 1) - if (p instanceof AST_Binary) { - var po = p.operator, pp = PRECEDENCE[po]; - var so = this.operator, sp = PRECEDENCE[so]; - if (pp > sp - || (pp == sp - && this === p.right - && !(so == po && - (so == "*" || - so == "&&" || - so == "||")))) { - return true; - } - } - }); - - PARENS(AST_PropAccess, function(output){ - var p = output.parent(); - if (p instanceof AST_New && p.expression === this) { - // i.e. new (foo.bar().baz) - // - // if there's one call into this subtree, then we need - // parens around it too, otherwise the call will be - // interpreted as passing the arguments to the upper New - // expression. - try { - this.walk(new TreeWalker(function(node){ - if (node instanceof AST_Call) throw p; - })); - } catch(ex) { - if (ex !== p) throw ex; - return true; - } - } - }); - - PARENS(AST_Call, function(output){ - var p = output.parent(); - return p instanceof AST_New && p.expression === this; - }); - - PARENS(AST_New, function(output){ - var p = output.parent(); - if (no_constructor_parens(this, output) - && (p instanceof AST_PropAccess // (new Date).getTime(), (new Date)["getTime"]() - || p instanceof AST_Call && p.expression === this)) // (new foo)(bar) - return true; - }); - - PARENS(AST_Number, function(output){ - var p = output.parent(); - if (this.getValue() < 0 && p instanceof AST_PropAccess && p.expression === this) - return true; - }); - - PARENS(AST_NaN, function(output){ - var p = output.parent(); - if (p instanceof AST_PropAccess && p.expression === this) - return true; - }); - - function assign_and_conditional_paren_rules(output) { - var p = output.parent(); - // !(a = false) → true - if (p instanceof AST_Unary) - return true; - // 1 + (a = 2) + 3 → 6, side effect setting a = 2 - if (p instanceof AST_Binary && !(p instanceof AST_Assign)) - return true; - // (a = func)() —or— new (a = Object)() - if (p instanceof AST_Call && p.expression === this) - return true; - // (a = foo) ? bar : baz - if (p instanceof AST_Conditional && p.condition === this) - return true; - // (a = foo)["prop"] —or— (a = foo).prop - if (p instanceof AST_PropAccess && p.expression === this) - return true; - }; - - PARENS(AST_Assign, assign_and_conditional_paren_rules); - PARENS(AST_Conditional, assign_and_conditional_paren_rules); - - /* -----[ PRINTERS ]----- */ - - DEFPRINT(AST_Directive, function(self, output){ - output.print_string(self.value); - output.semicolon(); - }); - DEFPRINT(AST_Debugger, function(self, output){ - output.print("debugger"); - output.semicolon(); - }); - - /* -----[ statements ]----- */ - - function display_body(body, is_toplevel, output) { - var last = body.length - 1; - body.forEach(function(stmt, i){ - if (!(stmt instanceof AST_EmptyStatement)) { - output.indent(); - stmt.print(output); - if (!(i == last && is_toplevel)) { - output.newline(); - if (is_toplevel) output.newline(); - } - } - }); - }; - - AST_StatementWithBody.DEFMETHOD("_do_print_body", function(output){ - force_statement(this.body, output); - }); - - DEFPRINT(AST_Statement, function(self, output){ - self.body.print(output); - output.semicolon(); - }); - DEFPRINT(AST_Toplevel, function(self, output){ - display_body(self.body, true, output); - output.print(""); - }); - DEFPRINT(AST_LabeledStatement, function(self, output){ - self.label.print(output); - output.colon(); - self.body.print(output); - }); - DEFPRINT(AST_SimpleStatement, function(self, output){ - self.body.print(output); - output.semicolon(); - }); - function print_bracketed(body, output) { - if (body.length > 0) output.with_block(function(){ - display_body(body, false, output); - }); - else output.print("{}"); - }; - DEFPRINT(AST_BlockStatement, function(self, output){ - print_bracketed(self.body, output); - }); - DEFPRINT(AST_EmptyStatement, function(self, output){ - output.semicolon(); - }); - DEFPRINT(AST_Do, function(self, output){ - output.print("do"); - output.space(); - self._do_print_body(output); - output.space(); - output.print("while"); - output.space(); - output.with_parens(function(){ - self.condition.print(output); - }); - output.semicolon(); - }); - DEFPRINT(AST_While, function(self, output){ - output.print("while"); - output.space(); - output.with_parens(function(){ - self.condition.print(output); - }); - output.space(); - self._do_print_body(output); - }); - DEFPRINT(AST_For, function(self, output){ - output.print("for"); - output.space(); - output.with_parens(function(){ - if (self.init) { - if (self.init instanceof AST_Definitions) { - self.init.print(output); - } else { - parenthesize_for_noin(self.init, output, true); - } - output.print(";"); - output.space(); - } else { - output.print(";"); - } - if (self.condition) { - self.condition.print(output); - output.print(";"); - output.space(); - } else { - output.print(";"); - } - if (self.step) { - self.step.print(output); - } - }); - output.space(); - self._do_print_body(output); - }); - DEFPRINT(AST_ForIn, function(self, output){ - output.print("for"); - output.space(); - output.with_parens(function(){ - self.init.print(output); - output.space(); - output.print("in"); - output.space(); - self.object.print(output); - }); - output.space(); - self._do_print_body(output); - }); - DEFPRINT(AST_With, function(self, output){ - output.print("with"); - output.space(); - output.with_parens(function(){ - self.expression.print(output); - }); - output.space(); - self._do_print_body(output); - }); - - /* -----[ functions ]----- */ - AST_Lambda.DEFMETHOD("_do_print", function(output, nokeyword){ - var self = this; - if (!nokeyword) { - output.print("function"); - } - if (self.name) { - output.space(); - self.name.print(output); - } - output.with_parens(function(){ - self.argnames.forEach(function(arg, i){ - if (i) output.comma(); - arg.print(output); - }); - }); - output.space(); - print_bracketed(self.body, output); - }); - DEFPRINT(AST_Lambda, function(self, output){ - self._do_print(output); - }); - - /* -----[ exits ]----- */ - AST_Exit.DEFMETHOD("_do_print", function(output, kind){ - output.print(kind); - if (this.value) { - output.space(); - this.value.print(output); - } - output.semicolon(); - }); - DEFPRINT(AST_Return, function(self, output){ - self._do_print(output, "return"); - }); - DEFPRINT(AST_Throw, function(self, output){ - self._do_print(output, "throw"); - }); - - /* -----[ loop control ]----- */ - AST_LoopControl.DEFMETHOD("_do_print", function(output, kind){ - output.print(kind); - if (this.label) { - output.space(); - this.label.print(output); - } - output.semicolon(); - }); - DEFPRINT(AST_Break, function(self, output){ - self._do_print(output, "break"); - }); - DEFPRINT(AST_Continue, function(self, output){ - self._do_print(output, "continue"); - }); - - /* -----[ if ]----- */ - function make_then(self, output) { - if (output.option("bracketize")) { - make_block(self.body, output); - return; - } - // 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. - if (!self.body) - return output.force_semicolon(); - if (self.body instanceof AST_Do - && output.option("ie_proof")) { - // 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 - make_block(self.body, output); - return; - } - var b = self.body; - while (true) { - if (b instanceof AST_If) { - if (!b.alternative) { - make_block(self.body, output); - return; - } - b = b.alternative; - } - else if (b instanceof AST_StatementWithBody) { - b = b.body; - } - else break; - } - force_statement(self.body, output); - }; - DEFPRINT(AST_If, function(self, output){ - output.print("if"); - output.space(); - output.with_parens(function(){ - self.condition.print(output); - }); - output.space(); - if (self.alternative) { - make_then(self, output); - output.space(); - output.print("else"); - output.space(); - force_statement(self.alternative, output); - } else { - self._do_print_body(output); - } - }); - - /* -----[ switch ]----- */ - DEFPRINT(AST_Switch, function(self, output){ - output.print("switch"); - output.space(); - output.with_parens(function(){ - self.expression.print(output); - }); - output.space(); - if (self.body.length > 0) output.with_block(function(){ - self.body.forEach(function(stmt, i){ - if (i) output.newline(); - output.indent(true); - stmt.print(output); - }); - }); - else output.print("{}"); - }); - AST_SwitchBranch.DEFMETHOD("_do_print_body", function(output){ - if (this.body.length > 0) { - output.newline(); - this.body.forEach(function(stmt){ - output.indent(); - stmt.print(output); - output.newline(); - }); - } - }); - DEFPRINT(AST_Default, function(self, output){ - output.print("default:"); - self._do_print_body(output); - }); - DEFPRINT(AST_Case, function(self, output){ - output.print("case"); - output.space(); - self.expression.print(output); - output.print(":"); - self._do_print_body(output); - }); - - /* -----[ exceptions ]----- */ - DEFPRINT(AST_Try, function(self, output){ - output.print("try"); - output.space(); - print_bracketed(self.body, output); - if (self.bcatch) { - output.space(); - self.bcatch.print(output); - } - if (self.bfinally) { - output.space(); - self.bfinally.print(output); - } - }); - DEFPRINT(AST_Catch, function(self, output){ - output.print("catch"); - output.space(); - output.with_parens(function(){ - self.argname.print(output); - }); - output.space(); - print_bracketed(self.body, output); - }); - DEFPRINT(AST_Finally, function(self, output){ - output.print("finally"); - output.space(); - print_bracketed(self.body, output); - }); - - /* -----[ var/const ]----- */ - AST_Definitions.DEFMETHOD("_do_print", function(output, kind){ - output.print(kind); - output.space(); - this.definitions.forEach(function(def, i){ - if (i) output.comma(); - def.print(output); - }); - var p = output.parent(); - var in_for = p instanceof AST_For || p instanceof AST_ForIn; - var avoid_semicolon = in_for && p.init === this; - if (!avoid_semicolon) - output.semicolon(); - }); - DEFPRINT(AST_Var, function(self, output){ - self._do_print(output, "var"); - }); - DEFPRINT(AST_Const, function(self, output){ - self._do_print(output, "const"); - }); - - function parenthesize_for_noin(node, output, noin) { - if (!noin) node.print(output); - else try { - // need to take some precautions here: - // https://github.com/mishoo/UglifyJS2/issues/60 - node.walk(new TreeWalker(function(node){ - if (node instanceof AST_Binary && node.operator == "in") - throw output; - })); - node.print(output); - } catch(ex) { - if (ex !== output) throw ex; - node.print(output, true); - } - }; - - DEFPRINT(AST_VarDef, function(self, output){ - self.name.print(output); - if (self.value) { - output.space(); - output.print("="); - output.space(); - var p = output.parent(1); - var noin = p instanceof AST_For || p instanceof AST_ForIn; - parenthesize_for_noin(self.value, output, noin); - } - }); - - /* -----[ other expressions ]----- */ - DEFPRINT(AST_Call, function(self, output){ - self.expression.print(output); - if (self instanceof AST_New && no_constructor_parens(self, output)) - return; - output.with_parens(function(){ - self.args.forEach(function(expr, i){ - if (i) output.comma(); - expr.print(output); - }); - }); - }); - DEFPRINT(AST_New, function(self, output){ - output.print("new"); - output.space(); - AST_Call.prototype._codegen(self, output); - }); - - AST_Seq.DEFMETHOD("_do_print", function(output){ - this.car.print(output); - if (this.cdr) { - output.comma(); - if (output.should_break()) { - output.newline(); - output.indent(); - } - this.cdr.print(output); - } - }); - DEFPRINT(AST_Seq, function(self, output){ - self._do_print(output); - // var p = output.parent(); - // if (p instanceof AST_Statement) { - // output.with_indent(output.next_indent(), function(){ - // self._do_print(output); - // }); - // } else { - // self._do_print(output); - // } - }); - DEFPRINT(AST_Dot, function(self, output){ - var expr = self.expression; - expr.print(output); - if (expr instanceof AST_Number && expr.getValue() >= 0) { - if (!/[xa-f.]/i.test(output.last())) { - output.print("."); - } - } - output.print("."); - // the name after dot would be mapped about here. - output.add_mapping(self.end); - output.print_name(self.property); - }); - DEFPRINT(AST_Sub, function(self, output){ - self.expression.print(output); - output.print("["); - self.property.print(output); - output.print("]"); - }); - DEFPRINT(AST_UnaryPrefix, function(self, output){ - var op = self.operator; - output.print(op); - if (/^[a-z]/i.test(op)) - output.space(); - self.expression.print(output); - }); - DEFPRINT(AST_UnaryPostfix, function(self, output){ - self.expression.print(output); - output.print(self.operator); - }); - DEFPRINT(AST_Binary, function(self, output){ - self.left.print(output); - output.space(); - output.print(self.operator); - output.space(); - self.right.print(output); - }); - DEFPRINT(AST_Conditional, function(self, output){ - self.condition.print(output); - output.space(); - output.print("?"); - output.space(); - self.consequent.print(output); - output.space(); - output.colon(); - self.alternative.print(output); - }); - - /* -----[ literals ]----- */ - DEFPRINT(AST_Array, function(self, output){ - output.with_square(function(){ - var a = self.elements, len = a.length; - if (len > 0) output.space(); - a.forEach(function(exp, i){ - if (i) output.comma(); - exp.print(output); - }); - if (len > 0) output.space(); - }); - }); - DEFPRINT(AST_Object, function(self, output){ - if (self.properties.length > 0) output.with_block(function(){ - self.properties.forEach(function(prop, i){ - if (i) { - output.print(","); - output.newline(); - } - output.indent(); - prop.print(output); - }); - output.newline(); - }); - else output.print("{}"); - }); - DEFPRINT(AST_ObjectKeyVal, function(self, output){ - var key = self.key; - if (output.option("quote_keys")) { - output.print_string(key + ""); - } else if ((typeof key == "number" - || !output.option("beautify") - && +key + "" == key) - && parseFloat(key) >= 0) { - output.print(make_num(key)); - } else if (!is_identifier(key)) { - output.print_string(key); - } else { - output.print_name(key); - } - output.colon(); - self.value.print(output); - }); - DEFPRINT(AST_ObjectSetter, function(self, output){ - output.print("set"); - self.value._do_print(output, true); - }); - DEFPRINT(AST_ObjectGetter, function(self, output){ - output.print("get"); - self.value._do_print(output, true); - }); - DEFPRINT(AST_Symbol, function(self, output){ - var def = self.definition(); - output.print_name(def ? def.mangled_name || def.name : self.name); - }); - DEFPRINT(AST_Undefined, function(self, output){ - output.print("void 0"); - }); - DEFPRINT(AST_Hole, noop); - DEFPRINT(AST_Infinity, function(self, output){ - output.print("1/0"); - }); - DEFPRINT(AST_NaN, function(self, output){ - output.print("0/0"); - }); - DEFPRINT(AST_This, function(self, output){ - output.print("this"); - }); - DEFPRINT(AST_Constant, function(self, output){ - output.print(self.getValue()); - }); - DEFPRINT(AST_String, function(self, output){ - output.print_string(self.getValue()); - }); - DEFPRINT(AST_Number, function(self, output){ - output.print(make_num(self.getValue())); - }); - DEFPRINT(AST_RegExp, function(self, output){ - var str = self.getValue().toString(); - if (output.option("ascii_only")) - str = output.to_ascii(str); - output.print(str); - var p = output.parent(); - if (p instanceof AST_Binary && /^in/.test(p.operator) && p.left === self) - output.print(" "); - }); - - function force_statement(stat, output) { - if (output.option("bracketize")) { - if (!stat || stat instanceof AST_EmptyStatement) - output.print("{}"); - else if (stat instanceof AST_BlockStatement) - stat.print(output); - else output.with_block(function(){ - output.indent(); - stat.print(output); - output.newline(); - }); - } else { - if (!stat || stat instanceof AST_EmptyStatement) - output.force_semicolon(); - else - stat.print(output); - } - }; - - // return true if the node at the top of the stack (that means the - // innermost node in the current output) is lexically the first in - // a statement. - function first_in_statement(output) { - var a = output.stack(), i = a.length, node = a[--i], p = a[--i]; - while (i > 0) { - if (p instanceof AST_Statement && p.body === node) - return true; - if ((p instanceof AST_Seq && p.car === node ) || - (p instanceof AST_Call && p.expression === node && !(p instanceof AST_New) ) || - (p instanceof AST_Dot && p.expression === node ) || - (p instanceof AST_Sub && p.expression === node ) || - (p instanceof AST_Conditional && p.condition === node ) || - (p instanceof AST_Binary && p.left === node ) || - (p instanceof AST_UnaryPostfix && p.expression === node )) - { - node = p; - p = a[--i]; - } else { - return false; - } - } - }; - - // self should be AST_New. decide if we want to show parens or not. - function no_constructor_parens(self, output) { - return self.args.length == 0 && !output.option("beautify"); - }; - - function best_of(a) { - var best = a[0], len = best.length; - for (var i = 1; i < a.length; ++i) { - if (a[i].length < len) { - best = a[i]; - len = best.length; - } - } - return best; - }; - - function make_num(num) { - var str = num.toString(10), a = [ str.replace(/^0\./, ".").replace('e+', 'e') ], m; - if (Math.floor(num) === num) { - if (num >= 0) { - a.push("0x" + num.toString(16).toLowerCase(), // probably pointless - "0" + num.toString(8)); // same. - } else { - 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); - }; - - function make_block(stmt, output) { - if (stmt instanceof AST_BlockStatement) { - stmt.print(output); - return; - } - output.with_block(function(){ - output.indent(); - stmt.print(output); - output.newline(); - }); - }; - - /* -----[ source map generators ]----- */ - - function DEFMAP(nodetype, generator) { - nodetype.DEFMETHOD("add_source_map", function(stream){ - generator(this, stream); - }); - }; - - // We could easily add info for ALL nodes, but it seems to me that - // would be quite wasteful, hence this noop in the base class. - DEFMAP(AST_Node, noop); - - function basic_sourcemap_gen(self, output) { - output.add_mapping(self.start); - }; - - // XXX: I'm not exactly sure if we need it for all of these nodes, - // or if we should add even more. - - DEFMAP(AST_Directive, basic_sourcemap_gen); - DEFMAP(AST_Debugger, basic_sourcemap_gen); - DEFMAP(AST_Symbol, basic_sourcemap_gen); - DEFMAP(AST_Jump, basic_sourcemap_gen); - DEFMAP(AST_StatementWithBody, basic_sourcemap_gen); - DEFMAP(AST_LabeledStatement, noop); // since the label symbol will mark it - DEFMAP(AST_Lambda, basic_sourcemap_gen); - DEFMAP(AST_Switch, basic_sourcemap_gen); - DEFMAP(AST_SwitchBranch, basic_sourcemap_gen); - DEFMAP(AST_BlockStatement, basic_sourcemap_gen); - DEFMAP(AST_Toplevel, noop); - DEFMAP(AST_New, basic_sourcemap_gen); - DEFMAP(AST_Try, basic_sourcemap_gen); - DEFMAP(AST_Catch, basic_sourcemap_gen); - DEFMAP(AST_Finally, basic_sourcemap_gen); - DEFMAP(AST_Definitions, basic_sourcemap_gen); - DEFMAP(AST_Constant, basic_sourcemap_gen); - DEFMAP(AST_ObjectProperty, function(self, output){ - output.add_mapping(self.start, self.key); - }); - -})(); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/parse.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/parse.js deleted file mode 100644 index e561ab6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/parse.js +++ /dev/null @@ -1,1410 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - Parser 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. - - ***********************************************************************/ - -"use strict"; - -var KEYWORDS = 'break case catch const continue debugger default delete do else finally for function if in instanceof new return switch throw try typeof var void while with'; -var KEYWORDS_ATOM = 'false null true'; -var RESERVED_WORDS = 'abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized this throws transient volatile' - + " " + KEYWORDS_ATOM + " " + KEYWORDS; -var KEYWORDS_BEFORE_EXPRESSION = 'return new delete throw else case'; - -KEYWORDS = makePredicate(KEYWORDS); -RESERVED_WORDS = makePredicate(RESERVED_WORDS); -KEYWORDS_BEFORE_EXPRESSION = makePredicate(KEYWORDS_BEFORE_EXPRESSION); -KEYWORDS_ATOM = makePredicate(KEYWORDS_ATOM); - -var OPERATOR_CHARS = makePredicate(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 = makePredicate([ - "in", - "instanceof", - "typeof", - "new", - "void", - "delete", - "++", - "--", - "+", - "-", - "!", - "~", - "&", - "|", - "^", - "*", - "/", - "%", - ">>", - "<<", - ">>>", - "<", - ">", - "<=", - ">=", - "==", - "===", - "!=", - "!==", - "?", - "=", - "+=", - "-=", - "/=", - "*=", - "%=", - ">>=", - "<<=", - ">>>=", - "|=", - "^=", - "&=", - "&&", - "||" -]); - -var WHITESPACE_CHARS = makePredicate(characters(" \u00a0\n\r\t\f\u000b\u200b\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000")); - -var PUNC_BEFORE_EXPRESSION = makePredicate(characters("[{(,.;:")); - -var PUNC_CHARS = makePredicate(characters("[]{}(),;:")); - -var REGEXP_MODIFIERS = makePredicate(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\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971\\u0972\\u097B-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8B\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10D0-\\u10FA\\u10FC\\u1100-\\u1159\\u115F-\\u11A2\\u11A8-\\u11F9\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u2094\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2C6F\\u2C71-\\u2C7D\\u2C80-\\u2CE4\\u2D00-\\u2D25\\u2D30-\\u2D65\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000-\\uA48C\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA65F\\uA662-\\uA66E\\uA67F-\\uA697\\uA717-\\uA71F\\uA722-\\uA788\\uA78B\\uA78C\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA90A-\\uA925\\uA930-\\uA946\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAC00\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"), - 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\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"), - 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-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"), - connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]") -}; - -function is_letter(code) { - return (code >= 97 && code <= 122) - || (code >= 65 && code <= 90) - || (code >= 0xaa && UNICODE.letter.test(String.fromCharCode(code))); -}; - -function is_digit(code) { - return code >= 48 && code <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9 -}; - -function is_alphanumeric_char(code) { - return is_digit(code) || is_letter(code); -}; - -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(name) { - return !RESERVED_WORDS(name) && /^[a-z_$][a-z0-9_$]*$/i.test(name); -}; - -function is_identifier_start(code) { - return code == 36 || code == 95 || is_letter(code); -}; - -function is_identifier_char(ch) { - var code = ch.charCodeAt(0); - return is_identifier_start(code) - || is_digit(code) - || code == 8204 // \u200c: zero-width non-joiner - || code == 8205 // \u200d: zero-width joiner (in my ECMA-262 PDF, this is also 200c) - || is_unicode_combining_mark(ch) - || is_unicode_connector_punctuation(ch) - ; -}; - -function is_identifier_string(str){ - var i = str.length; - if (i == 0) return false; - if (is_digit(str.charCodeAt(0))) return false; - while (--i >= 0) { - if (!is_identifier_char(str.charAt(i))) - return false; - } - return true; -}; - -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; - this.stack = new Error().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, filename, 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, filename) { - - var S = { - text : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/\uFEFF/g, ''), - filename : filename, - pos : 0, - tokpos : 0, - line : 1, - 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, in_string) { - var ch = S.text.charAt(S.pos++); - if (signal_eof && !ch) - throw EX_EOF; - if (ch == "\n") { - S.newline_before = S.newline_before || !in_string; - ++S.line; - S.col = 0; - } else { - ++S.col; - } - return ch; - }; - - 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" && !UNARY_POSTFIX[value]) || - (type == "keyword" && KEYWORDS_BEFORE_EXPRESSION(value)) || - (type == "punc" && PUNC_BEFORE_EXPRESSION(value))); - var ret = { - type : type, - value : value, - line : S.tokline, - col : S.tokcol, - pos : S.tokpos, - endpos : S.pos, - nlb : S.newline_before, - file : filename - }; - if (!is_comment) { - ret.comments_before = S.comments_before; - S.comments_before = []; - // make note of any newlines in the comments that came before - for (var i = 0, len = ret.comments_before.length; i < len; i++) { - ret.nlb = ret.nlb || ret.comments_before[i].nlb; - } - } - S.newline_before = false; - return new AST_Token(ret); - }; - - function skip_whitespace() { - while (WHITESPACE_CHARS(peek())) - next(); - }; - - function read_while(pred) { - var ret = "", ch, i = 0; - while ((ch = peek()) && pred(ch, i++)) - ret += next(); - return ret; - }; - - function parse_error(err) { - js_error(err, filename, 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){ - var code = ch.charCodeAt(0); - switch (code) { - case 120: case 88: // xX - return has_x ? false : (has_x = true); - case 101: case 69: // eE - return has_x ? true : has_e ? false : (has_e = after_e = true); - case 45: // - - return after_e || (i == 0 && !prefix); - case 43: // + - return after_e; - case (after_e = false, 46): // . - return (!has_dot && !has_x && !has_e) ? (has_dot = true) : false; - } - return is_alphanumeric_char(code); - }); - 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(in_string) { - var ch = next(true, in_string); - switch (ch.charCodeAt(0)) { - case 110 : return "\n"; - case 114 : return "\r"; - case 116 : return "\t"; - case 98 : return "\b"; - case 118 : return "\u000b"; // \v - case 102 : return "\f"; - case 48 : return "\0"; - case 120 : return String.fromCharCode(hex_bytes(2)); // \x - case 117 : return String.fromCharCode(hex_bytes(4)); // \u - case 10 : return ""; // newline - 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; - }; - - var read_string = with_eof_error("Unterminated string constant", function(){ - var quote = next(), ret = ""; - for (;;) { - var ch = next(true); - if (ch == "\\") { - // read OctalEscapeSequence (XXX: deprecated if "strict mode") - // https://github.com/mishoo/UglifyJS/issues/178 - var octal_len = 0, first = null; - ch = read_while(function(ch){ - if (ch >= "0" && ch <= "7") { - if (!first) { - first = ch; - return ++octal_len; - } - else if (first <= "3" && octal_len <= 2) return ++octal_len; - else if (first >= "4" && octal_len <= 1) return ++octal_len; - } - return false; - }); - if (octal_len > 0) ch = String.fromCharCode(parseInt(ch, 8)); - else ch = read_escaped_char(true); - } - 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); - }; - - var read_multiline_comment = with_eof_error("Unterminated multiline comment", function(){ - next(); - var i = find("*/", true); - var text = S.text.substring(S.pos, i); - var a = text.split("\n"), n = a.length; - // update stream position - S.pos = i + 2; - S.line += n - 1; - if (n > 1) S.col = a[n - 1].length; - else S.col += a[n - 1].length; - S.col += 2; - S.newline_before = S.newline_before || text.indexOf("\n") >= 0; - return token("comment2", text, true); - }); - - function read_name() { - var backslash = false, name = "", ch, escaped = false, hex; - while ((ch = peek()) != null) { - if (!backslash) { - if (ch == "\\") escaped = 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; - } - } - if (KEYWORDS(name) && escaped) { - hex = name.charCodeAt(0).toString(16).toUpperCase(); - name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1); - } - return name; - }; - - var read_regexp = with_eof_error("Unterminated regular expression", function(regexp){ - var prev_backslash = false, 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", new RegExp(regexp, mods)); - }); - - function read_operator(prefix) { - function grow(op) { - if (!peek()) return op; - var bigger = op + peek(); - if (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().charCodeAt(0)) - ? read_num(".") - : token("punc", "."); - }; - - function read_word() { - var word = read_name(); - return KEYWORDS_ATOM(word) ? token("atom", word) - : !KEYWORDS(word) ? token("name", word) - : OPERATORS(word) ? token("operator", word) - : token("keyword", word); - }; - - function with_eof_error(eof_error, cont) { - return function(x) { - try { - return cont(x); - } catch(ex) { - if (ex === EX_EOF) parse_error(eof_error); - else throw ex; - } - }; - }; - - function next_token(force_regexp) { - if (force_regexp != null) - return read_regexp(force_regexp); - skip_whitespace(); - start_token(); - var ch = peek(); - if (!ch) return token("eof"); - var code = ch.charCodeAt(0); - switch (code) { - case 34: case 39: return read_string(); - case 46: return handle_dot(); - case 47: return handle_slash(); - } - if (is_digit(code)) return read_num(); - if (PUNC_CHARS(ch)) return token("punc", next()); - if (OPERATOR_CHARS(ch)) return read_operator(); - if (code == 92 || is_identifier_start(code)) 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 = makePredicate([ - "typeof", - "void", - "delete", - "--", - "++", - "!", - "~", - "-", - "+" -]); - -var UNARY_POSTFIX = makePredicate([ "--", "++" ]); - -var ASSIGNMENT = makePredicate([ "=", "+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&=" ]); - -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 parse($TEXT, options) { - - options = defaults(options, { - strict : false, - filename : null, - toplevel : null, - expression : false - }); - - var S = { - input : typeof $TEXT == "string" ? tokenizer($TEXT, options.filename) : $TEXT, - token : null, - prev : null, - peeked : null, - in_function : 0, - in_directives : true, - 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(); - } - S.in_directives = S.in_directives && ( - S.token.type == "string" || is("punc", ";") - ); - return S.token; - }; - - function prev() { - return S.prev; - }; - - function croak(msg, line, col, pos) { - var ctx = S.input.context(); - js_error(msg, - ctx.filename, - 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 + " «" + S.token.value + "»" + ", expected " + type + " «" + val + "»"); - }; - - function expect(punc) { return expect_token("punc", punc); }; - - function can_insert_semicolon() { - return !options.strict && ( - S.token.nlb || is("eof") || is("punc", "}") - ); - }; - - function semicolon() { - if (is("punc", ";")) next(); - else if (!can_insert_semicolon()) unexpected(); - }; - - function parenthesised() { - expect("("); - var exp = expression(true); - expect(")"); - return exp; - }; - - function embed_tokens(parser) { - return function() { - var start = S.token; - var expr = parser(); - var end = prev(); - expr.start = start; - expr.end = end; - return expr; - }; - }; - - var statement = embed_tokens(function() { - var tmp; - if (is("operator", "/") || is("operator", "/=")) { - S.peeked = null; - S.token = S.input(S.token.value.substr(1)); // force regexp - } - switch (S.token.type) { - case "string": - var dir = S.in_directives, stat = simple_statement(); - // XXXv2: decide how to fix directives - if (dir && stat.body instanceof AST_String && !is("punc", ",")) - return new AST_Directive({ value: stat.body.value }); - return stat; - case "num": - case "regexp": - case "operator": - case "atom": - return simple_statement(); - - case "name": - return is_token(peek(), "punc", ":") - ? labeled_statement() - : simple_statement(); - - case "punc": - switch (S.token.value) { - case "{": - return new AST_BlockStatement({ - start : S.token, - body : block_(), - end : prev() - }); - case "[": - case "(": - return simple_statement(); - case ";": - next(); - return new AST_EmptyStatement(); - default: - unexpected(); - } - - case "keyword": - switch (tmp = S.token.value, next(), tmp) { - case "break": - return break_cont(AST_Break); - - case "continue": - return break_cont(AST_Continue); - - case "debugger": - semicolon(); - return new AST_Debugger(); - - case "do": - return new AST_Do({ - body : in_loop(statement), - condition : (expect_token("keyword", "while"), tmp = parenthesised(), semicolon(), tmp) - }); - - case "while": - return new AST_While({ - condition : parenthesised(), - 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 new AST_Return({ - value: ( is("punc", ";") - ? (next(), null) - : can_insert_semicolon() - ? null - : (tmp = expression(true), semicolon(), tmp) ) - }); - - case "switch": - return new AST_Switch({ - expression : parenthesised(), - body : in_loop(switch_body_) - }); - - case "throw": - if (S.token.nlb) - croak("Illegal newline after 'throw'"); - return new AST_Throw({ - value: (tmp = expression(true), semicolon(), tmp) - }); - - case "try": - return try_(); - - case "var": - return tmp = var_(), semicolon(), tmp; - - case "const": - return tmp = const_(), semicolon(), tmp; - - case "with": - return new AST_With({ - expression : parenthesised(), - body : statement() - }); - - default: - unexpected(); - } - } - }); - - function labeled_statement() { - var label = as_symbol(AST_Label); - if (find_if(function(l){ return l.name == label.name }, S.labels)) { - // ECMA-262, 12.12: An ECMAScript program is considered - // syntactically incorrect if it contains a - // LabelledStatement that is enclosed by a - // LabelledStatement with the same Identifier as label. - croak("Label " + label.name + " defined twice"); - } - expect(":"); - S.labels.push(label); - var stat = statement(); - S.labels.pop(); - return new AST_LabeledStatement({ body: stat, label: label }); - }; - - function simple_statement(tmp) { - return new AST_SimpleStatement({ body: (tmp = expression(true), semicolon(), tmp) }); - }; - - function break_cont(type) { - var label = null; - if (!can_insert_semicolon()) { - label = as_symbol(AST_LabelRef, true); - } - if (label != null) { - if (!find_if(function(l){ return l.name == label.name }, S.labels)) - croak("Undefined label " + label.name); - } - else if (S.in_loop == 0) - croak(type.TYPE + " not inside a loop or switch"); - semicolon(); - return new type({ label: label }); - }; - - function for_() { - expect("("); - var init = null; - if (!is("punc", ";")) { - init = is("keyword", "var") - ? (next(), var_(true)) - : expression(true, true); - if (is("operator", "in")) { - if (init instanceof AST_Var && init.definitions.length > 1) - croak("Only one variable declaration allowed in for..in loop"); - next(); - return for_in(init); - } - } - return regular_for(init); - }; - - function regular_for(init) { - expect(";"); - var test = is("punc", ";") ? null : expression(true); - expect(";"); - var step = is("punc", ")") ? null : expression(true); - expect(")"); - return new AST_For({ - init : init, - condition : test, - step : step, - body : in_loop(statement) - }); - }; - - function for_in(init) { - var lhs = init instanceof AST_Var ? init.definitions[0].name : null; - var obj = expression(true); - expect(")"); - return new AST_ForIn({ - init : init, - name : lhs, - object : obj, - body : in_loop(statement) - }); - }; - - var function_ = function(in_statement, ctor) { - var is_accessor = ctor === AST_Accessor; - var name = (is("name") ? as_symbol(in_statement - ? AST_SymbolDefun - : is_accessor - ? AST_SymbolAccessor - : AST_SymbolLambda) - : is_accessor && (is("string") || is("num")) ? as_atom_node() - : null); - if (in_statement && !name) - unexpected(); - expect("("); - if (!ctor) ctor = in_statement ? AST_Defun : AST_Function; - return new ctor({ - name: name, - argnames: (function(first, a){ - while (!is("punc", ")")) { - if (first) first = false; else expect(","); - a.push(as_symbol(AST_SymbolFunarg)); - } - next(); - return a; - })(true, []), - body: (function(loop, labels){ - ++S.in_function; - S.in_directives = true; - S.in_loop = 0; - S.labels = []; - var a = block_(); - --S.in_function; - S.in_loop = loop; - S.labels = labels; - return a; - })(S.in_loop, S.labels) - }); - }; - - function if_() { - var cond = parenthesised(), body = statement(), belse = null; - if (is("keyword", "else")) { - next(); - belse = statement(); - } - return new AST_If({ - condition : cond, - body : body, - alternative : belse - }); - }; - - function block_() { - expect("{"); - var a = []; - while (!is("punc", "}")) { - if (is("eof")) unexpected(); - a.push(statement()); - } - next(); - return a; - }; - - function switch_body_() { - expect("{"); - var a = [], cur = null, branch = null, tmp; - while (!is("punc", "}")) { - if (is("eof")) unexpected(); - if (is("keyword", "case")) { - if (branch) branch.end = prev(); - cur = []; - branch = new AST_Case({ - start : (tmp = S.token, next(), tmp), - expression : expression(true), - body : cur - }); - a.push(branch); - expect(":"); - } - else if (is("keyword", "default")) { - if (branch) branch.end = prev(); - cur = []; - branch = new AST_Default({ - start : (tmp = S.token, next(), expect(":"), tmp), - body : cur - }); - a.push(branch); - } - else { - if (!cur) unexpected(); - cur.push(statement()); - } - } - if (branch) branch.end = prev(); - next(); - return a; - }; - - function try_() { - var body = block_(), bcatch = null, bfinally = null; - if (is("keyword", "catch")) { - var start = S.token; - next(); - expect("("); - var name = as_symbol(AST_SymbolCatch); - expect(")"); - bcatch = new AST_Catch({ - start : start, - argname : name, - body : block_(), - end : prev() - }); - } - if (is("keyword", "finally")) { - var start = S.token; - next(); - bfinally = new AST_Finally({ - start : start, - body : block_(), - end : prev() - }); - } - if (!bcatch && !bfinally) - croak("Missing catch/finally blocks"); - return new AST_Try({ - body : body, - bcatch : bcatch, - bfinally : bfinally - }); - }; - - function vardefs(no_in, in_const) { - var a = []; - for (;;) { - a.push(new AST_VarDef({ - start : S.token, - name : as_symbol(in_const ? AST_SymbolConst : AST_SymbolVar), - value : is("operator", "=") ? (next(), expression(false, no_in)) : null, - end : prev() - })); - if (!is("punc", ",")) - break; - next(); - } - return a; - }; - - var var_ = function(no_in) { - return new AST_Var({ - start : prev(), - definitions : vardefs(no_in, false), - end : prev() - }); - }; - - var const_ = function() { - return new AST_Const({ - start : prev(), - definitions : vardefs(false, true), - end : prev() - }); - }; - - var new_ = function() { - var start = S.token; - expect_token("operator", "new"); - var newexp = expr_atom(false), args; - if (is("punc", "(")) { - next(); - args = expr_list(")"); - } else { - args = []; - } - return subscripts(new AST_New({ - start : start, - expression : newexp, - args : args, - end : prev() - }), true); - }; - - function as_atom_node() { - var tok = S.token, ret; - switch (tok.type) { - case "name": - return as_symbol(AST_SymbolRef); - case "num": - ret = new AST_Number({ start: tok, end: tok, value: tok.value }); - break; - case "string": - ret = new AST_String({ start: tok, end: tok, value: tok.value }); - break; - case "regexp": - ret = new AST_RegExp({ start: tok, end: tok, value: tok.value }); - break; - case "atom": - switch (tok.value) { - case "false": - ret = new AST_False({ start: tok, end: tok }); - break; - case "true": - ret = new AST_True({ start: tok, end: tok }); - break; - case "null": - ret = new AST_Null({ start: tok, end: tok }); - break; - } - break; - } - next(); - return ret; - }; - - var expr_atom = function(allow_calls) { - if (is("operator", "new")) { - return new_(); - } - var start = S.token; - if (is("punc")) { - switch (start.value) { - case "(": - next(); - var ex = expression(true); - ex.start = start; - ex.end = S.token; - expect(")"); - return subscripts(ex, allow_calls); - case "[": - return subscripts(array_(), allow_calls); - case "{": - return subscripts(object_(), allow_calls); - } - unexpected(); - } - if (is("keyword", "function")) { - next(); - var func = function_(false); - func.start = start; - func.end = prev(); - return subscripts(func, allow_calls); - } - if (ATOMIC_START_TOKEN[S.token.type]) { - return subscripts(as_atom_node(), 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(new AST_Hole({ start: S.token, end: S.token })); - } else { - a.push(expression(false)); - } - } - next(); - return a; - }; - - var array_ = embed_tokens(function() { - expect("["); - return new AST_Array({ - elements: expr_list("]", !options.strict, true) - }); - }); - - var object_ = embed_tokens(function() { - expect("{"); - var first = true, a = []; - while (!is("punc", "}")) { - if (first) first = false; else expect(","); - if (!options.strict && is("punc", "}")) - // allow trailing comma - break; - var start = S.token; - var type = start.type; - var name = as_property_name(); - if (type == "name" && !is("punc", ":")) { - if (name == "get") { - a.push(new AST_ObjectGetter({ - start : start, - key : name, - value : function_(false, AST_Accessor), - end : prev() - })); - continue; - } - if (name == "set") { - a.push(new AST_ObjectSetter({ - start : start, - key : name, - value : function_(false, AST_Accessor), - end : prev() - })); - continue; - } - } - expect(":"); - a.push(new AST_ObjectKeyVal({ - start : start, - key : name, - value : expression(false), - end : prev() - })); - } - next(); - return new AST_Object({ properties: a }); - }); - - function as_property_name() { - var tmp = S.token; - next(); - switch (tmp.type) { - case "num": - case "string": - case "name": - case "operator": - case "keyword": - case "atom": - return tmp.value; - default: - unexpected(); - } - }; - - function as_name() { - var tmp = S.token; - next(); - switch (tmp.type) { - case "name": - case "operator": - case "keyword": - case "atom": - return tmp.value; - default: - unexpected(); - } - }; - - function as_symbol(type, noerror) { - if (!is("name")) { - if (!noerror) croak("Name expected"); - return null; - } - var name = S.token.value; - var sym = new (name == "this" ? AST_This : type)({ - name : String(S.token.value), - start : S.token, - end : S.token - }); - next(); - return sym; - }; - - var subscripts = function(expr, allow_calls) { - var start = expr.start; - if (is("punc", ".")) { - next(); - return subscripts(new AST_Dot({ - start : start, - expression : expr, - property : as_name(), - end : prev() - }), allow_calls); - } - if (is("punc", "[")) { - next(); - var prop = expression(true); - expect("]"); - return subscripts(new AST_Sub({ - start : start, - expression : expr, - property : prop, - end : prev() - }), allow_calls); - } - if (allow_calls && is("punc", "(")) { - next(); - return subscripts(new AST_Call({ - start : start, - expression : expr, - args : expr_list(")"), - end : prev() - }), true); - } - return expr; - }; - - var maybe_unary = function(allow_calls) { - var start = S.token; - if (is("operator") && UNARY_PREFIX(start.value)) { - next(); - var ex = make_unary(AST_UnaryPrefix, start.value, maybe_unary(allow_calls)); - ex.start = start; - ex.end = prev(); - return ex; - } - var val = expr_atom(allow_calls); - while (is("operator") && UNARY_POSTFIX(S.token.value) && !S.token.nlb) { - val = make_unary(AST_UnaryPostfix, S.token.value, val); - val.start = start; - val.end = S.token; - next(); - } - return val; - }; - - function make_unary(ctor, op, expr) { - if ((op == "++" || op == "--") && !is_assignable(expr)) - croak("Invalid use of " + op + " operator"); - return new ctor({ operator: op, expression: expr }); - }; - - var expr_op = function(left, min_prec, no_in) { - var op = is("operator") ? S.token.value : null; - if (op == "in" && no_in) op = null; - var prec = op != null ? PRECEDENCE[op] : null; - if (prec != null && prec > min_prec) { - next(); - var right = expr_op(maybe_unary(true), prec, no_in); - return expr_op(new AST_Binary({ - start : left.start, - left : left, - operator : op, - right : right, - end : right.end - }), min_prec, no_in); - } - return left; - }; - - function expr_ops(no_in) { - return expr_op(maybe_unary(true), 0, no_in); - }; - - var maybe_conditional = function(no_in) { - var start = S.token; - var expr = expr_ops(no_in); - if (is("operator", "?")) { - next(); - var yes = expression(false); - expect(":"); - return new AST_Conditional({ - start : start, - condition : expr, - consequent : yes, - alternative : expression(false, no_in), - end : peek() - }); - } - return expr; - }; - - function is_assignable(expr) { - if (!options.strict) return true; - if (expr instanceof AST_This) return false; - return (expr instanceof AST_PropAccess || expr instanceof AST_Symbol); - }; - - var maybe_assign = function(no_in) { - var start = S.token; - var left = maybe_conditional(no_in), val = S.token.value; - if (is("operator") && ASSIGNMENT(val)) { - if (is_assignable(left)) { - next(); - return new AST_Assign({ - start : start, - left : left, - operator : val, - right : maybe_assign(no_in), - end : prev() - }); - } - croak("Invalid assignment"); - } - return left; - }; - - var expression = function(commas, no_in) { - var start = S.token; - var expr = maybe_assign(no_in); - if (commas && is("punc", ",")) { - next(); - return new AST_Seq({ - start : start, - car : expr, - cdr : expression(true, no_in), - end : peek() - }); - } - return expr; - }; - - function in_loop(cont) { - ++S.in_loop; - var ret = cont(); - --S.in_loop; - return ret; - }; - - if (options.expression) { - return expression(true); - } - - return (function(){ - var start = S.token; - var body = []; - while (!is("eof")) - body.push(statement()); - var end = prev(); - var toplevel = options.toplevel; - if (toplevel) { - toplevel.body = toplevel.body.concat(body); - toplevel.end = end; - } else { - toplevel = new AST_Toplevel({ start: start, body: body, end: end }); - } - return toplevel; - })(); - -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/scope.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/scope.js deleted file mode 100644 index d15cec7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/scope.js +++ /dev/null @@ -1,581 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -function SymbolDef(scope, index, orig) { - this.name = orig.name; - this.orig = [ orig ]; - this.scope = scope; - this.references = []; - this.global = false; - this.mangled_name = null; - this.undeclared = false; - this.constant = false; - this.index = index; -}; - -SymbolDef.prototype = { - unmangleable: function(options) { - return (this.global && !(options && options.toplevel)) - || this.undeclared - || (!(options && options.eval) && (this.scope.uses_eval || this.scope.uses_with)); - }, - mangle: function(options) { - if (!this.mangled_name && !this.unmangleable(options)) { - var s = this.scope; - if (this.orig[0] instanceof AST_SymbolLambda && !options.screw_ie8) - s = s.parent_scope; - this.mangled_name = s.next_mangled(options); - } - } -}; - -AST_Toplevel.DEFMETHOD("figure_out_scope", function(){ - // This does what ast_add_scope did in UglifyJS v1. - // - // Part of it could be done at parse time, but it would complicate - // the parser (and it's already kinda complex). It's also worth - // having it separated because we might need to call it multiple - // times on the same tree. - - // pass 1: setup scope chaining and handle definitions - var self = this; - var scope = self.parent_scope = null; - var labels = new Dictionary(); - var nesting = 0; - var tw = new TreeWalker(function(node, descend){ - if (node instanceof AST_Scope) { - node.init_scope_vars(nesting); - var save_scope = node.parent_scope = scope; - var save_labels = labels; - ++nesting; - scope = node; - labels = new Dictionary(); - descend(); - labels = save_labels; - scope = save_scope; - --nesting; - return true; // don't descend again in TreeWalker - } - if (node instanceof AST_Directive) { - node.scope = scope; - push_uniq(scope.directives, node.value); - return true; - } - if (node instanceof AST_With) { - for (var s = scope; s; s = s.parent_scope) - s.uses_with = true; - return; - } - if (node instanceof AST_LabeledStatement) { - var l = node.label; - if (labels.has(l.name)) - throw new Error(string_template("Label {name} defined twice", l)); - labels.set(l.name, l); - descend(); - labels.del(l.name); - return true; // no descend again - } - if (node instanceof AST_Symbol) { - node.scope = scope; - } - if (node instanceof AST_Label) { - node.thedef = node; - node.init_scope_vars(); - } - if (node instanceof AST_SymbolLambda) { - scope.def_function(node); - } - else if (node instanceof AST_SymbolDefun) { - // Careful here, the scope where this should be defined is - // the parent scope. The reason is that we enter a new - // scope when we encounter the AST_Defun node (which is - // instanceof AST_Scope) but we get to the symbol a bit - // later. - (node.scope = scope.parent_scope).def_function(node); - } - else if (node instanceof AST_SymbolVar - || node instanceof AST_SymbolConst) { - var def = scope.def_variable(node); - def.constant = node instanceof AST_SymbolConst; - def.init = tw.parent().value; - } - else if (node instanceof AST_SymbolCatch) { - // XXX: this is wrong according to ECMA-262 (12.4). the - // `catch` argument name should be visible only inside the - // catch block. For a quick fix AST_Catch should inherit - // from AST_Scope. Keeping it this way because of IE, - // which doesn't obey the standard. (it introduces the - // identifier in the enclosing scope) - scope.def_variable(node); - } - if (node instanceof AST_LabelRef) { - var sym = labels.get(node.name); - if (!sym) throw new Error(string_template("Undefined label {name} [{line},{col}]", { - name: node.name, - line: node.start.line, - col: node.start.col - })); - node.thedef = sym; - } - }); - self.walk(tw); - - // pass 2: find back references and eval - var func = null; - var globals = self.globals = new Dictionary(); - var tw = new TreeWalker(function(node, descend){ - if (node instanceof AST_Lambda) { - var prev_func = func; - func = node; - descend(); - func = prev_func; - return true; - } - if (node instanceof AST_LabelRef) { - node.reference(); - return true; - } - if (node instanceof AST_SymbolRef) { - var name = node.name; - var sym = node.scope.find_variable(name); - if (!sym) { - var g; - if (globals.has(name)) { - g = globals.get(name); - } else { - g = new SymbolDef(self, globals.size(), node); - g.undeclared = true; - g.global = true; - globals.set(name, g); - } - node.thedef = g; - if (name == "eval" && tw.parent() instanceof AST_Call) { - for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) - s.uses_eval = true; - } - if (name == "arguments") { - func.uses_arguments = true; - } - } else { - node.thedef = sym; - } - node.reference(); - return true; - } - }); - self.walk(tw); -}); - -AST_Scope.DEFMETHOD("init_scope_vars", function(nesting){ - this.directives = []; // contains the directives defined in this scope, i.e. "use strict" - this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions) - this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope) - this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement - this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval` - this.parent_scope = null; // the parent scope - this.enclosed = []; // a list of variables from this or outer scope(s) that are referenced from this or inner scopes - this.cname = -1; // the current index for mangling functions/variables - this.nesting = nesting; // the nesting level of this scope (0 means toplevel) -}); - -AST_Scope.DEFMETHOD("strict", function(){ - return this.has_directive("use strict"); -}); - -AST_Lambda.DEFMETHOD("init_scope_vars", function(){ - AST_Scope.prototype.init_scope_vars.apply(this, arguments); - this.uses_arguments = false; -}); - -AST_SymbolRef.DEFMETHOD("reference", function() { - var def = this.definition(); - def.references.push(this); - var s = this.scope; - while (s) { - push_uniq(s.enclosed, def); - if (s === def.scope) break; - s = s.parent_scope; - } - this.frame = this.scope.nesting - def.scope.nesting; -}); - -AST_Label.DEFMETHOD("init_scope_vars", function(){ - this.references = []; -}); - -AST_LabelRef.DEFMETHOD("reference", function(){ - this.thedef.references.push(this); -}); - -AST_Scope.DEFMETHOD("find_variable", function(name){ - if (name instanceof AST_Symbol) name = name.name; - return this.variables.get(name) - || (this.parent_scope && this.parent_scope.find_variable(name)); -}); - -AST_Scope.DEFMETHOD("has_directive", function(value){ - return this.parent_scope && this.parent_scope.has_directive(value) - || (this.directives.indexOf(value) >= 0 ? this : null); -}); - -AST_Scope.DEFMETHOD("def_function", function(symbol){ - this.functions.set(symbol.name, this.def_variable(symbol)); -}); - -AST_Scope.DEFMETHOD("def_variable", function(symbol){ - var def; - if (!this.variables.has(symbol.name)) { - def = new SymbolDef(this, this.variables.size(), symbol); - this.variables.set(symbol.name, def); - def.global = !this.parent_scope; - } else { - def = this.variables.get(symbol.name); - def.orig.push(symbol); - } - return symbol.thedef = def; -}); - -AST_Scope.DEFMETHOD("next_mangled", function(options){ - var ext = this.enclosed; - out: while (true) { - var m = base54(++this.cname); - if (!is_identifier(m)) continue; // skip over "do" - // we must ensure that the mangled name does not shadow a name - // from some parent scope that is referenced in this or in - // inner scopes. - for (var i = ext.length; --i >= 0;) { - var sym = ext[i]; - var name = sym.mangled_name || (sym.unmangleable(options) && sym.name); - if (m == name) continue out; - } - return m; - } -}); - -AST_Scope.DEFMETHOD("references", function(sym){ - if (sym instanceof AST_Symbol) sym = sym.definition(); - return this.enclosed.indexOf(sym) < 0 ? null : sym; -}); - -AST_Symbol.DEFMETHOD("unmangleable", function(options){ - return this.definition().unmangleable(options); -}); - -// property accessors are not mangleable -AST_SymbolAccessor.DEFMETHOD("unmangleable", function(){ - return true; -}); - -// labels are always mangleable -AST_Label.DEFMETHOD("unmangleable", function(){ - return false; -}); - -AST_Symbol.DEFMETHOD("unreferenced", function(){ - return this.definition().references.length == 0 - && !(this.scope.uses_eval || this.scope.uses_with); -}); - -AST_Symbol.DEFMETHOD("undeclared", function(){ - return this.definition().undeclared; -}); - -AST_LabelRef.DEFMETHOD("undeclared", function(){ - return false; -}); - -AST_Label.DEFMETHOD("undeclared", function(){ - return false; -}); - -AST_Symbol.DEFMETHOD("definition", function(){ - return this.thedef; -}); - -AST_Symbol.DEFMETHOD("global", function(){ - return this.definition().global; -}); - -AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){ - return defaults(options, { - except : [], - eval : false, - sort : false, - toplevel : false, - screw_ie8 : false - }); -}); - -AST_Toplevel.DEFMETHOD("mangle_names", function(options){ - options = this._default_mangler_options(options); - // We only need to mangle declaration nodes. Special logic wired - // into the code generator will display the mangled name if it's - // present (and for AST_SymbolRef-s it'll use the mangled name of - // the AST_SymbolDeclaration that it points to). - var lname = -1; - var to_mangle = []; - var tw = new TreeWalker(function(node, descend){ - if (node instanceof AST_LabeledStatement) { - // lname is incremented when we get to the AST_Label - var save_nesting = lname; - descend(); - lname = save_nesting; - return true; // don't descend again in TreeWalker - } - if (node instanceof AST_Scope) { - var p = tw.parent(), a = []; - node.variables.each(function(symbol){ - if (options.except.indexOf(symbol.name) < 0) { - a.push(symbol); - } - }); - if (options.sort) a.sort(function(a, b){ - return b.references.length - a.references.length; - }); - to_mangle.push.apply(to_mangle, a); - return; - } - if (node instanceof AST_Label) { - var name; - do name = base54(++lname); while (!is_identifier(name)); - node.mangled_name = name; - return true; - } - }); - this.walk(tw); - to_mangle.forEach(function(def){ def.mangle(options) }); -}); - -AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){ - options = this._default_mangler_options(options); - var tw = new TreeWalker(function(node){ - if (node instanceof AST_Constant) - base54.consider(node.print_to_string()); - else if (node instanceof AST_Return) - base54.consider("return"); - else if (node instanceof AST_Throw) - base54.consider("throw"); - else if (node instanceof AST_Continue) - base54.consider("continue"); - else if (node instanceof AST_Break) - base54.consider("break"); - else if (node instanceof AST_Debugger) - base54.consider("debugger"); - else if (node instanceof AST_Directive) - base54.consider(node.value); - else if (node instanceof AST_While) - base54.consider("while"); - else if (node instanceof AST_Do) - base54.consider("do while"); - else if (node instanceof AST_If) { - base54.consider("if"); - if (node.alternative) base54.consider("else"); - } - else if (node instanceof AST_Var) - base54.consider("var"); - else if (node instanceof AST_Const) - base54.consider("const"); - else if (node instanceof AST_Lambda) - base54.consider("function"); - else if (node instanceof AST_For) - base54.consider("for"); - else if (node instanceof AST_ForIn) - base54.consider("for in"); - else if (node instanceof AST_Switch) - base54.consider("switch"); - else if (node instanceof AST_Case) - base54.consider("case"); - else if (node instanceof AST_Default) - base54.consider("default"); - else if (node instanceof AST_With) - base54.consider("with"); - else if (node instanceof AST_ObjectSetter) - base54.consider("set" + node.key); - else if (node instanceof AST_ObjectGetter) - base54.consider("get" + node.key); - else if (node instanceof AST_ObjectKeyVal) - base54.consider(node.key); - else if (node instanceof AST_New) - base54.consider("new"); - else if (node instanceof AST_This) - base54.consider("this"); - else if (node instanceof AST_Try) - base54.consider("try"); - else if (node instanceof AST_Catch) - base54.consider("catch"); - else if (node instanceof AST_Finally) - base54.consider("finally"); - else if (node instanceof AST_Symbol && node.unmangleable(options)) - base54.consider(node.name); - else if (node instanceof AST_Unary || node instanceof AST_Binary) - base54.consider(node.operator); - else if (node instanceof AST_Dot) - base54.consider(node.property); - }); - this.walk(tw); - base54.sort(); -}); - -var base54 = (function() { - var string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_0123456789"; - var chars, frequency; - function reset() { - frequency = Object.create(null); - chars = string.split("").map(function(ch){ return ch.charCodeAt(0) }); - chars.forEach(function(ch){ frequency[ch] = 0 }); - } - base54.consider = function(str){ - for (var i = str.length; --i >= 0;) { - var code = str.charCodeAt(i); - if (code in frequency) ++frequency[code]; - } - }; - base54.sort = function() { - chars = mergeSort(chars, function(a, b){ - if (is_digit(a) && !is_digit(b)) return 1; - if (is_digit(b) && !is_digit(a)) return -1; - return frequency[b] - frequency[a]; - }); - }; - base54.reset = reset; - reset(); - base54.get = function(){ return chars }; - base54.freq = function(){ return frequency }; - function base54(num) { - var ret = "", base = 54; - do { - ret += String.fromCharCode(chars[num % base]); - num = Math.floor(num / base); - base = 64; - } while (num > 0); - return ret; - }; - return base54; -})(); - -AST_Toplevel.DEFMETHOD("scope_warnings", function(options){ - options = defaults(options, { - undeclared : false, // this makes a lot of noise - unreferenced : true, - assign_to_global : true, - func_arguments : true, - nested_defuns : true, - eval : true - }); - var tw = new TreeWalker(function(node){ - if (options.undeclared - && node instanceof AST_SymbolRef - && node.undeclared()) - { - // XXX: this also warns about JS standard names, - // i.e. Object, Array, parseInt etc. Should add a list of - // exceptions. - AST_Node.warn("Undeclared symbol: {name} [{file}:{line},{col}]", { - name: node.name, - file: node.start.file, - line: node.start.line, - col: node.start.col - }); - } - if (options.assign_to_global) - { - var sym = null; - if (node instanceof AST_Assign && node.left instanceof AST_SymbolRef) - sym = node.left; - else if (node instanceof AST_ForIn && node.init instanceof AST_SymbolRef) - sym = node.init; - if (sym - && (sym.undeclared() - || (sym.global() && sym.scope !== sym.definition().scope))) { - AST_Node.warn("{msg}: {name} [{file}:{line},{col}]", { - msg: sym.undeclared() ? "Accidental global?" : "Assignment to global", - name: sym.name, - file: sym.start.file, - line: sym.start.line, - col: sym.start.col - }); - } - } - if (options.eval - && node instanceof AST_SymbolRef - && node.undeclared() - && node.name == "eval") { - AST_Node.warn("Eval is used [{file}:{line},{col}]", node.start); - } - if (options.unreferenced - && (node instanceof AST_SymbolDeclaration || node instanceof AST_Label) - && node.unreferenced()) { - AST_Node.warn("{type} {name} is declared but not referenced [{file}:{line},{col}]", { - type: node instanceof AST_Label ? "Label" : "Symbol", - name: node.name, - file: node.start.file, - line: node.start.line, - col: node.start.col - }); - } - if (options.func_arguments - && node instanceof AST_Lambda - && node.uses_arguments) { - AST_Node.warn("arguments used in function {name} [{file}:{line},{col}]", { - name: node.name ? node.name.name : "anonymous", - file: node.start.file, - line: node.start.line, - col: node.start.col - }); - } - if (options.nested_defuns - && node instanceof AST_Defun - && !(tw.parent() instanceof AST_Scope)) { - AST_Node.warn("Function {name} declared in nested statement \"{type}\" [{file}:{line},{col}]", { - name: node.name.name, - type: tw.parent().TYPE, - file: node.start.file, - line: node.start.line, - col: node.start.col - }); - } - }); - this.walk(tw); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/sourcemap.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/sourcemap.js deleted file mode 100644 index 3429908..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/sourcemap.js +++ /dev/null @@ -1,81 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -// a small wrapper around fitzgen's source-map library -function SourceMap(options) { - options = defaults(options, { - file : null, - root : null, - orig : null, - }); - var generator = new MOZ_SourceMap.SourceMapGenerator({ - file : options.file, - sourceRoot : options.root - }); - var orig_map = options.orig && new MOZ_SourceMap.SourceMapConsumer(options.orig); - function add(source, gen_line, gen_col, orig_line, orig_col, name) { - if (orig_map) { - var info = orig_map.originalPositionFor({ - line: orig_line, - column: orig_col - }); - source = info.source; - orig_line = info.line; - orig_col = info.column; - name = info.name; - } - generator.addMapping({ - generated : { line: gen_line, column: gen_col }, - original : { line: orig_line, column: orig_col }, - source : source, - name : name - }); - }; - return { - add : add, - get : function() { return generator }, - toString : function() { return generator.toString() } - }; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/transform.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/transform.js deleted file mode 100644 index 7a61e5f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/transform.js +++ /dev/null @@ -1,217 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -// Tree transformer helpers. - -function TreeTransformer(before, after) { - TreeWalker.call(this); - this.before = before; - this.after = after; -} -TreeTransformer.prototype = new TreeWalker; - -(function(undefined){ - - function _(node, descend) { - node.DEFMETHOD("transform", function(tw, in_list){ - var x, y; - tw.push(this); - if (tw.before) x = tw.before(this, descend, in_list); - if (x === undefined) { - if (!tw.after) { - x = this; - descend(x, tw); - } else { - tw.stack[tw.stack.length - 1] = x = this.clone(); - descend(x, tw); - y = tw.after(x, in_list); - if (y !== undefined) x = y; - } - } - tw.pop(); - return x; - }); - }; - - function do_list(list, tw) { - return MAP(list, function(node){ - return node.transform(tw, true); - }); - }; - - _(AST_Node, noop); - - _(AST_LabeledStatement, function(self, tw){ - self.label = self.label.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_SimpleStatement, function(self, tw){ - self.body = self.body.transform(tw); - }); - - _(AST_Block, function(self, tw){ - self.body = do_list(self.body, tw); - }); - - _(AST_DWLoop, function(self, tw){ - self.condition = self.condition.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_For, function(self, tw){ - if (self.init) self.init = self.init.transform(tw); - if (self.condition) self.condition = self.condition.transform(tw); - if (self.step) self.step = self.step.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_ForIn, function(self, tw){ - self.init = self.init.transform(tw); - self.object = self.object.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_With, function(self, tw){ - self.expression = self.expression.transform(tw); - self.body = self.body.transform(tw); - }); - - _(AST_Exit, function(self, tw){ - if (self.value) self.value = self.value.transform(tw); - }); - - _(AST_LoopControl, function(self, tw){ - if (self.label) self.label = self.label.transform(tw); - }); - - _(AST_If, function(self, tw){ - self.condition = self.condition.transform(tw); - self.body = self.body.transform(tw); - if (self.alternative) self.alternative = self.alternative.transform(tw); - }); - - _(AST_Switch, function(self, tw){ - self.expression = self.expression.transform(tw); - self.body = do_list(self.body, tw); - }); - - _(AST_Case, function(self, tw){ - self.expression = self.expression.transform(tw); - self.body = do_list(self.body, tw); - }); - - _(AST_Try, function(self, tw){ - self.body = do_list(self.body, tw); - if (self.bcatch) self.bcatch = self.bcatch.transform(tw); - if (self.bfinally) self.bfinally = self.bfinally.transform(tw); - }); - - _(AST_Catch, function(self, tw){ - self.argname = self.argname.transform(tw); - self.body = do_list(self.body, tw); - }); - - _(AST_Definitions, function(self, tw){ - self.definitions = do_list(self.definitions, tw); - }); - - _(AST_VarDef, function(self, tw){ - if (self.value) self.value = self.value.transform(tw); - }); - - _(AST_Lambda, function(self, tw){ - if (self.name) self.name = self.name.transform(tw); - self.argnames = do_list(self.argnames, tw); - self.body = do_list(self.body, tw); - }); - - _(AST_Call, function(self, tw){ - self.expression = self.expression.transform(tw); - self.args = do_list(self.args, tw); - }); - - _(AST_Seq, function(self, tw){ - self.car = self.car.transform(tw); - self.cdr = self.cdr.transform(tw); - }); - - _(AST_Dot, function(self, tw){ - self.expression = self.expression.transform(tw); - }); - - _(AST_Sub, function(self, tw){ - self.expression = self.expression.transform(tw); - self.property = self.property.transform(tw); - }); - - _(AST_Unary, function(self, tw){ - self.expression = self.expression.transform(tw); - }); - - _(AST_Binary, function(self, tw){ - self.left = self.left.transform(tw); - self.right = self.right.transform(tw); - }); - - _(AST_Conditional, function(self, tw){ - self.condition = self.condition.transform(tw); - self.consequent = self.consequent.transform(tw); - self.alternative = self.alternative.transform(tw); - }); - - _(AST_Array, function(self, tw){ - self.elements = do_list(self.elements, tw); - }); - - _(AST_Object, function(self, tw){ - self.properties = do_list(self.properties, tw); - }); - - _(AST_ObjectProperty, function(self, tw){ - self.value = self.value.transform(tw); - }); - -})(); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/utils.js deleted file mode 100644 index 73964a0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/lib/utils.js +++ /dev/null @@ -1,295 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - https://github.com/mishoo/UglifyJS2 - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2012 (c) Mihai Bazon - - 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. - - ***********************************************************************/ - -"use strict"; - -function array_to_hash(a) { - var ret = Object.create(null); - 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 || 0); -}; - -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 find_if(func, array) { - for (var i = 0, n = array.length; i < n; ++i) { - if (func(array[i])) - return array[i]; - } -}; - -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 DefaultsError(msg, defs) { - this.msg = msg; - this.defs = defs; -}; - -function defaults(args, defs, croak) { - if (args === true) - args = {}; - var ret = args || {}; - if (croak) for (var i in ret) if (ret.hasOwnProperty(i) && !defs.hasOwnProperty(i)) - throw new DefaultsError("`" + i + "` is not a supported option", defs); - for (var i in defs) if (defs.hasOwnProperty(i)) { - ret[i] = (args && args.hasOwnProperty(i)) ? args[i] : defs[i]; - } - return ret; -}; - -function merge(obj, ext) { - for (var i in ext) if (ext.hasOwnProperty(i)) { - obj[i] = ext[i]; - } - return obj; -}; - -function noop() {}; - -var MAP = (function(){ - function MAP(a, f, backwards) { - var ret = [], top = [], i; - function doit() { - var val = f(a[i], i); - var is_last = val instanceof Last; - if (is_last) val = val.v; - if (val instanceof AtTop) { - val = val.v; - if (val instanceof Splice) { - top.push.apply(top, backwards ? val.v.slice().reverse() : val.v); - } else { - top.push(val); - } - } - else if (val !== skip) { - if (val instanceof Splice) { - ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v); - } else { - ret.push(val); - } - } - return is_last; - }; - if (a instanceof Array) { - if (backwards) { - for (i = a.length; --i >= 0;) if (doit()) break; - ret.reverse(); - top.reverse(); - } else { - for (i = 0; i < a.length; ++i) if (doit()) break; - } - } - else { - for (i in a) if (a.hasOwnProperty(i)) if (doit()) break; - } - return top.concat(ret); - }; - MAP.at_top = function(val) { return new AtTop(val) }; - MAP.splice = function(val) { return new Splice(val) }; - MAP.last = function(val) { return new Last(val) }; - var skip = MAP.skip = {}; - function AtTop(val) { this.v = val }; - function Splice(val) { this.v = val }; - function Last(val) { this.v = val }; - return MAP; -})(); - -function push_uniq(array, el) { - if (array.indexOf(el) < 0) - array.push(el); -}; - -function string_template(text, props) { - return text.replace(/\{(.+?)\}/g, function(str, p){ - return props[p]; - }); -}; - -function remove(array, el) { - for (var i = array.length; --i >= 0;) { - if (array[i] === el) array.splice(i, 1); - } -}; - -function mergeSort(array, cmp) { - if (array.length < 2) return array.slice(); - function merge(a, b) { - var r = [], ai = 0, bi = 0, i = 0; - while (ai < a.length && bi < b.length) { - cmp(a[ai], b[bi]) <= 0 - ? r[i++] = a[ai++] - : r[i++] = b[bi++]; - } - if (ai < a.length) r.push.apply(r, a.slice(ai)); - if (bi < b.length) r.push.apply(r, b.slice(bi)); - return r; - }; - function _ms(a) { - if (a.length <= 1) - return a; - var m = Math.floor(a.length / 2), left = a.slice(0, m), right = a.slice(m); - left = _ms(left); - right = _ms(right); - return merge(left, right); - }; - return _ms(array); -}; - -function set_difference(a, b) { - return a.filter(function(el){ - return b.indexOf(el) < 0; - }); -}; - -function set_intersection(a, b) { - return a.filter(function(el){ - return b.indexOf(el) >= 0; - }); -}; - -// this function is taken from Acorn [1], written by Marijn Haverbeke -// [1] https://github.com/marijnh/acorn -function makePredicate(words) { - if (!(words instanceof Array)) words = words.split(" "); - var f = "", cats = []; - out: for (var i = 0; i < words.length; ++i) { - for (var j = 0; j < cats.length; ++j) - if (cats[j][0].length == words[i].length) { - cats[j].push(words[i]); - continue out; - } - cats.push([words[i]]); - } - function compareTo(arr) { - if (arr.length == 1) return f += "return str === " + JSON.stringify(arr[0]) + ";"; - f += "switch(str){"; - for (var i = 0; i < arr.length; ++i) f += "case " + JSON.stringify(arr[i]) + ":"; - f += "return true}return false;"; - } - // When there are more than three length categories, an outer - // switch first dispatches on the lengths, to save on comparisons. - if (cats.length > 3) { - cats.sort(function(a, b) {return b.length - a.length;}); - f += "switch(str.length){"; - for (var i = 0; i < cats.length; ++i) { - var cat = cats[i]; - f += "case " + cat[0].length + ":"; - compareTo(cat); - } - f += "}"; - // Otherwise, simply generate a flat `switch` statement. - } else { - compareTo(words); - } - return new Function("str", f); -}; - -function all(array, predicate) { - for (var i = array.length; --i >= 0;) - if (!predicate(array[i])) - return false; - return true; -}; - -function Dictionary() { - this._values = Object.create(null); - this._size = 0; -}; -Dictionary.prototype = { - set: function(key, val) { - if (!this.has(key)) ++this._size; - this._values["$" + key] = val; - return this; - }, - add: function(key, val) { - if (this.has(key)) { - this.get(key).push(val); - } else { - this.set(key, [ val ]); - } - return this; - }, - get: function(key) { return this._values["$" + key] }, - del: function(key) { - if (this.has(key)) { - --this._size; - delete this._values["$" + key]; - } - return this; - }, - has: function(key) { return ("$" + key) in this._values }, - each: function(f) { - for (var i in this._values) - f(this._values[i], i.substr(1)); - }, - size: function() { - return this._size; - }, - map: function(f) { - var ret = []; - for (var i in this._values) - ret.push(f(this._values[i], i.substr(1))); - return ret; - } -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/LICENSE deleted file mode 100644 index b7f9d50..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Caolan McMahon - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/README.md deleted file mode 100644 index 951f76e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/README.md +++ /dev/null @@ -1,1425 +0,0 @@ -# Async.js - -Async is a utility module which provides straight-forward, powerful functions -for working with asynchronous JavaScript. Although originally designed for -use with [node.js](http://nodejs.org), it can also be used directly in the -browser. Also supports [component](https://github.com/component/component). - -Async provides around 20 functions that include the usual 'functional' -suspects (map, reduce, filter, each…) as well as some common patterns -for asynchronous control flow (parallel, series, waterfall…). All these -functions assume you follow the node.js convention of providing a single -callback as the last argument of your async function. - - -## Quick Examples - -```javascript -async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file -}); - -async.filter(['file1','file2','file3'], fs.exists, function(results){ - // results now equals an array of the existing files -}); - -async.parallel([ - function(){ ... }, - function(){ ... } -], callback); - -async.series([ - function(){ ... }, - function(){ ... } -]); -``` - -There are many more functions available so take a look at the docs below for a -full list. This module aims to be comprehensive, so if you feel anything is -missing please create a GitHub issue for it. - -## Common Pitfalls - -### Binding a context to an iterator - -This section is really about bind, not about async. If you are wondering how to -make async execute your iterators in a given context, or are confused as to why -a method of another library isn't working as an iterator, study this example: - -```js -// Here is a simple object with an (unnecessarily roundabout) squaring method -var AsyncSquaringLibrary = { - squareExponent: 2, - square: function(number, callback){ - var result = Math.pow(number, this.squareExponent); - setTimeout(function(){ - callback(null, result); - }, 200); - } -}; - -async.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){ - // result is [NaN, NaN, NaN] - // This fails because the `this.squareExponent` expression in the square - // function is not evaluated in the context of AsyncSquaringLibrary, and is - // therefore undefined. -}); - -async.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){ - // result is [1, 4, 9] - // With the help of bind we can attach a context to the iterator before - // passing it to async. Now the square function will be executed in its - // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent` - // will be as expected. -}); -``` - -## Download - -The source is available for download from -[GitHub](http://github.com/caolan/async). -Alternatively, you can install using Node Package Manager (npm): - - npm install async - -__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed - -## In the Browser - -So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage: - -```html - - -``` - -## Documentation - -### Collections - -* [each](#each) -* [eachSeries](#eachSeries) -* [eachLimit](#eachLimit) -* [map](#map) -* [mapSeries](#mapSeries) -* [mapLimit](#mapLimit) -* [filter](#filter) -* [filterSeries](#filterSeries) -* [reject](#reject) -* [rejectSeries](#rejectSeries) -* [reduce](#reduce) -* [reduceRight](#reduceRight) -* [detect](#detect) -* [detectSeries](#detectSeries) -* [sortBy](#sortBy) -* [some](#some) -* [every](#every) -* [concat](#concat) -* [concatSeries](#concatSeries) - -### Control Flow - -* [series](#series) -* [parallel](#parallel) -* [parallelLimit](#parallellimittasks-limit-callback) -* [whilst](#whilst) -* [doWhilst](#doWhilst) -* [until](#until) -* [doUntil](#doUntil) -* [forever](#forever) -* [waterfall](#waterfall) -* [compose](#compose) -* [applyEach](#applyEach) -* [applyEachSeries](#applyEachSeries) -* [queue](#queue) -* [cargo](#cargo) -* [auto](#auto) -* [iterator](#iterator) -* [apply](#apply) -* [nextTick](#nextTick) -* [times](#times) -* [timesSeries](#timesSeries) - -### Utils - -* [memoize](#memoize) -* [unmemoize](#unmemoize) -* [log](#log) -* [dir](#dir) -* [noConflict](#noConflict) - - -## Collections - - - -### each(arr, iterator, callback) - -Applies an iterator function to each item in an array, in parallel. -The iterator is called with an item from the list and a callback for when it -has finished. If the iterator passes an error to this callback, the main -callback for the each function is immediately called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err) which must be called once it has - completed. If no error has occured, the callback should be run without - arguments or with an explicit null argument. -* callback(err) - A callback which is called after all the iterator functions - have finished, or an error has occurred. - -__Example__ - -```js -// assuming openFiles is an array of file names and saveFile is a function -// to save the modified contents of that file: - -async.each(openFiles, saveFile, function(err){ - // if any of the saves produced an error, err would equal that error -}); -``` - ---------------------------------------- - - - -### eachSeries(arr, iterator, callback) - -The same as each only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. This means the iterator functions will complete in order. - - ---------------------------------------- - - - -### eachLimit(arr, limit, iterator, callback) - -The same as each only no more than "limit" iterators will be simultaneously -running at any time. - -Note that the items are not processed in batches, so there is no guarantee that - the first "limit" iterator functions will complete before any others are -started. - -__Arguments__ - -* arr - An array to iterate over. -* limit - The maximum number of iterators to run at any time. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err) which must be called once it has - completed. If no error has occured, the callback should be run without - arguments or with an explicit null argument. -* callback(err) - A callback which is called after all the iterator functions - have finished, or an error has occurred. - -__Example__ - -```js -// Assume documents is an array of JSON objects and requestApi is a -// function that interacts with a rate-limited REST api. - -async.eachLimit(documents, 20, requestApi, function(err){ - // if any of the saves produced an error, err would equal that error -}); -``` - ---------------------------------------- - - -### map(arr, iterator, callback) - -Produces a new array of values by mapping each value in the given array through -the iterator function. The iterator is called with an item from the array and a -callback for when it has finished processing. The callback takes 2 arguments, -an error and the transformed item from the array. If the iterator passes an -error to this callback, the main callback for the map function is immediately -called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order, however -the results array will be in the same order as the original array. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, transformed) which must be called once - it has completed with an error (which can be null) and a transformed item. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array of the - transformed items from the original array. - -__Example__ - -```js -async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file -}); -``` - ---------------------------------------- - - -### mapSeries(arr, iterator, callback) - -The same as map only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - - ---------------------------------------- - - -### mapLimit(arr, limit, iterator, callback) - -The same as map only no more than "limit" iterators will be simultaneously -running at any time. - -Note that the items are not processed in batches, so there is no guarantee that - the first "limit" iterator functions will complete before any others are -started. - -__Arguments__ - -* arr - An array to iterate over. -* limit - The maximum number of iterators to run at any time. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, transformed) which must be called once - it has completed with an error (which can be null) and a transformed item. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array of the - transformed items from the original array. - -__Example__ - -```js -async.mapLimit(['file1','file2','file3'], 1, fs.stat, function(err, results){ - // results is now an array of stats for each file -}); -``` - ---------------------------------------- - - -### filter(arr, iterator, callback) - -__Alias:__ select - -Returns a new array of all the values which pass an async truth test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like fs.exists. This operation is -performed in parallel, but the results array will be in the same order as the -original. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(results) - A callback which is called after all the iterator - functions have finished. - -__Example__ - -```js -async.filter(['file1','file2','file3'], fs.exists, function(results){ - // results now equals an array of the existing files -}); -``` - ---------------------------------------- - - -### filterSeries(arr, iterator, callback) - -__alias:__ selectSeries - -The same as filter only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - ---------------------------------------- - - -### reject(arr, iterator, callback) - -The opposite of filter. Removes values that pass an async truth test. - ---------------------------------------- - - -### rejectSeries(arr, iterator, callback) - -The same as reject, only the iterator is applied to each item in the array -in series. - - ---------------------------------------- - - -### reduce(arr, memo, iterator, callback) - -__aliases:__ inject, foldl - -Reduces a list of values into a single value using an async iterator to return -each successive step. Memo is the initial state of the reduction. This -function only operates in series. For performance reasons, it may make sense to -split a call to this function into a parallel map, then use the normal -Array.prototype.reduce on the results. This function is for situations where -each step in the reduction needs to be async, if you can get the data before -reducing it then it's probably a good idea to do so. - -__Arguments__ - -* arr - An array to iterate over. -* memo - The initial state of the reduction. -* iterator(memo, item, callback) - A function applied to each item in the - array to produce the next step in the reduction. The iterator is passed a - callback(err, reduction) which accepts an optional error as its first - argument, and the state of the reduction as the second. If an error is - passed to the callback, the reduction is stopped and the main callback is - immediately called with the error. -* callback(err, result) - A callback which is called after all the iterator - functions have finished. Result is the reduced value. - -__Example__ - -```js -async.reduce([1,2,3], 0, function(memo, item, callback){ - // pointless async: - process.nextTick(function(){ - callback(null, memo + item) - }); -}, function(err, result){ - // result is now equal to the last value of memo, which is 6 -}); -``` - ---------------------------------------- - - -### reduceRight(arr, memo, iterator, callback) - -__Alias:__ foldr - -Same as reduce, only operates on the items in the array in reverse order. - - ---------------------------------------- - - -### detect(arr, iterator, callback) - -Returns the first value in a list that passes an async truth test. The -iterator is applied in parallel, meaning the first iterator to return true will -fire the detect callback with that result. That means the result might not be -the first item in the original array (in terms of order) that passes the test. - -If order within the original array is important then look at detectSeries. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - the first item in the array that passes the truth test (iterator) or the - value undefined if none passed. - -__Example__ - -```js -async.detect(['file1','file2','file3'], fs.exists, function(result){ - // result now equals the first file in the list that exists -}); -``` - ---------------------------------------- - - -### detectSeries(arr, iterator, callback) - -The same as detect, only the iterator is applied to each item in the array -in series. This means the result is always the first in the original array (in -terms of array order) that passes the truth test. - - ---------------------------------------- - - -### sortBy(arr, iterator, callback) - -Sorts a list by the results of running each value through an async iterator. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, sortValue) which must be called once it - has completed with an error (which can be null) and a value to use as the sort - criteria. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is the items from - the original array sorted by the values returned by the iterator calls. - -__Example__ - -```js -async.sortBy(['file1','file2','file3'], function(file, callback){ - fs.stat(file, function(err, stats){ - callback(err, stats.mtime); - }); -}, function(err, results){ - // results is now the original array of files sorted by - // modified date -}); -``` - ---------------------------------------- - - -### some(arr, iterator, callback) - -__Alias:__ any - -Returns true if at least one element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like fs.exists. Once any iterator -call returns true, the main callback is immediately called. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - either true or false depending on the values of the async tests. - -__Example__ - -```js -async.some(['file1','file2','file3'], fs.exists, function(result){ - // if result is true then at least one of the files exists -}); -``` - ---------------------------------------- - - -### every(arr, iterator, callback) - -__Alias:__ all - -Returns true if every element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like fs.exists. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(result) - A callback which is called after all the iterator - functions have finished. Result will be either true or false depending on - the values of the async tests. - -__Example__ - -```js -async.every(['file1','file2','file3'], fs.exists, function(result){ - // if result is true then every file exists -}); -``` - ---------------------------------------- - - -### concat(arr, iterator, callback) - -Applies an iterator to each item in a list, concatenating the results. Returns the -concatenated list. The iterators are called in parallel, and the results are -concatenated as they return. There is no guarantee that the results array will -be returned in the original order of the arguments passed to the iterator function. - -__Arguments__ - -* arr - An array to iterate over -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, results) which must be called once it - has completed with an error (which can be null) and an array of results. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array containing - the concatenated results of the iterator function. - -__Example__ - -```js -async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){ - // files is now a list of filenames that exist in the 3 directories -}); -``` - ---------------------------------------- - - -### concatSeries(arr, iterator, callback) - -Same as async.concat, but executes in series instead of parallel. - - -## Control Flow - - -### series(tasks, [callback]) - -Run an array of functions in series, each one running once the previous -function has completed. If any functions in the series pass an error to its -callback, no more functions are run and the callback for the series is -immediately called with the value of the error. Once the tasks have completed, -the results are passed to the final callback as an array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.series. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback(err, result) it must call on completion with an error (which can - be null) and an optional result value. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - -__Example__ - -```js -async.series([ - function(callback){ - // do some stuff ... - callback(null, 'one'); - }, - function(callback){ - // do some more stuff ... - callback(null, 'two'); - } -], -// optional callback -function(err, results){ - // results is now equal to ['one', 'two'] -}); - - -// an example using an object instead of an array -async.series({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - } -}, -function(err, results) { - // results is now equal to: {one: 1, two: 2} -}); -``` - ---------------------------------------- - - -### parallel(tasks, [callback]) - -Run an array of functions in parallel, without waiting until the previous -function has completed. If any of the functions pass an error to its -callback, the main callback is immediately called with the value of the error. -Once the tasks have completed, the results are passed to the final callback as an -array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.parallel. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback(err, result) it must call on completion with an error (which can - be null) and an optional result value. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - -__Example__ - -```js -async.parallel([ - function(callback){ - setTimeout(function(){ - callback(null, 'one'); - }, 200); - }, - function(callback){ - setTimeout(function(){ - callback(null, 'two'); - }, 100); - } -], -// optional callback -function(err, results){ - // the results array will equal ['one','two'] even though - // the second function had a shorter timeout. -}); - - -// an example using an object instead of an array -async.parallel({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - } -}, -function(err, results) { - // results is now equals to: {one: 1, two: 2} -}); -``` - ---------------------------------------- - - -### parallelLimit(tasks, limit, [callback]) - -The same as parallel only the tasks are executed in parallel with a maximum of "limit" -tasks executing at any time. - -Note that the tasks are not executed in batches, so there is no guarantee that -the first "limit" tasks will complete before any others are started. - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback(err, result) it must call on completion with an error (which can - be null) and an optional result value. -* limit - The maximum number of tasks to run at any time. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - ---------------------------------------- - - -### whilst(test, fn, callback) - -Repeatedly call fn, while test returns true. Calls the callback when stopped, -or an error occurs. - -__Arguments__ - -* test() - synchronous truth test to perform before each execution of fn. -* fn(callback) - A function to call each time the test passes. The function is - passed a callback(err) which must be called once it has completed with an - optional error argument. -* callback(err) - A callback which is called after the test fails and repeated - execution of fn has stopped. - -__Example__ - -```js -var count = 0; - -async.whilst( - function () { return count < 5; }, - function (callback) { - count++; - setTimeout(callback, 1000); - }, - function (err) { - // 5 seconds have passed - } -); -``` - ---------------------------------------- - - -### doWhilst(fn, test, callback) - -The post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. - ---------------------------------------- - - -### until(test, fn, callback) - -Repeatedly call fn, until test returns true. Calls the callback when stopped, -or an error occurs. - -The inverse of async.whilst. - ---------------------------------------- - - -### doUntil(fn, test, callback) - -Like doWhilst except the test is inverted. Note the argument ordering differs from `until`. - ---------------------------------------- - - -### forever(fn, callback) - -Calls the asynchronous function 'fn' repeatedly, in series, indefinitely. -If an error is passed to fn's callback then 'callback' is called with the -error, otherwise it will never be called. - ---------------------------------------- - - -### waterfall(tasks, [callback]) - -Runs an array of functions in series, each passing their results to the next in -the array. However, if any of the functions pass an error to the callback, the -next function is not executed and the main callback is immediately called with -the error. - -__Arguments__ - -* tasks - An array of functions to run, each function is passed a - callback(err, result1, result2, ...) it must call on completion. The first - argument is an error (which can be null) and any further arguments will be - passed as arguments in order to the next task. -* callback(err, [results]) - An optional callback to run once all the functions - have completed. This will be passed the results of the last task's callback. - - - -__Example__ - -```js -async.waterfall([ - function(callback){ - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - callback(null, 'three'); - }, - function(arg1, callback){ - // arg1 now equals 'three' - callback(null, 'done'); - } -], function (err, result) { - // result now equals 'done' -}); -``` - ---------------------------------------- - -### compose(fn1, fn2...) - -Creates a function which is a composition of the passed asynchronous -functions. Each function consumes the return value of the function that -follows. Composing functions f(), g() and h() would produce the result of -f(g(h())), only this version uses callbacks to obtain the return values. - -Each function is executed with the `this` binding of the composed function. - -__Arguments__ - -* functions... - the asynchronous functions to compose - - -__Example__ - -```js -function add1(n, callback) { - setTimeout(function () { - callback(null, n + 1); - }, 10); -} - -function mul3(n, callback) { - setTimeout(function () { - callback(null, n * 3); - }, 10); -} - -var add1mul3 = async.compose(mul3, add1); - -add1mul3(4, function (err, result) { - // result now equals 15 -}); -``` - ---------------------------------------- - -### applyEach(fns, args..., callback) - -Applies the provided arguments to each function in the array, calling the -callback after all functions have completed. If you only provide the first -argument then it will return a function which lets you pass in the -arguments as if it were a single function call. - -__Arguments__ - -* fns - the asynchronous functions to all call with the same arguments -* args... - any number of separate arguments to pass to the function -* callback - the final argument should be the callback, called when all - functions have completed processing - - -__Example__ - -```js -async.applyEach([enableSearch, updateSchema], 'bucket', callback); - -// partial application example: -async.each( - buckets, - async.applyEach([enableSearch, updateSchema]), - callback -); -``` - ---------------------------------------- - - -### applyEachSeries(arr, iterator, callback) - -The same as applyEach only the functions are applied in series. - ---------------------------------------- - - -### queue(worker, concurrency) - -Creates a queue object with the specified concurrency. Tasks added to the -queue will be processed in parallel (up to the concurrency limit). If all -workers are in progress, the task is queued until one is available. Once -a worker has completed a task, the task's callback is called. - -__Arguments__ - -* worker(task, callback) - An asynchronous function for processing a queued - task, which must call its callback(err) argument when finished, with an - optional error as an argument. -* concurrency - An integer for determining how many worker functions should be - run in parallel. - -__Queue objects__ - -The queue object returned by this function has the following properties and -methods: - -* length() - a function returning the number of items waiting to be processed. -* concurrency - an integer for determining how many worker functions should be - run in parallel. This property can be changed after a queue is created to - alter the concurrency on-the-fly. -* push(task, [callback]) - add a new task to the queue, the callback is called - once the worker has finished processing the task. - instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list. -* unshift(task, [callback]) - add a new task to the front of the queue. -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued -* empty - a callback that is called when the last item from the queue is given to a worker -* drain - a callback that is called when the last item from the queue has returned from the worker - -__Example__ - -```js -// create a queue object with concurrency 2 - -var q = async.queue(function (task, callback) { - console.log('hello ' + task.name); - callback(); -}, 2); - - -// assign a callback -q.drain = function() { - console.log('all items have been processed'); -} - -// add some items to the queue - -q.push({name: 'foo'}, function (err) { - console.log('finished processing foo'); -}); -q.push({name: 'bar'}, function (err) { - console.log('finished processing bar'); -}); - -// add some items to the queue (batch-wise) - -q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) { - console.log('finished processing bar'); -}); - -// add some items to the front of the queue - -q.unshift({name: 'bar'}, function (err) { - console.log('finished processing bar'); -}); -``` - ---------------------------------------- - - -### cargo(worker, [payload]) - -Creates a cargo object with the specified payload. Tasks added to the -cargo will be processed altogether (up to the payload limit). If the -worker is in progress, the task is queued until it is available. Once -the worker has completed some tasks, each callback of those tasks is called. - -__Arguments__ - -* worker(tasks, callback) - An asynchronous function for processing an array of - queued tasks, which must call its callback(err) argument when finished, with - an optional error as an argument. -* payload - An optional integer for determining how many tasks should be - processed per round; if omitted, the default is unlimited. - -__Cargo objects__ - -The cargo object returned by this function has the following properties and -methods: - -* length() - a function returning the number of items waiting to be processed. -* payload - an integer for determining how many tasks should be - process per round. This property can be changed after a cargo is created to - alter the payload on-the-fly. -* push(task, [callback]) - add a new task to the queue, the callback is called - once the worker has finished processing the task. - instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list. -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued -* empty - a callback that is called when the last item from the queue is given to a worker -* drain - a callback that is called when the last item from the queue has returned from the worker - -__Example__ - -```js -// create a cargo object with payload 2 - -var cargo = async.cargo(function (tasks, callback) { - for(var i=0; i -### auto(tasks, [callback]) - -Determines the best order for running functions based on their requirements. -Each function can optionally depend on other functions being completed first, -and each function is run as soon as its requirements are satisfied. If any of -the functions pass an error to their callback, that function will not complete -(so any other functions depending on it will not run) and the main callback -will be called immediately with the error. Functions also receive an object -containing the results of functions which have completed so far. - -Note, all functions are called with a results object as a second argument, -so it is unsafe to pass functions in the tasks object which cannot handle the -extra argument. For example, this snippet of code: - -```js -async.auto({ - readData: async.apply(fs.readFile, 'data.txt', 'utf-8') -}, callback); -``` - -will have the effect of calling readFile with the results object as the last -argument, which will fail: - -```js -fs.readFile('data.txt', 'utf-8', cb, {}); -``` - -Instead, wrap the call to readFile in a function which does not forward the -results object: - -```js -async.auto({ - readData: function(cb, results){ - fs.readFile('data.txt', 'utf-8', cb); - } -}, callback); -``` - -__Arguments__ - -* tasks - An object literal containing named functions or an array of - requirements, with the function itself the last item in the array. The key - used for each function or array is used when specifying requirements. The - function receives two arguments: (1) a callback(err, result) which must be - called when finished, passing an error (which can be null) and the result of - the function's execution, and (2) a results object, containing the results of - the previously executed functions. -* callback(err, results) - An optional callback which is called when all the - tasks have been completed. The callback will receive an error as an argument - if any tasks pass an error to their callback. Results will always be passed - but if an error occurred, no other tasks will be performed, and the results - object will only contain partial results. - - -__Example__ - -```js -async.auto({ - get_data: function(callback){ - // async code to get some data - }, - make_folder: function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - }, - write_file: ['get_data', 'make_folder', function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - callback(null, filename); - }], - email_link: ['write_file', function(callback, results){ - // once the file is written let's email a link to it... - // results.write_file contains the filename returned by write_file. - }] -}); -``` - -This is a fairly trivial example, but to do this using the basic parallel and -series functions would look like this: - -```js -async.parallel([ - function(callback){ - // async code to get some data - }, - function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - } -], -function(err, results){ - async.series([ - function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - }, - function(callback){ - // once the file is written let's email a link to it... - } - ]); -}); -``` - -For a complicated series of async tasks using the auto function makes adding -new tasks much easier and makes the code more readable. - - ---------------------------------------- - - -### iterator(tasks) - -Creates an iterator function which calls the next function in the array, -returning a continuation to call the next one after that. It's also possible to -'peek' the next iterator by doing iterator.next(). - -This function is used internally by the async module but can be useful when -you want to manually control the flow of functions in series. - -__Arguments__ - -* tasks - An array of functions to run. - -__Example__ - -```js -var iterator = async.iterator([ - function(){ sys.p('one'); }, - function(){ sys.p('two'); }, - function(){ sys.p('three'); } -]); - -node> var iterator2 = iterator(); -'one' -node> var iterator3 = iterator2(); -'two' -node> iterator3(); -'three' -node> var nextfn = iterator2.next(); -node> nextfn(); -'three' -``` - ---------------------------------------- - - -### apply(function, arguments..) - -Creates a continuation function with some arguments already applied, a useful -shorthand when combined with other control flow functions. Any arguments -passed to the returned function are added to the arguments originally passed -to apply. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to automatically apply when the - continuation is called. - -__Example__ - -```js -// using apply - -async.parallel([ - async.apply(fs.writeFile, 'testfile1', 'test1'), - async.apply(fs.writeFile, 'testfile2', 'test2'), -]); - - -// the same process without using apply - -async.parallel([ - function(callback){ - fs.writeFile('testfile1', 'test1', callback); - }, - function(callback){ - fs.writeFile('testfile2', 'test2', callback); - } -]); -``` - -It's possible to pass any number of additional arguments when calling the -continuation: - -```js -node> var fn = async.apply(sys.puts, 'one'); -node> fn('two', 'three'); -one -two -three -``` - ---------------------------------------- - - -### nextTick(callback) - -Calls the callback on a later loop around the event loop. In node.js this just -calls process.nextTick, in the browser it falls back to setImmediate(callback) -if available, otherwise setTimeout(callback, 0), which means other higher priority -events may precede the execution of the callback. - -This is used internally for browser-compatibility purposes. - -__Arguments__ - -* callback - The function to call on a later loop around the event loop. - -__Example__ - -```js -var call_order = []; -async.nextTick(function(){ - call_order.push('two'); - // call_order now equals ['one','two'] -}); -call_order.push('one') -``` - - -### times(n, callback) - -Calls the callback n times and accumulates results in the same manner -you would use with async.map. - -__Arguments__ - -* n - The number of times to run the function. -* callback - The function to call n times. - -__Example__ - -```js -// Pretend this is some complicated async factory -var createUser = function(id, callback) { - callback(null, { - id: 'user' + id - }) -} -// generate 5 users -async.times(5, function(n, next){ - createUser(n, function(err, user) { - next(err, user) - }) -}, function(err, users) { - // we should now have 5 users -}); -``` - - -### timesSeries(n, callback) - -The same as times only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - - -## Utils - - -### memoize(fn, [hasher]) - -Caches the results of an async function. When creating a hash to store function -results against, the callback is omitted from the hash and an optional hash -function can be used. - -The cache of results is exposed as the `memo` property of the function returned -by `memoize`. - -__Arguments__ - -* fn - the function you to proxy and cache results from. -* hasher - an optional function for generating a custom hash for storing - results, it has all the arguments applied to it apart from the callback, and - must be synchronous. - -__Example__ - -```js -var slow_fn = function (name, callback) { - // do something - callback(null, result); -}; -var fn = async.memoize(slow_fn); - -// fn can now be used as if it were slow_fn -fn('some name', function () { - // callback -}); -``` - - -### unmemoize(fn) - -Undoes a memoized function, reverting it to the original, unmemoized -form. Comes handy in tests. - -__Arguments__ - -* fn - the memoized function - - -### log(function, arguments) - -Logs the result of an async function to the console. Only works in node.js or -in browsers that support console.log and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.log is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - -```js -var hello = function(name, callback){ - setTimeout(function(){ - callback(null, 'hello ' + name); - }, 1000); -}; -``` -```js -node> async.log(hello, 'world'); -'hello world' -``` - ---------------------------------------- - - -### dir(function, arguments) - -Logs the result of an async function to the console using console.dir to -display the properties of the resulting object. Only works in node.js or -in browsers that support console.dir and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.dir is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - -```js -var hello = function(name, callback){ - setTimeout(function(){ - callback(null, {hello: name}); - }, 1000); -}; -``` -```js -node> async.dir(hello, 'world'); -{hello: 'world'} -``` - ---------------------------------------- - - -### noConflict() - -Changes the value of async back to its original value, returning a reference to the -async object. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/component.json deleted file mode 100644 index bbb0115..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/component.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "async", - "repo": "caolan/async", - "description": "Higher-order functions and common patterns for asynchronous code", - "version": "0.1.23", - "keywords": [], - "dependencies": {}, - "development": {}, - "main": "lib/async.js", - "scripts": [ "lib/async.js" ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/lib/async.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/lib/async.js deleted file mode 100755 index 1eebb15..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/handlebars/node_modules/uglify-js/node_modules/async/lib/async.js +++ /dev/null @@ -1,958 +0,0 @@ -/*global setImmediate: false, setTimeout: false, console: false */ -(function () { - - var async = {}; - - // global on the server, window in the browser - var root, previous_async; - - root = this; - if (root != null) { - previous_async = root.async; - } - - async.noConflict = function () { - root.async = previous_async; - return async; - }; - - function only_once(fn) { - var called = false; - return function() { - if (called) throw new Error("Callback was already called."); - called = true; - fn.apply(root, arguments); - } - } - - //// cross-browser compatiblity functions //// - - var _each = function (arr, iterator) { - if (arr.forEach) { - return arr.forEach(iterator); - } - for (var i = 0; i < arr.length; i += 1) { - iterator(arr[i], i, arr); - } - }; - - var _map = function (arr, iterator) { - if (arr.map) { - return arr.map(iterator); - } - var results = []; - _each(arr, function (x, i, a) { - results.push(iterator(x, i, a)); - }); - return results; - }; - - var _reduce = function (arr, iterator, memo) { - if (arr.reduce) { - return arr.reduce(iterator, memo); - } - _each(arr, function (x, i, a) { - memo = iterator(memo, x, i, a); - }); - return memo; - }; - - var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; - }; - - //// exported async module functions //// - - //// nextTick implementation with browser-compatible fallback //// - if (typeof process === 'undefined' || !(process.nextTick)) { - if (typeof setImmediate === 'function') { - async.nextTick = function (fn) { - // not a direct alias for IE10 compatibility - setImmediate(fn); - }; - async.setImmediate = async.nextTick; - } - else { - async.nextTick = function (fn) { - setTimeout(fn, 0); - }; - async.setImmediate = async.nextTick; - } - } - else { - async.nextTick = process.nextTick; - if (typeof setImmediate !== 'undefined') { - async.setImmediate = function (fn) { - // not a direct alias for IE10 compatibility - setImmediate(fn); - }; - } - else { - async.setImmediate = async.nextTick; - } - } - - async.each = function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length) { - return callback(); - } - var completed = 0; - _each(arr, function (x) { - iterator(x, only_once(function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed >= arr.length) { - callback(null); - } - } - })); - }); - }; - async.forEach = async.each; - - async.eachSeries = function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length) { - return callback(); - } - var completed = 0; - var iterate = function () { - iterator(arr[completed], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed >= arr.length) { - callback(null); - } - else { - iterate(); - } - } - }); - }; - iterate(); - }; - async.forEachSeries = async.eachSeries; - - async.eachLimit = function (arr, limit, iterator, callback) { - var fn = _eachLimit(limit); - fn.apply(null, [arr, iterator, callback]); - }; - async.forEachLimit = async.eachLimit; - - var _eachLimit = function (limit) { - - return function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length || limit <= 0) { - return callback(); - } - var completed = 0; - var started = 0; - var running = 0; - - (function replenish () { - if (completed >= arr.length) { - return callback(); - } - - while (running < limit && started < arr.length) { - started += 1; - running += 1; - iterator(arr[started - 1], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - running -= 1; - if (completed >= arr.length) { - callback(); - } - else { - replenish(); - } - } - }); - } - })(); - }; - }; - - - var doParallel = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.each].concat(args)); - }; - }; - var doParallelLimit = function(limit, fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [_eachLimit(limit)].concat(args)); - }; - }; - var doSeries = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.eachSeries].concat(args)); - }; - }; - - - var _asyncMap = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (err, v) { - results[x.index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - }; - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - async.mapLimit = function (arr, limit, iterator, callback) { - return _mapLimit(limit)(arr, iterator, callback); - }; - - var _mapLimit = function(limit) { - return doParallelLimit(limit, _asyncMap); - }; - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.reduce = function (arr, memo, iterator, callback) { - async.eachSeries(arr, function (x, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - // inject alias - async.inject = async.reduce; - // foldl alias - async.foldl = async.reduce; - - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, function (x) { - return x; - }).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - // foldr alias - async.foldr = async.reduceRight; - - var _filter = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.filter = doParallel(_filter); - async.filterSeries = doSeries(_filter); - // select alias - async.select = async.filter; - async.selectSeries = async.filterSeries; - - var _reject = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (!v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.reject = doParallel(_reject); - async.rejectSeries = doSeries(_reject); - - var _detect = function (eachfn, arr, iterator, main_callback) { - eachfn(arr, function (x, callback) { - iterator(x, function (result) { - if (result) { - main_callback(x); - main_callback = function () {}; - } - else { - callback(); - } - }); - }, function (err) { - main_callback(); - }); - }; - async.detect = doParallel(_detect); - async.detectSeries = doSeries(_detect); - - async.some = function (arr, iterator, main_callback) { - async.each(arr, function (x, callback) { - iterator(x, function (v) { - if (v) { - main_callback(true); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(false); - }); - }; - // any alias - async.any = async.some; - - async.every = function (arr, iterator, main_callback) { - async.each(arr, function (x, callback) { - iterator(x, function (v) { - if (!v) { - main_callback(false); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(true); - }); - }; - // all alias - async.all = async.every; - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - var fn = function (left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var results = {}; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _each(listeners.slice(0), function (fn) { - fn(); - }); - }; - - addListener(function () { - if (_keys(results).length === keys.length) { - callback(null, results); - callback = function () {}; - } - }); - - _each(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - if (err) { - var safeResults = {}; - _each(_keys(results), function(rkey) { - safeResults[rkey] = results[rkey]; - }); - safeResults[k] = args; - callback(err, safeResults); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - results[k] = args; - async.setImmediate(taskComplete); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && results.hasOwnProperty(x)); - }, true) && !results.hasOwnProperty(k); - }; - if (ready()) { - task[task.length - 1](taskCallback, results); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback, results); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor !== Array) { - var err = new Error('First argument to waterfall must be an array of functions'); - return callback(err); - } - if (!tasks.length) { - return callback(); - } - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback.apply(null, arguments); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.setImmediate(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - var _parallel = function(eachfn, tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - eachfn.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - eachfn.each(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.parallel = function (tasks, callback) { - _parallel({ map: async.map, each: async.each }, tasks, callback); - }; - - async.parallelLimit = function(tasks, limit, callback) { - _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback); - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.eachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.doWhilst = function (iterator, test, callback) { - iterator(function (err) { - if (err) { - return callback(err); - } - if (test()) { - async.doWhilst(iterator, test, callback); - } - else { - callback(); - } - }); - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.doUntil = function (iterator, test, callback) { - iterator(function (err) { - if (err) { - return callback(err); - } - if (!test()) { - async.doUntil(iterator, test, callback); - } - else { - callback(); - } - }); - }; - - async.queue = function (worker, concurrency) { - if (concurrency === undefined) { - concurrency = 1; - } - function _insert(q, data, pos, callback) { - if(data.constructor !== Array) { - data = [data]; - } - _each(data, function(task) { - var item = { - data: task, - callback: typeof callback === 'function' ? callback : null - }; - - if (pos) { - q.tasks.unshift(item); - } else { - q.tasks.push(item); - } - - if (q.saturated && q.tasks.length === concurrency) { - q.saturated(); - } - async.setImmediate(q.process); - }); - } - - var workers = 0; - var q = { - tasks: [], - concurrency: concurrency, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - _insert(q, data, false, callback); - }, - unshift: function (data, callback) { - _insert(q, data, true, callback); - }, - process: function () { - if (workers < q.concurrency && q.tasks.length) { - var task = q.tasks.shift(); - if (q.empty && q.tasks.length === 0) { - q.empty(); - } - workers += 1; - var next = function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - if (q.drain && q.tasks.length + workers === 0) { - q.drain(); - } - q.process(); - }; - var cb = only_once(next); - worker(task.data, cb); - } - }, - length: function () { - return q.tasks.length; - }, - running: function () { - return workers; - } - }; - return q; - }; - - async.cargo = function (worker, payload) { - var working = false, - tasks = []; - - var cargo = { - tasks: tasks, - payload: payload, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - if(data.constructor !== Array) { - data = [data]; - } - _each(data, function(task) { - tasks.push({ - data: task, - callback: typeof callback === 'function' ? callback : null - }); - if (cargo.saturated && tasks.length === payload) { - cargo.saturated(); - } - }); - async.setImmediate(cargo.process); - }, - process: function process() { - if (working) return; - if (tasks.length === 0) { - if(cargo.drain) cargo.drain(); - return; - } - - var ts = typeof payload === 'number' - ? tasks.splice(0, payload) - : tasks.splice(0); - - var ds = _map(ts, function (task) { - return task.data; - }); - - if(cargo.empty) cargo.empty(); - working = true; - worker(ds, function () { - working = false; - - var args = arguments; - _each(ts, function (data) { - if (data.callback) { - data.callback.apply(null, args); - } - }); - - process(); - }); - }, - length: function () { - return tasks.length; - }, - running: function () { - return working; - } - }; - return cargo; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _each(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - var queues = {}; - hasher = hasher || function (x) { - return x; - }; - var memoized = function () { - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - var key = hasher.apply(null, args); - if (key in memo) { - callback.apply(null, memo[key]); - } - else if (key in queues) { - queues[key].push(callback); - } - else { - queues[key] = [callback]; - fn.apply(null, args.concat([function () { - memo[key] = arguments; - var q = queues[key]; - delete queues[key]; - for (var i = 0, l = q.length; i < l; i++) { - q[i].apply(null, arguments); - } - }])); - } - }; - memoized.memo = memo; - memoized.unmemoized = fn; - return memoized; - }; - - async.unmemoize = function (fn) { - return function () { - return (fn.unmemoized || fn).apply(null, arguments); - }; - }; - - async.times = function (count, iterator, callback) { - var counter = []; - for (var i = 0; i < count; i++) { - counter.push(i); - } - return async.map(counter, iterator, callback); - }; - - async.timesSeries = function (count, iterator, callback) { - var counter = []; - for (var i = 0; i < count; i++) { - counter.push(i); - } - return async.mapSeries(counter, iterator, callback); - }; - - async.compose = function (/* functions... */) { - var fns = Array.prototype.reverse.call(arguments); - return function () { - var that = this; - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - async.reduce(fns, args, function (newargs, fn, cb) { - fn.apply(that, newargs.concat([function () { - var err = arguments[0]; - var nextargs = Array.prototype.slice.call(arguments, 1); - cb(err, nextargs); - }])) - }, - function (err, results) { - callback.apply(that, [err].concat(results)); - }); - }; - }; - - var _applyEach = function (eachfn, fns /*args...*/) { - var go = function () { - var that = this; - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - return eachfn(fns, function (fn, cb) { - fn.apply(that, args.concat([cb])); - }, - callback); - }; - if (arguments.length > 2) { - var args = Array.prototype.slice.call(arguments, 2); - return go.apply(this, args); - } - else { - return go; - } - }; - async.applyEach = doParallel(_applyEach); - async.applyEachSeries = doSeries(_applyEach); - - async.forever = function (fn, callback) { - function next(err) { - if (err) { - if (callback) { - return callback(err); - } - throw err; - } - fn(next); - } - next(); - }; - - // AMD / RequireJS - if (typeof define !== 'undefined' && define.amd) { - define([], function () { - return async; - }); - } - // Node.js - else if (typeof module !== 'undefined' && module.exports) { - module.exports = async; - } - // included directly via -``` - -Note that the [es5-shim](https://github.com/es-shims/es5-shim) must be loaded before this library to support browsers pre IE9. - -```html - -``` - -## Usage - -The example below shows how you can load the promise library (in a way that works on both client and server). It then demonstrates creating a promise from scratch. You simply call `new Promise(fn)`. There is a complete specification for what is returned by this method in [Promises/A+](http://promises-aplus.github.com/promises-spec/). - -```javascript -var Promise = require('promise'); - -var promise = new Promise(function (resolve, reject) { - get('http://www.google.com', function (err, res) { - if (err) reject(err); - else resolve(res); - }); -}); -``` - -## API - -Before all examples, you will need: - -```js -var Promise = require('promise'); -``` - -### new Promise(resolver) - -This creates and returns a new promise. `resolver` must be a function. The `resolver` function is passed two arguments: - - 1. `resolve` should be called with a single argument. If it is called with a non-promise value then the promise is fulfilled with that value. If it is called with a promise (A) then the returned promise takes on the state of that new promise (A). - 2. `reject` should be called with a single argument. The returned promise will be rejected with that argument. - -### Static Functions - - These methods are invoked by calling `Promise.methodName`. - -#### Promise.resolve(value) - -(deprecated aliases: `Promise.from(value)`, `Promise.cast(value)`) - -Converts values and foreign promises into Promises/A+ promises. If you pass it a value then it returns a Promise for that value. If you pass it something that is close to a promise (such as a jQuery attempt at a promise) it returns a Promise that takes on the state of `value` (rejected or fulfilled). - -#### Promise.all(array) - -Returns a promise for an array. If it is called with a single argument that `Array.isArray` then this returns a promise for a copy of that array with any promises replaced by their fulfilled values. Otherwise it returns a promise for an array that conatins its arguments, except with promises replaced by their resolution values. e.g. - -```js -Promise.all([Promise.resolve('a'), 'b', Promise.resolve('c')]) - .then(function (res) { - assert(res[0] === 'a') - assert(res[1] === 'b') - assert(res[2] === 'c') - }) - -Promise.all(Promise.resolve('a'), 'b', Promise.resolve('c')) - .then(function (res) { - assert(res[0] === 'a') - assert(res[1] === 'b') - assert(res[2] === 'c') - }) -``` - -#### Promise.denodeify(fn) - -_Non Standard_ - -Takes a function which accepts a node style callback and returns a new function that returns a promise instead. - -e.g. - -```javascript -var fs = require('fs') - -var read = Promise.denodeify(fs.readFile) -var write = Promise.denodeify(fs.writeFile) - -var p = read('foo.json', 'utf8') - .then(function (str) { - return write('foo.json', JSON.stringify(JSON.parse(str), null, ' '), 'utf8') - }) -``` - -#### Promise.nodeify(fn) - -_Non Standard_ - -The twin to `denodeify` is useful when you want to export an API that can be used by people who haven't learnt about the brilliance of promises yet. - -```javascript -module.exports = Promise.nodeify(awesomeAPI) -function awesomeAPI(a, b) { - return download(a, b) -} -``` - -If the last argument passed to `module.exports` is a function, then it will be treated like a node.js callback and not parsed on to the child function, otherwise the API will just return a promise. - -### Prototype Methods - -These methods are invoked on a promise instance by calling `myPromise.methodName` - -### Promise#then(onFulfilled, onRejected) - -This method follows the [Promises/A+ spec](http://promises-aplus.github.io/promises-spec/). It explains things very clearly so I recommend you read it. - -Either `onFulfilled` or `onRejected` will be called and they will not be called more than once. They will be passed a single argument and will always be called asynchronously (in the next turn of the event loop). - -If the promise is fulfilled then `onFulfilled` is called. If the promise is rejected then `onRejected` is called. - -The call to `.then` also returns a promise. If the handler that is called returns a promise, the promise returned by `.then` takes on the state of that returned promise. If the handler that is called returns a value that is not a promise, the promise returned by `.then` will be fulfilled with that value. If the handler that is called throws an exception then the promise returned by `.then` is rejected with that exception. - -#### Promise#catch(onRejected) - -Sugar for `Promise#then(null, onRejected)`, to mirror `catch` in synchronous code. - -#### Promise#done(onFulfilled, onRejected) - -_Non Standard_ - -The same semantics as `.then` except that it does not return a promise and any exceptions are re-thrown so that they can be logged (crashing the application in non-browser environments) - -#### Promise#nodeify(callback) - -_Non Standard_ - -If `callback` is `null` or `undefined` it just returns `this`. If `callback` is a function it is called with rejection reason as the first argument and result as the second argument (as per the node.js convention). - -This lets you write API functions that look like: - -```javascript -function awesomeAPI(foo, bar, callback) { - return internalAPI(foo, bar) - .then(parseResult) - .then(null, retryErrors) - .nodeify(callback) -} -``` - -People who use typical node.js style callbacks will be able to just pass a callback and get the expected behavior. The enlightened people can not pass a callback and will get awesome promises. - -## Extending Promises - - There are three options for extending the promises created by this library. - -### Inheritance - - You can use inheritance if you want to create your own complete promise library with this as your basic starting point, perfect if you have lots of cool features you want to add. Here is an example of a promise library called `Awesome`, which is built on top of `Promise` correctly. - -```javascript -var Promise = require('promise'); -function Awesome(fn) { - if (!(this instanceof Awesome)) return new Awesome(fn); - Promise.call(this, fn); -} -Awesome.prototype = Object.create(Promise.prototype); -Awesome.prototype.constructor = Awesome; - -//Awesome extension -Awesome.prototype.spread = function (cb) { - return this.then(function (arr) { - return cb.apply(this, arr); - }) -}; -``` - - N.B. if you fail to set the prototype and constructor properly or fail to do Promise.call, things can fail in really subtle ways. - -### Wrap - - This is the nuclear option, for when you want to start from scratch. It ensures you won't be impacted by anyone who is extending the prototype (see below). - -```javascript -function Uber(fn) { - if (!(this instanceof Uber)) return new Uber(fn); - var _prom = new Promise(fn); - this.then = _prom.then; -} - -Uber.prototype.spread = function (cb) { - return this.then(function (arr) { - return cb.apply(this, arr); - }) -}; -``` - -### Extending the Prototype - - In general, you should never extend the prototype of this promise implimenation because your extensions could easily conflict with someone elses extensions. However, this organisation will host a library of extensions which do not conflict with each other, so you can safely enable any of those. If you think of an extension that we don't provide and you want to write it, submit an issue on this repository and (if I agree) I'll set you up with a repository and give you permission to commit to it. - -## License - - MIT diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/core.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/core.js deleted file mode 100644 index 5f332a2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/core.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -module.exports = require('./lib/core.js'); - -console.error('require("promise/core") is deprecated, use require("promise/lib/core") instead.'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/index.js deleted file mode 100644 index 17d5ed1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -module.exports = require('./lib/core.js') -require('./lib/done.js') -require('./lib/es6-extensions.js') -require('./lib/node-extensions.js') \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/core.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/core.js deleted file mode 100644 index 05a4313..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/core.js +++ /dev/null @@ -1,105 +0,0 @@ -'use strict'; - -var asap = require('asap') - -module.exports = Promise; -function Promise(fn) { - if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new') - if (typeof fn !== 'function') throw new TypeError('not a function') - var state = null - var value = null - var deferreds = [] - var self = this - - this.then = function(onFulfilled, onRejected) { - return new self.constructor(function(resolve, reject) { - handle(new Handler(onFulfilled, onRejected, resolve, reject)) - }) - } - - function handle(deferred) { - if (state === null) { - deferreds.push(deferred) - return - } - asap(function() { - var cb = state ? deferred.onFulfilled : deferred.onRejected - if (cb === null) { - (state ? deferred.resolve : deferred.reject)(value) - return - } - var ret - try { - ret = cb(value) - } - catch (e) { - deferred.reject(e) - return - } - deferred.resolve(ret) - }) - } - - function resolve(newValue) { - try { //Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure - if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.') - if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { - var then = newValue.then - if (typeof then === 'function') { - doResolve(then.bind(newValue), resolve, reject) - return - } - } - state = true - value = newValue - finale() - } catch (e) { reject(e) } - } - - function reject(newValue) { - state = false - value = newValue - finale() - } - - function finale() { - for (var i = 0, len = deferreds.length; i < len; i++) - handle(deferreds[i]) - deferreds = null - } - - doResolve(fn, resolve, reject) -} - - -function Handler(onFulfilled, onRejected, resolve, reject){ - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null - this.onRejected = typeof onRejected === 'function' ? onRejected : null - this.resolve = resolve - this.reject = reject -} - -/** - * Take a potentially misbehaving resolver function and make sure - * onFulfilled and onRejected are only called once. - * - * Makes no guarantees about asynchrony. - */ -function doResolve(fn, onFulfilled, onRejected) { - var done = false; - try { - fn(function (value) { - if (done) return - done = true - onFulfilled(value) - }, function (reason) { - if (done) return - done = true - onRejected(reason) - }) - } catch (ex) { - if (done) return - done = true - onRejected(ex) - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/done.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/done.js deleted file mode 100644 index 2da6208..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/done.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -var Promise = require('./core.js') -var asap = require('asap') - -module.exports = Promise -Promise.prototype.done = function (onFulfilled, onRejected) { - var self = arguments.length ? this.then.apply(this, arguments) : this - self.then(null, function (err) { - asap(function () { - throw err - }) - }) -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/es6-extensions.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/es6-extensions.js deleted file mode 100644 index 084c1cd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/es6-extensions.js +++ /dev/null @@ -1,108 +0,0 @@ -'use strict'; - -//This file contains the ES6 extensions to the core Promises/A+ API - -var Promise = require('./core.js') -var asap = require('asap') - -module.exports = Promise - -/* Static Functions */ - -function ValuePromise(value) { - this.then = function (onFulfilled) { - if (typeof onFulfilled !== 'function') return this - return new Promise(function (resolve, reject) { - asap(function () { - try { - resolve(onFulfilled(value)) - } catch (ex) { - reject(ex); - } - }) - }) - } -} -ValuePromise.prototype = Promise.prototype - -var TRUE = new ValuePromise(true) -var FALSE = new ValuePromise(false) -var NULL = new ValuePromise(null) -var UNDEFINED = new ValuePromise(undefined) -var ZERO = new ValuePromise(0) -var EMPTYSTRING = new ValuePromise('') - -Promise.resolve = function (value) { - if (value instanceof Promise) return value - - if (value === null) return NULL - if (value === undefined) return UNDEFINED - if (value === true) return TRUE - if (value === false) return FALSE - if (value === 0) return ZERO - if (value === '') return EMPTYSTRING - - if (typeof value === 'object' || typeof value === 'function') { - try { - var then = value.then - if (typeof then === 'function') { - return new Promise(then.bind(value)) - } - } catch (ex) { - return new Promise(function (resolve, reject) { - reject(ex) - }) - } - } - - return new ValuePromise(value) -} - -Promise.all = function (arr) { - var args = Array.prototype.slice.call(arr) - - return new Promise(function (resolve, reject) { - if (args.length === 0) return resolve([]) - var remaining = args.length - function res(i, val) { - try { - if (val && (typeof val === 'object' || typeof val === 'function')) { - var then = val.then - if (typeof then === 'function') { - then.call(val, function (val) { res(i, val) }, reject) - return - } - } - args[i] = val - if (--remaining === 0) { - resolve(args); - } - } catch (ex) { - reject(ex) - } - } - for (var i = 0; i < args.length; i++) { - res(i, args[i]) - } - }) -} - -Promise.reject = function (value) { - return new Promise(function (resolve, reject) { - reject(value); - }); -} - -Promise.race = function (values) { - return new Promise(function (resolve, reject) { - values.forEach(function(value){ - Promise.resolve(value).then(resolve, reject); - }) - }); -} - -/* Prototype Methods */ - -Promise.prototype['catch'] = function (onRejected) { - return this.then(null, onRejected); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/node-extensions.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/node-extensions.js deleted file mode 100644 index 5e60f9e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/lib/node-extensions.js +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - -//This file contains then/promise specific extensions that are only useful for node.js interop - -var Promise = require('./core.js') -var asap = require('asap') - -module.exports = Promise - -/* Static Functions */ - -Promise.denodeify = function (fn, argumentCount) { - argumentCount = argumentCount || Infinity - return function () { - var self = this - var args = Array.prototype.slice.call(arguments) - return new Promise(function (resolve, reject) { - while (args.length && args.length > argumentCount) { - args.pop() - } - args.push(function (err, res) { - if (err) reject(err) - else resolve(res) - }) - var res = fn.apply(self, args) - if (res && (typeof res === 'object' || typeof res === 'function') && typeof res.then === 'function') { - resolve(res) - } - }) - } -} -Promise.nodeify = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments) - var callback = typeof args[args.length - 1] === 'function' ? args.pop() : null - var ctx = this - try { - return fn.apply(this, arguments).nodeify(callback, ctx) - } catch (ex) { - if (callback === null || typeof callback == 'undefined') { - return new Promise(function (resolve, reject) { reject(ex) }) - } else { - asap(function () { - callback.call(ctx, ex) - }) - } - } - } -} - -Promise.prototype.nodeify = function (callback, ctx) { - if (typeof callback != 'function') return this - - this.then(function (value) { - asap(function () { - callback.call(ctx, null, value) - }) - }, function (err) { - asap(function () { - callback.call(ctx, err) - }) - }) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/LICENSE.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/LICENSE.md deleted file mode 100644 index 5d98ad8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ - -Copyright 2009–2013 Contributors. 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. - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/README.md deleted file mode 100644 index 9a42759..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/README.md +++ /dev/null @@ -1,81 +0,0 @@ - -# ASAP - -This `asap` CommonJS package contains a single `asap` module that -exports a single `asap` function that executes a function **as soon as -possible**. - -```javascript -asap(function () { - // ... -}); -``` - -More formally, ASAP provides a fast event queue that will execute tasks -until it is empty before yielding to the JavaScript engine's underlying -event-loop. When the event queue becomes non-empty, ASAP schedules a -flush event, preferring for that event to occur before the JavaScript -engine has an opportunity to perform IO tasks or rendering, thus making -the first task and subsequent tasks semantically indistinguishable. -ASAP uses a variety of techniques to preserve this invariant on -different versions of browsers and NodeJS. - -By design, ASAP can starve the event loop on the theory that, if there -is enough work to be done synchronously, albeit in separate events, long -enough to starve input or output, it is a strong indicator that the -program needs to push back on scheduling more work. - -Take care. ASAP can sustain infinite recursive calls indefinitely -without warning. This is behaviorally equivalent to an infinite loop. -It will not halt from a stack overflow, but it *will* chew through -memory (which is an oddity I cannot explain at this time). Just as with -infinite loops, you can monitor a Node process for this behavior with a -heart-beat signal. As with infinite loops, a very small amount of -caution goes a long way to avoiding problems. - -```javascript -function loop() { - asap(loop); -} -loop(); -``` - -ASAP is distinct from `setImmediate` in that it does not suffer the -overhead of returning a handle and being possible to cancel. For a -`setImmediate` shim, consider [setImmediate][]. - -[setImmediate]: https://github.com/noblejs/setimmediate - -If a task throws an exception, it will not interrupt the flushing of -high-priority tasks. The exception will be postponed to a later, -low-priority event to avoid slow-downs, when the underlying JavaScript -engine will treat it as it does any unhandled exception. - -## Heritage - -ASAP has been factored out of the [Q][] asynchronous promise library. -It originally had a naïve implementation in terms of `setTimeout`, but -[Malte Ubl][NonBlocking] provided an insight that `postMessage` might be -useful for creating a high-priority, no-delay event dispatch hack. -Since then, Internet Explorer proposed and implemented `setImmediate`. -Robert Kratić began contributing to Q by measuring the performance of -the internal implementation of `asap`, paying particular attention to -error recovery. Domenic, Robert, and I collectively settled on the -current strategy of unrolling the high-priority event queue internally -regardless of what strategy we used to dispatch the potentially -lower-priority flush event. Domenic went on to make ASAP cooperate with -NodeJS domains. - -[Q]: https://github.com/kriskowal/q -[NonBlocking]: http://www.nonblocking.io/2011/06/windownexttick.html - -For further reading, Nicholas Zakas provided a thorough article on [The -Case for setImmediate][NCZ]. - -[NCZ]: http://www.nczonline.net/blog/2013/07/09/the-case-for-setimmediate/ - -## License - -Copyright 2009-2013 by Contributors -MIT License (enclosed) - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/asap.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/asap.js deleted file mode 100644 index 2f85516..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/asap.js +++ /dev/null @@ -1,113 +0,0 @@ - -// Use the fastest possible means to execute a task in a future turn -// of the event loop. - -// linked list of tasks (single, with head node) -var head = {task: void 0, next: null}; -var tail = head; -var flushing = false; -var requestFlush = void 0; -var isNodeJS = false; - -function flush() { - /* jshint loopfunc: true */ - - while (head.next) { - head = head.next; - var task = head.task; - head.task = void 0; - var domain = head.domain; - - if (domain) { - head.domain = void 0; - domain.enter(); - } - - try { - task(); - - } catch (e) { - if (isNodeJS) { - // In node, uncaught exceptions are considered fatal errors. - // Re-throw them synchronously to interrupt flushing! - - // Ensure continuation if the uncaught exception is suppressed - // listening "uncaughtException" events (as domains does). - // Continue in next event to avoid tick recursion. - if (domain) { - domain.exit(); - } - setTimeout(flush, 0); - if (domain) { - domain.enter(); - } - - throw e; - - } else { - // In browsers, uncaught exceptions are not fatal. - // Re-throw them asynchronously to avoid slow-downs. - setTimeout(function() { - throw e; - }, 0); - } - } - - if (domain) { - domain.exit(); - } - } - - flushing = false; -} - -if (typeof process !== "undefined" && process.nextTick) { - // Node.js before 0.9. Note that some fake-Node environments, like the - // Mocha test runner, introduce a `process` global without a `nextTick`. - isNodeJS = true; - - requestFlush = function () { - process.nextTick(flush); - }; - -} else if (typeof setImmediate === "function") { - // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate - if (typeof window !== "undefined") { - requestFlush = setImmediate.bind(window, flush); - } else { - requestFlush = function () { - setImmediate(flush); - }; - } - -} else if (typeof MessageChannel !== "undefined") { - // modern browsers - // http://www.nonblocking.io/2011/06/windownexttick.html - var channel = new MessageChannel(); - channel.port1.onmessage = flush; - requestFlush = function () { - channel.port2.postMessage(0); - }; - -} else { - // old browsers - requestFlush = function () { - setTimeout(flush, 0); - }; -} - -function asap(task) { - tail = tail.next = { - task: task, - domain: isNodeJS && process.domain, - next: null - }; - - if (!flushing) { - flushing = true; - requestFlush(); - } -}; - -module.exports = asap; - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/package.json deleted file mode 100644 index 9e55036..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/node_modules/asap/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "asap", - "version": "1.0.0", - "description": "High-priority task queue for Node.js and browsers", - "keywords": [ - "event", - "task", - "queue" - ], - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/kriskowal/asap/raw/master/LICENSE.md" - } - ], - "main": "asap", - "_id": "asap@1.0.0", - "dist": { - "shasum": "b2a45da5fdfa20b0496fc3768cc27c12fa916a7d", - "tarball": "http://registry.npmjs.org/asap/-/asap-1.0.0.tgz" - }, - "_from": "asap@>=1.0.0 <1.1.0", - "_npmVersion": "1.2.15", - "_npmUser": { - "name": "kriskowal", - "email": "kris.kowal@cixar.com" - }, - "maintainers": [ - { - "name": "kriskowal", - "email": "kris.kowal@cixar.com" - } - ], - "directories": {}, - "_shasum": "b2a45da5fdfa20b0496fc3768cc27c12fa916a7d", - "_resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/package.json deleted file mode 100644 index 0cdfea5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "promise", - "version": "6.1.0", - "description": "Bare bones Promises/A+ implementation", - "main": "index.js", - "scripts": { - "test": "mocha --timeout 200 --slow 99999", - "test-resolve": "mocha test/resolver-tests.js -R spec --timeout 200 --slow 999999", - "test-extensions": "mocha test/extensions-tests.js -R spec --timeout 200 --slow 999999" - }, - "repository": { - "type": "git", - "url": "https://github.com/then/promise.git" - }, - "author": { - "name": "ForbesLindesay" - }, - "license": "MIT", - "devDependencies": { - "promises-aplus-tests": "*", - "better-assert": "*", - "mocha": "*" - }, - "dependencies": { - "asap": "~1.0.0" - }, - "gitHead": "c627c0cc1f886ed3aa26edec97838ec9e7dd858b", - "bugs": { - "url": "https://github.com/then/promise/issues" - }, - "homepage": "https://github.com/then/promise", - "_id": "promise@6.1.0", - "_shasum": "2ce729f6b94b45c26891ad0602c5c90e04c6eef6", - "_from": "promise@>=6.0.0 <7.0.0", - "_npmVersion": "1.5.0-alpha-4", - "_npmUser": { - "name": "forbeslindesay", - "email": "forbes@lindesay.co.uk" - }, - "maintainers": [ - { - "name": "forbeslindesay", - "email": "forbes@lindesay.co.uk" - }, - { - "name": "nathan7", - "email": "nathan@nathan7.eu" - } - ], - "dist": { - "shasum": "2ce729f6b94b45c26891ad0602c5c90e04c6eef6", - "tarball": "http://registry.npmjs.org/promise/-/promise-6.1.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/polyfill-done.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/polyfill-done.js deleted file mode 100644 index e50b4c0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/polyfill-done.js +++ /dev/null @@ -1,12 +0,0 @@ -// should work in any browser without browserify - -if (typeof Promise.prototype.done !== 'function') { - Promise.prototype.done = function (onFulfilled, onRejected) { - var self = arguments.length ? this.then.apply(this, arguments) : this - self.then(null, function (err) { - setTimeout(function () { - throw err - }, 0) - }) - } -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/polyfill.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/polyfill.js deleted file mode 100644 index db099f8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/node_modules/promise/polyfill.js +++ /dev/null @@ -1,10 +0,0 @@ -// not "use strict" so we can declare global "Promise" - -var asap = require('asap'); - -if (typeof Promise === 'undefined') { - Promise = require('./lib/core.js') - require('./lib/es6-extensions.js') -} - -require('./polyfill-done.js'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/package.json deleted file mode 100644 index a634bcb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express-handlebars/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "express-handlebars", - "description": "A Handlebars view engine for Express which doesn't suck.", - "version": "2.0.1", - "homepage": "https://github.com/ericf/express-handlebars", - "keywords": [ - "express", - "express3", - "handlebars", - "view", - "layout", - "partials", - "templates" - ], - "author": { - "name": "Eric Ferraiuolo", - "email": "eferraiuolo@gmail.com", - "url": "http://ericf.me/" - }, - "repository": { - "type": "git", - "url": "git://github.com/ericf/express-handlebars.git" - }, - "bugs": { - "url": "https://github.com/ericf/express-handlebars/issues" - }, - "engines": { - "node": ">=0.10" - }, - "dependencies": { - "glob": "^5.0.0", - "graceful-fs": "^3.0.2", - "handlebars": "^3.0.0", - "object.assign": "^1.1.1", - "promise": "^6.0.0" - }, - "main": "index.js", - "directories": { - "example": "examples" - }, - "devDependencies": {}, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "license": "BSD-3-Clause", - "gitHead": "bdb5c32cffb58b806770918870f5d9e156e6d0dc", - "_id": "express-handlebars@2.0.1", - "_shasum": "975661ffebd6e79463230ba4c8e0ca5cd0522fb1", - "_from": "express-handlebars@*", - "_npmVersion": "2.7.4", - "_nodeVersion": "0.12.2", - "_npmUser": { - "name": "ericf", - "email": "eferraiuolo@gmail.com" - }, - "dist": { - "shasum": "975661ffebd6e79463230ba4c8e0ca5cd0522fb1", - "tarball": "http://registry.npmjs.org/express-handlebars/-/express-handlebars-2.0.1.tgz" - }, - "maintainers": [ - { - "name": "ericf", - "email": "eferraiuolo@gmail.com" - } - ], - "_resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-2.0.1.tgz" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/History.md deleted file mode 100644 index be89c8e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/History.md +++ /dev/null @@ -1,3025 +0,0 @@ -4.13.3 / 2015-08-02 -=================== - - * Fix infinite loop condition using `mergeParams: true` - * Fix inner numeric indices incorrectly altering parent `req.params` - -4.13.2 / 2015-07-31 -=================== - - * deps: accepts@~1.2.12 - - deps: mime-types@~2.1.4 - * deps: array-flatten@1.1.1 - - perf: enable strict mode - * deps: path-to-regexp@0.1.7 - - Fix regression with escaped round brackets and matching groups - * deps: type-is@~1.6.6 - - deps: mime-types@~2.1.4 - -4.13.1 / 2015-07-05 -=================== - - * deps: accepts@~1.2.10 - - deps: mime-types@~2.1.2 - * deps: qs@4.0.0 - - Fix dropping parameters like `hasOwnProperty` - - Fix various parsing edge cases - * deps: type-is@~1.6.4 - - deps: mime-types@~2.1.2 - - perf: enable strict mode - - perf: remove argument reassignment - -4.13.0 / 2015-06-20 -=================== - - * Add settings to debug output - * Fix `res.format` error when only `default` provided - * Fix issue where `next('route')` in `app.param` would incorrectly skip values - * Fix hiding platform issues with `decodeURIComponent` - - Only `URIError`s are a 400 - * Fix using `*` before params in routes - * Fix using capture groups before params in routes - * Simplify `res.cookie` to call `res.append` - * Use `array-flatten` module for flattening arrays - * deps: accepts@~1.2.9 - - deps: mime-types@~2.1.1 - - perf: avoid argument reassignment & argument slice - - perf: avoid negotiator recursive construction - - perf: enable strict mode - - perf: remove unnecessary bitwise operator - * deps: cookie@0.1.3 - - perf: deduce the scope of try-catch deopt - - perf: remove argument reassignments - * deps: escape-html@1.0.2 - * deps: etag@~1.7.0 - - Always include entity length in ETags for hash length extensions - - Generate non-Stats ETags using MD5 only (no longer CRC32) - - Improve stat performance by removing hashing - - Improve support for JXcore - - Remove base64 padding in ETags to shorten - - Support "fake" stats objects in environments without fs - - Use MD5 instead of MD4 in weak ETags over 1KB - * deps: finalhandler@0.4.0 - - Fix a false-positive when unpiping in Node.js 0.8 - - Support `statusCode` property on `Error` objects - - Use `unpipe` module for unpiping requests - - deps: escape-html@1.0.2 - - deps: on-finished@~2.3.0 - - perf: enable strict mode - - perf: remove argument reassignment - * deps: fresh@0.3.0 - - Add weak `ETag` matching support - * deps: on-finished@~2.3.0 - - Add defined behavior for HTTP `CONNECT` requests - - Add defined behavior for HTTP `Upgrade` requests - - deps: ee-first@1.1.1 - * deps: path-to-regexp@0.1.6 - * deps: send@0.13.0 - - Allow Node.js HTTP server to set `Date` response header - - Fix incorrectly removing `Content-Location` on 304 response - - Improve the default redirect response headers - - Send appropriate headers on default error response - - Use `http-errors` for standard emitted errors - - Use `statuses` instead of `http` module for status messages - - deps: escape-html@1.0.2 - - deps: etag@~1.7.0 - - deps: fresh@0.3.0 - - deps: on-finished@~2.3.0 - - perf: enable strict mode - - perf: remove unnecessary array allocations - * deps: serve-static@~1.10.0 - - Add `fallthrough` option - - Fix reading options from options prototype - - Improve the default redirect response headers - - Malformed URLs now `next()` instead of 400 - - deps: escape-html@1.0.2 - - deps: send@0.13.0 - - perf: enable strict mode - - perf: remove argument reassignment - * deps: type-is@~1.6.3 - - deps: mime-types@~2.1.1 - - perf: reduce try block size - - perf: remove bitwise operations - * perf: enable strict mode - * perf: isolate `app.render` try block - * perf: remove argument reassignments in application - * perf: remove argument reassignments in request prototype - * perf: remove argument reassignments in response prototype - * perf: remove argument reassignments in routing - * perf: remove argument reassignments in `View` - * perf: skip attempting to decode zero length string - * perf: use saved reference to `http.STATUS_CODES` - -4.12.4 / 2015-05-17 -=================== - - * deps: accepts@~1.2.7 - - deps: mime-types@~2.0.11 - - deps: negotiator@0.5.3 - * deps: debug@~2.2.0 - - deps: ms@0.7.1 - * deps: depd@~1.0.1 - * deps: etag@~1.6.0 - - Improve support for JXcore - - Support "fake" stats objects in environments without `fs` - * deps: finalhandler@0.3.6 - - deps: debug@~2.2.0 - - deps: on-finished@~2.2.1 - * deps: on-finished@~2.2.1 - - Fix `isFinished(req)` when data buffered - * deps: proxy-addr@~1.0.8 - - deps: ipaddr.js@1.0.1 - * deps: qs@2.4.2 - - Fix allowing parameters like `constructor` - * deps: send@0.12.3 - - deps: debug@~2.2.0 - - deps: depd@~1.0.1 - - deps: etag@~1.6.0 - - deps: ms@0.7.1 - - deps: on-finished@~2.2.1 - * deps: serve-static@~1.9.3 - - deps: send@0.12.3 - * deps: type-is@~1.6.2 - - deps: mime-types@~2.0.11 - -4.12.3 / 2015-03-17 -=================== - - * deps: accepts@~1.2.5 - - deps: mime-types@~2.0.10 - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - * deps: finalhandler@0.3.4 - - deps: debug@~2.1.3 - * deps: proxy-addr@~1.0.7 - - deps: ipaddr.js@0.1.9 - * deps: qs@2.4.1 - - Fix error when parameter `hasOwnProperty` is present - * deps: send@0.12.2 - - Throw errors early for invalid `extensions` or `index` options - - deps: debug@~2.1.3 - * deps: serve-static@~1.9.2 - - deps: send@0.12.2 - * deps: type-is@~1.6.1 - - deps: mime-types@~2.0.10 - -4.12.2 / 2015-03-02 -=================== - - * Fix regression where `"Request aborted"` is logged using `res.sendFile` - -4.12.1 / 2015-03-01 -=================== - - * Fix constructing application with non-configurable prototype properties - * Fix `ECONNRESET` errors from `res.sendFile` usage - * Fix `req.host` when using "trust proxy" hops count - * Fix `req.protocol`/`req.secure` when using "trust proxy" hops count - * Fix wrong `code` on aborted connections from `res.sendFile` - * deps: merge-descriptors@1.0.0 - -4.12.0 / 2015-02-23 -=================== - - * Fix `"trust proxy"` setting to inherit when app is mounted - * Generate `ETag`s for all request responses - - No longer restricted to only responses for `GET` and `HEAD` requests - * Use `content-type` to parse `Content-Type` headers - * deps: accepts@~1.2.4 - - Fix preference sorting to be stable for long acceptable lists - - deps: mime-types@~2.0.9 - - deps: negotiator@0.5.1 - * deps: cookie-signature@1.0.6 - * deps: send@0.12.1 - - Always read the stat size from the file - - Fix mutating passed-in `options` - - deps: mime@1.3.4 - * deps: serve-static@~1.9.1 - - deps: send@0.12.1 - * deps: type-is@~1.6.0 - - fix argument reassignment - - fix false-positives in `hasBody` `Transfer-Encoding` check - - support wildcard for both type and subtype (`*/*`) - - deps: mime-types@~2.0.9 - -4.11.2 / 2015-02-01 -=================== - - * Fix `res.redirect` double-calling `res.end` for `HEAD` requests - * deps: accepts@~1.2.3 - - deps: mime-types@~2.0.8 - * deps: proxy-addr@~1.0.6 - - deps: ipaddr.js@0.1.8 - * deps: type-is@~1.5.6 - - deps: mime-types@~2.0.8 - -4.11.1 / 2015-01-20 -=================== - - * deps: send@0.11.1 - - Fix root path disclosure - * deps: serve-static@~1.8.1 - - Fix redirect loop in Node.js 0.11.14 - - Fix root path disclosure - - deps: send@0.11.1 - -4.11.0 / 2015-01-13 -=================== - - * Add `res.append(field, val)` to append headers - * Deprecate leading `:` in `name` for `app.param(name, fn)` - * Deprecate `req.param()` -- use `req.params`, `req.body`, or `req.query` instead - * Deprecate `app.param(fn)` - * Fix `OPTIONS` responses to include the `HEAD` method properly - * Fix `res.sendFile` not always detecting aborted connection - * Match routes iteratively to prevent stack overflows - * deps: accepts@~1.2.2 - - deps: mime-types@~2.0.7 - - deps: negotiator@0.5.0 - * deps: send@0.11.0 - - deps: debug@~2.1.1 - - deps: etag@~1.5.1 - - deps: ms@0.7.0 - - deps: on-finished@~2.2.0 - * deps: serve-static@~1.8.0 - - deps: send@0.11.0 - -4.10.8 / 2015-01-13 -=================== - - * Fix crash from error within `OPTIONS` response handler - * deps: proxy-addr@~1.0.5 - - deps: ipaddr.js@0.1.6 - -4.10.7 / 2015-01-04 -=================== - - * Fix `Allow` header for `OPTIONS` to not contain duplicate methods - * Fix incorrect "Request aborted" for `res.sendFile` when `HEAD` or 304 - * deps: debug@~2.1.1 - * deps: finalhandler@0.3.3 - - deps: debug@~2.1.1 - - deps: on-finished@~2.2.0 - * deps: methods@~1.1.1 - * deps: on-finished@~2.2.0 - * deps: serve-static@~1.7.2 - - Fix potential open redirect when mounted at root - * deps: type-is@~1.5.5 - - deps: mime-types@~2.0.7 - -4.10.6 / 2014-12-12 -=================== - - * Fix exception in `req.fresh`/`req.stale` without response headers - -4.10.5 / 2014-12-10 -=================== - - * Fix `res.send` double-calling `res.end` for `HEAD` requests - * deps: accepts@~1.1.4 - - deps: mime-types@~2.0.4 - * deps: type-is@~1.5.4 - - deps: mime-types@~2.0.4 - -4.10.4 / 2014-11-24 -=================== - - * Fix `res.sendfile` logging standard write errors - -4.10.3 / 2014-11-23 -=================== - - * Fix `res.sendFile` logging standard write errors - * deps: etag@~1.5.1 - * deps: proxy-addr@~1.0.4 - - deps: ipaddr.js@0.1.5 - * deps: qs@2.3.3 - - Fix `arrayLimit` behavior - -4.10.2 / 2014-11-09 -=================== - - * Correctly invoke async router callback asynchronously - * deps: accepts@~1.1.3 - - deps: mime-types@~2.0.3 - * deps: type-is@~1.5.3 - - deps: mime-types@~2.0.3 - -4.10.1 / 2014-10-28 -=================== - - * Fix handling of URLs containing `://` in the path - * deps: qs@2.3.2 - - Fix parsing of mixed objects and values - -4.10.0 / 2014-10-23 -=================== - - * Add support for `app.set('views', array)` - - Views are looked up in sequence in array of directories - * Fix `res.send(status)` to mention `res.sendStatus(status)` - * Fix handling of invalid empty URLs - * Use `content-disposition` module for `res.attachment`/`res.download` - - Sends standards-compliant `Content-Disposition` header - - Full Unicode support - * Use `path.resolve` in view lookup - * deps: debug@~2.1.0 - - Implement `DEBUG_FD` env variable support - * deps: depd@~1.0.0 - * deps: etag@~1.5.0 - - Improve string performance - - Slightly improve speed for weak ETags over 1KB - * deps: finalhandler@0.3.2 - - Terminate in progress response only on error - - Use `on-finished` to determine request status - - deps: debug@~2.1.0 - - deps: on-finished@~2.1.1 - * deps: on-finished@~2.1.1 - - Fix handling of pipelined requests - * deps: qs@2.3.0 - - Fix parsing of mixed implicit and explicit arrays - * deps: send@0.10.1 - - deps: debug@~2.1.0 - - deps: depd@~1.0.0 - - deps: etag@~1.5.0 - - deps: on-finished@~2.1.1 - * deps: serve-static@~1.7.1 - - deps: send@0.10.1 - -4.9.8 / 2014-10-17 -================== - - * Fix `res.redirect` body when redirect status specified - * deps: accepts@~1.1.2 - - Fix error when media type has invalid parameter - - deps: negotiator@0.4.9 - -4.9.7 / 2014-10-10 -================== - - * Fix using same param name in array of paths - -4.9.6 / 2014-10-08 -================== - - * deps: accepts@~1.1.1 - - deps: mime-types@~2.0.2 - - deps: negotiator@0.4.8 - * deps: serve-static@~1.6.4 - - Fix redirect loop when index file serving disabled - * deps: type-is@~1.5.2 - - deps: mime-types@~2.0.2 - -4.9.5 / 2014-09-24 -================== - - * deps: etag@~1.4.0 - * deps: proxy-addr@~1.0.3 - - Use `forwarded` npm module - * deps: send@0.9.3 - - deps: etag@~1.4.0 - * deps: serve-static@~1.6.3 - - deps: send@0.9.3 - -4.9.4 / 2014-09-19 -================== - - * deps: qs@2.2.4 - - Fix issue with object keys starting with numbers truncated - -4.9.3 / 2014-09-18 -================== - - * deps: proxy-addr@~1.0.2 - - Fix a global leak when multiple subnets are trusted - - deps: ipaddr.js@0.1.3 - -4.9.2 / 2014-09-17 -================== - - * Fix regression for empty string `path` in `app.use` - * Fix `router.use` to accept array of middleware without path - * Improve error message for bad `app.use` arguments - -4.9.1 / 2014-09-16 -================== - - * Fix `app.use` to accept array of middleware without path - * deps: depd@0.4.5 - * deps: etag@~1.3.1 - * deps: send@0.9.2 - - deps: depd@0.4.5 - - deps: etag@~1.3.1 - - deps: range-parser@~1.0.2 - * deps: serve-static@~1.6.2 - - deps: send@0.9.2 - -4.9.0 / 2014-09-08 -================== - - * Add `res.sendStatus` - * Invoke callback for sendfile when client aborts - - Applies to `res.sendFile`, `res.sendfile`, and `res.download` - - `err` will be populated with request aborted error - * Support IP address host in `req.subdomains` - * Use `etag` to generate `ETag` headers - * deps: accepts@~1.1.0 - - update `mime-types` - * deps: cookie-signature@1.0.5 - * deps: debug@~2.0.0 - * deps: finalhandler@0.2.0 - - Set `X-Content-Type-Options: nosniff` header - - deps: debug@~2.0.0 - * deps: fresh@0.2.4 - * deps: media-typer@0.3.0 - - Throw error when parameter format invalid on parse - * deps: qs@2.2.3 - - Fix issue where first empty value in array is discarded - * deps: range-parser@~1.0.2 - * deps: send@0.9.1 - - Add `lastModified` option - - Use `etag` to generate `ETag` header - - deps: debug@~2.0.0 - - deps: fresh@0.2.4 - * deps: serve-static@~1.6.1 - - Add `lastModified` option - - deps: send@0.9.1 - * deps: type-is@~1.5.1 - - fix `hasbody` to be true for `content-length: 0` - - deps: media-typer@0.3.0 - - deps: mime-types@~2.0.1 - * deps: vary@~1.0.0 - - Accept valid `Vary` header string as `field` - -4.8.8 / 2014-09-04 -================== - - * deps: send@0.8.5 - - Fix a path traversal issue when using `root` - - Fix malicious path detection for empty string path - * deps: serve-static@~1.5.4 - - deps: send@0.8.5 - -4.8.7 / 2014-08-29 -================== - - * deps: qs@2.2.2 - - Remove unnecessary cloning - -4.8.6 / 2014-08-27 -================== - - * deps: qs@2.2.0 - - Array parsing fix - - Performance improvements - -4.8.5 / 2014-08-18 -================== - - * deps: send@0.8.3 - - deps: destroy@1.0.3 - - deps: on-finished@2.1.0 - * deps: serve-static@~1.5.3 - - deps: send@0.8.3 - -4.8.4 / 2014-08-14 -================== - - * deps: qs@1.2.2 - * deps: send@0.8.2 - - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` - * deps: serve-static@~1.5.2 - - deps: send@0.8.2 - -4.8.3 / 2014-08-10 -================== - - * deps: parseurl@~1.3.0 - * deps: qs@1.2.1 - * deps: serve-static@~1.5.1 - - Fix parsing of weird `req.originalUrl` values - - deps: parseurl@~1.3.0 - - deps: utils-merge@1.0.0 - -4.8.2 / 2014-08-07 -================== - - * deps: qs@1.2.0 - - Fix parsing array of objects - -4.8.1 / 2014-08-06 -================== - - * fix incorrect deprecation warnings on `res.download` - * deps: qs@1.1.0 - - Accept urlencoded square brackets - - Accept empty values in implicit array notation - -4.8.0 / 2014-08-05 -================== - - * add `res.sendFile` - - accepts a file system path instead of a URL - - requires an absolute path or `root` option specified - * deprecate `res.sendfile` -- use `res.sendFile` instead - * support mounted app as any argument to `app.use()` - * deps: qs@1.0.2 - - Complete rewrite - - Limits array length to 20 - - Limits object depth to 5 - - Limits parameters to 1,000 - * deps: send@0.8.1 - - Add `extensions` option - * deps: serve-static@~1.5.0 - - Add `extensions` option - - deps: send@0.8.1 - -4.7.4 / 2014-08-04 -================== - - * fix `res.sendfile` regression for serving directory index files - * deps: send@0.7.4 - - Fix incorrect 403 on Windows and Node.js 0.11 - - Fix serving index files without root dir - * deps: serve-static@~1.4.4 - - deps: send@0.7.4 - -4.7.3 / 2014-08-04 -================== - - * deps: send@0.7.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - * deps: serve-static@~1.4.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - - deps: send@0.7.3 - -4.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - * deps: serve-static@~1.4.2 - -4.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - * deps: serve-static@~1.4.1 - -4.7.0 / 2014-07-25 -================== - - * fix `req.protocol` for proxy-direct connections - * configurable query parser with `app.set('query parser', parser)` - - `app.set('query parser', 'extended')` parse with "qs" module - - `app.set('query parser', 'simple')` parse with "querystring" core module - - `app.set('query parser', false)` disable query string parsing - - `app.set('query parser', true)` enable simple parsing - * deprecate `res.json(status, obj)` -- use `res.status(status).json(obj)` instead - * deprecate `res.jsonp(status, obj)` -- use `res.status(status).jsonp(obj)` instead - * deprecate `res.send(status, body)` -- use `res.status(status).send(body)` instead - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: finalhandler@0.1.0 - - Respond after request fully read - - deps: debug@1.0.4 - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - * deps: serve-static@~1.4.0 - - deps: parseurl@~1.2.0 - - deps: send@0.7.0 - * perf: prevent multiple `Buffer` creation in `res.send` - -4.6.1 / 2014-07-12 -================== - - * fix `subapp.mountpath` regression for `app.use(subapp)` - -4.6.0 / 2014-07-11 -================== - - * accept multiple callbacks to `app.use()` - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * catch errors in multiple `req.param(name, fn)` handlers - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * support non-string `path` in `app.use(path, fn)` - - supports array of paths - - supports `RegExp` - * router: fix optimization on router exit - * router: refactor location of `try` blocks - * router: speed up standard `app.use(fn)` - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: finalhandler@0.0.3 - - deps: debug@1.0.3 - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - * deps: path-to-regexp@0.1.3 - * deps: send@0.6.0 - - deps: debug@1.0.3 - * deps: serve-static@~1.3.2 - - deps: parseurl@~1.1.3 - - deps: send@0.6.0 - * perf: fix arguments reassign deopt in some `res` methods - -4.5.1 / 2014-07-06 -================== - - * fix routing regression when altering `req.method` - -4.5.0 / 2014-07-04 -================== - - * add deprecation message to non-plural `req.accepts*` - * add deprecation message to `res.send(body, status)` - * add deprecation message to `res.vary()` - * add `headers` option to `res.sendfile` - - use to set headers on successful file transfer - * add `mergeParams` option to `Router` - - merges `req.params` from parent routes - * add `req.hostname` -- correct name for what `req.host` returns - * deprecate things with `depd` module - * deprecate `req.host` -- use `req.hostname` instead - * fix behavior when handling request without routes - * fix handling when `route.all` is only route - * invoke `router.param()` only when route matches - * restore `req.params` after invoking router - * use `finalhandler` for final response handling - * use `media-typer` to alter content-type charset - * deps: accepts@~1.0.7 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - * deps: serve-static@~1.3.0 - - Accept string for `maxAge` (converted by `ms`) - - Add `setHeaders` option - - Include HTML link in redirect response - - deps: send@0.5.0 - * deps: type-is@~1.3.2 - -4.4.5 / 2014-06-26 -================== - - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -4.4.4 / 2014-06-20 -================== - - * fix `res.attachment` Unicode filenames in Safari - * fix "trim prefix" debug message in `express:router` - * deps: accepts@~1.0.5 - * deps: buffer-crc32@0.2.3 - -4.4.3 / 2014-06-11 -================== - - * fix persistence of modified `req.params[name]` from `app.param()` - * deps: accepts@1.0.3 - - deps: negotiator@0.4.6 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - * deps: serve-static@1.2.3 - - Do not throw un-catchable error on file open race condition - - deps: send@0.4.3 - -4.4.2 / 2014-06-09 -================== - - * fix catching errors from top-level handlers - * use `vary` module for `res.vary` - * deps: debug@1.0.1 - * deps: proxy-addr@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - * deps: serve-static@1.2.2 - - fix "event emitter leak" warnings - - deps: send@0.4.2 - * deps: type-is@1.2.1 - -4.4.1 / 2014-06-02 -================== - - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - * deps: serve-static@1.2.1 - - use `escape-html` for escaping - - deps: send@0.4.1 - -4.4.0 / 2014-05-30 -================== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * mark `res.send` ETag as weak and reduce collisions - * update accepts to 1.0.2 - - Fix interpretation when header not in request - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - * update serve-static to 1.2.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: send@0.4.0 - -4.3.2 / 2014-05-28 -================== - - * fix handling of errors from `router.param()` callbacks - -4.3.1 / 2014-05-23 -================== - - * revert "fix behavior of multiple `app.VERB` for the same path" - - this caused a regression in the order of route execution - -4.3.0 / 2014-05-21 -================== - - * add `req.baseUrl` to access the path stripped from `req.url` in routes - * fix behavior of multiple `app.VERB` for the same path - * fix issue routing requests among sub routers - * invoke `router.param()` only when necessary instead of every match - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * set proper `charset` in `Content-Type` for `res.send` - * update type-is to 1.2.0 - - support suffix matching - -4.2.0 / 2014-05-11 -================== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * fix `req.next` when inside router instance - * include `ETag` header in `HEAD` requests - * keep previous `Content-Type` for `res.jsonp` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update debug to 0.8.0 - - add `enable()` method - - change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - -4.1.2 / 2014-05-08 -================== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -4.1.1 / 2014-04-27 -================== - - * fix package.json to reflect supported node version - -4.1.0 / 2014-04-24 -================== - - * pass options from `res.sendfile` to `send` - * preserve casing of headers in `res.header` and `res.set` - * support unicode file names in `res.attachment` and `res.download` - * update accepts to 1.0.1 - - deps: negotiator@0.4.0 - * update cookie to 0.1.2 - - Fix for maxAge == 0 - - made compat with expires field - * update send to 0.3.0 - - Accept API options in options object - - Coerce option types - - Control whether to generate etags - - Default directory access to 403 when index disabled - - Fix sending files with dots without root set - - Include file path in etag - - Make "Can't set headers after they are sent." catchable - - Send full entity-body for multi range requests - - Set etags to "weak" - - Support "If-Range" header - - Support multiple index paths - - deps: mime@1.2.11 - * update serve-static to 1.1.0 - - Accept options directly to `send` module - - Resolve relative paths at middleware setup - - Use parseurl to parse the URL from request - - deps: send@0.3.0 - * update type-is to 1.1.0 - - add non-array values support - - add `multipart` as a shorthand - -4.0.0 / 2014-04-09 -================== - - * remove: - - node 0.8 support - - connect and connect's patches except for charset handling - - express(1) - moved to [express-generator](https://github.com/expressjs/generator) - - `express.createServer()` - it has been deprecated for a long time. Use `express()` - - `app.configure` - use logic in your own app code - - `app.router` - is removed - - `req.auth` - use `basic-auth` instead - - `req.accepted*` - use `req.accepts*()` instead - - `res.location` - relative URL resolution is removed - - `res.charset` - include the charset in the content type when using `res.set()` - - all bundled middleware except `static` - * change: - - `app.route` -> `app.mountpath` when mounting an express app in another express app - - `json spaces` no longer enabled by default in development - - `req.accepts*` -> `req.accepts*s` - i.e. `req.acceptsEncoding` -> `req.acceptsEncodings` - - `req.params` is now an object instead of an array - - `res.locals` is no longer a function. It is a plain js object. Treat it as such. - - `res.headerSent` -> `res.headersSent` to match node.js ServerResponse object - * refactor: - - `req.accepts*` with [accepts](https://github.com/expressjs/accepts) - - `req.is` with [type-is](https://github.com/expressjs/type-is) - - [path-to-regexp](https://github.com/component/path-to-regexp) - * add: - - `app.router()` - returns the app Router instance - - `app.route()` - Proxy to the app's `Router#route()` method to create a new route - - Router & Route - public API - -3.21.2 / 2015-07-31 -=================== - - * deps: connect@2.30.2 - - deps: body-parser@~1.13.3 - - deps: compression@~1.5.2 - - deps: errorhandler@~1.4.2 - - deps: method-override@~2.3.5 - - deps: serve-index@~1.7.2 - - deps: type-is@~1.6.6 - - deps: vhost@~3.0.1 - * deps: vary@~1.0.1 - - Fix setting empty header from empty `field` - - perf: enable strict mode - - perf: remove argument reassignments - -3.21.1 / 2015-07-05 -=================== - - * deps: basic-auth@~1.0.3 - * deps: connect@2.30.1 - - deps: body-parser@~1.13.2 - - deps: compression@~1.5.1 - - deps: errorhandler@~1.4.1 - - deps: morgan@~1.6.1 - - deps: pause@0.1.0 - - deps: qs@4.0.0 - - deps: serve-index@~1.7.1 - - deps: type-is@~1.6.4 - -3.21.0 / 2015-06-18 -=================== - - * deps: basic-auth@1.0.2 - - perf: enable strict mode - - perf: hoist regular expression - - perf: parse with regular expressions - - perf: remove argument reassignment - * deps: connect@2.30.0 - - deps: body-parser@~1.13.1 - - deps: bytes@2.1.0 - - deps: compression@~1.5.0 - - deps: cookie@0.1.3 - - deps: cookie-parser@~1.3.5 - - deps: csurf@~1.8.3 - - deps: errorhandler@~1.4.0 - - deps: express-session@~1.11.3 - - deps: finalhandler@0.4.0 - - deps: fresh@0.3.0 - - deps: morgan@~1.6.0 - - deps: serve-favicon@~2.3.0 - - deps: serve-index@~1.7.0 - - deps: serve-static@~1.10.0 - - deps: type-is@~1.6.3 - * deps: cookie@0.1.3 - - perf: deduce the scope of try-catch deopt - - perf: remove argument reassignments - * deps: escape-html@1.0.2 - * deps: etag@~1.7.0 - - Always include entity length in ETags for hash length extensions - - Generate non-Stats ETags using MD5 only (no longer CRC32) - - Improve stat performance by removing hashing - - Improve support for JXcore - - Remove base64 padding in ETags to shorten - - Support "fake" stats objects in environments without fs - - Use MD5 instead of MD4 in weak ETags over 1KB - * deps: fresh@0.3.0 - - Add weak `ETag` matching support - * deps: mkdirp@0.5.1 - - Work in global strict mode - * deps: send@0.13.0 - - Allow Node.js HTTP server to set `Date` response header - - Fix incorrectly removing `Content-Location` on 304 response - - Improve the default redirect response headers - - Send appropriate headers on default error response - - Use `http-errors` for standard emitted errors - - Use `statuses` instead of `http` module for status messages - - deps: escape-html@1.0.2 - - deps: etag@~1.7.0 - - deps: fresh@0.3.0 - - deps: on-finished@~2.3.0 - - perf: enable strict mode - - perf: remove unnecessary array allocations - -3.20.3 / 2015-05-17 -=================== - - * deps: connect@2.29.2 - - deps: body-parser@~1.12.4 - - deps: compression@~1.4.4 - - deps: connect-timeout@~1.6.2 - - deps: debug@~2.2.0 - - deps: depd@~1.0.1 - - deps: errorhandler@~1.3.6 - - deps: finalhandler@0.3.6 - - deps: method-override@~2.3.3 - - deps: morgan@~1.5.3 - - deps: qs@2.4.2 - - deps: response-time@~2.3.1 - - deps: serve-favicon@~2.2.1 - - deps: serve-index@~1.6.4 - - deps: serve-static@~1.9.3 - - deps: type-is@~1.6.2 - * deps: debug@~2.2.0 - - deps: ms@0.7.1 - * deps: depd@~1.0.1 - * deps: proxy-addr@~1.0.8 - - deps: ipaddr.js@1.0.1 - * deps: send@0.12.3 - - deps: debug@~2.2.0 - - deps: depd@~1.0.1 - - deps: etag@~1.6.0 - - deps: ms@0.7.1 - - deps: on-finished@~2.2.1 - -3.20.2 / 2015-03-16 -=================== - - * deps: connect@2.29.1 - - deps: body-parser@~1.12.2 - - deps: compression@~1.4.3 - - deps: connect-timeout@~1.6.1 - - deps: debug@~2.1.3 - - deps: errorhandler@~1.3.5 - - deps: express-session@~1.10.4 - - deps: finalhandler@0.3.4 - - deps: method-override@~2.3.2 - - deps: morgan@~1.5.2 - - deps: qs@2.4.1 - - deps: serve-index@~1.6.3 - - deps: serve-static@~1.9.2 - - deps: type-is@~1.6.1 - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - * deps: merge-descriptors@1.0.0 - * deps: proxy-addr@~1.0.7 - - deps: ipaddr.js@0.1.9 - * deps: send@0.12.2 - - Throw errors early for invalid `extensions` or `index` options - - deps: debug@~2.1.3 - -3.20.1 / 2015-02-28 -=================== - - * Fix `req.host` when using "trust proxy" hops count - * Fix `req.protocol`/`req.secure` when using "trust proxy" hops count - -3.20.0 / 2015-02-18 -=================== - - * Fix `"trust proxy"` setting to inherit when app is mounted - * Generate `ETag`s for all request responses - - No longer restricted to only responses for `GET` and `HEAD` requests - * Use `content-type` to parse `Content-Type` headers - * deps: connect@2.29.0 - - Use `content-type` to parse `Content-Type` headers - - deps: body-parser@~1.12.0 - - deps: compression@~1.4.1 - - deps: connect-timeout@~1.6.0 - - deps: cookie-parser@~1.3.4 - - deps: cookie-signature@1.0.6 - - deps: csurf@~1.7.0 - - deps: errorhandler@~1.3.4 - - deps: express-session@~1.10.3 - - deps: http-errors@~1.3.1 - - deps: response-time@~2.3.0 - - deps: serve-index@~1.6.2 - - deps: serve-static@~1.9.1 - - deps: type-is@~1.6.0 - * deps: cookie-signature@1.0.6 - * deps: send@0.12.1 - - Always read the stat size from the file - - Fix mutating passed-in `options` - - deps: mime@1.3.4 - -3.19.2 / 2015-02-01 -=================== - - * deps: connect@2.28.3 - - deps: compression@~1.3.1 - - deps: csurf@~1.6.6 - - deps: errorhandler@~1.3.3 - - deps: express-session@~1.10.2 - - deps: serve-index@~1.6.1 - - deps: type-is@~1.5.6 - * deps: proxy-addr@~1.0.6 - - deps: ipaddr.js@0.1.8 - -3.19.1 / 2015-01-20 -=================== - - * deps: connect@2.28.2 - - deps: body-parser@~1.10.2 - - deps: serve-static@~1.8.1 - * deps: send@0.11.1 - - Fix root path disclosure - -3.19.0 / 2015-01-09 -=================== - - * Fix `OPTIONS` responses to include the `HEAD` method property - * Use `readline` for prompt in `express(1)` - * deps: commander@2.6.0 - * deps: connect@2.28.1 - - deps: body-parser@~1.10.1 - - deps: compression@~1.3.0 - - deps: connect-timeout@~1.5.0 - - deps: csurf@~1.6.4 - - deps: debug@~2.1.1 - - deps: errorhandler@~1.3.2 - - deps: express-session@~1.10.1 - - deps: finalhandler@0.3.3 - - deps: method-override@~2.3.1 - - deps: morgan@~1.5.1 - - deps: serve-favicon@~2.2.0 - - deps: serve-index@~1.6.0 - - deps: serve-static@~1.8.0 - - deps: type-is@~1.5.5 - * deps: debug@~2.1.1 - * deps: methods@~1.1.1 - * deps: proxy-addr@~1.0.5 - - deps: ipaddr.js@0.1.6 - * deps: send@0.11.0 - - deps: debug@~2.1.1 - - deps: etag@~1.5.1 - - deps: ms@0.7.0 - - deps: on-finished@~2.2.0 - -3.18.6 / 2014-12-12 -=================== - - * Fix exception in `req.fresh`/`req.stale` without response headers - -3.18.5 / 2014-12-11 -=================== - - * deps: connect@2.27.6 - - deps: compression@~1.2.2 - - deps: express-session@~1.9.3 - - deps: http-errors@~1.2.8 - - deps: serve-index@~1.5.3 - - deps: type-is@~1.5.4 - -3.18.4 / 2014-11-23 -=================== - - * deps: connect@2.27.4 - - deps: body-parser@~1.9.3 - - deps: compression@~1.2.1 - - deps: errorhandler@~1.2.3 - - deps: express-session@~1.9.2 - - deps: qs@2.3.3 - - deps: serve-favicon@~2.1.7 - - deps: serve-static@~1.5.1 - - deps: type-is@~1.5.3 - * deps: etag@~1.5.1 - * deps: proxy-addr@~1.0.4 - - deps: ipaddr.js@0.1.5 - -3.18.3 / 2014-11-09 -=================== - - * deps: connect@2.27.3 - - Correctly invoke async callback asynchronously - - deps: csurf@~1.6.3 - -3.18.2 / 2014-10-28 -=================== - - * deps: connect@2.27.2 - - Fix handling of URLs containing `://` in the path - - deps: body-parser@~1.9.2 - - deps: qs@2.3.2 - -3.18.1 / 2014-10-22 -=================== - - * Fix internal `utils.merge` deprecation warnings - * deps: connect@2.27.1 - - deps: body-parser@~1.9.1 - - deps: express-session@~1.9.1 - - deps: finalhandler@0.3.2 - - deps: morgan@~1.4.1 - - deps: qs@2.3.0 - - deps: serve-static@~1.7.1 - * deps: send@0.10.1 - - deps: on-finished@~2.1.1 - -3.18.0 / 2014-10-17 -=================== - - * Use `content-disposition` module for `res.attachment`/`res.download` - - Sends standards-compliant `Content-Disposition` header - - Full Unicode support - * Use `etag` module to generate `ETag` headers - * deps: connect@2.27.0 - - Use `http-errors` module for creating errors - - Use `utils-merge` module for merging objects - - deps: body-parser@~1.9.0 - - deps: compression@~1.2.0 - - deps: connect-timeout@~1.4.0 - - deps: debug@~2.1.0 - - deps: depd@~1.0.0 - - deps: express-session@~1.9.0 - - deps: finalhandler@0.3.1 - - deps: method-override@~2.3.0 - - deps: morgan@~1.4.0 - - deps: response-time@~2.2.0 - - deps: serve-favicon@~2.1.6 - - deps: serve-index@~1.5.0 - - deps: serve-static@~1.7.0 - * deps: debug@~2.1.0 - - Implement `DEBUG_FD` env variable support - * deps: depd@~1.0.0 - * deps: send@0.10.0 - - deps: debug@~2.1.0 - - deps: depd@~1.0.0 - - deps: etag@~1.5.0 - -3.17.8 / 2014-10-15 -=================== - - * deps: connect@2.26.6 - - deps: compression@~1.1.2 - - deps: csurf@~1.6.2 - - deps: errorhandler@~1.2.2 - -3.17.7 / 2014-10-08 -=================== - - * deps: connect@2.26.5 - - Fix accepting non-object arguments to `logger` - - deps: serve-static@~1.6.4 - -3.17.6 / 2014-10-02 -=================== - - * deps: connect@2.26.4 - - deps: morgan@~1.3.2 - - deps: type-is@~1.5.2 - -3.17.5 / 2014-09-24 -=================== - - * deps: connect@2.26.3 - - deps: body-parser@~1.8.4 - - deps: serve-favicon@~2.1.5 - - deps: serve-static@~1.6.3 - * deps: proxy-addr@~1.0.3 - - Use `forwarded` npm module - * deps: send@0.9.3 - - deps: etag@~1.4.0 - -3.17.4 / 2014-09-19 -=================== - - * deps: connect@2.26.2 - - deps: body-parser@~1.8.3 - - deps: qs@2.2.4 - -3.17.3 / 2014-09-18 -=================== - - * deps: proxy-addr@~1.0.2 - - Fix a global leak when multiple subnets are trusted - - deps: ipaddr.js@0.1.3 - -3.17.2 / 2014-09-15 -=================== - - * Use `crc` instead of `buffer-crc32` for speed - * deps: connect@2.26.1 - - deps: body-parser@~1.8.2 - - deps: depd@0.4.5 - - deps: express-session@~1.8.2 - - deps: morgan@~1.3.1 - - deps: serve-favicon@~2.1.3 - - deps: serve-static@~1.6.2 - * deps: depd@0.4.5 - * deps: send@0.9.2 - - deps: depd@0.4.5 - - deps: etag@~1.3.1 - - deps: range-parser@~1.0.2 - -3.17.1 / 2014-09-08 -=================== - - * Fix error in `req.subdomains` on empty host - -3.17.0 / 2014-09-08 -=================== - - * Support `X-Forwarded-Host` in `req.subdomains` - * Support IP address host in `req.subdomains` - * deps: connect@2.26.0 - - deps: body-parser@~1.8.1 - - deps: compression@~1.1.0 - - deps: connect-timeout@~1.3.0 - - deps: cookie-parser@~1.3.3 - - deps: cookie-signature@1.0.5 - - deps: csurf@~1.6.1 - - deps: debug@~2.0.0 - - deps: errorhandler@~1.2.0 - - deps: express-session@~1.8.1 - - deps: finalhandler@0.2.0 - - deps: fresh@0.2.4 - - deps: media-typer@0.3.0 - - deps: method-override@~2.2.0 - - deps: morgan@~1.3.0 - - deps: qs@2.2.3 - - deps: serve-favicon@~2.1.3 - - deps: serve-index@~1.2.1 - - deps: serve-static@~1.6.1 - - deps: type-is@~1.5.1 - - deps: vhost@~3.0.0 - * deps: cookie-signature@1.0.5 - * deps: debug@~2.0.0 - * deps: fresh@0.2.4 - * deps: media-typer@0.3.0 - - Throw error when parameter format invalid on parse - * deps: range-parser@~1.0.2 - * deps: send@0.9.1 - - Add `lastModified` option - - Use `etag` to generate `ETag` header - - deps: debug@~2.0.0 - - deps: fresh@0.2.4 - * deps: vary@~1.0.0 - - Accept valid `Vary` header string as `field` - -3.16.10 / 2014-09-04 -==================== - - * deps: connect@2.25.10 - - deps: serve-static@~1.5.4 - * deps: send@0.8.5 - - Fix a path traversal issue when using `root` - - Fix malicious path detection for empty string path - -3.16.9 / 2014-08-29 -=================== - - * deps: connect@2.25.9 - - deps: body-parser@~1.6.7 - - deps: qs@2.2.2 - -3.16.8 / 2014-08-27 -=================== - - * deps: connect@2.25.8 - - deps: body-parser@~1.6.6 - - deps: csurf@~1.4.1 - - deps: qs@2.2.0 - -3.16.7 / 2014-08-18 -=================== - - * deps: connect@2.25.7 - - deps: body-parser@~1.6.5 - - deps: express-session@~1.7.6 - - deps: morgan@~1.2.3 - - deps: serve-static@~1.5.3 - * deps: send@0.8.3 - - deps: destroy@1.0.3 - - deps: on-finished@2.1.0 - -3.16.6 / 2014-08-14 -=================== - - * deps: connect@2.25.6 - - deps: body-parser@~1.6.4 - - deps: qs@1.2.2 - - deps: serve-static@~1.5.2 - * deps: send@0.8.2 - - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` - -3.16.5 / 2014-08-11 -=================== - - * deps: connect@2.25.5 - - Fix backwards compatibility in `logger` - -3.16.4 / 2014-08-10 -=================== - - * Fix original URL parsing in `res.location` - * deps: connect@2.25.4 - - Fix `query` middleware breaking with argument - - deps: body-parser@~1.6.3 - - deps: compression@~1.0.11 - - deps: connect-timeout@~1.2.2 - - deps: express-session@~1.7.5 - - deps: method-override@~2.1.3 - - deps: on-headers@~1.0.0 - - deps: parseurl@~1.3.0 - - deps: qs@1.2.1 - - deps: response-time@~2.0.1 - - deps: serve-index@~1.1.6 - - deps: serve-static@~1.5.1 - * deps: parseurl@~1.3.0 - -3.16.3 / 2014-08-07 -=================== - - * deps: connect@2.25.3 - - deps: multiparty@3.3.2 - -3.16.2 / 2014-08-07 -=================== - - * deps: connect@2.25.2 - - deps: body-parser@~1.6.2 - - deps: qs@1.2.0 - -3.16.1 / 2014-08-06 -=================== - - * deps: connect@2.25.1 - - deps: body-parser@~1.6.1 - - deps: qs@1.1.0 - -3.16.0 / 2014-08-05 -=================== - - * deps: connect@2.25.0 - - deps: body-parser@~1.6.0 - - deps: compression@~1.0.10 - - deps: csurf@~1.4.0 - - deps: express-session@~1.7.4 - - deps: qs@1.0.2 - - deps: serve-static@~1.5.0 - * deps: send@0.8.1 - - Add `extensions` option - -3.15.3 / 2014-08-04 -=================== - - * fix `res.sendfile` regression for serving directory index files - * deps: connect@2.24.3 - - deps: serve-index@~1.1.5 - - deps: serve-static@~1.4.4 - * deps: send@0.7.4 - - Fix incorrect 403 on Windows and Node.js 0.11 - - Fix serving index files without root dir - -3.15.2 / 2014-07-27 -=================== - - * deps: connect@2.24.2 - - deps: body-parser@~1.5.2 - - deps: depd@0.4.4 - - deps: express-session@~1.7.2 - - deps: morgan@~1.2.2 - - deps: serve-static@~1.4.2 - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - -3.15.1 / 2014-07-26 -=================== - - * deps: connect@2.24.1 - - deps: body-parser@~1.5.1 - - deps: depd@0.4.3 - - deps: express-session@~1.7.1 - - deps: morgan@~1.2.1 - - deps: serve-index@~1.1.4 - - deps: serve-static@~1.4.1 - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - -3.15.0 / 2014-07-22 -=================== - - * Fix `req.protocol` for proxy-direct connections - * Pass options from `res.sendfile` to `send` - * deps: connect@2.24.0 - - deps: body-parser@~1.5.0 - - deps: compression@~1.0.9 - - deps: connect-timeout@~1.2.1 - - deps: debug@1.0.4 - - deps: depd@0.4.2 - - deps: express-session@~1.7.0 - - deps: finalhandler@0.1.0 - - deps: method-override@~2.1.2 - - deps: morgan@~1.2.0 - - deps: multiparty@3.3.1 - - deps: parseurl@~1.2.0 - - deps: serve-static@~1.4.0 - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -3.14.0 / 2014-07-11 -=================== - - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * deps: basic-auth@1.0.0 - - support empty password - - support empty username - * deps: connect@2.23.0 - - deps: debug@1.0.3 - - deps: express-session@~1.6.4 - - deps: method-override@~2.1.0 - - deps: parseurl@~1.1.3 - - deps: serve-static@~1.3.1 - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -3.13.0 / 2014-07-03 -=================== - - * add deprecation message to `app.configure` - * add deprecation message to `req.auth` - * use `basic-auth` to parse `Authorization` header - * deps: connect@2.22.0 - - deps: csurf@~1.3.0 - - deps: express-session@~1.6.1 - - deps: multiparty@3.3.0 - - deps: serve-static@~1.3.0 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - -3.12.1 / 2014-06-26 -=================== - - * deps: connect@2.21.1 - - deps: cookie-parser@1.3.2 - - deps: cookie-signature@1.0.4 - - deps: express-session@~1.5.2 - - deps: type-is@~1.3.2 - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -3.12.0 / 2014-06-21 -=================== - - * use `media-typer` to alter content-type charset - * deps: connect@2.21.0 - - deprecate `connect(middleware)` -- use `app.use(middleware)` instead - - deprecate `connect.createServer()` -- use `connect()` instead - - fix `res.setHeader()` patch to work with with get -> append -> set pattern - - deps: compression@~1.0.8 - - deps: errorhandler@~1.1.1 - - deps: express-session@~1.5.0 - - deps: serve-index@~1.1.3 - -3.11.0 / 2014-06-19 -=================== - - * deprecate things with `depd` module - * deps: buffer-crc32@0.2.3 - * deps: connect@2.20.2 - - deprecate `verify` option to `json` -- use `body-parser` npm module instead - - deprecate `verify` option to `urlencoded` -- use `body-parser` npm module instead - - deprecate things with `depd` module - - use `finalhandler` for final response handling - - use `media-typer` to parse `content-type` for charset - - deps: body-parser@1.4.3 - - deps: connect-timeout@1.1.1 - - deps: cookie-parser@1.3.1 - - deps: csurf@1.2.2 - - deps: errorhandler@1.1.0 - - deps: express-session@1.4.0 - - deps: multiparty@3.2.9 - - deps: serve-index@1.1.2 - - deps: type-is@1.3.1 - - deps: vhost@2.0.0 - -3.10.5 / 2014-06-11 -=================== - - * deps: connect@2.19.6 - - deps: body-parser@1.3.1 - - deps: compression@1.0.7 - - deps: debug@1.0.2 - - deps: serve-index@1.1.1 - - deps: serve-static@1.2.3 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -3.10.4 / 2014-06-09 -=================== - - * deps: connect@2.19.5 - - fix "event emitter leak" warnings - - deps: csurf@1.2.1 - - deps: debug@1.0.1 - - deps: serve-static@1.2.2 - - deps: type-is@1.2.1 - * deps: debug@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: finished@1.2.1 - - deps: debug@1.0.1 - -3.10.3 / 2014-06-05 -=================== - - * use `vary` module for `res.vary` - * deps: connect@2.19.4 - - deps: errorhandler@1.0.2 - - deps: method-override@2.0.2 - - deps: serve-favicon@2.0.1 - * deps: debug@1.0.0 - -3.10.2 / 2014-06-03 -=================== - - * deps: connect@2.19.3 - - deps: compression@1.0.6 - -3.10.1 / 2014-06-03 -=================== - - * deps: connect@2.19.2 - - deps: compression@1.0.4 - * deps: proxy-addr@1.0.1 - -3.10.0 / 2014-06-02 -=================== - - * deps: connect@2.19.1 - - deprecate `methodOverride()` -- use `method-override` npm module instead - - deps: body-parser@1.3.0 - - deps: method-override@2.0.1 - - deps: multiparty@3.2.8 - - deps: response-time@2.0.0 - - deps: serve-static@1.2.1 - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -3.9.0 / 2014-05-30 -================== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * Include ETag in HEAD requests - * mark `res.send` ETag as weak and reduce collisions - * update connect to 2.18.0 - - deps: compression@1.0.3 - - deps: serve-index@1.1.0 - - deps: serve-static@1.2.0 - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - -3.8.1 / 2014-05-27 -================== - - * update connect to 2.17.3 - - deps: body-parser@1.2.2 - - deps: express-session@1.2.1 - - deps: method-override@1.0.2 - -3.8.0 / 2014-05-21 -================== - - * keep previous `Content-Type` for `res.jsonp` - * set proper `charset` in `Content-Type` for `res.send` - * update connect to 2.17.1 - - fix `res.charset` appending charset when `content-type` has one - - deps: express-session@1.2.0 - - deps: morgan@1.1.1 - - deps: serve-index@1.0.3 - -3.7.0 / 2014-05-18 -================== - - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * update connect to 2.16.2 - - deprecate `res.headerSent` -- use `res.headersSent` - - deprecate `res.on("header")` -- use on-headers module instead - - fix edge-case in `res.appendHeader` that would append in wrong order - - json: use body-parser - - urlencoded: use body-parser - - dep: bytes@1.0.0 - - dep: cookie-parser@1.1.0 - - dep: csurf@1.2.0 - - dep: express-session@1.1.0 - - dep: method-override@1.0.1 - -3.6.0 / 2014-05-09 -================== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update connect to 2.15.0 - * Add `res.appendHeader` - * Call error stack even when response has been sent - * Patch `res.headerSent` to return Boolean - * Patch `res.headersSent` for node.js 0.8 - * Prevent default 404 handler after response sent - * dep: compression@1.0.2 - * dep: connect-timeout@1.1.0 - * dep: debug@^0.8.0 - * dep: errorhandler@1.0.1 - * dep: express-session@1.0.4 - * dep: morgan@1.0.1 - * dep: serve-favicon@2.0.0 - * dep: serve-index@1.0.2 - * update debug to 0.8.0 - * add `enable()` method - * change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - * update mkdirp to 0.5.0 - -3.5.3 / 2014-05-08 -================== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -3.5.2 / 2014-04-24 -================== - - * update connect to 2.14.5 - * update cookie to 0.1.2 - * update mkdirp to 0.4.0 - * update send to 0.3.0 - -3.5.1 / 2014-03-25 -================== - - * pin less-middleware in generated app - -3.5.0 / 2014-03-06 -================== - - * bump deps - -3.4.8 / 2014-01-13 -================== - - * prevent incorrect automatic OPTIONS responses #1868 @dpatti - * update binary and examples for jade 1.0 #1876 @yossi, #1877 @reqshark, #1892 @matheusazzi - * throw 400 in case of malformed paths @rlidwka - -3.4.7 / 2013-12-10 -================== - - * update connect - -3.4.6 / 2013-12-01 -================== - - * update connect (raw-body) - -3.4.5 / 2013-11-27 -================== - - * update connect - * res.location: remove leading ./ #1802 @kapouer - * res.redirect: fix `res.redirect('toString') #1829 @michaelficarra - * res.send: always send ETag when content-length > 0 - * router: add Router.all() method - -3.4.4 / 2013-10-29 -================== - - * update connect - * update supertest - * update methods - * express(1): replace bodyParser() with urlencoded() and json() #1795 @chirag04 - -3.4.3 / 2013-10-23 -================== - - * update connect - -3.4.2 / 2013-10-18 -================== - - * update connect - * downgrade commander - -3.4.1 / 2013-10-15 -================== - - * update connect - * update commander - * jsonp: check if callback is a function - * router: wrap encodeURIComponent in a try/catch #1735 (@lxe) - * res.format: now includes charset @1747 (@sorribas) - * res.links: allow multiple calls @1746 (@sorribas) - -3.4.0 / 2013-09-07 -================== - - * add res.vary(). Closes #1682 - * update connect - -3.3.8 / 2013-09-02 -================== - - * update connect - -3.3.7 / 2013-08-28 -================== - - * update connect - -3.3.6 / 2013-08-27 -================== - - * Revert "remove charset from json responses. Closes #1631" (causes issues in some clients) - * add: req.accepts take an argument list - -3.3.4 / 2013-07-08 -================== - - * update send and connect - -3.3.3 / 2013-07-04 -================== - - * update connect - -3.3.2 / 2013-07-03 -================== - - * update connect - * update send - * remove .version export - -3.3.1 / 2013-06-27 -================== - - * update connect - -3.3.0 / 2013-06-26 -================== - - * update connect - * add support for multiple X-Forwarded-Proto values. Closes #1646 - * change: remove charset from json responses. Closes #1631 - * change: return actual booleans from req.accept* functions - * fix jsonp callback array throw - -3.2.6 / 2013-06-02 -================== - - * update connect - -3.2.5 / 2013-05-21 -================== - - * update connect - * update node-cookie - * add: throw a meaningful error when there is no default engine - * change generation of ETags with res.send() to GET requests only. Closes #1619 - -3.2.4 / 2013-05-09 -================== - - * fix `req.subdomains` when no Host is present - * fix `req.host` when no Host is present, return undefined - -3.2.3 / 2013-05-07 -================== - - * update connect / qs - -3.2.2 / 2013-05-03 -================== - - * update qs - -3.2.1 / 2013-04-29 -================== - - * add app.VERB() paths array deprecation warning - * update connect - * update qs and remove all ~ semver crap - * fix: accept number as value of Signed Cookie - -3.2.0 / 2013-04-15 -================== - - * add "view" constructor setting to override view behaviour - * add req.acceptsEncoding(name) - * add req.acceptedEncodings - * revert cookie signature change causing session race conditions - * fix sorting of Accept values of the same quality - -3.1.2 / 2013-04-12 -================== - - * add support for custom Accept parameters - * update cookie-signature - -3.1.1 / 2013-04-01 -================== - - * add X-Forwarded-Host support to `req.host` - * fix relative redirects - * update mkdirp - * update buffer-crc32 - * remove legacy app.configure() method from app template. - -3.1.0 / 2013-01-25 -================== - - * add support for leading "." in "view engine" setting - * add array support to `res.set()` - * add node 0.8.x to travis.yml - * add "subdomain offset" setting for tweaking `req.subdomains` - * add `res.location(url)` implementing `res.redirect()`-like setting of Location - * use app.get() for x-powered-by setting for inheritance - * fix colons in passwords for `req.auth` - -3.0.6 / 2013-01-04 -================== - - * add http verb methods to Router - * update connect - * fix mangling of the `res.cookie()` options object - * fix jsonp whitespace escape. Closes #1132 - -3.0.5 / 2012-12-19 -================== - - * add throwing when a non-function is passed to a route - * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses - * revert "add 'etag' option" - -3.0.4 / 2012-12-05 -================== - - * add 'etag' option to disable `res.send()` Etags - * add escaping of urls in text/plain in `res.redirect()` - for old browsers interpreting as html - * change crc32 module for a more liberal license - * update connect - -3.0.3 / 2012-11-13 -================== - - * update connect - * update cookie module - * fix cookie max-age - -3.0.2 / 2012-11-08 -================== - - * add OPTIONS to cors example. Closes #1398 - * fix route chaining regression. Closes #1397 - -3.0.1 / 2012-11-01 -================== - - * update connect - -3.0.0 / 2012-10-23 -================== - - * add `make clean` - * add "Basic" check to req.auth - * add `req.auth` test coverage - * add cb && cb(payload) to `res.jsonp()`. Closes #1374 - * add backwards compat for `res.redirect()` status. Closes #1336 - * add support for `res.json()` to retain previously defined Content-Types. Closes #1349 - * update connect - * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382 - * remove non-primitive string support for `res.send()` - * fix view-locals example. Closes #1370 - * fix route-separation example - -3.0.0rc5 / 2012-09-18 -================== - - * update connect - * add redis search example - * add static-files example - * add "x-powered-by" setting (`app.disable('x-powered-by')`) - * add "application/octet-stream" redirect Accept test case. Closes #1317 - -3.0.0rc4 / 2012-08-30 -================== - - * add `res.jsonp()`. Closes #1307 - * add "verbose errors" option to error-pages example - * add another route example to express(1) so people are not so confused - * add redis online user activity tracking example - * update connect dep - * fix etag quoting. Closes #1310 - * fix error-pages 404 status - * fix jsonp callback char restrictions - * remove old OPTIONS default response - -3.0.0rc3 / 2012-08-13 -================== - - * update connect dep - * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds] - * fix `res.render()` clobbering of "locals" - -3.0.0rc2 / 2012-08-03 -================== - - * add CORS example - * update connect dep - * deprecate `.createServer()` & remove old stale examples - * fix: escape `res.redirect()` link - * fix vhost example - -3.0.0rc1 / 2012-07-24 -================== - - * add more examples to view-locals - * add scheme-relative redirects (`res.redirect("//foo.com")`) support - * update cookie dep - * update connect dep - * update send dep - * fix `express(1)` -h flag, use -H for hogan. Closes #1245 - * fix `res.sendfile()` socket error handling regression - -3.0.0beta7 / 2012-07-16 -================== - - * update connect dep for `send()` root normalization regression - -3.0.0beta6 / 2012-07-13 -================== - - * add `err.view` property for view errors. Closes #1226 - * add "jsonp callback name" setting - * add support for "/foo/:bar*" non-greedy matches - * change `res.sendfile()` to use `send()` module - * change `res.send` to use "response-send" module - * remove `app.locals.use` and `res.locals.use`, use regular middleware - -3.0.0beta5 / 2012-07-03 -================== - - * add "make check" support - * add route-map example - * add `res.json(obj, status)` support back for BC - * add "methods" dep, remove internal methods module - * update connect dep - * update auth example to utilize cores pbkdf2 - * updated tests to use "supertest" - -3.0.0beta4 / 2012-06-25 -================== - - * Added `req.auth` - * Added `req.range(size)` - * Added `res.links(obj)` - * Added `res.send(body, status)` support back for backwards compat - * Added `.default()` support to `res.format()` - * Added 2xx / 304 check to `req.fresh` - * Revert "Added + support to the router" - * Fixed `res.send()` freshness check, respect res.statusCode - -3.0.0beta3 / 2012-06-15 -================== - - * Added hogan `--hjs` to express(1) [nullfirm] - * Added another example to content-negotiation - * Added `fresh` dep - * Changed: `res.send()` always checks freshness - * Fixed: expose connects mime module. Closes #1165 - -3.0.0beta2 / 2012-06-06 -================== - - * Added `+` support to the router - * Added `req.host` - * Changed `req.param()` to check route first - * Update connect dep - -3.0.0beta1 / 2012-06-01 -================== - - * Added `res.format()` callback to override default 406 behaviour - * Fixed `res.redirect()` 406. Closes #1154 - -3.0.0alpha5 / 2012-05-30 -================== - - * Added `req.ip` - * Added `{ signed: true }` option to `res.cookie()` - * Removed `res.signedCookie()` - * Changed: dont reverse `req.ips` - * Fixed "trust proxy" setting check for `req.ips` - -3.0.0alpha4 / 2012-05-09 -================== - - * Added: allow `[]` in jsonp callback. Closes #1128 - * Added `PORT` env var support in generated template. Closes #1118 [benatkin] - * Updated: connect 2.2.2 - -3.0.0alpha3 / 2012-05-04 -================== - - * Added public `app.routes`. Closes #887 - * Added _view-locals_ example - * Added _mvc_ example - * Added `res.locals.use()`. Closes #1120 - * Added conditional-GET support to `res.send()` - * Added: coerce `res.set()` values to strings - * Changed: moved `static()` in generated apps below router - * Changed: `res.send()` only set ETag when not previously set - * Changed connect 2.2.1 dep - * Changed: `make test` now runs unit / acceptance tests - * Fixed req/res proto inheritance - -3.0.0alpha2 / 2012-04-26 -================== - - * Added `make benchmark` back - * Added `res.send()` support for `String` objects - * Added client-side data exposing example - * Added `res.header()` and `req.header()` aliases for BC - * Added `express.createServer()` for BC - * Perf: memoize parsed urls - * Perf: connect 2.2.0 dep - * Changed: make `expressInit()` middleware self-aware - * Fixed: use app.get() for all core settings - * Fixed redis session example - * Fixed session example. Closes #1105 - * Fixed generated express dep. Closes #1078 - -3.0.0alpha1 / 2012-04-15 -================== - - * Added `app.locals.use(callback)` - * Added `app.locals` object - * Added `app.locals(obj)` - * Added `res.locals` object - * Added `res.locals(obj)` - * Added `res.format()` for content-negotiation - * Added `app.engine()` - * Added `res.cookie()` JSON cookie support - * Added "trust proxy" setting - * Added `req.subdomains` - * Added `req.protocol` - * Added `req.secure` - * Added `req.path` - * Added `req.ips` - * Added `req.fresh` - * Added `req.stale` - * Added comma-delimited / array support for `req.accepts()` - * Added debug instrumentation - * Added `res.set(obj)` - * Added `res.set(field, value)` - * Added `res.get(field)` - * Added `app.get(setting)`. Closes #842 - * Added `req.acceptsLanguage()` - * Added `req.acceptsCharset()` - * Added `req.accepted` - * Added `req.acceptedLanguages` - * Added `req.acceptedCharsets` - * Added "json replacer" setting - * Added "json spaces" setting - * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92 - * Added `--less` support to express(1) - * Added `express.response` prototype - * Added `express.request` prototype - * Added `express.application` prototype - * Added `app.path()` - * Added `app.render()` - * Added `res.type()` to replace `res.contentType()` - * Changed: `res.redirect()` to add relative support - * Changed: enable "jsonp callback" by default - * Changed: renamed "case sensitive routes" to "case sensitive routing" - * Rewrite of all tests with mocha - * Removed "root" setting - * Removed `res.redirect('home')` support - * Removed `req.notify()` - * Removed `app.register()` - * Removed `app.redirect()` - * Removed `app.is()` - * Removed `app.helpers()` - * Removed `app.dynamicHelpers()` - * Fixed `res.sendfile()` with non-GET. Closes #723 - * Fixed express(1) public dir for windows. Closes #866 - -2.5.9/ 2012-04-02 -================== - - * Added support for PURGE request method [pbuyle] - * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki] - -2.5.8 / 2012-02-08 -================== - - * Update mkdirp dep. Closes #991 - -2.5.7 / 2012-02-06 -================== - - * Fixed `app.all` duplicate DELETE requests [mscdex] - -2.5.6 / 2012-01-13 -================== - - * Updated hamljs dev dep. Closes #953 - -2.5.5 / 2012-01-08 -================== - - * Fixed: set `filename` on cached templates [matthewleon] - -2.5.4 / 2012-01-02 -================== - - * Fixed `express(1)` eol on 0.4.x. Closes #947 - -2.5.3 / 2011-12-30 -================== - - * Fixed `req.is()` when a charset is present - -2.5.2 / 2011-12-10 -================== - - * Fixed: express(1) LF -> CRLF for windows - -2.5.1 / 2011-11-17 -================== - - * Changed: updated connect to 1.8.x - * Removed sass.js support from express(1) - -2.5.0 / 2011-10-24 -================== - - * Added ./routes dir for generated app by default - * Added npm install reminder to express(1) app gen - * Added 0.5.x support - * Removed `make test-cov` since it wont work with node 0.5.x - * Fixed express(1) public dir for windows. Closes #866 - -2.4.7 / 2011-10-05 -================== - - * Added mkdirp to express(1). Closes #795 - * Added simple _json-config_ example - * Added shorthand for the parsed request's pathname via `req.path` - * Changed connect dep to 1.7.x to fix npm issue... - * Fixed `res.redirect()` __HEAD__ support. [reported by xerox] - * Fixed `req.flash()`, only escape args - * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie] - -2.4.6 / 2011-08-22 -================== - - * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode] - -2.4.5 / 2011-08-19 -================== - - * Added support for routes to handle errors. Closes #809 - * Added `app.routes.all()`. Closes #803 - * Added "basepath" setting to work in conjunction with reverse proxies etc. - * Refactored `Route` to use a single array of callbacks - * Added support for multiple callbacks for `app.param()`. Closes #801 -Closes #805 - * Changed: removed .call(self) for route callbacks - * Dependency: `qs >= 0.3.1` - * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808 - -2.4.4 / 2011-08-05 -================== - - * Fixed `res.header()` intention of a set, even when `undefined` - * Fixed `*`, value no longer required - * Fixed `res.send(204)` support. Closes #771 - -2.4.3 / 2011-07-14 -================== - - * Added docs for `status` option special-case. Closes #739 - * Fixed `options.filename`, exposing the view path to template engines - -2.4.2. / 2011-07-06 -================== - - * Revert "removed jsonp stripping" for XSS - -2.4.1 / 2011-07-06 -================== - - * Added `res.json()` JSONP support. Closes #737 - * Added _extending-templates_ example. Closes #730 - * Added "strict routing" setting for trailing slashes - * Added support for multiple envs in `app.configure()` calls. Closes #735 - * Changed: `res.send()` using `res.json()` - * Changed: when cookie `path === null` don't default it - * Changed; default cookie path to "home" setting. Closes #731 - * Removed _pids/logs_ creation from express(1) - -2.4.0 / 2011-06-28 -================== - - * Added chainable `res.status(code)` - * Added `res.json()`, an explicit version of `res.send(obj)` - * Added simple web-service example - -2.3.12 / 2011-06-22 -================== - - * \#express is now on freenode! come join! - * Added `req.get(field, param)` - * Added links to Japanese documentation, thanks @hideyukisaito! - * Added; the `express(1)` generated app outputs the env - * Added `content-negotiation` example - * Dependency: connect >= 1.5.1 < 2.0.0 - * Fixed view layout bug. Closes #720 - * Fixed; ignore body on 304. Closes #701 - -2.3.11 / 2011-06-04 -================== - - * Added `npm test` - * Removed generation of dummy test file from `express(1)` - * Fixed; `express(1)` adds express as a dep - * Fixed; prune on `prepublish` - -2.3.10 / 2011-05-27 -================== - - * Added `req.route`, exposing the current route - * Added _package.json_ generation support to `express(1)` - * Fixed call to `app.param()` function for optional params. Closes #682 - -2.3.9 / 2011-05-25 -================== - - * Fixed bug-ish with `../' in `res.partial()` calls - -2.3.8 / 2011-05-24 -================== - - * Fixed `app.options()` - -2.3.7 / 2011-05-23 -================== - - * Added route `Collection`, ex: `app.get('/user/:id').remove();` - * Added support for `app.param(fn)` to define param logic - * Removed `app.param()` support for callback with return value - * Removed module.parent check from express(1) generated app. Closes #670 - * Refactored router. Closes #639 - -2.3.6 / 2011-05-20 -================== - - * Changed; using devDependencies instead of git submodules - * Fixed redis session example - * Fixed markdown example - * Fixed view caching, should not be enabled in development - -2.3.5 / 2011-05-20 -================== - - * Added export `.view` as alias for `.View` - -2.3.4 / 2011-05-08 -================== - - * Added `./examples/say` - * Fixed `res.sendfile()` bug preventing the transfer of files with spaces - -2.3.3 / 2011-05-03 -================== - - * Added "case sensitive routes" option. - * Changed; split methods supported per rfc [slaskis] - * Fixed route-specific middleware when using the same callback function several times - -2.3.2 / 2011-04-27 -================== - - * Fixed view hints - -2.3.1 / 2011-04-26 -================== - - * Added `app.match()` as `app.match.all()` - * Added `app.lookup()` as `app.lookup.all()` - * Added `app.remove()` for `app.remove.all()` - * Added `app.remove.VERB()` - * Fixed template caching collision issue. Closes #644 - * Moved router over from connect and started refactor - -2.3.0 / 2011-04-25 -================== - - * Added options support to `res.clearCookie()` - * Added `res.helpers()` as alias of `res.locals()` - * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0` - * Changed; auto set Content-Type in res.attachement [Aaron Heckmann] - * Renamed "cache views" to "view cache". Closes #628 - * Fixed caching of views when using several apps. Closes #637 - * Fixed gotcha invoking `app.param()` callbacks once per route middleware. -Closes #638 - * Fixed partial lookup precedence. Closes #631 -Shaw] - -2.2.2 / 2011-04-12 -================== - - * Added second callback support for `res.download()` connection errors - * Fixed `filename` option passing to template engine - -2.2.1 / 2011-04-04 -================== - - * Added `layout(path)` helper to change the layout within a view. Closes #610 - * Fixed `partial()` collection object support. - Previously only anything with `.length` would work. - When `.length` is present one must still be aware of holes, - however now `{ collection: {foo: 'bar'}}` is valid, exposes - `keyInCollection` and `keysInCollection`. - - * Performance improved with better view caching - * Removed `request` and `response` locals - * Changed; errorHandler page title is now `Express` instead of `Connect` - -2.2.0 / 2011-03-30 -================== - - * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606 - * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606 - * Added `app.VERB(path)` as alias of `app.lookup.VERB()`. - * Dependency `connect >= 1.2.0` - -2.1.1 / 2011-03-29 -================== - - * Added; expose `err.view` object when failing to locate a view - * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann] - * Fixed; `res.send(undefined)` responds with 204 [aheckmann] - -2.1.0 / 2011-03-24 -================== - - * Added `/_?` partial lookup support. Closes #447 - * Added `request`, `response`, and `app` local variables - * Added `settings` local variable, containing the app's settings - * Added `req.flash()` exception if `req.session` is not available - * Added `res.send(bool)` support (json response) - * Fixed stylus example for latest version - * Fixed; wrap try/catch around `res.render()` - -2.0.0 / 2011-03-17 -================== - - * Fixed up index view path alternative. - * Changed; `res.locals()` without object returns the locals - -2.0.0rc3 / 2011-03-17 -================== - - * Added `res.locals(obj)` to compliment `res.local(key, val)` - * Added `res.partial()` callback support - * Fixed recursive error reporting issue in `res.render()` - -2.0.0rc2 / 2011-03-17 -================== - - * Changed; `partial()` "locals" are now optional - * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01] - * Fixed .filename view engine option [reported by drudge] - * Fixed blog example - * Fixed `{req,res}.app` reference when mounting [Ben Weaver] - -2.0.0rc / 2011-03-14 -================== - - * Fixed; expose `HTTPSServer` constructor - * Fixed express(1) default test charset. Closes #579 [reported by secoif] - * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP] - -2.0.0beta3 / 2011-03-09 -================== - - * Added support for `res.contentType()` literal - The original `res.contentType('.json')`, - `res.contentType('application/json')`, and `res.contentType('json')` - will work now. - * Added `res.render()` status option support back - * Added charset option for `res.render()` - * Added `.charset` support (via connect 1.0.4) - * Added view resolution hints when in development and a lookup fails - * Added layout lookup support relative to the page view. - For example while rendering `./views/user/index.jade` if you create - `./views/user/layout.jade` it will be used in favour of the root layout. - * Fixed `res.redirect()`. RFC states absolute url [reported by unlink] - * Fixed; default `res.send()` string charset to utf8 - * Removed `Partial` constructor (not currently used) - -2.0.0beta2 / 2011-03-07 -================== - - * Added res.render() `.locals` support back to aid in migration process - * Fixed flash example - -2.0.0beta / 2011-03-03 -================== - - * Added HTTPS support - * Added `res.cookie()` maxAge support - * Added `req.header()` _Referrer_ / _Referer_ special-case, either works - * Added mount support for `res.redirect()`, now respects the mount-point - * Added `union()` util, taking place of `merge(clone())` combo - * Added stylus support to express(1) generated app - * Added secret to session middleware used in examples and generated app - * Added `res.local(name, val)` for progressive view locals - * Added default param support to `req.param(name, default)` - * Added `app.disabled()` and `app.enabled()` - * Added `app.register()` support for omitting leading ".", either works - * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539 - * Added `app.param()` to map route params to async/sync logic - * Added; aliased `app.helpers()` as `app.locals()`. Closes #481 - * Added extname with no leading "." support to `res.contentType()` - * Added `cache views` setting, defaulting to enabled in "production" env - * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_. - * Added `req.accepts()` support for extensions - * Changed; `res.download()` and `res.sendfile()` now utilize Connect's - static file server `connect.static.send()`. - * Changed; replaced `connect.utils.mime()` with npm _mime_ module - * Changed; allow `req.query` to be pre-defined (via middleware or other parent - * Changed view partial resolution, now relative to parent view - * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`. - * Fixed `req.param()` bug returning Array.prototype methods. Closes #552 - * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()` - * Fixed; using _qs_ module instead of _querystring_ - * Fixed; strip unsafe chars from jsonp callbacks - * Removed "stream threshold" setting - -1.0.8 / 2011-03-01 -================== - - * Allow `req.query` to be pre-defined (via middleware or other parent app) - * "connect": ">= 0.5.0 < 1.0.0". Closes #547 - * Removed the long deprecated __EXPRESS_ENV__ support - -1.0.7 / 2011-02-07 -================== - - * Fixed `render()` setting inheritance. - Mounted apps would not inherit "view engine" - -1.0.6 / 2011-02-07 -================== - - * Fixed `view engine` setting bug when period is in dirname - -1.0.5 / 2011-02-05 -================== - - * Added secret to generated app `session()` call - -1.0.4 / 2011-02-05 -================== - - * Added `qs` dependency to _package.json_ - * Fixed namespaced `require()`s for latest connect support - -1.0.3 / 2011-01-13 -================== - - * Remove unsafe characters from JSONP callback names [Ryan Grove] - -1.0.2 / 2011-01-10 -================== - - * Removed nested require, using `connect.router` - -1.0.1 / 2010-12-29 -================== - - * Fixed for middleware stacked via `createServer()` - previously the `foo` middleware passed to `createServer(foo)` - would not have access to Express methods such as `res.send()` - or props like `req.query` etc. - -1.0.0 / 2010-11-16 -================== - - * Added; deduce partial object names from the last segment. - For example by default `partial('forum/post', postObject)` will - give you the _post_ object, providing a meaningful default. - * Added http status code string representation to `res.redirect()` body - * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__. - * Added `req.is()` to aid in content negotiation - * Added partial local inheritance [suggested by masylum]. Closes #102 - providing access to parent template locals. - * Added _-s, --session[s]_ flag to express(1) to add session related middleware - * Added _--template_ flag to express(1) to specify the - template engine to use. - * Added _--css_ flag to express(1) to specify the - stylesheet engine to use (or just plain css by default). - * Added `app.all()` support [thanks aheckmann] - * Added partial direct object support. - You may now `partial('user', user)` providing the "user" local, - vs previously `partial('user', { object: user })`. - * Added _route-separation_ example since many people question ways - to do this with CommonJS modules. Also view the _blog_ example for - an alternative. - * Performance; caching view path derived partial object names - * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454 - * Fixed jsonp support; _text/javascript_ as per mailinglist discussion - -1.0.0rc4 / 2010-10-14 -================== - - * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0 - * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware)) - * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass] - * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass] - * Added `partial()` support for array-like collections. Closes #434 - * Added support for swappable querystring parsers - * Added session usage docs. Closes #443 - * Added dynamic helper caching. Closes #439 [suggested by maritz] - * Added authentication example - * Added basic Range support to `res.sendfile()` (and `res.download()` etc) - * Changed; `express(1)` generated app using 2 spaces instead of 4 - * Default env to "development" again [aheckmann] - * Removed _context_ option is no more, use "scope" - * Fixed; exposing _./support_ libs to examples so they can run without installs - * Fixed mvc example - -1.0.0rc3 / 2010-09-20 -================== - - * Added confirmation for `express(1)` app generation. Closes #391 - * Added extending of flash formatters via `app.flashFormatters` - * Added flash formatter support. Closes #411 - * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold" - * Added _stream threshold_ setting for `res.sendfile()` - * Added `res.send()` __HEAD__ support - * Added `res.clearCookie()` - * Added `res.cookie()` - * Added `res.render()` headers option - * Added `res.redirect()` response bodies - * Added `res.render()` status option support. Closes #425 [thanks aheckmann] - * Fixed `res.sendfile()` responding with 403 on malicious path - * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_ - * Fixed; mounted apps settings now inherit from parent app [aheckmann] - * Fixed; stripping Content-Length / Content-Type when 204 - * Fixed `res.send()` 204. Closes #419 - * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402 - * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo] - - -1.0.0rc2 / 2010-08-17 -================== - - * Added `app.register()` for template engine mapping. Closes #390 - * Added `res.render()` callback support as second argument (no options) - * Added callback support to `res.download()` - * Added callback support for `res.sendfile()` - * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()` - * Added "partials" setting to docs - * Added default expresso tests to `express(1)` generated app. Closes #384 - * Fixed `res.sendfile()` error handling, defer via `next()` - * Fixed `res.render()` callback when a layout is used [thanks guillermo] - * Fixed; `make install` creating ~/.node_libraries when not present - * Fixed issue preventing error handlers from being defined anywhere. Closes #387 - -1.0.0rc / 2010-07-28 -================== - - * Added mounted hook. Closes #369 - * Added connect dependency to _package.json_ - - * Removed "reload views" setting and support code - development env never caches, production always caches. - - * Removed _param_ in route callbacks, signature is now - simply (req, res, next), previously (req, res, params, next). - Use _req.params_ for path captures, _req.query_ for GET params. - - * Fixed "home" setting - * Fixed middleware/router precedence issue. Closes #366 - * Fixed; _configure()_ callbacks called immediately. Closes #368 - -1.0.0beta2 / 2010-07-23 -================== - - * Added more examples - * Added; exporting `Server` constructor - * Added `Server#helpers()` for view locals - * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349 - * Added support for absolute view paths - * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363 - * Added Guillermo Rauch to the contributor list - * Added support for "as" for non-collection partials. Closes #341 - * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf] - * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo] - * Fixed instanceof `Array` checks, now `Array.isArray()` - * Fixed express(1) expansion of public dirs. Closes #348 - * Fixed middleware precedence. Closes #345 - * Fixed view watcher, now async [thanks aheckmann] - -1.0.0beta / 2010-07-15 -================== - - * Re-write - - much faster - - much lighter - - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs - -0.14.0 / 2010-06-15 -================== - - * Utilize relative requires - * Added Static bufferSize option [aheckmann] - * Fixed caching of view and partial subdirectories [aheckmann] - * Fixed mime.type() comments now that ".ext" is not supported - * Updated haml submodule - * Updated class submodule - * Removed bin/express - -0.13.0 / 2010-06-01 -================== - - * Added node v0.1.97 compatibility - * Added support for deleting cookies via Request#cookie('key', null) - * Updated haml submodule - * Fixed not-found page, now using using charset utf-8 - * Fixed show-exceptions page, now using using charset utf-8 - * Fixed view support due to fs.readFile Buffers - * Changed; mime.type() no longer accepts ".type" due to node extname() changes - -0.12.0 / 2010-05-22 -================== - - * Added node v0.1.96 compatibility - * Added view `helpers` export which act as additional local variables - * Updated haml submodule - * Changed ETag; removed inode, modified time only - * Fixed LF to CRLF for setting multiple cookies - * Fixed cookie complation; values are now urlencoded - * Fixed cookies parsing; accepts quoted values and url escaped cookies - -0.11.0 / 2010-05-06 -================== - - * Added support for layouts using different engines - - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' }) - - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml' - - this.render('page.html.haml', { layout: false }) // no layout - * Updated ext submodule - * Updated haml submodule - * Fixed EJS partial support by passing along the context. Issue #307 - -0.10.1 / 2010-05-03 -================== - - * Fixed binary uploads. - -0.10.0 / 2010-04-30 -================== - - * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s - encoding is set to 'utf8' or 'utf-8'. - * Added "encoding" option to Request#render(). Closes #299 - * Added "dump exceptions" setting, which is enabled by default. - * Added simple ejs template engine support - * Added error response support for text/plain, application/json. Closes #297 - * Added callback function param to Request#error() - * Added Request#sendHead() - * Added Request#stream() - * Added support for Request#respond(304, null) for empty response bodies - * Added ETag support to Request#sendfile() - * Added options to Request#sendfile(), passed to fs.createReadStream() - * Added filename arg to Request#download() - * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request - * Performance enhanced by preventing several calls to toLowerCase() in Router#match() - * Changed; Request#sendfile() now streams - * Changed; Renamed Request#halt() to Request#respond(). Closes #289 - * Changed; Using sys.inspect() instead of JSON.encode() for error output - * Changed; run() returns the http.Server instance. Closes #298 - * Changed; Defaulting Server#host to null (INADDR_ANY) - * Changed; Logger "common" format scale of 0.4f - * Removed Logger "request" format - * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found - * Fixed several issues with http client - * Fixed Logger Content-Length output - * Fixed bug preventing Opera from retaining the generated session id. Closes #292 - -0.9.0 / 2010-04-14 -================== - - * Added DSL level error() route support - * Added DSL level notFound() route support - * Added Request#error() - * Added Request#notFound() - * Added Request#render() callback function. Closes #258 - * Added "max upload size" setting - * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254 - * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js - * Added callback function support to Request#halt() as 3rd/4th arg - * Added preprocessing of route param wildcards using param(). Closes #251 - * Added view partial support (with collections etc) - * Fixed bug preventing falsey params (such as ?page=0). Closes #286 - * Fixed setting of multiple cookies. Closes #199 - * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml) - * Changed; session cookie is now httpOnly - * Changed; Request is no longer global - * Changed; Event is no longer global - * Changed; "sys" module is no longer global - * Changed; moved Request#download to Static plugin where it belongs - * Changed; Request instance created before body parsing. Closes #262 - * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253 - * Changed; Pre-caching view partials in memory when "cache view partials" is enabled - * Updated support to node --version 0.1.90 - * Updated dependencies - * Removed set("session cookie") in favour of use(Session, { cookie: { ... }}) - * Removed utils.mixin(); use Object#mergeDeep() - -0.8.0 / 2010-03-19 -================== - - * Added coffeescript example app. Closes #242 - * Changed; cache api now async friendly. Closes #240 - * Removed deprecated 'express/static' support. Use 'express/plugins/static' - -0.7.6 / 2010-03-19 -================== - - * Added Request#isXHR. Closes #229 - * Added `make install` (for the executable) - * Added `express` executable for setting up simple app templates - * Added "GET /public/*" to Static plugin, defaulting to /public - * Added Static plugin - * Fixed; Request#render() only calls cache.get() once - * Fixed; Namespacing View caches with "view:" - * Fixed; Namespacing Static caches with "static:" - * Fixed; Both example apps now use the Static plugin - * Fixed set("views"). Closes #239 - * Fixed missing space for combined log format - * Deprecated Request#sendfile() and 'express/static' - * Removed Server#running - -0.7.5 / 2010-03-16 -================== - - * Added Request#flash() support without args, now returns all flashes - * Updated ext submodule - -0.7.4 / 2010-03-16 -================== - - * Fixed session reaper - * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft) - -0.7.3 / 2010-03-16 -================== - - * Added package.json - * Fixed requiring of haml / sass due to kiwi removal - -0.7.2 / 2010-03-16 -================== - - * Fixed GIT submodules (HAH!) - -0.7.1 / 2010-03-16 -================== - - * Changed; Express now using submodules again until a PM is adopted - * Changed; chat example using millisecond conversions from ext - -0.7.0 / 2010-03-15 -================== - - * Added Request#pass() support (finds the next matching route, or the given path) - * Added Logger plugin (default "common" format replaces CommonLogger) - * Removed Profiler plugin - * Removed CommonLogger plugin - -0.6.0 / 2010-03-11 -================== - - * Added seed.yml for kiwi package management support - * Added HTTP client query string support when method is GET. Closes #205 - - * Added support for arbitrary view engines. - For example "foo.engine.html" will now require('engine'), - the exports from this module are cached after the first require(). - - * Added async plugin support - - * Removed usage of RESTful route funcs as http client - get() etc, use http.get() and friends - - * Removed custom exceptions - -0.5.0 / 2010-03-10 -================== - - * Added ext dependency (library of js extensions) - * Removed extname() / basename() utils. Use path module - * Removed toArray() util. Use arguments.values - * Removed escapeRegexp() util. Use RegExp.escape() - * Removed process.mixin() dependency. Use utils.mixin() - * Removed Collection - * Removed ElementCollection - * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com) ;) - -0.4.0 / 2010-02-11 -================== - - * Added flash() example to sample upload app - * Added high level restful http client module (express/http) - * Changed; RESTful route functions double as HTTP clients. Closes #69 - * Changed; throwing error when routes are added at runtime - * Changed; defaulting render() context to the current Request. Closes #197 - * Updated haml submodule - -0.3.0 / 2010-02-11 -================== - - * Updated haml / sass submodules. Closes #200 - * Added flash message support. Closes #64 - * Added accepts() now allows multiple args. fixes #117 - * Added support for plugins to halt. Closes #189 - * Added alternate layout support. Closes #119 - * Removed Route#run(). Closes #188 - * Fixed broken specs due to use(Cookie) missing - -0.2.1 / 2010-02-05 -================== - - * Added "plot" format option for Profiler (for gnuplot processing) - * Added request number to Profiler plugin - * Fixed binary encoding for multi-part file uploads, was previously defaulting to UTF8 - * Fixed issue with routes not firing when not files are present. Closes #184 - * Fixed process.Promise -> events.Promise - -0.2.0 / 2010-02-03 -================== - - * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180 - * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174 - * Added expiration support to cache api with reaper. Closes #133 - * Added cache Store.Memory#reap() - * Added Cache; cache api now uses first class Cache instances - * Added abstract session Store. Closes #172 - * Changed; cache Memory.Store#get() utilizing Collection - * Renamed MemoryStore -> Store.Memory - * Fixed use() of the same plugin several time will always use latest options. Closes #176 - -0.1.0 / 2010-02-03 -================== - - * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context - * Updated node support to 0.1.27 Closes #169 - * Updated dirname(__filename) -> __dirname - * Updated libxmljs support to v0.2.0 - * Added session support with memory store / reaping - * Added quick uid() helper - * Added multi-part upload support - * Added Sass.js support / submodule - * Added production env caching view contents and static files - * Added static file caching. Closes #136 - * Added cache plugin with memory stores - * Added support to StaticFile so that it works with non-textual files. - * Removed dirname() helper - * Removed several globals (now their modules must be required) - -0.0.2 / 2010-01-10 -================== - - * Added view benchmarks; currently haml vs ejs - * Added Request#attachment() specs. Closes #116 - * Added use of node's parseQuery() util. Closes #123 - * Added `make init` for submodules - * Updated Haml - * Updated sample chat app to show messages on load - * Updated libxmljs parseString -> parseHtmlString - * Fixed `make init` to work with older versions of git - * Fixed specs can now run independent 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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/LICENSE deleted file mode 100644 index aa927e4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -(The MIT License) - -Copyright (c) 2009-2014 TJ Holowaychuk -Copyright (c) 2013-2014 Roman Shtylman -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/Readme.md deleted file mode 100644 index 8da83a5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/Readme.md +++ /dev/null @@ -1,138 +0,0 @@ -[![Express Logo](https://i.cloudup.com/zfY6lL7eFa-3000x3000.png)](http://expressjs.com/) - - Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). - - [![NPM Version][npm-image]][npm-url] - [![NPM Downloads][downloads-image]][downloads-url] - [![Linux Build][travis-image]][travis-url] - [![Windows Build][appveyor-image]][appveyor-url] - [![Test Coverage][coveralls-image]][coveralls-url] - -```js -var express = require('express') -var app = express() - -app.get('/', function (req, res) { - res.send('Hello World') -}) - -app.listen(3000) -``` - -## Installation - -```bash -$ npm install express -``` - -## Features - - * Robust routing - * Focus on high performance - * Super-high test coverage - * HTTP helpers (redirection, caching, etc) - * View system supporting 14+ template engines - * Content negotiation - * Executable for generating applications quickly - -## Docs & Community - - * [Website and Documentation](http://expressjs.com/) - [[website repo](https://github.com/strongloop/expressjs.com)] - * [#express](https://webchat.freenode.net/?channels=express) on freenode IRC - * [Github Organization](https://github.com/expressjs) for Official Middleware & Modules - * Visit the [Wiki](https://github.com/strongloop/express/wiki) - * [Google Group](https://groups.google.com/group/express-js) for discussion - * [Русскоязычная документация](http://jsman.ru/express/) - * [한국어 문서](http://expressjs.kr) - [[website repo](https://github.com/Hanul/expressjs.kr)] - -**PROTIP** Be sure to read [Migrating from 3.x to 4.x](https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x) as well as [New features in 4.x](https://github.com/strongloop/express/wiki/New-features-in-4.x). - -## Quick Start - - The quickest way to get started with express is to utilize the executable [`express(1)`](https://github.com/expressjs/generator) to generate an application as shown below: - - Install the executable. The executable's major version will match Express's: - -```bash -$ npm install -g express-generator@4 -``` - - Create the app: - -```bash -$ express /tmp/foo && cd /tmp/foo -``` - - Install dependencies: - -```bash -$ npm install -``` - - Start the server: - -```bash -$ npm start -``` - -## Philosophy - - The Express philosophy is to provide small, robust tooling for HTTP servers, making - it a great solution for single page applications, web sites, hybrids, or public - HTTP APIs. - - Express does not force you to use any specific ORM or template engine. With support for over - 14 template engines via [Consolidate.js](https://github.com/tj/consolidate.js), - you can quickly craft your perfect framework. - -## Examples - - To view the examples, clone the Express repo and install the dependencies: - -```bash -$ git clone git://github.com/strongloop/express.git --depth 1 -$ cd express -$ npm install -``` - - Then run whichever example you want: - -```bash -$ node examples/content-negotiation -``` - -## Tests - - To run the test suite, first install the dependencies, then run `npm test`: - -```bash -$ npm install -$ npm test -``` - -## People - -The original author of Express is [TJ Holowaychuk](https://github.com/tj) [![TJ's Gratipay][gratipay-image-visionmedia]][gratipay-url-visionmedia] - -The current lead maintainer is [Douglas Christopher Wilson](https://github.com/dougwilson) [![Doug's Gratipay][gratipay-image-dougwilson]][gratipay-url-dougwilson] - -[List of all contributors](https://github.com/strongloop/express/graphs/contributors) - -## License - - [MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/express.svg -[npm-url]: https://npmjs.org/package/express -[downloads-image]: https://img.shields.io/npm/dm/express.svg -[downloads-url]: https://npmjs.org/package/express -[travis-image]: https://img.shields.io/travis/strongloop/express/master.svg?label=linux -[travis-url]: https://travis-ci.org/strongloop/express -[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/express/master.svg?label=windows -[appveyor-url]: https://ci.appveyor.com/project/dougwilson/express -[coveralls-image]: https://img.shields.io/coveralls/strongloop/express/master.svg -[coveralls-url]: https://coveralls.io/r/strongloop/express?branch=master -[gratipay-image-visionmedia]: https://img.shields.io/gratipay/visionmedia.svg -[gratipay-url-visionmedia]: https://gratipay.com/visionmedia/ -[gratipay-image-dougwilson]: https://img.shields.io/gratipay/dougwilson.svg -[gratipay-url-dougwilson]: https://gratipay.com/dougwilson/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/index.js deleted file mode 100644 index d219b0c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -module.exports = require('./lib/express'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/application.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/application.js deleted file mode 100644 index a9df910..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/application.js +++ /dev/null @@ -1,643 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var finalhandler = require('finalhandler'); -var Router = require('./router'); -var methods = require('methods'); -var middleware = require('./middleware/init'); -var query = require('./middleware/query'); -var debug = require('debug')('express:application'); -var View = require('./view'); -var http = require('http'); -var compileETag = require('./utils').compileETag; -var compileQueryParser = require('./utils').compileQueryParser; -var compileTrust = require('./utils').compileTrust; -var deprecate = require('depd')('express'); -var flatten = require('array-flatten'); -var merge = require('utils-merge'); -var resolve = require('path').resolve; -var slice = Array.prototype.slice; - -/** - * Application prototype. - */ - -var app = exports = module.exports = {}; - -/** - * Variable for trust proxy inheritance back-compat - * @private - */ - -var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default'; - -/** - * Initialize the server. - * - * - setup default configuration - * - setup default middleware - * - setup route reflection methods - * - * @private - */ - -app.init = function init() { - this.cache = {}; - this.engines = {}; - this.settings = {}; - - this.defaultConfiguration(); -}; - -/** - * Initialize application configuration. - * @private - */ - -app.defaultConfiguration = function defaultConfiguration() { - var env = process.env.NODE_ENV || 'development'; - - // default settings - this.enable('x-powered-by'); - this.set('etag', 'weak'); - this.set('env', env); - this.set('query parser', 'extended'); - this.set('subdomain offset', 2); - this.set('trust proxy', false); - - // trust proxy inherit back-compat - Object.defineProperty(this.settings, trustProxyDefaultSymbol, { - configurable: true, - value: true - }); - - debug('booting in %s mode', env); - - this.on('mount', function onmount(parent) { - // inherit trust proxy - if (this.settings[trustProxyDefaultSymbol] === true - && typeof parent.settings['trust proxy fn'] === 'function') { - delete this.settings['trust proxy']; - delete this.settings['trust proxy fn']; - } - - // inherit protos - this.request.__proto__ = parent.request; - this.response.__proto__ = parent.response; - this.engines.__proto__ = parent.engines; - this.settings.__proto__ = parent.settings; - }); - - // setup locals - this.locals = Object.create(null); - - // top-most app is mounted at / - this.mountpath = '/'; - - // default locals - this.locals.settings = this.settings; - - // default configuration - this.set('view', View); - this.set('views', resolve('views')); - this.set('jsonp callback name', 'callback'); - - if (env === 'production') { - this.enable('view cache'); - } - - Object.defineProperty(this, 'router', { - get: function() { - throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.'); - } - }); -}; - -/** - * lazily adds the base router if it has not yet been added. - * - * We cannot add the base router in the defaultConfiguration because - * it reads app settings which might be set after that has run. - * - * @private - */ -app.lazyrouter = function lazyrouter() { - if (!this._router) { - this._router = new Router({ - caseSensitive: this.enabled('case sensitive routing'), - strict: this.enabled('strict routing') - }); - - this._router.use(query(this.get('query parser fn'))); - this._router.use(middleware.init(this)); - } -}; - -/** - * Dispatch a req, res pair into the application. Starts pipeline processing. - * - * If no callback is provided, then default error handlers will respond - * in the event of an error bubbling through the stack. - * - * @private - */ - -app.handle = function handle(req, res, callback) { - var router = this._router; - - // final handler - var done = callback || finalhandler(req, res, { - env: this.get('env'), - onerror: logerror.bind(this) - }); - - // no routes - if (!router) { - debug('no routes defined on app'); - done(); - return; - } - - router.handle(req, res, done); -}; - -/** - * Proxy `Router#use()` to add middleware to the app router. - * See Router#use() documentation for details. - * - * If the _fn_ parameter is an express app, then it will be - * mounted at the _route_ specified. - * - * @public - */ - -app.use = function use(fn) { - var offset = 0; - var path = '/'; - - // default path to '/' - // disambiguate app.use([fn]) - if (typeof fn !== 'function') { - var arg = fn; - - while (Array.isArray(arg) && arg.length !== 0) { - arg = arg[0]; - } - - // first arg is the path - if (typeof arg !== 'function') { - offset = 1; - path = fn; - } - } - - var fns = flatten(slice.call(arguments, offset)); - - if (fns.length === 0) { - throw new TypeError('app.use() requires middleware functions'); - } - - // setup router - this.lazyrouter(); - var router = this._router; - - fns.forEach(function (fn) { - // non-express app - if (!fn || !fn.handle || !fn.set) { - return router.use(path, fn); - } - - debug('.use app under %s', path); - fn.mountpath = path; - fn.parent = this; - - // restore .app property on req and res - router.use(path, function mounted_app(req, res, next) { - var orig = req.app; - fn.handle(req, res, function (err) { - req.__proto__ = orig.request; - res.__proto__ = orig.response; - next(err); - }); - }); - - // mounted an app - fn.emit('mount', this); - }, this); - - return this; -}; - -/** - * Proxy to the app `Router#route()` - * Returns a new `Route` instance for the _path_. - * - * Routes are isolated middleware stacks for specific paths. - * See the Route api docs for details. - * - * @public - */ - -app.route = function route(path) { - this.lazyrouter(); - return this._router.route(path); -}; - -/** - * Register the given template engine callback `fn` - * as `ext`. - * - * By default will `require()` the engine based on the - * file extension. For example if you try to render - * a "foo.jade" file Express will invoke the following internally: - * - * app.engine('jade', require('jade').__express); - * - * For engines that do not provide `.__express` out of the box, - * or if you wish to "map" a different extension to the template engine - * you may use this method. For example mapping the EJS template engine to - * ".html" files: - * - * app.engine('html', require('ejs').renderFile); - * - * In this case EJS provides a `.renderFile()` method with - * the same signature that Express expects: `(path, options, callback)`, - * though note that it aliases this method as `ejs.__express` internally - * so if you're using ".ejs" extensions you dont need to do anything. - * - * Some template engines do not follow this convention, the - * [Consolidate.js](https://github.com/tj/consolidate.js) - * library was created to map all of node's popular template - * engines to follow this convention, thus allowing them to - * work seamlessly within Express. - * - * @param {String} ext - * @param {Function} fn - * @return {app} for chaining - * @public - */ - -app.engine = function engine(ext, fn) { - if (typeof fn !== 'function') { - throw new Error('callback function required'); - } - - // get file extension - var extension = ext[0] !== '.' - ? '.' + ext - : ext; - - // store engine - this.engines[extension] = fn; - - return this; -}; - -/** - * Proxy to `Router#param()` with one added api feature. The _name_ parameter - * can be an array of names. - * - * See the Router#param() docs for more details. - * - * @param {String|Array} name - * @param {Function} fn - * @return {app} for chaining - * @public - */ - -app.param = function param(name, fn) { - this.lazyrouter(); - - if (Array.isArray(name)) { - for (var i = 0; i < name.length; i++) { - this.param(name[i], fn); - } - - return this; - } - - this._router.param(name, fn); - - return this; -}; - -/** - * Assign `setting` to `val`, or return `setting`'s value. - * - * app.set('foo', 'bar'); - * app.get('foo'); - * // => "bar" - * - * Mounted servers inherit their parent server's settings. - * - * @param {String} setting - * @param {*} [val] - * @return {Server} for chaining - * @public - */ - -app.set = function set(setting, val) { - if (arguments.length === 1) { - // app.get(setting) - return this.settings[setting]; - } - - debug('set "%s" to %o', setting, val); - - // set value - this.settings[setting] = val; - - // trigger matched settings - switch (setting) { - case 'etag': - this.set('etag fn', compileETag(val)); - break; - case 'query parser': - this.set('query parser fn', compileQueryParser(val)); - break; - case 'trust proxy': - this.set('trust proxy fn', compileTrust(val)); - - // trust proxy inherit back-compat - Object.defineProperty(this.settings, trustProxyDefaultSymbol, { - configurable: true, - value: false - }); - - break; - } - - return this; -}; - -/** - * Return the app's absolute pathname - * based on the parent(s) that have - * mounted it. - * - * For example if the application was - * mounted as "/admin", which itself - * was mounted as "/blog" then the - * return value would be "/blog/admin". - * - * @return {String} - * @private - */ - -app.path = function path() { - return this.parent - ? this.parent.path() + this.mountpath - : ''; -}; - -/** - * Check if `setting` is enabled (truthy). - * - * app.enabled('foo') - * // => false - * - * app.enable('foo') - * app.enabled('foo') - * // => true - * - * @param {String} setting - * @return {Boolean} - * @public - */ - -app.enabled = function enabled(setting) { - return Boolean(this.set(setting)); -}; - -/** - * Check if `setting` is disabled. - * - * app.disabled('foo') - * // => true - * - * app.enable('foo') - * app.disabled('foo') - * // => false - * - * @param {String} setting - * @return {Boolean} - * @public - */ - -app.disabled = function disabled(setting) { - return !this.set(setting); -}; - -/** - * Enable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @public - */ - -app.enable = function enable(setting) { - return this.set(setting, true); -}; - -/** - * Disable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @public - */ - -app.disable = function disable(setting) { - return this.set(setting, false); -}; - -/** - * Delegate `.VERB(...)` calls to `router.VERB(...)`. - */ - -methods.forEach(function(method){ - app[method] = function(path){ - if (method === 'get' && arguments.length === 1) { - // app.get(setting) - return this.set(path); - } - - this.lazyrouter(); - - var route = this._router.route(path); - route[method].apply(route, slice.call(arguments, 1)); - return this; - }; -}); - -/** - * Special-cased "all" method, applying the given route `path`, - * middleware, and callback to _every_ HTTP method. - * - * @param {String} path - * @param {Function} ... - * @return {app} for chaining - * @public - */ - -app.all = function all(path) { - this.lazyrouter(); - - var route = this._router.route(path); - var args = slice.call(arguments, 1); - - for (var i = 0; i < methods.length; i++) { - route[methods[i]].apply(route, args); - } - - return this; -}; - -// del -> delete alias - -app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead'); - -/** - * Render the given view `name` name with `options` - * and a callback accepting an error and the - * rendered template string. - * - * Example: - * - * app.render('email', { name: 'Tobi' }, function(err, html){ - * // ... - * }) - * - * @param {String} name - * @param {String|Function} options or fn - * @param {Function} callback - * @public - */ - -app.render = function render(name, options, callback) { - var cache = this.cache; - var done = callback; - var engines = this.engines; - var opts = options; - var renderOptions = {}; - var view; - - // support callback function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - // merge app.locals - merge(renderOptions, this.locals); - - // merge options._locals - if (opts._locals) { - merge(renderOptions, opts._locals); - } - - // merge options - merge(renderOptions, opts); - - // set .cache unless explicitly provided - if (renderOptions.cache == null) { - renderOptions.cache = this.enabled('view cache'); - } - - // primed cache - if (renderOptions.cache) { - view = cache[name]; - } - - // view - if (!view) { - var View = this.get('view'); - - view = new View(name, { - defaultEngine: this.get('view engine'), - root: this.get('views'), - engines: engines - }); - - if (!view.path) { - var dirs = Array.isArray(view.root) && view.root.length > 1 - ? 'directories "' + view.root.slice(0, -1).join('", "') + '" or "' + view.root[view.root.length - 1] + '"' - : 'directory "' + view.root + '"' - var err = new Error('Failed to lookup view "' + name + '" in views ' + dirs); - err.view = view; - return done(err); - } - - // prime the cache - if (renderOptions.cache) { - cache[name] = view; - } - } - - // render - tryRender(view, renderOptions, done); -}; - -/** - * Listen for connections. - * - * A node `http.Server` is returned, with this - * application (which is a `Function`) as its - * callback. If you wish to create both an HTTP - * and HTTPS server you may do so with the "http" - * and "https" modules as shown here: - * - * var http = require('http') - * , https = require('https') - * , express = require('express') - * , app = express(); - * - * http.createServer(app).listen(80); - * https.createServer({ ... }, app).listen(443); - * - * @return {http.Server} - * @public - */ - -app.listen = function listen() { - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; - -/** - * Log error using console.error. - * - * @param {Error} err - * @private - */ - -function logerror(err) { - /* istanbul ignore next */ - if (this.get('env') !== 'test') console.error(err.stack || err.toString()); -} - -/** - * Try rendering a view. - * @private - */ - -function tryRender(view, options, callback) { - try { - view.render(options, callback); - } catch (err) { - callback(err); - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/express.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/express.js deleted file mode 100644 index 540c8be..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/express.js +++ /dev/null @@ -1,103 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter; -var mixin = require('merge-descriptors'); -var proto = require('./application'); -var Route = require('./router/route'); -var Router = require('./router'); -var req = require('./request'); -var res = require('./response'); - -/** - * Expose `createApplication()`. - */ - -exports = module.exports = createApplication; - -/** - * Create an express application. - * - * @return {Function} - * @api public - */ - -function createApplication() { - var app = function(req, res, next) { - app.handle(req, res, next); - }; - - mixin(app, EventEmitter.prototype, false); - mixin(app, proto, false); - - app.request = { __proto__: req, app: app }; - app.response = { __proto__: res, app: app }; - app.init(); - return app; -} - -/** - * Expose the prototypes. - */ - -exports.application = proto; -exports.request = req; -exports.response = res; - -/** - * Expose constructors. - */ - -exports.Route = Route; -exports.Router = Router; - -/** - * Expose middleware - */ - -exports.query = require('./middleware/query'); -exports.static = require('serve-static'); - -/** - * Replace removed middleware with an appropriate error message. - */ - -[ - 'json', - 'urlencoded', - 'bodyParser', - 'compress', - 'cookieSession', - 'session', - 'logger', - 'cookieParser', - 'favicon', - 'responseTime', - 'errorHandler', - 'timeout', - 'methodOverride', - 'vhost', - 'csrf', - 'directory', - 'limit', - 'multipart', - 'staticCache', -].forEach(function (name) { - Object.defineProperty(exports, name, { - get: function () { - throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.'); - }, - configurable: true - }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/middleware/init.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/middleware/init.js deleted file mode 100644 index f3119ed..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/middleware/init.js +++ /dev/null @@ -1,36 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Initialization middleware, exposing the - * request and response to each other, as well - * as defaulting the X-Powered-By header field. - * - * @param {Function} app - * @return {Function} - * @api private - */ - -exports.init = function(app){ - return function expressInit(req, res, next){ - if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); - req.res = res; - res.req = req; - req.next = next; - - req.__proto__ = app.request; - res.__proto__ = app.response; - - res.locals = res.locals || Object.create(null); - - next(); - }; -}; - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/middleware/query.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/middleware/query.js deleted file mode 100644 index a665f3f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/middleware/query.js +++ /dev/null @@ -1,51 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - */ - -var parseUrl = require('parseurl'); -var qs = require('qs'); - -/** - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function query(options) { - var opts = Object.create(options || null); - var queryparse = qs.parse; - - if (typeof options === 'function') { - queryparse = options; - opts = undefined; - } - - if (opts !== undefined) { - if (opts.allowDots === undefined) { - opts.allowDots = false; - } - - if (opts.allowPrototypes === undefined) { - opts.allowPrototypes = true; - } - } - - return function query(req, res, next){ - if (!req.query) { - var val = parseUrl(req).query; - req.query = queryparse(val, opts); - } - - next(); - }; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/request.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/request.js deleted file mode 100644 index 33cac18..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/request.js +++ /dev/null @@ -1,489 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var accepts = require('accepts'); -var deprecate = require('depd')('express'); -var isIP = require('net').isIP; -var typeis = require('type-is'); -var http = require('http'); -var fresh = require('fresh'); -var parseRange = require('range-parser'); -var parse = require('parseurl'); -var proxyaddr = require('proxy-addr'); - -/** - * Request prototype. - */ - -var req = exports = module.exports = { - __proto__: http.IncomingMessage.prototype -}; - -/** - * Return request header. - * - * The `Referrer` header field is special-cased, - * both `Referrer` and `Referer` are interchangeable. - * - * Examples: - * - * req.get('Content-Type'); - * // => "text/plain" - * - * req.get('content-type'); - * // => "text/plain" - * - * req.get('Something'); - * // => undefined - * - * Aliased as `req.header()`. - * - * @param {String} name - * @return {String} - * @public - */ - -req.get = -req.header = function header(name) { - var lc = name.toLowerCase(); - - switch (lc) { - case 'referer': - case 'referrer': - return this.headers.referrer - || this.headers.referer; - default: - return this.headers[lc]; - } -}; - -/** - * To do: update docs. - * - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single MIME type string - * such as "application/json", an extension name - * such as "json", a comma-delimited list such as "json, html, text/plain", - * an argument list such as `"json", "html", "text/plain"`, - * or an array `["json", "html", "text/plain"]`. When a list - * or array is given, the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * req.accepts('html'); - * // => "html" - * - * // Accept: text/*, application/json - * req.accepts('html'); - * // => "html" - * req.accepts('text/html'); - * // => "text/html" - * req.accepts('json, text'); - * // => "json" - * req.accepts('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * req.accepts('image/png'); - * req.accepts('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * req.accepts(['html', 'json']); - * req.accepts('html', 'json'); - * req.accepts('html, json'); - * // => "json" - * - * @param {String|Array} type(s) - * @return {String|Array|Boolean} - * @public - */ - -req.accepts = function(){ - var accept = accepts(this); - return accept.types.apply(accept, arguments); -}; - -/** - * Check if the given `encoding`s are accepted. - * - * @param {String} ...encoding - * @return {String|Array} - * @public - */ - -req.acceptsEncodings = function(){ - var accept = accepts(this); - return accept.encodings.apply(accept, arguments); -}; - -req.acceptsEncoding = deprecate.function(req.acceptsEncodings, - 'req.acceptsEncoding: Use acceptsEncodings instead'); - -/** - * Check if the given `charset`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...charset - * @return {String|Array} - * @public - */ - -req.acceptsCharsets = function(){ - var accept = accepts(this); - return accept.charsets.apply(accept, arguments); -}; - -req.acceptsCharset = deprecate.function(req.acceptsCharsets, - 'req.acceptsCharset: Use acceptsCharsets instead'); - -/** - * Check if the given `lang`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...lang - * @return {String|Array} - * @public - */ - -req.acceptsLanguages = function(){ - var accept = accepts(this); - return accept.languages.apply(accept, arguments); -}; - -req.acceptsLanguage = deprecate.function(req.acceptsLanguages, - 'req.acceptsLanguage: Use acceptsLanguages instead'); - -/** - * Parse Range header field, - * capping to the given `size`. - * - * Unspecified ranges such as "0-" require - * knowledge of your resource length. In - * the case of a byte range this is of course - * the total number of bytes. If the Range - * header field is not given `null` is returned, - * `-1` when unsatisfiable, `-2` when syntactically invalid. - * - * NOTE: remember that ranges are inclusive, so - * for example "Range: users=0-3" should respond - * with 4 users when available, not 3. - * - * @param {Number} size - * @return {Array} - * @public - */ - -req.range = function(size){ - var range = this.get('Range'); - if (!range) return; - return parseRange(size, range); -}; - -/** - * Return the value of param `name` when present or `defaultValue`. - * - * - Checks route placeholders, ex: _/user/:id_ - * - Checks body params, ex: id=12, {"id":12} - * - Checks query string params, ex: ?id=12 - * - * To utilize request bodies, `req.body` - * should be an object. This can be done by using - * the `bodyParser()` middleware. - * - * @param {String} name - * @param {Mixed} [defaultValue] - * @return {String} - * @public - */ - -req.param = function param(name, defaultValue) { - var params = this.params || {}; - var body = this.body || {}; - var query = this.query || {}; - - var args = arguments.length === 1 - ? 'name' - : 'name, default'; - deprecate('req.param(' + args + '): Use req.params, req.body, or req.query instead'); - - if (null != params[name] && params.hasOwnProperty(name)) return params[name]; - if (null != body[name]) return body[name]; - if (null != query[name]) return query[name]; - - return defaultValue; -}; - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains the give mime `type`. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * req.is('html'); - * req.is('text/html'); - * req.is('text/*'); - * // => true - * - * // When Content-Type is application/json - * req.is('json'); - * req.is('application/json'); - * req.is('application/*'); - * // => true - * - * req.is('html'); - * // => false - * - * @param {String|Array} types... - * @return {String|false|null} - * @public - */ - -req.is = function is(types) { - var arr = types; - - // support flattened arguments - if (!Array.isArray(types)) { - arr = new Array(arguments.length); - for (var i = 0; i < arr.length; i++) { - arr[i] = arguments[i]; - } - } - - return typeis(this, arr); -}; - -/** - * Return the protocol string "http" or "https" - * when requested with TLS. When the "trust proxy" - * setting trusts the socket address, the - * "X-Forwarded-Proto" header field will be trusted - * and used if present. - * - * If you're running behind a reverse proxy that - * supplies https for you this may be enabled. - * - * @return {String} - * @public - */ - -defineGetter(req, 'protocol', function protocol(){ - var proto = this.connection.encrypted - ? 'https' - : 'http'; - var trust = this.app.get('trust proxy fn'); - - if (!trust(this.connection.remoteAddress, 0)) { - return proto; - } - - // Note: X-Forwarded-Proto is normally only ever a - // single value, but this is to be safe. - proto = this.get('X-Forwarded-Proto') || proto; - return proto.split(/\s*,\s*/)[0]; -}); - -/** - * Short-hand for: - * - * req.protocol == 'https' - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'secure', function secure(){ - return this.protocol === 'https'; -}); - -/** - * Return the remote address from the trusted proxy. - * - * The is the remote address on the socket unless - * "trust proxy" is set. - * - * @return {String} - * @public - */ - -defineGetter(req, 'ip', function ip(){ - var trust = this.app.get('trust proxy fn'); - return proxyaddr(this, trust); -}); - -/** - * When "trust proxy" is set, trusted proxy addresses + client. - * - * For example if the value were "client, proxy1, proxy2" - * you would receive the array `["client", "proxy1", "proxy2"]` - * where "proxy2" is the furthest down-stream and "proxy1" and - * "proxy2" were trusted. - * - * @return {Array} - * @public - */ - -defineGetter(req, 'ips', function ips() { - var trust = this.app.get('trust proxy fn'); - var addrs = proxyaddr.all(this, trust); - return addrs.slice(1).reverse(); -}); - -/** - * Return subdomains as an array. - * - * Subdomains are the dot-separated parts of the host before the main domain of - * the app. By default, the domain of the app is assumed to be the last two - * parts of the host. This can be changed by setting "subdomain offset". - * - * For example, if the domain is "tobi.ferrets.example.com": - * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. - * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. - * - * @return {Array} - * @public - */ - -defineGetter(req, 'subdomains', function subdomains() { - var hostname = this.hostname; - - if (!hostname) return []; - - var offset = this.app.get('subdomain offset'); - var subdomains = !isIP(hostname) - ? hostname.split('.').reverse() - : [hostname]; - - return subdomains.slice(offset); -}); - -/** - * Short-hand for `url.parse(req.url).pathname`. - * - * @return {String} - * @public - */ - -defineGetter(req, 'path', function path() { - return parse(this).pathname; -}); - -/** - * Parse the "Host" header field to a hostname. - * - * When the "trust proxy" setting trusts the socket - * address, the "X-Forwarded-Host" header field will - * be trusted. - * - * @return {String} - * @public - */ - -defineGetter(req, 'hostname', function hostname(){ - var trust = this.app.get('trust proxy fn'); - var host = this.get('X-Forwarded-Host'); - - if (!host || !trust(this.connection.remoteAddress, 0)) { - host = this.get('Host'); - } - - if (!host) return; - - // IPv6 literal support - var offset = host[0] === '[' - ? host.indexOf(']') + 1 - : 0; - var index = host.indexOf(':', offset); - - return index !== -1 - ? host.substring(0, index) - : host; -}); - -// TODO: change req.host to return host in next major - -defineGetter(req, 'host', deprecate.function(function host(){ - return this.hostname; -}, 'req.host: Use req.hostname instead')); - -/** - * Check if the request is fresh, aka - * Last-Modified and/or the ETag - * still match. - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'fresh', function(){ - var method = this.method; - var s = this.res.statusCode; - - // GET or HEAD for weak freshness validation only - if ('GET' != method && 'HEAD' != method) return false; - - // 2xx or 304 as per rfc2616 14.26 - if ((s >= 200 && s < 300) || 304 == s) { - return fresh(this.headers, (this.res._headers || {})); - } - - return false; -}); - -/** - * Check if the request is stale, aka - * "Last-Modified" and / or the "ETag" for the - * resource has changed. - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'stale', function stale(){ - return !this.fresh; -}); - -/** - * Check if the request was an _XMLHttpRequest_. - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'xhr', function xhr(){ - var val = this.get('X-Requested-With') || ''; - return val.toLowerCase() === 'xmlhttprequest'; -}); - -/** - * Helper function for creating a getter on an object. - * - * @param {Object} obj - * @param {String} name - * @param {Function} getter - * @private - */ -function defineGetter(obj, name, getter) { - Object.defineProperty(obj, name, { - configurable: true, - enumerable: true, - get: getter - }); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/response.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/response.js deleted file mode 100644 index 641704b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/response.js +++ /dev/null @@ -1,1053 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var contentDisposition = require('content-disposition'); -var deprecate = require('depd')('express'); -var escapeHtml = require('escape-html'); -var http = require('http'); -var isAbsolute = require('./utils').isAbsolute; -var onFinished = require('on-finished'); -var path = require('path'); -var merge = require('utils-merge'); -var sign = require('cookie-signature').sign; -var normalizeType = require('./utils').normalizeType; -var normalizeTypes = require('./utils').normalizeTypes; -var setCharset = require('./utils').setCharset; -var statusCodes = http.STATUS_CODES; -var cookie = require('cookie'); -var send = require('send'); -var extname = path.extname; -var mime = send.mime; -var resolve = path.resolve; -var vary = require('vary'); - -/** - * Response prototype. - */ - -var res = module.exports = { - __proto__: http.ServerResponse.prototype -}; - -/** - * Module variables. - * @private - */ - -var charsetRegExp = /;\s*charset\s*=/; - -/** - * Set status `code`. - * - * @param {Number} code - * @return {ServerResponse} - * @public - */ - -res.status = function status(code) { - this.statusCode = code; - return this; -}; - -/** - * Set Link header field with the given `links`. - * - * Examples: - * - * res.links({ - * next: 'http://api.example.com/users?page=2', - * last: 'http://api.example.com/users?page=5' - * }); - * - * @param {Object} links - * @return {ServerResponse} - * @public - */ - -res.links = function(links){ - var link = this.get('Link') || ''; - if (link) link += ', '; - return this.set('Link', link + Object.keys(links).map(function(rel){ - return '<' + links[rel] + '>; rel="' + rel + '"'; - }).join(', ')); -}; - -/** - * Send a response. - * - * Examples: - * - * res.send(new Buffer('wahoo')); - * res.send({ some: 'json' }); - * res.send('

some html

'); - * - * @param {string|number|boolean|object|Buffer} body - * @public - */ - -res.send = function send(body) { - var chunk = body; - var encoding; - var len; - var req = this.req; - var type; - - // settings - var app = this.app; - - // allow status / body - if (arguments.length === 2) { - // res.send(body, status) backwards compat - if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') { - deprecate('res.send(body, status): Use res.status(status).send(body) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.send(status, body): Use res.status(status).send(body) instead'); - this.statusCode = arguments[0]; - chunk = arguments[1]; - } - } - - // disambiguate res.send(status) and res.send(status, num) - if (typeof chunk === 'number' && arguments.length === 1) { - // res.send(status) will set status message as text string - if (!this.get('Content-Type')) { - this.type('txt'); - } - - deprecate('res.send(status): Use res.sendStatus(status) instead'); - this.statusCode = chunk; - chunk = statusCodes[chunk]; - } - - switch (typeof chunk) { - // string defaulting to html - case 'string': - if (!this.get('Content-Type')) { - this.type('html'); - } - break; - case 'boolean': - case 'number': - case 'object': - if (chunk === null) { - chunk = ''; - } else if (Buffer.isBuffer(chunk)) { - if (!this.get('Content-Type')) { - this.type('bin'); - } - } else { - return this.json(chunk); - } - break; - } - - // write strings in utf-8 - if (typeof chunk === 'string') { - encoding = 'utf8'; - type = this.get('Content-Type'); - - // reflect this in content-type - if (typeof type === 'string') { - this.set('Content-Type', setCharset(type, 'utf-8')); - } - } - - // populate Content-Length - if (chunk !== undefined) { - if (!Buffer.isBuffer(chunk)) { - // convert chunk to Buffer; saves later double conversions - chunk = new Buffer(chunk, encoding); - encoding = undefined; - } - - len = chunk.length; - this.set('Content-Length', len); - } - - // populate ETag - var etag; - var generateETag = len !== undefined && app.get('etag fn'); - if (typeof generateETag === 'function' && !this.get('ETag')) { - if ((etag = generateETag(chunk, encoding))) { - this.set('ETag', etag); - } - } - - // freshness - if (req.fresh) this.statusCode = 304; - - // strip irrelevant headers - if (204 == this.statusCode || 304 == this.statusCode) { - this.removeHeader('Content-Type'); - this.removeHeader('Content-Length'); - this.removeHeader('Transfer-Encoding'); - chunk = ''; - } - - if (req.method === 'HEAD') { - // skip body for HEAD - this.end(); - } else { - // respond - this.end(chunk, encoding); - } - - return this; -}; - -/** - * Send JSON response. - * - * Examples: - * - * res.json(null); - * res.json({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @public - */ - -res.json = function json(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.json(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.json(status, obj): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(val, replacer, spaces); - - // content-type - if (!this.get('Content-Type')) { - this.set('Content-Type', 'application/json'); - } - - return this.send(body); -}; - -/** - * Send JSON response with JSONP callback support. - * - * Examples: - * - * res.jsonp(null); - * res.jsonp({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @public - */ - -res.jsonp = function jsonp(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.jsonp(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(val, replacer, spaces); - var callback = this.req.query[app.get('jsonp callback name')]; - - // content-type - if (!this.get('Content-Type')) { - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'application/json'); - } - - // fixup callback - if (Array.isArray(callback)) { - callback = callback[0]; - } - - // jsonp - if (typeof callback === 'string' && callback.length !== 0) { - this.charset = 'utf-8'; - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'text/javascript'); - - // restrict callback charset - callback = callback.replace(/[^\[\]\w$.]/g, ''); - - // replace chars not allowed in JavaScript that are in JSON - body = body - .replace(/\u2028/g, '\\u2028') - .replace(/\u2029/g, '\\u2029'); - - // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse" - // the typeof check is just to reduce client error noise - body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');'; - } - - return this.send(body); -}; - -/** - * Send given HTTP status code. - * - * Sets the response status to `statusCode` and the body of the - * response to the standard description from node's http.STATUS_CODES - * or the statusCode number if no description. - * - * Examples: - * - * res.sendStatus(200); - * - * @param {number} statusCode - * @public - */ - -res.sendStatus = function sendStatus(statusCode) { - var body = statusCodes[statusCode] || String(statusCode); - - this.statusCode = statusCode; - this.type('txt'); - - return this.send(body); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `callback(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.sentHeader` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 (can be string converted by `ms`) - * - `root` root directory for relative filenames - * - `headers` object of headers to serve with file - * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them - * - * Other options are passed along to `send`. - * - * Examples: - * - * The following example illustrates how `res.sendFile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendFile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendFile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @public - */ - -res.sendFile = function sendFile(path, options, callback) { - var done = callback; - var req = this.req; - var res = this; - var next = req.next; - var opts = options || {}; - - if (!path) { - throw new TypeError('path argument is required to res.sendFile'); - } - - // support function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - if (!opts.root && !isAbsolute(path)) { - throw new TypeError('path must be absolute or specify root to res.sendFile'); - } - - // create file stream - var pathname = encodeURI(path); - var file = send(req, pathname, opts); - - // transfer - sendfile(res, file, opts, function (err) { - if (done) return done(err); - if (err && err.code === 'EISDIR') return next(); - - // next() all but write errors - if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') { - next(err); - } - }); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `callback(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.sentHeader` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 (can be string converted by `ms`) - * - `root` root directory for relative filenames - * - `headers` object of headers to serve with file - * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them - * - * Other options are passed along to `send`. - * - * Examples: - * - * The following example illustrates how `res.sendfile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendfile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendfile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @public - */ - -res.sendfile = function (path, options, callback) { - var done = callback; - var req = this.req; - var res = this; - var next = req.next; - var opts = options || {}; - - // support function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - // create file stream - var file = send(req, path, opts); - - // transfer - sendfile(res, file, opts, function (err) { - if (done) return done(err); - if (err && err.code === 'EISDIR') return next(); - - // next() all but write errors - if (err && err.code !== 'ECONNABORT' && err.syscall !== 'write') { - next(err); - } - }); -}; - -res.sendfile = deprecate.function(res.sendfile, - 'res.sendfile: Use res.sendFile instead'); - -/** - * Transfer the file at the given `path` as an attachment. - * - * Optionally providing an alternate attachment `filename`, - * and optional callback `callback(err)`. The callback is invoked - * when the data transfer is complete, or when an error has - * ocurred. Be sure to check `res.headersSent` if you plan to respond. - * - * This method uses `res.sendfile()`. - * - * @public - */ - -res.download = function download(path, filename, callback) { - var done = callback; - var name = filename; - - // support function as second arg - if (typeof filename === 'function') { - done = filename; - name = null; - } - - // set Content-Disposition when file is sent - var headers = { - 'Content-Disposition': contentDisposition(name || path) - }; - - // Resolve the full path for sendFile - var fullPath = resolve(path); - - return this.sendFile(fullPath, { headers: headers }, done); -}; - -/** - * Set _Content-Type_ response header with `type` through `mime.lookup()` - * when it does not contain "/", or set the Content-Type to `type` otherwise. - * - * Examples: - * - * res.type('.html'); - * res.type('html'); - * res.type('json'); - * res.type('application/json'); - * res.type('png'); - * - * @param {String} type - * @return {ServerResponse} for chaining - * @public - */ - -res.contentType = -res.type = function contentType(type) { - var ct = type.indexOf('/') === -1 - ? mime.lookup(type) - : type; - - return this.set('Content-Type', ct); -}; - -/** - * Respond to the Acceptable formats using an `obj` - * of mime-type callbacks. - * - * This method uses `req.accepted`, an array of - * acceptable types ordered by their quality values. - * When "Accept" is not present the _first_ callback - * is invoked, otherwise the first match is used. When - * no match is performed the server responds with - * 406 "Not Acceptable". - * - * Content-Type is set for you, however if you choose - * you may alter this within the callback using `res.type()` - * or `res.set('Content-Type', ...)`. - * - * res.format({ - * 'text/plain': function(){ - * res.send('hey'); - * }, - * - * 'text/html': function(){ - * res.send('

hey

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

hey

'); - * }, - * - * json: function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * By default Express passes an `Error` - * with a `.status` of 406 to `next(err)` - * if a match is not made. If you provide - * a `.default` callback it will be invoked - * instead. - * - * @param {Object} obj - * @return {ServerResponse} for chaining - * @public - */ - -res.format = function(obj){ - var req = this.req; - var next = req.next; - - var fn = obj.default; - if (fn) delete obj.default; - var keys = Object.keys(obj); - - var key = keys.length > 0 - ? req.accepts(keys) - : false; - - this.vary("Accept"); - - if (key) { - this.set('Content-Type', normalizeType(key).value); - obj[key](req, this, next); - } else if (fn) { - fn(); - } else { - var err = new Error('Not Acceptable'); - err.status = err.statusCode = 406; - err.types = normalizeTypes(keys).map(function(o){ return o.value }); - next(err); - } - - return this; -}; - -/** - * Set _Content-Disposition_ header to _attachment_ with optional `filename`. - * - * @param {String} filename - * @return {ServerResponse} - * @public - */ - -res.attachment = function attachment(filename) { - if (filename) { - this.type(extname(filename)); - } - - this.set('Content-Disposition', contentDisposition(filename)); - - return this; -}; - -/** - * Append additional header `field` with value `val`. - * - * Example: - * - * res.append('Link', ['', '']); - * res.append('Set-Cookie', 'foo=bar; Path=/; HttpOnly'); - * res.append('Warning', '199 Miscellaneous warning'); - * - * @param {String} field - * @param {String|Array} val - * @return {ServerResponse} for chaining - * @public - */ - -res.append = function append(field, val) { - var prev = this.get(field); - var value = val; - - if (prev) { - // concat the new and prev vals - value = Array.isArray(prev) ? prev.concat(val) - : Array.isArray(val) ? [prev].concat(val) - : [prev, val]; - } - - return this.set(field, value); -}; - -/** - * Set header `field` to `val`, or pass - * an object of header fields. - * - * Examples: - * - * res.set('Foo', ['bar', 'baz']); - * res.set('Accept', 'application/json'); - * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); - * - * Aliased as `res.header()`. - * - * @param {String|Object} field - * @param {String|Array} val - * @return {ServerResponse} for chaining - * @public - */ - -res.set = -res.header = function header(field, val) { - if (arguments.length === 2) { - var value = Array.isArray(val) - ? val.map(String) - : String(val); - - // add charset to content-type - if (field.toLowerCase() === 'content-type' && !charsetRegExp.test(value)) { - var charset = mime.charsets.lookup(value.split(';')[0]); - if (charset) value += '; charset=' + charset.toLowerCase(); - } - - this.setHeader(field, value); - } else { - for (var key in field) { - this.set(key, field[key]); - } - } - return this; -}; - -/** - * Get value for header `field`. - * - * @param {String} field - * @return {String} - * @public - */ - -res.get = function(field){ - return this.getHeader(field); -}; - -/** - * Clear cookie `name`. - * - * @param {String} name - * @param {Object} options - * @return {ServerResponse} for chaining - * @public - */ - -res.clearCookie = function clearCookie(name, options) { - var opts = merge({ expires: new Date(1), path: '/' }, options); - - return this.cookie(name, '', opts); -}; - -/** - * Set cookie `name` to `value`, with the given `options`. - * - * Options: - * - * - `maxAge` max-age in milliseconds, converted to `expires` - * - `signed` sign the cookie - * - `path` defaults to "/" - * - * Examples: - * - * // "Remember Me" for 15 minutes - * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); - * - * // save as above - * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) - * - * @param {String} name - * @param {String|Object} value - * @param {Options} options - * @return {ServerResponse} for chaining - * @public - */ - -res.cookie = function (name, value, options) { - var opts = merge({}, options); - var secret = this.req.secret; - var signed = opts.signed; - - if (signed && !secret) { - throw new Error('cookieParser("secret") required for signed cookies'); - } - - var val = typeof value === 'object' - ? 'j:' + JSON.stringify(value) - : String(value); - - if (signed) { - val = 's:' + sign(val, secret); - } - - if ('maxAge' in opts) { - opts.expires = new Date(Date.now() + opts.maxAge); - opts.maxAge /= 1000; - } - - if (opts.path == null) { - opts.path = '/'; - } - - this.append('Set-Cookie', cookie.serialize(name, String(val), opts)); - - return this; -}; - -/** - * Set the location header to `url`. - * - * The given `url` can also be "back", which redirects - * to the _Referrer_ or _Referer_ headers or "/". - * - * Examples: - * - * res.location('/foo/bar').; - * res.location('http://example.com'); - * res.location('../login'); - * - * @param {String} url - * @return {ServerResponse} for chaining - * @public - */ - -res.location = function location(url) { - var loc = url; - - // "back" is an alias for the referrer - if (url === 'back') { - loc = this.req.get('Referrer') || '/'; - } - - // set location - this.set('Location', loc); - return this; -}; - -/** - * Redirect to the given `url` with optional response `status` - * defaulting to 302. - * - * The resulting `url` is determined by `res.location()`, so - * it will play nicely with mounted apps, relative paths, - * `"back"` etc. - * - * Examples: - * - * res.redirect('/foo/bar'); - * res.redirect('http://example.com'); - * res.redirect(301, 'http://example.com'); - * res.redirect('../login'); // /blog/post/1 -> /blog/login - * - * @public - */ - -res.redirect = function redirect(url) { - var address = url; - var body; - var status = 302; - - // allow status / url - if (arguments.length === 2) { - if (typeof arguments[0] === 'number') { - status = arguments[0]; - address = arguments[1]; - } else { - deprecate('res.redirect(url, status): Use res.redirect(status, url) instead'); - status = arguments[1]; - } - } - - // Set location header - this.location(address); - address = this.get('Location'); - - // Support text/{plain,html} by default - this.format({ - text: function(){ - body = statusCodes[status] + '. Redirecting to ' + encodeURI(address); - }, - - html: function(){ - var u = escapeHtml(address); - body = '

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

'; - }, - - default: function(){ - body = ''; - } - }); - - // Respond - this.statusCode = status; - this.set('Content-Length', Buffer.byteLength(body)); - - if (this.req.method === 'HEAD') { - this.end(); - } else { - this.end(body); - } -}; - -/** - * Add `field` to Vary. If already present in the Vary set, then - * this call is simply ignored. - * - * @param {Array|String} field - * @return {ServerResponse} for chaining - * @public - */ - -res.vary = function(field){ - // checks for back-compat - if (!field || (Array.isArray(field) && !field.length)) { - deprecate('res.vary(): Provide a field name'); - return this; - } - - vary(this, field); - - return this; -}; - -/** - * Render `view` with the given `options` and optional callback `fn`. - * When a callback function is given a response will _not_ be made - * automatically, otherwise a response of _200_ and _text/html_ is given. - * - * Options: - * - * - `cache` boolean hinting to the engine it should cache - * - `filename` filename of the view being rendered - * - * @public - */ - -res.render = function render(view, options, callback) { - var app = this.req.app; - var done = callback; - var opts = options || {}; - var req = this.req; - var self = this; - - // support callback function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - // merge res.locals - opts._locals = self.locals; - - // default callback to respond - done = done || function (err, str) { - if (err) return req.next(err); - self.send(str); - }; - - // render - app.render(view, opts, done); -}; - -// pipe the send file stream -function sendfile(res, file, options, callback) { - var done = false; - var streaming; - - // request aborted - function onaborted() { - if (done) return; - done = true; - - var err = new Error('Request aborted'); - err.code = 'ECONNABORTED'; - callback(err); - } - - // directory - function ondirectory() { - if (done) return; - done = true; - - var err = new Error('EISDIR, read'); - err.code = 'EISDIR'; - callback(err); - } - - // errors - function onerror(err) { - if (done) return; - done = true; - callback(err); - } - - // ended - function onend() { - if (done) return; - done = true; - callback(); - } - - // file - function onfile() { - streaming = false; - } - - // finished - function onfinish(err) { - if (err && err.code === 'ECONNRESET') return onaborted(); - if (err) return onerror(err); - if (done) return; - - setImmediate(function () { - if (streaming !== false && !done) { - onaborted(); - return; - } - - if (done) return; - done = true; - callback(); - }); - } - - // streaming - function onstream() { - streaming = true; - } - - file.on('directory', ondirectory); - file.on('end', onend); - file.on('error', onerror); - file.on('file', onfile); - file.on('stream', onstream); - onFinished(res, onfinish); - - if (options.headers) { - // set headers on successful transfer - file.on('headers', function headers(res) { - var obj = options.headers; - var keys = Object.keys(obj); - - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - res.setHeader(k, obj[k]); - } - }); - } - - // pipe - file.pipe(res); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/router/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/router/index.js deleted file mode 100644 index 504ed9c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/router/index.js +++ /dev/null @@ -1,645 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var Route = require('./route'); -var Layer = require('./layer'); -var methods = require('methods'); -var mixin = require('utils-merge'); -var debug = require('debug')('express:router'); -var deprecate = require('depd')('express'); -var flatten = require('array-flatten'); -var parseUrl = require('parseurl'); - -/** - * Module variables. - * @private - */ - -var objectRegExp = /^\[object (\S+)\]$/; -var slice = Array.prototype.slice; -var toString = Object.prototype.toString; - -/** - * Initialize a new `Router` with the given `options`. - * - * @param {Object} options - * @return {Router} which is an callable function - * @public - */ - -var proto = module.exports = function(options) { - var opts = options || {}; - - function router(req, res, next) { - router.handle(req, res, next); - } - - // mixin Router class functions - router.__proto__ = proto; - - router.params = {}; - router._params = []; - router.caseSensitive = opts.caseSensitive; - router.mergeParams = opts.mergeParams; - router.strict = opts.strict; - router.stack = []; - - return router; -}; - -/** - * Map the given param placeholder `name`(s) to the given callback. - * - * Parameter mapping is used to provide pre-conditions to routes - * which use normalized placeholders. For example a _:user_id_ parameter - * could automatically load a user's information from the database without - * any additional code, - * - * The callback uses the same signature as middleware, the only difference - * being that the value of the placeholder is passed, in this case the _id_ - * of the user. Once the `next()` function is invoked, just like middleware - * it will continue on to execute the route, or subsequent parameter functions. - * - * Just like in middleware, you must either respond to the request or call next - * to avoid stalling the request. - * - * app.param('user_id', function(req, res, next, id){ - * User.find(id, function(err, user){ - * if (err) { - * return next(err); - * } else if (!user) { - * return next(new Error('failed to load user')); - * } - * req.user = user; - * next(); - * }); - * }); - * - * @param {String} name - * @param {Function} fn - * @return {app} for chaining - * @public - */ - -proto.param = function param(name, fn) { - // param logic - if (typeof name === 'function') { - deprecate('router.param(fn): Refactor to use path params'); - this._params.push(name); - return; - } - - // apply param functions - var params = this._params; - var len = params.length; - var ret; - - if (name[0] === ':') { - deprecate('router.param(' + JSON.stringify(name) + ', fn): Use router.param(' + JSON.stringify(name.substr(1)) + ', fn) instead'); - name = name.substr(1); - } - - 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; -}; - -/** - * Dispatch a req, res into the router. - * @private - */ - -proto.handle = function handle(req, res, out) { - var self = this; - - debug('dispatching %s %s', req.method, req.url); - - var search = 1 + req.url.indexOf('?'); - var pathlength = search ? search - 1 : req.url.length; - var fqdn = req.url[0] !== '/' && 1 + req.url.substr(0, pathlength).indexOf('://'); - var protohost = fqdn ? req.url.substr(0, req.url.indexOf('/', 2 + fqdn)) : ''; - var idx = 0; - var removed = ''; - var slashAdded = false; - var paramcalled = {}; - - // store options for OPTIONS request - // only used if OPTIONS request - var options = []; - - // middleware and routes - var stack = self.stack; - - // manage inter-router variables - var parentParams = req.params; - var parentUrl = req.baseUrl || ''; - var done = restore(out, req, 'baseUrl', 'next', 'params'); - - // setup next layer - req.next = next; - - // for options requests, respond with a default if nothing else responds - if (req.method === 'OPTIONS') { - done = wrap(done, function(old, err) { - if (err || options.length === 0) return old(err); - sendOptionsResponse(res, options, old); - }); - } - - // setup basic req values - req.baseUrl = parentUrl; - req.originalUrl = req.originalUrl || req.url; - - next(); - - function next(err) { - var layerError = err === 'route' - ? null - : err; - - // remove added slash - if (slashAdded) { - req.url = req.url.substr(1); - slashAdded = false; - } - - // restore altered req.url - if (removed.length !== 0) { - req.baseUrl = parentUrl; - req.url = protohost + removed + req.url.substr(protohost.length); - removed = ''; - } - - // no more matching layers - if (idx >= stack.length) { - setImmediate(done, layerError); - return; - } - - // get pathname of request - var path = getPathname(req); - - if (path == null) { - return done(layerError); - } - - // find next matching layer - var layer; - var match; - var route; - - while (match !== true && idx < stack.length) { - layer = stack[idx++]; - match = matchLayer(layer, path); - route = layer.route; - - if (typeof match !== 'boolean') { - // hold on to layerError - layerError = layerError || match; - } - - if (match !== true) { - continue; - } - - if (!route) { - // process non-route handlers normally - continue; - } - - if (layerError) { - // routes do not match with a pending error - match = false; - continue; - } - - var method = req.method; - var has_method = route._handles_method(method); - - // build up automatic options response - if (!has_method && method === 'OPTIONS') { - appendMethods(options, route._options()); - } - - // don't even bother matching route - if (!has_method && method !== 'HEAD') { - match = false; - continue; - } - } - - // no match - if (match !== true) { - return done(layerError); - } - - // store route for dispatch on change - if (route) { - req.route = route; - } - - // Capture one-time layer values - req.params = self.mergeParams - ? mergeParams(layer.params, parentParams) - : layer.params; - var layerPath = layer.path; - - // this should be done for the layer - self.process_params(layer, paramcalled, req, res, function (err) { - if (err) { - return next(layerError || err); - } - - if (route) { - return layer.handle_request(req, res, next); - } - - trim_prefix(layer, layerError, layerPath, path); - }); - } - - function trim_prefix(layer, layerError, layerPath, path) { - var c = path[layerPath.length]; - if (c && '/' !== c && '.' !== c) return next(layerError); - - // Trim off the part of the url that matches the route - // middleware (.use stuff) needs to have the path stripped - if (layerPath.length !== 0) { - debug('trim prefix (%s) from url %s', layerPath, req.url); - removed = layerPath; - req.url = protohost + req.url.substr(protohost.length + removed.length); - - // Ensure leading slash - if (!fqdn && req.url[0] !== '/') { - req.url = '/' + req.url; - slashAdded = true; - } - - // Setup base URL (no trailing slash) - req.baseUrl = parentUrl + (removed[removed.length - 1] === '/' - ? removed.substring(0, removed.length - 1) - : removed); - } - - debug('%s %s : %s', layer.name, layerPath, req.originalUrl); - - if (layerError) { - layer.handle_error(layerError, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Process any parameters for the layer. - * @private - */ - -proto.process_params = function process_params(layer, called, req, res, done) { - var params = this.params; - - // captured parameters from the layer, keys and values - var keys = layer.keys; - - // fast track - if (!keys || keys.length === 0) { - return done(); - } - - var i = 0; - var name; - var paramIndex = 0; - var key; - var paramVal; - var paramCallbacks; - var paramCalled; - - // process params in order - // param callbacks can be async - function param(err) { - if (err) { - return done(err); - } - - if (i >= keys.length ) { - return done(); - } - - paramIndex = 0; - key = keys[i++]; - - if (!key) { - return done(); - } - - name = key.name; - paramVal = req.params[name]; - paramCallbacks = params[name]; - paramCalled = called[name]; - - if (paramVal === undefined || !paramCallbacks) { - return param(); - } - - // param previously called with same value or error occurred - if (paramCalled && (paramCalled.match === paramVal - || (paramCalled.error && paramCalled.error !== 'route'))) { - // restore value - req.params[name] = paramCalled.value; - - // next param - return param(paramCalled.error); - } - - called[name] = paramCalled = { - error: null, - match: paramVal, - value: paramVal - }; - - paramCallback(); - } - - // single param callbacks - function paramCallback(err) { - var fn = paramCallbacks[paramIndex++]; - - // store updated value - paramCalled.value = req.params[key.name]; - - if (err) { - // store error - paramCalled.error = err; - param(err); - return; - } - - if (!fn) return param(); - - try { - fn(req, res, paramCallback, paramVal, key.name); - } catch (e) { - paramCallback(e); - } - } - - param(); -}; - -/** - * Use the given middleware function, with optional path, defaulting to "/". - * - * Use (like `.all`) will run for any http METHOD, but it will not add - * handlers for those methods so OPTIONS requests will not consider `.use` - * functions even if they could respond. - * - * The other difference is that _route_ path is stripped and not visible - * to the handler function. The main effect of this feature is that mounted - * handlers can operate without any code changes regardless of the "prefix" - * pathname. - * - * @public - */ - -proto.use = function use(fn) { - var offset = 0; - var path = '/'; - - // default path to '/' - // disambiguate router.use([fn]) - if (typeof fn !== 'function') { - var arg = fn; - - while (Array.isArray(arg) && arg.length !== 0) { - arg = arg[0]; - } - - // first arg is the path - if (typeof arg !== 'function') { - offset = 1; - path = fn; - } - } - - var callbacks = flatten(slice.call(arguments, offset)); - - if (callbacks.length === 0) { - throw new TypeError('Router.use() requires middleware functions'); - } - - for (var i = 0; i < callbacks.length; i++) { - var fn = callbacks[i]; - - if (typeof fn !== 'function') { - throw new TypeError('Router.use() requires middleware function but got a ' + gettype(fn)); - } - - // add the middleware - debug('use %s %s', path, fn.name || ''); - - var layer = new Layer(path, { - sensitive: this.caseSensitive, - strict: false, - end: false - }, fn); - - layer.route = undefined; - - this.stack.push(layer); - } - - return this; -}; - -/** - * Create a new Route for the given path. - * - * Each route contains a separate middleware stack and VERB handlers. - * - * See the Route api documentation for details on adding handlers - * and middleware to routes. - * - * @param {String} path - * @return {Route} - * @public - */ - -proto.route = function route(path) { - var route = new Route(path); - - var layer = new Layer(path, { - sensitive: this.caseSensitive, - strict: this.strict, - end: true - }, route.dispatch.bind(route)); - - layer.route = route; - - this.stack.push(layer); - return route; -}; - -// create Router#VERB functions -methods.concat('all').forEach(function(method){ - proto[method] = function(path){ - var route = this.route(path) - route[method].apply(route, slice.call(arguments, 1)); - return this; - }; -}); - -// append methods to a list of methods -function appendMethods(list, addition) { - for (var i = 0; i < addition.length; i++) { - var method = addition[i]; - if (list.indexOf(method) === -1) { - list.push(method); - } - } -} - -// get pathname of request -function getPathname(req) { - try { - return parseUrl(req).pathname; - } catch (err) { - return undefined; - } -} - -// get type for error message -function gettype(obj) { - var type = typeof obj; - - if (type !== 'object') { - return type; - } - - // inspect [[Class]] for objects - return toString.call(obj) - .replace(objectRegExp, '$1'); -} - -/** - * Match path to a layer. - * - * @param {Layer} layer - * @param {string} path - * @private - */ - -function matchLayer(layer, path) { - try { - return layer.match(path); - } catch (err) { - return err; - } -} - -// merge params with parent params -function mergeParams(params, parent) { - if (typeof parent !== 'object' || !parent) { - return params; - } - - // make copy of parent for base - var obj = mixin({}, parent); - - // simple non-numeric merging - if (!(0 in params) || !(0 in parent)) { - return mixin(obj, params); - } - - var i = 0; - var o = 0; - - // determine numeric gaps - while (i in params) { - i++; - } - - while (o in parent) { - o++; - } - - // offset numeric indices in params before merge - for (i--; i >= 0; i--) { - params[i + o] = params[i]; - - // create holes for the merge when necessary - if (i < o) { - delete params[i]; - } - } - - return mixin(obj, params); -} - -// restore obj props after function -function restore(fn, obj) { - var props = new Array(arguments.length - 2); - var vals = new Array(arguments.length - 2); - - for (var i = 0; i < props.length; i++) { - props[i] = arguments[i + 2]; - vals[i] = obj[props[i]]; - } - - return function(err){ - // restore vals - for (var i = 0; i < props.length; i++) { - obj[props[i]] = vals[i]; - } - - return fn.apply(this, arguments); - }; -} - -// send an OPTIONS response -function sendOptionsResponse(res, options, next) { - try { - var body = options.join(','); - res.set('Allow', body); - res.send(body); - } catch (err) { - next(err); - } -} - -// wrap a function -function wrap(old, fn) { - return function proxy() { - var args = new Array(arguments.length + 1); - - args[0] = old; - for (var i = 0, len = arguments.length; i < len; i++) { - args[i + 1] = arguments[i]; - } - - fn.apply(this, args); - }; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/router/layer.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/router/layer.js deleted file mode 100644 index fe9210c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/router/layer.js +++ /dev/null @@ -1,176 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var pathRegexp = require('path-to-regexp'); -var debug = require('debug')('express:router:layer'); - -/** - * Module variables. - * @private - */ - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -/** - * Module exports. - * @public - */ - -module.exports = Layer; - -function Layer(path, options, fn) { - if (!(this instanceof Layer)) { - return new Layer(path, options, fn); - } - - debug('new %s', path); - var opts = options || {}; - - this.handle = fn; - this.name = fn.name || ''; - this.params = undefined; - this.path = undefined; - this.regexp = pathRegexp(path, this.keys = [], opts); - - if (path === '/' && opts.end === false) { - this.regexp.fast_slash = true; - } -} - -/** - * Handle the error for the layer. - * - * @param {Error} error - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_error = function handle_error(error, req, res, next) { - var fn = this.handle; - - if (fn.length !== 4) { - // not a standard error handler - return next(error); - } - - try { - fn(error, req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Handle the request for the layer. - * - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_request = function handle(req, res, next) { - var fn = this.handle; - - if (fn.length > 3) { - // not a standard request handler - return next(); - } - - try { - fn(req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Check if this route matches `path`, if so - * populate `.params`. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -Layer.prototype.match = function match(path) { - if (path == null) { - // no path, nothing matches - this.params = undefined; - this.path = undefined; - return false; - } - - if (this.regexp.fast_slash) { - // fast path non-ending match for / (everything matches) - this.params = {}; - this.path = ''; - return true; - } - - var m = this.regexp.exec(path); - - if (!m) { - this.params = undefined; - this.path = undefined; - return false; - } - - // store values - this.params = {}; - this.path = m[0]; - - var keys = this.keys; - var params = this.params; - - for (var i = 1; i < m.length; i++) { - var key = keys[i - 1]; - var prop = key.name; - var val = decode_param(m[i]); - - if (val !== undefined || !(hasOwnProperty.call(params, prop))) { - params[prop] = val; - } - } - - return true; -}; - -/** - * Decode param value. - * - * @param {string} val - * @return {string} - * @private - */ - -function decode_param(val) { - if (typeof val !== 'string' || val.length === 0) { - return val; - } - - try { - return decodeURIComponent(val); - } catch (err) { - if (err instanceof URIError) { - err.message = 'Failed to decode param \'' + val + '\''; - err.status = err.statusCode = 400; - } - - throw err; - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/router/route.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/router/route.js deleted file mode 100644 index 2788d7b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/router/route.js +++ /dev/null @@ -1,210 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var debug = require('debug')('express:router:route'); -var flatten = require('array-flatten'); -var Layer = require('./layer'); -var methods = require('methods'); - -/** - * Module variables. - * @private - */ - -var slice = Array.prototype.slice; -var toString = Object.prototype.toString; - -/** - * Module exports. - * @public - */ - -module.exports = Route; - -/** - * Initialize `Route` with the given `path`, - * - * @param {String} path - * @public - */ - -function Route(path) { - this.path = path; - this.stack = []; - - debug('new %s', path); - - // route handlers for various http methods - this.methods = {}; -} - -/** - * Determine if the route handles a given method. - * @private - */ - -Route.prototype._handles_method = function _handles_method(method) { - if (this.methods._all) { - return true; - } - - var name = method.toLowerCase(); - - if (name === 'head' && !this.methods['head']) { - name = 'get'; - } - - return Boolean(this.methods[name]); -}; - -/** - * @return {Array} supported HTTP methods - * @private - */ - -Route.prototype._options = function _options() { - var methods = Object.keys(this.methods); - - // append automatic head - if (this.methods.get && !this.methods.head) { - methods.push('head'); - } - - for (var i = 0; i < methods.length; i++) { - // make upper case - methods[i] = methods[i].toUpperCase(); - } - - return methods; -}; - -/** - * dispatch req, res into this route - * @private - */ - -Route.prototype.dispatch = function dispatch(req, res, done) { - var idx = 0; - var stack = this.stack; - if (stack.length === 0) { - return done(); - } - - var method = req.method.toLowerCase(); - if (method === 'head' && !this.methods['head']) { - method = 'get'; - } - - req.route = this; - - next(); - - function next(err) { - if (err && err === 'route') { - return done(); - } - - var layer = stack[idx++]; - if (!layer) { - return done(err); - } - - if (layer.method && layer.method !== method) { - return next(err); - } - - if (err) { - layer.handle_error(err, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Add a handler for all HTTP verbs to this route. - * - * Behaves just like middleware and can respond or call `next` - * to continue processing. - * - * You can use multiple `.all` call to add multiple handlers. - * - * function check_something(req, res, next){ - * next(); - * }; - * - * function validate_user(req, res, next){ - * next(); - * }; - * - * route - * .all(validate_user) - * .all(check_something) - * .get(function(req, res, next){ - * res.send('hello world'); - * }); - * - * @param {function} handler - * @return {Route} for chaining - * @api public - */ - -Route.prototype.all = function all() { - var handles = flatten(slice.call(arguments)); - - for (var i = 0; i < handles.length; i++) { - var handle = handles[i]; - - if (typeof handle !== 'function') { - var type = toString.call(handle); - var msg = 'Route.all() requires callback functions but got a ' + type; - throw new TypeError(msg); - } - - var layer = Layer('/', {}, handle); - layer.method = undefined; - - this.methods._all = true; - this.stack.push(layer); - } - - return this; -}; - -methods.forEach(function(method){ - Route.prototype[method] = function(){ - var handles = flatten(slice.call(arguments)); - - for (var i = 0; i < handles.length; i++) { - var handle = handles[i]; - - if (typeof handle !== 'function') { - var type = toString.call(handle); - var msg = 'Route.' + method + '() requires callback functions but got a ' + type; - throw new Error(msg); - } - - debug('%s %s', method, this.path); - - var layer = Layer('/', {}, handle); - layer.method = method; - - this.methods[method] = true; - this.stack.push(layer); - } - - return this; - }; -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/utils.js deleted file mode 100644 index 3d54247..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/utils.js +++ /dev/null @@ -1,300 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @api private - */ - -var contentDisposition = require('content-disposition'); -var contentType = require('content-type'); -var deprecate = require('depd')('express'); -var flatten = require('array-flatten'); -var mime = require('send').mime; -var basename = require('path').basename; -var etag = require('etag'); -var proxyaddr = require('proxy-addr'); -var qs = require('qs'); -var querystring = require('querystring'); - -/** - * Return strong ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.etag = function (body, encoding) { - var buf = !Buffer.isBuffer(body) - ? new Buffer(body, encoding) - : body; - - return etag(buf, {weak: false}); -}; - -/** - * Return weak ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.wetag = function wetag(body, encoding){ - var buf = !Buffer.isBuffer(body) - ? new Buffer(body, encoding) - : body; - - return etag(buf, {weak: true}); -}; - -/** - * 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; - if ('\\\\' == path.substring(0, 2)) return true; // Microsoft Azure absolute path -}; - -/** - * Flatten the given `arr`. - * - * @param {Array} arr - * @return {Array} - * @api private - */ - -exports.flatten = deprecate.function(flatten, - 'utils.flatten: use array-flatten npm module instead'); - -/** - * Normalize the given `type`, for example "html" becomes "text/html". - * - * @param {String} type - * @return {Object} - * @api private - */ - -exports.normalizeType = function(type){ - return ~type.indexOf('/') - ? acceptParams(type) - : { value: mime.lookup(type), params: {} }; -}; - -/** - * Normalize `types`, for example "html" becomes "text/html". - * - * @param {Array} types - * @return {Array} - * @api private - */ - -exports.normalizeTypes = function(types){ - var ret = []; - - for (var i = 0; i < types.length; ++i) { - ret.push(exports.normalizeType(types[i])); - } - - return ret; -}; - -/** - * Generate Content-Disposition header appropriate for the filename. - * non-ascii filenames are urlencoded and a filename* parameter is added - * - * @param {String} filename - * @return {String} - * @api private - */ - -exports.contentDisposition = deprecate.function(contentDisposition, - 'utils.contentDisposition: use content-disposition npm module instead'); - -/** - * Parse accept params `str` returning an - * object with `.value`, `.quality` and `.params`. - * also includes `.originalIndex` for stable sorting - * - * @param {String} str - * @return {Object} - * @api private - */ - -function acceptParams(str, index) { - var parts = str.split(/ *; */); - var ret = { value: parts[0], quality: 1, params: {}, originalIndex: index }; - - for (var i = 1; i < parts.length; ++i) { - var pms = parts[i].split(/ *= */); - if ('q' == pms[0]) { - ret.quality = parseFloat(pms[1]); - } else { - ret.params[pms[0]] = pms[1]; - } - } - - return ret; -} - -/** - * Compile "etag" value to function. - * - * @param {Boolean|String|Function} val - * @return {Function} - * @api private - */ - -exports.compileETag = function(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = exports.wetag; - break; - case false: - break; - case 'strong': - fn = exports.etag; - break; - case 'weak': - fn = exports.wetag; - break; - default: - throw new TypeError('unknown value for etag function: ' + val); - } - - return fn; -} - -/** - * Compile "query parser" value to function. - * - * @param {String|Function} val - * @return {Function} - * @api private - */ - -exports.compileQueryParser = function compileQueryParser(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = querystring.parse; - break; - case false: - fn = newObject; - break; - case 'extended': - fn = parseExtendedQueryString; - break; - case 'simple': - fn = querystring.parse; - break; - default: - throw new TypeError('unknown value for query parser function: ' + val); - } - - return fn; -} - -/** - * Compile "proxy trust" value to function. - * - * @param {Boolean|String|Number|Array|Function} val - * @return {Function} - * @api private - */ - -exports.compileTrust = function(val) { - if (typeof val === 'function') return val; - - if (val === true) { - // Support plain true/false - return function(){ return true }; - } - - if (typeof val === 'number') { - // Support trusting hop count - return function(a, i){ return i < val }; - } - - if (typeof val === 'string') { - // Support comma-separated values - val = val.split(/ *, */); - } - - return proxyaddr.compile(val || []); -} - -/** - * Set the charset in a given Content-Type string. - * - * @param {String} type - * @param {String} charset - * @return {String} - * @api private - */ - -exports.setCharset = function setCharset(type, charset) { - if (!type || !charset) { - return type; - } - - // parse type - var parsed = contentType.parse(type); - - // set charset - parsed.parameters.charset = charset; - - // format type - return contentType.format(parsed); -}; - -/** - * Parse an extended query string with qs. - * - * @return {Object} - * @private - */ - -function parseExtendedQueryString(str) { - return qs.parse(str, { - allowDots: false, - allowPrototypes: true - }); -} - -/** - * Return new empty object. - * - * @return {Object} - * @api private - */ - -function newObject() { - return {}; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/view.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/view.js deleted file mode 100644 index 52415d4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/lib/view.js +++ /dev/null @@ -1,173 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var debug = require('debug')('express:view'); -var path = require('path'); -var fs = require('fs'); -var utils = require('./utils'); - -/** - * Module variables. - * @private - */ - -var dirname = path.dirname; -var basename = path.basename; -var extname = path.extname; -var join = path.join; -var resolve = path.resolve; - -/** - * Module exports. - * @public - */ - -module.exports = View; - -/** - * Initialize a new `View` with the given `name`. - * - * Options: - * - * - `defaultEngine` the default template engine name - * - `engines` template engine require() cache - * - `root` root path for view lookup - * - * @param {string} name - * @param {object} options - * @public - */ - -function View(name, options) { - var opts = options || {}; - - this.defaultEngine = opts.defaultEngine; - this.ext = extname(name); - this.name = name; - this.root = opts.root; - - if (!this.ext && !this.defaultEngine) { - throw new Error('No default engine was specified and no extension was provided.'); - } - - var fileName = name; - - if (!this.ext) { - // get extension from default engine name - this.ext = this.defaultEngine[0] !== '.' - ? '.' + this.defaultEngine - : this.defaultEngine; - - fileName += this.ext; - } - - if (!opts.engines[this.ext]) { - // load engine - opts.engines[this.ext] = require(this.ext.substr(1)).__express; - } - - // store loaded engine - this.engine = opts.engines[this.ext]; - - // lookup path - this.path = this.lookup(fileName); -} - -/** - * Lookup view by the given `name` - * - * @param {string} name - * @private - */ - -View.prototype.lookup = function lookup(name) { - var path; - var roots = [].concat(this.root); - - debug('lookup "%s"', name); - - for (var i = 0; i < roots.length && !path; i++) { - var root = roots[i]; - - // resolve the path - var loc = resolve(root, name); - var dir = dirname(loc); - var file = basename(loc); - - // resolve the file - path = this.resolve(dir, file); - } - - return path; -}; - -/** - * Render with the given options. - * - * @param {object} options - * @param {function} callback - * @private - */ - -View.prototype.render = function render(options, callback) { - debug('render "%s"', this.path); - this.engine(this.path, options, callback); -}; - -/** - * Resolve the file within the given directory. - * - * @param {string} dir - * @param {string} file - * @private - */ - -View.prototype.resolve = function resolve(dir, file) { - var ext = this.ext; - - // . - var path = join(dir, file); - var stat = tryStat(path); - - if (stat && stat.isFile()) { - return path; - } - - // /index. - path = join(dir, basename(file, ext), 'index' + ext); - stat = tryStat(path); - - if (stat && stat.isFile()) { - return path; - } -}; - -/** - * Return a stat, maybe. - * - * @param {string} path - * @return {fs.Stats} - * @private - */ - -function tryStat(path) { - debug('stat "%s"', path); - - try { - return fs.statSync(path); - } catch (e) { - return undefined; - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/HISTORY.md deleted file mode 100644 index 53df699..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/HISTORY.md +++ /dev/null @@ -1,164 +0,0 @@ -1.2.12 / 2015-07-30 -=================== - - * deps: mime-types@~2.1.4 - - deps: mime-db@~1.16.0 - -1.2.11 / 2015-07-16 -=================== - - * deps: mime-types@~2.1.3 - - deps: mime-db@~1.15.0 - -1.2.10 / 2015-07-01 -=================== - - * deps: mime-types@~2.1.2 - - deps: mime-db@~1.14.0 - -1.2.9 / 2015-06-08 -================== - - * deps: mime-types@~2.1.1 - - perf: fix deopt during mapping - -1.2.8 / 2015-06-07 -================== - - * deps: mime-types@~2.1.0 - - deps: mime-db@~1.13.0 - * perf: avoid argument reassignment & argument slice - * perf: avoid negotiator recursive construction - * perf: enable strict mode - * perf: remove unnecessary bitwise operator - -1.2.7 / 2015-05-10 -================== - - * deps: negotiator@0.5.3 - - Fix media type parameter matching to be case-insensitive - -1.2.6 / 2015-05-07 -================== - - * deps: mime-types@~2.0.11 - - deps: mime-db@~1.9.1 - * deps: negotiator@0.5.2 - - Fix comparing media types with quoted values - - Fix splitting media types with quoted commas - -1.2.5 / 2015-03-13 -================== - - * deps: mime-types@~2.0.10 - - deps: mime-db@~1.8.0 - -1.2.4 / 2015-02-14 -================== - - * Support Node.js 0.6 - * deps: mime-types@~2.0.9 - - deps: mime-db@~1.7.0 - * deps: negotiator@0.5.1 - - Fix preference sorting to be stable for long acceptable lists - -1.2.3 / 2015-01-31 -================== - - * deps: mime-types@~2.0.8 - - deps: mime-db@~1.6.0 - -1.2.2 / 2014-12-30 -================== - - * deps: mime-types@~2.0.7 - - deps: mime-db@~1.5.0 - -1.2.1 / 2014-12-30 -================== - - * deps: mime-types@~2.0.5 - - deps: mime-db@~1.3.1 - -1.2.0 / 2014-12-19 -================== - - * deps: negotiator@0.5.0 - - Fix list return order when large accepted list - - Fix missing identity encoding when q=0 exists - - Remove dynamic building of Negotiator class - -1.1.4 / 2014-12-10 -================== - - * deps: mime-types@~2.0.4 - - deps: mime-db@~1.3.0 - -1.1.3 / 2014-11-09 -================== - - * deps: mime-types@~2.0.3 - - deps: mime-db@~1.2.0 - -1.1.2 / 2014-10-14 -================== - - * deps: negotiator@0.4.9 - - Fix error when media type has invalid parameter - -1.1.1 / 2014-09-28 -================== - - * deps: mime-types@~2.0.2 - - deps: mime-db@~1.1.0 - * deps: negotiator@0.4.8 - - Fix all negotiations to be case-insensitive - - Stable sort preferences of same quality according to client order - -1.1.0 / 2014-09-02 -================== - - * update `mime-types` - -1.0.7 / 2014-07-04 -================== - - * Fix wrong type returned from `type` when match after unknown extension - -1.0.6 / 2014-06-24 -================== - - * deps: negotiator@0.4.7 - -1.0.5 / 2014-06-20 -================== - - * fix crash when unknown extension given - -1.0.4 / 2014-06-19 -================== - - * use `mime-types` - -1.0.3 / 2014-06-11 -================== - - * deps: negotiator@0.4.6 - - Order by specificity when quality is the same - -1.0.2 / 2014-05-29 -================== - - * Fix interpretation when header not in request - * deps: pin negotiator@0.4.5 - -1.0.1 / 2014-01-18 -================== - - * Identity encoding isn't always acceptable - * deps: negotiator@~0.4.0 - -1.0.0 / 2013-12-27 -================== - - * Genesis diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/LICENSE deleted file mode 100644 index 0616607..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/README.md deleted file mode 100644 index ae36676..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/README.md +++ /dev/null @@ -1,135 +0,0 @@ -# accepts - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator). Extracted from [koa](https://www.npmjs.com/package/koa) for general use. - -In addition to negotiator, it allows: - -- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` as well as `('text/html', 'application/json')`. -- Allows type shorthands such as `json`. -- Returns `false` when no types match -- Treats non-existent headers as `*` - -## Installation - -```sh -npm install accepts -``` - -## API - -```js -var accepts = require('accepts') -``` - -### accepts(req) - -Create a new `Accepts` object for the given `req`. - -#### .charset(charsets) - -Return the first accepted charset. If nothing in `charsets` is accepted, -then `false` is returned. - -#### .charsets() - -Return the charsets that the request accepts, in the order of the client's -preference (most preferred first). - -#### .encoding(encodings) - -Return the first accepted encoding. If nothing in `encodings` is accepted, -then `false` is returned. - -#### .encodings() - -Return the encodings that the request accepts, in the order of the client's -preference (most preferred first). - -#### .language(languages) - -Return the first accepted language. If nothing in `languages` is accepted, -then `false` is returned. - -#### .languages() - -Return the languages that the request accepts, in the order of the client's -preference (most preferred first). - -#### .type(types) - -Return the first accepted type (and it is returned as the same text as what -appears in the `types` array). If nothing in `types` is accepted, then `false` -is returned. - -The `types` array can contain full MIME types or file extensions. Any value -that is not a full MIME types is passed to `require('mime-types').lookup`. - -#### .types() - -Return the types that the request accepts, in the order of the client's -preference (most preferred first). - -## Examples - -### Simple type negotiation - -This simple example shows how to use `accepts` to return a different typed -respond body based on what the client wants to accept. The server lists it's -preferences in order and will get back the best match between the client and -server. - -```js -var accepts = require('accepts') -var http = require('http') - -function app(req, res) { - var accept = accepts(req) - - // the order of this list is significant; should be server preferred order - switch(accept.type(['json', 'html'])) { - case 'json': - res.setHeader('Content-Type', 'application/json') - res.write('{"hello":"world!"}') - break - case 'html': - res.setHeader('Content-Type', 'text/html') - res.write('hello, world!') - break - default: - // the fallback is text/plain, so no need to specify it above - res.setHeader('Content-Type', 'text/plain') - res.write('hello, world!') - break - } - - res.end() -} - -http.createServer(app).listen(3000) -``` - -You can test this out with the cURL program: -```sh -curl -I -H'Accept: text/html' http://localhost:3000/ -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/accepts.svg -[npm-url]: https://npmjs.org/package/accepts -[node-version-image]: https://img.shields.io/node/v/accepts.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/accepts/master.svg -[travis-url]: https://travis-ci.org/jshttp/accepts -[coveralls-image]: https://img.shields.io/coveralls/jshttp/accepts/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/accepts -[downloads-image]: https://img.shields.io/npm/dm/accepts.svg -[downloads-url]: https://npmjs.org/package/accepts diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/index.js deleted file mode 100644 index e80192a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/index.js +++ /dev/null @@ -1,231 +0,0 @@ -/*! - * accepts - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var Negotiator = require('negotiator') -var mime = require('mime-types') - -/** - * Module exports. - * @public - */ - -module.exports = Accepts - -/** - * Create a new Accepts object for the given req. - * - * @param {object} req - * @public - */ - -function Accepts(req) { - if (!(this instanceof Accepts)) - return new Accepts(req) - - this.headers = req.headers - this.negotiator = new Negotiator(req) -} - -/** - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json" or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * this.types('html'); - * // => "html" - * - * // Accept: text/*, application/json - * this.types('html'); - * // => "html" - * this.types('text/html'); - * // => "text/html" - * this.types('json', 'text'); - * // => "json" - * this.types('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * this.types('image/png'); - * this.types('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * this.types(['html', 'json']); - * this.types('html', 'json'); - * // => "json" - * - * @param {String|Array} types... - * @return {String|Array|Boolean} - * @public - */ - -Accepts.prototype.type = -Accepts.prototype.types = function (types_) { - var types = types_ - - // support flattened arguments - if (types && !Array.isArray(types)) { - types = new Array(arguments.length) - for (var i = 0; i < types.length; i++) { - types[i] = arguments[i] - } - } - - // no types, return all requested types - if (!types || types.length === 0) { - return this.negotiator.mediaTypes() - } - - if (!this.headers.accept) return types[0]; - var mimes = types.map(extToMime); - var accepts = this.negotiator.mediaTypes(mimes.filter(validMime)); - var first = accepts[0]; - if (!first) return false; - return types[mimes.indexOf(first)]; -} - -/** - * Return accepted encodings or best fit based on `encodings`. - * - * Given `Accept-Encoding: gzip, deflate` - * an array sorted by quality is returned: - * - * ['gzip', 'deflate'] - * - * @param {String|Array} encodings... - * @return {String|Array} - * @public - */ - -Accepts.prototype.encoding = -Accepts.prototype.encodings = function (encodings_) { - var encodings = encodings_ - - // support flattened arguments - if (encodings && !Array.isArray(encodings)) { - encodings = new Array(arguments.length) - for (var i = 0; i < encodings.length; i++) { - encodings[i] = arguments[i] - } - } - - // no encodings, return all requested encodings - if (!encodings || encodings.length === 0) { - return this.negotiator.encodings() - } - - return this.negotiator.encodings(encodings)[0] || false -} - -/** - * Return accepted charsets or best fit based on `charsets`. - * - * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` - * an array sorted by quality is returned: - * - * ['utf-8', 'utf-7', 'iso-8859-1'] - * - * @param {String|Array} charsets... - * @return {String|Array} - * @public - */ - -Accepts.prototype.charset = -Accepts.prototype.charsets = function (charsets_) { - var charsets = charsets_ - - // support flattened arguments - if (charsets && !Array.isArray(charsets)) { - charsets = new Array(arguments.length) - for (var i = 0; i < charsets.length; i++) { - charsets[i] = arguments[i] - } - } - - // no charsets, return all requested charsets - if (!charsets || charsets.length === 0) { - return this.negotiator.charsets() - } - - return this.negotiator.charsets(charsets)[0] || false -} - -/** - * Return accepted languages or best fit based on `langs`. - * - * Given `Accept-Language: en;q=0.8, es, pt` - * an array sorted by quality is returned: - * - * ['es', 'pt', 'en'] - * - * @param {String|Array} langs... - * @return {Array|String} - * @public - */ - -Accepts.prototype.lang = -Accepts.prototype.langs = -Accepts.prototype.language = -Accepts.prototype.languages = function (languages_) { - var languages = languages_ - - // support flattened arguments - if (languages && !Array.isArray(languages)) { - languages = new Array(arguments.length) - for (var i = 0; i < languages.length; i++) { - languages[i] = arguments[i] - } - } - - // no languages, return all requested languages - if (!languages || languages.length === 0) { - return this.negotiator.languages() - } - - return this.negotiator.languages(languages)[0] || false -} - -/** - * Convert extnames to mime. - * - * @param {String} type - * @return {String} - * @private - */ - -function extToMime(type) { - return type.indexOf('/') === -1 - ? mime.lookup(type) - : type -} - -/** - * Check if mime is valid. - * - * @param {String} type - * @return {String} - * @private - */ - -function validMime(type) { - return typeof type === 'string'; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/HISTORY.md deleted file mode 100644 index e7bed42..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/HISTORY.md +++ /dev/null @@ -1,165 +0,0 @@ -2.1.6 / 2015-09--03 -================== - - * deps: mime-db@~1.18.0 - - Add new mime types - -2.1.5 / 2015-08-20 -================== - - * deps: mime-db@~1.17.0 - - Add new mime types - -2.1.4 / 2015-07-30 -================== - - * deps: mime-db@~1.16.0 - - Add new mime types - -2.1.3 / 2015-07-13 -================== - - * deps: mime-db@~1.15.0 - - Add new mime types - -2.1.2 / 2015-06-25 -================== - - * deps: mime-db@~1.14.0 - - Add new mime types - -2.1.1 / 2015-06-08 -================== - - * perf: fix deopt during mapping - -2.1.0 / 2015-06-07 -================== - - * Fix incorrectly treating extension-less file name as extension - - i.e. `'path/to/json'` will no longer return `application/json` - * Fix `.charset(type)` to accept parameters - * Fix `.charset(type)` to match case-insensitive - * Improve generation of extension to MIME mapping - * Refactor internals for readability and no argument reassignment - * Prefer `application/*` MIME types from the same source - * Prefer any type over `application/octet-stream` - * deps: mime-db@~1.13.0 - - Add nginx as a source - - Add new mime types - -2.0.14 / 2015-06-06 -=================== - - * deps: mime-db@~1.12.0 - - Add new mime types - -2.0.13 / 2015-05-31 -=================== - - * deps: mime-db@~1.11.0 - - Add new mime types - -2.0.12 / 2015-05-19 -=================== - - * deps: mime-db@~1.10.0 - - Add new mime types - -2.0.11 / 2015-05-05 -=================== - - * deps: mime-db@~1.9.1 - - Add new mime types - -2.0.10 / 2015-03-13 -=================== - - * deps: mime-db@~1.8.0 - - Add new mime types - -2.0.9 / 2015-02-09 -================== - - * deps: mime-db@~1.7.0 - - Add new mime types - - Community extensions ownership transferred from `node-mime` - -2.0.8 / 2015-01-29 -================== - - * deps: mime-db@~1.6.0 - - Add new mime types - -2.0.7 / 2014-12-30 -================== - - * deps: mime-db@~1.5.0 - - Add new mime types - - Fix various invalid MIME type entries - -2.0.6 / 2014-12-30 -================== - - * deps: mime-db@~1.4.0 - - Add new mime types - - Fix various invalid MIME type entries - - Remove example template MIME types - -2.0.5 / 2014-12-29 -================== - - * deps: mime-db@~1.3.1 - - Fix missing extensions - -2.0.4 / 2014-12-10 -================== - - * deps: mime-db@~1.3.0 - - Add new mime types - -2.0.3 / 2014-11-09 -================== - - * deps: mime-db@~1.2.0 - - Add new mime types - -2.0.2 / 2014-09-28 -================== - - * deps: mime-db@~1.1.0 - - Add new mime types - - Add additional compressible - - Update charsets - -2.0.1 / 2014-09-07 -================== - - * Support Node.js 0.6 - -2.0.0 / 2014-09-02 -================== - - * Use `mime-db` - * Remove `.define()` - -1.0.2 / 2014-08-04 -================== - - * Set charset=utf-8 for `text/javascript` - -1.0.1 / 2014-06-24 -================== - - * Add `text/jsx` type - -1.0.0 / 2014-05-12 -================== - - * Return `false` for unknown types - * Set charset=utf-8 for `application/json` - -0.1.0 / 2014-05-02 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE deleted file mode 100644 index 0616607..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md deleted file mode 100644 index e26295d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md +++ /dev/null @@ -1,103 +0,0 @@ -# mime-types - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -The ultimate javascript content-type utility. - -Similar to [node-mime](https://github.com/broofa/node-mime), except: - -- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, - so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. -- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. -- Additional mime types are added such as jade and stylus via [mime-db](https://github.com/jshttp/mime-db) -- No `.define()` functionality - -Otherwise, the API is compatible. - -## Install - -```sh -$ npm install mime-types -``` - -## Adding Types - -All mime types are based on [mime-db](https://github.com/jshttp/mime-db), -so open a PR there if you'd like to add mime types. - -## API - -```js -var mime = require('mime-types') -``` - -All functions return `false` if input is invalid or not found. - -### mime.lookup(path) - -Lookup the content-type associated with a file. - -```js -mime.lookup('json') // 'application/json' -mime.lookup('.md') // 'text/x-markdown' -mime.lookup('file.html') // 'text/html' -mime.lookup('folder/file.js') // 'application/javascript' -mime.lookup('folder/.htaccess') // false - -mime.lookup('cats') // false -``` - -### mime.contentType(type) - -Create a full content-type header given a content-type or extension. - -```js -mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' -mime.contentType('file.json') // 'application/json; charset=utf-8' - -// from a full path -mime.contentType(path.extname('/path/to/file.json')) // 'application/json; charset=utf-8' -``` - -### mime.extension(type) - -Get the default extension for a content-type. - -```js -mime.extension('application/octet-stream') // 'bin' -``` - -### mime.charset(type) - -Lookup the implied default charset of a content-type. - -```js -mime.charset('text/x-markdown') // 'UTF-8' -``` - -### var type = mime.types[extension] - -A map of content-types by extension. - -### [extensions...] = mime.extensions[type] - -A map of extensions by content-type. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/mime-types.svg -[npm-url]: https://npmjs.org/package/mime-types -[node-version-image]: https://img.shields.io/node/v/mime-types.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/mime-types/master.svg -[travis-url]: https://travis-ci.org/jshttp/mime-types -[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-types/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/mime-types -[downloads-image]: https://img.shields.io/npm/dm/mime-types.svg -[downloads-url]: https://npmjs.org/package/mime-types diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/index.js deleted file mode 100644 index f7008b2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/index.js +++ /dev/null @@ -1,188 +0,0 @@ -/*! - * mime-types - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var db = require('mime-db') -var extname = require('path').extname - -/** - * Module variables. - * @private - */ - -var extractTypeRegExp = /^\s*([^;\s]*)(?:;|\s|$)/ -var textTypeRegExp = /^text\//i - -/** - * Module exports. - * @public - */ - -exports.charset = charset -exports.charsets = { lookup: charset } -exports.contentType = contentType -exports.extension = extension -exports.extensions = Object.create(null) -exports.lookup = lookup -exports.types = Object.create(null) - -// Populate the extensions/types maps -populateMaps(exports.extensions, exports.types) - -/** - * Get the default charset for a MIME type. - * - * @param {string} type - * @return {boolean|string} - */ - -function charset(type) { - if (!type || typeof type !== 'string') { - return false - } - - // TODO: use media-typer - var match = extractTypeRegExp.exec(type) - var mime = match && db[match[1].toLowerCase()] - - if (mime && mime.charset) { - return mime.charset - } - - // default text/* to utf-8 - if (match && textTypeRegExp.test(match[1])) { - return 'UTF-8' - } - - return false -} - -/** - * Create a full Content-Type header given a MIME type or extension. - * - * @param {string} str - * @return {boolean|string} - */ - -function contentType(str) { - // TODO: should this even be in this module? - if (!str || typeof str !== 'string') { - return false - } - - var mime = str.indexOf('/') === -1 - ? exports.lookup(str) - : str - - if (!mime) { - return false - } - - // TODO: use content-type or other module - if (mime.indexOf('charset') === -1) { - var charset = exports.charset(mime) - if (charset) mime += '; charset=' + charset.toLowerCase() - } - - return mime -} - -/** - * Get the default extension for a MIME type. - * - * @param {string} type - * @return {boolean|string} - */ - -function extension(type) { - if (!type || typeof type !== 'string') { - return false - } - - // TODO: use media-typer - var match = extractTypeRegExp.exec(type) - - // get extensions - var exts = match && exports.extensions[match[1].toLowerCase()] - - if (!exts || !exts.length) { - return false - } - - return exts[0] -} - -/** - * Lookup the MIME type for a file path/extension. - * - * @param {string} path - * @return {boolean|string} - */ - -function lookup(path) { - if (!path || typeof path !== 'string') { - return false - } - - // get the extension ("ext" or ".ext" or full path) - var extension = extname('x.' + path) - .toLowerCase() - .substr(1) - - if (!extension) { - return false - } - - return exports.types[extension] || false -} - -/** - * Populate the extensions and types maps. - * @private - */ - -function populateMaps(extensions, types) { - // source preference (least -> most) - var preference = ['nginx', 'apache', undefined, 'iana'] - - Object.keys(db).forEach(function forEachMimeType(type) { - var mime = db[type] - var exts = mime.extensions - - if (!exts || !exts.length) { - return - } - - // mime -> extensions - extensions[type] = exts - - // extension -> mime - for (var i = 0; i < exts.length; i++) { - var extension = exts[i] - - if (types[extension]) { - var from = preference.indexOf(db[types[extension]].source) - var to = preference.indexOf(mime.source) - - if (types[extension] !== 'application/octet-stream' - && from > to || (from === to && types[extension].substr(0, 12) === 'application/')) { - // skip the remapping - continue - } - } - - // set the extension -> mime - types[extension] = type - } - }) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/HISTORY.md deleted file mode 100644 index 87ab929..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/HISTORY.md +++ /dev/null @@ -1,266 +0,0 @@ -1.18.0 / 2015-09-03 -=================== - - * Add `application/pkcs12` - * Add `application/vnd.3gpp-prose+xml` - * Add `application/vnd.3gpp.mid-call+xml` - * Add `application/vnd.3gpp.state-and-event-info+xml` - * Add `application/vnd.anki` - * Add `application/vnd.firemonkeys.cloudcell` - * Add `application/vnd.openblox.game+xml` - * Add `application/vnd.openblox.game-binary` - -1.17.0 / 2015-08-13 -=================== - - * Add `application/x-msdos-program` - * Add `audio/g711-0` - * Add `image/vnd.mozilla.apng` - * Add extension `.exe` to `application/x-msdos-program` - -1.16.0 / 2015-07-29 -=================== - - * Add `application/vnd.uri-map` - -1.15.0 / 2015-07-13 -=================== - - * Add `application/x-httpd-php` - -1.14.0 / 2015-06-25 -=================== - - * Add `application/scim+json` - * Add `application/vnd.3gpp.ussd+xml` - * Add `application/vnd.biopax.rdf+xml` - * Add `text/x-processing` - -1.13.0 / 2015-06-07 -=================== - - * Add nginx as a source - * Add `application/x-cocoa` - * Add `application/x-java-archive-diff` - * Add `application/x-makeself` - * Add `application/x-perl` - * Add `application/x-pilot` - * Add `application/x-redhat-package-manager` - * Add `application/x-sea` - * Add `audio/x-m4a` - * Add `audio/x-realaudio` - * Add `image/x-jng` - * Add `text/mathml` - -1.12.0 / 2015-06-05 -=================== - - * Add `application/bdoc` - * Add `application/vnd.hyperdrive+json` - * Add `application/x-bdoc` - * Add extension `.rtf` to `text/rtf` - -1.11.0 / 2015-05-31 -=================== - - * Add `audio/wav` - * Add `audio/wave` - * Add extension `.litcoffee` to `text/coffeescript` - * Add extension `.sfd-hdstx` to `application/vnd.hydrostatix.sof-data` - * Add extension `.n-gage` to `application/vnd.nokia.n-gage.symbian.install` - -1.10.0 / 2015-05-19 -=================== - - * Add `application/vnd.balsamiq.bmpr` - * Add `application/vnd.microsoft.portable-executable` - * Add `application/x-ns-proxy-autoconfig` - -1.9.1 / 2015-04-19 -================== - - * Remove `.json` extension from `application/manifest+json` - - This is causing bugs downstream - -1.9.0 / 2015-04-19 -================== - - * Add `application/manifest+json` - * Add `application/vnd.micro+json` - * Add `image/vnd.zbrush.pcx` - * Add `image/x-ms-bmp` - -1.8.0 / 2015-03-13 -================== - - * Add `application/vnd.citationstyles.style+xml` - * Add `application/vnd.fastcopy-disk-image` - * Add `application/vnd.gov.sk.xmldatacontainer+xml` - * Add extension `.jsonld` to `application/ld+json` - -1.7.0 / 2015-02-08 -================== - - * Add `application/vnd.gerber` - * Add `application/vnd.msa-disk-image` - -1.6.1 / 2015-02-05 -================== - - * Community extensions ownership transferred from `node-mime` - -1.6.0 / 2015-01-29 -================== - - * Add `application/jose` - * Add `application/jose+json` - * Add `application/json-seq` - * Add `application/jwk+json` - * Add `application/jwk-set+json` - * Add `application/jwt` - * Add `application/rdap+json` - * Add `application/vnd.gov.sk.e-form+xml` - * Add `application/vnd.ims.imsccv1p3` - -1.5.0 / 2014-12-30 -================== - - * Add `application/vnd.oracle.resource+json` - * Fix various invalid MIME type entries - - `application/mbox+xml` - - `application/oscp-response` - - `application/vwg-multiplexed` - - `audio/g721` - -1.4.0 / 2014-12-21 -================== - - * Add `application/vnd.ims.imsccv1p2` - * Fix various invalid MIME type entries - - `application/vnd-acucobol` - - `application/vnd-curl` - - `application/vnd-dart` - - `application/vnd-dxr` - - `application/vnd-fdf` - - `application/vnd-mif` - - `application/vnd-sema` - - `application/vnd-wap-wmlc` - - `application/vnd.adobe.flash-movie` - - `application/vnd.dece-zip` - - `application/vnd.dvb_service` - - `application/vnd.micrografx-igx` - - `application/vnd.sealed-doc` - - `application/vnd.sealed-eml` - - `application/vnd.sealed-mht` - - `application/vnd.sealed-ppt` - - `application/vnd.sealed-tiff` - - `application/vnd.sealed-xls` - - `application/vnd.sealedmedia.softseal-html` - - `application/vnd.sealedmedia.softseal-pdf` - - `application/vnd.wap-slc` - - `application/vnd.wap-wbxml` - - `audio/vnd.sealedmedia.softseal-mpeg` - - `image/vnd-djvu` - - `image/vnd-svf` - - `image/vnd-wap-wbmp` - - `image/vnd.sealed-png` - - `image/vnd.sealedmedia.softseal-gif` - - `image/vnd.sealedmedia.softseal-jpg` - - `model/vnd-dwf` - - `model/vnd.parasolid.transmit-binary` - - `model/vnd.parasolid.transmit-text` - - `text/vnd-a` - - `text/vnd-curl` - - `text/vnd.wap-wml` - * Remove example template MIME types - - `application/example` - - `audio/example` - - `image/example` - - `message/example` - - `model/example` - - `multipart/example` - - `text/example` - - `video/example` - -1.3.1 / 2014-12-16 -================== - - * Fix missing extensions - - `application/json5` - - `text/hjson` - -1.3.0 / 2014-12-07 -================== - - * Add `application/a2l` - * Add `application/aml` - * Add `application/atfx` - * Add `application/atxml` - * Add `application/cdfx+xml` - * Add `application/dii` - * Add `application/json5` - * Add `application/lxf` - * Add `application/mf4` - * Add `application/vnd.apache.thrift.compact` - * Add `application/vnd.apache.thrift.json` - * Add `application/vnd.coffeescript` - * Add `application/vnd.enphase.envoy` - * Add `application/vnd.ims.imsccv1p1` - * Add `text/csv-schema` - * Add `text/hjson` - * Add `text/markdown` - * Add `text/yaml` - -1.2.0 / 2014-11-09 -================== - - * Add `application/cea` - * Add `application/dit` - * Add `application/vnd.gov.sk.e-form+zip` - * Add `application/vnd.tmd.mediaflex.api+xml` - * Type `application/epub+zip` is now IANA-registered - -1.1.2 / 2014-10-23 -================== - - * Rebuild database for `application/x-www-form-urlencoded` change - -1.1.1 / 2014-10-20 -================== - - * Mark `application/x-www-form-urlencoded` as compressible. - -1.1.0 / 2014-09-28 -================== - - * Add `application/font-woff2` - -1.0.3 / 2014-09-25 -================== - - * Fix engine requirement in package - -1.0.2 / 2014-09-25 -================== - - * Add `application/coap-group+json` - * Add `application/dcd` - * Add `application/vnd.apache.thrift.binary` - * Add `image/vnd.tencent.tap` - * Mark all JSON-derived types as compressible - * Update `text/vtt` data - -1.0.1 / 2014-08-30 -================== - - * Fix extension ordering - -1.0.0 / 2014-08-30 -================== - - * Add `application/atf` - * Add `application/merge-patch+json` - * Add `multipart/x-mixed-replace` - * Add `source: 'apache'` metadata - * Add `source: 'iana'` metadata - * Remove badly-assumed charset data diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/README.md deleted file mode 100644 index 164cca0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# mime-db - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Downloads][npm-downloads-image]][npm-url] -[![Node.js Version][node-image]][node-url] -[![Build Status][travis-image]][travis-url] -[![Coverage Status][coveralls-image]][coveralls-url] - -This is a database of all mime types. -It consists of a single, public JSON file and does not include any logic, -allowing it to remain as un-opinionated as possible with an API. -It aggregates data from the following sources: - -- http://www.iana.org/assignments/media-types/media-types.xhtml -- http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -- http://hg.nginx.org/nginx/raw-file/default/conf/mime.types - -## Installation - -```bash -npm install mime-db -``` - -### Database Download - -If you're crazy enough to use this in the browser, you can just grab the -JSON file using [RawGit](https://rawgit.com/). It is recommended to replace -`master` with [a release tag](https://github.com/jshttp/mime-db/tags) as the -JSON format may change in the future. - -``` -https://cdn.rawgit.com/jshttp/mime-db/master/db.json -``` - -## Usage - -```js -var db = require('mime-db'); - -// grab data on .js files -var data = db['application/javascript']; -``` - -## Data Structure - -The JSON file is a map lookup for lowercased mime types. -Each mime type has the following properties: - -- `.source` - where the mime type is defined. - If not set, it's probably a custom media type. - - `apache` - [Apache common media types](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types) - - `iana` - [IANA-defined media types](http://www.iana.org/assignments/media-types/media-types.xhtml) - - `nginx` - [nginx media types](http://hg.nginx.org/nginx/raw-file/default/conf/mime.types) -- `.extensions[]` - known extensions associated with this mime type. -- `.compressible` - whether a file of this type is can be gzipped. -- `.charset` - the default charset associated with this type, if any. - -If unknown, every property could be `undefined`. - -## Contributing - -To edit the database, only make PRs against `src/custom.json` or -`src/custom-suffix.json`. - -To update the build, run `npm run build`. - -## Adding Custom Media Types - -The best way to get new media types included in this library is to register -them with the IANA. The community registration procedure is outlined in -[RFC 6838 section 5](http://tools.ietf.org/html/rfc6838#section-5). Types -registered with the IANA are automatically pulled into this library. - -[npm-version-image]: https://img.shields.io/npm/v/mime-db.svg -[npm-downloads-image]: https://img.shields.io/npm/dm/mime-db.svg -[npm-url]: https://npmjs.org/package/mime-db -[travis-image]: https://img.shields.io/travis/jshttp/mime-db/master.svg -[travis-url]: https://travis-ci.org/jshttp/mime-db -[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-db/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/mime-db?branch=master -[node-image]: https://img.shields.io/node/v/mime-db.svg -[node-url]: http://nodejs.org/download/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/db.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/db.json deleted file mode 100644 index 96aae45..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/db.json +++ /dev/null @@ -1,6460 +0,0 @@ -{ - "application/1d-interleaved-parityfec": { - "source": "iana" - }, - "application/3gpdash-qoe-report+xml": { - "source": "iana" - }, - "application/3gpp-ims+xml": { - "source": "iana" - }, - "application/a2l": { - "source": "iana" - }, - "application/activemessage": { - "source": "iana" - }, - "application/alto-costmap+json": { - "source": "iana", - "compressible": true - }, - "application/alto-costmapfilter+json": { - "source": "iana", - "compressible": true - }, - "application/alto-directory+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointcost+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointcostparams+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointprop+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointpropparams+json": { - "source": "iana", - "compressible": true - }, - "application/alto-error+json": { - "source": "iana", - "compressible": true - }, - "application/alto-networkmap+json": { - "source": "iana", - "compressible": true - }, - "application/alto-networkmapfilter+json": { - "source": "iana", - "compressible": true - }, - "application/aml": { - "source": "iana" - }, - "application/andrew-inset": { - "source": "iana", - "extensions": ["ez"] - }, - "application/applefile": { - "source": "iana" - }, - "application/applixware": { - "source": "apache", - "extensions": ["aw"] - }, - "application/atf": { - "source": "iana" - }, - "application/atfx": { - "source": "iana" - }, - "application/atom+xml": { - "source": "iana", - "compressible": true, - "extensions": ["atom"] - }, - "application/atomcat+xml": { - "source": "iana", - "extensions": ["atomcat"] - }, - "application/atomdeleted+xml": { - "source": "iana" - }, - "application/atomicmail": { - "source": "iana" - }, - "application/atomsvc+xml": { - "source": "iana", - "extensions": ["atomsvc"] - }, - "application/atxml": { - "source": "iana" - }, - "application/auth-policy+xml": { - "source": "iana" - }, - "application/bacnet-xdd+zip": { - "source": "iana" - }, - "application/batch-smtp": { - "source": "iana" - }, - "application/bdoc": { - "compressible": false, - "extensions": ["bdoc"] - }, - "application/beep+xml": { - "source": "iana" - }, - "application/calendar+json": { - "source": "iana", - "compressible": true - }, - "application/calendar+xml": { - "source": "iana" - }, - "application/call-completion": { - "source": "iana" - }, - "application/cals-1840": { - "source": "iana" - }, - "application/cbor": { - "source": "iana" - }, - "application/ccmp+xml": { - "source": "iana" - }, - "application/ccxml+xml": { - "source": "iana", - "extensions": ["ccxml"] - }, - "application/cdfx+xml": { - "source": "iana" - }, - "application/cdmi-capability": { - "source": "iana", - "extensions": ["cdmia"] - }, - "application/cdmi-container": { - "source": "iana", - "extensions": ["cdmic"] - }, - "application/cdmi-domain": { - "source": "iana", - "extensions": ["cdmid"] - }, - "application/cdmi-object": { - "source": "iana", - "extensions": ["cdmio"] - }, - "application/cdmi-queue": { - "source": "iana", - "extensions": ["cdmiq"] - }, - "application/cea": { - "source": "iana" - }, - "application/cea-2018+xml": { - "source": "iana" - }, - "application/cellml+xml": { - "source": "iana" - }, - "application/cfw": { - "source": "iana" - }, - "application/cms": { - "source": "iana" - }, - "application/cnrp+xml": { - "source": "iana" - }, - "application/coap-group+json": { - "source": "iana", - "compressible": true - }, - "application/commonground": { - "source": "iana" - }, - "application/conference-info+xml": { - "source": "iana" - }, - "application/cpl+xml": { - "source": "iana" - }, - "application/csrattrs": { - "source": "iana" - }, - "application/csta+xml": { - "source": "iana" - }, - "application/cstadata+xml": { - "source": "iana" - }, - "application/cu-seeme": { - "source": "apache", - "extensions": ["cu"] - }, - "application/cybercash": { - "source": "iana" - }, - "application/dart": { - "compressible": true - }, - "application/dash+xml": { - "source": "iana", - "extensions": ["mdp"] - }, - "application/dashdelta": { - "source": "iana" - }, - "application/davmount+xml": { - "source": "iana", - "extensions": ["davmount"] - }, - "application/dca-rft": { - "source": "iana" - }, - "application/dcd": { - "source": "iana" - }, - "application/dec-dx": { - "source": "iana" - }, - "application/dialog-info+xml": { - "source": "iana" - }, - "application/dicom": { - "source": "iana" - }, - "application/dii": { - "source": "iana" - }, - "application/dit": { - "source": "iana" - }, - "application/dns": { - "source": "iana" - }, - "application/docbook+xml": { - "source": "apache", - "extensions": ["dbk"] - }, - "application/dskpp+xml": { - "source": "iana" - }, - "application/dssc+der": { - "source": "iana", - "extensions": ["dssc"] - }, - "application/dssc+xml": { - "source": "iana", - "extensions": ["xdssc"] - }, - "application/dvcs": { - "source": "iana" - }, - "application/ecmascript": { - "source": "iana", - "compressible": true, - "extensions": ["ecma"] - }, - "application/edi-consent": { - "source": "iana" - }, - "application/edi-x12": { - "source": "iana", - "compressible": false - }, - "application/edifact": { - "source": "iana", - "compressible": false - }, - "application/emma+xml": { - "source": "iana", - "extensions": ["emma"] - }, - "application/emotionml+xml": { - "source": "iana" - }, - "application/encaprtp": { - "source": "iana" - }, - "application/epp+xml": { - "source": "iana" - }, - "application/epub+zip": { - "source": "iana", - "extensions": ["epub"] - }, - "application/eshop": { - "source": "iana" - }, - "application/exi": { - "source": "iana", - "extensions": ["exi"] - }, - "application/fastinfoset": { - "source": "iana" - }, - "application/fastsoap": { - "source": "iana" - }, - "application/fdt+xml": { - "source": "iana" - }, - "application/fits": { - "source": "iana" - }, - "application/font-sfnt": { - "source": "iana" - }, - "application/font-tdpfr": { - "source": "iana", - "extensions": ["pfr"] - }, - "application/font-woff": { - "source": "iana", - "compressible": false, - "extensions": ["woff"] - }, - "application/font-woff2": { - "compressible": false, - "extensions": ["woff2"] - }, - "application/framework-attributes+xml": { - "source": "iana" - }, - "application/gml+xml": { - "source": "apache", - "extensions": ["gml"] - }, - "application/gpx+xml": { - "source": "apache", - "extensions": ["gpx"] - }, - "application/gxf": { - "source": "apache", - "extensions": ["gxf"] - }, - "application/gzip": { - "source": "iana", - "compressible": false - }, - "application/h224": { - "source": "iana" - }, - "application/held+xml": { - "source": "iana" - }, - "application/http": { - "source": "iana" - }, - "application/hyperstudio": { - "source": "iana", - "extensions": ["stk"] - }, - "application/ibe-key-request+xml": { - "source": "iana" - }, - "application/ibe-pkg-reply+xml": { - "source": "iana" - }, - "application/ibe-pp-data": { - "source": "iana" - }, - "application/iges": { - "source": "iana" - }, - "application/im-iscomposing+xml": { - "source": "iana" - }, - "application/index": { - "source": "iana" - }, - "application/index.cmd": { - "source": "iana" - }, - "application/index.obj": { - "source": "iana" - }, - "application/index.response": { - "source": "iana" - }, - "application/index.vnd": { - "source": "iana" - }, - "application/inkml+xml": { - "source": "iana", - "extensions": ["ink","inkml"] - }, - "application/iotp": { - "source": "iana" - }, - "application/ipfix": { - "source": "iana", - "extensions": ["ipfix"] - }, - "application/ipp": { - "source": "iana" - }, - "application/isup": { - "source": "iana" - }, - "application/its+xml": { - "source": "iana" - }, - "application/java-archive": { - "source": "apache", - "compressible": false, - "extensions": ["jar","war","ear"] - }, - "application/java-serialized-object": { - "source": "apache", - "compressible": false, - "extensions": ["ser"] - }, - "application/java-vm": { - "source": "apache", - "compressible": false, - "extensions": ["class"] - }, - "application/javascript": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["js"] - }, - "application/jose": { - "source": "iana" - }, - "application/jose+json": { - "source": "iana", - "compressible": true - }, - "application/jrd+json": { - "source": "iana", - "compressible": true - }, - "application/json": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["json","map"] - }, - "application/json-patch+json": { - "source": "iana", - "compressible": true - }, - "application/json-seq": { - "source": "iana" - }, - "application/json5": { - "extensions": ["json5"] - }, - "application/jsonml+json": { - "source": "apache", - "compressible": true, - "extensions": ["jsonml"] - }, - "application/jwk+json": { - "source": "iana", - "compressible": true - }, - "application/jwk-set+json": { - "source": "iana", - "compressible": true - }, - "application/jwt": { - "source": "iana" - }, - "application/kpml-request+xml": { - "source": "iana" - }, - "application/kpml-response+xml": { - "source": "iana" - }, - "application/ld+json": { - "source": "iana", - "compressible": true, - "extensions": ["jsonld"] - }, - "application/link-format": { - "source": "iana" - }, - "application/load-control+xml": { - "source": "iana" - }, - "application/lost+xml": { - "source": "iana", - "extensions": ["lostxml"] - }, - "application/lostsync+xml": { - "source": "iana" - }, - "application/lxf": { - "source": "iana" - }, - "application/mac-binhex40": { - "source": "iana", - "extensions": ["hqx"] - }, - "application/mac-compactpro": { - "source": "apache", - "extensions": ["cpt"] - }, - "application/macwriteii": { - "source": "iana" - }, - "application/mads+xml": { - "source": "iana", - "extensions": ["mads"] - }, - "application/manifest+json": { - "charset": "UTF-8", - "compressible": true, - "extensions": ["webmanifest"] - }, - "application/marc": { - "source": "iana", - "extensions": ["mrc"] - }, - "application/marcxml+xml": { - "source": "iana", - "extensions": ["mrcx"] - }, - "application/mathematica": { - "source": "iana", - "extensions": ["ma","nb","mb"] - }, - "application/mathml+xml": { - "source": "iana", - "extensions": ["mathml"] - }, - "application/mathml-content+xml": { - "source": "iana" - }, - "application/mathml-presentation+xml": { - "source": "iana" - }, - "application/mbms-associated-procedure-description+xml": { - "source": "iana" - }, - "application/mbms-deregister+xml": { - "source": "iana" - }, - "application/mbms-envelope+xml": { - "source": "iana" - }, - "application/mbms-msk+xml": { - "source": "iana" - }, - "application/mbms-msk-response+xml": { - "source": "iana" - }, - "application/mbms-protection-description+xml": { - "source": "iana" - }, - "application/mbms-reception-report+xml": { - "source": "iana" - }, - "application/mbms-register+xml": { - "source": "iana" - }, - "application/mbms-register-response+xml": { - "source": "iana" - }, - "application/mbms-schedule+xml": { - "source": "iana" - }, - "application/mbms-user-service-description+xml": { - "source": "iana" - }, - "application/mbox": { - "source": "iana", - "extensions": ["mbox"] - }, - "application/media-policy-dataset+xml": { - "source": "iana" - }, - "application/media_control+xml": { - "source": "iana" - }, - "application/mediaservercontrol+xml": { - "source": "iana", - "extensions": ["mscml"] - }, - "application/merge-patch+json": { - "source": "iana", - "compressible": true - }, - "application/metalink+xml": { - "source": "apache", - "extensions": ["metalink"] - }, - "application/metalink4+xml": { - "source": "iana", - "extensions": ["meta4"] - }, - "application/mets+xml": { - "source": "iana", - "extensions": ["mets"] - }, - "application/mf4": { - "source": "iana" - }, - "application/mikey": { - "source": "iana" - }, - "application/mods+xml": { - "source": "iana", - "extensions": ["mods"] - }, - "application/moss-keys": { - "source": "iana" - }, - "application/moss-signature": { - "source": "iana" - }, - "application/mosskey-data": { - "source": "iana" - }, - "application/mosskey-request": { - "source": "iana" - }, - "application/mp21": { - "source": "iana", - "extensions": ["m21","mp21"] - }, - "application/mp4": { - "source": "iana", - "extensions": ["mp4s","m4p"] - }, - "application/mpeg4-generic": { - "source": "iana" - }, - "application/mpeg4-iod": { - "source": "iana" - }, - "application/mpeg4-iod-xmt": { - "source": "iana" - }, - "application/mrb-consumer+xml": { - "source": "iana" - }, - "application/mrb-publish+xml": { - "source": "iana" - }, - "application/msc-ivr+xml": { - "source": "iana" - }, - "application/msc-mixer+xml": { - "source": "iana" - }, - "application/msword": { - "source": "iana", - "compressible": false, - "extensions": ["doc","dot"] - }, - "application/mxf": { - "source": "iana", - "extensions": ["mxf"] - }, - "application/nasdata": { - "source": "iana" - }, - "application/news-checkgroups": { - "source": "iana" - }, - "application/news-groupinfo": { - "source": "iana" - }, - "application/news-transmission": { - "source": "iana" - }, - "application/nlsml+xml": { - "source": "iana" - }, - "application/nss": { - "source": "iana" - }, - "application/ocsp-request": { - "source": "iana" - }, - "application/ocsp-response": { - "source": "iana" - }, - "application/octet-stream": { - "source": "iana", - "compressible": false, - "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"] - }, - "application/oda": { - "source": "iana", - "extensions": ["oda"] - }, - "application/odx": { - "source": "iana" - }, - "application/oebps-package+xml": { - "source": "iana", - "extensions": ["opf"] - }, - "application/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["ogx"] - }, - "application/omdoc+xml": { - "source": "apache", - "extensions": ["omdoc"] - }, - "application/onenote": { - "source": "apache", - "extensions": ["onetoc","onetoc2","onetmp","onepkg"] - }, - "application/oxps": { - "source": "iana", - "extensions": ["oxps"] - }, - "application/p2p-overlay+xml": { - "source": "iana" - }, - "application/parityfec": { - "source": "iana" - }, - "application/patch-ops-error+xml": { - "source": "iana", - "extensions": ["xer"] - }, - "application/pdf": { - "source": "iana", - "compressible": false, - "extensions": ["pdf"] - }, - "application/pdx": { - "source": "iana" - }, - "application/pgp-encrypted": { - "source": "iana", - "compressible": false, - "extensions": ["pgp"] - }, - "application/pgp-keys": { - "source": "iana" - }, - "application/pgp-signature": { - "source": "iana", - "extensions": ["asc","sig"] - }, - "application/pics-rules": { - "source": "apache", - "extensions": ["prf"] - }, - "application/pidf+xml": { - "source": "iana" - }, - "application/pidf-diff+xml": { - "source": "iana" - }, - "application/pkcs10": { - "source": "iana", - "extensions": ["p10"] - }, - "application/pkcs12": { - "source": "iana" - }, - "application/pkcs7-mime": { - "source": "iana", - "extensions": ["p7m","p7c"] - }, - "application/pkcs7-signature": { - "source": "iana", - "extensions": ["p7s"] - }, - "application/pkcs8": { - "source": "iana", - "extensions": ["p8"] - }, - "application/pkix-attr-cert": { - "source": "iana", - "extensions": ["ac"] - }, - "application/pkix-cert": { - "source": "iana", - "extensions": ["cer"] - }, - "application/pkix-crl": { - "source": "iana", - "extensions": ["crl"] - }, - "application/pkix-pkipath": { - "source": "iana", - "extensions": ["pkipath"] - }, - "application/pkixcmp": { - "source": "iana", - "extensions": ["pki"] - }, - "application/pls+xml": { - "source": "iana", - "extensions": ["pls"] - }, - "application/poc-settings+xml": { - "source": "iana" - }, - "application/postscript": { - "source": "iana", - "compressible": true, - "extensions": ["ai","eps","ps"] - }, - "application/provenance+xml": { - "source": "iana" - }, - "application/prs.alvestrand.titrax-sheet": { - "source": "iana" - }, - "application/prs.cww": { - "source": "iana", - "extensions": ["cww"] - }, - "application/prs.hpub+zip": { - "source": "iana" - }, - "application/prs.nprend": { - "source": "iana" - }, - "application/prs.plucker": { - "source": "iana" - }, - "application/prs.rdf-xml-crypt": { - "source": "iana" - }, - "application/prs.xsf+xml": { - "source": "iana" - }, - "application/pskc+xml": { - "source": "iana", - "extensions": ["pskcxml"] - }, - "application/qsig": { - "source": "iana" - }, - "application/raptorfec": { - "source": "iana" - }, - "application/rdap+json": { - "source": "iana", - "compressible": true - }, - "application/rdf+xml": { - "source": "iana", - "compressible": true, - "extensions": ["rdf"] - }, - "application/reginfo+xml": { - "source": "iana", - "extensions": ["rif"] - }, - "application/relax-ng-compact-syntax": { - "source": "iana", - "extensions": ["rnc"] - }, - "application/remote-printing": { - "source": "iana" - }, - "application/reputon+json": { - "source": "iana", - "compressible": true - }, - "application/resource-lists+xml": { - "source": "iana", - "extensions": ["rl"] - }, - "application/resource-lists-diff+xml": { - "source": "iana", - "extensions": ["rld"] - }, - "application/riscos": { - "source": "iana" - }, - "application/rlmi+xml": { - "source": "iana" - }, - "application/rls-services+xml": { - "source": "iana", - "extensions": ["rs"] - }, - "application/rpki-ghostbusters": { - "source": "iana", - "extensions": ["gbr"] - }, - "application/rpki-manifest": { - "source": "iana", - "extensions": ["mft"] - }, - "application/rpki-roa": { - "source": "iana", - "extensions": ["roa"] - }, - "application/rpki-updown": { - "source": "iana" - }, - "application/rsd+xml": { - "source": "apache", - "extensions": ["rsd"] - }, - "application/rss+xml": { - "source": "apache", - "compressible": true, - "extensions": ["rss"] - }, - "application/rtf": { - "source": "iana", - "compressible": true, - "extensions": ["rtf"] - }, - "application/rtploopback": { - "source": "iana" - }, - "application/rtx": { - "source": "iana" - }, - "application/samlassertion+xml": { - "source": "iana" - }, - "application/samlmetadata+xml": { - "source": "iana" - }, - "application/sbml+xml": { - "source": "iana", - "extensions": ["sbml"] - }, - "application/scaip+xml": { - "source": "iana" - }, - "application/scim+json": { - "source": "iana", - "compressible": true - }, - "application/scvp-cv-request": { - "source": "iana", - "extensions": ["scq"] - }, - "application/scvp-cv-response": { - "source": "iana", - "extensions": ["scs"] - }, - "application/scvp-vp-request": { - "source": "iana", - "extensions": ["spq"] - }, - "application/scvp-vp-response": { - "source": "iana", - "extensions": ["spp"] - }, - "application/sdp": { - "source": "iana", - "extensions": ["sdp"] - }, - "application/sep+xml": { - "source": "iana" - }, - "application/sep-exi": { - "source": "iana" - }, - "application/session-info": { - "source": "iana" - }, - "application/set-payment": { - "source": "iana" - }, - "application/set-payment-initiation": { - "source": "iana", - "extensions": ["setpay"] - }, - "application/set-registration": { - "source": "iana" - }, - "application/set-registration-initiation": { - "source": "iana", - "extensions": ["setreg"] - }, - "application/sgml": { - "source": "iana" - }, - "application/sgml-open-catalog": { - "source": "iana" - }, - "application/shf+xml": { - "source": "iana", - "extensions": ["shf"] - }, - "application/sieve": { - "source": "iana" - }, - "application/simple-filter+xml": { - "source": "iana" - }, - "application/simple-message-summary": { - "source": "iana" - }, - "application/simplesymbolcontainer": { - "source": "iana" - }, - "application/slate": { - "source": "iana" - }, - "application/smil": { - "source": "iana" - }, - "application/smil+xml": { - "source": "iana", - "extensions": ["smi","smil"] - }, - "application/smpte336m": { - "source": "iana" - }, - "application/soap+fastinfoset": { - "source": "iana" - }, - "application/soap+xml": { - "source": "iana", - "compressible": true - }, - "application/sparql-query": { - "source": "iana", - "extensions": ["rq"] - }, - "application/sparql-results+xml": { - "source": "iana", - "extensions": ["srx"] - }, - "application/spirits-event+xml": { - "source": "iana" - }, - "application/sql": { - "source": "iana" - }, - "application/srgs": { - "source": "iana", - "extensions": ["gram"] - }, - "application/srgs+xml": { - "source": "iana", - "extensions": ["grxml"] - }, - "application/sru+xml": { - "source": "iana", - "extensions": ["sru"] - }, - "application/ssdl+xml": { - "source": "apache", - "extensions": ["ssdl"] - }, - "application/ssml+xml": { - "source": "iana", - "extensions": ["ssml"] - }, - "application/tamp-apex-update": { - "source": "iana" - }, - "application/tamp-apex-update-confirm": { - "source": "iana" - }, - "application/tamp-community-update": { - "source": "iana" - }, - "application/tamp-community-update-confirm": { - "source": "iana" - }, - "application/tamp-error": { - "source": "iana" - }, - "application/tamp-sequence-adjust": { - "source": "iana" - }, - "application/tamp-sequence-adjust-confirm": { - "source": "iana" - }, - "application/tamp-status-query": { - "source": "iana" - }, - "application/tamp-status-response": { - "source": "iana" - }, - "application/tamp-update": { - "source": "iana" - }, - "application/tamp-update-confirm": { - "source": "iana" - }, - "application/tar": { - "compressible": true - }, - "application/tei+xml": { - "source": "iana", - "extensions": ["tei","teicorpus"] - }, - "application/thraud+xml": { - "source": "iana", - "extensions": ["tfi"] - }, - "application/timestamp-query": { - "source": "iana" - }, - "application/timestamp-reply": { - "source": "iana" - }, - "application/timestamped-data": { - "source": "iana", - "extensions": ["tsd"] - }, - "application/ttml+xml": { - "source": "iana" - }, - "application/tve-trigger": { - "source": "iana" - }, - "application/ulpfec": { - "source": "iana" - }, - "application/urc-grpsheet+xml": { - "source": "iana" - }, - "application/urc-ressheet+xml": { - "source": "iana" - }, - "application/urc-targetdesc+xml": { - "source": "iana" - }, - "application/urc-uisocketdesc+xml": { - "source": "iana" - }, - "application/vcard+json": { - "source": "iana", - "compressible": true - }, - "application/vcard+xml": { - "source": "iana" - }, - "application/vemmi": { - "source": "iana" - }, - "application/vividence.scriptfile": { - "source": "apache" - }, - "application/vnd.3gpp-prose+xml": { - "source": "iana" - }, - "application/vnd.3gpp.bsf+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mid-call+xml": { - "source": "iana" - }, - "application/vnd.3gpp.pic-bw-large": { - "source": "iana", - "extensions": ["plb"] - }, - "application/vnd.3gpp.pic-bw-small": { - "source": "iana", - "extensions": ["psb"] - }, - "application/vnd.3gpp.pic-bw-var": { - "source": "iana", - "extensions": ["pvb"] - }, - "application/vnd.3gpp.sms": { - "source": "iana" - }, - "application/vnd.3gpp.state-and-event-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.ussd+xml": { - "source": "iana" - }, - "application/vnd.3gpp2.bcmcsinfo+xml": { - "source": "iana" - }, - "application/vnd.3gpp2.sms": { - "source": "iana" - }, - "application/vnd.3gpp2.tcap": { - "source": "iana", - "extensions": ["tcap"] - }, - "application/vnd.3m.post-it-notes": { - "source": "iana", - "extensions": ["pwn"] - }, - "application/vnd.accpac.simply.aso": { - "source": "iana", - "extensions": ["aso"] - }, - "application/vnd.accpac.simply.imp": { - "source": "iana", - "extensions": ["imp"] - }, - "application/vnd.acucobol": { - "source": "iana", - "extensions": ["acu"] - }, - "application/vnd.acucorp": { - "source": "iana", - "extensions": ["atc","acutc"] - }, - "application/vnd.adobe.air-application-installer-package+zip": { - "source": "apache", - "extensions": ["air"] - }, - "application/vnd.adobe.flash.movie": { - "source": "iana" - }, - "application/vnd.adobe.formscentral.fcdt": { - "source": "iana", - "extensions": ["fcdt"] - }, - "application/vnd.adobe.fxp": { - "source": "iana", - "extensions": ["fxp","fxpl"] - }, - "application/vnd.adobe.partial-upload": { - "source": "iana" - }, - "application/vnd.adobe.xdp+xml": { - "source": "iana", - "extensions": ["xdp"] - }, - "application/vnd.adobe.xfdf": { - "source": "iana", - "extensions": ["xfdf"] - }, - "application/vnd.aether.imp": { - "source": "iana" - }, - "application/vnd.ah-barcode": { - "source": "iana" - }, - "application/vnd.ahead.space": { - "source": "iana", - "extensions": ["ahead"] - }, - "application/vnd.airzip.filesecure.azf": { - "source": "iana", - "extensions": ["azf"] - }, - "application/vnd.airzip.filesecure.azs": { - "source": "iana", - "extensions": ["azs"] - }, - "application/vnd.amazon.ebook": { - "source": "apache", - "extensions": ["azw"] - }, - "application/vnd.americandynamics.acc": { - "source": "iana", - "extensions": ["acc"] - }, - "application/vnd.amiga.ami": { - "source": "iana", - "extensions": ["ami"] - }, - "application/vnd.amundsen.maze+xml": { - "source": "iana" - }, - "application/vnd.android.package-archive": { - "source": "apache", - "compressible": false, - "extensions": ["apk"] - }, - "application/vnd.anki": { - "source": "iana" - }, - "application/vnd.anser-web-certificate-issue-initiation": { - "source": "iana", - "extensions": ["cii"] - }, - "application/vnd.anser-web-funds-transfer-initiation": { - "source": "apache", - "extensions": ["fti"] - }, - "application/vnd.antix.game-component": { - "source": "iana", - "extensions": ["atx"] - }, - "application/vnd.apache.thrift.binary": { - "source": "iana" - }, - "application/vnd.apache.thrift.compact": { - "source": "iana" - }, - "application/vnd.apache.thrift.json": { - "source": "iana" - }, - "application/vnd.api+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.apple.installer+xml": { - "source": "iana", - "extensions": ["mpkg"] - }, - "application/vnd.apple.mpegurl": { - "source": "iana", - "extensions": ["m3u8"] - }, - "application/vnd.arastra.swi": { - "source": "iana" - }, - "application/vnd.aristanetworks.swi": { - "source": "iana", - "extensions": ["swi"] - }, - "application/vnd.artsquare": { - "source": "iana" - }, - "application/vnd.astraea-software.iota": { - "source": "iana", - "extensions": ["iota"] - }, - "application/vnd.audiograph": { - "source": "iana", - "extensions": ["aep"] - }, - "application/vnd.autopackage": { - "source": "iana" - }, - "application/vnd.avistar+xml": { - "source": "iana" - }, - "application/vnd.balsamiq.bmml+xml": { - "source": "iana" - }, - "application/vnd.balsamiq.bmpr": { - "source": "iana" - }, - "application/vnd.bekitzur-stech+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.biopax.rdf+xml": { - "source": "iana" - }, - "application/vnd.blueice.multipass": { - "source": "iana", - "extensions": ["mpm"] - }, - "application/vnd.bluetooth.ep.oob": { - "source": "iana" - }, - "application/vnd.bluetooth.le.oob": { - "source": "iana" - }, - "application/vnd.bmi": { - "source": "iana", - "extensions": ["bmi"] - }, - "application/vnd.businessobjects": { - "source": "iana", - "extensions": ["rep"] - }, - "application/vnd.cab-jscript": { - "source": "iana" - }, - "application/vnd.canon-cpdl": { - "source": "iana" - }, - "application/vnd.canon-lips": { - "source": "iana" - }, - "application/vnd.cendio.thinlinc.clientconf": { - "source": "iana" - }, - "application/vnd.century-systems.tcp_stream": { - "source": "iana" - }, - "application/vnd.chemdraw+xml": { - "source": "iana", - "extensions": ["cdxml"] - }, - "application/vnd.chipnuts.karaoke-mmd": { - "source": "iana", - "extensions": ["mmd"] - }, - "application/vnd.cinderella": { - "source": "iana", - "extensions": ["cdy"] - }, - "application/vnd.cirpack.isdn-ext": { - "source": "iana" - }, - "application/vnd.citationstyles.style+xml": { - "source": "iana" - }, - "application/vnd.claymore": { - "source": "iana", - "extensions": ["cla"] - }, - "application/vnd.cloanto.rp9": { - "source": "iana", - "extensions": ["rp9"] - }, - "application/vnd.clonk.c4group": { - "source": "iana", - "extensions": ["c4g","c4d","c4f","c4p","c4u"] - }, - "application/vnd.cluetrust.cartomobile-config": { - "source": "iana", - "extensions": ["c11amc"] - }, - "application/vnd.cluetrust.cartomobile-config-pkg": { - "source": "iana", - "extensions": ["c11amz"] - }, - "application/vnd.coffeescript": { - "source": "iana" - }, - "application/vnd.collection+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.collection.doc+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.collection.next+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.commerce-battelle": { - "source": "iana" - }, - "application/vnd.commonspace": { - "source": "iana", - "extensions": ["csp"] - }, - "application/vnd.contact.cmsg": { - "source": "iana", - "extensions": ["cdbcmsg"] - }, - "application/vnd.cosmocaller": { - "source": "iana", - "extensions": ["cmc"] - }, - "application/vnd.crick.clicker": { - "source": "iana", - "extensions": ["clkx"] - }, - "application/vnd.crick.clicker.keyboard": { - "source": "iana", - "extensions": ["clkk"] - }, - "application/vnd.crick.clicker.palette": { - "source": "iana", - "extensions": ["clkp"] - }, - "application/vnd.crick.clicker.template": { - "source": "iana", - "extensions": ["clkt"] - }, - "application/vnd.crick.clicker.wordbank": { - "source": "iana", - "extensions": ["clkw"] - }, - "application/vnd.criticaltools.wbs+xml": { - "source": "iana", - "extensions": ["wbs"] - }, - "application/vnd.ctc-posml": { - "source": "iana", - "extensions": ["pml"] - }, - "application/vnd.ctct.ws+xml": { - "source": "iana" - }, - "application/vnd.cups-pdf": { - "source": "iana" - }, - "application/vnd.cups-postscript": { - "source": "iana" - }, - "application/vnd.cups-ppd": { - "source": "iana", - "extensions": ["ppd"] - }, - "application/vnd.cups-raster": { - "source": "iana" - }, - "application/vnd.cups-raw": { - "source": "iana" - }, - "application/vnd.curl": { - "source": "iana" - }, - "application/vnd.curl.car": { - "source": "apache", - "extensions": ["car"] - }, - "application/vnd.curl.pcurl": { - "source": "apache", - "extensions": ["pcurl"] - }, - "application/vnd.cyan.dean.root+xml": { - "source": "iana" - }, - "application/vnd.cybank": { - "source": "iana" - }, - "application/vnd.dart": { - "source": "iana", - "compressible": true, - "extensions": ["dart"] - }, - "application/vnd.data-vision.rdz": { - "source": "iana", - "extensions": ["rdz"] - }, - "application/vnd.debian.binary-package": { - "source": "iana" - }, - "application/vnd.dece.data": { - "source": "iana", - "extensions": ["uvf","uvvf","uvd","uvvd"] - }, - "application/vnd.dece.ttml+xml": { - "source": "iana", - "extensions": ["uvt","uvvt"] - }, - "application/vnd.dece.unspecified": { - "source": "iana", - "extensions": ["uvx","uvvx"] - }, - "application/vnd.dece.zip": { - "source": "iana", - "extensions": ["uvz","uvvz"] - }, - "application/vnd.denovo.fcselayout-link": { - "source": "iana", - "extensions": ["fe_launch"] - }, - "application/vnd.desmume-movie": { - "source": "iana" - }, - "application/vnd.dir-bi.plate-dl-nosuffix": { - "source": "iana" - }, - "application/vnd.dm.delegation+xml": { - "source": "iana" - }, - "application/vnd.dna": { - "source": "iana", - "extensions": ["dna"] - }, - "application/vnd.document+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.dolby.mlp": { - "source": "apache", - "extensions": ["mlp"] - }, - "application/vnd.dolby.mobile.1": { - "source": "iana" - }, - "application/vnd.dolby.mobile.2": { - "source": "iana" - }, - "application/vnd.doremir.scorecloud-binary-document": { - "source": "iana" - }, - "application/vnd.dpgraph": { - "source": "iana", - "extensions": ["dpg"] - }, - "application/vnd.dreamfactory": { - "source": "iana", - "extensions": ["dfac"] - }, - "application/vnd.ds-keypoint": { - "source": "apache", - "extensions": ["kpxx"] - }, - "application/vnd.dtg.local": { - "source": "iana" - }, - "application/vnd.dtg.local.flash": { - "source": "iana" - }, - "application/vnd.dtg.local.html": { - "source": "iana" - }, - "application/vnd.dvb.ait": { - "source": "iana", - "extensions": ["ait"] - }, - "application/vnd.dvb.dvbj": { - "source": "iana" - }, - "application/vnd.dvb.esgcontainer": { - "source": "iana" - }, - "application/vnd.dvb.ipdcdftnotifaccess": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgaccess": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgaccess2": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgpdd": { - "source": "iana" - }, - "application/vnd.dvb.ipdcroaming": { - "source": "iana" - }, - "application/vnd.dvb.iptv.alfec-base": { - "source": "iana" - }, - "application/vnd.dvb.iptv.alfec-enhancement": { - "source": "iana" - }, - "application/vnd.dvb.notif-aggregate-root+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-container+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-generic+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-msglist+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-registration-request+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-registration-response+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-init+xml": { - "source": "iana" - }, - "application/vnd.dvb.pfr": { - "source": "iana" - }, - "application/vnd.dvb.service": { - "source": "iana", - "extensions": ["svc"] - }, - "application/vnd.dxr": { - "source": "iana" - }, - "application/vnd.dynageo": { - "source": "iana", - "extensions": ["geo"] - }, - "application/vnd.dzr": { - "source": "iana" - }, - "application/vnd.easykaraoke.cdgdownload": { - "source": "iana" - }, - "application/vnd.ecdis-update": { - "source": "iana" - }, - "application/vnd.ecowin.chart": { - "source": "iana", - "extensions": ["mag"] - }, - "application/vnd.ecowin.filerequest": { - "source": "iana" - }, - "application/vnd.ecowin.fileupdate": { - "source": "iana" - }, - "application/vnd.ecowin.series": { - "source": "iana" - }, - "application/vnd.ecowin.seriesrequest": { - "source": "iana" - }, - "application/vnd.ecowin.seriesupdate": { - "source": "iana" - }, - "application/vnd.emclient.accessrequest+xml": { - "source": "iana" - }, - "application/vnd.enliven": { - "source": "iana", - "extensions": ["nml"] - }, - "application/vnd.enphase.envoy": { - "source": "iana" - }, - "application/vnd.eprints.data+xml": { - "source": "iana" - }, - "application/vnd.epson.esf": { - "source": "iana", - "extensions": ["esf"] - }, - "application/vnd.epson.msf": { - "source": "iana", - "extensions": ["msf"] - }, - "application/vnd.epson.quickanime": { - "source": "iana", - "extensions": ["qam"] - }, - "application/vnd.epson.salt": { - "source": "iana", - "extensions": ["slt"] - }, - "application/vnd.epson.ssf": { - "source": "iana", - "extensions": ["ssf"] - }, - "application/vnd.ericsson.quickcall": { - "source": "iana" - }, - "application/vnd.eszigno3+xml": { - "source": "iana", - "extensions": ["es3","et3"] - }, - "application/vnd.etsi.aoc+xml": { - "source": "iana" - }, - "application/vnd.etsi.asic-e+zip": { - "source": "iana" - }, - "application/vnd.etsi.asic-s+zip": { - "source": "iana" - }, - "application/vnd.etsi.cug+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvcommand+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvdiscovery+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvprofile+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-bc+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-cod+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-npvr+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvservice+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsync+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvueprofile+xml": { - "source": "iana" - }, - "application/vnd.etsi.mcid+xml": { - "source": "iana" - }, - "application/vnd.etsi.mheg5": { - "source": "iana" - }, - "application/vnd.etsi.overload-control-policy-dataset+xml": { - "source": "iana" - }, - "application/vnd.etsi.pstn+xml": { - "source": "iana" - }, - "application/vnd.etsi.sci+xml": { - "source": "iana" - }, - "application/vnd.etsi.simservs+xml": { - "source": "iana" - }, - "application/vnd.etsi.timestamp-token": { - "source": "iana" - }, - "application/vnd.etsi.tsl+xml": { - "source": "iana" - }, - "application/vnd.etsi.tsl.der": { - "source": "iana" - }, - "application/vnd.eudora.data": { - "source": "iana" - }, - "application/vnd.ezpix-album": { - "source": "iana", - "extensions": ["ez2"] - }, - "application/vnd.ezpix-package": { - "source": "iana", - "extensions": ["ez3"] - }, - "application/vnd.f-secure.mobile": { - "source": "iana" - }, - "application/vnd.fastcopy-disk-image": { - "source": "iana" - }, - "application/vnd.fdf": { - "source": "iana", - "extensions": ["fdf"] - }, - "application/vnd.fdsn.mseed": { - "source": "iana", - "extensions": ["mseed"] - }, - "application/vnd.fdsn.seed": { - "source": "iana", - "extensions": ["seed","dataless"] - }, - "application/vnd.ffsns": { - "source": "iana" - }, - "application/vnd.fints": { - "source": "iana" - }, - "application/vnd.firemonkeys.cloudcell": { - "source": "iana" - }, - "application/vnd.flographit": { - "source": "iana", - "extensions": ["gph"] - }, - "application/vnd.fluxtime.clip": { - "source": "iana", - "extensions": ["ftc"] - }, - "application/vnd.font-fontforge-sfd": { - "source": "iana" - }, - "application/vnd.framemaker": { - "source": "iana", - "extensions": ["fm","frame","maker","book"] - }, - "application/vnd.frogans.fnc": { - "source": "iana", - "extensions": ["fnc"] - }, - "application/vnd.frogans.ltf": { - "source": "iana", - "extensions": ["ltf"] - }, - "application/vnd.fsc.weblaunch": { - "source": "iana", - "extensions": ["fsc"] - }, - "application/vnd.fujitsu.oasys": { - "source": "iana", - "extensions": ["oas"] - }, - "application/vnd.fujitsu.oasys2": { - "source": "iana", - "extensions": ["oa2"] - }, - "application/vnd.fujitsu.oasys3": { - "source": "iana", - "extensions": ["oa3"] - }, - "application/vnd.fujitsu.oasysgp": { - "source": "iana", - "extensions": ["fg5"] - }, - "application/vnd.fujitsu.oasysprs": { - "source": "iana", - "extensions": ["bh2"] - }, - "application/vnd.fujixerox.art-ex": { - "source": "iana" - }, - "application/vnd.fujixerox.art4": { - "source": "iana" - }, - "application/vnd.fujixerox.ddd": { - "source": "iana", - "extensions": ["ddd"] - }, - "application/vnd.fujixerox.docuworks": { - "source": "iana", - "extensions": ["xdw"] - }, - "application/vnd.fujixerox.docuworks.binder": { - "source": "iana", - "extensions": ["xbd"] - }, - "application/vnd.fujixerox.docuworks.container": { - "source": "iana" - }, - "application/vnd.fujixerox.hbpl": { - "source": "iana" - }, - "application/vnd.fut-misnet": { - "source": "iana" - }, - "application/vnd.fuzzysheet": { - "source": "iana", - "extensions": ["fzs"] - }, - "application/vnd.genomatix.tuxedo": { - "source": "iana", - "extensions": ["txd"] - }, - "application/vnd.geo+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.geocube+xml": { - "source": "iana" - }, - "application/vnd.geogebra.file": { - "source": "iana", - "extensions": ["ggb"] - }, - "application/vnd.geogebra.tool": { - "source": "iana", - "extensions": ["ggt"] - }, - "application/vnd.geometry-explorer": { - "source": "iana", - "extensions": ["gex","gre"] - }, - "application/vnd.geonext": { - "source": "iana", - "extensions": ["gxt"] - }, - "application/vnd.geoplan": { - "source": "iana", - "extensions": ["g2w"] - }, - "application/vnd.geospace": { - "source": "iana", - "extensions": ["g3w"] - }, - "application/vnd.gerber": { - "source": "iana" - }, - "application/vnd.globalplatform.card-content-mgt": { - "source": "iana" - }, - "application/vnd.globalplatform.card-content-mgt-response": { - "source": "iana" - }, - "application/vnd.gmx": { - "source": "iana", - "extensions": ["gmx"] - }, - "application/vnd.google-earth.kml+xml": { - "source": "iana", - "compressible": true, - "extensions": ["kml"] - }, - "application/vnd.google-earth.kmz": { - "source": "iana", - "compressible": false, - "extensions": ["kmz"] - }, - "application/vnd.gov.sk.e-form+xml": { - "source": "iana" - }, - "application/vnd.gov.sk.e-form+zip": { - "source": "iana" - }, - "application/vnd.gov.sk.xmldatacontainer+xml": { - "source": "iana" - }, - "application/vnd.grafeq": { - "source": "iana", - "extensions": ["gqf","gqs"] - }, - "application/vnd.gridmp": { - "source": "iana" - }, - "application/vnd.groove-account": { - "source": "iana", - "extensions": ["gac"] - }, - "application/vnd.groove-help": { - "source": "iana", - "extensions": ["ghf"] - }, - "application/vnd.groove-identity-message": { - "source": "iana", - "extensions": ["gim"] - }, - "application/vnd.groove-injector": { - "source": "iana", - "extensions": ["grv"] - }, - "application/vnd.groove-tool-message": { - "source": "iana", - "extensions": ["gtm"] - }, - "application/vnd.groove-tool-template": { - "source": "iana", - "extensions": ["tpl"] - }, - "application/vnd.groove-vcard": { - "source": "iana", - "extensions": ["vcg"] - }, - "application/vnd.hal+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hal+xml": { - "source": "iana", - "extensions": ["hal"] - }, - "application/vnd.handheld-entertainment+xml": { - "source": "iana", - "extensions": ["zmm"] - }, - "application/vnd.hbci": { - "source": "iana", - "extensions": ["hbci"] - }, - "application/vnd.hcl-bireports": { - "source": "iana" - }, - "application/vnd.heroku+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hhe.lesson-player": { - "source": "iana", - "extensions": ["les"] - }, - "application/vnd.hp-hpgl": { - "source": "iana", - "extensions": ["hpgl"] - }, - "application/vnd.hp-hpid": { - "source": "iana", - "extensions": ["hpid"] - }, - "application/vnd.hp-hps": { - "source": "iana", - "extensions": ["hps"] - }, - "application/vnd.hp-jlyt": { - "source": "iana", - "extensions": ["jlt"] - }, - "application/vnd.hp-pcl": { - "source": "iana", - "extensions": ["pcl"] - }, - "application/vnd.hp-pclxl": { - "source": "iana", - "extensions": ["pclxl"] - }, - "application/vnd.httphone": { - "source": "iana" - }, - "application/vnd.hydrostatix.sof-data": { - "source": "iana", - "extensions": ["sfd-hdstx"] - }, - "application/vnd.hyperdrive+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hzn-3d-crossword": { - "source": "iana" - }, - "application/vnd.ibm.afplinedata": { - "source": "iana" - }, - "application/vnd.ibm.electronic-media": { - "source": "iana" - }, - "application/vnd.ibm.minipay": { - "source": "iana", - "extensions": ["mpy"] - }, - "application/vnd.ibm.modcap": { - "source": "iana", - "extensions": ["afp","listafp","list3820"] - }, - "application/vnd.ibm.rights-management": { - "source": "iana", - "extensions": ["irm"] - }, - "application/vnd.ibm.secure-container": { - "source": "iana", - "extensions": ["sc"] - }, - "application/vnd.iccprofile": { - "source": "iana", - "extensions": ["icc","icm"] - }, - "application/vnd.ieee.1905": { - "source": "iana" - }, - "application/vnd.igloader": { - "source": "iana", - "extensions": ["igl"] - }, - "application/vnd.immervision-ivp": { - "source": "iana", - "extensions": ["ivp"] - }, - "application/vnd.immervision-ivu": { - "source": "iana", - "extensions": ["ivu"] - }, - "application/vnd.ims.imsccv1p1": { - "source": "iana" - }, - "application/vnd.ims.imsccv1p2": { - "source": "iana" - }, - "application/vnd.ims.imsccv1p3": { - "source": "iana" - }, - "application/vnd.ims.lis.v2.result+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolconsumerprofile+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolproxy+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolproxy.id+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolsettings+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolsettings.simple+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.informedcontrol.rms+xml": { - "source": "iana" - }, - "application/vnd.informix-visionary": { - "source": "iana" - }, - "application/vnd.infotech.project": { - "source": "iana" - }, - "application/vnd.infotech.project+xml": { - "source": "iana" - }, - "application/vnd.innopath.wamp.notification": { - "source": "iana" - }, - "application/vnd.insors.igm": { - "source": "iana", - "extensions": ["igm"] - }, - "application/vnd.intercon.formnet": { - "source": "iana", - "extensions": ["xpw","xpx"] - }, - "application/vnd.intergeo": { - "source": "iana", - "extensions": ["i2g"] - }, - "application/vnd.intertrust.digibox": { - "source": "iana" - }, - "application/vnd.intertrust.nncp": { - "source": "iana" - }, - "application/vnd.intu.qbo": { - "source": "iana", - "extensions": ["qbo"] - }, - "application/vnd.intu.qfx": { - "source": "iana", - "extensions": ["qfx"] - }, - "application/vnd.iptc.g2.catalogitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.conceptitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.knowledgeitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.newsitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.newsmessage+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.packageitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.planningitem+xml": { - "source": "iana" - }, - "application/vnd.ipunplugged.rcprofile": { - "source": "iana", - "extensions": ["rcprofile"] - }, - "application/vnd.irepository.package+xml": { - "source": "iana", - "extensions": ["irp"] - }, - "application/vnd.is-xpr": { - "source": "iana", - "extensions": ["xpr"] - }, - "application/vnd.isac.fcs": { - "source": "iana", - "extensions": ["fcs"] - }, - "application/vnd.jam": { - "source": "iana", - "extensions": ["jam"] - }, - "application/vnd.japannet-directory-service": { - "source": "iana" - }, - "application/vnd.japannet-jpnstore-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-payment-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-registration": { - "source": "iana" - }, - "application/vnd.japannet-registration-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-setstore-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-verification": { - "source": "iana" - }, - "application/vnd.japannet-verification-wakeup": { - "source": "iana" - }, - "application/vnd.jcp.javame.midlet-rms": { - "source": "iana", - "extensions": ["rms"] - }, - "application/vnd.jisp": { - "source": "iana", - "extensions": ["jisp"] - }, - "application/vnd.joost.joda-archive": { - "source": "iana", - "extensions": ["joda"] - }, - "application/vnd.jsk.isdn-ngn": { - "source": "iana" - }, - "application/vnd.kahootz": { - "source": "iana", - "extensions": ["ktz","ktr"] - }, - "application/vnd.kde.karbon": { - "source": "iana", - "extensions": ["karbon"] - }, - "application/vnd.kde.kchart": { - "source": "iana", - "extensions": ["chrt"] - }, - "application/vnd.kde.kformula": { - "source": "iana", - "extensions": ["kfo"] - }, - "application/vnd.kde.kivio": { - "source": "iana", - "extensions": ["flw"] - }, - "application/vnd.kde.kontour": { - "source": "iana", - "extensions": ["kon"] - }, - "application/vnd.kde.kpresenter": { - "source": "iana", - "extensions": ["kpr","kpt"] - }, - "application/vnd.kde.kspread": { - "source": "iana", - "extensions": ["ksp"] - }, - "application/vnd.kde.kword": { - "source": "iana", - "extensions": ["kwd","kwt"] - }, - "application/vnd.kenameaapp": { - "source": "iana", - "extensions": ["htke"] - }, - "application/vnd.kidspiration": { - "source": "iana", - "extensions": ["kia"] - }, - "application/vnd.kinar": { - "source": "iana", - "extensions": ["kne","knp"] - }, - "application/vnd.koan": { - "source": "iana", - "extensions": ["skp","skd","skt","skm"] - }, - "application/vnd.kodak-descriptor": { - "source": "iana", - "extensions": ["sse"] - }, - "application/vnd.las.las+xml": { - "source": "iana", - "extensions": ["lasxml"] - }, - "application/vnd.liberty-request+xml": { - "source": "iana" - }, - "application/vnd.llamagraphics.life-balance.desktop": { - "source": "iana", - "extensions": ["lbd"] - }, - "application/vnd.llamagraphics.life-balance.exchange+xml": { - "source": "iana", - "extensions": ["lbe"] - }, - "application/vnd.lotus-1-2-3": { - "source": "iana", - "extensions": ["123"] - }, - "application/vnd.lotus-approach": { - "source": "iana", - "extensions": ["apr"] - }, - "application/vnd.lotus-freelance": { - "source": "iana", - "extensions": ["pre"] - }, - "application/vnd.lotus-notes": { - "source": "iana", - "extensions": ["nsf"] - }, - "application/vnd.lotus-organizer": { - "source": "iana", - "extensions": ["org"] - }, - "application/vnd.lotus-screencam": { - "source": "iana", - "extensions": ["scm"] - }, - "application/vnd.lotus-wordpro": { - "source": "iana", - "extensions": ["lwp"] - }, - "application/vnd.macports.portpkg": { - "source": "iana", - "extensions": ["portpkg"] - }, - "application/vnd.marlin.drm.actiontoken+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.conftoken+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.license+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.mdcf": { - "source": "iana" - }, - "application/vnd.mason+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.maxmind.maxmind-db": { - "source": "iana" - }, - "application/vnd.mcd": { - "source": "iana", - "extensions": ["mcd"] - }, - "application/vnd.medcalcdata": { - "source": "iana", - "extensions": ["mc1"] - }, - "application/vnd.mediastation.cdkey": { - "source": "iana", - "extensions": ["cdkey"] - }, - "application/vnd.meridian-slingshot": { - "source": "iana" - }, - "application/vnd.mfer": { - "source": "iana", - "extensions": ["mwf"] - }, - "application/vnd.mfmp": { - "source": "iana", - "extensions": ["mfm"] - }, - "application/vnd.micro+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.micrografx.flo": { - "source": "iana", - "extensions": ["flo"] - }, - "application/vnd.micrografx.igx": { - "source": "iana", - "extensions": ["igx"] - }, - "application/vnd.microsoft.portable-executable": { - "source": "iana" - }, - "application/vnd.miele+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.mif": { - "source": "iana", - "extensions": ["mif"] - }, - "application/vnd.minisoft-hp3000-save": { - "source": "iana" - }, - "application/vnd.mitsubishi.misty-guard.trustweb": { - "source": "iana" - }, - "application/vnd.mobius.daf": { - "source": "iana", - "extensions": ["daf"] - }, - "application/vnd.mobius.dis": { - "source": "iana", - "extensions": ["dis"] - }, - "application/vnd.mobius.mbk": { - "source": "iana", - "extensions": ["mbk"] - }, - "application/vnd.mobius.mqy": { - "source": "iana", - "extensions": ["mqy"] - }, - "application/vnd.mobius.msl": { - "source": "iana", - "extensions": ["msl"] - }, - "application/vnd.mobius.plc": { - "source": "iana", - "extensions": ["plc"] - }, - "application/vnd.mobius.txf": { - "source": "iana", - "extensions": ["txf"] - }, - "application/vnd.mophun.application": { - "source": "iana", - "extensions": ["mpn"] - }, - "application/vnd.mophun.certificate": { - "source": "iana", - "extensions": ["mpc"] - }, - "application/vnd.motorola.flexsuite": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.adsi": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.fis": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.gotap": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.kmr": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.ttc": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.wem": { - "source": "iana" - }, - "application/vnd.motorola.iprm": { - "source": "iana" - }, - "application/vnd.mozilla.xul+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xul"] - }, - "application/vnd.ms-3mfdocument": { - "source": "iana" - }, - "application/vnd.ms-artgalry": { - "source": "iana", - "extensions": ["cil"] - }, - "application/vnd.ms-asf": { - "source": "iana" - }, - "application/vnd.ms-cab-compressed": { - "source": "iana", - "extensions": ["cab"] - }, - "application/vnd.ms-color.iccprofile": { - "source": "apache" - }, - "application/vnd.ms-excel": { - "source": "iana", - "compressible": false, - "extensions": ["xls","xlm","xla","xlc","xlt","xlw"] - }, - "application/vnd.ms-excel.addin.macroenabled.12": { - "source": "iana", - "extensions": ["xlam"] - }, - "application/vnd.ms-excel.sheet.binary.macroenabled.12": { - "source": "iana", - "extensions": ["xlsb"] - }, - "application/vnd.ms-excel.sheet.macroenabled.12": { - "source": "iana", - "extensions": ["xlsm"] - }, - "application/vnd.ms-excel.template.macroenabled.12": { - "source": "iana", - "extensions": ["xltm"] - }, - "application/vnd.ms-fontobject": { - "source": "iana", - "compressible": true, - "extensions": ["eot"] - }, - "application/vnd.ms-htmlhelp": { - "source": "iana", - "extensions": ["chm"] - }, - "application/vnd.ms-ims": { - "source": "iana", - "extensions": ["ims"] - }, - "application/vnd.ms-lrm": { - "source": "iana", - "extensions": ["lrm"] - }, - "application/vnd.ms-office.activex+xml": { - "source": "iana" - }, - "application/vnd.ms-officetheme": { - "source": "iana", - "extensions": ["thmx"] - }, - "application/vnd.ms-opentype": { - "source": "apache", - "compressible": true - }, - "application/vnd.ms-package.obfuscated-opentype": { - "source": "apache" - }, - "application/vnd.ms-pki.seccat": { - "source": "apache", - "extensions": ["cat"] - }, - "application/vnd.ms-pki.stl": { - "source": "apache", - "extensions": ["stl"] - }, - "application/vnd.ms-playready.initiator+xml": { - "source": "iana" - }, - "application/vnd.ms-powerpoint": { - "source": "iana", - "compressible": false, - "extensions": ["ppt","pps","pot"] - }, - "application/vnd.ms-powerpoint.addin.macroenabled.12": { - "source": "iana", - "extensions": ["ppam"] - }, - "application/vnd.ms-powerpoint.presentation.macroenabled.12": { - "source": "iana", - "extensions": ["pptm"] - }, - "application/vnd.ms-powerpoint.slide.macroenabled.12": { - "source": "iana", - "extensions": ["sldm"] - }, - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": { - "source": "iana", - "extensions": ["ppsm"] - }, - "application/vnd.ms-powerpoint.template.macroenabled.12": { - "source": "iana", - "extensions": ["potm"] - }, - "application/vnd.ms-printing.printticket+xml": { - "source": "apache" - }, - "application/vnd.ms-project": { - "source": "iana", - "extensions": ["mpp","mpt"] - }, - "application/vnd.ms-tnef": { - "source": "iana" - }, - "application/vnd.ms-windows.printerpairing": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.lic-chlg-req": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.lic-resp": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.meter-chlg-req": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.meter-resp": { - "source": "iana" - }, - "application/vnd.ms-word.document.macroenabled.12": { - "source": "iana", - "extensions": ["docm"] - }, - "application/vnd.ms-word.template.macroenabled.12": { - "source": "iana", - "extensions": ["dotm"] - }, - "application/vnd.ms-works": { - "source": "iana", - "extensions": ["wps","wks","wcm","wdb"] - }, - "application/vnd.ms-wpl": { - "source": "iana", - "extensions": ["wpl"] - }, - "application/vnd.ms-xpsdocument": { - "source": "iana", - "compressible": false, - "extensions": ["xps"] - }, - "application/vnd.msa-disk-image": { - "source": "iana" - }, - "application/vnd.mseq": { - "source": "iana", - "extensions": ["mseq"] - }, - "application/vnd.msign": { - "source": "iana" - }, - "application/vnd.multiad.creator": { - "source": "iana" - }, - "application/vnd.multiad.creator.cif": { - "source": "iana" - }, - "application/vnd.music-niff": { - "source": "iana" - }, - "application/vnd.musician": { - "source": "iana", - "extensions": ["mus"] - }, - "application/vnd.muvee.style": { - "source": "iana", - "extensions": ["msty"] - }, - "application/vnd.mynfc": { - "source": "iana", - "extensions": ["taglet"] - }, - "application/vnd.ncd.control": { - "source": "iana" - }, - "application/vnd.ncd.reference": { - "source": "iana" - }, - "application/vnd.nervana": { - "source": "iana" - }, - "application/vnd.netfpx": { - "source": "iana" - }, - "application/vnd.neurolanguage.nlu": { - "source": "iana", - "extensions": ["nlu"] - }, - "application/vnd.nintendo.nitro.rom": { - "source": "iana" - }, - "application/vnd.nintendo.snes.rom": { - "source": "iana" - }, - "application/vnd.nitf": { - "source": "iana", - "extensions": ["ntf","nitf"] - }, - "application/vnd.noblenet-directory": { - "source": "iana", - "extensions": ["nnd"] - }, - "application/vnd.noblenet-sealer": { - "source": "iana", - "extensions": ["nns"] - }, - "application/vnd.noblenet-web": { - "source": "iana", - "extensions": ["nnw"] - }, - "application/vnd.nokia.catalogs": { - "source": "iana" - }, - "application/vnd.nokia.conml+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.conml+xml": { - "source": "iana" - }, - "application/vnd.nokia.iptv.config+xml": { - "source": "iana" - }, - "application/vnd.nokia.isds-radio-presets": { - "source": "iana" - }, - "application/vnd.nokia.landmark+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.landmark+xml": { - "source": "iana" - }, - "application/vnd.nokia.landmarkcollection+xml": { - "source": "iana" - }, - "application/vnd.nokia.n-gage.ac+xml": { - "source": "iana" - }, - "application/vnd.nokia.n-gage.data": { - "source": "iana", - "extensions": ["ngdat"] - }, - "application/vnd.nokia.n-gage.symbian.install": { - "source": "iana", - "extensions": ["n-gage"] - }, - "application/vnd.nokia.ncd": { - "source": "iana" - }, - "application/vnd.nokia.pcd+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.pcd+xml": { - "source": "iana" - }, - "application/vnd.nokia.radio-preset": { - "source": "iana", - "extensions": ["rpst"] - }, - "application/vnd.nokia.radio-presets": { - "source": "iana", - "extensions": ["rpss"] - }, - "application/vnd.novadigm.edm": { - "source": "iana", - "extensions": ["edm"] - }, - "application/vnd.novadigm.edx": { - "source": "iana", - "extensions": ["edx"] - }, - "application/vnd.novadigm.ext": { - "source": "iana", - "extensions": ["ext"] - }, - "application/vnd.ntt-local.content-share": { - "source": "iana" - }, - "application/vnd.ntt-local.file-transfer": { - "source": "iana" - }, - "application/vnd.ntt-local.ogw_remote-access": { - "source": "iana" - }, - "application/vnd.ntt-local.sip-ta_remote": { - "source": "iana" - }, - "application/vnd.ntt-local.sip-ta_tcp_stream": { - "source": "iana" - }, - "application/vnd.oasis.opendocument.chart": { - "source": "iana", - "extensions": ["odc"] - }, - "application/vnd.oasis.opendocument.chart-template": { - "source": "iana", - "extensions": ["otc"] - }, - "application/vnd.oasis.opendocument.database": { - "source": "iana", - "extensions": ["odb"] - }, - "application/vnd.oasis.opendocument.formula": { - "source": "iana", - "extensions": ["odf"] - }, - "application/vnd.oasis.opendocument.formula-template": { - "source": "iana", - "extensions": ["odft"] - }, - "application/vnd.oasis.opendocument.graphics": { - "source": "iana", - "compressible": false, - "extensions": ["odg"] - }, - "application/vnd.oasis.opendocument.graphics-template": { - "source": "iana", - "extensions": ["otg"] - }, - "application/vnd.oasis.opendocument.image": { - "source": "iana", - "extensions": ["odi"] - }, - "application/vnd.oasis.opendocument.image-template": { - "source": "iana", - "extensions": ["oti"] - }, - "application/vnd.oasis.opendocument.presentation": { - "source": "iana", - "compressible": false, - "extensions": ["odp"] - }, - "application/vnd.oasis.opendocument.presentation-template": { - "source": "iana", - "extensions": ["otp"] - }, - "application/vnd.oasis.opendocument.spreadsheet": { - "source": "iana", - "compressible": false, - "extensions": ["ods"] - }, - "application/vnd.oasis.opendocument.spreadsheet-template": { - "source": "iana", - "extensions": ["ots"] - }, - "application/vnd.oasis.opendocument.text": { - "source": "iana", - "compressible": false, - "extensions": ["odt"] - }, - "application/vnd.oasis.opendocument.text-master": { - "source": "iana", - "extensions": ["odm"] - }, - "application/vnd.oasis.opendocument.text-template": { - "source": "iana", - "extensions": ["ott"] - }, - "application/vnd.oasis.opendocument.text-web": { - "source": "iana", - "extensions": ["oth"] - }, - "application/vnd.obn": { - "source": "iana" - }, - "application/vnd.oftn.l10n+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.oipf.contentaccessdownload+xml": { - "source": "iana" - }, - "application/vnd.oipf.contentaccessstreaming+xml": { - "source": "iana" - }, - "application/vnd.oipf.cspg-hexbinary": { - "source": "iana" - }, - "application/vnd.oipf.dae.svg+xml": { - "source": "iana" - }, - "application/vnd.oipf.dae.xhtml+xml": { - "source": "iana" - }, - "application/vnd.oipf.mippvcontrolmessage+xml": { - "source": "iana" - }, - "application/vnd.oipf.pae.gem": { - "source": "iana" - }, - "application/vnd.oipf.spdiscovery+xml": { - "source": "iana" - }, - "application/vnd.oipf.spdlist+xml": { - "source": "iana" - }, - "application/vnd.oipf.ueprofile+xml": { - "source": "iana" - }, - "application/vnd.oipf.userprofile+xml": { - "source": "iana" - }, - "application/vnd.olpc-sugar": { - "source": "iana", - "extensions": ["xo"] - }, - "application/vnd.oma-scws-config": { - "source": "iana" - }, - "application/vnd.oma-scws-http-request": { - "source": "iana" - }, - "application/vnd.oma-scws-http-response": { - "source": "iana" - }, - "application/vnd.oma.bcast.associated-procedure-parameter+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.drm-trigger+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.imd+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.ltkm": { - "source": "iana" - }, - "application/vnd.oma.bcast.notification+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.provisioningtrigger": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgboot": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgdd+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgdu": { - "source": "iana" - }, - "application/vnd.oma.bcast.simple-symbol-container": { - "source": "iana" - }, - "application/vnd.oma.bcast.smartcard-trigger+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.sprov+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.stkm": { - "source": "iana" - }, - "application/vnd.oma.cab-address-book+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-feature-handler+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-pcc+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-subs-invite+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-user-prefs+xml": { - "source": "iana" - }, - "application/vnd.oma.dcd": { - "source": "iana" - }, - "application/vnd.oma.dcdc": { - "source": "iana" - }, - "application/vnd.oma.dd2+xml": { - "source": "iana", - "extensions": ["dd2"] - }, - "application/vnd.oma.drm.risd+xml": { - "source": "iana" - }, - "application/vnd.oma.group-usage-list+xml": { - "source": "iana" - }, - "application/vnd.oma.pal+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.detailed-progress-report+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.final-report+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.groups+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.invocation-descriptor+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.optimized-progress-report+xml": { - "source": "iana" - }, - "application/vnd.oma.push": { - "source": "iana" - }, - "application/vnd.oma.scidm.messages+xml": { - "source": "iana" - }, - "application/vnd.oma.xcap-directory+xml": { - "source": "iana" - }, - "application/vnd.omads-email+xml": { - "source": "iana" - }, - "application/vnd.omads-file+xml": { - "source": "iana" - }, - "application/vnd.omads-folder+xml": { - "source": "iana" - }, - "application/vnd.omaloc-supl-init": { - "source": "iana" - }, - "application/vnd.openblox.game+xml": { - "source": "iana" - }, - "application/vnd.openblox.game-binary": { - "source": "iana" - }, - "application/vnd.openeye.oeb": { - "source": "iana" - }, - "application/vnd.openofficeorg.extension": { - "source": "apache", - "extensions": ["oxt"] - }, - "application/vnd.openxmlformats-officedocument.custom-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawing+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.extended-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation": { - "source": "iana", - "compressible": false, - "extensions": ["pptx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slide": { - "source": "iana", - "extensions": ["sldx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": { - "source": "iana", - "extensions": ["ppsx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.template": { - "source": "apache", - "extensions": ["potx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { - "source": "iana", - "compressible": false, - "extensions": ["xlsx"] - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": { - "source": "apache", - "extensions": ["xltx"] - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.theme+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.themeoverride+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.vmldrawing": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { - "source": "iana", - "compressible": false, - "extensions": ["docx"] - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": { - "source": "apache", - "extensions": ["dotx"] - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.core-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.relationships+xml": { - "source": "iana" - }, - "application/vnd.oracle.resource+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.orange.indata": { - "source": "iana" - }, - "application/vnd.osa.netdeploy": { - "source": "iana" - }, - "application/vnd.osgeo.mapguide.package": { - "source": "iana", - "extensions": ["mgp"] - }, - "application/vnd.osgi.bundle": { - "source": "iana" - }, - "application/vnd.osgi.dp": { - "source": "iana", - "extensions": ["dp"] - }, - "application/vnd.osgi.subsystem": { - "source": "iana", - "extensions": ["esa"] - }, - "application/vnd.otps.ct-kip+xml": { - "source": "iana" - }, - "application/vnd.palm": { - "source": "iana", - "extensions": ["pdb","pqa","oprc"] - }, - "application/vnd.panoply": { - "source": "iana" - }, - "application/vnd.paos+xml": { - "source": "iana" - }, - "application/vnd.paos.xml": { - "source": "apache" - }, - "application/vnd.pawaafile": { - "source": "iana", - "extensions": ["paw"] - }, - "application/vnd.pcos": { - "source": "iana" - }, - "application/vnd.pg.format": { - "source": "iana", - "extensions": ["str"] - }, - "application/vnd.pg.osasli": { - "source": "iana", - "extensions": ["ei6"] - }, - "application/vnd.piaccess.application-licence": { - "source": "iana" - }, - "application/vnd.picsel": { - "source": "iana", - "extensions": ["efif"] - }, - "application/vnd.pmi.widget": { - "source": "iana", - "extensions": ["wg"] - }, - "application/vnd.poc.group-advertisement+xml": { - "source": "iana" - }, - "application/vnd.pocketlearn": { - "source": "iana", - "extensions": ["plf"] - }, - "application/vnd.powerbuilder6": { - "source": "iana", - "extensions": ["pbd"] - }, - "application/vnd.powerbuilder6-s": { - "source": "iana" - }, - "application/vnd.powerbuilder7": { - "source": "iana" - }, - "application/vnd.powerbuilder7-s": { - "source": "iana" - }, - "application/vnd.powerbuilder75": { - "source": "iana" - }, - "application/vnd.powerbuilder75-s": { - "source": "iana" - }, - "application/vnd.preminet": { - "source": "iana" - }, - "application/vnd.previewsystems.box": { - "source": "iana", - "extensions": ["box"] - }, - "application/vnd.proteus.magazine": { - "source": "iana", - "extensions": ["mgz"] - }, - "application/vnd.publishare-delta-tree": { - "source": "iana", - "extensions": ["qps"] - }, - "application/vnd.pvi.ptid1": { - "source": "iana", - "extensions": ["ptid"] - }, - "application/vnd.pwg-multiplexed": { - "source": "iana" - }, - "application/vnd.pwg-xhtml-print+xml": { - "source": "iana" - }, - "application/vnd.qualcomm.brew-app-res": { - "source": "iana" - }, - "application/vnd.quark.quarkxpress": { - "source": "iana", - "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"] - }, - "application/vnd.quobject-quoxdocument": { - "source": "iana" - }, - "application/vnd.radisys.moml+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-conf+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-conn+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-dialog+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-stream+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-conf+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-base+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-fax-detect+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-group+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-speech+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-transform+xml": { - "source": "iana" - }, - "application/vnd.rainstor.data": { - "source": "iana" - }, - "application/vnd.rapid": { - "source": "iana" - }, - "application/vnd.realvnc.bed": { - "source": "iana", - "extensions": ["bed"] - }, - "application/vnd.recordare.musicxml": { - "source": "iana", - "extensions": ["mxl"] - }, - "application/vnd.recordare.musicxml+xml": { - "source": "iana", - "extensions": ["musicxml"] - }, - "application/vnd.renlearn.rlprint": { - "source": "iana" - }, - "application/vnd.rig.cryptonote": { - "source": "iana", - "extensions": ["cryptonote"] - }, - "application/vnd.rim.cod": { - "source": "apache", - "extensions": ["cod"] - }, - "application/vnd.rn-realmedia": { - "source": "apache", - "extensions": ["rm"] - }, - "application/vnd.rn-realmedia-vbr": { - "source": "apache", - "extensions": ["rmvb"] - }, - "application/vnd.route66.link66+xml": { - "source": "iana", - "extensions": ["link66"] - }, - "application/vnd.rs-274x": { - "source": "iana" - }, - "application/vnd.ruckus.download": { - "source": "iana" - }, - "application/vnd.s3sms": { - "source": "iana" - }, - "application/vnd.sailingtracker.track": { - "source": "iana", - "extensions": ["st"] - }, - "application/vnd.sbm.cid": { - "source": "iana" - }, - "application/vnd.sbm.mid2": { - "source": "iana" - }, - "application/vnd.scribus": { - "source": "iana" - }, - "application/vnd.sealed.3df": { - "source": "iana" - }, - "application/vnd.sealed.csf": { - "source": "iana" - }, - "application/vnd.sealed.doc": { - "source": "iana" - }, - "application/vnd.sealed.eml": { - "source": "iana" - }, - "application/vnd.sealed.mht": { - "source": "iana" - }, - "application/vnd.sealed.net": { - "source": "iana" - }, - "application/vnd.sealed.ppt": { - "source": "iana" - }, - "application/vnd.sealed.tiff": { - "source": "iana" - }, - "application/vnd.sealed.xls": { - "source": "iana" - }, - "application/vnd.sealedmedia.softseal.html": { - "source": "iana" - }, - "application/vnd.sealedmedia.softseal.pdf": { - "source": "iana" - }, - "application/vnd.seemail": { - "source": "iana", - "extensions": ["see"] - }, - "application/vnd.sema": { - "source": "iana", - "extensions": ["sema"] - }, - "application/vnd.semd": { - "source": "iana", - "extensions": ["semd"] - }, - "application/vnd.semf": { - "source": "iana", - "extensions": ["semf"] - }, - "application/vnd.shana.informed.formdata": { - "source": "iana", - "extensions": ["ifm"] - }, - "application/vnd.shana.informed.formtemplate": { - "source": "iana", - "extensions": ["itp"] - }, - "application/vnd.shana.informed.interchange": { - "source": "iana", - "extensions": ["iif"] - }, - "application/vnd.shana.informed.package": { - "source": "iana", - "extensions": ["ipk"] - }, - "application/vnd.simtech-mindmapper": { - "source": "iana", - "extensions": ["twd","twds"] - }, - "application/vnd.siren+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.smaf": { - "source": "iana", - "extensions": ["mmf"] - }, - "application/vnd.smart.notebook": { - "source": "iana" - }, - "application/vnd.smart.teacher": { - "source": "iana", - "extensions": ["teacher"] - }, - "application/vnd.software602.filler.form+xml": { - "source": "iana" - }, - "application/vnd.software602.filler.form-xml-zip": { - "source": "iana" - }, - "application/vnd.solent.sdkm+xml": { - "source": "iana", - "extensions": ["sdkm","sdkd"] - }, - "application/vnd.spotfire.dxp": { - "source": "iana", - "extensions": ["dxp"] - }, - "application/vnd.spotfire.sfs": { - "source": "iana", - "extensions": ["sfs"] - }, - "application/vnd.sss-cod": { - "source": "iana" - }, - "application/vnd.sss-dtf": { - "source": "iana" - }, - "application/vnd.sss-ntf": { - "source": "iana" - }, - "application/vnd.stardivision.calc": { - "source": "apache", - "extensions": ["sdc"] - }, - "application/vnd.stardivision.draw": { - "source": "apache", - "extensions": ["sda"] - }, - "application/vnd.stardivision.impress": { - "source": "apache", - "extensions": ["sdd"] - }, - "application/vnd.stardivision.math": { - "source": "apache", - "extensions": ["smf"] - }, - "application/vnd.stardivision.writer": { - "source": "apache", - "extensions": ["sdw","vor"] - }, - "application/vnd.stardivision.writer-global": { - "source": "apache", - "extensions": ["sgl"] - }, - "application/vnd.stepmania.package": { - "source": "iana", - "extensions": ["smzip"] - }, - "application/vnd.stepmania.stepchart": { - "source": "iana", - "extensions": ["sm"] - }, - "application/vnd.street-stream": { - "source": "iana" - }, - "application/vnd.sun.wadl+xml": { - "source": "iana" - }, - "application/vnd.sun.xml.calc": { - "source": "apache", - "extensions": ["sxc"] - }, - "application/vnd.sun.xml.calc.template": { - "source": "apache", - "extensions": ["stc"] - }, - "application/vnd.sun.xml.draw": { - "source": "apache", - "extensions": ["sxd"] - }, - "application/vnd.sun.xml.draw.template": { - "source": "apache", - "extensions": ["std"] - }, - "application/vnd.sun.xml.impress": { - "source": "apache", - "extensions": ["sxi"] - }, - "application/vnd.sun.xml.impress.template": { - "source": "apache", - "extensions": ["sti"] - }, - "application/vnd.sun.xml.math": { - "source": "apache", - "extensions": ["sxm"] - }, - "application/vnd.sun.xml.writer": { - "source": "apache", - "extensions": ["sxw"] - }, - "application/vnd.sun.xml.writer.global": { - "source": "apache", - "extensions": ["sxg"] - }, - "application/vnd.sun.xml.writer.template": { - "source": "apache", - "extensions": ["stw"] - }, - "application/vnd.sus-calendar": { - "source": "iana", - "extensions": ["sus","susp"] - }, - "application/vnd.svd": { - "source": "iana", - "extensions": ["svd"] - }, - "application/vnd.swiftview-ics": { - "source": "iana" - }, - "application/vnd.symbian.install": { - "source": "apache", - "extensions": ["sis","sisx"] - }, - "application/vnd.syncml+xml": { - "source": "iana", - "extensions": ["xsm"] - }, - "application/vnd.syncml.dm+wbxml": { - "source": "iana", - "extensions": ["bdm"] - }, - "application/vnd.syncml.dm+xml": { - "source": "iana", - "extensions": ["xdm"] - }, - "application/vnd.syncml.dm.notification": { - "source": "iana" - }, - "application/vnd.syncml.dmddf+wbxml": { - "source": "iana" - }, - "application/vnd.syncml.dmddf+xml": { - "source": "iana" - }, - "application/vnd.syncml.dmtnds+wbxml": { - "source": "iana" - }, - "application/vnd.syncml.dmtnds+xml": { - "source": "iana" - }, - "application/vnd.syncml.ds.notification": { - "source": "iana" - }, - "application/vnd.tao.intent-module-archive": { - "source": "iana", - "extensions": ["tao"] - }, - "application/vnd.tcpdump.pcap": { - "source": "iana", - "extensions": ["pcap","cap","dmp"] - }, - "application/vnd.tmd.mediaflex.api+xml": { - "source": "iana" - }, - "application/vnd.tmobile-livetv": { - "source": "iana", - "extensions": ["tmo"] - }, - "application/vnd.trid.tpt": { - "source": "iana", - "extensions": ["tpt"] - }, - "application/vnd.triscape.mxs": { - "source": "iana", - "extensions": ["mxs"] - }, - "application/vnd.trueapp": { - "source": "iana", - "extensions": ["tra"] - }, - "application/vnd.truedoc": { - "source": "iana" - }, - "application/vnd.ubisoft.webplayer": { - "source": "iana" - }, - "application/vnd.ufdl": { - "source": "iana", - "extensions": ["ufd","ufdl"] - }, - "application/vnd.uiq.theme": { - "source": "iana", - "extensions": ["utz"] - }, - "application/vnd.umajin": { - "source": "iana", - "extensions": ["umj"] - }, - "application/vnd.unity": { - "source": "iana", - "extensions": ["unityweb"] - }, - "application/vnd.uoml+xml": { - "source": "iana", - "extensions": ["uoml"] - }, - "application/vnd.uplanet.alert": { - "source": "iana" - }, - "application/vnd.uplanet.alert-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.bearer-choice": { - "source": "iana" - }, - "application/vnd.uplanet.bearer-choice-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.cacheop": { - "source": "iana" - }, - "application/vnd.uplanet.cacheop-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.channel": { - "source": "iana" - }, - "application/vnd.uplanet.channel-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.list": { - "source": "iana" - }, - "application/vnd.uplanet.list-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.listcmd": { - "source": "iana" - }, - "application/vnd.uplanet.listcmd-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.signal": { - "source": "iana" - }, - "application/vnd.uri-map": { - "source": "iana" - }, - "application/vnd.valve.source.material": { - "source": "iana" - }, - "application/vnd.vcx": { - "source": "iana", - "extensions": ["vcx"] - }, - "application/vnd.vd-study": { - "source": "iana" - }, - "application/vnd.vectorworks": { - "source": "iana" - }, - "application/vnd.verimatrix.vcas": { - "source": "iana" - }, - "application/vnd.vidsoft.vidconference": { - "source": "iana" - }, - "application/vnd.visio": { - "source": "iana", - "extensions": ["vsd","vst","vss","vsw"] - }, - "application/vnd.visionary": { - "source": "iana", - "extensions": ["vis"] - }, - "application/vnd.vividence.scriptfile": { - "source": "iana" - }, - "application/vnd.vsf": { - "source": "iana", - "extensions": ["vsf"] - }, - "application/vnd.wap.sic": { - "source": "iana" - }, - "application/vnd.wap.slc": { - "source": "iana" - }, - "application/vnd.wap.wbxml": { - "source": "iana", - "extensions": ["wbxml"] - }, - "application/vnd.wap.wmlc": { - "source": "iana", - "extensions": ["wmlc"] - }, - "application/vnd.wap.wmlscriptc": { - "source": "iana", - "extensions": ["wmlsc"] - }, - "application/vnd.webturbo": { - "source": "iana", - "extensions": ["wtb"] - }, - "application/vnd.wfa.p2p": { - "source": "iana" - }, - "application/vnd.wfa.wsc": { - "source": "iana" - }, - "application/vnd.windows.devicepairing": { - "source": "iana" - }, - "application/vnd.wmc": { - "source": "iana" - }, - "application/vnd.wmf.bootstrap": { - "source": "iana" - }, - "application/vnd.wolfram.mathematica": { - "source": "iana" - }, - "application/vnd.wolfram.mathematica.package": { - "source": "iana" - }, - "application/vnd.wolfram.player": { - "source": "iana", - "extensions": ["nbp"] - }, - "application/vnd.wordperfect": { - "source": "iana", - "extensions": ["wpd"] - }, - "application/vnd.wqd": { - "source": "iana", - "extensions": ["wqd"] - }, - "application/vnd.wrq-hp3000-labelled": { - "source": "iana" - }, - "application/vnd.wt.stf": { - "source": "iana", - "extensions": ["stf"] - }, - "application/vnd.wv.csp+wbxml": { - "source": "iana" - }, - "application/vnd.wv.csp+xml": { - "source": "iana" - }, - "application/vnd.wv.ssp+xml": { - "source": "iana" - }, - "application/vnd.xacml+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.xara": { - "source": "iana", - "extensions": ["xar"] - }, - "application/vnd.xfdl": { - "source": "iana", - "extensions": ["xfdl"] - }, - "application/vnd.xfdl.webform": { - "source": "iana" - }, - "application/vnd.xmi+xml": { - "source": "iana" - }, - "application/vnd.xmpie.cpkg": { - "source": "iana" - }, - "application/vnd.xmpie.dpkg": { - "source": "iana" - }, - "application/vnd.xmpie.plan": { - "source": "iana" - }, - "application/vnd.xmpie.ppkg": { - "source": "iana" - }, - "application/vnd.xmpie.xlim": { - "source": "iana" - }, - "application/vnd.yamaha.hv-dic": { - "source": "iana", - "extensions": ["hvd"] - }, - "application/vnd.yamaha.hv-script": { - "source": "iana", - "extensions": ["hvs"] - }, - "application/vnd.yamaha.hv-voice": { - "source": "iana", - "extensions": ["hvp"] - }, - "application/vnd.yamaha.openscoreformat": { - "source": "iana", - "extensions": ["osf"] - }, - "application/vnd.yamaha.openscoreformat.osfpvg+xml": { - "source": "iana", - "extensions": ["osfpvg"] - }, - "application/vnd.yamaha.remote-setup": { - "source": "iana" - }, - "application/vnd.yamaha.smaf-audio": { - "source": "iana", - "extensions": ["saf"] - }, - "application/vnd.yamaha.smaf-phrase": { - "source": "iana", - "extensions": ["spf"] - }, - "application/vnd.yamaha.through-ngn": { - "source": "iana" - }, - "application/vnd.yamaha.tunnel-udpencap": { - "source": "iana" - }, - "application/vnd.yaoweme": { - "source": "iana" - }, - "application/vnd.yellowriver-custom-menu": { - "source": "iana", - "extensions": ["cmp"] - }, - "application/vnd.zul": { - "source": "iana", - "extensions": ["zir","zirz"] - }, - "application/vnd.zzazz.deck+xml": { - "source": "iana", - "extensions": ["zaz"] - }, - "application/voicexml+xml": { - "source": "iana", - "extensions": ["vxml"] - }, - "application/vq-rtcpxr": { - "source": "iana" - }, - "application/watcherinfo+xml": { - "source": "iana" - }, - "application/whoispp-query": { - "source": "iana" - }, - "application/whoispp-response": { - "source": "iana" - }, - "application/widget": { - "source": "iana", - "extensions": ["wgt"] - }, - "application/winhlp": { - "source": "apache", - "extensions": ["hlp"] - }, - "application/wita": { - "source": "iana" - }, - "application/wordperfect5.1": { - "source": "iana" - }, - "application/wsdl+xml": { - "source": "iana", - "extensions": ["wsdl"] - }, - "application/wspolicy+xml": { - "source": "iana", - "extensions": ["wspolicy"] - }, - "application/x-7z-compressed": { - "source": "apache", - "compressible": false, - "extensions": ["7z"] - }, - "application/x-abiword": { - "source": "apache", - "extensions": ["abw"] - }, - "application/x-ace-compressed": { - "source": "apache", - "extensions": ["ace"] - }, - "application/x-amf": { - "source": "apache" - }, - "application/x-apple-diskimage": { - "source": "apache", - "extensions": ["dmg"] - }, - "application/x-authorware-bin": { - "source": "apache", - "extensions": ["aab","x32","u32","vox"] - }, - "application/x-authorware-map": { - "source": "apache", - "extensions": ["aam"] - }, - "application/x-authorware-seg": { - "source": "apache", - "extensions": ["aas"] - }, - "application/x-bcpio": { - "source": "apache", - "extensions": ["bcpio"] - }, - "application/x-bdoc": { - "compressible": false, - "extensions": ["bdoc"] - }, - "application/x-bittorrent": { - "source": "apache", - "extensions": ["torrent"] - }, - "application/x-blorb": { - "source": "apache", - "extensions": ["blb","blorb"] - }, - "application/x-bzip": { - "source": "apache", - "compressible": false, - "extensions": ["bz"] - }, - "application/x-bzip2": { - "source": "apache", - "compressible": false, - "extensions": ["bz2","boz"] - }, - "application/x-cbr": { - "source": "apache", - "extensions": ["cbr","cba","cbt","cbz","cb7"] - }, - "application/x-cdlink": { - "source": "apache", - "extensions": ["vcd"] - }, - "application/x-cfs-compressed": { - "source": "apache", - "extensions": ["cfs"] - }, - "application/x-chat": { - "source": "apache", - "extensions": ["chat"] - }, - "application/x-chess-pgn": { - "source": "apache", - "extensions": ["pgn"] - }, - "application/x-chrome-extension": { - "extensions": ["crx"] - }, - "application/x-cocoa": { - "source": "nginx", - "extensions": ["cco"] - }, - "application/x-compress": { - "source": "apache" - }, - "application/x-conference": { - "source": "apache", - "extensions": ["nsc"] - }, - "application/x-cpio": { - "source": "apache", - "extensions": ["cpio"] - }, - "application/x-csh": { - "source": "apache", - "extensions": ["csh"] - }, - "application/x-deb": { - "compressible": false - }, - "application/x-debian-package": { - "source": "apache", - "extensions": ["deb","udeb"] - }, - "application/x-dgc-compressed": { - "source": "apache", - "extensions": ["dgc"] - }, - "application/x-director": { - "source": "apache", - "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"] - }, - "application/x-doom": { - "source": "apache", - "extensions": ["wad"] - }, - "application/x-dtbncx+xml": { - "source": "apache", - "extensions": ["ncx"] - }, - "application/x-dtbook+xml": { - "source": "apache", - "extensions": ["dtb"] - }, - "application/x-dtbresource+xml": { - "source": "apache", - "extensions": ["res"] - }, - "application/x-dvi": { - "source": "apache", - "compressible": false, - "extensions": ["dvi"] - }, - "application/x-envoy": { - "source": "apache", - "extensions": ["evy"] - }, - "application/x-eva": { - "source": "apache", - "extensions": ["eva"] - }, - "application/x-font-bdf": { - "source": "apache", - "extensions": ["bdf"] - }, - "application/x-font-dos": { - "source": "apache" - }, - "application/x-font-framemaker": { - "source": "apache" - }, - "application/x-font-ghostscript": { - "source": "apache", - "extensions": ["gsf"] - }, - "application/x-font-libgrx": { - "source": "apache" - }, - "application/x-font-linux-psf": { - "source": "apache", - "extensions": ["psf"] - }, - "application/x-font-otf": { - "source": "apache", - "compressible": true, - "extensions": ["otf"] - }, - "application/x-font-pcf": { - "source": "apache", - "extensions": ["pcf"] - }, - "application/x-font-snf": { - "source": "apache", - "extensions": ["snf"] - }, - "application/x-font-speedo": { - "source": "apache" - }, - "application/x-font-sunos-news": { - "source": "apache" - }, - "application/x-font-ttf": { - "source": "apache", - "compressible": true, - "extensions": ["ttf","ttc"] - }, - "application/x-font-type1": { - "source": "apache", - "extensions": ["pfa","pfb","pfm","afm"] - }, - "application/x-font-vfont": { - "source": "apache" - }, - "application/x-freearc": { - "source": "apache", - "extensions": ["arc"] - }, - "application/x-futuresplash": { - "source": "apache", - "extensions": ["spl"] - }, - "application/x-gca-compressed": { - "source": "apache", - "extensions": ["gca"] - }, - "application/x-glulx": { - "source": "apache", - "extensions": ["ulx"] - }, - "application/x-gnumeric": { - "source": "apache", - "extensions": ["gnumeric"] - }, - "application/x-gramps-xml": { - "source": "apache", - "extensions": ["gramps"] - }, - "application/x-gtar": { - "source": "apache", - "extensions": ["gtar"] - }, - "application/x-gzip": { - "source": "apache" - }, - "application/x-hdf": { - "source": "apache", - "extensions": ["hdf"] - }, - "application/x-httpd-php": { - "compressible": true, - "extensions": ["php"] - }, - "application/x-install-instructions": { - "source": "apache", - "extensions": ["install"] - }, - "application/x-iso9660-image": { - "source": "apache", - "extensions": ["iso"] - }, - "application/x-java-archive-diff": { - "source": "nginx", - "extensions": ["jardiff"] - }, - "application/x-java-jnlp-file": { - "source": "apache", - "compressible": false, - "extensions": ["jnlp"] - }, - "application/x-javascript": { - "compressible": true - }, - "application/x-latex": { - "source": "apache", - "compressible": false, - "extensions": ["latex"] - }, - "application/x-lua-bytecode": { - "extensions": ["luac"] - }, - "application/x-lzh-compressed": { - "source": "apache", - "extensions": ["lzh","lha"] - }, - "application/x-makeself": { - "source": "nginx", - "extensions": ["run"] - }, - "application/x-mie": { - "source": "apache", - "extensions": ["mie"] - }, - "application/x-mobipocket-ebook": { - "source": "apache", - "extensions": ["prc","mobi"] - }, - "application/x-mpegurl": { - "compressible": false - }, - "application/x-ms-application": { - "source": "apache", - "extensions": ["application"] - }, - "application/x-ms-shortcut": { - "source": "apache", - "extensions": ["lnk"] - }, - "application/x-ms-wmd": { - "source": "apache", - "extensions": ["wmd"] - }, - "application/x-ms-wmz": { - "source": "apache", - "extensions": ["wmz"] - }, - "application/x-ms-xbap": { - "source": "apache", - "extensions": ["xbap"] - }, - "application/x-msaccess": { - "source": "apache", - "extensions": ["mdb"] - }, - "application/x-msbinder": { - "source": "apache", - "extensions": ["obd"] - }, - "application/x-mscardfile": { - "source": "apache", - "extensions": ["crd"] - }, - "application/x-msclip": { - "source": "apache", - "extensions": ["clp"] - }, - "application/x-msdos-program": { - "extensions": ["exe"] - }, - "application/x-msdownload": { - "source": "apache", - "extensions": ["exe","dll","com","bat","msi"] - }, - "application/x-msmediaview": { - "source": "apache", - "extensions": ["mvb","m13","m14"] - }, - "application/x-msmetafile": { - "source": "apache", - "extensions": ["wmf","wmz","emf","emz"] - }, - "application/x-msmoney": { - "source": "apache", - "extensions": ["mny"] - }, - "application/x-mspublisher": { - "source": "apache", - "extensions": ["pub"] - }, - "application/x-msschedule": { - "source": "apache", - "extensions": ["scd"] - }, - "application/x-msterminal": { - "source": "apache", - "extensions": ["trm"] - }, - "application/x-mswrite": { - "source": "apache", - "extensions": ["wri"] - }, - "application/x-netcdf": { - "source": "apache", - "extensions": ["nc","cdf"] - }, - "application/x-ns-proxy-autoconfig": { - "compressible": true, - "extensions": ["pac"] - }, - "application/x-nzb": { - "source": "apache", - "extensions": ["nzb"] - }, - "application/x-perl": { - "source": "nginx", - "extensions": ["pl","pm"] - }, - "application/x-pilot": { - "source": "nginx", - "extensions": ["prc","pdb"] - }, - "application/x-pkcs12": { - "source": "apache", - "compressible": false, - "extensions": ["p12","pfx"] - }, - "application/x-pkcs7-certificates": { - "source": "apache", - "extensions": ["p7b","spc"] - }, - "application/x-pkcs7-certreqresp": { - "source": "apache", - "extensions": ["p7r"] - }, - "application/x-rar-compressed": { - "source": "apache", - "compressible": false, - "extensions": ["rar"] - }, - "application/x-redhat-package-manager": { - "source": "nginx", - "extensions": ["rpm"] - }, - "application/x-research-info-systems": { - "source": "apache", - "extensions": ["ris"] - }, - "application/x-sea": { - "source": "nginx", - "extensions": ["sea"] - }, - "application/x-sh": { - "source": "apache", - "compressible": true, - "extensions": ["sh"] - }, - "application/x-shar": { - "source": "apache", - "extensions": ["shar"] - }, - "application/x-shockwave-flash": { - "source": "apache", - "compressible": false, - "extensions": ["swf"] - }, - "application/x-silverlight-app": { - "source": "apache", - "extensions": ["xap"] - }, - "application/x-sql": { - "source": "apache", - "extensions": ["sql"] - }, - "application/x-stuffit": { - "source": "apache", - "compressible": false, - "extensions": ["sit"] - }, - "application/x-stuffitx": { - "source": "apache", - "extensions": ["sitx"] - }, - "application/x-subrip": { - "source": "apache", - "extensions": ["srt"] - }, - "application/x-sv4cpio": { - "source": "apache", - "extensions": ["sv4cpio"] - }, - "application/x-sv4crc": { - "source": "apache", - "extensions": ["sv4crc"] - }, - "application/x-t3vm-image": { - "source": "apache", - "extensions": ["t3"] - }, - "application/x-tads": { - "source": "apache", - "extensions": ["gam"] - }, - "application/x-tar": { - "source": "apache", - "compressible": true, - "extensions": ["tar"] - }, - "application/x-tcl": { - "source": "apache", - "extensions": ["tcl","tk"] - }, - "application/x-tex": { - "source": "apache", - "extensions": ["tex"] - }, - "application/x-tex-tfm": { - "source": "apache", - "extensions": ["tfm"] - }, - "application/x-texinfo": { - "source": "apache", - "extensions": ["texinfo","texi"] - }, - "application/x-tgif": { - "source": "apache", - "extensions": ["obj"] - }, - "application/x-ustar": { - "source": "apache", - "extensions": ["ustar"] - }, - "application/x-wais-source": { - "source": "apache", - "extensions": ["src"] - }, - "application/x-web-app-manifest+json": { - "compressible": true, - "extensions": ["webapp"] - }, - "application/x-www-form-urlencoded": { - "source": "iana", - "compressible": true - }, - "application/x-x509-ca-cert": { - "source": "apache", - "extensions": ["der","crt","pem"] - }, - "application/x-xfig": { - "source": "apache", - "extensions": ["fig"] - }, - "application/x-xliff+xml": { - "source": "apache", - "extensions": ["xlf"] - }, - "application/x-xpinstall": { - "source": "apache", - "compressible": false, - "extensions": ["xpi"] - }, - "application/x-xz": { - "source": "apache", - "extensions": ["xz"] - }, - "application/x-zmachine": { - "source": "apache", - "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"] - }, - "application/x400-bp": { - "source": "iana" - }, - "application/xacml+xml": { - "source": "iana" - }, - "application/xaml+xml": { - "source": "apache", - "extensions": ["xaml"] - }, - "application/xcap-att+xml": { - "source": "iana" - }, - "application/xcap-caps+xml": { - "source": "iana" - }, - "application/xcap-diff+xml": { - "source": "iana", - "extensions": ["xdf"] - }, - "application/xcap-el+xml": { - "source": "iana" - }, - "application/xcap-error+xml": { - "source": "iana" - }, - "application/xcap-ns+xml": { - "source": "iana" - }, - "application/xcon-conference-info+xml": { - "source": "iana" - }, - "application/xcon-conference-info-diff+xml": { - "source": "iana" - }, - "application/xenc+xml": { - "source": "iana", - "extensions": ["xenc"] - }, - "application/xhtml+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xhtml","xht"] - }, - "application/xhtml-voice+xml": { - "source": "apache" - }, - "application/xml": { - "source": "iana", - "compressible": true, - "extensions": ["xml","xsl","xsd"] - }, - "application/xml-dtd": { - "source": "iana", - "compressible": true, - "extensions": ["dtd"] - }, - "application/xml-external-parsed-entity": { - "source": "iana" - }, - "application/xml-patch+xml": { - "source": "iana" - }, - "application/xmpp+xml": { - "source": "iana" - }, - "application/xop+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xop"] - }, - "application/xproc+xml": { - "source": "apache", - "extensions": ["xpl"] - }, - "application/xslt+xml": { - "source": "iana", - "extensions": ["xslt"] - }, - "application/xspf+xml": { - "source": "apache", - "extensions": ["xspf"] - }, - "application/xv+xml": { - "source": "iana", - "extensions": ["mxml","xhvml","xvml","xvm"] - }, - "application/yang": { - "source": "iana", - "extensions": ["yang"] - }, - "application/yin+xml": { - "source": "iana", - "extensions": ["yin"] - }, - "application/zip": { - "source": "iana", - "compressible": false, - "extensions": ["zip"] - }, - "application/zlib": { - "source": "iana" - }, - "audio/1d-interleaved-parityfec": { - "source": "iana" - }, - "audio/32kadpcm": { - "source": "iana" - }, - "audio/3gpp": { - "source": "iana" - }, - "audio/3gpp2": { - "source": "iana" - }, - "audio/ac3": { - "source": "iana" - }, - "audio/adpcm": { - "source": "apache", - "extensions": ["adp"] - }, - "audio/amr": { - "source": "iana" - }, - "audio/amr-wb": { - "source": "iana" - }, - "audio/amr-wb+": { - "source": "iana" - }, - "audio/aptx": { - "source": "iana" - }, - "audio/asc": { - "source": "iana" - }, - "audio/atrac-advanced-lossless": { - "source": "iana" - }, - "audio/atrac-x": { - "source": "iana" - }, - "audio/atrac3": { - "source": "iana" - }, - "audio/basic": { - "source": "iana", - "compressible": false, - "extensions": ["au","snd"] - }, - "audio/bv16": { - "source": "iana" - }, - "audio/bv32": { - "source": "iana" - }, - "audio/clearmode": { - "source": "iana" - }, - "audio/cn": { - "source": "iana" - }, - "audio/dat12": { - "source": "iana" - }, - "audio/dls": { - "source": "iana" - }, - "audio/dsr-es201108": { - "source": "iana" - }, - "audio/dsr-es202050": { - "source": "iana" - }, - "audio/dsr-es202211": { - "source": "iana" - }, - "audio/dsr-es202212": { - "source": "iana" - }, - "audio/dv": { - "source": "iana" - }, - "audio/dvi4": { - "source": "iana" - }, - "audio/eac3": { - "source": "iana" - }, - "audio/encaprtp": { - "source": "iana" - }, - "audio/evrc": { - "source": "iana" - }, - "audio/evrc-qcp": { - "source": "iana" - }, - "audio/evrc0": { - "source": "iana" - }, - "audio/evrc1": { - "source": "iana" - }, - "audio/evrcb": { - "source": "iana" - }, - "audio/evrcb0": { - "source": "iana" - }, - "audio/evrcb1": { - "source": "iana" - }, - "audio/evrcnw": { - "source": "iana" - }, - "audio/evrcnw0": { - "source": "iana" - }, - "audio/evrcnw1": { - "source": "iana" - }, - "audio/evrcwb": { - "source": "iana" - }, - "audio/evrcwb0": { - "source": "iana" - }, - "audio/evrcwb1": { - "source": "iana" - }, - "audio/fwdred": { - "source": "iana" - }, - "audio/g711-0": { - "source": "iana" - }, - "audio/g719": { - "source": "iana" - }, - "audio/g722": { - "source": "iana" - }, - "audio/g7221": { - "source": "iana" - }, - "audio/g723": { - "source": "iana" - }, - "audio/g726-16": { - "source": "iana" - }, - "audio/g726-24": { - "source": "iana" - }, - "audio/g726-32": { - "source": "iana" - }, - "audio/g726-40": { - "source": "iana" - }, - "audio/g728": { - "source": "iana" - }, - "audio/g729": { - "source": "iana" - }, - "audio/g7291": { - "source": "iana" - }, - "audio/g729d": { - "source": "iana" - }, - "audio/g729e": { - "source": "iana" - }, - "audio/gsm": { - "source": "iana" - }, - "audio/gsm-efr": { - "source": "iana" - }, - "audio/gsm-hr-08": { - "source": "iana" - }, - "audio/ilbc": { - "source": "iana" - }, - "audio/ip-mr_v2.5": { - "source": "iana" - }, - "audio/isac": { - "source": "apache" - }, - "audio/l16": { - "source": "iana" - }, - "audio/l20": { - "source": "iana" - }, - "audio/l24": { - "source": "iana", - "compressible": false - }, - "audio/l8": { - "source": "iana" - }, - "audio/lpc": { - "source": "iana" - }, - "audio/midi": { - "source": "apache", - "extensions": ["mid","midi","kar","rmi"] - }, - "audio/mobile-xmf": { - "source": "iana" - }, - "audio/mp4": { - "source": "iana", - "compressible": false, - "extensions": ["mp4a","m4a"] - }, - "audio/mp4a-latm": { - "source": "iana" - }, - "audio/mpa": { - "source": "iana" - }, - "audio/mpa-robust": { - "source": "iana" - }, - "audio/mpeg": { - "source": "iana", - "compressible": false, - "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"] - }, - "audio/mpeg4-generic": { - "source": "iana" - }, - "audio/musepack": { - "source": "apache" - }, - "audio/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["oga","ogg","spx"] - }, - "audio/opus": { - "source": "iana" - }, - "audio/parityfec": { - "source": "iana" - }, - "audio/pcma": { - "source": "iana" - }, - "audio/pcma-wb": { - "source": "iana" - }, - "audio/pcmu": { - "source": "iana" - }, - "audio/pcmu-wb": { - "source": "iana" - }, - "audio/prs.sid": { - "source": "iana" - }, - "audio/qcelp": { - "source": "iana" - }, - "audio/raptorfec": { - "source": "iana" - }, - "audio/red": { - "source": "iana" - }, - "audio/rtp-enc-aescm128": { - "source": "iana" - }, - "audio/rtp-midi": { - "source": "iana" - }, - "audio/rtploopback": { - "source": "iana" - }, - "audio/rtx": { - "source": "iana" - }, - "audio/s3m": { - "source": "apache", - "extensions": ["s3m"] - }, - "audio/silk": { - "source": "apache", - "extensions": ["sil"] - }, - "audio/smv": { - "source": "iana" - }, - "audio/smv-qcp": { - "source": "iana" - }, - "audio/smv0": { - "source": "iana" - }, - "audio/sp-midi": { - "source": "iana" - }, - "audio/speex": { - "source": "iana" - }, - "audio/t140c": { - "source": "iana" - }, - "audio/t38": { - "source": "iana" - }, - "audio/telephone-event": { - "source": "iana" - }, - "audio/tone": { - "source": "iana" - }, - "audio/uemclip": { - "source": "iana" - }, - "audio/ulpfec": { - "source": "iana" - }, - "audio/vdvi": { - "source": "iana" - }, - "audio/vmr-wb": { - "source": "iana" - }, - "audio/vnd.3gpp.iufp": { - "source": "iana" - }, - "audio/vnd.4sb": { - "source": "iana" - }, - "audio/vnd.audiokoz": { - "source": "iana" - }, - "audio/vnd.celp": { - "source": "iana" - }, - "audio/vnd.cisco.nse": { - "source": "iana" - }, - "audio/vnd.cmles.radio-events": { - "source": "iana" - }, - "audio/vnd.cns.anp1": { - "source": "iana" - }, - "audio/vnd.cns.inf1": { - "source": "iana" - }, - "audio/vnd.dece.audio": { - "source": "iana", - "extensions": ["uva","uvva"] - }, - "audio/vnd.digital-winds": { - "source": "iana", - "extensions": ["eol"] - }, - "audio/vnd.dlna.adts": { - "source": "iana" - }, - "audio/vnd.dolby.heaac.1": { - "source": "iana" - }, - "audio/vnd.dolby.heaac.2": { - "source": "iana" - }, - "audio/vnd.dolby.mlp": { - "source": "iana" - }, - "audio/vnd.dolby.mps": { - "source": "iana" - }, - "audio/vnd.dolby.pl2": { - "source": "iana" - }, - "audio/vnd.dolby.pl2x": { - "source": "iana" - }, - "audio/vnd.dolby.pl2z": { - "source": "iana" - }, - "audio/vnd.dolby.pulse.1": { - "source": "iana" - }, - "audio/vnd.dra": { - "source": "iana", - "extensions": ["dra"] - }, - "audio/vnd.dts": { - "source": "iana", - "extensions": ["dts"] - }, - "audio/vnd.dts.hd": { - "source": "iana", - "extensions": ["dtshd"] - }, - "audio/vnd.dvb.file": { - "source": "iana" - }, - "audio/vnd.everad.plj": { - "source": "iana" - }, - "audio/vnd.hns.audio": { - "source": "iana" - }, - "audio/vnd.lucent.voice": { - "source": "iana", - "extensions": ["lvp"] - }, - "audio/vnd.ms-playready.media.pya": { - "source": "iana", - "extensions": ["pya"] - }, - "audio/vnd.nokia.mobile-xmf": { - "source": "iana" - }, - "audio/vnd.nortel.vbk": { - "source": "iana" - }, - "audio/vnd.nuera.ecelp4800": { - "source": "iana", - "extensions": ["ecelp4800"] - }, - "audio/vnd.nuera.ecelp7470": { - "source": "iana", - "extensions": ["ecelp7470"] - }, - "audio/vnd.nuera.ecelp9600": { - "source": "iana", - "extensions": ["ecelp9600"] - }, - "audio/vnd.octel.sbc": { - "source": "iana" - }, - "audio/vnd.qcelp": { - "source": "iana" - }, - "audio/vnd.rhetorex.32kadpcm": { - "source": "iana" - }, - "audio/vnd.rip": { - "source": "iana", - "extensions": ["rip"] - }, - "audio/vnd.rn-realaudio": { - "compressible": false - }, - "audio/vnd.sealedmedia.softseal.mpeg": { - "source": "iana" - }, - "audio/vnd.vmx.cvsd": { - "source": "iana" - }, - "audio/vnd.wave": { - "compressible": false - }, - "audio/vorbis": { - "source": "iana", - "compressible": false - }, - "audio/vorbis-config": { - "source": "iana" - }, - "audio/wav": { - "compressible": false, - "extensions": ["wav"] - }, - "audio/wave": { - "compressible": false, - "extensions": ["wav"] - }, - "audio/webm": { - "source": "apache", - "compressible": false, - "extensions": ["weba"] - }, - "audio/x-aac": { - "source": "apache", - "compressible": false, - "extensions": ["aac"] - }, - "audio/x-aiff": { - "source": "apache", - "extensions": ["aif","aiff","aifc"] - }, - "audio/x-caf": { - "source": "apache", - "compressible": false, - "extensions": ["caf"] - }, - "audio/x-flac": { - "source": "apache", - "extensions": ["flac"] - }, - "audio/x-m4a": { - "source": "nginx", - "extensions": ["m4a"] - }, - "audio/x-matroska": { - "source": "apache", - "extensions": ["mka"] - }, - "audio/x-mpegurl": { - "source": "apache", - "extensions": ["m3u"] - }, - "audio/x-ms-wax": { - "source": "apache", - "extensions": ["wax"] - }, - "audio/x-ms-wma": { - "source": "apache", - "extensions": ["wma"] - }, - "audio/x-pn-realaudio": { - "source": "apache", - "extensions": ["ram","ra"] - }, - "audio/x-pn-realaudio-plugin": { - "source": "apache", - "extensions": ["rmp"] - }, - "audio/x-realaudio": { - "source": "nginx", - "extensions": ["ra"] - }, - "audio/x-tta": { - "source": "apache" - }, - "audio/x-wav": { - "source": "apache", - "extensions": ["wav"] - }, - "audio/xm": { - "source": "apache", - "extensions": ["xm"] - }, - "chemical/x-cdx": { - "source": "apache", - "extensions": ["cdx"] - }, - "chemical/x-cif": { - "source": "apache", - "extensions": ["cif"] - }, - "chemical/x-cmdf": { - "source": "apache", - "extensions": ["cmdf"] - }, - "chemical/x-cml": { - "source": "apache", - "extensions": ["cml"] - }, - "chemical/x-csml": { - "source": "apache", - "extensions": ["csml"] - }, - "chemical/x-pdb": { - "source": "apache" - }, - "chemical/x-xyz": { - "source": "apache", - "extensions": ["xyz"] - }, - "font/opentype": { - "compressible": true, - "extensions": ["otf"] - }, - "image/bmp": { - "source": "apache", - "compressible": true, - "extensions": ["bmp"] - }, - "image/cgm": { - "source": "iana", - "extensions": ["cgm"] - }, - "image/fits": { - "source": "iana" - }, - "image/g3fax": { - "source": "iana", - "extensions": ["g3"] - }, - "image/gif": { - "source": "iana", - "compressible": false, - "extensions": ["gif"] - }, - "image/ief": { - "source": "iana", - "extensions": ["ief"] - }, - "image/jp2": { - "source": "iana" - }, - "image/jpeg": { - "source": "iana", - "compressible": false, - "extensions": ["jpeg","jpg","jpe"] - }, - "image/jpm": { - "source": "iana" - }, - "image/jpx": { - "source": "iana" - }, - "image/ktx": { - "source": "iana", - "extensions": ["ktx"] - }, - "image/naplps": { - "source": "iana" - }, - "image/pjpeg": { - "compressible": false - }, - "image/png": { - "source": "iana", - "compressible": false, - "extensions": ["png"] - }, - "image/prs.btif": { - "source": "iana", - "extensions": ["btif"] - }, - "image/prs.pti": { - "source": "iana" - }, - "image/pwg-raster": { - "source": "iana" - }, - "image/sgi": { - "source": "apache", - "extensions": ["sgi"] - }, - "image/svg+xml": { - "source": "iana", - "compressible": true, - "extensions": ["svg","svgz"] - }, - "image/t38": { - "source": "iana" - }, - "image/tiff": { - "source": "iana", - "compressible": false, - "extensions": ["tiff","tif"] - }, - "image/tiff-fx": { - "source": "iana" - }, - "image/vnd.adobe.photoshop": { - "source": "iana", - "compressible": true, - "extensions": ["psd"] - }, - "image/vnd.airzip.accelerator.azv": { - "source": "iana" - }, - "image/vnd.cns.inf2": { - "source": "iana" - }, - "image/vnd.dece.graphic": { - "source": "iana", - "extensions": ["uvi","uvvi","uvg","uvvg"] - }, - "image/vnd.djvu": { - "source": "iana", - "extensions": ["djvu","djv"] - }, - "image/vnd.dvb.subtitle": { - "source": "iana", - "extensions": ["sub"] - }, - "image/vnd.dwg": { - "source": "iana", - "extensions": ["dwg"] - }, - "image/vnd.dxf": { - "source": "iana", - "extensions": ["dxf"] - }, - "image/vnd.fastbidsheet": { - "source": "iana", - "extensions": ["fbs"] - }, - "image/vnd.fpx": { - "source": "iana", - "extensions": ["fpx"] - }, - "image/vnd.fst": { - "source": "iana", - "extensions": ["fst"] - }, - "image/vnd.fujixerox.edmics-mmr": { - "source": "iana", - "extensions": ["mmr"] - }, - "image/vnd.fujixerox.edmics-rlc": { - "source": "iana", - "extensions": ["rlc"] - }, - "image/vnd.globalgraphics.pgb": { - "source": "iana" - }, - "image/vnd.microsoft.icon": { - "source": "iana" - }, - "image/vnd.mix": { - "source": "iana" - }, - "image/vnd.mozilla.apng": { - "source": "iana" - }, - "image/vnd.ms-modi": { - "source": "iana", - "extensions": ["mdi"] - }, - "image/vnd.ms-photo": { - "source": "apache", - "extensions": ["wdp"] - }, - "image/vnd.net-fpx": { - "source": "iana", - "extensions": ["npx"] - }, - "image/vnd.radiance": { - "source": "iana" - }, - "image/vnd.sealed.png": { - "source": "iana" - }, - "image/vnd.sealedmedia.softseal.gif": { - "source": "iana" - }, - "image/vnd.sealedmedia.softseal.jpg": { - "source": "iana" - }, - "image/vnd.svf": { - "source": "iana" - }, - "image/vnd.tencent.tap": { - "source": "iana" - }, - "image/vnd.valve.source.texture": { - "source": "iana" - }, - "image/vnd.wap.wbmp": { - "source": "iana", - "extensions": ["wbmp"] - }, - "image/vnd.xiff": { - "source": "iana", - "extensions": ["xif"] - }, - "image/vnd.zbrush.pcx": { - "source": "iana" - }, - "image/webp": { - "source": "apache", - "extensions": ["webp"] - }, - "image/x-3ds": { - "source": "apache", - "extensions": ["3ds"] - }, - "image/x-cmu-raster": { - "source": "apache", - "extensions": ["ras"] - }, - "image/x-cmx": { - "source": "apache", - "extensions": ["cmx"] - }, - "image/x-freehand": { - "source": "apache", - "extensions": ["fh","fhc","fh4","fh5","fh7"] - }, - "image/x-icon": { - "source": "apache", - "compressible": true, - "extensions": ["ico"] - }, - "image/x-jng": { - "source": "nginx", - "extensions": ["jng"] - }, - "image/x-mrsid-image": { - "source": "apache", - "extensions": ["sid"] - }, - "image/x-ms-bmp": { - "source": "nginx", - "compressible": true, - "extensions": ["bmp"] - }, - "image/x-pcx": { - "source": "apache", - "extensions": ["pcx"] - }, - "image/x-pict": { - "source": "apache", - "extensions": ["pic","pct"] - }, - "image/x-portable-anymap": { - "source": "apache", - "extensions": ["pnm"] - }, - "image/x-portable-bitmap": { - "source": "apache", - "extensions": ["pbm"] - }, - "image/x-portable-graymap": { - "source": "apache", - "extensions": ["pgm"] - }, - "image/x-portable-pixmap": { - "source": "apache", - "extensions": ["ppm"] - }, - "image/x-rgb": { - "source": "apache", - "extensions": ["rgb"] - }, - "image/x-tga": { - "source": "apache", - "extensions": ["tga"] - }, - "image/x-xbitmap": { - "source": "apache", - "extensions": ["xbm"] - }, - "image/x-xcf": { - "compressible": false - }, - "image/x-xpixmap": { - "source": "apache", - "extensions": ["xpm"] - }, - "image/x-xwindowdump": { - "source": "apache", - "extensions": ["xwd"] - }, - "message/cpim": { - "source": "iana" - }, - "message/delivery-status": { - "source": "iana" - }, - "message/disposition-notification": { - "source": "iana" - }, - "message/external-body": { - "source": "iana" - }, - "message/feedback-report": { - "source": "iana" - }, - "message/global": { - "source": "iana" - }, - "message/global-delivery-status": { - "source": "iana" - }, - "message/global-disposition-notification": { - "source": "iana" - }, - "message/global-headers": { - "source": "iana" - }, - "message/http": { - "source": "iana", - "compressible": false - }, - "message/imdn+xml": { - "source": "iana", - "compressible": true - }, - "message/news": { - "source": "iana" - }, - "message/partial": { - "source": "iana", - "compressible": false - }, - "message/rfc822": { - "source": "iana", - "compressible": true, - "extensions": ["eml","mime"] - }, - "message/s-http": { - "source": "iana" - }, - "message/sip": { - "source": "iana" - }, - "message/sipfrag": { - "source": "iana" - }, - "message/tracking-status": { - "source": "iana" - }, - "message/vnd.si.simp": { - "source": "iana" - }, - "message/vnd.wfa.wsc": { - "source": "iana" - }, - "model/iges": { - "source": "iana", - "compressible": false, - "extensions": ["igs","iges"] - }, - "model/mesh": { - "source": "iana", - "compressible": false, - "extensions": ["msh","mesh","silo"] - }, - "model/vnd.collada+xml": { - "source": "iana", - "extensions": ["dae"] - }, - "model/vnd.dwf": { - "source": "iana", - "extensions": ["dwf"] - }, - "model/vnd.flatland.3dml": { - "source": "iana" - }, - "model/vnd.gdl": { - "source": "iana", - "extensions": ["gdl"] - }, - "model/vnd.gs-gdl": { - "source": "apache" - }, - "model/vnd.gs.gdl": { - "source": "iana" - }, - "model/vnd.gtw": { - "source": "iana", - "extensions": ["gtw"] - }, - "model/vnd.moml+xml": { - "source": "iana" - }, - "model/vnd.mts": { - "source": "iana", - "extensions": ["mts"] - }, - "model/vnd.opengex": { - "source": "iana" - }, - "model/vnd.parasolid.transmit.binary": { - "source": "iana" - }, - "model/vnd.parasolid.transmit.text": { - "source": "iana" - }, - "model/vnd.valve.source.compiled-map": { - "source": "iana" - }, - "model/vnd.vtu": { - "source": "iana", - "extensions": ["vtu"] - }, - "model/vrml": { - "source": "iana", - "compressible": false, - "extensions": ["wrl","vrml"] - }, - "model/x3d+binary": { - "source": "apache", - "compressible": false, - "extensions": ["x3db","x3dbz"] - }, - "model/x3d+fastinfoset": { - "source": "iana" - }, - "model/x3d+vrml": { - "source": "apache", - "compressible": false, - "extensions": ["x3dv","x3dvz"] - }, - "model/x3d+xml": { - "source": "iana", - "compressible": true, - "extensions": ["x3d","x3dz"] - }, - "model/x3d-vrml": { - "source": "iana" - }, - "multipart/alternative": { - "source": "iana", - "compressible": false - }, - "multipart/appledouble": { - "source": "iana" - }, - "multipart/byteranges": { - "source": "iana" - }, - "multipart/digest": { - "source": "iana" - }, - "multipart/encrypted": { - "source": "iana", - "compressible": false - }, - "multipart/form-data": { - "source": "iana", - "compressible": false - }, - "multipart/header-set": { - "source": "iana" - }, - "multipart/mixed": { - "source": "iana", - "compressible": false - }, - "multipart/parallel": { - "source": "iana" - }, - "multipart/related": { - "source": "iana", - "compressible": false - }, - "multipart/report": { - "source": "iana" - }, - "multipart/signed": { - "source": "iana", - "compressible": false - }, - "multipart/voice-message": { - "source": "iana" - }, - "multipart/x-mixed-replace": { - "source": "iana" - }, - "text/1d-interleaved-parityfec": { - "source": "iana" - }, - "text/cache-manifest": { - "source": "iana", - "compressible": true, - "extensions": ["appcache","manifest"] - }, - "text/calendar": { - "source": "iana", - "extensions": ["ics","ifb"] - }, - "text/calender": { - "compressible": true - }, - "text/cmd": { - "compressible": true - }, - "text/coffeescript": { - "extensions": ["coffee","litcoffee"] - }, - "text/css": { - "source": "iana", - "compressible": true, - "extensions": ["css"] - }, - "text/csv": { - "source": "iana", - "compressible": true, - "extensions": ["csv"] - }, - "text/csv-schema": { - "source": "iana" - }, - "text/directory": { - "source": "iana" - }, - "text/dns": { - "source": "iana" - }, - "text/ecmascript": { - "source": "iana" - }, - "text/encaprtp": { - "source": "iana" - }, - "text/enriched": { - "source": "iana" - }, - "text/fwdred": { - "source": "iana" - }, - "text/grammar-ref-list": { - "source": "iana" - }, - "text/hjson": { - "extensions": ["hjson"] - }, - "text/html": { - "source": "iana", - "compressible": true, - "extensions": ["html","htm","shtml"] - }, - "text/jade": { - "extensions": ["jade"] - }, - "text/javascript": { - "source": "iana", - "compressible": true - }, - "text/jcr-cnd": { - "source": "iana" - }, - "text/jsx": { - "compressible": true, - "extensions": ["jsx"] - }, - "text/less": { - "extensions": ["less"] - }, - "text/markdown": { - "source": "iana" - }, - "text/mathml": { - "source": "nginx", - "extensions": ["mml"] - }, - "text/mizar": { - "source": "iana" - }, - "text/n3": { - "source": "iana", - "compressible": true, - "extensions": ["n3"] - }, - "text/parameters": { - "source": "iana" - }, - "text/parityfec": { - "source": "iana" - }, - "text/plain": { - "source": "iana", - "compressible": true, - "extensions": ["txt","text","conf","def","list","log","in","ini"] - }, - "text/provenance-notation": { - "source": "iana" - }, - "text/prs.fallenstein.rst": { - "source": "iana" - }, - "text/prs.lines.tag": { - "source": "iana", - "extensions": ["dsc"] - }, - "text/raptorfec": { - "source": "iana" - }, - "text/red": { - "source": "iana" - }, - "text/rfc822-headers": { - "source": "iana" - }, - "text/richtext": { - "source": "iana", - "compressible": true, - "extensions": ["rtx"] - }, - "text/rtf": { - "source": "iana", - "compressible": true, - "extensions": ["rtf"] - }, - "text/rtp-enc-aescm128": { - "source": "iana" - }, - "text/rtploopback": { - "source": "iana" - }, - "text/rtx": { - "source": "iana" - }, - "text/sgml": { - "source": "iana", - "extensions": ["sgml","sgm"] - }, - "text/stylus": { - "extensions": ["stylus","styl"] - }, - "text/t140": { - "source": "iana" - }, - "text/tab-separated-values": { - "source": "iana", - "compressible": true, - "extensions": ["tsv"] - }, - "text/troff": { - "source": "iana", - "extensions": ["t","tr","roff","man","me","ms"] - }, - "text/turtle": { - "source": "iana", - "extensions": ["ttl"] - }, - "text/ulpfec": { - "source": "iana" - }, - "text/uri-list": { - "source": "iana", - "compressible": true, - "extensions": ["uri","uris","urls"] - }, - "text/vcard": { - "source": "iana", - "compressible": true, - "extensions": ["vcard"] - }, - "text/vnd.a": { - "source": "iana" - }, - "text/vnd.abc": { - "source": "iana" - }, - "text/vnd.curl": { - "source": "iana", - "extensions": ["curl"] - }, - "text/vnd.curl.dcurl": { - "source": "apache", - "extensions": ["dcurl"] - }, - "text/vnd.curl.mcurl": { - "source": "apache", - "extensions": ["mcurl"] - }, - "text/vnd.curl.scurl": { - "source": "apache", - "extensions": ["scurl"] - }, - "text/vnd.debian.copyright": { - "source": "iana" - }, - "text/vnd.dmclientscript": { - "source": "iana" - }, - "text/vnd.dvb.subtitle": { - "source": "iana", - "extensions": ["sub"] - }, - "text/vnd.esmertec.theme-descriptor": { - "source": "iana" - }, - "text/vnd.fly": { - "source": "iana", - "extensions": ["fly"] - }, - "text/vnd.fmi.flexstor": { - "source": "iana", - "extensions": ["flx"] - }, - "text/vnd.graphviz": { - "source": "iana", - "extensions": ["gv"] - }, - "text/vnd.in3d.3dml": { - "source": "iana", - "extensions": ["3dml"] - }, - "text/vnd.in3d.spot": { - "source": "iana", - "extensions": ["spot"] - }, - "text/vnd.iptc.newsml": { - "source": "iana" - }, - "text/vnd.iptc.nitf": { - "source": "iana" - }, - "text/vnd.latex-z": { - "source": "iana" - }, - "text/vnd.motorola.reflex": { - "source": "iana" - }, - "text/vnd.ms-mediapackage": { - "source": "iana" - }, - "text/vnd.net2phone.commcenter.command": { - "source": "iana" - }, - "text/vnd.radisys.msml-basic-layout": { - "source": "iana" - }, - "text/vnd.si.uricatalogue": { - "source": "iana" - }, - "text/vnd.sun.j2me.app-descriptor": { - "source": "iana", - "extensions": ["jad"] - }, - "text/vnd.trolltech.linguist": { - "source": "iana" - }, - "text/vnd.wap.si": { - "source": "iana" - }, - "text/vnd.wap.sl": { - "source": "iana" - }, - "text/vnd.wap.wml": { - "source": "iana", - "extensions": ["wml"] - }, - "text/vnd.wap.wmlscript": { - "source": "iana", - "extensions": ["wmls"] - }, - "text/vtt": { - "charset": "UTF-8", - "compressible": true, - "extensions": ["vtt"] - }, - "text/x-asm": { - "source": "apache", - "extensions": ["s","asm"] - }, - "text/x-c": { - "source": "apache", - "extensions": ["c","cc","cxx","cpp","h","hh","dic"] - }, - "text/x-component": { - "source": "nginx", - "extensions": ["htc"] - }, - "text/x-fortran": { - "source": "apache", - "extensions": ["f","for","f77","f90"] - }, - "text/x-gwt-rpc": { - "compressible": true - }, - "text/x-handlebars-template": { - "extensions": ["hbs"] - }, - "text/x-java-source": { - "source": "apache", - "extensions": ["java"] - }, - "text/x-jquery-tmpl": { - "compressible": true - }, - "text/x-lua": { - "extensions": ["lua"] - }, - "text/x-markdown": { - "compressible": true, - "extensions": ["markdown","md","mkd"] - }, - "text/x-nfo": { - "source": "apache", - "extensions": ["nfo"] - }, - "text/x-opml": { - "source": "apache", - "extensions": ["opml"] - }, - "text/x-pascal": { - "source": "apache", - "extensions": ["p","pas"] - }, - "text/x-processing": { - "compressible": true, - "extensions": ["pde"] - }, - "text/x-sass": { - "extensions": ["sass"] - }, - "text/x-scss": { - "extensions": ["scss"] - }, - "text/x-setext": { - "source": "apache", - "extensions": ["etx"] - }, - "text/x-sfv": { - "source": "apache", - "extensions": ["sfv"] - }, - "text/x-uuencode": { - "source": "apache", - "extensions": ["uu"] - }, - "text/x-vcalendar": { - "source": "apache", - "extensions": ["vcs"] - }, - "text/x-vcard": { - "source": "apache", - "extensions": ["vcf"] - }, - "text/xml": { - "source": "iana", - "compressible": true, - "extensions": ["xml"] - }, - "text/xml-external-parsed-entity": { - "source": "iana" - }, - "text/yaml": { - "extensions": ["yaml","yml"] - }, - "video/1d-interleaved-parityfec": { - "source": "apache" - }, - "video/3gpp": { - "source": "apache", - "extensions": ["3gp","3gpp"] - }, - "video/3gpp-tt": { - "source": "apache" - }, - "video/3gpp2": { - "source": "apache", - "extensions": ["3g2"] - }, - "video/bmpeg": { - "source": "apache" - }, - "video/bt656": { - "source": "apache" - }, - "video/celb": { - "source": "apache" - }, - "video/dv": { - "source": "apache" - }, - "video/h261": { - "source": "apache", - "extensions": ["h261"] - }, - "video/h263": { - "source": "apache", - "extensions": ["h263"] - }, - "video/h263-1998": { - "source": "apache" - }, - "video/h263-2000": { - "source": "apache" - }, - "video/h264": { - "source": "apache", - "extensions": ["h264"] - }, - "video/h264-rcdo": { - "source": "apache" - }, - "video/h264-svc": { - "source": "apache" - }, - "video/jpeg": { - "source": "apache", - "extensions": ["jpgv"] - }, - "video/jpeg2000": { - "source": "apache" - }, - "video/jpm": { - "source": "apache", - "extensions": ["jpm","jpgm"] - }, - "video/mj2": { - "source": "apache", - "extensions": ["mj2","mjp2"] - }, - "video/mp1s": { - "source": "apache" - }, - "video/mp2p": { - "source": "apache" - }, - "video/mp2t": { - "source": "apache", - "extensions": ["ts"] - }, - "video/mp4": { - "source": "apache", - "compressible": false, - "extensions": ["mp4","mp4v","mpg4"] - }, - "video/mp4v-es": { - "source": "apache" - }, - "video/mpeg": { - "source": "apache", - "compressible": false, - "extensions": ["mpeg","mpg","mpe","m1v","m2v"] - }, - "video/mpeg4-generic": { - "source": "apache" - }, - "video/mpv": { - "source": "apache" - }, - "video/nv": { - "source": "apache" - }, - "video/ogg": { - "source": "apache", - "compressible": false, - "extensions": ["ogv"] - }, - "video/parityfec": { - "source": "apache" - }, - "video/pointer": { - "source": "apache" - }, - "video/quicktime": { - "source": "apache", - "compressible": false, - "extensions": ["qt","mov"] - }, - "video/raw": { - "source": "apache" - }, - "video/rtp-enc-aescm128": { - "source": "apache" - }, - "video/rtx": { - "source": "apache" - }, - "video/smpte292m": { - "source": "apache" - }, - "video/ulpfec": { - "source": "apache" - }, - "video/vc1": { - "source": "apache" - }, - "video/vnd.cctv": { - "source": "apache" - }, - "video/vnd.dece.hd": { - "source": "apache", - "extensions": ["uvh","uvvh"] - }, - "video/vnd.dece.mobile": { - "source": "apache", - "extensions": ["uvm","uvvm"] - }, - "video/vnd.dece.mp4": { - "source": "apache" - }, - "video/vnd.dece.pd": { - "source": "apache", - "extensions": ["uvp","uvvp"] - }, - "video/vnd.dece.sd": { - "source": "apache", - "extensions": ["uvs","uvvs"] - }, - "video/vnd.dece.video": { - "source": "apache", - "extensions": ["uvv","uvvv"] - }, - "video/vnd.directv.mpeg": { - "source": "apache" - }, - "video/vnd.directv.mpeg-tts": { - "source": "apache" - }, - "video/vnd.dlna.mpeg-tts": { - "source": "apache" - }, - "video/vnd.dvb.file": { - "source": "apache", - "extensions": ["dvb"] - }, - "video/vnd.fvt": { - "source": "apache", - "extensions": ["fvt"] - }, - "video/vnd.hns.video": { - "source": "apache" - }, - "video/vnd.iptvforum.1dparityfec-1010": { - "source": "apache" - }, - "video/vnd.iptvforum.1dparityfec-2005": { - "source": "apache" - }, - "video/vnd.iptvforum.2dparityfec-1010": { - "source": "apache" - }, - "video/vnd.iptvforum.2dparityfec-2005": { - "source": "apache" - }, - "video/vnd.iptvforum.ttsavc": { - "source": "apache" - }, - "video/vnd.iptvforum.ttsmpeg2": { - "source": "apache" - }, - "video/vnd.motorola.video": { - "source": "apache" - }, - "video/vnd.motorola.videop": { - "source": "apache" - }, - "video/vnd.mpegurl": { - "source": "apache", - "extensions": ["mxu","m4u"] - }, - "video/vnd.ms-playready.media.pyv": { - "source": "apache", - "extensions": ["pyv"] - }, - "video/vnd.nokia.interleaved-multimedia": { - "source": "apache" - }, - "video/vnd.nokia.videovoip": { - "source": "apache" - }, - "video/vnd.objectvideo": { - "source": "apache" - }, - "video/vnd.sealed.mpeg1": { - "source": "apache" - }, - "video/vnd.sealed.mpeg4": { - "source": "apache" - }, - "video/vnd.sealed.swf": { - "source": "apache" - }, - "video/vnd.sealedmedia.softseal.mov": { - "source": "apache" - }, - "video/vnd.uvvu.mp4": { - "source": "apache", - "extensions": ["uvu","uvvu"] - }, - "video/vnd.vivo": { - "source": "apache", - "extensions": ["viv"] - }, - "video/webm": { - "source": "apache", - "compressible": false, - "extensions": ["webm"] - }, - "video/x-f4v": { - "source": "apache", - "extensions": ["f4v"] - }, - "video/x-fli": { - "source": "apache", - "extensions": ["fli"] - }, - "video/x-flv": { - "source": "apache", - "compressible": false, - "extensions": ["flv"] - }, - "video/x-m4v": { - "source": "apache", - "extensions": ["m4v"] - }, - "video/x-matroska": { - "source": "apache", - "compressible": false, - "extensions": ["mkv","mk3d","mks"] - }, - "video/x-mng": { - "source": "apache", - "extensions": ["mng"] - }, - "video/x-ms-asf": { - "source": "apache", - "extensions": ["asf","asx"] - }, - "video/x-ms-vob": { - "source": "apache", - "extensions": ["vob"] - }, - "video/x-ms-wm": { - "source": "apache", - "extensions": ["wm"] - }, - "video/x-ms-wmv": { - "source": "apache", - "compressible": false, - "extensions": ["wmv"] - }, - "video/x-ms-wmx": { - "source": "apache", - "extensions": ["wmx"] - }, - "video/x-ms-wvx": { - "source": "apache", - "extensions": ["wvx"] - }, - "video/x-msvideo": { - "source": "apache", - "extensions": ["avi"] - }, - "video/x-sgi-movie": { - "source": "apache", - "extensions": ["movie"] - }, - "video/x-smv": { - "source": "apache", - "extensions": ["smv"] - }, - "x-conference/x-cooltalk": { - "source": "apache", - "extensions": ["ice"] - }, - "x-shader/x-fragment": { - "compressible": true - }, - "x-shader/x-vertex": { - "compressible": true - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/index.js deleted file mode 100644 index 551031f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * mime-db - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = require('./db.json') diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/package.json deleted file mode 100644 index 493b360..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/package.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "name": "mime-db", - "description": "Media Type Database", - "version": "1.18.0", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - } - ], - "license": "MIT", - "keywords": [ - "mime", - "db", - "type", - "types", - "database", - "charset", - "charsets" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/mime-db" - }, - "devDependencies": { - "bluebird": "2.9.34", - "co": "4.6.0", - "cogent": "1.0.1", - "csv-parse": "1.0.0", - "gnode": "0.1.1", - "istanbul": "0.3.19", - "mocha": "1.21.5", - "raw-body": "2.1.2", - "stream-to-array": "2" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "db.json", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "build": "node scripts/build", - "fetch": "gnode scripts/fetch-apache && gnode scripts/fetch-iana && gnode scripts/fetch-nginx", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", - "update": "npm run fetch && npm run build" - }, - "gitHead": "c48209a8786e61f20499ba14167252ad67638c5f", - "bugs": { - "url": "https://github.com/jshttp/mime-db/issues" - }, - "homepage": "https://github.com/jshttp/mime-db", - "_id": "mime-db@1.18.0", - "_shasum": "5317e28224c08af1d484f60973dd386ba8f389e0", - "_from": "mime-db@>=1.18.0 <1.19.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "5317e28224c08af1d484f60973dd386ba8f389e0", - "tarball": "http://registry.npmjs.org/mime-db/-/mime-db-1.18.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.18.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json deleted file mode 100644 index 09f70c8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "2.1.6", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": "https://searchbeam.jit.su" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - } - ], - "license": "MIT", - "keywords": [ - "mime", - "types" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/mime-types" - }, - "dependencies": { - "mime-db": "~1.18.0" - }, - "devDependencies": { - "istanbul": "0.3.19", - "mocha": "~1.21.5" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec test/test.js", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/test.js", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot test/test.js" - }, - "gitHead": "8bfa7c2c9a4ad07f5807c7a0e547e0246155944d", - "bugs": { - "url": "https://github.com/jshttp/mime-types/issues" - }, - "homepage": "https://github.com/jshttp/mime-types", - "_id": "mime-types@2.1.6", - "_shasum": "949f8788411864ddc70948a0f21c43f29d25667c", - "_from": "mime-types@>=2.1.6 <2.2.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "949f8788411864ddc70948a0f21c43f29d25667c", - "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-2.1.6.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.6.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/HISTORY.md deleted file mode 100644 index aa2a7c4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/HISTORY.md +++ /dev/null @@ -1,76 +0,0 @@ -0.5.3 / 2015-05-10 -================== - - * Fix media type parameter matching to be case-insensitive - -0.5.2 / 2015-05-06 -================== - - * Fix comparing media types with quoted values - * Fix splitting media types with quoted commas - -0.5.1 / 2015-02-14 -================== - - * Fix preference sorting to be stable for long acceptable lists - -0.5.0 / 2014-12-18 -================== - - * Fix list return order when large accepted list - * Fix missing identity encoding when q=0 exists - * Remove dynamic building of Negotiator class - -0.4.9 / 2014-10-14 -================== - - * Fix error when media type has invalid parameter - -0.4.8 / 2014-09-28 -================== - - * Fix all negotiations to be case-insensitive - * Stable sort preferences of same quality according to client order - * Support Node.js 0.6 - -0.4.7 / 2014-06-24 -================== - - * Handle invalid provided languages - * Handle invalid provided media types - -0.4.6 / 2014-06-11 -================== - - * Order by specificity when quality is the same - -0.4.5 / 2014-05-29 -================== - - * Fix regression in empty header handling - -0.4.4 / 2014-05-29 -================== - - * Fix behaviors when headers are not present - -0.4.3 / 2014-04-16 -================== - - * Handle slashes on media params correctly - -0.4.2 / 2014-02-28 -================== - - * Fix media type sorting - * Handle media types params strictly - -0.4.1 / 2014-01-16 -================== - - * Use most specific matches - -0.4.0 / 2014-01-09 -================== - - * Remove preferred prefix from methods diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE deleted file mode 100644 index ea6b9e2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -(The MIT License) - -Copyright (c) 2012-2014 Federico Romero -Copyright (c) 2012-2014 Isaac Z. Schlueter -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/README.md deleted file mode 100644 index ef507fa..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/README.md +++ /dev/null @@ -1,203 +0,0 @@ -# negotiator - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -An HTTP content negotiator for Node.js - -## Installation - -```sh -$ npm install negotiator -``` - -## API - -```js -var Negotiator = require('negotiator') -``` - -### Accept Negotiation - -```js -availableMediaTypes = ['text/html', 'text/plain', 'application/json'] - -// The negotiator constructor receives a request object -negotiator = new Negotiator(request) - -// Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8' - -negotiator.mediaTypes() -// -> ['text/html', 'image/jpeg', 'application/*'] - -negotiator.mediaTypes(availableMediaTypes) -// -> ['text/html', 'application/json'] - -negotiator.mediaType(availableMediaTypes) -// -> 'text/html' -``` - -You can check a working example at `examples/accept.js`. - -#### Methods - -##### mediaType() - -Returns the most preferred media type from the client. - -##### mediaType(availableMediaType) - -Returns the most preferred media type from a list of available media types. - -##### mediaTypes() - -Returns an array of preferred media types ordered by the client preference. - -##### mediaTypes(availableMediaTypes) - -Returns an array of preferred media types ordered by priority from a list of -available media types. - -### Accept-Language Negotiation - -```js -negotiator = new Negotiator(request) - -availableLanguages = 'en', 'es', 'fr' - -// Let's say Accept-Language header is 'en;q=0.8, es, pt' - -negotiator.languages() -// -> ['es', 'pt', 'en'] - -negotiator.languages(availableLanguages) -// -> ['es', 'en'] - -language = negotiator.language(availableLanguages) -// -> 'es' -``` - -You can check a working example at `examples/language.js`. - -#### Methods - -##### language() - -Returns the most preferred language from the client. - -##### language(availableLanguages) - -Returns the most preferred language from a list of available languages. - -##### languages() - -Returns an array of preferred languages ordered by the client preference. - -##### languages(availableLanguages) - -Returns an array of preferred languages ordered by priority from a list of -available languages. - -### Accept-Charset Negotiation - -```js -availableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5'] - -negotiator = new Negotiator(request) - -// Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2' - -negotiator.charsets() -// -> ['utf-8', 'iso-8859-1', 'utf-7'] - -negotiator.charsets(availableCharsets) -// -> ['utf-8', 'iso-8859-1'] - -negotiator.charset(availableCharsets) -// -> 'utf-8' -``` - -You can check a working example at `examples/charset.js`. - -#### Methods - -##### charset() - -Returns the most preferred charset from the client. - -##### charset(availableCharsets) - -Returns the most preferred charset from a list of available charsets. - -##### charsets() - -Returns an array of preferred charsets ordered by the client preference. - -##### charsets(availableCharsets) - -Returns an array of preferred charsets ordered by priority from a list of -available charsets. - -### Accept-Encoding Negotiation - -```js -availableEncodings = ['identity', 'gzip'] - -negotiator = new Negotiator(request) - -// Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5' - -negotiator.encodings() -// -> ['gzip', 'identity', 'compress'] - -negotiator.encodings(availableEncodings) -// -> ['gzip', 'identity'] - -negotiator.encoding(availableEncodings) -// -> 'gzip' -``` - -You can check a working example at `examples/encoding.js`. - -#### Methods - -##### encoding() - -Returns the most preferred encoding from the client. - -##### encoding(availableEncodings) - -Returns the most preferred encoding from a list of available encodings. - -##### encodings() - -Returns an array of preferred encodings ordered by the client preference. - -##### encodings(availableEncodings) - -Returns an array of preferred encodings ordered by priority from a list of -available encodings. - -## See Also - -The [accepts](https://npmjs.org/package/accepts#readme) module builds on -this module and provides an alternative interface, mime type validation, -and more. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/negotiator.svg -[npm-url]: https://npmjs.org/package/negotiator -[node-version-image]: https://img.shields.io/node/v/negotiator.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/negotiator/master.svg -[travis-url]: https://travis-ci.org/jshttp/negotiator -[coveralls-image]: https://img.shields.io/coveralls/jshttp/negotiator/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/negotiator?branch=master -[downloads-image]: https://img.shields.io/npm/dm/negotiator.svg -[downloads-url]: https://npmjs.org/package/negotiator diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/index.js deleted file mode 100644 index edae9cf..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/index.js +++ /dev/null @@ -1,62 +0,0 @@ - -var preferredCharsets = require('./lib/charset'); -var preferredEncodings = require('./lib/encoding'); -var preferredLanguages = require('./lib/language'); -var preferredMediaTypes = require('./lib/mediaType'); - -module.exports = Negotiator; -Negotiator.Negotiator = Negotiator; - -function Negotiator(request) { - if (!(this instanceof Negotiator)) { - return new Negotiator(request); - } - - this.request = request; -} - -Negotiator.prototype.charset = function charset(available) { - var set = this.charsets(available); - return set && set[0]; -}; - -Negotiator.prototype.charsets = function charsets(available) { - return preferredCharsets(this.request.headers['accept-charset'], available); -}; - -Negotiator.prototype.encoding = function encoding(available) { - var set = this.encodings(available); - return set && set[0]; -}; - -Negotiator.prototype.encodings = function encodings(available) { - return preferredEncodings(this.request.headers['accept-encoding'], available); -}; - -Negotiator.prototype.language = function language(available) { - var set = this.languages(available); - return set && set[0]; -}; - -Negotiator.prototype.languages = function languages(available) { - return preferredLanguages(this.request.headers['accept-language'], available); -}; - -Negotiator.prototype.mediaType = function mediaType(available) { - var set = this.mediaTypes(available); - return set && set[0]; -}; - -Negotiator.prototype.mediaTypes = function mediaTypes(available) { - return preferredMediaTypes(this.request.headers.accept, available); -}; - -// Backwards compatibility -Negotiator.prototype.preferredCharset = Negotiator.prototype.charset; -Negotiator.prototype.preferredCharsets = Negotiator.prototype.charsets; -Negotiator.prototype.preferredEncoding = Negotiator.prototype.encoding; -Negotiator.prototype.preferredEncodings = Negotiator.prototype.encodings; -Negotiator.prototype.preferredLanguage = Negotiator.prototype.language; -Negotiator.prototype.preferredLanguages = Negotiator.prototype.languages; -Negotiator.prototype.preferredMediaType = Negotiator.prototype.mediaType; -Negotiator.prototype.preferredMediaTypes = Negotiator.prototype.mediaTypes; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js deleted file mode 100644 index 7abd17c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js +++ /dev/null @@ -1,102 +0,0 @@ -module.exports = preferredCharsets; -preferredCharsets.preferredCharsets = preferredCharsets; - -function parseAcceptCharset(accept) { - var accepts = accept.split(','); - - for (var i = 0, j = 0; i < accepts.length; i++) { - var charset = parseCharset(accepts[i].trim(), i); - - if (charset) { - accepts[j++] = charset; - } - } - - // trim accepts - accepts.length = j; - - return accepts; -} - -function parseCharset(s, i) { - var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); - if (!match) return null; - - var charset = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - charset: charset, - q: q, - i: i - }; -} - -function getCharsetPriority(charset, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(charset, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -function specify(charset, spec, index) { - var s = 0; - if(spec.charset.toLowerCase() === charset.toLowerCase()){ - s |= 1; - } else if (spec.charset !== '*' ) { - return null - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s - } -} - -function preferredCharsets(accept, provided) { - // RFC 2616 sec 14.2: no header = * - var accepts = parseAcceptCharset(accept === undefined ? '*' : accept || ''); - - if (!provided) { - // sorted list of all charsets - return accepts.filter(isQuality).sort(compareSpecs).map(function getCharset(spec) { - return spec.charset; - }); - } - - var priorities = provided.map(function getPriority(type, index) { - return getCharsetPriority(type, accepts, index); - }); - - // sorted list of accepted charsets - return priorities.filter(isQuality).sort(compareSpecs).map(function getCharset(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -function isQuality(spec) { - return spec.q > 0; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js deleted file mode 100644 index 7fed673..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js +++ /dev/null @@ -1,118 +0,0 @@ -module.exports = preferredEncodings; -preferredEncodings.preferredEncodings = preferredEncodings; - -function parseAcceptEncoding(accept) { - var accepts = accept.split(','); - var hasIdentity = false; - var minQuality = 1; - - for (var i = 0, j = 0; i < accepts.length; i++) { - var encoding = parseEncoding(accepts[i].trim(), i); - - if (encoding) { - accepts[j++] = encoding; - hasIdentity = hasIdentity || specify('identity', encoding); - minQuality = Math.min(minQuality, encoding.q || 1); - } - } - - if (!hasIdentity) { - /* - * If identity doesn't explicitly appear in the accept-encoding header, - * it's added to the list of acceptable encoding with the lowest q - */ - accepts[j++] = { - encoding: 'identity', - q: minQuality, - i: i - }; - } - - // trim accepts - accepts.length = j; - - return accepts; -} - -function parseEncoding(s, i) { - var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); - - if (!match) return null; - - var encoding = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';'); - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - encoding: encoding, - q: q, - i: i - }; -} - -function getEncodingPriority(encoding, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(encoding, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -function specify(encoding, spec, index) { - var s = 0; - if(spec.encoding.toLowerCase() === encoding.toLowerCase()){ - s |= 1; - } else if (spec.encoding !== '*' ) { - return null - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s - } -}; - -function preferredEncodings(accept, provided) { - var accepts = parseAcceptEncoding(accept || ''); - - if (!provided) { - // sorted list of all encodings - return accepts.filter(isQuality).sort(compareSpecs).map(function getEncoding(spec) { - return spec.encoding; - }); - } - - var priorities = provided.map(function getPriority(type, index) { - return getEncodingPriority(type, accepts, index); - }); - - // sorted list of accepted encodings - return priorities.filter(isQuality).sort(compareSpecs).map(function getEncoding(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -function isQuality(spec) { - return spec.q > 0; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js deleted file mode 100644 index ed9e1ec..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js +++ /dev/null @@ -1,112 +0,0 @@ -module.exports = preferredLanguages; -preferredLanguages.preferredLanguages = preferredLanguages; - -function parseAcceptLanguage(accept) { - var accepts = accept.split(','); - - for (var i = 0, j = 0; i < accepts.length; i++) { - var langauge = parseLanguage(accepts[i].trim(), i); - - if (langauge) { - accepts[j++] = langauge; - } - } - - // trim accepts - accepts.length = j; - - return accepts; -} - -function parseLanguage(s, i) { - var match = s.match(/^\s*(\S+?)(?:-(\S+?))?\s*(?:;(.*))?$/); - if (!match) return null; - - var prefix = match[1], - suffix = match[2], - full = prefix; - - if (suffix) full += "-" + suffix; - - var q = 1; - if (match[3]) { - var params = match[3].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].split('='); - if (p[0] === 'q') q = parseFloat(p[1]); - } - } - - return { - prefix: prefix, - suffix: suffix, - q: q, - i: i, - full: full - }; -} - -function getLanguagePriority(language, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(language, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -function specify(language, spec, index) { - var p = parseLanguage(language) - if (!p) return null; - var s = 0; - if(spec.full.toLowerCase() === p.full.toLowerCase()){ - s |= 4; - } else if (spec.prefix.toLowerCase() === p.full.toLowerCase()) { - s |= 2; - } else if (spec.full.toLowerCase() === p.prefix.toLowerCase()) { - s |= 1; - } else if (spec.full !== '*' ) { - return null - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s - } -}; - -function preferredLanguages(accept, provided) { - // RFC 2616 sec 14.4: no header = * - var accepts = parseAcceptLanguage(accept === undefined ? '*' : accept || ''); - - if (!provided) { - // sorted list of all languages - return accepts.filter(isQuality).sort(compareSpecs).map(function getLanguage(spec) { - return spec.full; - }); - } - - var priorities = provided.map(function getPriority(type, index) { - return getLanguagePriority(type, accepts, index); - }); - - // sorted list of accepted languages - return priorities.filter(isQuality).sort(compareSpecs).map(function getLanguage(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -function isQuality(spec) { - return spec.q > 0; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js deleted file mode 100644 index 4170c25..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js +++ /dev/null @@ -1,179 +0,0 @@ -/** - * negotiator - * Copyright(c) 2012 Isaac Z. Schlueter - * Copyright(c) 2014 Federico Romero - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -module.exports = preferredMediaTypes; -preferredMediaTypes.preferredMediaTypes = preferredMediaTypes; - -function parseAccept(accept) { - var accepts = splitMediaTypes(accept); - - for (var i = 0, j = 0; i < accepts.length; i++) { - var mediaType = parseMediaType(accepts[i].trim(), i); - - if (mediaType) { - accepts[j++] = mediaType; - } - } - - // trim accepts - accepts.length = j; - - return accepts; -}; - -function parseMediaType(s, i) { - var match = s.match(/\s*(\S+?)\/([^;\s]+)\s*(?:;(.*))?/); - if (!match) return null; - - var type = match[1], - subtype = match[2], - full = "" + type + "/" + subtype, - params = {}, - q = 1; - - if (match[3]) { - params = match[3].split(';').map(function(s) { - return s.trim().split('='); - }).reduce(function (set, p) { - var name = p[0].toLowerCase(); - var value = p[1]; - - set[name] = value && value[0] === '"' && value[value.length - 1] === '"' - ? value.substr(1, value.length - 2) - : value; - - return set; - }, params); - - if (params.q != null) { - q = parseFloat(params.q); - delete params.q; - } - } - - return { - type: type, - subtype: subtype, - params: params, - q: q, - i: i, - full: full - }; -} - -function getMediaTypePriority(type, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(type, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -function specify(type, spec, index) { - var p = parseMediaType(type); - var s = 0; - - if (!p) { - return null; - } - - if(spec.type.toLowerCase() == p.type.toLowerCase()) { - s |= 4 - } else if(spec.type != '*') { - return null; - } - - if(spec.subtype.toLowerCase() == p.subtype.toLowerCase()) { - s |= 2 - } else if(spec.subtype != '*') { - return null; - } - - var keys = Object.keys(spec.params); - if (keys.length > 0) { - if (keys.every(function (k) { - return spec.params[k] == '*' || (spec.params[k] || '').toLowerCase() == (p.params[k] || '').toLowerCase(); - })) { - s |= 1 - } else { - return null - } - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s, - } - -} - -function preferredMediaTypes(accept, provided) { - // RFC 2616 sec 14.2: no header = */* - var accepts = parseAccept(accept === undefined ? '*/*' : accept || ''); - - if (!provided) { - // sorted list of all types - return accepts.filter(isQuality).sort(compareSpecs).map(function getType(spec) { - return spec.full; - }); - } - - var priorities = provided.map(function getPriority(type, index) { - return getMediaTypePriority(type, accepts, index); - }); - - // sorted list of accepted types - return priorities.filter(isQuality).sort(compareSpecs).map(function getType(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -function isQuality(spec) { - return spec.q > 0; -} - -function quoteCount(string) { - var count = 0; - var index = 0; - - while ((index = string.indexOf('"', index)) !== -1) { - count++; - index++; - } - - return count; -} - -function splitMediaTypes(accept) { - var accepts = accept.split(','); - - for (var i = 1, j = 0; i < accepts.length; i++) { - if (quoteCount(accepts[j]) % 2 == 0) { - accepts[++j] = accepts[i]; - } else { - accepts[j] += ',' + accepts[i]; - } - } - - // trim accepts - accepts.length = j + 1; - - return accepts; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json deleted file mode 100644 index e6d64f4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "name": "negotiator", - "description": "HTTP content negotiation", - "version": "0.5.3", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Federico Romero", - "email": "federico.romero@outboxlabs.com" - }, - { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - } - ], - "license": "MIT", - "keywords": [ - "http", - "content negotiation", - "accept", - "accept-language", - "accept-encoding", - "accept-charset" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/negotiator" - }, - "devDependencies": { - "istanbul": "0.3.9", - "mocha": "~1.21.5" - }, - "files": [ - "lib/", - "HISTORY.md", - "LICENSE", - "index.js", - "README.md" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "cbb717b3f164f25820f90b160cda6d0166b9d922", - "bugs": { - "url": "https://github.com/jshttp/negotiator/issues" - }, - "homepage": "https://github.com/jshttp/negotiator", - "_id": "negotiator@0.5.3", - "_shasum": "269d5c476810ec92edbe7b6c2f28316384f9a7e8", - "_from": "negotiator@0.5.3", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "federomero", - "email": "federomero@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "269d5c476810ec92edbe7b6c2f28316384f9a7e8", - "tarball": "http://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/package.json deleted file mode 100644 index 8d29ad9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/accepts/package.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "name": "accepts", - "description": "Higher-level content negotiation", - "version": "1.2.12", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jshttp/accepts" - }, - "dependencies": { - "mime-types": "~2.1.4", - "negotiator": "0.5.3" - }, - "devDependencies": { - "istanbul": "0.3.17", - "mocha": "~1.21.5" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "keywords": [ - "content", - "negotiation", - "accept", - "accepts" - ], - "gitHead": "f01900aa33b1089575bd29caea851a8a241df07c", - "bugs": { - "url": "https://github.com/jshttp/accepts/issues" - }, - "homepage": "https://github.com/jshttp/accepts", - "_id": "accepts@1.2.12", - "_shasum": "7e6d880f473b5c48d46e3e35f71ea7c3b68514c3", - "_from": "accepts@>=1.2.12 <1.3.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "federomero", - "email": "federomero@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "7e6d880f473b5c48d46e3e35f71ea7c3b68514c3", - "tarball": "http://registry.npmjs.org/accepts/-/accepts-1.2.12.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.12.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/LICENSE deleted file mode 100644 index 983fbe8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/README.md deleted file mode 100644 index 91fa5b6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Array Flatten - -[![NPM version][npm-image]][npm-url] -[![NPM downloads][downloads-image]][downloads-url] -[![Build status][travis-image]][travis-url] -[![Test coverage][coveralls-image]][coveralls-url] - -> Flatten an array of nested arrays into a single flat array. Accepts an optional depth. - -## Installation - -``` -npm install array-flatten --save -``` - -## Usage - -```javascript -var flatten = require('array-flatten') - -flatten([1, [2, [3, [4, [5], 6], 7], 8], 9]) -//=> [1, 2, 3, 4, 5, 6, 7, 8, 9] - -flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2) -//=> [1, 2, 3, [4, [5], 6], 7, 8, 9] - -(function () { - flatten(arguments) //=> [1, 2, 3] -})(1, [2, 3]) -``` - -## License - -MIT - -[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat -[npm-url]: https://npmjs.org/package/array-flatten -[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat -[downloads-url]: https://npmjs.org/package/array-flatten -[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat -[travis-url]: https://travis-ci.org/blakeembrey/array-flatten -[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat -[coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/array-flatten.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/array-flatten.js deleted file mode 100644 index 089117b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/array-flatten.js +++ /dev/null @@ -1,64 +0,0 @@ -'use strict' - -/** - * Expose `arrayFlatten`. - */ -module.exports = arrayFlatten - -/** - * Recursive flatten function with depth. - * - * @param {Array} array - * @param {Array} result - * @param {Number} depth - * @return {Array} - */ -function flattenWithDepth (array, result, depth) { - for (var i = 0; i < array.length; i++) { - var value = array[i] - - if (depth > 0 && Array.isArray(value)) { - flattenWithDepth(value, result, depth - 1) - } else { - result.push(value) - } - } - - return result -} - -/** - * Recursive flatten function. Omitting depth is slightly faster. - * - * @param {Array} array - * @param {Array} result - * @return {Array} - */ -function flattenForever (array, result) { - for (var i = 0; i < array.length; i++) { - var value = array[i] - - if (Array.isArray(value)) { - flattenForever(value, result) - } else { - result.push(value) - } - } - - return result -} - -/** - * Flatten an array, with the ability to define a depth. - * - * @param {Array} array - * @param {Number} depth - * @return {Array} - */ -function arrayFlatten (array, depth) { - if (depth == null) { - return flattenForever(array, []) - } - - return flattenWithDepth(array, [], depth) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/package.json deleted file mode 100644 index f80f937..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/array-flatten/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "array-flatten", - "version": "1.1.1", - "description": "Flatten an array of nested arrays into a single flat array", - "main": "array-flatten.js", - "files": [ - "array-flatten.js", - "LICENSE" - ], - "scripts": { - "test": "istanbul cover _mocha -- -R spec" - }, - "repository": { - "type": "git", - "url": "git://github.com/blakeembrey/array-flatten.git" - }, - "keywords": [ - "array", - "flatten", - "arguments", - "depth" - ], - "author": { - "name": "Blake Embrey", - "email": "hello@blakeembrey.com", - "url": "http://blakeembrey.me" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/blakeembrey/array-flatten/issues" - }, - "homepage": "https://github.com/blakeembrey/array-flatten", - "devDependencies": { - "istanbul": "^0.3.13", - "mocha": "^2.2.4", - "pre-commit": "^1.0.7", - "standard": "^3.7.3" - }, - "gitHead": "1963a9189229d408e1e8f585a00c8be9edbd1803", - "_id": "array-flatten@1.1.1", - "_shasum": "9a5f699051b1e7073328f2a008968b64ea2955d2", - "_from": "array-flatten@1.1.1", - "_npmVersion": "2.11.3", - "_nodeVersion": "2.3.3", - "_npmUser": { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - "maintainers": [ - { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - } - ], - "dist": { - "shasum": "9a5f699051b1e7073328f2a008968b64ea2955d2", - "tarball": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/HISTORY.md deleted file mode 100644 index 1192551..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/HISTORY.md +++ /dev/null @@ -1,40 +0,0 @@ -0.5.0 / 2014-10-11 -================== - - * Add `parse` function - -0.4.0 / 2014-09-21 -================== - - * Expand non-Unicode `filename` to the full ISO-8859-1 charset - -0.3.0 / 2014-09-20 -================== - - * Add `fallback` option - * Add `type` option - -0.2.0 / 2014-09-19 -================== - - * Reduce ambiguity of file names with hex escape in buggy browsers - -0.1.2 / 2014-09-19 -================== - - * Fix periodic invalid Unicode filename header - -0.1.1 / 2014-09-19 -================== - - * Fix invalid characters appearing in `filename*` parameter - -0.1.0 / 2014-09-18 -================== - - * Make the `filename` argument optional - -0.0.0 / 2014-09-18 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/README.md deleted file mode 100644 index d265431..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/README.md +++ /dev/null @@ -1,141 +0,0 @@ -# content-disposition - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Create and parse HTTP `Content-Disposition` header - -## Installation - -```sh -$ npm install content-disposition -``` - -## API - -```js -var contentDisposition = require('content-disposition') -``` - -### contentDisposition(filename, options) - -Create an attachment `Content-Disposition` header value using the given file name, -if supplied. The `filename` is optional and if no file name is desired, but you -want to specify `options`, set `filename` to `undefined`. - -```js -res.setHeader('Content-Disposition', contentDisposition('∫ maths.pdf')) -``` - -**note** HTTP headers are of the ISO-8859-1 character set. If you are writing this -header through a means different from `setHeader` in Node.js, you'll want to specify -the `'binary'` encoding in Node.js. - -#### Options - -`contentDisposition` accepts these properties in the options object. - -##### fallback - -If the `filename` option is outside ISO-8859-1, then the file name is actually -stored in a supplemental field for clients that support Unicode file names and -a ISO-8859-1 version of the file name is automatically generated. - -This specifies the ISO-8859-1 file name to override the automatic generation or -disables the generation all together, defaults to `true`. - - - A string will specify the ISO-8859-1 file name to use in place of automatic - generation. - - `false` will disable including a ISO-8859-1 file name and only include the - Unicode version (unless the file name is already ISO-8859-1). - - `true` will enable automatic generation if the file name is outside ISO-8859-1. - -If the `filename` option is ISO-8859-1 and this option is specified and has a -different value, then the `filename` option is encoded in the extended field -and this set as the fallback field, even though they are both ISO-8859-1. - -##### type - -Specifies the disposition type, defaults to `"attachment"`. This can also be -`"inline"`, or any other value (all values except inline are treated like -`attachment`, but can convey additional information if both parties agree to -it). The type is normalized to lower-case. - -### contentDisposition.parse(string) - -```js -var disposition = contentDisposition.parse('attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt"'); -``` - -Parse a `Content-Disposition` header string. This automatically handles extended -("Unicode") parameters by decoding them and providing them under the standard -parameter name. This will return an object with the following properties (examples -are shown for the string `'attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt'`): - - - `type`: The disposition type (always lower case). Example: `'attachment'` - - - `parameters`: An object of the parameters in the disposition (name of parameter - always lower case and extended versions replace non-extended versions). Example: - `{filename: "€ rates.txt"}` - -## Examples - -### Send a file for download - -```js -var contentDisposition = require('content-disposition') -var destroy = require('destroy') -var http = require('http') -var onFinished = require('on-finished') - -var filePath = '/path/to/public/plans.pdf' - -http.createServer(function onRequest(req, res) { - // set headers - res.setHeader('Content-Type', 'application/pdf') - res.setHeader('Content-Disposition', contentDisposition(filePath)) - - // send file - var stream = fs.createReadStream(filePath) - stream.pipe(res) - onFinished(res, function (err) { - destroy(stream) - }) -}) -``` - -## Testing - -```sh -$ npm test -``` - -## References - -- [RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1][rfc-2616] -- [RFC 5987: Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field Parameters][rfc-5987] -- [RFC 6266: Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)][rfc-6266] -- [Test Cases for HTTP Content-Disposition header field (RFC 6266) and the Encodings defined in RFCs 2047, 2231 and 5987][tc-2231] - -[rfc-2616]: https://tools.ietf.org/html/rfc2616 -[rfc-5987]: https://tools.ietf.org/html/rfc5987 -[rfc-6266]: https://tools.ietf.org/html/rfc6266 -[tc-2231]: http://greenbytes.de/tech/tc2231/ - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/content-disposition.svg?style=flat -[npm-url]: https://npmjs.org/package/content-disposition -[node-version-image]: https://img.shields.io/node/v/content-disposition.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/content-disposition.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/content-disposition -[coveralls-image]: https://img.shields.io/coveralls/jshttp/content-disposition.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/content-disposition?branch=master -[downloads-image]: https://img.shields.io/npm/dm/content-disposition.svg?style=flat -[downloads-url]: https://npmjs.org/package/content-disposition diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/index.js deleted file mode 100644 index fa3bc74..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/index.js +++ /dev/null @@ -1,443 +0,0 @@ -/*! - * content-disposition - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = contentDisposition -module.exports.parse = parse - -/** - * Module dependencies. - */ - -var basename = require('path').basename - -/** - * RegExp to match non attr-char, *after* encodeURIComponent (i.e. not including "%") - */ - -var encodeUriAttrCharRegExp = /[\x00-\x20"'\(\)*,\/:;<=>?@\[\\\]\{\}\x7f]/g - -/** - * RegExp to match percent encoding escape. - */ - -var hexEscapeRegExp = /%[0-9A-Fa-f]{2}/ -var hexEscapeReplaceRegExp = /%([0-9A-Fa-f]{2})/g - -/** - * RegExp to match non-latin1 characters. - */ - -var nonLatin1RegExp = /[^\x20-\x7e\xa0-\xff]/g - -/** - * RegExp to match quoted-pair in RFC 2616 - * - * quoted-pair = "\" CHAR - * CHAR = - */ - -var qescRegExp = /\\([\u0000-\u007f])/g; - -/** - * RegExp to match chars that must be quoted-pair in RFC 2616 - */ - -var quoteRegExp = /([\\"])/g - -/** - * RegExp for various RFC 2616 grammar - * - * parameter = token "=" ( token | quoted-string ) - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) - * qdtext = > - * quoted-pair = "\" CHAR - * CHAR = - * TEXT = - * LWS = [CRLF] 1*( SP | HT ) - * CRLF = CR LF - * CR = - * LF = - * SP = - * HT = - * CTL = - * OCTET = - */ - -var paramRegExp = /; *([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *= *("(?:[ !\x23-\x5b\x5d-\x7e\x80-\xff]|\\[\x20-\x7e])*"|[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) */g -var textRegExp = /^[\x20-\x7e\x80-\xff]+$/ -var tokenRegExp = /^[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+$/ - -/** - * RegExp for various RFC 5987 grammar - * - * ext-value = charset "'" [ language ] "'" value-chars - * charset = "UTF-8" / "ISO-8859-1" / mime-charset - * mime-charset = 1*mime-charsetc - * mime-charsetc = ALPHA / DIGIT - * / "!" / "#" / "$" / "%" / "&" - * / "+" / "-" / "^" / "_" / "`" - * / "{" / "}" / "~" - * language = ( 2*3ALPHA [ extlang ] ) - * / 4ALPHA - * / 5*8ALPHA - * extlang = *3( "-" 3ALPHA ) - * value-chars = *( pct-encoded / attr-char ) - * pct-encoded = "%" HEXDIG HEXDIG - * attr-char = ALPHA / DIGIT - * / "!" / "#" / "$" / "&" / "+" / "-" / "." - * / "^" / "_" / "`" / "|" / "~" - */ - -var extValueRegExp = /^([A-Za-z0-9!#$%&+\-^_`{}~]+)'(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}|[A-Za-z]{4,8}|)'((?:%[0-9A-Fa-f]{2}|[A-Za-z0-9!#$&+\-\.^_`|~])+)$/ - -/** - * RegExp for various RFC 6266 grammar - * - * disposition-type = "inline" | "attachment" | disp-ext-type - * disp-ext-type = token - * disposition-parm = filename-parm | disp-ext-parm - * filename-parm = "filename" "=" value - * | "filename*" "=" ext-value - * disp-ext-parm = token "=" value - * | ext-token "=" ext-value - * ext-token = - */ - -var dispositionTypeRegExp = /^([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *(?:$|;)/ - -/** - * Create an attachment Content-Disposition header. - * - * @param {string} [filename] - * @param {object} [options] - * @param {string} [options.type=attachment] - * @param {string|boolean} [options.fallback=true] - * @return {string} - * @api public - */ - -function contentDisposition(filename, options) { - var opts = options || {} - - // get type - var type = opts.type || 'attachment' - - // get parameters - var params = createparams(filename, opts.fallback) - - // format into string - return format(new ContentDisposition(type, params)) -} - -/** - * Create parameters object from filename and fallback. - * - * @param {string} [filename] - * @param {string|boolean} [fallback=true] - * @return {object} - * @api private - */ - -function createparams(filename, fallback) { - if (filename === undefined) { - return - } - - var params = {} - - if (typeof filename !== 'string') { - throw new TypeError('filename must be a string') - } - - // fallback defaults to true - if (fallback === undefined) { - fallback = true - } - - if (typeof fallback !== 'string' && typeof fallback !== 'boolean') { - throw new TypeError('fallback must be a string or boolean') - } - - if (typeof fallback === 'string' && nonLatin1RegExp.test(fallback)) { - throw new TypeError('fallback must be ISO-8859-1 string') - } - - // restrict to file base name - var name = basename(filename) - - // determine if name is suitable for quoted string - var isQuotedString = textRegExp.test(name) - - // generate fallback name - var fallbackName = typeof fallback !== 'string' - ? fallback && getlatin1(name) - : basename(fallback) - var hasFallback = typeof fallbackName === 'string' && fallbackName !== name - - // set extended filename parameter - if (hasFallback || !isQuotedString || hexEscapeRegExp.test(name)) { - params['filename*'] = name - } - - // set filename parameter - if (isQuotedString || hasFallback) { - params.filename = hasFallback - ? fallbackName - : name - } - - return params -} - -/** - * Format object to Content-Disposition header. - * - * @param {object} obj - * @param {string} obj.type - * @param {object} [obj.parameters] - * @return {string} - * @api private - */ - -function format(obj) { - var parameters = obj.parameters - var type = obj.type - - if (!type || typeof type !== 'string' || !tokenRegExp.test(type)) { - throw new TypeError('invalid type') - } - - // start with normalized type - var string = String(type).toLowerCase() - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - var val = param.substr(-1) === '*' - ? ustring(parameters[param]) - : qstring(parameters[param]) - - string += '; ' + param + '=' + val - } - } - - return string -} - -/** - * Decode a RFC 6987 field value (gracefully). - * - * @param {string} str - * @return {string} - * @api private - */ - -function decodefield(str) { - var match = extValueRegExp.exec(str) - - if (!match) { - throw new TypeError('invalid extended field value') - } - - var charset = match[1].toLowerCase() - var encoded = match[2] - var value - - // to binary string - var binary = encoded.replace(hexEscapeReplaceRegExp, pdecode) - - switch (charset) { - case 'iso-8859-1': - value = getlatin1(binary) - break - case 'utf-8': - value = new Buffer(binary, 'binary').toString('utf8') - break - default: - throw new TypeError('unsupported charset in extended field') - } - - return value -} - -/** - * Get ISO-8859-1 version of string. - * - * @param {string} val - * @return {string} - * @api private - */ - -function getlatin1(val) { - // simple Unicode -> ISO-8859-1 transformation - return String(val).replace(nonLatin1RegExp, '?') -} - -/** - * Parse Content-Disposition header string. - * - * @param {string} string - * @return {object} - * @api private - */ - -function parse(string) { - if (!string || typeof string !== 'string') { - throw new TypeError('argument string is required') - } - - var match = dispositionTypeRegExp.exec(string) - - if (!match) { - throw new TypeError('invalid type format') - } - - // normalize type - var index = match[0].length - var type = match[1].toLowerCase() - - var key - var names = [] - var params = {} - var value - - // calculate index to start at - index = paramRegExp.lastIndex = match[0].substr(-1) === ';' - ? index - 1 - : index - - // match parameters - while (match = paramRegExp.exec(string)) { - if (match.index !== index) { - throw new TypeError('invalid parameter format') - } - - index += match[0].length - key = match[1].toLowerCase() - value = match[2] - - if (names.indexOf(key) !== -1) { - throw new TypeError('invalid duplicate parameter') - } - - names.push(key) - - if (key.indexOf('*') + 1 === key.length) { - // decode extended value - key = key.slice(0, -1) - value = decodefield(value) - - // overwrite existing value - params[key] = value - continue - } - - if (typeof params[key] === 'string') { - continue - } - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(qescRegExp, '$1') - } - - params[key] = value - } - - if (index !== -1 && index !== string.length) { - throw new TypeError('invalid parameter format') - } - - return new ContentDisposition(type, params) -} - -/** - * Percent decode a single character. - * - * @param {string} str - * @param {string} hex - * @return {string} - * @api private - */ - -function pdecode(str, hex) { - return String.fromCharCode(parseInt(hex, 16)) -} - -/** - * Percent encode a single character. - * - * @param {string} char - * @return {string} - * @api private - */ - -function pencode(char) { - var hex = String(char) - .charCodeAt(0) - .toString(16) - .toUpperCase() - return hex.length === 1 - ? '%0' + hex - : '%' + hex -} - -/** - * Quote a string for HTTP. - * - * @param {string} val - * @return {string} - * @api private - */ - -function qstring(val) { - var str = String(val) - - return '"' + str.replace(quoteRegExp, '\\$1') + '"' -} - -/** - * Encode a Unicode string for HTTP (RFC 5987). - * - * @param {string} val - * @return {string} - * @api private - */ - -function ustring(val) { - var str = String(val) - - // percent encode as UTF-8 - var encoded = encodeURIComponent(str) - .replace(encodeUriAttrCharRegExp, pencode) - - return 'UTF-8\'\'' + encoded -} - -/** - * Class for parsed Content-Disposition header for v8 optimization - */ - -function ContentDisposition(type, parameters) { - this.type = type - this.parameters = parameters -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/package.json deleted file mode 100644 index b0bb7ec..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-disposition/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "content-disposition", - "description": "Create and parse Content-Disposition header", - "version": "0.5.0", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "keywords": [ - "content-disposition", - "http", - "rfc6266", - "res" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/content-disposition" - }, - "devDependencies": { - "istanbul": "0.3.2", - "mocha": "~1.21.4" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "f3c915f0c9d9f5ec79713dba24c8c6181b73305d", - "bugs": { - "url": "https://github.com/jshttp/content-disposition/issues" - }, - "homepage": "https://github.com/jshttp/content-disposition", - "_id": "content-disposition@0.5.0", - "_shasum": "4284fe6ae0630874639e44e80a418c2934135e9e", - "_from": "content-disposition@0.5.0", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "4284fe6ae0630874639e44e80a418c2934135e9e", - "tarball": "http://registry.npmjs.org/content-disposition/-/content-disposition-0.5.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/HISTORY.md deleted file mode 100644 index 8a623a2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/HISTORY.md +++ /dev/null @@ -1,9 +0,0 @@ -1.0.1 / 2015-02-13 -================== - - * Improve missing `Content-Type` header error message - -1.0.0 / 2015-02-01 -================== - - * Initial implementation, derived from `media-typer@0.3.0` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/LICENSE deleted file mode 100644 index 34b1a2d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/README.md deleted file mode 100644 index 3ed6741..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# content-type - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Create and parse HTTP Content-Type header according to RFC 7231 - -## Installation - -```sh -$ npm install content-type -``` - -## API - -```js -var contentType = require('content-type') -``` - -### contentType.parse(string) - -```js -var obj = contentType.parse('image/svg+xml; charset=utf-8') -``` - -Parse a content type string. This will return an object with the following -properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`): - - - `type`: The media type (the type and subtype, always lower case). - Example: `'image/svg+xml'` - - - `parameters`: An object of the parameters in the media type (name of parameter - always lower case). Example: `{charset: 'utf-8'}` - -Throws a `TypeError` if the string is missing or invalid. - -### contentType.parse(req) - -```js -var obj = contentType.parse(req) -``` - -Parse the `content-type` header from the given `req`. Short-cut for -`contentType.parse(req.headers['content-type'])`. - -Throws a `TypeError` if the `Content-Type` header is missing or invalid. - -### contentType.parse(res) - -```js -var obj = contentType.parse(res) -``` - -Parse the `content-type` header set on the given `res`. Short-cut for -`contentType.parse(res.getHeader('content-type'))`. - -Throws a `TypeError` if the `Content-Type` header is missing or invalid. - -### contentType.format(obj) - -```js -var str = contentType.format({type: 'image/svg+xml'}) -``` - -Format an object into a content type string. This will return a string of the -content type for the given object with the following properties (examples are -shown that produce the string `'image/svg+xml; charset=utf-8'`): - - - `type`: The media type (will be lower-cased). Example: `'image/svg+xml'` - - - `parameters`: An object of the parameters in the media type (name of the - parameter will be lower-cased). Example: `{charset: 'utf-8'}` - -Throws a `TypeError` if the object contains an invalid type or parameter names. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/content-type.svg -[npm-url]: https://npmjs.org/package/content-type -[node-version-image]: https://img.shields.io/node/v/content-type.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/content-type/master.svg -[travis-url]: https://travis-ci.org/jshttp/content-type -[coveralls-image]: https://img.shields.io/coveralls/jshttp/content-type/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/content-type -[downloads-image]: https://img.shields.io/npm/dm/content-type.svg -[downloads-url]: https://npmjs.org/package/content-type diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/index.js deleted file mode 100644 index 6a2ea9f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/index.js +++ /dev/null @@ -1,214 +0,0 @@ -/*! - * content-type - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1 - * - * parameter = token "=" ( token / quoted-string ) - * token = 1*tchar - * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" - * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" - * / DIGIT / ALPHA - * ; any VCHAR, except delimiters - * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE - * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text - * obs-text = %x80-FF - * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - */ -var paramRegExp = /; *([!#$%&'\*\+\-\.\^_`\|~0-9A-Za-z]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'\*\+\-\.\^_`\|~0-9A-Za-z]+) */g -var textRegExp = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/ -var tokenRegExp = /^[!#$%&'\*\+\-\.\^_`\|~0-9A-Za-z]+$/ - -/** - * RegExp to match quoted-pair in RFC 7230 sec 3.2.6 - * - * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - * obs-text = %x80-FF - */ -var qescRegExp = /\\([\u000b\u0020-\u00ff])/g - -/** - * RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6 - */ -var quoteRegExp = /([\\"])/g - -/** - * RegExp to match type in RFC 6838 - * - * media-type = type "/" subtype - * type = token - * subtype = token - */ -var typeRegExp = /^[!#$%&'\*\+\-\.\^_`\|~0-9A-Za-z]+\/[!#$%&'\*\+\-\.\^_`\|~0-9A-Za-z]+$/ - -/** - * Module exports. - * @public - */ - -exports.format = format -exports.parse = parse - -/** - * Format object to media type. - * - * @param {object} obj - * @return {string} - * @public - */ - -function format(obj) { - if (!obj || typeof obj !== 'object') { - throw new TypeError('argument obj is required') - } - - var parameters = obj.parameters - var type = obj.type - - if (!type || !typeRegExp.test(type)) { - throw new TypeError('invalid type') - } - - var string = type - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - if (!tokenRegExp.test(param)) { - throw new TypeError('invalid parameter name') - } - - string += '; ' + param + '=' + qstring(parameters[param]) - } - } - - return string -} - -/** - * Parse media type to object. - * - * @param {string|object} string - * @return {Object} - * @public - */ - -function parse(string) { - if (!string) { - throw new TypeError('argument string is required') - } - - if (typeof string === 'object') { - // support req/res-like objects as argument - string = getcontenttype(string) - - if (typeof string !== 'string') { - throw new TypeError('content-type header is missing from object'); - } - } - - if (typeof string !== 'string') { - throw new TypeError('argument string is required to be a string') - } - - var index = string.indexOf(';') - var type = index !== -1 - ? string.substr(0, index).trim() - : string.trim() - - if (!typeRegExp.test(type)) { - throw new TypeError('invalid media type') - } - - var key - var match - var obj = new ContentType(type.toLowerCase()) - var value - - paramRegExp.lastIndex = index - - while (match = paramRegExp.exec(string)) { - if (match.index !== index) { - throw new TypeError('invalid parameter format') - } - - index += match[0].length - key = match[1].toLowerCase() - value = match[2] - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(qescRegExp, '$1') - } - - obj.parameters[key] = value - } - - if (index !== -1 && index !== string.length) { - throw new TypeError('invalid parameter format') - } - - return obj -} - -/** - * Get content-type from req/res objects. - * - * @param {object} - * @return {Object} - * @private - */ - -function getcontenttype(obj) { - if (typeof obj.getHeader === 'function') { - // res-like - return obj.getHeader('content-type') - } - - if (typeof obj.headers === 'object') { - // req-like - return obj.headers && obj.headers['content-type'] - } -} - -/** - * Quote a string if necessary. - * - * @param {string} val - * @return {string} - * @private - */ - -function qstring(val) { - var str = String(val) - - // no need to quote tokens - if (tokenRegExp.test(str)) { - return str - } - - if (str.length > 0 && !textRegExp.test(str)) { - throw new TypeError('invalid parameter value') - } - - return '"' + str.replace(quoteRegExp, '\\$1') + '"' -} - -/** - * Class to represent a content type. - * @private - */ -function ContentType(type) { - this.parameters = Object.create(null) - this.type = type -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/package.json deleted file mode 100644 index 9f29142..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/content-type/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "content-type", - "description": "Create and parse HTTP Content-Type header", - "version": "1.0.1", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "content-type", - "http", - "req", - "res", - "rfc7231" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/content-type" - }, - "devDependencies": { - "istanbul": "0.3.5", - "mocha": "~1.21.5" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" - }, - "gitHead": "3aa58f9c5a358a3634b8601602177888b4a477d8", - "bugs": { - "url": "https://github.com/jshttp/content-type/issues" - }, - "homepage": "https://github.com/jshttp/content-type", - "_id": "content-type@1.0.1", - "_shasum": "a19d2247327dc038050ce622b7a154ec59c5e600", - "_from": "content-type@>=1.0.1 <1.1.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "a19d2247327dc038050ce622b7a154ec59c5e600", - "tarball": "http://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/History.md deleted file mode 100644 index 78513cc..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/History.md +++ /dev/null @@ -1,38 +0,0 @@ -1.0.6 / 2015-02-03 -================== - -* use `npm test` instead of `make test` to run tests -* clearer assertion messages when checking input - - -1.0.5 / 2014-09-05 -================== - -* add license to package.json - -1.0.4 / 2014-06-25 -================== - - * corrected avoidance of timing attacks (thanks @tenbits!) - -1.0.3 / 2014-01-28 -================== - - * [incorrect] fix for timing attacks - -1.0.2 / 2014-01-28 -================== - - * fix missing repository warning - * fix typo in test - -1.0.1 / 2013-04-15 -================== - - * Revert "Changed underlying HMAC algo. to sha512." - * Revert "Fix for timing attacks on MAC verification." - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/Readme.md deleted file mode 100644 index 2559e84..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/Readme.md +++ /dev/null @@ -1,42 +0,0 @@ - -# cookie-signature - - Sign and unsign cookies. - -## Example - -```js -var cookie = require('cookie-signature'); - -var val = cookie.sign('hello', 'tobiiscool'); -val.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI'); - -var val = cookie.sign('hello', 'tobiiscool'); -cookie.unsign(val, 'tobiiscool').should.equal('hello'); -cookie.unsign(val, 'luna').should.be.false; -``` - -## License - -(The MIT License) - -Copyright (c) 2012 LearnBoost <tj@learnboost.com> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/index.js deleted file mode 100644 index b8c9463..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/index.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Sign the given `val` with `secret`. - * - * @param {String} val - * @param {String} secret - * @return {String} - * @api private - */ - -exports.sign = function(val, secret){ - if ('string' != typeof val) throw new TypeError("Cookie value must be provided as a string."); - if ('string' != typeof secret) throw new TypeError("Secret string must be provided."); - return val + '.' + crypto - .createHmac('sha256', secret) - .update(val) - .digest('base64') - .replace(/\=+$/, ''); -}; - -/** - * Unsign and decode the given `val` with `secret`, - * returning `false` if the signature is invalid. - * - * @param {String} val - * @param {String} secret - * @return {String|Boolean} - * @api private - */ - -exports.unsign = function(val, secret){ - if ('string' != typeof val) throw new TypeError("Signed cookie string must be provided."); - if ('string' != typeof secret) throw new TypeError("Secret string must be provided."); - var str = val.slice(0, val.lastIndexOf('.')) - , mac = exports.sign(str, secret); - - return sha1(mac) == sha1(val) ? str : false; -}; - -/** - * Private - */ - -function sha1(str){ - return crypto.createHash('sha1').update(str).digest('hex'); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/package.json deleted file mode 100644 index 2b6da14..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie-signature/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "cookie-signature", - "version": "1.0.6", - "description": "Sign and unsign cookies", - "keywords": [ - "cookie", - "sign", - "unsign" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@learnboost.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-cookie-signature.git" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "scripts": { - "test": "mocha --require should --reporter spec" - }, - "main": "index", - "gitHead": "391b56cf44d88c493491b7e3fc53208cfb976d2a", - "bugs": { - "url": "https://github.com/visionmedia/node-cookie-signature/issues" - }, - "homepage": "https://github.com/visionmedia/node-cookie-signature", - "_id": "cookie-signature@1.0.6", - "_shasum": "e303a882b342cc3ee8ca513a79999734dab3ae2c", - "_from": "cookie-signature@1.0.6", - "_npmVersion": "2.3.0", - "_nodeVersion": "0.10.36", - "_npmUser": { - "name": "natevw", - "email": "natevw@yahoo.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "natevw", - "email": "natevw@yahoo.com" - } - ], - "dist": { - "shasum": "e303a882b342cc3ee8ca513a79999734dab3ae2c", - "tarball": "http://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/LICENSE deleted file mode 100644 index 0855435..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2012-2014 Roman Shtylman - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/README.md deleted file mode 100644 index acdb5c2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# cookie - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -cookie is a basic cookie parser and serializer. It doesn't make assumptions about how you are going to deal with your cookies. It basically just provides a way to read and write the HTTP cookie headers. - -See [RFC6265](http://tools.ietf.org/html/rfc6265) for details about the http header for cookies. - -## how? - -``` -npm install cookie -``` - -```javascript -var cookie = require('cookie'); - -var hdr = cookie.serialize('foo', 'bar'); -// hdr = 'foo=bar'; - -var cookies = cookie.parse('foo=bar; cat=meow; dog=ruff'); -// cookies = { foo: 'bar', cat: 'meow', dog: 'ruff' }; -``` - -## more - -The serialize function takes a third parameter, an object, to set cookie options. See the RFC for valid values. - -### path -> cookie path - -### expires -> absolute expiration date for the cookie (Date object) - -### maxAge -> relative max age of the cookie from when the client receives it (seconds) - -### domain -> domain for the cookie - -### secure -> true or false - -### httpOnly -> true or false - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/cookie.svg -[npm-url]: https://npmjs.org/package/cookie -[node-version-image]: https://img.shields.io/node/v/cookie.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/cookie/master.svg -[travis-url]: https://travis-ci.org/jshttp/cookie -[coveralls-image]: https://img.shields.io/coveralls/jshttp/cookie/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/cookie?branch=master -[downloads-image]: https://img.shields.io/npm/dm/cookie.svg -[downloads-url]: https://npmjs.org/package/cookie diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/index.js deleted file mode 100644 index 8dea066..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/index.js +++ /dev/null @@ -1,116 +0,0 @@ -/*! - * cookie - * Copyright(c) 2012-2014 Roman Shtylman - * MIT Licensed - */ - -/** - * Module exports. - * @public - */ - -exports.parse = parse; -exports.serialize = serialize; - -/** - * Module variables. - * @private - */ - -var decode = decodeURIComponent; -var encode = encodeURIComponent; - -/** - * Parse a cookie header. - * - * Parse the given cookie header string into an object - * The object has the various cookies as keys(names) => values - * - * @param {string} str - * @param {object} [options] - * @return {string} - * @public - */ - -function parse(str, options) { - var obj = {} - var opt = options || {}; - var pairs = str.split(/; */); - var dec = opt.decode || decode; - - pairs.forEach(function(pair) { - var eq_idx = pair.indexOf('=') - - // skip things that don't look like key=value - if (eq_idx < 0) { - return; - } - - var key = pair.substr(0, eq_idx).trim() - var val = pair.substr(++eq_idx, pair.length).trim(); - - // quoted values - if ('"' == val[0]) { - val = val.slice(1, -1); - } - - // only assign once - if (undefined == obj[key]) { - obj[key] = tryDecode(val, dec); - } - }); - - return obj; -} - -/** - * Serialize data into a cookie header. - * - * Serialize the a name value pair into a cookie string suitable for - * http headers. An optional options object specified cookie parameters. - * - * serialize('foo', 'bar', { httpOnly: true }) - * => "foo=bar; httpOnly" - * - * @param {string} name - * @param {string} val - * @param {object} [options] - * @return {string} - * @public - */ - -function serialize(name, val, options) { - var opt = options || {}; - var enc = opt.encode || encode; - var pairs = [name + '=' + enc(val)]; - - if (null != opt.maxAge) { - var maxAge = opt.maxAge - 0; - if (isNaN(maxAge)) throw new Error('maxAge should be a Number'); - pairs.push('Max-Age=' + maxAge); - } - - if (opt.domain) pairs.push('Domain=' + opt.domain); - if (opt.path) pairs.push('Path=' + opt.path); - if (opt.expires) pairs.push('Expires=' + opt.expires.toUTCString()); - if (opt.httpOnly) pairs.push('HttpOnly'); - if (opt.secure) pairs.push('Secure'); - - return pairs.join('; '); -} - -/** - * Try decoding a string using a decoding function. - * - * @param {string} str - * @param {function} decode - * @private - */ - -function tryDecode(str, decode) { - try { - return decode(str); - } catch (e) { - return str; - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/package.json deleted file mode 100644 index 8d35b5e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/cookie/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "cookie", - "description": "cookie parsing and serialization", - "version": "0.1.3", - "author": { - "name": "Roman Shtylman", - "email": "shtylman@gmail.com" - }, - "license": "MIT", - "keywords": [ - "cookie", - "cookies" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/cookie" - }, - "devDependencies": { - "istanbul": "0.3.9", - "mocha": "1.x.x" - }, - "files": [ - "LICENSE", - "README.md", - "index.js" - ], - "engines": { - "node": "*" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" - }, - "gitHead": "f46097723c16f920a7b9759e154c34792e1d1a3b", - "bugs": { - "url": "https://github.com/jshttp/cookie/issues" - }, - "homepage": "https://github.com/jshttp/cookie", - "_id": "cookie@0.1.3", - "_shasum": "e734a5c1417fce472d5aef82c381cabb64d1a435", - "_from": "cookie@0.1.3", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "e734a5c1417fce472d5aef82c381cabb64d1a435", - "tarball": "http://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/.jshintrc b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/.jshintrc deleted file mode 100644 index 299877f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/.jshintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "laxbreak": true -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/.npmignore deleted file mode 100644 index 7e6163d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -support -test -examples -example -*.sock -dist diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/History.md deleted file mode 100644 index 854c971..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/History.md +++ /dev/null @@ -1,195 +0,0 @@ - -2.2.0 / 2015-05-09 -================== - - * package: update "ms" to v0.7.1 (#202, @dougwilson) - * README: add logging to file example (#193, @DanielOchoa) - * README: fixed a typo (#191, @amir-s) - * browser: expose `storage` (#190, @stephenmathieson) - * Makefile: add a `distclean` target (#189, @stephenmathieson) - -2.1.3 / 2015-03-13 -================== - - * Updated stdout/stderr example (#186) - * Updated example/stdout.js to match debug current behaviour - * Renamed example/stderr.js to stdout.js - * Update Readme.md (#184) - * replace high intensity foreground color for bold (#182, #183) - -2.1.2 / 2015-03-01 -================== - - * dist: recompile - * update "ms" to v0.7.0 - * package: update "browserify" to v9.0.3 - * component: fix "ms.js" repo location - * changed bower package name - * updated documentation about using debug in a browser - * fix: security error on safari (#167, #168, @yields) - -2.1.1 / 2014-12-29 -================== - - * browser: use `typeof` to check for `console` existence - * browser: check for `console.log` truthiness (fix IE 8/9) - * browser: add support for Chrome apps - * Readme: added Windows usage remarks - * Add `bower.json` to properly support bower install - -2.1.0 / 2014-10-15 -================== - - * node: implement `DEBUG_FD` env variable support - * package: update "browserify" to v6.1.0 - * package: add "license" field to package.json (#135, @panuhorsmalahti) - -2.0.0 / 2014-09-01 -================== - - * package: update "browserify" to v5.11.0 - * node: use stderr rather than stdout for logging (#29, @stephenmathieson) - -1.0.4 / 2014-07-15 -================== - - * dist: recompile - * example: remove `console.info()` log usage - * example: add "Content-Type" UTF-8 header to browser example - * browser: place %c marker after the space character - * browser: reset the "content" color via `color: inherit` - * browser: add colors support for Firefox >= v31 - * debug: prefer an instance `log()` function over the global one (#119) - * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) - -1.0.3 / 2014-07-09 -================== - - * Add support for multiple wildcards in namespaces (#122, @seegno) - * browser: fix lint - -1.0.2 / 2014-06-10 -================== - - * browser: update color palette (#113, @gscottolson) - * common: make console logging function configurable (#108, @timoxley) - * node: fix %o colors on old node <= 0.8.x - * Makefile: find node path using shell/which (#109, @timoxley) - -1.0.1 / 2014-06-06 -================== - - * browser: use `removeItem()` to clear localStorage - * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) - * package: add "contributors" section - * node: fix comment typo - * README: list authors - -1.0.0 / 2014-06-04 -================== - - * make ms diff be global, not be scope - * debug: ignore empty strings in enable() - * node: make DEBUG_COLORS able to disable coloring - * *: export the `colors` array - * npmignore: don't publish the `dist` dir - * Makefile: refactor to use browserify - * package: add "browserify" as a dev dependency - * Readme: add Web Inspector Colors section - * node: reset terminal color for the debug content - * node: map "%o" to `util.inspect()` - * browser: map "%j" to `JSON.stringify()` - * debug: add custom "formatters" - * debug: use "ms" module for humanizing the diff - * Readme: add "bash" syntax highlighting - * browser: add Firebug color support - * browser: add colors for WebKit browsers - * node: apply log to `console` - * rewrite: abstract common logic for Node & browsers - * add .jshintrc file - -0.8.1 / 2014-04-14 -================== - - * package: re-add the "component" section - -0.8.0 / 2014-03-30 -================== - - * add `enable()` method for nodejs. Closes #27 - * change from stderr to stdout - * remove unnecessary index.js file - -0.7.4 / 2013-11-13 -================== - - * remove "browserify" key from package.json (fixes something in browserify) - -0.7.3 / 2013-10-30 -================== - - * fix: catch localStorage security error when cookies are blocked (Chrome) - * add debug(err) support. Closes #46 - * add .browser prop to package.json. Closes #42 - -0.7.2 / 2013-02-06 -================== - - * fix package.json - * fix: Mobile Safari (private mode) is broken with debug - * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript - -0.7.1 / 2013-02-05 -================== - - * add repository URL to package.json - * add DEBUG_COLORED to force colored output - * add browserify support - * fix component. Closes #24 - -0.7.0 / 2012-05-04 -================== - - * Added .component to package.json - * Added debug.component.js build - -0.6.0 / 2012-03-16 -================== - - * Added support for "-" prefix in DEBUG [Vinay Pulim] - * Added `.enabled` flag to the node version [TooTallNate] - -0.5.0 / 2012-02-02 -================== - - * Added: humanize diffs. Closes #8 - * Added `debug.disable()` to the CS variant - * Removed padding. Closes #10 - * Fixed: persist client-side variant again. Closes #9 - -0.4.0 / 2012-02-01 -================== - - * Added browser variant support for older browsers [TooTallNate] - * Added `debug.enable('project:*')` to browser variant [TooTallNate] - * Added padding to diff (moved it to the right) - -0.3.0 / 2012-01-26 -================== - - * Added millisecond diff when isatty, otherwise UTC string - -0.2.0 / 2012-01-22 -================== - - * Added wildcard support - -0.1.0 / 2011-12-02 -================== - - * Added: remove colors unless stderr isatty [TooTallNate] - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/Makefile deleted file mode 100644 index 5cf4a59..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/Makefile +++ /dev/null @@ -1,36 +0,0 @@ - -# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 -THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) -THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) - -# BIN directory -BIN := $(THIS_DIR)/node_modules/.bin - -# applications -NODE ?= $(shell which node) -NPM ?= $(NODE) $(shell which npm) -BROWSERIFY ?= $(NODE) $(BIN)/browserify - -all: dist/debug.js - -install: node_modules - -clean: - @rm -rf dist - -dist: - @mkdir -p $@ - -dist/debug.js: node_modules browser.js debug.js dist - @$(BROWSERIFY) \ - --standalone debug \ - . > $@ - -distclean: clean - @rm -rf node_modules - -node_modules: package.json - @NODE_ENV= $(NPM) install - @touch node_modules - -.PHONY: all install clean distclean diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/Readme.md deleted file mode 100644 index b4f45e3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/Readme.md +++ /dev/null @@ -1,188 +0,0 @@ -# debug - - tiny node.js debugging utility modelled after node core's debugging technique. - -## Installation - -```bash -$ npm install debug -``` - -## Usage - - With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility. - -Example _app.js_: - -```js -var debug = require('debug')('http') - , http = require('http') - , name = 'My App'; - -// fake app - -debug('booting %s', name); - -http.createServer(function(req, res){ - debug(req.method + ' ' + req.url); - res.end('hello\n'); -}).listen(3000, function(){ - debug('listening'); -}); - -// fake worker of some kind - -require('./worker'); -``` - -Example _worker.js_: - -```js -var debug = require('debug')('worker'); - -setInterval(function(){ - debug('doing some work'); -}, 1000); -``` - - The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: - - ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) - - ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) - -#### Windows note - - On Windows the environment variable is set using the `set` command. - - ```cmd - set DEBUG=*,-not_this - ``` - -Then, run the program to be debugged as usual. - -## Millisecond diff - - When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. - - ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) - - When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: - - ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) - -## Conventions - - If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". - -## Wildcards - - The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. - - You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:". - -## Browser support - - Debug works in the browser as well, currently persisted by `localStorage`. Consider the situation shown below where you have `worker:a` and `worker:b`, and wish to debug both. Somewhere in the code on your page, include: - -```js -window.myDebug = require("debug"); -``` - - ("debug" is a global object in the browser so we give this object a different name.) When your page is open in the browser, type the following in the console: - -```js -myDebug.enable("worker:*") -``` - - Refresh the page. Debug output will continue to be sent to the console until it is disabled by typing `myDebug.disable()` in the console. - -```js -a = debug('worker:a'); -b = debug('worker:b'); - -setInterval(function(){ - a('doing some work'); -}, 1000); - -setInterval(function(){ - b('doing some work'); -}, 1200); -``` - -#### Web Inspector Colors - - Colors are also enabled on "Web Inspectors" that understand the `%c` formatting - option. These are WebKit web inspectors, Firefox ([since version - 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) - and the Firebug plugin for Firefox (any version). - - Colored output looks something like: - - ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) - -### stderr vs stdout - -You can set an alternative logging method per-namespace by overriding the `log` method on a per-namespace or globally: - -Example _stdout.js_: - -```js -var debug = require('debug'); -var error = debug('app:error'); - -// by default stderr is used -error('goes to stderr!'); - -var log = debug('app:log'); -// set this namespace to log via console.log -log.log = console.log.bind(console); // don't forget to bind to console! -log('goes to stdout'); -error('still goes to stderr!'); - -// set all output to go via console.info -// overrides all per-namespace log settings -debug.log = console.info.bind(console); -error('now goes to stdout via console.info'); -log('still goes to stdout, but via console.info now'); -``` - -### Save debug output to a file - -You can save all debug statements to a file by piping them. - -Example: - -```bash -$ DEBUG_FD=3 node your-app.js 3> whatever.log -``` - -## Authors - - - TJ Holowaychuk - - Nathan Rajlich - -## License - -(The MIT License) - -Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/bower.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/bower.json deleted file mode 100644 index 6af573f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/bower.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "visionmedia-debug", - "main": "dist/debug.js", - "version": "2.2.0", - "homepage": "https://github.com/visionmedia/debug", - "authors": [ - "TJ Holowaychuk " - ], - "description": "visionmedia-debug", - "moduleType": [ - "amd", - "es6", - "globals", - "node" - ], - "keywords": [ - "visionmedia", - "debug" - ], - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/browser.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/browser.js deleted file mode 100644 index 7c76452..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/browser.js +++ /dev/null @@ -1,168 +0,0 @@ - -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = 'undefined' != typeof chrome - && 'undefined' != typeof chrome.storage - ? chrome.storage.local - : localstorage(); - -/** - * Colors. - */ - -exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // is webkit? http://stackoverflow.com/a/16459606/376773 - return ('WebkitAppearance' in document.documentElement.style) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (window.console && (console.firebug || (console.exception && console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - return JSON.stringify(v); -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs() { - var args = arguments; - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return args; - - var c = 'color: ' + this.color; - args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1)); - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); - return args; -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // this hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return 'object' === typeof console - && console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - exports.storage.removeItem('debug'); - } else { - exports.storage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - var r; - try { - r = exports.storage.debug; - } catch(e) {} - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); - -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - -function localstorage(){ - try { - return window.localStorage; - } catch (e) {} -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/component.json deleted file mode 100644 index ca10637..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/component.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "debug", - "repo": "visionmedia/debug", - "description": "small debugging utility", - "version": "2.2.0", - "keywords": [ - "debug", - "log", - "debugger" - ], - "main": "browser.js", - "scripts": [ - "browser.js", - "debug.js" - ], - "dependencies": { - "rauchg/ms.js": "0.7.1" - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/debug.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/debug.js deleted file mode 100644 index 7571a86..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/debug.js +++ /dev/null @@ -1,197 +0,0 @@ - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = debug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = require('ms'); - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lowercased letter, i.e. "n". - */ - -exports.formatters = {}; - -/** - * Previously assigned color. - */ - -var prevColor = 0; - -/** - * Previous log timestamp. - */ - -var prevTime; - -/** - * Select a color. - * - * @return {Number} - * @api private - */ - -function selectColor() { - return exports.colors[prevColor++ % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function debug(namespace) { - - // define the `disabled` version - function disabled() { - } - disabled.enabled = false; - - // define the `enabled` version - function enabled() { - - var self = enabled; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // add the `color` if not set - if (null == self.useColors) self.useColors = exports.useColors(); - if (null == self.color && self.useColors) self.color = selectColor(); - - var args = Array.prototype.slice.call(arguments); - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %o - args = ['%o'].concat(args); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - if ('function' === typeof exports.formatArgs) { - args = exports.formatArgs.apply(self, args); - } - var logFn = enabled.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - enabled.enabled = true; - - var fn = exports.enabled(namespace) ? enabled : disabled; - - fn.namespace = namespace; - - return fn; -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - var split = (namespaces || '').split(/[\s,]+/); - var len = split.length; - - for (var i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node.js deleted file mode 100644 index 1d392a8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node.js +++ /dev/null @@ -1,209 +0,0 @@ - -/** - * Module dependencies. - */ - -var tty = require('tty'); -var util = require('util'); - -/** - * This is the Node.js implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -/** - * The file descriptor to write the `debug()` calls to. - * Set the `DEBUG_FD` env variable to override with another value. i.e.: - * - * $ DEBUG_FD=3 node script.js 3>debug.log - */ - -var fd = parseInt(process.env.DEBUG_FD, 10) || 2; -var stream = 1 === fd ? process.stdout : - 2 === fd ? process.stderr : - createWritableStdioStream(fd); - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - var debugColors = (process.env.DEBUG_COLORS || '').trim().toLowerCase(); - if (0 === debugColors.length) { - return tty.isatty(fd); - } else { - return '0' !== debugColors - && 'no' !== debugColors - && 'false' !== debugColors - && 'disabled' !== debugColors; - } -} - -/** - * Map %o to `util.inspect()`, since Node doesn't do that out of the box. - */ - -var inspect = (4 === util.inspect.length ? - // node <= 0.8.x - function (v, colors) { - return util.inspect(v, void 0, void 0, colors); - } : - // node > 0.8.x - function (v, colors) { - return util.inspect(v, { colors: colors }); - } -); - -exports.formatters.o = function(v) { - return inspect(v, this.useColors) - .replace(/\s*\n\s*/g, ' '); -}; - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs() { - var args = arguments; - var useColors = this.useColors; - var name = this.namespace; - - if (useColors) { - var c = this.color; - - args[0] = ' \u001b[3' + c + ';1m' + name + ' ' - + '\u001b[0m' - + args[0] + '\u001b[3' + c + 'm' - + ' +' + exports.humanize(this.diff) + '\u001b[0m'; - } else { - args[0] = new Date().toUTCString() - + ' ' + name + ' ' + args[0]; - } - return args; -} - -/** - * Invokes `console.error()` with the specified arguments. - */ - -function log() { - return stream.write(util.format.apply(this, arguments) + '\n'); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Copied from `node/src/node.js`. - * - * XXX: It's lame that node doesn't expose this API out-of-the-box. It also - * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. - */ - -function createWritableStdioStream (fd) { - var stream; - var tty_wrap = process.binding('tty_wrap'); - - // Note stream._type is used for test-module-load-list.js - - switch (tty_wrap.guessHandleType(fd)) { - case 'TTY': - stream = new tty.WriteStream(fd); - stream._type = 'tty'; - - // Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - case 'FILE': - var fs = require('fs'); - stream = new fs.SyncWriteStream(fd, { autoClose: false }); - stream._type = 'fs'; - break; - - case 'PIPE': - case 'TCP': - var net = require('net'); - stream = new net.Socket({ - fd: fd, - readable: false, - writable: true - }); - - // FIXME Should probably have an option in net.Socket to create a - // stream from an existing fd which is writable only. But for now - // we'll just add this hack and set the `readable` member to false. - // Test: ./node test/fixtures/echo.js < /etc/passwd - stream.readable = false; - stream.read = null; - stream._type = 'pipe'; - - // FIXME Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - default: - // Probably an error on in uv_guess_handle() - throw new Error('Implement me. Unknown stream file type!'); - } - - // For supporting legacy API we put the FD here. - stream.fd = fd; - - stream._isStdio = true; - - return stream; -} - -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ - -exports.enable(load()); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/History.md deleted file mode 100644 index 32fdfc1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/History.md +++ /dev/null @@ -1,66 +0,0 @@ - -0.7.1 / 2015-04-20 -================== - - * prevent extraordinary long inputs (@evilpacket) - * Fixed broken readme link - -0.7.0 / 2014-11-24 -================== - - * add time abbreviations, updated tests and readme for the new units - * fix example in the readme. - * add LICENSE file - -0.6.2 / 2013-12-05 -================== - - * Adding repository section to package.json to suppress warning from NPM. - -0.6.1 / 2013-05-10 -================== - - * fix singularization [visionmedia] - -0.6.0 / 2013-03-15 -================== - - * fix minutes - -0.5.1 / 2013-02-24 -================== - - * add component namespace - -0.5.0 / 2012-11-09 -================== - - * add short formatting as default and .long option - * add .license property to component.json - * add version to component.json - -0.4.0 / 2012-10-22 -================== - - * add rounding to fix crazy decimals - -0.3.0 / 2012-09-07 -================== - - * fix `ms()` [visionmedia] - -0.2.0 / 2012-09-03 -================== - - * add component.json [visionmedia] - * add days support [visionmedia] - * add hours support [visionmedia] - * add minutes support [visionmedia] - * add seconds support [visionmedia] - * add ms string support [visionmedia] - * refactor tests to facilitate ms(number) [visionmedia] - -0.1.0 / 2012-03-07 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/LICENSE deleted file mode 100644 index 6c07561..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Guillermo Rauch - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/README.md deleted file mode 100644 index 9b4fd03..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('2 days') // 172800000 -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2.5 hrs') // 9000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours'), { long: true }) // "10 hours" -``` - -- Node/Browser compatible. Published as [`ms`](https://www.npmjs.org/package/ms) in [NPM](http://nodejs.org/download). -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/index.js deleted file mode 100644 index 4f92771..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/index.js +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = '' + str; - if (str.length > 10000) return; - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/package.json deleted file mode 100644 index 253335e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/node_modules/ms/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "ms", - "version": "0.7.1", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "gitHead": "713dcf26d9e6fd9dbc95affe7eff9783b7f1b909", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "homepage": "https://github.com/guille/ms.js", - "_id": "ms@0.7.1", - "scripts": {}, - "_shasum": "9cd13c03adbff25b65effde7ce864ee952017098", - "_from": "ms@0.7.1", - "_npmVersion": "2.7.5", - "_nodeVersion": "0.12.2", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "dist": { - "shasum": "9cd13c03adbff25b65effde7ce864ee952017098", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/package.json deleted file mode 100644 index 24bb9c9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/debug/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "debug", - "version": "2.2.0", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/debug.git" - }, - "description": "small debugging utility", - "keywords": [ - "debug", - "log", - "debugger" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Nathan Rajlich", - "email": "nathan@tootallnate.net", - "url": "http://n8.io" - } - ], - "license": "MIT", - "dependencies": { - "ms": "0.7.1" - }, - "devDependencies": { - "browserify": "9.0.3", - "mocha": "*" - }, - "main": "./node.js", - "browser": "./browser.js", - "component": { - "scripts": { - "debug/index.js": "browser.js", - "debug/debug.js": "debug.js" - } - }, - "gitHead": "b38458422b5aa8aa6d286b10dfe427e8a67e2b35", - "bugs": { - "url": "https://github.com/visionmedia/debug/issues" - }, - "homepage": "https://github.com/visionmedia/debug", - "_id": "debug@2.2.0", - "scripts": {}, - "_shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da", - "_from": "debug@>=2.2.0 <2.3.0", - "_npmVersion": "2.7.4", - "_nodeVersion": "0.12.2", - "_npmUser": { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - } - ], - "dist": { - "shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da", - "tarball": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/History.md deleted file mode 100644 index 4a36a6c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/History.md +++ /dev/null @@ -1,75 +0,0 @@ -1.0.1 / 2015-04-07 -================== - - * Fix `TypeError`s when under `'use strict'` code - * Fix useless type name on auto-generated messages - * Support io.js 1.x - * Support Node.js 0.12 - -1.0.0 / 2014-09-17 -================== - - * No changes - -0.4.5 / 2014-09-09 -================== - - * Improve call speed to functions using the function wrapper - * Support Node.js 0.6 - -0.4.4 / 2014-07-27 -================== - - * Work-around v8 generating empty stack traces - -0.4.3 / 2014-07-26 -================== - - * Fix exception when global `Error.stackTraceLimit` is too low - -0.4.2 / 2014-07-19 -================== - - * Correct call site for wrapped functions and properties - -0.4.1 / 2014-07-19 -================== - - * Improve automatic message generation for function properties - -0.4.0 / 2014-07-19 -================== - - * Add `TRACE_DEPRECATION` environment variable - * Remove non-standard grey color from color output - * Support `--no-deprecation` argument - * Support `--trace-deprecation` argument - * Support `deprecate.property(fn, prop, message)` - -0.3.0 / 2014-06-16 -================== - - * Add `NO_DEPRECATION` environment variable - -0.2.0 / 2014-06-15 -================== - - * Add `deprecate.property(obj, prop, message)` - * Remove `supports-color` dependency for node.js 0.8 - -0.1.0 / 2014-06-15 -================== - - * Add `deprecate.function(fn, message)` - * Add `process.on('deprecation', fn)` emitter - * Automatically generate message when omitted from `deprecate()` - -0.0.1 / 2014-06-15 -================== - - * Fix warning for dynamic calls at singe call site - -0.0.0 / 2014-06-15 -================== - - * Initial implementation diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/Readme.md deleted file mode 100644 index 5ead5da..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/Readme.md +++ /dev/null @@ -1,274 +0,0 @@ -# depd - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Downloads][npm-downloads-image]][npm-url] -[![Node.js Version][node-image]][node-url] -[![Linux Build][travis-image]][travis-url] -[![Windows Build][appveyor-image]][appveyor-url] -[![Coverage Status][coveralls-image]][coveralls-url] -[![Gratipay][gratipay-image]][gratipay-url] - -Deprecate all the things - -> With great modules comes great responsibility; mark things deprecated! - -## Install - -```sh -$ npm install depd -``` - -## API - -```js -var deprecate = require('depd')('my-module') -``` - -This library allows you to display deprecation messages to your users. -This library goes above and beyond with deprecation warnings by -introspection of the call stack (but only the bits that it is interested -in). - -Instead of just warning on the first invocation of a deprecated -function and never again, this module will warn on the first invocation -of a deprecated function per unique call site, making it ideal to alert -users of all deprecated uses across the code base, rather than just -whatever happens to execute first. - -The deprecation warnings from this module also include the file and line -information for the call into the module that the deprecated function was -in. - -**NOTE** this library has a similar interface to the `debug` module, and -this module uses the calling file to get the boundary for the call stacks, -so you should always create a new `deprecate` object in each file and not -within some central file. - -### depd(namespace) - -Create a new deprecate function that uses the given namespace name in the -messages and will display the call site prior to the stack entering the -file this function was called from. It is highly suggested you use the -name of your module as the namespace. - -### deprecate(message) - -Call this function from deprecated code to display a deprecation message. -This message will appear once per unique caller site. Caller site is the -first call site in the stack in a different file from the caller of this -function. - -If the message is omitted, a message is generated for you based on the site -of the `deprecate()` call and will display the name of the function called, -similar to the name displayed in a stack trace. - -### deprecate.function(fn, message) - -Call this function to wrap a given function in a deprecation message on any -call to the function. An optional message can be supplied to provide a custom -message. - -### deprecate.property(obj, prop, message) - -Call this function to wrap a given property on object in a deprecation message -on any accessing or setting of the property. An optional message can be supplied -to provide a custom message. - -The method must be called on the object where the property belongs (not -inherited from the prototype). - -If the property is a data descriptor, it will be converted to an accessor -descriptor in order to display the deprecation message. - -### process.on('deprecation', fn) - -This module will allow easy capturing of deprecation errors by emitting the -errors as the type "deprecation" on the global `process`. If there are no -listeners for this type, the errors are written to STDERR as normal, but if -there are any listeners, nothing will be written to STDERR and instead only -emitted. From there, you can write the errors in a different format or to a -logging source. - -The error represents the deprecation and is emitted only once with the same -rules as writing to STDERR. The error has the following properties: - - - `message` - This is the message given by the library - - `name` - This is always `'DeprecationError'` - - `namespace` - This is the namespace the deprecation came from - - `stack` - This is the stack of the call to the deprecated thing - -Example `error.stack` output: - -``` -DeprecationError: my-cool-module deprecated oldfunction - at Object. ([eval]-wrapper:6:22) - at Module._compile (module.js:456:26) - at evalScript (node.js:532:25) - at startup (node.js:80:7) - at node.js:902:3 -``` - -### process.env.NO_DEPRECATION - -As a user of modules that are deprecated, the environment variable `NO_DEPRECATION` -is provided as a quick solution to silencing deprecation warnings from being -output. The format of this is similar to that of `DEBUG`: - -```sh -$ NO_DEPRECATION=my-module,othermod node app.js -``` - -This will suppress deprecations from being output for "my-module" and "othermod". -The value is a list of comma-separated namespaces. To suppress every warning -across all namespaces, use the value `*` for a namespace. - -Providing the argument `--no-deprecation` to the `node` executable will suppress -all deprecations (only available in Node.js 0.8 or higher). - -**NOTE** This will not suppress the deperecations given to any "deprecation" -event listeners, just the output to STDERR. - -### process.env.TRACE_DEPRECATION - -As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION` -is provided as a solution to getting more detailed location information in deprecation -warnings by including the entire stack trace. The format of this is the same as -`NO_DEPRECATION`: - -```sh -$ TRACE_DEPRECATION=my-module,othermod node app.js -``` - -This will include stack traces for deprecations being output for "my-module" and -"othermod". The value is a list of comma-separated namespaces. To trace every -warning across all namespaces, use the value `*` for a namespace. - -Providing the argument `--trace-deprecation` to the `node` executable will trace -all deprecations (only available in Node.js 0.8 or higher). - -**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`. - -## Display - -![message](files/message.png) - -When a user calls a function in your library that you mark deprecated, they -will see the following written to STDERR (in the given colors, similar colors -and layout to the `debug` module): - -``` -bright cyan bright yellow -| | reset cyan -| | | | -▼ ▼ ▼ ▼ -my-cool-module deprecated oldfunction [eval]-wrapper:6:22 -▲ ▲ ▲ ▲ -| | | | -namespace | | location of mycoolmod.oldfunction() call - | deprecation message - the word "deprecated" -``` - -If the user redirects their STDERR to a file or somewhere that does not support -colors, they see (similar layout to the `debug` module): - -``` -Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22 -▲ ▲ ▲ ▲ ▲ -| | | | | -timestamp of message namespace | | location of mycoolmod.oldfunction() call - | deprecation message - the word "deprecated" -``` - -## Examples - -### Deprecating all calls to a function - -This will display a deprecated message about "oldfunction" being deprecated -from "my-module" on STDERR. - -```js -var deprecate = require('depd')('my-cool-module') - -// message automatically derived from function name -// Object.oldfunction -exports.oldfunction = deprecate.function(function oldfunction() { - // all calls to function are deprecated -}) - -// specific message -exports.oldfunction = deprecate.function(function () { - // all calls to function are deprecated -}, 'oldfunction') -``` - -### Conditionally deprecating a function call - -This will display a deprecated message about "weirdfunction" being deprecated -from "my-module" on STDERR when called with less than 2 arguments. - -```js -var deprecate = require('depd')('my-cool-module') - -exports.weirdfunction = function () { - if (arguments.length < 2) { - // calls with 0 or 1 args are deprecated - deprecate('weirdfunction args < 2') - } -} -``` - -When calling `deprecate` as a function, the warning is counted per call site -within your own module, so you can display different deprecations depending -on different situations and the users will still get all the warnings: - -```js -var deprecate = require('depd')('my-cool-module') - -exports.weirdfunction = function () { - if (arguments.length < 2) { - // calls with 0 or 1 args are deprecated - deprecate('weirdfunction args < 2') - } else if (typeof arguments[0] !== 'string') { - // calls with non-string first argument are deprecated - deprecate('weirdfunction non-string first arg') - } -} -``` - -### Deprecating property access - -This will display a deprecated message about "oldprop" being deprecated -from "my-module" on STDERR when accessed. A deprecation will be displayed -when setting the value and when getting the value. - -```js -var deprecate = require('depd')('my-cool-module') - -exports.oldprop = 'something' - -// message automatically derives from property name -deprecate.property(exports, 'oldprop') - -// explicit message -deprecate.property(exports, 'oldprop', 'oldprop >= 0.10') -``` - -## License - -[MIT](LICENSE) - -[npm-version-image]: https://img.shields.io/npm/v/depd.svg -[npm-downloads-image]: https://img.shields.io/npm/dm/depd.svg -[npm-url]: https://npmjs.org/package/depd -[travis-image]: https://img.shields.io/travis/dougwilson/nodejs-depd/master.svg?label=linux -[travis-url]: https://travis-ci.org/dougwilson/nodejs-depd -[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/nodejs-depd/master.svg?label=windows -[appveyor-url]: https://ci.appveyor.com/project/dougwilson/nodejs-depd -[coveralls-image]: https://img.shields.io/coveralls/dougwilson/nodejs-depd/master.svg -[coveralls-url]: https://coveralls.io/r/dougwilson/nodejs-depd?branch=master -[node-image]: https://img.shields.io/node/v/depd.svg -[node-url]: http://nodejs.org/download/ -[gratipay-image]: https://img.shields.io/gratipay/dougwilson.svg -[gratipay-url]: https://www.gratipay.com/dougwilson/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/index.js deleted file mode 100644 index d183b0a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/index.js +++ /dev/null @@ -1,529 +0,0 @@ -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var callSiteToString = require('./lib/compat').callSiteToString -var EventEmitter = require('events').EventEmitter -var relative = require('path').relative - -/** - * Module exports. - */ - -module.exports = depd - -/** - * Get the path to base files on. - */ - -var basePath = process.cwd() - -/** - * Get listener count on event emitter. - */ - -/*istanbul ignore next*/ -var eventListenerCount = EventEmitter.listenerCount - || function (emitter, type) { return emitter.listeners(type).length } - -/** - * Determine if namespace is contained in the string. - */ - -function containsNamespace(str, namespace) { - var val = str.split(/[ ,]+/) - - namespace = String(namespace).toLowerCase() - - for (var i = 0 ; i < val.length; i++) { - if (!(str = val[i])) continue; - - // namespace contained - if (str === '*' || str.toLowerCase() === namespace) { - return true - } - } - - return false -} - -/** - * Convert a data descriptor to accessor descriptor. - */ - -function convertDataDescriptorToAccessor(obj, prop, message) { - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - var value = descriptor.value - - descriptor.get = function getter() { return value } - - if (descriptor.writable) { - descriptor.set = function setter(val) { return value = val } - } - - delete descriptor.value - delete descriptor.writable - - Object.defineProperty(obj, prop, descriptor) - - return descriptor -} - -/** - * Create arguments string to keep arity. - */ - -function createArgumentsString(arity) { - var str = '' - - for (var i = 0; i < arity; i++) { - str += ', arg' + i - } - - return str.substr(2) -} - -/** - * Create stack string from stack. - */ - -function createStackString(stack) { - var str = this.name + ': ' + this.namespace - - if (this.message) { - str += ' deprecated ' + this.message - } - - for (var i = 0; i < stack.length; i++) { - str += '\n at ' + callSiteToString(stack[i]) - } - - return str -} - -/** - * Create deprecate for namespace in caller. - */ - -function depd(namespace) { - if (!namespace) { - throw new TypeError('argument namespace is required') - } - - var stack = getStack() - var site = callSiteLocation(stack[1]) - var file = site[0] - - function deprecate(message) { - // call to self as log - log.call(deprecate, message) - } - - deprecate._file = file - deprecate._ignored = isignored(namespace) - deprecate._namespace = namespace - deprecate._traced = istraced(namespace) - deprecate._warned = Object.create(null) - - deprecate.function = wrapfunction - deprecate.property = wrapproperty - - return deprecate -} - -/** - * Determine if namespace is ignored. - */ - -function isignored(namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.noDeprecation) { - // --no-deprecation support - return true - } - - var str = process.env.NO_DEPRECATION || '' - - // namespace ignored - return containsNamespace(str, namespace) -} - -/** - * Determine if namespace is traced. - */ - -function istraced(namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.traceDeprecation) { - // --trace-deprecation support - return true - } - - var str = process.env.TRACE_DEPRECATION || '' - - // namespace traced - return containsNamespace(str, namespace) -} - -/** - * Display deprecation message. - */ - -function log(message, site) { - var haslisteners = eventListenerCount(process, 'deprecation') !== 0 - - // abort early if no destination - if (!haslisteners && this._ignored) { - return - } - - var caller - var callFile - var callSite - var i = 0 - var seen = false - var stack = getStack() - var file = this._file - - if (site) { - // provided site - callSite = callSiteLocation(stack[1]) - callSite.name = site.name - file = callSite[0] - } else { - // get call site - i = 2 - site = callSiteLocation(stack[i]) - callSite = site - } - - // get caller of deprecated thing in relation to file - for (; i < stack.length; i++) { - caller = callSiteLocation(stack[i]) - callFile = caller[0] - - if (callFile === file) { - seen = true - } else if (callFile === this._file) { - file = this._file - } else if (seen) { - break - } - } - - var key = caller - ? site.join(':') + '__' + caller.join(':') - : undefined - - if (key !== undefined && key in this._warned) { - // already warned - return - } - - this._warned[key] = true - - // generate automatic message from call site - if (!message) { - message = callSite === site || !callSite.name - ? defaultMessage(site) - : defaultMessage(callSite) - } - - // emit deprecation if listeners exist - if (haslisteners) { - var err = DeprecationError(this._namespace, message, stack.slice(i)) - process.emit('deprecation', err) - return - } - - // format and write message - var format = process.stderr.isTTY - ? formatColor - : formatPlain - var msg = format.call(this, message, caller, stack.slice(i)) - process.stderr.write(msg + '\n', 'utf8') - - return -} - -/** - * Get call site location as array. - */ - -function callSiteLocation(callSite) { - var file = callSite.getFileName() || '' - var line = callSite.getLineNumber() - var colm = callSite.getColumnNumber() - - if (callSite.isEval()) { - file = callSite.getEvalOrigin() + ', ' + file - } - - var site = [file, line, colm] - - site.callSite = callSite - site.name = callSite.getFunctionName() - - return site -} - -/** - * Generate a default message from the site. - */ - -function defaultMessage(site) { - var callSite = site.callSite - var funcName = site.name - - // make useful anonymous name - if (!funcName) { - funcName = '' - } - - var context = callSite.getThis() - var typeName = context && callSite.getTypeName() - - // ignore useless type name - if (typeName === 'Object') { - typeName = undefined - } - - // make useful type name - if (typeName === 'Function') { - typeName = context.name || typeName - } - - return typeName && callSite.getMethodName() - ? typeName + '.' + funcName - : funcName -} - -/** - * Format deprecation message without color. - */ - -function formatPlain(msg, caller, stack) { - var timestamp = new Date().toUTCString() - - var formatted = timestamp - + ' ' + this._namespace - + ' deprecated ' + msg - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n at ' + callSiteToString(stack[i]) - } - - return formatted - } - - if (caller) { - formatted += ' at ' + formatLocation(caller) - } - - return formatted -} - -/** - * Format deprecation message with color. - */ - -function formatColor(msg, caller, stack) { - var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' // bold cyan - + ' \x1b[33;1mdeprecated\x1b[22;39m' // bold yellow - + ' \x1b[0m' + msg + '\x1b[39m' // reset - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n \x1b[36mat ' + callSiteToString(stack[i]) + '\x1b[39m' // cyan - } - - return formatted - } - - if (caller) { - formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan - } - - return formatted -} - -/** - * Format call site location. - */ - -function formatLocation(callSite) { - return relative(basePath, callSite[0]) - + ':' + callSite[1] - + ':' + callSite[2] -} - -/** - * Get the stack as array of call sites. - */ - -function getStack() { - var limit = Error.stackTraceLimit - var obj = {} - var prep = Error.prepareStackTrace - - Error.prepareStackTrace = prepareObjectStackTrace - Error.stackTraceLimit = Math.max(10, limit) - - // capture the stack - Error.captureStackTrace(obj) - - // slice this function off the top - var stack = obj.stack.slice(1) - - Error.prepareStackTrace = prep - Error.stackTraceLimit = limit - - return stack -} - -/** - * Capture call site stack from v8. - */ - -function prepareObjectStackTrace(obj, stack) { - return stack -} - -/** - * Return a wrapped function in a deprecation message. - */ - -function wrapfunction(fn, message) { - if (typeof fn !== 'function') { - throw new TypeError('argument fn must be a function') - } - - var args = createArgumentsString(fn.length) - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - site.name = fn.name - - var deprecatedfn = eval('(function (' + args + ') {\n' - + '"use strict"\n' - + 'log.call(deprecate, message, site)\n' - + 'return fn.apply(this, arguments)\n' - + '})') - - return deprecatedfn -} - -/** - * Wrap property in a deprecation message. - */ - -function wrapproperty(obj, prop, message) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - throw new TypeError('argument obj must be object') - } - - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - - if (!descriptor) { - throw new TypeError('must call property on owner object') - } - - if (!descriptor.configurable) { - throw new TypeError('property must be configurable') - } - - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - // set site name - site.name = prop - - // convert data descriptor - if ('value' in descriptor) { - descriptor = convertDataDescriptorToAccessor(obj, prop, message) - } - - var get = descriptor.get - var set = descriptor.set - - // wrap getter - if (typeof get === 'function') { - descriptor.get = function getter() { - log.call(deprecate, message, site) - return get.apply(this, arguments) - } - } - - // wrap setter - if (typeof set === 'function') { - descriptor.set = function setter() { - log.call(deprecate, message, site) - return set.apply(this, arguments) - } - } - - Object.defineProperty(obj, prop, descriptor) -} - -/** - * Create DeprecationError for deprecation - */ - -function DeprecationError(namespace, message, stack) { - var error = new Error() - var stackString - - Object.defineProperty(error, 'constructor', { - value: DeprecationError - }) - - Object.defineProperty(error, 'message', { - configurable: true, - enumerable: false, - value: message, - writable: true - }) - - Object.defineProperty(error, 'name', { - enumerable: false, - configurable: true, - value: 'DeprecationError', - writable: true - }) - - Object.defineProperty(error, 'namespace', { - configurable: true, - enumerable: false, - value: namespace, - writable: true - }) - - Object.defineProperty(error, 'stack', { - configurable: true, - enumerable: false, - get: function () { - if (stackString !== undefined) { - return stackString - } - - // prepare stack trace - return stackString = createStackString.call(this, stack) - }, - set: function setter(val) { - stackString = val - } - }) - - return error -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/lib/compat/buffer-concat.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/lib/compat/buffer-concat.js deleted file mode 100644 index 09d9721..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/lib/compat/buffer-concat.js +++ /dev/null @@ -1,33 +0,0 @@ -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = bufferConcat - -/** - * Concatenate an array of Buffers. - */ - -function bufferConcat(bufs) { - var length = 0 - - for (var i = 0, len = bufs.length; i < len; i++) { - length += bufs[i].length - } - - var buf = new Buffer(length) - var pos = 0 - - for (var i = 0, len = bufs.length; i < len; i++) { - bufs[i].copy(buf, pos) - pos += bufs[i].length - } - - return buf -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/lib/compat/callsite-tostring.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/lib/compat/callsite-tostring.js deleted file mode 100644 index 17cf7ed..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/lib/compat/callsite-tostring.js +++ /dev/null @@ -1,101 +0,0 @@ -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = callSiteToString - -/** - * Format a CallSite file location to a string. - */ - -function callSiteFileLocation(callSite) { - var fileName - var fileLocation = '' - - if (callSite.isNative()) { - fileLocation = 'native' - } else if (callSite.isEval()) { - fileName = callSite.getScriptNameOrSourceURL() - if (!fileName) { - fileLocation = callSite.getEvalOrigin() - } - } else { - fileName = callSite.getFileName() - } - - if (fileName) { - fileLocation += fileName - - var lineNumber = callSite.getLineNumber() - if (lineNumber != null) { - fileLocation += ':' + lineNumber - - var columnNumber = callSite.getColumnNumber() - if (columnNumber) { - fileLocation += ':' + columnNumber - } - } - } - - return fileLocation || 'unknown source' -} - -/** - * Format a CallSite to a string. - */ - -function callSiteToString(callSite) { - var addSuffix = true - var fileLocation = callSiteFileLocation(callSite) - var functionName = callSite.getFunctionName() - var isConstructor = callSite.isConstructor() - var isMethodCall = !(callSite.isToplevel() || isConstructor) - var line = '' - - if (isMethodCall) { - var methodName = callSite.getMethodName() - var typeName = getConstructorName(callSite) - - if (functionName) { - if (typeName && functionName.indexOf(typeName) !== 0) { - line += typeName + '.' - } - - line += functionName - - if (methodName && functionName.lastIndexOf('.' + methodName) !== functionName.length - methodName.length - 1) { - line += ' [as ' + methodName + ']' - } - } else { - line += typeName + '.' + (methodName || '') - } - } else if (isConstructor) { - line += 'new ' + (functionName || '') - } else if (functionName) { - line += functionName - } else { - addSuffix = false - line += fileLocation - } - - if (addSuffix) { - line += ' (' + fileLocation + ')' - } - - return line -} - -/** - * Get constructor name of reviver. - */ - -function getConstructorName(obj) { - var receiver = obj.receiver - return (receiver.constructor && receiver.constructor.name) || null -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/lib/compat/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/lib/compat/index.js deleted file mode 100644 index 7fee026..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/lib/compat/index.js +++ /dev/null @@ -1,69 +0,0 @@ -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -lazyProperty(module.exports, 'bufferConcat', function bufferConcat() { - return Buffer.concat || require('./buffer-concat') -}) - -lazyProperty(module.exports, 'callSiteToString', function callSiteToString() { - var limit = Error.stackTraceLimit - var obj = {} - var prep = Error.prepareStackTrace - - function prepareObjectStackTrace(obj, stack) { - return stack - } - - Error.prepareStackTrace = prepareObjectStackTrace - Error.stackTraceLimit = 2 - - // capture the stack - Error.captureStackTrace(obj) - - // slice the stack - var stack = obj.stack.slice() - - Error.prepareStackTrace = prep - Error.stackTraceLimit = limit - - return stack[0].toString ? toString : require('./callsite-tostring') -}) - -/** - * Define a lazy property. - */ - -function lazyProperty(obj, prop, getter) { - function get() { - var val = getter() - - Object.defineProperty(obj, prop, { - configurable: true, - enumerable: true, - value: val - }) - - return val - } - - Object.defineProperty(obj, prop, { - configurable: true, - enumerable: true, - get: get - }) -} - -/** - * Call toString() on the obj - */ - -function toString(obj) { - return obj.toString() -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/package.json deleted file mode 100644 index b67d8d2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/depd/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "depd", - "description": "Deprecate all the things", - "version": "1.0.1", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "deprecate", - "deprecated" - ], - "repository": { - "type": "git", - "url": "https://github.com/dougwilson/nodejs-depd" - }, - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "istanbul": "0.3.5", - "mocha": "~1.21.5" - }, - "files": [ - "lib/", - "History.md", - "LICENSE", - "index.js", - "Readme.md" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --reporter spec --bail test/", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --no-exit test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/" - }, - "gitHead": "769e0f8108463c35a6937a9d634ab19fee45100a", - "bugs": { - "url": "https://github.com/dougwilson/nodejs-depd/issues" - }, - "homepage": "https://github.com/dougwilson/nodejs-depd", - "_id": "depd@1.0.1", - "_shasum": "80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa", - "_from": "depd@>=1.0.1 <1.1.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa", - "tarball": "http://registry.npmjs.org/depd/-/depd-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/LICENSE deleted file mode 100644 index a3f0274..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2012-2013 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. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/Readme.md deleted file mode 100644 index 2cfcc99..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/Readme.md +++ /dev/null @@ -1,15 +0,0 @@ - -# escape-html - - Escape HTML entities - -## Example - -```js -var escape = require('escape-html'); -escape(str); -``` - -## License - - MIT \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/index.js deleted file mode 100644 index d0f9256..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/index.js +++ /dev/null @@ -1,29 +0,0 @@ -/*! - * escape-html - * Copyright(c) 2012-2013 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module exports. - * @public - */ - -module.exports = escapeHtml; - -/** - * Escape special characters in the given string of html. - * - * @param {string} str The string to escape for inserting into HTML - * @return {string} - * @public - */ - -function escapeHtml(html) { - return String(html) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(//g, '>'); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/package.json deleted file mode 100644 index 605bf91..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/escape-html/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "escape-html", - "description": "Escape HTML entities", - "version": "1.0.2", - "license": "MIT", - "keywords": [ - "escape", - "html", - "utility" - ], - "repository": { - "type": "git", - "url": "https://github.com/component/escape-html" - }, - "files": [ - "LICENSE", - "Readme.md", - "index.js" - ], - "gitHead": "2477a23ae56f75e0a5622a20b5b55da00de3a23b", - "bugs": { - "url": "https://github.com/component/escape-html/issues" - }, - "homepage": "https://github.com/component/escape-html", - "_id": "escape-html@1.0.2", - "scripts": {}, - "_shasum": "d77d32fa98e38c2f41ae85e9278e0e0e6ba1022c", - "_from": "escape-html@1.0.2", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "d77d32fa98e38c2f41ae85e9278e0e0e6ba1022c", - "tarball": "http://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/HISTORY.md deleted file mode 100644 index bd0f26d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/HISTORY.md +++ /dev/null @@ -1,71 +0,0 @@ -1.7.0 / 2015-06-08 -================== - - * Always include entity length in ETags for hash length extensions - * Generate non-Stats ETags using MD5 only (no longer CRC32) - * Improve stat performance by removing hashing - * Remove base64 padding in ETags to shorten - * Use MD5 instead of MD4 in weak ETags over 1KB - -1.6.0 / 2015-05-10 -================== - - * Improve support for JXcore - * Remove requirement of `atime` in the stats object - * Support "fake" stats objects in environments without `fs` - -1.5.1 / 2014-11-19 -================== - - * deps: crc@3.2.1 - - Minor fixes - -1.5.0 / 2014-10-14 -================== - - * Improve string performance - * Slightly improve speed for weak ETags over 1KB - -1.4.0 / 2014-09-21 -================== - - * Support "fake" stats objects - * Support Node.js 0.6 - -1.3.1 / 2014-09-14 -================== - - * Use the (new and improved) `crc` for crc32 - -1.3.0 / 2014-08-29 -================== - - * Default strings to strong ETags - * Improve speed for weak ETags over 1KB - -1.2.1 / 2014-08-29 -================== - - * Use the (much faster) `buffer-crc32` for crc32 - -1.2.0 / 2014-08-24 -================== - - * Add support for file stat objects - -1.1.0 / 2014-08-24 -================== - - * Add fast-path for empty entity - * Add weak ETag generation - * Shrink size of generated ETags - -1.0.1 / 2014-08-24 -================== - - * Fix behavior of string containing Unicode - -1.0.0 / 2014-05-18 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/LICENSE deleted file mode 100644 index 142ede3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/README.md deleted file mode 100644 index 8da9e05..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/README.md +++ /dev/null @@ -1,165 +0,0 @@ -# etag - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Create simple ETags - -## Installation - -```sh -$ npm install etag -``` - -## API - -```js -var etag = require('etag') -``` - -### etag(entity, [options]) - -Generate a strong ETag for the given entity. This should be the complete -body of the entity. Strings, `Buffer`s, and `fs.Stats` are accepted. By -default, a strong ETag is generated except for `fs.Stats`, which will -generate a weak ETag (this can be overwritten by `options.weak`). - -```js -res.setHeader('ETag', etag(body)) -``` - -#### Options - -`etag` accepts these properties in the options object. - -##### weak - -Specifies if the generated ETag will include the weak validator mark (that -is, the leading `W/`). The actual entity tag is the same. The default value -is `false`, unless the `entity` is `fs.Stats`, in which case it is `true`. - -## Testing - -```sh -$ npm test -``` - -## Benchmark - -```bash -$ npm run-script bench - -> etag@1.6.0 bench nodejs-etag -> node benchmark/index.js - - http_parser@1.0 - node@0.10.33 - v8@3.14.5.9 - ares@1.9.0-DEV - uv@0.10.29 - zlib@1.2.3 - modules@11 - openssl@1.0.1j - -> node benchmark/body0-100b.js - - 100B body - - 1 test completed. - 2 tests completed. - 3 tests completed. - 4 tests completed. - -* buffer - strong x 289,198 ops/sec ±1.09% (190 runs sampled) -* buffer - weak x 287,838 ops/sec ±0.91% (189 runs sampled) -* string - strong x 284,586 ops/sec ±1.05% (192 runs sampled) -* string - weak x 287,439 ops/sec ±0.82% (192 runs sampled) - -> node benchmark/body1-1kb.js - - 1KB body - - 1 test completed. - 2 tests completed. - 3 tests completed. - 4 tests completed. - -* buffer - strong x 212,423 ops/sec ±0.75% (193 runs sampled) -* buffer - weak x 211,871 ops/sec ±0.74% (194 runs sampled) - string - strong x 205,291 ops/sec ±0.86% (194 runs sampled) - string - weak x 208,463 ops/sec ±0.79% (192 runs sampled) - -> node benchmark/body2-5kb.js - - 5KB body - - 1 test completed. - 2 tests completed. - 3 tests completed. - 4 tests completed. - -* buffer - strong x 92,901 ops/sec ±0.58% (195 runs sampled) -* buffer - weak x 93,045 ops/sec ±0.65% (192 runs sampled) - string - strong x 89,621 ops/sec ±0.68% (194 runs sampled) - string - weak x 90,070 ops/sec ±0.70% (196 runs sampled) - -> node benchmark/body3-10kb.js - - 10KB body - - 1 test completed. - 2 tests completed. - 3 tests completed. - 4 tests completed. - -* buffer - strong x 54,220 ops/sec ±0.85% (192 runs sampled) -* buffer - weak x 54,069 ops/sec ±0.83% (191 runs sampled) - string - strong x 53,078 ops/sec ±0.53% (194 runs sampled) - string - weak x 53,849 ops/sec ±0.47% (197 runs sampled) - -> node benchmark/body4-100kb.js - - 100KB body - - 1 test completed. - 2 tests completed. - 3 tests completed. - 4 tests completed. - -* buffer - strong x 6,673 ops/sec ±0.15% (197 runs sampled) -* buffer - weak x 6,716 ops/sec ±0.12% (198 runs sampled) - string - strong x 6,357 ops/sec ±0.14% (197 runs sampled) - string - weak x 6,344 ops/sec ±0.21% (197 runs sampled) - -> node benchmark/stats.js - - stats - - 1 test completed. - 2 tests completed. - 3 tests completed. - 4 tests completed. - -* real - strong x 1,671,989 ops/sec ±0.13% (197 runs sampled) -* real - weak x 1,681,297 ops/sec ±0.12% (198 runs sampled) - fake - strong x 927,063 ops/sec ±0.14% (198 runs sampled) - fake - weak x 914,461 ops/sec ±0.41% (191 runs sampled) -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/etag.svg -[npm-url]: https://npmjs.org/package/etag -[node-version-image]: https://img.shields.io/node/v/etag.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/etag/master.svg -[travis-url]: https://travis-ci.org/jshttp/etag -[coveralls-image]: https://img.shields.io/coveralls/jshttp/etag/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/etag?branch=master -[downloads-image]: https://img.shields.io/npm/dm/etag.svg -[downloads-url]: https://npmjs.org/package/etag diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/index.js deleted file mode 100644 index b582c84..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/index.js +++ /dev/null @@ -1,132 +0,0 @@ -/*! - * etag - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - * @public - */ - -module.exports = etag - -/** - * Module dependencies. - * @private - */ - -var crypto = require('crypto') -var Stats = require('fs').Stats - -/** - * Module variables. - * @private - */ - -var base64PadCharRegExp = /=+$/ -var toString = Object.prototype.toString - -/** - * Generate an entity tag. - * - * @param {Buffer|string} entity - * @return {string} - * @private - */ - -function entitytag(entity) { - if (entity.length === 0) { - // fast-path empty - return '"0-1B2M2Y8AsgTpgAmY7PhCfg"' - } - - // compute hash of entity - var hash = crypto - .createHash('md5') - .update(entity, 'utf8') - .digest('base64') - .replace(base64PadCharRegExp, '') - - // compute length of entity - var len = typeof entity === 'string' - ? Buffer.byteLength(entity, 'utf8') - : entity.length - - return '"' + len.toString(16) + '-' + hash + '"' -} - -/** - * Create a simple ETag. - * - * @param {string|Buffer|Stats} entity - * @param {object} [options] - * @param {boolean} [options.weak] - * @return {String} - * @public - */ - -function etag(entity, options) { - if (entity == null) { - throw new TypeError('argument entity is required') - } - - // support fs.Stats object - var isStats = isstats(entity) - var weak = options && typeof options.weak === 'boolean' - ? options.weak - : isStats - - // validate argument - if (!isStats && typeof entity !== 'string' && !Buffer.isBuffer(entity)) { - throw new TypeError('argument entity must be string, Buffer, or fs.Stats') - } - - // generate entity tag - var tag = isStats - ? stattag(entity) - : entitytag(entity) - - return weak - ? 'W/' + tag - : tag -} - -/** - * Determine if object is a Stats object. - * - * @param {object} obj - * @return {boolean} - * @api private - */ - -function isstats(obj) { - // genuine fs.Stats - if (typeof Stats === 'function' && obj instanceof Stats) { - return true - } - - // quack quack - return obj && typeof obj === 'object' - && 'ctime' in obj && toString.call(obj.ctime) === '[object Date]' - && 'mtime' in obj && toString.call(obj.mtime) === '[object Date]' - && 'ino' in obj && typeof obj.ino === 'number' - && 'size' in obj && typeof obj.size === 'number' -} - -/** - * Generate a tag for a stat. - * - * @param {object} stat - * @return {string} - * @private - */ - -function stattag(stat) { - var mtime = stat.mtime.getTime().toString(16) - var size = stat.size.toString(16) - - return '"' + size + '-' + mtime + '"' -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/package.json deleted file mode 100644 index 3e5a864..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/etag/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "etag", - "description": "Create simple ETags", - "version": "1.7.0", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "David Björklund", - "email": "david.bjorklund@gmail.com" - } - ], - "license": "MIT", - "keywords": [ - "etag", - "http", - "res" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/etag" - }, - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "istanbul": "0.3.14", - "mocha": "~1.21.4", - "seedrandom": "2.3.11" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "a511f5c8c930fd9546dbd88acb080f96bc788cfc", - "bugs": { - "url": "https://github.com/jshttp/etag/issues" - }, - "homepage": "https://github.com/jshttp/etag", - "_id": "etag@1.7.0", - "_shasum": "03d30b5f67dd6e632d2945d30d6652731a34d5d8", - "_from": "etag@>=1.7.0 <1.8.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "03d30b5f67dd6e632d2945d30d6652731a34d5d8", - "tarball": "http://registry.npmjs.org/etag/-/etag-1.7.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/HISTORY.md deleted file mode 100644 index 26a9435..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/HISTORY.md +++ /dev/null @@ -1,90 +0,0 @@ -0.4.0 / 2015-06-14 -================== - - * Fix a false-positive when unpiping in Node.js 0.8 - * Support `statusCode` property on `Error` objects - * Use `unpipe` module for unpiping requests - * deps: escape-html@1.0.2 - * deps: on-finished@~2.3.0 - - Add defined behavior for HTTP `CONNECT` requests - - Add defined behavior for HTTP `Upgrade` requests - - deps: ee-first@1.1.1 - * perf: enable strict mode - * perf: remove argument reassignment - -0.3.6 / 2015-05-11 -================== - - * deps: debug@~2.2.0 - - deps: ms@0.7.1 - -0.3.5 / 2015-04-22 -================== - - * deps: on-finished@~2.2.1 - - Fix `isFinished(req)` when data buffered - -0.3.4 / 2015-03-15 -================== - - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - -0.3.3 / 2015-01-01 -================== - - * deps: debug@~2.1.1 - * deps: on-finished@~2.2.0 - -0.3.2 / 2014-10-22 -================== - - * deps: on-finished@~2.1.1 - - Fix handling of pipelined requests - -0.3.1 / 2014-10-16 -================== - - * deps: debug@~2.1.0 - - Implement `DEBUG_FD` env variable support - -0.3.0 / 2014-09-17 -================== - - * Terminate in progress response only on error - * Use `on-finished` to determine request status - -0.2.0 / 2014-09-03 -================== - - * Set `X-Content-Type-Options: nosniff` header - * deps: debug@~2.0.0 - -0.1.0 / 2014-07-16 -================== - - * Respond after request fully read - - prevents hung responses and socket hang ups - * deps: debug@1.0.4 - -0.0.3 / 2014-07-11 -================== - - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.0.2 / 2014-06-19 -================== - - * Handle invalid status codes - -0.0.1 / 2014-06-05 -================== - - * deps: debug@1.0.2 - -0.0.0 / 2014-06-05 -================== - - * Extracted from connect/express diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/LICENSE deleted file mode 100644 index b60a5ad..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/README.md deleted file mode 100644 index 6b171d4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/README.md +++ /dev/null @@ -1,133 +0,0 @@ -# finalhandler - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-image]][node-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Node.js function to invoke as the final step to respond to HTTP request. - -## Installation - -```sh -$ npm install finalhandler -``` - -## API - -```js -var finalhandler = require('finalhandler') -``` - -### finalhandler(req, res, [options]) - -Returns function to be invoked as the final step for the given `req` and `res`. -This function is to be invoked as `fn(err)`. If `err` is falsy, the handler will -write out a 404 response to the `res`. If it is truthy, an error response will -be written out to the `res`, and `res.statusCode` is set from `err.status`. - -The final handler will also unpipe anything from `req` when it is invoked. - -#### options.env - -By default, the environment is determined by `NODE_ENV` variable, but it can be -overridden by this option. - -#### options.onerror - -Provide a function to be called with the `err` when it exists. Can be used for -writing errors to a central location without excessive function generation. Called -as `onerror(err, req, res)`. - -## Examples - -### always 404 - -```js -var finalhandler = require('finalhandler') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - done() -}) - -server.listen(3000) -``` - -### perform simple action - -```js -var finalhandler = require('finalhandler') -var fs = require('fs') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - - fs.readFile('index.html', function (err, buf) { - if (err) return done(err) - res.setHeader('Content-Type', 'text/html') - res.end(buf) - }) -}) - -server.listen(3000) -``` - -### use with middleware-style functions - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -var serve = serveStatic('public') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - serve(req, res, done) -}) - -server.listen(3000) -``` - -### keep log of all errors - -```js -var finalhandler = require('finalhandler') -var fs = require('fs') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res, {onerror: logerror}) - - fs.readFile('index.html', function (err, buf) { - if (err) return done(err) - res.setHeader('Content-Type', 'text/html') - res.end(buf) - }) -}) - -server.listen(3000) - -function logerror(err) { - console.error(err.stack || err.toString()) -} -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/finalhandler.svg -[npm-url]: https://npmjs.org/package/finalhandler -[node-image]: https://img.shields.io/node/v/finalhandler.svg -[node-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/pillarjs/finalhandler.svg -[travis-url]: https://travis-ci.org/pillarjs/finalhandler -[coveralls-image]: https://img.shields.io/coveralls/pillarjs/finalhandler.svg -[coveralls-url]: https://coveralls.io/r/pillarjs/finalhandler?branch=master -[downloads-image]: https://img.shields.io/npm/dm/finalhandler.svg -[downloads-url]: https://npmjs.org/package/finalhandler diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/index.js deleted file mode 100644 index 0de7c6b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/index.js +++ /dev/null @@ -1,151 +0,0 @@ -/*! - * finalhandler - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var debug = require('debug')('finalhandler') -var escapeHtml = require('escape-html') -var http = require('http') -var onFinished = require('on-finished') -var unpipe = require('unpipe') - -/** - * Module variables. - * @private - */ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } -var isFinished = onFinished.isFinished - -/** - * Module exports. - * @public - */ - -module.exports = finalhandler - -/** - * Create a function to handle the final response. - * - * @param {Request} req - * @param {Response} res - * @param {Object} [options] - * @return {Function} - * @public - */ - -function finalhandler(req, res, options) { - var opts = options || {} - - // get environment - var env = opts.env || process.env.NODE_ENV || 'development' - - // get error callback - var onerror = opts.onerror - - return function (err) { - var status = res.statusCode - - // ignore 404 on in-flight response - if (!err && res._header) { - debug('cannot 404 after headers sent') - return - } - - // unhandled error - if (err) { - // respect err.statusCode - if (err.statusCode) { - status = err.statusCode - } - - // respect err.status - if (err.status) { - status = err.status - } - - // default status code to 500 - if (!status || status < 400) { - status = 500 - } - - // production gets a basic error message - var msg = env === 'production' - ? http.STATUS_CODES[status] - : err.stack || err.toString() - msg = escapeHtml(msg) - .replace(/\n/g, '
') - .replace(/ /g, '  ') + '\n' - } else { - status = 404 - msg = 'Cannot ' + escapeHtml(req.method) + ' ' + escapeHtml(req.originalUrl || req.url) + '\n' - } - - debug('default %s', status) - - // schedule onerror callback - if (err && onerror) { - defer(onerror, err, req, res) - } - - // cannot actually respond - if (res._header) { - return req.socket.destroy() - } - - send(req, res, status, msg) - } -} - -/** - * Send response. - * - * @param {IncomingMessage} req - * @param {OutgoingMessage} res - * @param {number} status - * @param {string} body - * @private - */ - -function send(req, res, status, body) { - function write() { - res.statusCode = status - - // security header for content sniffing - res.setHeader('X-Content-Type-Options', 'nosniff') - - // standard headers - res.setHeader('Content-Type', 'text/html; charset=utf-8') - res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8')) - - if (req.method === 'HEAD') { - res.end() - return - } - - res.end(body, 'utf8') - } - - if (isFinished(req)) { - write() - return - } - - // unpipe everything from the request - unpipe(req) - - // flush the request - onFinished(req, write) - req.resume() -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/HISTORY.md deleted file mode 100644 index 85e0f8d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/HISTORY.md +++ /dev/null @@ -1,4 +0,0 @@ -1.0.0 / 2015-06-14 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/LICENSE deleted file mode 100644 index aed0138..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/README.md deleted file mode 100644 index e536ad2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# unpipe - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-image]][node-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Unpipe a stream from all destinations. - -## Installation - -```sh -$ npm install unpipe -``` - -## API - -```js -var unpipe = require('unpipe') -``` - -### unpipe(stream) - -Unpipes all destinations from a given stream. With stream 2+, this is -equivalent to `stream.unpipe()`. When used with streams 1 style streams -(typically Node.js 0.8 and below), this module attempts to undo the -actions done in `stream.pipe(dest)`. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/unpipe.svg -[npm-url]: https://npmjs.org/package/unpipe -[node-image]: https://img.shields.io/node/v/unpipe.svg -[node-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/stream-utils/unpipe.svg -[travis-url]: https://travis-ci.org/stream-utils/unpipe -[coveralls-image]: https://img.shields.io/coveralls/stream-utils/unpipe.svg -[coveralls-url]: https://coveralls.io/r/stream-utils/unpipe?branch=master -[downloads-image]: https://img.shields.io/npm/dm/unpipe.svg -[downloads-url]: https://npmjs.org/package/unpipe diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/index.js deleted file mode 100644 index 15c3d97..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/index.js +++ /dev/null @@ -1,69 +0,0 @@ -/*! - * unpipe - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - * @public - */ - -module.exports = unpipe - -/** - * Determine if there are Node.js pipe-like data listeners. - * @private - */ - -function hasPipeDataListeners(stream) { - var listeners = stream.listeners('data') - - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].name === 'ondata') { - return true - } - } - - return false -} - -/** - * Unpipe a stream from all destinations. - * - * @param {object} stream - * @public - */ - -function unpipe(stream) { - if (!stream) { - throw new TypeError('argument stream is required') - } - - if (typeof stream.unpipe === 'function') { - // new-style - stream.unpipe() - return - } - - // Node.js 0.8 hack - if (!hasPipeDataListeners(stream)) { - return - } - - var listener - var listeners = stream.listeners('close') - - for (var i = 0; i < listeners.length; i++) { - listener = listeners[i] - - if (listener.name !== 'cleanup' && listener.name !== 'onclose') { - continue - } - - // invoke the listener - listener.call(stream) - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/package.json deleted file mode 100644 index 973dbfa..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/node_modules/unpipe/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "unpipe", - "description": "Unpipe a stream from all destinations", - "version": "1.0.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/stream-utils/unpipe" - }, - "devDependencies": { - "istanbul": "0.3.15", - "mocha": "2.2.5", - "readable-stream": "1.1.13" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "d2df901c06487430e78dca62b6edb8bb2fc5e99d", - "bugs": { - "url": "https://github.com/stream-utils/unpipe/issues" - }, - "homepage": "https://github.com/stream-utils/unpipe", - "_id": "unpipe@1.0.0", - "_shasum": "b2bf4ee8514aae6165b4817829d21b2ef49904ec", - "_from": "unpipe@>=1.0.0 <1.1.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "b2bf4ee8514aae6165b4817829d21b2ef49904ec", - "tarball": "http://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/package.json deleted file mode 100644 index 9549095..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/finalhandler/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "finalhandler", - "description": "Node.js final http responder", - "version": "0.4.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/pillarjs/finalhandler" - }, - "dependencies": { - "debug": "~2.2.0", - "escape-html": "1.0.2", - "on-finished": "~2.3.0", - "unpipe": "~1.0.0" - }, - "devDependencies": { - "istanbul": "0.3.15", - "mocha": "2.2.5", - "readable-stream": "2.0.0", - "supertest": "1.0.1" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "fe4e4de9ebb0f3831493ad75119ee6ba40542853", - "bugs": { - "url": "https://github.com/pillarjs/finalhandler/issues" - }, - "homepage": "https://github.com/pillarjs/finalhandler", - "_id": "finalhandler@0.4.0", - "_shasum": "965a52d9e8d05d2b857548541fb89b53a2497d9b", - "_from": "finalhandler@0.4.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "965a52d9e8d05d2b857548541fb89b53a2497d9b", - "tarball": "http://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/HISTORY.md deleted file mode 100644 index 3c95fbb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/HISTORY.md +++ /dev/null @@ -1,38 +0,0 @@ -0.3.0 / 2015-05-12 -================== - - * Add weak `ETag` matching support - -0.2.4 / 2014-09-07 -================== - - * Support Node.js 0.6 - -0.2.3 / 2014-09-07 -================== - - * Move repository to jshttp - -0.2.2 / 2014-02-19 -================== - - * Revert "Fix for blank page on Safari reload" - -0.2.1 / 2014-01-29 -================== - - * Fix for blank page on Safari reload - -0.2.0 / 2013-08-11 -================== - - * Return stale for `Cache-Control: no-cache` - -0.1.0 / 2012-06-15 -================== - * Add `If-None-Match: *` support - -0.0.1 / 2012-06-10 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/LICENSE deleted file mode 100644 index f527394..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2012 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. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/README.md deleted file mode 100644 index 0813e30..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# fresh - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -HTTP response freshness testing - -## Installation - -``` -$ npm install fresh -``` - -## API - -```js -var fresh = require('fresh') -``` - -### fresh(req, res) - - Check freshness of `req` and `res` headers. - - When the cache is "fresh" __true__ is returned, - otherwise __false__ is returned to indicate that - the cache is now stale. - -## Example - -```js -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'luna' }; -fresh(req, res); -// => false - -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'tobi' }; -fresh(req, res); -// => true -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/fresh.svg -[npm-url]: https://npmjs.org/package/fresh -[node-version-image]: https://img.shields.io/node/v/fresh.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/fresh/master.svg -[travis-url]: https://travis-ci.org/jshttp/fresh -[coveralls-image]: https://img.shields.io/coveralls/jshttp/fresh/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/fresh?branch=master -[downloads-image]: https://img.shields.io/npm/dm/fresh.svg -[downloads-url]: https://npmjs.org/package/fresh diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/index.js deleted file mode 100644 index a900873..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/index.js +++ /dev/null @@ -1,57 +0,0 @@ - -/** - * Expose `fresh()`. - */ - -module.exports = fresh; - -/** - * Check freshness of `req` and `res` headers. - * - * When the cache is "fresh" __true__ is returned, - * otherwise __false__ is returned to indicate that - * the cache is now stale. - * - * @param {Object} req - * @param {Object} res - * @return {Boolean} - * @api public - */ - -function fresh(req, res) { - // defaults - var etagMatches = true; - var notModified = true; - - // fields - var modifiedSince = req['if-modified-since']; - var noneMatch = req['if-none-match']; - var lastModified = res['last-modified']; - var etag = res['etag']; - var cc = req['cache-control']; - - // unconditional request - if (!modifiedSince && !noneMatch) return false; - - // check for no-cache cache request directive - if (cc && cc.indexOf('no-cache') !== -1) return false; - - // parse if-none-match - if (noneMatch) noneMatch = noneMatch.split(/ *, */); - - // if-none-match - if (noneMatch) { - etagMatches = noneMatch.some(function (match) { - return match === '*' || match === etag || match === 'W/' + etag; - }); - } - - // if-modified-since - if (modifiedSince) { - modifiedSince = new Date(modifiedSince); - lastModified = new Date(lastModified); - notModified = lastModified <= modifiedSince; - } - - return !! (etagMatches && notModified); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/package.json deleted file mode 100644 index dab2e5c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/fresh/package.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "fresh", - "description": "HTTP response freshness testing", - "version": "0.3.0", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - } - ], - "license": "MIT", - "keywords": [ - "fresh", - "http", - "conditional", - "cache" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/fresh" - }, - "devDependencies": { - "istanbul": "0.3.9", - "mocha": "1.21.5" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "14616c9748368ca08cd6a955dd88ab659b778634", - "bugs": { - "url": "https://github.com/jshttp/fresh/issues" - }, - "homepage": "https://github.com/jshttp/fresh", - "_id": "fresh@0.3.0", - "_shasum": "651f838e22424e7566de161d8358caa199f83d4f", - "_from": "fresh@0.3.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "651f838e22424e7566de161d8358caa199f83d4f", - "tarball": "http://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/LICENSE deleted file mode 100644 index a53a533..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2013 Jonathan Ong - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/README.md deleted file mode 100644 index ca4cf24..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Merge Descriptors - -Merge objects using descriptors. - -```js -var thing = { - get name() { - return 'jon' - } -} - -var animal = { - -} - -merge(animal, thing) - -animal.name === 'jon' -``` - -## API - -### merge(destination, source) - -Redefines `destination`'s descriptors with `source`'s. - -### merge(destination, source, false) - -Defines `source`'s descriptors on `destination` if `destination` does not have -a descriptor by the same name. - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/index.js deleted file mode 100644 index 5d0af3a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/index.js +++ /dev/null @@ -1,57 +0,0 @@ -/*! - * merge-descriptors - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** - * Module exports. - * @public - */ - -module.exports = merge - -/** - * Module variables. - * @private - */ - -var hasOwnProperty = Object.prototype.hasOwnProperty - -/** - * Merge the property descriptors of `src` into `dest` - * - * @param {object} dest Object to add descriptors to - * @param {object} src Object to clone descriptors from - * @param {boolean} [redefine=true] Redefine `dest` properties with `src` properties - * @returns {object} Reference to dest - * @public - */ - -function merge(dest, src, redefine) { - if (!dest) { - throw new TypeError('argument dest is required') - } - - if (!src) { - throw new TypeError('argument src is required') - } - - if (redefine === undefined) { - // Default to true - redefine = true - } - - Object.getOwnPropertyNames(src).forEach(function forEachOwnPropertyName(name) { - if (!redefine && hasOwnProperty.call(dest, name)) { - // Skip desriptor - return - } - - // Copy descriptor - var descriptor = Object.getOwnPropertyDescriptor(src, name) - Object.defineProperty(dest, name, descriptor) - }) - - return dest -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/package.json deleted file mode 100644 index fcea731..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/merge-descriptors/package.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "name": "merge-descriptors", - "description": "Merge objects using descriptors", - "version": "1.0.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/component/merge-descriptors.git" - }, - "bugs": { - "url": "https://github.com/component/merge-descriptors/issues" - }, - "files": [ - "LICENSE", - "README.md", - "index.js" - ], - "gitHead": "81d7a3c14099884c391bd237d7d8edf23c6d6f18", - "homepage": "https://github.com/component/merge-descriptors", - "_id": "merge-descriptors@1.0.0", - "scripts": {}, - "_shasum": "2169cf7538e1b0cc87fb88e1502d8474bbf79864", - "_from": "merge-descriptors@1.0.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - { - "name": "yields", - "email": "yields@icloud.com" - }, - { - "name": "ianstormtaylor", - "email": "ian@ianstormtaylor.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "timoxley", - "email": "secoif@gmail.com" - }, - { - "name": "mattmueller", - "email": "mattmuelle@gmail.com" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "queckezz", - "email": "fabian.eichenberger@gmail.com" - }, - { - "name": "anthonyshort", - "email": "antshort@gmail.com" - }, - { - "name": "dominicbarnes", - "email": "dominic@dbarnes.info" - }, - { - "name": "clintwood", - "email": "clint@anotherway.co.za" - }, - { - "name": "thehydroimpulse", - "email": "dnfagnan@gmail.com" - }, - { - "name": "stephenmathieson", - "email": "me@stephenmathieson.com" - }, - { - "name": "trevorgerhardt", - "email": "trevorgerhardt@gmail.com" - }, - { - "name": "timaschew", - "email": "timaschew@gmail.com" - }, - { - "name": "hughsk", - "email": "hughskennedy@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "2169cf7538e1b0cc87fb88e1502d8474bbf79864", - "tarball": "http://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/HISTORY.md deleted file mode 100644 index c9e302c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/HISTORY.md +++ /dev/null @@ -1,24 +0,0 @@ -1.1.1 / 2014-12-30 -================== - - * Improve `browserify` support - -1.1.0 / 2014-07-05 -================== - - * Add `CONNECT` method - -1.0.1 / 2014-06-02 -================== - - * Fix module to work with harmony transform - -1.0.0 / 2014-05-08 -================== - - * Add `PURGE` method - -0.1.0 / 2013-10-28 -================== - - * Add `http.METHODS` support diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/LICENSE deleted file mode 100644 index 8bce401..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2013-2014 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. - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/README.md deleted file mode 100644 index dccc473..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Methods - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - - HTTP verbs that node core's parser supports. - - -## Install - -```bash -$ npm install methods -``` - -## API - -```js -var methods = require('methods') -``` - -### methods - -This is an array of lower-case method names that Node.js supports. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/methods.svg?style=flat -[npm-url]: https://npmjs.org/package/methods -[node-version-image]: https://img.shields.io/node/v/methods.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/methods.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/methods -[coveralls-image]: https://img.shields.io/coveralls/jshttp/methods.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/methods?branch=master -[downloads-image]: https://img.shields.io/npm/dm/methods.svg?style=flat -[downloads-url]: https://npmjs.org/package/methods diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/index.js deleted file mode 100644 index e89c7fd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/index.js +++ /dev/null @@ -1,42 +0,0 @@ - -var http = require('http'); - -/* istanbul ignore next: implementation differs on version */ -if (http.METHODS) { - - module.exports = http.METHODS.map(function(method){ - return method.toLowerCase(); - }); - -} else { - - module.exports = [ - 'get', - 'post', - 'put', - 'head', - 'delete', - 'options', - 'trace', - 'copy', - 'lock', - 'mkcol', - 'move', - 'purge', - 'propfind', - 'proppatch', - 'unlock', - 'report', - 'mkactivity', - 'checkout', - 'merge', - 'm-search', - 'notify', - 'subscribe', - 'unsubscribe', - 'patch', - 'search', - 'connect' - ]; - -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/package.json deleted file mode 100644 index c1ce061..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/methods/package.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "name": "methods", - "description": "HTTP methods that node supports", - "version": "1.1.1", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jshttp/methods" - }, - "devDependencies": { - "istanbul": "0.3", - "mocha": "1" - }, - "files": [ - "index.js", - "HISTORY.md", - "LICENSE" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" - }, - "browser": { - "http": false - }, - "keywords": [ - "http", - "methods" - ], - "gitHead": "6293c6b27c5fb963acf67a347af80ad2ebd7247f", - "bugs": { - "url": "https://github.com/jshttp/methods/issues" - }, - "homepage": "https://github.com/jshttp/methods", - "_id": "methods@1.1.1", - "_shasum": "17ea6366066d00c58e375b8ec7dfd0453c89822a", - "_from": "methods@>=1.1.1 <1.2.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "17ea6366066d00c58e375b8ec7dfd0453c89822a", - "tarball": "http://registry.npmjs.org/methods/-/methods-1.1.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/methods/-/methods-1.1.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/HISTORY.md deleted file mode 100644 index 98ff0e9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/HISTORY.md +++ /dev/null @@ -1,88 +0,0 @@ -2.3.0 / 2015-05-26 -================== - - * Add defined behavior for HTTP `CONNECT` requests - * Add defined behavior for HTTP `Upgrade` requests - * deps: ee-first@1.1.1 - -2.2.1 / 2015-04-22 -================== - - * Fix `isFinished(req)` when data buffered - -2.2.0 / 2014-12-22 -================== - - * Add message object to callback arguments - -2.1.1 / 2014-10-22 -================== - - * Fix handling of pipelined requests - -2.1.0 / 2014-08-16 -================== - - * Check if `socket` is detached - * Return `undefined` for `isFinished` if state unknown - -2.0.0 / 2014-08-16 -================== - - * Add `isFinished` function - * Move to `jshttp` organization - * Remove support for plain socket argument - * Rename to `on-finished` - * Support both `req` and `res` as arguments - * deps: ee-first@1.0.5 - -1.2.2 / 2014-06-10 -================== - - * Reduce listeners added to emitters - - avoids "event emitter leak" warnings when used multiple times on same request - -1.2.1 / 2014-06-08 -================== - - * Fix returned value when already finished - -1.2.0 / 2014-06-05 -================== - - * Call callback when called on already-finished socket - -1.1.4 / 2014-05-27 -================== - - * Support node.js 0.8 - -1.1.3 / 2014-04-30 -================== - - * Make sure errors passed as instanceof `Error` - -1.1.2 / 2014-04-18 -================== - - * Default the `socket` to passed-in object - -1.1.1 / 2014-01-16 -================== - - * Rename module to `finished` - -1.1.0 / 2013-12-25 -================== - - * Call callback when called on already-errored socket - -1.0.1 / 2013-12-20 -================== - - * Actually pass the error to the callback - -1.0.0 / 2013-12-20 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/LICENSE deleted file mode 100644 index 5931fd2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2013 Jonathan Ong -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/README.md deleted file mode 100644 index a0e1157..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/README.md +++ /dev/null @@ -1,154 +0,0 @@ -# on-finished - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Execute a callback when a HTTP request closes, finishes, or errors. - -## Install - -```sh -$ npm install on-finished -``` - -## API - -```js -var onFinished = require('on-finished') -``` - -### onFinished(res, listener) - -Attach a listener to listen for the response to finish. The listener will -be invoked only once when the response finished. If the response finished -to an error, the first argument will contain the error. If the response -has already finished, the listener will be invoked. - -Listening to the end of a response would be used to close things associated -with the response, like open files. - -Listener is invoked as `listener(err, res)`. - -```js -onFinished(res, function (err, res) { - // clean up open fds, etc. - // err contains the error is request error'd -}) -``` - -### onFinished(req, listener) - -Attach a listener to listen for the request to finish. The listener will -be invoked only once when the request finished. If the request finished -to an error, the first argument will contain the error. If the request -has already finished, the listener will be invoked. - -Listening to the end of a request would be used to know when to continue -after reading the data. - -Listener is invoked as `listener(err, req)`. - -```js -var data = '' - -req.setEncoding('utf8') -res.on('data', function (str) { - data += str -}) - -onFinished(req, function (err, req) { - // data is read unless there is err -}) -``` - -### onFinished.isFinished(res) - -Determine if `res` is already finished. This would be useful to check and -not even start certain operations if the response has already finished. - -### onFinished.isFinished(req) - -Determine if `req` is already finished. This would be useful to check and -not even start certain operations if the request has already finished. - -## Special Node.js requests - -### HTTP CONNECT method - -The meaning of the `CONNECT` method from RFC 7231, section 4.3.6: - -> The CONNECT method requests that the recipient establish a tunnel to -> the destination origin server identified by the request-target and, -> if successful, thereafter restrict its behavior to blind forwarding -> of packets, in both directions, until the tunnel is closed. Tunnels -> are commonly used to create an end-to-end virtual connection, through -> one or more proxies, which can then be secured using TLS (Transport -> Layer Security, [RFC5246]). - -In Node.js, these request objects come from the `'connect'` event on -the HTTP server. - -When this module is used on a HTTP `CONNECT` request, the request is -considered "finished" immediately, **due to limitations in the Node.js -interface**. This means if the `CONNECT` request contains a request entity, -the request will be considered "finished" even before it has been read. - -There is no such thing as a response object to a `CONNECT` request in -Node.js, so there is no support for for one. - -### HTTP Upgrade request - -The meaning of the `Upgrade` header from RFC 7230, section 6.1: - -> The "Upgrade" header field is intended to provide a simple mechanism -> for transitioning from HTTP/1.1 to some other protocol on the same -> connection. - -In Node.js, these request objects come from the `'upgrade'` event on -the HTTP server. - -When this module is used on a HTTP request with an `Upgrade` header, the -request is considered "finished" immediately, **due to limitations in the -Node.js interface**. This means if the `Upgrade` request contains a request -entity, the request will be considered "finished" even before it has been -read. - -There is no such thing as a response object to a `Upgrade` request in -Node.js, so there is no support for for one. - -## Example - -The following code ensures that file descriptors are always closed -once the response finishes. - -```js -var destroy = require('destroy') -var http = require('http') -var onFinished = require('on-finished') - -http.createServer(function onRequest(req, res) { - var stream = fs.createReadStream('package.json') - stream.pipe(res) - onFinished(res, function (err) { - destroy(stream) - }) -}) -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/on-finished.svg -[npm-url]: https://npmjs.org/package/on-finished -[node-version-image]: https://img.shields.io/node/v/on-finished.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/on-finished/master.svg -[travis-url]: https://travis-ci.org/jshttp/on-finished -[coveralls-image]: https://img.shields.io/coveralls/jshttp/on-finished/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/on-finished?branch=master -[downloads-image]: https://img.shields.io/npm/dm/on-finished.svg -[downloads-url]: https://npmjs.org/package/on-finished diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/index.js deleted file mode 100644 index 9abd98f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/index.js +++ /dev/null @@ -1,196 +0,0 @@ -/*! - * on-finished - * Copyright(c) 2013 Jonathan Ong - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - * @public - */ - -module.exports = onFinished -module.exports.isFinished = isFinished - -/** - * Module dependencies. - * @private - */ - -var first = require('ee-first') - -/** - * Variables. - * @private - */ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Invoke callback when the response has finished, useful for - * cleaning up resources afterwards. - * - * @param {object} msg - * @param {function} listener - * @return {object} - * @public - */ - -function onFinished(msg, listener) { - if (isFinished(msg) !== false) { - defer(listener, null, msg) - return msg - } - - // attach the listener to the message - attachListener(msg, listener) - - return msg -} - -/** - * Determine if message is already finished. - * - * @param {object} msg - * @return {boolean} - * @public - */ - -function isFinished(msg) { - var socket = msg.socket - - if (typeof msg.finished === 'boolean') { - // OutgoingMessage - return Boolean(msg.finished || (socket && !socket.writable)) - } - - if (typeof msg.complete === 'boolean') { - // IncomingMessage - return Boolean(msg.upgrade || !socket || !socket.readable || (msg.complete && !msg.readable)) - } - - // don't know - return undefined -} - -/** - * Attach a finished listener to the message. - * - * @param {object} msg - * @param {function} callback - * @private - */ - -function attachFinishedListener(msg, callback) { - var eeMsg - var eeSocket - var finished = false - - function onFinish(error) { - eeMsg.cancel() - eeSocket.cancel() - - finished = true - callback(error) - } - - // finished on first message event - eeMsg = eeSocket = first([[msg, 'end', 'finish']], onFinish) - - function onSocket(socket) { - // remove listener - msg.removeListener('socket', onSocket) - - if (finished) return - if (eeMsg !== eeSocket) return - - // finished on first socket event - eeSocket = first([[socket, 'error', 'close']], onFinish) - } - - if (msg.socket) { - // socket already assigned - onSocket(msg.socket) - return - } - - // wait for socket to be assigned - msg.on('socket', onSocket) - - if (msg.socket === undefined) { - // node.js 0.8 patch - patchAssignSocket(msg, onSocket) - } -} - -/** - * Attach the listener to the message. - * - * @param {object} msg - * @return {function} - * @private - */ - -function attachListener(msg, listener) { - var attached = msg.__onFinished - - // create a private single listener with queue - if (!attached || !attached.queue) { - attached = msg.__onFinished = createListener(msg) - attachFinishedListener(msg, attached) - } - - attached.queue.push(listener) -} - -/** - * Create listener on message. - * - * @param {object} msg - * @return {function} - * @private - */ - -function createListener(msg) { - function listener(err) { - if (msg.__onFinished === listener) msg.__onFinished = null - if (!listener.queue) return - - var queue = listener.queue - listener.queue = null - - for (var i = 0; i < queue.length; i++) { - queue[i](err, msg) - } - } - - listener.queue = [] - - return listener -} - -/** - * Patch ServerResponse.prototype.assignSocket for node.js 0.8. - * - * @param {ServerResponse} res - * @param {function} callback - * @private - */ - -function patchAssignSocket(res, callback) { - var assignSocket = res.assignSocket - - if (typeof assignSocket !== 'function') return - - // res.on('socket', callback) is broken in 0.8 - res.assignSocket = function _assignSocket(socket) { - assignSocket.call(this, socket) - callback(socket) - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md deleted file mode 100644 index cbd2478..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md +++ /dev/null @@ -1,80 +0,0 @@ -# EE First - -[![NPM version][npm-image]][npm-url] -[![Build status][travis-image]][travis-url] -[![Test coverage][coveralls-image]][coveralls-url] -[![License][license-image]][license-url] -[![Downloads][downloads-image]][downloads-url] -[![Gittip][gittip-image]][gittip-url] - -Get the first event in a set of event emitters and event pairs, -then clean up after itself. - -## Install - -```sh -$ npm install ee-first -``` - -## API - -```js -var first = require('ee-first') -``` - -### first(arr, listener) - -Invoke `listener` on the first event from the list specified in `arr`. `arr` is -an array of arrays, with each array in the format `[ee, ...event]`. `listener` -will be called only once, the first time any of the given events are emitted. If -`error` is one of the listened events, then if that fires first, the `listener` -will be given the `err` argument. - -The `listener` is invoked as `listener(err, ee, event, args)`, where `err` is the -first argument emitted from an `error` event, if applicable; `ee` is the event -emitter that fired; `event` is the string event name that fired; and `args` is an -array of the arguments that were emitted on the event. - -```js -var ee1 = new EventEmitter() -var ee2 = new EventEmitter() - -first([ - [ee1, 'close', 'end', 'error'], - [ee2, 'error'] -], function (err, ee, event, args) { - // listener invoked -}) -``` - -#### .cancel() - -The group of listeners can be cancelled before being invoked and have all the event -listeners removed from the underlying event emitters. - -```js -var thunk = first([ - [ee1, 'close', 'end', 'error'], - [ee2, 'error'] -], function (err, ee, event, args) { - // listener invoked -}) - -// cancel and clean up -thunk.cancel() -``` - -[npm-image]: https://img.shields.io/npm/v/ee-first.svg?style=flat-square -[npm-url]: https://npmjs.org/package/ee-first -[github-tag]: http://img.shields.io/github/tag/jonathanong/ee-first.svg?style=flat-square -[github-url]: https://github.com/jonathanong/ee-first/tags -[travis-image]: https://img.shields.io/travis/jonathanong/ee-first.svg?style=flat-square -[travis-url]: https://travis-ci.org/jonathanong/ee-first -[coveralls-image]: https://img.shields.io/coveralls/jonathanong/ee-first.svg?style=flat-square -[coveralls-url]: https://coveralls.io/r/jonathanong/ee-first?branch=master -[license-image]: http://img.shields.io/npm/l/ee-first.svg?style=flat-square -[license-url]: LICENSE.md -[downloads-image]: http://img.shields.io/npm/dm/ee-first.svg?style=flat-square -[downloads-url]: https://npmjs.org/package/ee-first -[gittip-image]: https://img.shields.io/gittip/jonathanong.svg?style=flat-square -[gittip-url]: https://www.gittip.com/jonathanong/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js deleted file mode 100644 index 501287c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js +++ /dev/null @@ -1,95 +0,0 @@ -/*! - * ee-first - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - * @public - */ - -module.exports = first - -/** - * Get the first event in a set of event emitters and event pairs. - * - * @param {array} stuff - * @param {function} done - * @public - */ - -function first(stuff, done) { - if (!Array.isArray(stuff)) - throw new TypeError('arg must be an array of [ee, events...] arrays') - - var cleanups = [] - - for (var i = 0; i < stuff.length; i++) { - var arr = stuff[i] - - if (!Array.isArray(arr) || arr.length < 2) - throw new TypeError('each array member must be [ee, events...]') - - var ee = arr[0] - - for (var j = 1; j < arr.length; j++) { - var event = arr[j] - var fn = listener(event, callback) - - // listen to the event - ee.on(event, fn) - // push this listener to the list of cleanups - cleanups.push({ - ee: ee, - event: event, - fn: fn, - }) - } - } - - function callback() { - cleanup() - done.apply(null, arguments) - } - - function cleanup() { - var x - for (var i = 0; i < cleanups.length; i++) { - x = cleanups[i] - x.ee.removeListener(x.event, x.fn) - } - } - - function thunk(fn) { - done = fn - } - - thunk.cancel = cleanup - - return thunk -} - -/** - * Create the event listener. - * @private - */ - -function listener(event, done) { - return function onevent(arg1) { - var args = new Array(arguments.length) - var ee = this - var err = event === 'error' - ? arg1 - : null - - // copy args to prevent arguments escaping scope - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - done(err, ee, event, args) - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json deleted file mode 100644 index 14d9289..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "ee-first", - "description": "return the first event in a set of ee/event pairs", - "version": "1.1.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jonathanong/ee-first" - }, - "devDependencies": { - "istanbul": "0.3.9", - "mocha": "2.2.5" - }, - "files": [ - "index.js", - "LICENSE" - ], - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "512e0ce4cc3643f603708f965a97b61b1a9c0441", - "bugs": { - "url": "https://github.com/jonathanong/ee-first/issues" - }, - "homepage": "https://github.com/jonathanong/ee-first", - "_id": "ee-first@1.1.1", - "_shasum": "590c61156b0ae2f4f0255732a158b266bc56b21d", - "_from": "ee-first@1.1.1", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "590c61156b0ae2f4f0255732a158b266bc56b21d", - "tarball": "http://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/package.json deleted file mode 100644 index ff6250e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/on-finished/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "on-finished", - "description": "Execute a callback when a request closes, finishes, or errors", - "version": "2.3.0", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jshttp/on-finished" - }, - "dependencies": { - "ee-first": "1.1.1" - }, - "devDependencies": { - "istanbul": "0.3.9", - "mocha": "2.2.5" - }, - "engines": { - "node": ">= 0.8" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "index.js" - ], - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "34babcb58126a416fcf5205768204f2e12699dda", - "bugs": { - "url": "https://github.com/jshttp/on-finished/issues" - }, - "homepage": "https://github.com/jshttp/on-finished", - "_id": "on-finished@2.3.0", - "_shasum": "20f1336481b083cd75337992a16971aa2d906947", - "_from": "on-finished@>=2.3.0 <2.4.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "20f1336481b083cd75337992a16971aa2d906947", - "tarball": "http://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/.npmignore deleted file mode 100644 index 85c82a5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -benchmark/ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/HISTORY.md deleted file mode 100644 index 65a0860..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/HISTORY.md +++ /dev/null @@ -1,42 +0,0 @@ -1.3.0 / 2014-08-09 -================== - - * Add `parseurl.original` for parsing `req.originalUrl` with fallback - * Return `undefined` if `req.url` is `undefined` - -1.2.0 / 2014-07-21 -================== - - * Cache URLs based on original value - * Remove no-longer-needed URL mis-parse work-around - * Simplify the "fast-path" `RegExp` - -1.1.3 / 2014-07-08 -================== - - * Fix typo - -1.1.2 / 2014-07-08 -================== - - * Seriously fix Node.js 0.8 compatibility - -1.1.1 / 2014-07-08 -================== - - * Fix Node.js 0.8 compatibility - -1.1.0 / 2014-07-08 -================== - - * Incorporate URL href-only parse fast-path - -1.0.1 / 2014-03-08 -================== - - * Add missing `require` - -1.0.0 / 2014-03-08 -================== - - * Genesis from `connect` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/LICENSE deleted file mode 100644 index ec7dfe7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ - -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/README.md deleted file mode 100644 index 0db1d02..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/README.md +++ /dev/null @@ -1,107 +0,0 @@ -# parseurl - -[![NPM version](https://badge.fury.io/js/parseurl.svg)](http://badge.fury.io/js/parseurl) -[![Build Status](https://travis-ci.org/expressjs/parseurl.svg?branch=master)](https://travis-ci.org/expressjs/parseurl) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/parseurl.svg?branch=master)](https://coveralls.io/r/expressjs/parseurl) - -Parse a URL with memoization. - -## Install - -```bash -$ npm install parseurl -``` - -## API - -```js -var parseurl = require('parseurl') -``` - -### parseurl(req) - -Parse the URL of the given request object (looks at the `req.url` property) -and return the result. The result is the same as `url.parse` in Node.js core. -Calling this function multiple times on the same `req` where `req.url` does -not change will return a cached parsed object, rather than parsing again. - -### parseurl.original(req) - -Parse the original URL of the given request object and return the result. -This works by trying to parse `req.originalUrl` if it is a string, otherwise -parses `req.url`. The result is the same as `url.parse` in Node.js core. -Calling this function multiple times on the same `req` where `req.originalUrl` -does not change will return a cached parsed object, rather than parsing again. - -## Benchmark - -```bash -$ npm run-script bench - -> parseurl@1.3.0 bench nodejs-parseurl -> node benchmark/index.js - -> node benchmark/fullurl.js - - Parsing URL "http://localhost:8888/foo/bar?user=tj&pet=fluffy" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 1,290,780 ops/sec ±0.46% (195 runs sampled) - nativeurl x 56,401 ops/sec ±0.22% (196 runs sampled) - parseurl x 55,231 ops/sec ±0.22% (194 runs sampled) - -> node benchmark/pathquery.js - - Parsing URL "/foo/bar?user=tj&pet=fluffy" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 1,986,668 ops/sec ±0.27% (190 runs sampled) - nativeurl x 98,740 ops/sec ±0.21% (195 runs sampled) - parseurl x 2,628,171 ops/sec ±0.36% (195 runs sampled) - -> node benchmark/samerequest.js - - Parsing URL "/foo/bar?user=tj&pet=fluffy" on same request object - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 2,184,468 ops/sec ±0.40% (194 runs sampled) - nativeurl x 99,437 ops/sec ±0.71% (194 runs sampled) - parseurl x 10,498,005 ops/sec ±0.61% (186 runs sampled) - -> node benchmark/simplepath.js - - Parsing URL "/foo/bar" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 4,535,825 ops/sec ±0.27% (191 runs sampled) - nativeurl x 98,769 ops/sec ±0.54% (191 runs sampled) - parseurl x 4,164,865 ops/sec ±0.34% (192 runs sampled) - -> node benchmark/slash.js - - Parsing URL "/" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 4,908,405 ops/sec ±0.42% (191 runs sampled) - nativeurl x 100,945 ops/sec ±0.59% (188 runs sampled) - parseurl x 4,333,208 ops/sec ±0.27% (194 runs sampled) -``` - -## License - - [MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/index.js deleted file mode 100644 index 8632347..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/index.js +++ /dev/null @@ -1,136 +0,0 @@ -/*! - * parseurl - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var url = require('url') -var parse = url.parse -var Url = url.Url - -/** - * Pattern for a simple path case. - * See: https://github.com/joyent/node/pull/7878 - */ - -var simplePathRegExp = /^(\/\/?(?!\/)[^\?#\s]*)(\?[^#\s]*)?$/ - -/** - * Exports. - */ - -module.exports = parseurl -module.exports.original = originalurl - -/** - * Parse the `req` url with memoization. - * - * @param {ServerRequest} req - * @return {Object} - * @api public - */ - -function parseurl(req) { - var url = req.url - - if (url === undefined) { - // URL is undefined - return undefined - } - - var parsed = req._parsedUrl - - if (fresh(url, parsed)) { - // Return cached URL parse - return parsed - } - - // Parse the URL - parsed = fastparse(url) - parsed._raw = url - - return req._parsedUrl = parsed -}; - -/** - * Parse the `req` original url with fallback and memoization. - * - * @param {ServerRequest} req - * @return {Object} - * @api public - */ - -function originalurl(req) { - var url = req.originalUrl - - if (typeof url !== 'string') { - // Fallback - return parseurl(req) - } - - var parsed = req._parsedOriginalUrl - - if (fresh(url, parsed)) { - // Return cached URL parse - return parsed - } - - // Parse the URL - parsed = fastparse(url) - parsed._raw = url - - return req._parsedOriginalUrl = parsed -}; - -/** - * Parse the `str` url with fast-path short-cut. - * - * @param {string} str - * @return {Object} - * @api private - */ - -function fastparse(str) { - // Try fast path regexp - // See: https://github.com/joyent/node/pull/7878 - var simplePath = typeof str === 'string' && simplePathRegExp.exec(str) - - // Construct simple URL - if (simplePath) { - var pathname = simplePath[1] - var search = simplePath[2] || null - var url = Url !== undefined - ? new Url() - : {} - url.path = str - url.href = str - url.pathname = pathname - url.search = search - url.query = search && search.substr(1) - - return url - } - - return parse(str) -} - -/** - * Determine if parsed is still fresh for url. - * - * @param {string} url - * @param {object} parsedUrl - * @return {boolean} - * @api private - */ - -function fresh(url, parsedUrl) { - return typeof parsedUrl === 'object' - && parsedUrl !== null - && (Url === undefined || parsedUrl instanceof Url) - && parsedUrl._raw === url -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/package.json deleted file mode 100644 index 4a6a46b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/parseurl/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "parseurl", - "description": "parse a url with memoization", - "version": "1.3.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/expressjs/parseurl" - }, - "license": "MIT", - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "fast-url-parser": "~1.0.0", - "istanbul": "0.3.0", - "mocha": "~1.21.4" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --check-leaks --bail --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec test/" - }, - "gitHead": "03b7ccca240e2bef5df6c25797e99175d28fb2cb", - "bugs": { - "url": "https://github.com/expressjs/parseurl/issues" - }, - "homepage": "https://github.com/expressjs/parseurl", - "_id": "parseurl@1.3.0", - "_shasum": "b58046db4223e145afa76009e61bac87cc2281b3", - "_from": "parseurl@>=1.3.0 <1.4.0", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "b58046db4223e145afa76009e61bac87cc2281b3", - "tarball": "http://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/History.md deleted file mode 100644 index 7f65878..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/History.md +++ /dev/null @@ -1,36 +0,0 @@ -0.1.7 / 2015-07-28 -================== - - * Fixed regression with escaped round brackets and matching groups. - -0.1.6 / 2015-06-19 -================== - - * Replace `index` feature by outputting all parameters, unnamed and named. - -0.1.5 / 2015-05-08 -================== - - * Add an index property for position in match result. - -0.1.4 / 2015-03-05 -================== - - * Add license information - -0.1.3 / 2014-07-06 -================== - - * Better array support - * Improved support for trailing slash in non-ending mode - -0.1.0 / 2014-03-06 -================== - - * add options.end - -0.0.2 / 2013-02-10 -================== - - * Update to match current express - * add .license property to component.json diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/LICENSE deleted file mode 100644 index 983fbe8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/Readme.md deleted file mode 100644 index 95452a6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/Readme.md +++ /dev/null @@ -1,35 +0,0 @@ -# Path-to-RegExp - -Turn an Express-style path string such as `/user/:name` into a regular expression. - -**Note:** This is a legacy branch. You should upgrade to `1.x`. - -## Usage - -```javascript -var pathToRegexp = require('path-to-regexp'); -``` - -### pathToRegexp(path, keys, options) - - - **path** A string in the express format, an array of such strings, or a regular expression - - **keys** An array to be populated with the keys present in the url. Once the function completes, this will be an array of strings. - - **options** - - **options.sensitive** Defaults to false, set this to true to make routes case sensitive - - **options.strict** Defaults to false, set this to true to make the trailing slash matter. - - **options.end** Defaults to true, set this to false to only match the prefix of the URL. - -```javascript -var keys = []; -var exp = pathToRegexp('/foo/:bar', keys); -//keys = ['bar'] -//exp = /^\/foo\/(?:([^\/]+?))\/?$/i -``` - -## Live Demo - -You can see a live demo of this library in use at [express-route-tester](http://forbeslindesay.github.com/express-route-tester/). - -## License - - MIT diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/index.js deleted file mode 100644 index 500d1da..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/index.js +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Expose `pathtoRegexp`. - */ - -module.exports = pathtoRegexp; - -/** - * Match matching groups in a regular expression. - */ -var MATCHING_GROUP_REGEXP = /\((?!\?)/g; - -/** - * Normalize the given path string, - * returning a regular expression. - * - * An empty array should be passed, - * which will contain the placeholder - * key names. For example "/user/:id" will - * then contain ["id"]. - * - * @param {String|RegExp|Array} path - * @param {Array} keys - * @param {Object} options - * @return {RegExp} - * @api private - */ - -function pathtoRegexp(path, keys, options) { - options = options || {}; - keys = keys || []; - var strict = options.strict; - var end = options.end !== false; - var flags = options.sensitive ? '' : 'i'; - var extraOffset = 0; - var keysOffset = keys.length; - var i = 0; - var name = 0; - var m; - - if (path instanceof RegExp) { - while (m = MATCHING_GROUP_REGEXP.exec(path.source)) { - keys.push({ - name: name++, - optional: false, - offset: m.index - }); - } - - return path; - } - - if (Array.isArray(path)) { - // Map array parts into regexps and return their source. We also pass - // the same keys and options instance into every generation to get - // consistent matching groups before we join the sources together. - path = path.map(function (value) { - return pathtoRegexp(value, keys, options).source; - }); - - return new RegExp('(?:' + path.join('|') + ')', flags); - } - - path = ('^' + path + (strict ? '' : path[path.length - 1] === '/' ? '?' : '/?')) - .replace(/\/\(/g, '/(?:') - .replace(/([\/\.])/g, '\\$1') - .replace(/(\\\/)?(\\\.)?:(\w+)(\(.*?\))?(\*)?(\?)?/g, function (match, slash, format, key, capture, star, optional, offset) { - slash = slash || ''; - format = format || ''; - capture = capture || '([^\\/' + format + ']+?)'; - optional = optional || ''; - - keys.push({ - name: key, - optional: !!optional, - offset: offset + extraOffset - }); - - var result = '' - + (optional ? '' : slash) - + '(?:' - + format + (optional ? slash : '') + capture - + (star ? '((?:[\\/' + format + '].+?)?)' : '') - + ')' - + optional; - - extraOffset += result.length - match.length; - - return result; - }) - .replace(/\*/g, function (star, index) { - var len = keys.length - - while (len-- > keysOffset && keys[len].offset > index) { - keys[len].offset += 3; // Replacement length minus asterisk length. - } - - return '(.*)'; - }); - - // This is a workaround for handling unnamed matching groups. - while (m = MATCHING_GROUP_REGEXP.exec(path)) { - var escapeCount = 0; - var index = m.index; - - while (path.charAt(--index) === '\\') { - escapeCount++; - } - - // It's possible to escape the bracket. - if (escapeCount % 2 === 1) { - continue; - } - - if (keysOffset + i === keys.length || keys[keysOffset + i].offset > m.index) { - keys.splice(keysOffset + i, 0, { - name: name++, // Unnamed matching groups must be consistently linear. - optional: false, - offset: m.index - }); - } - - i++; - } - - // If the path is non-ending, match until the end or a slash. - path += (end ? '$' : (path[path.length - 1] === '/' ? '' : '(?=\\/|$)')); - - return new RegExp(path, flags); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/package.json deleted file mode 100644 index 118b1e6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/path-to-regexp/package.json +++ /dev/null @@ -1,185 +0,0 @@ -{ - "name": "path-to-regexp", - "description": "Express style path to RegExp utility", - "version": "0.1.7", - "files": [ - "index.js", - "LICENSE" - ], - "scripts": { - "test": "istanbul cover _mocha -- -R spec" - }, - "keywords": [ - "express", - "regexp" - ], - "component": { - "scripts": { - "path-to-regexp": "index.js" - } - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/component/path-to-regexp.git" - }, - "devDependencies": { - "mocha": "^1.17.1", - "istanbul": "^0.2.6" - }, - "gitHead": "039118d6c3c186d3f176c73935ca887a32a33d93", - "bugs": { - "url": "https://github.com/component/path-to-regexp/issues" - }, - "homepage": "https://github.com/component/path-to-regexp#readme", - "_id": "path-to-regexp@0.1.7", - "_shasum": "df604178005f522f15eb4490e7247a1bfaa67f8c", - "_from": "path-to-regexp@0.1.7", - "_npmVersion": "2.13.2", - "_nodeVersion": "2.3.3", - "_npmUser": { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "hughsk", - "email": "hughskennedy@gmail.com" - }, - { - "name": "timaschew", - "email": "timaschew@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dominicbarnes", - "email": "dominic@dbarnes.info" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - { - "name": "retrofox", - "email": "rdsuarez@gmail.com" - }, - { - "name": "coreh", - "email": "thecoreh@gmail.com" - }, - { - "name": "forbeslindesay", - "email": "forbes@lindesay.co.uk" - }, - { - "name": "kelonye", - "email": "kelonyemitchel@gmail.com" - }, - { - "name": "mattmueller", - "email": "mattmuelle@gmail.com" - }, - { - "name": "yields", - "email": "yields@icloud.com" - }, - { - "name": "anthonyshort", - "email": "antshort@gmail.com" - }, - { - "name": "ianstormtaylor", - "email": "ian@ianstormtaylor.com" - }, - { - "name": "cristiandouce", - "email": "cristian@gravityonmars.com" - }, - { - "name": "swatinem", - "email": "arpad.borsos@googlemail.com" - }, - { - "name": "stagas", - "email": "gstagas@gmail.com" - }, - { - "name": "amasad", - "email": "amjad.masad@gmail.com" - }, - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - { - "name": "calvinfo", - "email": "calvin@calv.info" - }, - { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - { - "name": "timoxley", - "email": "secoif@gmail.com" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "queckezz", - "email": "fabian.eichenberger@gmail.com" - }, - { - "name": "nami-doc", - "email": "vendethiel@hotmail.fr" - }, - { - "name": "clintwood", - "email": "clint@anotherway.co.za" - }, - { - "name": "thehydroimpulse", - "email": "dnfagnan@gmail.com" - }, - { - "name": "stephenmathieson", - "email": "me@stephenmathieson.com" - }, - { - "name": "trevorgerhardt", - "email": "trevorgerhardt@gmail.com" - }, - { - "name": "dfcreative", - "email": "df.creative@gmail.com" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "df604178005f522f15eb4490e7247a1bfaa67f8c", - "tarball": "http://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/HISTORY.md deleted file mode 100644 index 7248dbb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/HISTORY.md +++ /dev/null @@ -1,66 +0,0 @@ -1.0.8 / 2015-05-10 -================== - - * deps: ipaddr.js@1.0.1 - -1.0.7 / 2015-03-16 -================== - - * deps: ipaddr.js@0.1.9 - - Fix OOM on certain inputs to `isValid` - -1.0.6 / 2015-02-01 -================== - - * deps: ipaddr.js@0.1.8 - -1.0.5 / 2015-01-08 -================== - - * deps: ipaddr.js@0.1.6 - -1.0.4 / 2014-11-23 -================== - - * deps: ipaddr.js@0.1.5 - - Fix edge cases with `isValid` - -1.0.3 / 2014-09-21 -================== - - * Use `forwarded` npm module - -1.0.2 / 2014-09-18 -================== - - * Fix a global leak when multiple subnets are trusted - * Support Node.js 0.6 - * deps: ipaddr.js@0.1.3 - -1.0.1 / 2014-06-03 -================== - - * Fix links in npm package - -1.0.0 / 2014-05-08 -================== - - * Add `trust` argument to determine proxy trust on - * Accepts custom function - * Accepts IPv4/IPv6 address(es) - * Accepts subnets - * Accepts pre-defined names - * Add optional `trust` argument to `proxyaddr.all` to - stop at first untrusted - * Add `proxyaddr.compile` to pre-compile `trust` function - to make subsequent calls faster - -0.0.1 / 2014-05-04 -================== - - * Fix bad npm publish - -0.0.0 / 2014-05-04 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/README.md deleted file mode 100644 index 26f7fc0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/README.md +++ /dev/null @@ -1,137 +0,0 @@ -# proxy-addr - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Determine address of proxied request - -## Install - -```sh -$ npm install proxy-addr -``` - -## API - -```js -var proxyaddr = require('proxy-addr') -``` - -### proxyaddr(req, trust) - -Return the address of the request, using the given `trust` parameter. - -The `trust` argument is a function that returns `true` if you trust -the address, `false` if you don't. The closest untrusted address is -returned. - -```js -proxyaddr(req, function(addr){ return addr === '127.0.0.1' }) -proxyaddr(req, function(addr, i){ return i < 1 }) -``` - -The `trust` arugment may also be a single IP address string or an -array of trusted addresses, as plain IP addresses, CIDR-formatted -strings, or IP/netmask strings. - -```js -proxyaddr(req, '127.0.0.1') -proxyaddr(req, ['127.0.0.0/8', '10.0.0.0/8']) -proxyaddr(req, ['127.0.0.0/255.0.0.0', '192.168.0.0/255.255.0.0']) -``` - -This module also supports IPv6. Your IPv6 addresses will be normalized -automatically (i.e. `fe80::00ed:1` equals `fe80:0:0:0:0:0:ed:1`). - -```js -proxyaddr(req, '::1') -proxyaddr(req, ['::1/128', 'fe80::/10']) -proxyaddr(req, ['fe80::/ffc0::']) -``` - -This module will automatically work with IPv4-mapped IPv6 addresses -as well to support node.js in IPv6-only mode. This means that you do -not have to specify both `::ffff:a00:1` and `10.0.0.1`. - -As a convenience, this module also takes certain pre-defined names -in addition to IP addresses, which expand into IP addresses: - -```js -proxyaddr(req, 'loopback') -proxyaddr(req, ['loopback', 'fc00:ac:1ab5:fff::1/64']) -``` - - * `loopback`: IPv4 and IPv6 loopback addresses (like `::1` and - `127.0.0.1`). - * `linklocal`: IPv4 and IPv6 link-local addresses (like - `fe80::1:1:1:1` and `169.254.0.1`). - * `uniquelocal`: IPv4 private addresses and IPv6 unique-local - addresses (like `fc00:ac:1ab5:fff::1` and `192.168.0.1`). - -When `trust` is specified as a function, it will be called for each -address to determine if it is a trusted address. The function is -given two arguments: `addr` and `i`, where `addr` is a string of -the address to check and `i` is a number that represents the distance -from the socket address. - -### proxyaddr.all(req, [trust]) - -Return all the addresses of the request, optionally stopping at the -first untrusted. This array is ordered from closest to furthest -(i.e. `arr[0] === req.connection.remoteAddress`). - -```js -proxyaddr.all(req) -``` - -The optional `trust` argument takes the same arguments as `trust` -does in `proxyaddr(req, trust)`. - -```js -proxyaddr.all(req, 'loopback') -``` - -### proxyaddr.compile(val) - -Compiles argument `val` into a `trust` function. This function takes -the same arguments as `trust` does in `proxyaddr(req, trust)` and -returns a function suitable for `proxyaddr(req, trust)`. - -```js -var trust = proxyaddr.compile('localhost') -var addr = proxyaddr(req, trust) -``` - -This function is meant to be optimized for use against every request. -It is recommend to compile a trust function up-front for the trusted -configuration and pass that to `proxyaddr(req, trust)` for each request. - -## Testing - -```sh -$ npm test -``` - -## Benchmarks - -```sh -$ npm run-script bench -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/proxy-addr.svg -[npm-url]: https://npmjs.org/package/proxy-addr -[node-version-image]: https://img.shields.io/node/v/proxy-addr.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/proxy-addr/master.svg -[travis-url]: https://travis-ci.org/jshttp/proxy-addr -[coveralls-image]: https://img.shields.io/coveralls/jshttp/proxy-addr/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/proxy-addr?branch=master -[downloads-image]: https://img.shields.io/npm/dm/proxy-addr.svg -[downloads-url]: https://npmjs.org/package/proxy-addr diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/index.js deleted file mode 100644 index d739513..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/index.js +++ /dev/null @@ -1,345 +0,0 @@ -/*! - * proxy-addr - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = proxyaddr; -module.exports.all = alladdrs; -module.exports.compile = compile; - -/** - * Module dependencies. - */ - -var forwarded = require('forwarded'); -var ipaddr = require('ipaddr.js'); - -/** - * Variables. - */ - -var digitre = /^[0-9]+$/; -var isip = ipaddr.isValid; -var parseip = ipaddr.parse; - -/** - * Pre-defined IP ranges. - */ - -var ipranges = { - linklocal: ['169.254.0.0/16', 'fe80::/10'], - loopback: ['127.0.0.1/8', '::1/128'], - uniquelocal: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fc00::/7'] -}; - -/** - * Get all addresses in the request, optionally stopping - * at the first untrusted. - * - * @param {Object} request - * @param {Function|Array|String} [trust] - * @api public - */ - -function alladdrs(req, trust) { - // get addresses - var addrs = forwarded(req); - - if (!trust) { - // Return all addresses - return addrs; - } - - if (typeof trust !== 'function') { - trust = compile(trust); - } - - for (var i = 0; i < addrs.length - 1; i++) { - if (trust(addrs[i], i)) continue; - - addrs.length = i + 1; - } - - return addrs; -} - -/** - * Compile argument into trust function. - * - * @param {Array|String} val - * @api private - */ - -function compile(val) { - if (!val) { - throw new TypeError('argument is required'); - } - - var trust = typeof val === 'string' - ? [val] - : val; - - if (!Array.isArray(trust)) { - throw new TypeError('unsupported trust argument'); - } - - for (var i = 0; i < trust.length; i++) { - val = trust[i]; - - if (!ipranges.hasOwnProperty(val)) { - continue; - } - - // Splice in pre-defined range - val = ipranges[val]; - trust.splice.apply(trust, [i, 1].concat(val)); - i += val.length - 1; - } - - return compileTrust(compileRangeSubnets(trust)); -} - -/** - * Compile `arr` elements into range subnets. - * - * @param {Array} arr - * @api private - */ - -function compileRangeSubnets(arr) { - var rangeSubnets = new Array(arr.length); - - for (var i = 0; i < arr.length; i++) { - rangeSubnets[i] = parseipNotation(arr[i]); - } - - return rangeSubnets; -} - -/** - * Compile range subnet array into trust function. - * - * @param {Array} rangeSubnets - * @api private - */ - -function compileTrust(rangeSubnets) { - // Return optimized function based on length - var len = rangeSubnets.length; - return len === 0 - ? trustNone - : len === 1 - ? trustSingle(rangeSubnets[0]) - : trustMulti(rangeSubnets); -} - -/** - * Parse IP notation string into range subnet. - * - * @param {String} note - * @api private - */ - -function parseipNotation(note) { - var ip; - var kind; - var max; - var pos = note.lastIndexOf('/'); - var range; - - ip = pos !== -1 - ? note.substring(0, pos) - : note; - - if (!isip(ip)) { - throw new TypeError('invalid IP address: ' + ip); - } - - ip = parseip(ip); - - kind = ip.kind(); - max = kind === 'ipv6' - ? 128 - : 32; - - range = pos !== -1 - ? note.substring(pos + 1, note.length) - : max; - - if (typeof range !== 'number') { - range = digitre.test(range) - ? parseInt(range, 10) - : isip(range) - ? parseNetmask(range) - : 0; - } - - if (ip.kind() === 'ipv6' && ip.isIPv4MappedAddress()) { - // Store as IPv4 - ip = ip.toIPv4Address(); - range = range <= max - ? range - 96 - : range; - } - - if (range <= 0 || range > max) { - throw new TypeError('invalid range on address: ' + note); - } - - return [ip, range]; -} - -/** - * Parse netmask string into CIDR range. - * - * @param {String} note - * @api private - */ - -function parseNetmask(netmask) { - var ip = parseip(netmask); - var parts; - var size; - - switch (ip.kind()) { - case 'ipv4': - parts = ip.octets; - size = 8; - break; - case 'ipv6': - parts = ip.parts; - size = 16; - break; - } - - var max = Math.pow(2, size) - 1; - var part; - var range = 0; - - for (var i = 0; i < parts.length; i++) { - part = parts[i] & max; - - if (part === max) { - range += size; - continue; - } - - while (part) { - part = (part << 1) & max; - range += 1; - } - - break; - } - - return range; -} - -/** - * Determine address of proxied request. - * - * @param {Object} request - * @param {Function|Array|String} trust - * @api public - */ - -function proxyaddr(req, trust) { - if (!req) { - throw new TypeError('req argument is required'); - } - - if (!trust) { - throw new TypeError('trust argument is required'); - } - - var addrs = alladdrs(req, trust); - var addr = addrs[addrs.length - 1]; - - return addr; -} - -/** - * Static trust function to trust nothing. - * - * @api private - */ - -function trustNone() { - return false; -} - -/** - * Compile trust function for multiple subnets. - * - * @param {Array} subnets - * @api private - */ - -function trustMulti(subnets) { - return function trust(addr) { - if (!isip(addr)) return false; - - var ip = parseip(addr); - var ipv4; - var kind = ip.kind(); - var subnet; - var subnetip; - var subnetkind; - var subnetrange; - var trusted; - - for (var i = 0; i < subnets.length; i++) { - subnet = subnets[i]; - subnetip = subnet[0]; - subnetkind = subnetip.kind(); - subnetrange = subnet[1]; - trusted = ip; - - if (kind !== subnetkind) { - if (kind !== 'ipv6' || subnetkind !== 'ipv4' || !ip.isIPv4MappedAddress()) { - continue; - } - - // Store addr as IPv4 - ipv4 = ipv4 || ip.toIPv4Address(); - trusted = ipv4; - } - - if (trusted.match(subnetip, subnetrange)) return true; - } - - return false; - }; -} - -/** - * Compile trust function for single subnet. - * - * @param {Object} subnet - * @api private - */ - -function trustSingle(subnet) { - var subnetip = subnet[0]; - var subnetkind = subnetip.kind(); - var subnetisipv4 = subnetkind === 'ipv4'; - var subnetrange = subnet[1]; - - return function trust(addr) { - if (!isip(addr)) return false; - - var ip = parseip(addr); - var kind = ip.kind(); - - return kind === subnetkind - ? ip.match(subnetip, subnetrange) - : subnetisipv4 && kind === 'ipv6' && ip.isIPv4MappedAddress() - ? ip.toIPv4Address().match(subnetip, subnetrange) - : false; - }; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md deleted file mode 100644 index 97fa1d1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md +++ /dev/null @@ -1,4 +0,0 @@ -0.1.0 / 2014-09-21 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md deleted file mode 100644 index 2b4988f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# forwarded - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Parse HTTP X-Forwarded-For header - -## Installation - -```sh -$ npm install forwarded -``` - -## API - -```js -var forwarded = require('forwarded') -``` - -### forwarded(req) - -```js -var addresses = forwarded(req) -``` - -Parse the `X-Forwarded-For` header from the request. Returns an array -of the addresses, including the socket address for the `req`. In reverse -order (i.e. index `0` is the socket address and the last index is the -furthest address, typically the end-user). - -## Testing - -```sh -$ npm test -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/forwarded.svg?style=flat -[npm-url]: https://npmjs.org/package/forwarded -[node-version-image]: https://img.shields.io/node/v/forwarded.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/forwarded.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/forwarded -[coveralls-image]: https://img.shields.io/coveralls/jshttp/forwarded.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/forwarded?branch=master -[downloads-image]: https://img.shields.io/npm/dm/forwarded.svg?style=flat -[downloads-url]: https://npmjs.org/package/forwarded diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js deleted file mode 100644 index 2f5c340..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js +++ /dev/null @@ -1,35 +0,0 @@ -/*! - * forwarded - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = forwarded - -/** - * Get all addresses in the request, using the `X-Forwarded-For` header. - * - * @param {Object} req - * @api public - */ - -function forwarded(req) { - if (!req) { - throw new TypeError('argument req is required') - } - - // simple header parsing - var proxyAddrs = (req.headers['x-forwarded-for'] || '') - .split(/ *, */) - .filter(Boolean) - .reverse() - var socketAddr = req.connection.remoteAddress - var addrs = [socketAddr].concat(proxyAddrs) - - // return all addresses - return addrs -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json deleted file mode 100644 index fa8af9e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "forwarded", - "description": "Parse HTTP X-Forwarded-For header", - "version": "0.1.0", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "keywords": [ - "x-forwarded-for", - "http", - "req" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/forwarded" - }, - "devDependencies": { - "istanbul": "0.3.2", - "mocha": "~1.21.4" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "e9a9faeb3cfaadf40eb57d144fff26bca9b818e8", - "bugs": { - "url": "https://github.com/jshttp/forwarded/issues" - }, - "homepage": "https://github.com/jshttp/forwarded", - "_id": "forwarded@0.1.0", - "_shasum": "19ef9874c4ae1c297bcf078fde63a09b66a84363", - "_from": "forwarded@>=0.1.0 <0.2.0", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "19ef9874c4ae1c297bcf078fde63a09b66a84363", - "tarball": "http://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore deleted file mode 100644 index 7a1537b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.idea -node_modules diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile deleted file mode 100644 index 7fd355a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile +++ /dev/null @@ -1,18 +0,0 @@ -fs = require 'fs' -CoffeeScript = require 'coffee-script' -nodeunit = require 'nodeunit' -UglifyJS = require 'uglify-js' - -task 'build', 'build the JavaScript files from CoffeeScript source', build = (cb) -> - source = fs.readFileSync 'src/ipaddr.coffee' - fs.writeFileSync 'lib/ipaddr.js', CoffeeScript.compile source.toString() - - invoke 'test' - invoke 'compress' - -task 'test', 'run the bundled tests', (cb) -> - nodeunit.reporters.default.run ['test'] - -task 'compress', 'uglify the resulting javascript', (cb) -> - result = UglifyJS.minify('lib/ipaddr.js') - fs.writeFileSync('ipaddr.min.js', result.code) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE deleted file mode 100644 index 3493f0d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2011 Peter Zotov - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md deleted file mode 100644 index c596e7e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md +++ /dev/null @@ -1,161 +0,0 @@ -# ipaddr.js — an IPv6 and IPv4 address manipulation library - -ipaddr.js is a small (1.9K minified and gzipped) library for manipulating -IP addresses in JavaScript environments. It runs on both CommonJS runtimes -(e.g. [nodejs]) and in a web browser. - -ipaddr.js allows you to verify and parse string representation of an IP -address, match it against a CIDR range or range list, determine if it falls -into some reserved ranges (examples include loopback and private ranges), -and convert between IPv4 and IPv4-mapped IPv6 addresses. - -[nodejs]: http://nodejs.org - -## Installation - -`npm install ipaddr.js` - -## API - -ipaddr.js defines one object in the global scope: `ipaddr`. In CommonJS, -it is exported from the module: - -```js -var ipaddr = require('ipaddr.js'); -``` - -The API consists of several global methods and two classes: ipaddr.IPv6 and ipaddr.IPv4. - -### Global methods - -There are three global methods defined: `ipaddr.isValid`, `ipaddr.parse` and -`ipaddr.process`. All of them receive a string as a single parameter. - -The `ipaddr.isValid` method returns `true` if the address is a valid IPv4 or -IPv6 address, and `false` otherwise. It does not throw any exceptions. - -The `ipaddr.parse` method returns an object representing the IP address, -or throws an `Error` if the passed string is not a valid representation of an -IP address. - -The `ipaddr.process` method works just like the `ipaddr.parse` one, but it -automatically converts IPv4-mapped IPv6 addresses to their IPv4 couterparts -before returning. It is useful when you have a Node.js instance listening -on an IPv6 socket, and the `net.ivp6.bindv6only` sysctl parameter (or its -equivalent on non-Linux OS) is set to 0. In this case, you can accept IPv4 -connections on your IPv6-only socket, but the remote address will be mangled. -Use `ipaddr.process` method to automatically demangle it. - -### Object representation - -Parsing methods return an object which descends from `ipaddr.IPv6` or -`ipaddr.IPv4`. These objects share some properties, but most of them differ. - -#### Shared properties - -One can determine the type of address by calling `addr.kind()`. It will return -either `"ipv6"` or `"ipv4"`. - -An address can be converted back to its string representation with `addr.toString()`. -Note that this method: - * does not return the original string used to create the object (in fact, there is - no way of getting that string) - * returns a compact representation (when it is applicable) - -A `match(range, bits)` method can be used to check if the address falls into a -certain CIDR range. -Note that an address can be (obviously) matched only against an address of the same type. - -For example: - -```js -var addr = ipaddr.parse("2001:db8:1234::1"); -var range = ipaddr.parse("2001:db8::"); - -addr.match(range, 32); // => true -``` - -Alternatively, `match` can also be called as `match([range, bits])`. In this way, -it can be used together with the `parseCIDR(string)` method, which parses an IP -address together with a CIDR range. - -For example: - -```js -var addr = ipaddr.parse("2001:db8:1234::1"); - -addr.match(ipaddr.parseCIDR("2001:db8::/32")); // => true -``` - -A `range()` method returns one of predefined names for several special ranges defined -by IP protocols. The exact names (and their respective CIDR ranges) can be looked up -in the source: [IPv6 ranges] and [IPv4 ranges]. Some common ones include `"unicast"` -(the default one) and `"reserved"`. - -You can match against your own range list by using -`ipaddr.subnetMatch(address, rangeList, defaultName)` method. It can work with both -IPv6 and IPv4 addresses, and accepts a name-to-subnet map as the range list. For example: - -```js -var rangeList = { - documentationOnly: [ ipaddr.parse('2001:db8::'), 32 ], - tunnelProviders: [ - [ ipaddr.parse('2001:470::'), 32 ], // he.net - [ ipaddr.parse('2001:5c0::'), 32 ] // freenet6 - ] -}; -ipaddr.subnetMatch(ipaddr.parse('2001:470:8:66::1'), rangeList, 'unknown'); // => "he.net" -``` - -The addresses can be converted to their byte representation with `toByteArray()`. -(Actually, JavaScript mostly does not know about byte buffers. They are emulated with -arrays of numbers, each in range of 0..255.) - -```js -var bytes = ipaddr.parse('2a00:1450:8007::68').toByteArray(); // ipv6.google.com -bytes // => [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, , 0x00, 0x68 ] -``` - -The `ipaddr.IPv4` and `ipaddr.IPv6` objects have some methods defined, too. All of them -have the same interface for both protocols, and are similar to global methods. - -`ipaddr.IPvX.isValid(string)` can be used to check if the string is a valid address -for particular protocol, and `ipaddr.IPvX.parse(string)` is the error-throwing parser. - -[IPv6 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L186 -[IPv4 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L71 - -#### IPv6 properties - -Sometimes you will want to convert IPv6 not to a compact string representation (with -the `::` substitution); the `toNormalizedString()` method will return an address where -all zeroes are explicit. - -For example: - -```js -var addr = ipaddr.parse("2001:0db8::0001"); -addr.toString(); // => "2001:db8::1" -addr.toNormalizedString(); // => "2001:db8:0:0:0:0:0:1" -``` - -The `isIPv4MappedAddress()` method will return `true` if this address is an IPv4-mapped -one, and `toIPv4Address()` will return an IPv4 object address. - -To access the underlying binary representation of the address, use `addr.parts`. - -```js -var addr = ipaddr.parse("2001:db8:10::1234:DEAD"); -addr.parts // => [0x2001, 0xdb8, 0x10, 0, 0, 0, 0x1234, 0xdead] -``` - -#### IPv4 properties - -`toIPv4MappedAddress()` will return a corresponding IPv4-mapped IPv6 address. - -To access the underlying representation of the address, use `addr.octets`. - -```js -var addr = ipaddr.parse("192.168.1.1"); -addr.octets // => [192, 168, 1, 1] -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js deleted file mode 100644 index 9e2800d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var r,t,e,n,i,o,a,s;t={},s=this,"undefined"!=typeof module&&null!==module&&module.exports?module.exports=t:s.ipaddr=t,a=function(r,t,e,n){var i,o;if(r.length!==t.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;n>0;){if(o=e-n,0>o&&(o=0),r[i]>>o!==t[i]>>o)return!1;n-=e,i+=1}return!0},t.subnetMatch=function(r,t,e){var n,i,o,a,s;null==e&&(e="unicast");for(n in t)for(i=t[n],"[object Array]"!==toString.call(i[0])&&(i=[i]),a=0,s=i.length;s>a;a++)if(o=i[a],r.match.apply(r,o))return n;return e},t.IPv4=function(){function r(r){var t,e,n;if(4!==r.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(e=0,n=r.length;n>e;e++)if(t=r[e],!(t>=0&&255>=t))throw new Error("ipaddr: ipv4 octet is a byte");this.octets=r}return r.prototype.kind=function(){return"ipv4"},r.prototype.toString=function(){return this.octets.join(".")},r.prototype.toByteArray=function(){return this.octets.slice(0)},r.prototype.match=function(r,t){var e;if(void 0===t&&(e=r,r=e[0],t=e[1]),"ipv4"!==r.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return a(this.octets,r.octets,8,t)},r.prototype.SpecialRanges={unspecified:[[new r([0,0,0,0]),8]],broadcast:[[new r([255,255,255,255]),32]],multicast:[[new r([224,0,0,0]),4]],linkLocal:[[new r([169,254,0,0]),16]],loopback:[[new r([127,0,0,0]),8]],"private":[[new r([10,0,0,0]),8],[new r([172,16,0,0]),12],[new r([192,168,0,0]),16]],reserved:[[new r([192,0,0,0]),24],[new r([192,0,2,0]),24],[new r([192,88,99,0]),24],[new r([198,51,100,0]),24],[new r([203,0,113,0]),24],[new r([240,0,0,0]),4]]},r.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},r.prototype.toIPv4MappedAddress=function(){return t.IPv6.parse("::ffff:"+this.toString())},r}(),e="(0?\\d+|0x[a-f0-9]+)",n={fourOctet:new RegExp("^"+e+"\\."+e+"\\."+e+"\\."+e+"$","i"),longValue:new RegExp("^"+e+"$","i")},t.IPv4.parser=function(r){var t,e,i,o,a;if(e=function(r){return"0"===r[0]&&"x"!==r[1]?parseInt(r,8):parseInt(r)},t=r.match(n.fourOctet))return function(){var r,n,o,a;for(o=t.slice(1,6),a=[],r=0,n=o.length;n>r;r++)i=o[r],a.push(e(i));return a}();if(t=r.match(n.longValue)){if(a=e(t[1]),a>4294967295||0>a)throw new Error("ipaddr: address outside defined range");return function(){var r,t;for(t=[],o=r=0;24>=r;o=r+=8)t.push(a>>o&255);return t}().reverse()}return null},t.IPv6=function(){function r(r){var t,e,n;if(8!==r.length)throw new Error("ipaddr: ipv6 part count should be 8");for(e=0,n=r.length;n>e;e++)if(t=r[e],!(t>=0&&65535>=t))throw new Error("ipaddr: ipv6 part should fit to two octets");this.parts=r}return r.prototype.kind=function(){return"ipv6"},r.prototype.toString=function(){var r,t,e,n,i,o,a;for(i=function(){var r,e,n,i;for(n=this.parts,i=[],r=0,e=n.length;e>r;r++)t=n[r],i.push(t.toString(16));return i}.call(this),r=[],e=function(t){return r.push(t)},n=0,o=0,a=i.length;a>o;o++)switch(t=i[o],n){case 0:e("0"===t?"":t),n=1;break;case 1:"0"===t?n=2:e(t);break;case 2:"0"!==t&&(e(""),e(t),n=3);break;case 3:e(t)}return 2===n&&(e(""),e("")),r.join(":")},r.prototype.toByteArray=function(){var r,t,e,n,i;for(r=[],i=this.parts,e=0,n=i.length;n>e;e++)t=i[e],r.push(t>>8),r.push(255&t);return r},r.prototype.toNormalizedString=function(){var r;return function(){var t,e,n,i;for(n=this.parts,i=[],t=0,e=n.length;e>t;t++)r=n[t],i.push(r.toString(16));return i}.call(this).join(":")},r.prototype.match=function(r,t){var e;if(void 0===t&&(e=r,r=e[0],t=e[1]),"ipv6"!==r.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return a(this.parts,r.parts,16,t)},r.prototype.SpecialRanges={unspecified:[new r([0,0,0,0,0,0,0,0]),128],linkLocal:[new r([65152,0,0,0,0,0,0,0]),10],multicast:[new r([65280,0,0,0,0,0,0,0]),8],loopback:[new r([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new r([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new r([0,0,0,0,0,65535,0,0]),96],rfc6145:[new r([0,0,0,0,65535,0,0,0]),96],rfc6052:[new r([100,65435,0,0,0,0,0,0]),96],"6to4":[new r([8194,0,0,0,0,0,0,0]),16],teredo:[new r([8193,0,0,0,0,0,0,0]),32],reserved:[[new r([8193,3512,0,0,0,0,0,0]),32]]},r.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},r.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},r.prototype.toIPv4Address=function(){var r,e,n;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return n=this.parts.slice(-2),r=n[0],e=n[1],new t.IPv4([r>>8,255&r,e>>8,255&e])},r}(),i="(?:[0-9a-f]+::?)+",o={"native":new RegExp("^(::)?("+i+")?([0-9a-f]+)?(::)?$","i"),transitional:new RegExp("^((?:"+i+")|(?:::)(?:"+i+")?)"+(""+e+"\\."+e+"\\."+e+"\\."+e+"$"),"i")},r=function(r,t){var e,n,i,o,a;if(r.indexOf("::")!==r.lastIndexOf("::"))return null;for(e=0,n=-1;(n=r.indexOf(":",n+1))>=0;)e++;if(":"===r[0]&&e--,":"===r[r.length-1]&&e--,e>t)return null;for(a=t-e,o=":";a--;)o+="0:";return r=r.replace("::",o),":"===r[0]&&(r=r.slice(1)),":"===r[r.length-1]&&(r=r.slice(0,-1)),function(){var t,e,n,o;for(n=r.split(":"),o=[],t=0,e=n.length;e>t;t++)i=n[t],o.push(parseInt(i,16));return o}()},t.IPv6.parser=function(t){var e,n;return t.match(o["native"])?r(t,8):(e=t.match(o.transitional))&&(n=r(e[1].slice(0,-1),6))?(n.push(parseInt(e[2])<<8|parseInt(e[3])),n.push(parseInt(e[4])<<8|parseInt(e[5])),n):null},t.IPv4.isIPv4=t.IPv6.isIPv6=function(r){return null!==this.parser(r)},t.IPv4.isValid=t.IPv6.isValid=function(r){var t;try{return new this(this.parser(r)),!0}catch(e){return t=e,!1}},t.IPv4.parse=t.IPv6.parse=function(r){var t;if(t=this.parser(r),null===t)throw new Error("ipaddr: string is not formatted like ip address");return new this(t)},t.IPv4.parseCIDR=t.IPv6.parseCIDR=function(r){var t;if(t=r.match(/^(.+)\/(\d+)$/))return[this.parse(t[1]),parseInt(t[2])];throw new Error("ipaddr: string is not formatted like a CIDR range")},t.isValid=function(r){return t.IPv6.isValid(r)||t.IPv4.isValid(r)},t.parse=function(r){if(t.IPv6.isValid(r))return t.IPv6.parse(r);if(t.IPv4.isValid(r))return t.IPv4.parse(r);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},t.parseCIDR=function(r){var e;try{return t.IPv6.parseCIDR(r)}catch(n){e=n;try{return t.IPv4.parseCIDR(r)}catch(n){throw e=n,new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format")}}},t.process=function(r){var t;return t=this.parse(r),"ipv6"===t.kind()&&t.isIPv4MappedAddress()?t.toIPv4Address():t}}).call(this); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js deleted file mode 100644 index 5d99e08..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js +++ /dev/null @@ -1,439 +0,0 @@ -(function() { - var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root; - - ipaddr = {}; - - root = this; - - if ((typeof module !== "undefined" && module !== null) && module.exports) { - module.exports = ipaddr; - } else { - root['ipaddr'] = ipaddr; - } - - matchCIDR = function(first, second, partSize, cidrBits) { - var part, shift; - if (first.length !== second.length) { - throw new Error("ipaddr: cannot match CIDR for objects with different lengths"); - } - part = 0; - while (cidrBits > 0) { - shift = partSize - cidrBits; - if (shift < 0) { - shift = 0; - } - if (first[part] >> shift !== second[part] >> shift) { - return false; - } - cidrBits -= partSize; - part += 1; - } - return true; - }; - - ipaddr.subnetMatch = function(address, rangeList, defaultName) { - var rangeName, rangeSubnets, subnet, _i, _len; - if (defaultName == null) { - defaultName = 'unicast'; - } - for (rangeName in rangeList) { - rangeSubnets = rangeList[rangeName]; - if (toString.call(rangeSubnets[0]) !== '[object Array]') { - rangeSubnets = [rangeSubnets]; - } - for (_i = 0, _len = rangeSubnets.length; _i < _len; _i++) { - subnet = rangeSubnets[_i]; - if (address.match.apply(address, subnet)) { - return rangeName; - } - } - } - return defaultName; - }; - - ipaddr.IPv4 = (function() { - function IPv4(octets) { - var octet, _i, _len; - if (octets.length !== 4) { - throw new Error("ipaddr: ipv4 octet count should be 4"); - } - for (_i = 0, _len = octets.length; _i < _len; _i++) { - octet = octets[_i]; - if (!((0 <= octet && octet <= 255))) { - throw new Error("ipaddr: ipv4 octet is a byte"); - } - } - this.octets = octets; - } - - IPv4.prototype.kind = function() { - return 'ipv4'; - }; - - IPv4.prototype.toString = function() { - return this.octets.join("."); - }; - - IPv4.prototype.toByteArray = function() { - return this.octets.slice(0); - }; - - IPv4.prototype.match = function(other, cidrRange) { - var _ref; - if (cidrRange === void 0) { - _ref = other, other = _ref[0], cidrRange = _ref[1]; - } - if (other.kind() !== 'ipv4') { - throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one"); - } - return matchCIDR(this.octets, other.octets, 8, cidrRange); - }; - - IPv4.prototype.SpecialRanges = { - unspecified: [[new IPv4([0, 0, 0, 0]), 8]], - broadcast: [[new IPv4([255, 255, 255, 255]), 32]], - multicast: [[new IPv4([224, 0, 0, 0]), 4]], - linkLocal: [[new IPv4([169, 254, 0, 0]), 16]], - loopback: [[new IPv4([127, 0, 0, 0]), 8]], - "private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]], - reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]] - }; - - IPv4.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv4.prototype.toIPv4MappedAddress = function() { - return ipaddr.IPv6.parse("::ffff:" + (this.toString())); - }; - - return IPv4; - - })(); - - ipv4Part = "(0?\\d+|0x[a-f0-9]+)"; - - ipv4Regexes = { - fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'), - longValue: new RegExp("^" + ipv4Part + "$", 'i') - }; - - ipaddr.IPv4.parser = function(string) { - var match, parseIntAuto, part, shift, value; - parseIntAuto = function(string) { - if (string[0] === "0" && string[1] !== "x") { - return parseInt(string, 8); - } else { - return parseInt(string); - } - }; - if (match = string.match(ipv4Regexes.fourOctet)) { - return (function() { - var _i, _len, _ref, _results; - _ref = match.slice(1, 6); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(parseIntAuto(part)); - } - return _results; - })(); - } else if (match = string.match(ipv4Regexes.longValue)) { - value = parseIntAuto(match[1]); - if (value > 0xffffffff || value < 0) { - throw new Error("ipaddr: address outside defined range"); - } - return ((function() { - var _i, _results; - _results = []; - for (shift = _i = 0; _i <= 24; shift = _i += 8) { - _results.push((value >> shift) & 0xff); - } - return _results; - })()).reverse(); - } else { - return null; - } - }; - - ipaddr.IPv6 = (function() { - function IPv6(parts) { - var part, _i, _len; - if (parts.length !== 8) { - throw new Error("ipaddr: ipv6 part count should be 8"); - } - for (_i = 0, _len = parts.length; _i < _len; _i++) { - part = parts[_i]; - if (!((0 <= part && part <= 0xffff))) { - throw new Error("ipaddr: ipv6 part should fit to two octets"); - } - } - this.parts = parts; - } - - IPv6.prototype.kind = function() { - return 'ipv6'; - }; - - IPv6.prototype.toString = function() { - var compactStringParts, part, pushPart, state, stringParts, _i, _len; - stringParts = (function() { - var _i, _len, _ref, _results; - _ref = this.parts; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(part.toString(16)); - } - return _results; - }).call(this); - compactStringParts = []; - pushPart = function(part) { - return compactStringParts.push(part); - }; - state = 0; - for (_i = 0, _len = stringParts.length; _i < _len; _i++) { - part = stringParts[_i]; - switch (state) { - case 0: - if (part === '0') { - pushPart(''); - } else { - pushPart(part); - } - state = 1; - break; - case 1: - if (part === '0') { - state = 2; - } else { - pushPart(part); - } - break; - case 2: - if (part !== '0') { - pushPart(''); - pushPart(part); - state = 3; - } - break; - case 3: - pushPart(part); - } - } - if (state === 2) { - pushPart(''); - pushPart(''); - } - return compactStringParts.join(":"); - }; - - IPv6.prototype.toByteArray = function() { - var bytes, part, _i, _len, _ref; - bytes = []; - _ref = this.parts; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - bytes.push(part >> 8); - bytes.push(part & 0xff); - } - return bytes; - }; - - IPv6.prototype.toNormalizedString = function() { - var part; - return ((function() { - var _i, _len, _ref, _results; - _ref = this.parts; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(part.toString(16)); - } - return _results; - }).call(this)).join(":"); - }; - - IPv6.prototype.match = function(other, cidrRange) { - var _ref; - if (cidrRange === void 0) { - _ref = other, other = _ref[0], cidrRange = _ref[1]; - } - if (other.kind() !== 'ipv6') { - throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one"); - } - return matchCIDR(this.parts, other.parts, 16, cidrRange); - }; - - IPv6.prototype.SpecialRanges = { - unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128], - linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10], - multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8], - loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128], - uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7], - ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96], - rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96], - rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96], - '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16], - teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32], - reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]] - }; - - IPv6.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv6.prototype.isIPv4MappedAddress = function() { - return this.range() === 'ipv4Mapped'; - }; - - IPv6.prototype.toIPv4Address = function() { - var high, low, _ref; - if (!this.isIPv4MappedAddress()) { - throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4"); - } - _ref = this.parts.slice(-2), high = _ref[0], low = _ref[1]; - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]); - }; - - return IPv6; - - })(); - - ipv6Part = "(?:[0-9a-f]+::?)+"; - - ipv6Regexes = { - "native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?$", 'i'), - transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + ("" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$"), 'i') - }; - - expandIPv6 = function(string, parts) { - var colonCount, lastColon, part, replacement, replacementCount; - if (string.indexOf('::') !== string.lastIndexOf('::')) { - return null; - } - colonCount = 0; - lastColon = -1; - while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) { - colonCount++; - } - if (string[0] === ':') { - colonCount--; - } - if (string[string.length - 1] === ':') { - colonCount--; - } - if (colonCount > parts) { - return null; - } - replacementCount = parts - colonCount; - replacement = ':'; - while (replacementCount--) { - replacement += '0:'; - } - string = string.replace('::', replacement); - if (string[0] === ':') { - string = string.slice(1); - } - if (string[string.length - 1] === ':') { - string = string.slice(0, -1); - } - return (function() { - var _i, _len, _ref, _results; - _ref = string.split(":"); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(parseInt(part, 16)); - } - return _results; - })(); - }; - - ipaddr.IPv6.parser = function(string) { - var match, parts; - if (string.match(ipv6Regexes['native'])) { - return expandIPv6(string, 8); - } else if (match = string.match(ipv6Regexes['transitional'])) { - parts = expandIPv6(match[1].slice(0, -1), 6); - if (parts) { - parts.push(parseInt(match[2]) << 8 | parseInt(match[3])); - parts.push(parseInt(match[4]) << 8 | parseInt(match[5])); - return parts; - } - } - return null; - }; - - ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) { - return this.parser(string) !== null; - }; - - ipaddr.IPv4.isValid = ipaddr.IPv6.isValid = function(string) { - var e; - try { - new this(this.parser(string)); - return true; - } catch (_error) { - e = _error; - return false; - } - }; - - ipaddr.IPv4.parse = ipaddr.IPv6.parse = function(string) { - var parts; - parts = this.parser(string); - if (parts === null) { - throw new Error("ipaddr: string is not formatted like ip address"); - } - return new this(parts); - }; - - ipaddr.IPv4.parseCIDR = ipaddr.IPv6.parseCIDR = function(string) { - var match; - if (match = string.match(/^(.+)\/(\d+)$/)) { - return [this.parse(match[1]), parseInt(match[2])]; - } - throw new Error("ipaddr: string is not formatted like a CIDR range"); - }; - - ipaddr.isValid = function(string) { - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string); - }; - - ipaddr.parse = function(string) { - if (ipaddr.IPv6.isValid(string)) { - return ipaddr.IPv6.parse(string); - } else if (ipaddr.IPv4.isValid(string)) { - return ipaddr.IPv4.parse(string); - } else { - throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format"); - } - }; - - ipaddr.parseCIDR = function(string) { - var e; - try { - return ipaddr.IPv6.parseCIDR(string); - } catch (_error) { - e = _error; - try { - return ipaddr.IPv4.parseCIDR(string); - } catch (_error) { - e = _error; - throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format"); - } - } - }; - - ipaddr.process = function(string) { - var addr; - addr = this.parse(string); - if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) { - return addr.toIPv4Address(); - } else { - return addr; - } - }; - -}).call(this); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json deleted file mode 100644 index 298362e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "ipaddr.js", - "description": "A library for manipulating IPv4 and IPv6 addresses in JavaScript.", - "version": "1.0.1", - "author": { - "name": "Peter Zotov", - "email": "whitequark@whitequark.org" - }, - "directories": { - "lib": "./lib" - }, - "dependencies": {}, - "devDependencies": { - "coffee-script": "~1.6", - "nodeunit": "~0.5.3", - "uglify-js": "latest" - }, - "scripts": { - "test": "cake build test" - }, - "keywords": [ - "ip", - "ipv4", - "ipv6" - ], - "repository": { - "type": "git", - "url": "git://github.com/whitequark/ipaddr.js" - }, - "main": "./lib/ipaddr", - "engines": { - "node": ">= 0.2.5" - }, - "license": "MIT", - "gitHead": "0a5a26d9317a58d67047e7f32b5b1bbe7f2f7fbf", - "bugs": { - "url": "https://github.com/whitequark/ipaddr.js/issues" - }, - "_id": "ipaddr.js@1.0.1", - "_shasum": "5f38801dc73e0400fc7076386f6ed5215fbd8f95", - "_from": "ipaddr.js@1.0.1", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "whitequark", - "email": "whitequark@whitequark.org" - }, - "maintainers": [ - { - "name": "whitequark", - "email": "whitequark@whitequark.org" - } - ], - "dist": { - "shasum": "5f38801dc73e0400fc7076386f6ed5215fbd8f95", - "tarball": "http://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.1.tgz" - }, - "_resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.1.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/whitequark/ipaddr.js" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee deleted file mode 100644 index 0a48080..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee +++ /dev/null @@ -1,374 +0,0 @@ -# Define the main object -ipaddr = {} - -root = this - -# Export for both the CommonJS and browser-like environment -if module? && module.exports - module.exports = ipaddr -else - root['ipaddr'] = ipaddr - -# A generic CIDR (Classless Inter-Domain Routing) RFC1518 range matcher. -matchCIDR = (first, second, partSize, cidrBits) -> - if first.length != second.length - throw new Error "ipaddr: cannot match CIDR for objects with different lengths" - - part = 0 - while cidrBits > 0 - shift = partSize - cidrBits - shift = 0 if shift < 0 - - if first[part] >> shift != second[part] >> shift - return false - - cidrBits -= partSize - part += 1 - - return true - -# An utility function to ease named range matching. See examples below. -ipaddr.subnetMatch = (address, rangeList, defaultName='unicast') -> - for rangeName, rangeSubnets of rangeList - # ECMA5 Array.isArray isn't available everywhere - if toString.call(rangeSubnets[0]) != '[object Array]' - rangeSubnets = [ rangeSubnets ] - - for subnet in rangeSubnets - return rangeName if address.match.apply(address, subnet) - - return defaultName - -# An IPv4 address (RFC791). -class ipaddr.IPv4 - # Constructs a new IPv4 address from an array of four octets. - # Verifies the input. - constructor: (octets) -> - if octets.length != 4 - throw new Error "ipaddr: ipv4 octet count should be 4" - - for octet in octets - if !(0 <= octet <= 255) - throw new Error "ipaddr: ipv4 octet is a byte" - - @octets = octets - - # The 'kind' method exists on both IPv4 and IPv6 classes. - kind: -> - return 'ipv4' - - # Returns the address in convenient, decimal-dotted format. - toString: -> - return @octets.join "." - - # Returns an array of byte-sized values in network order - toByteArray: -> - return @octets.slice(0) # octets.clone - - # Checks if this address matches other one within given CIDR range. - match: (other, cidrRange) -> - if cidrRange == undefined - [other, cidrRange] = other - - if other.kind() != 'ipv4' - throw new Error "ipaddr: cannot match ipv4 address with non-ipv4 one" - - return matchCIDR(this.octets, other.octets, 8, cidrRange) - - # Special IPv4 address ranges. - SpecialRanges: - unspecified: [ - [ new IPv4([0, 0, 0, 0]), 8 ] - ] - broadcast: [ - [ new IPv4([255, 255, 255, 255]), 32 ] - ] - multicast: [ # RFC3171 - [ new IPv4([224, 0, 0, 0]), 4 ] - ] - linkLocal: [ # RFC3927 - [ new IPv4([169, 254, 0, 0]), 16 ] - ] - loopback: [ # RFC5735 - [ new IPv4([127, 0, 0, 0]), 8 ] - ] - private: [ # RFC1918 - [ new IPv4([10, 0, 0, 0]), 8 ] - [ new IPv4([172, 16, 0, 0]), 12 ] - [ new IPv4([192, 168, 0, 0]), 16 ] - ] - reserved: [ # Reserved and testing-only ranges; RFCs 5735, 5737, 2544, 1700 - [ new IPv4([192, 0, 0, 0]), 24 ] - [ new IPv4([192, 0, 2, 0]), 24 ] - [ new IPv4([192, 88, 99, 0]), 24 ] - [ new IPv4([198, 51, 100, 0]), 24 ] - [ new IPv4([203, 0, 113, 0]), 24 ] - [ new IPv4([240, 0, 0, 0]), 4 ] - ] - - # Checks if the address corresponds to one of the special ranges. - range: -> - return ipaddr.subnetMatch(this, @SpecialRanges) - - # Convrets this IPv4 address to an IPv4-mapped IPv6 address. - toIPv4MappedAddress: -> - return ipaddr.IPv6.parse "::ffff:#{@toString()}" - -# A list of regular expressions that match arbitrary IPv4 addresses, -# for which a number of weird notations exist. -# Note that an address like 0010.0xa5.1.1 is considered legal. -ipv4Part = "(0?\\d+|0x[a-f0-9]+)" -ipv4Regexes = - fourOctet: new RegExp "^#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}$", 'i' - longValue: new RegExp "^#{ipv4Part}$", 'i' - -# Classful variants (like a.b, where a is an octet, and b is a 24-bit -# value representing last three octets; this corresponds to a class C -# address) are omitted due to classless nature of modern Internet. -ipaddr.IPv4.parser = (string) -> - parseIntAuto = (string) -> - if string[0] == "0" && string[1] != "x" - parseInt(string, 8) - else - parseInt(string) - - # parseInt recognizes all that octal & hexadecimal weirdness for us - if match = string.match(ipv4Regexes.fourOctet) - return (parseIntAuto(part) for part in match[1..5]) - else if match = string.match(ipv4Regexes.longValue) - value = parseIntAuto(match[1]) - if value > 0xffffffff || value < 0 - throw new Error "ipaddr: address outside defined range" - return ((value >> shift) & 0xff for shift in [0..24] by 8).reverse() - else - return null - -# An IPv6 address (RFC2460) -class ipaddr.IPv6 - # Constructs an IPv6 address from an array of eight 16-bit parts. - # Throws an error if the input is invalid. - constructor: (parts) -> - if parts.length != 8 - throw new Error "ipaddr: ipv6 part count should be 8" - - for part in parts - if !(0 <= part <= 0xffff) - throw new Error "ipaddr: ipv6 part should fit to two octets" - - @parts = parts - - # The 'kind' method exists on both IPv4 and IPv6 classes. - kind: -> - return 'ipv6' - - # Returns the address in compact, human-readable format like - # 2001:db8:8:66::1 - toString: -> - stringParts = (part.toString(16) for part in @parts) - - compactStringParts = [] - pushPart = (part) -> compactStringParts.push part - - state = 0 - for part in stringParts - switch state - when 0 - if part == '0' - pushPart('') - else - pushPart(part) - - state = 1 - when 1 - if part == '0' - state = 2 - else - pushPart(part) - when 2 - unless part == '0' - pushPart('') - pushPart(part) - state = 3 - when 3 - pushPart(part) - - if state == 2 - pushPart('') - pushPart('') - - return compactStringParts.join ":" - - # Returns an array of byte-sized values in network order - toByteArray: -> - bytes = [] - for part in @parts - bytes.push(part >> 8) - bytes.push(part & 0xff) - - return bytes - - # Returns the address in expanded format with all zeroes included, like - # 2001:db8:8:66:0:0:0:1 - toNormalizedString: -> - return (part.toString(16) for part in @parts).join ":" - - # Checks if this address matches other one within given CIDR range. - match: (other, cidrRange) -> - if cidrRange == undefined - [other, cidrRange] = other - - if other.kind() != 'ipv6' - throw new Error "ipaddr: cannot match ipv6 address with non-ipv6 one" - - return matchCIDR(this.parts, other.parts, 16, cidrRange) - - # Special IPv6 ranges - SpecialRanges: - unspecified: [ new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128 ] # RFC4291, here and after - linkLocal: [ new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10 ] - multicast: [ new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8 ] - loopback: [ new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128 ] - uniqueLocal: [ new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7 ] - ipv4Mapped: [ new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96 ] - rfc6145: [ new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96 ] # RFC6145 - rfc6052: [ new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96 ] # RFC6052 - '6to4': [ new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16 ] # RFC3056 - teredo: [ new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32 ] # RFC6052, RFC6146 - reserved: [ - [ new IPv6([ 0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32 ] # RFC4291 - ] - - # Checks if the address corresponds to one of the special ranges. - range: -> - return ipaddr.subnetMatch(this, @SpecialRanges) - - # Checks if this address is an IPv4-mapped IPv6 address. - isIPv4MappedAddress: -> - return @range() == 'ipv4Mapped' - - # Converts this address to IPv4 address if it is an IPv4-mapped IPv6 address. - # Throws an error otherwise. - toIPv4Address: -> - unless @isIPv4MappedAddress() - throw new Error "ipaddr: trying to convert a generic ipv6 address to ipv4" - - [high, low] = @parts[-2..-1] - - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]) - -# IPv6-matching regular expressions. -# For IPv6, the task is simpler: it is enough to match the colon-delimited -# hexadecimal IPv6 and a transitional variant with dotted-decimal IPv4 at -# the end. -ipv6Part = "(?:[0-9a-f]+::?)+" -ipv6Regexes = - native: new RegExp "^(::)?(#{ipv6Part})?([0-9a-f]+)?(::)?$", 'i' - transitional: new RegExp "^((?:#{ipv6Part})|(?:::)(?:#{ipv6Part})?)" + - "#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}$", 'i' - -# Expand :: in an IPv6 address or address part consisting of `parts` groups. -expandIPv6 = (string, parts) -> - # More than one '::' means invalid adddress - if string.indexOf('::') != string.lastIndexOf('::') - return null - - # How many parts do we already have? - colonCount = 0 - lastColon = -1 - while (lastColon = string.indexOf(':', lastColon + 1)) >= 0 - colonCount++ - - # 0::0 is two parts more than :: - colonCount-- if string[0] == ':' - colonCount-- if string[string.length-1] == ':' - - # The following loop would hang if colonCount > parts - if colonCount > parts - return null - - # replacement = ':' + '0:' * (parts - colonCount) - replacementCount = parts - colonCount - replacement = ':' - while replacementCount-- - replacement += '0:' - - # Insert the missing zeroes - string = string.replace('::', replacement) - - # Trim any garbage which may be hanging around if :: was at the edge in - # the source string - string = string[1..-1] if string[0] == ':' - string = string[0..-2] if string[string.length-1] == ':' - - return (parseInt(part, 16) for part in string.split(":")) - -# Parse an IPv6 address. -ipaddr.IPv6.parser = (string) -> - if string.match(ipv6Regexes['native']) - return expandIPv6(string, 8) - - else if match = string.match(ipv6Regexes['transitional']) - parts = expandIPv6(match[1][0..-2], 6) - if parts - parts.push(parseInt(match[2]) << 8 | parseInt(match[3])) - parts.push(parseInt(match[4]) << 8 | parseInt(match[5])) - return parts - - return null - -# Checks if a given string is formatted like IPv4/IPv6 address. -ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = (string) -> - return @parser(string) != null - -# Checks if a given string is a valid IPv4/IPv6 address. -ipaddr.IPv4.isValid = ipaddr.IPv6.isValid = (string) -> - try - new this(@parser(string)) - return true - catch e - return false - -# Tries to parse and validate a string with IPv4/IPv6 address. -# Throws an error if it fails. -ipaddr.IPv4.parse = ipaddr.IPv6.parse = (string) -> - parts = @parser(string) - if parts == null - throw new Error "ipaddr: string is not formatted like ip address" - - return new this(parts) - -ipaddr.IPv4.parseCIDR = ipaddr.IPv6.parseCIDR = (string) -> - if match = string.match(/^(.+)\/(\d+)$/) - return [@parse(match[1]), parseInt(match[2])] - - throw new Error "ipaddr: string is not formatted like a CIDR range" - -# Checks if the address is valid IP address -ipaddr.isValid = (string) -> - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string) - -# Try to parse an address and throw an error if it is impossible -ipaddr.parse = (string) -> - if ipaddr.IPv6.isValid(string) - return ipaddr.IPv6.parse(string) - else if ipaddr.IPv4.isValid(string) - return ipaddr.IPv4.parse(string) - else - throw new Error "ipaddr: the address has neither IPv6 nor IPv4 format" - -ipaddr.parseCIDR = (string) -> - try - return ipaddr.IPv6.parseCIDR(string) - catch e - try - return ipaddr.IPv4.parseCIDR(string) - catch e - throw new Error "ipaddr: the address has neither IPv6 nor IPv4 CIDR format" - -# Parse an address and return plain IPv4 address if it is an IPv4-mapped address -ipaddr.process = (string) -> - addr = @parse(string) - if addr.kind() == 'ipv6' && addr.isIPv4MappedAddress() - return addr.toIPv4Address() - else - return addr diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee deleted file mode 100644 index 361561e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee +++ /dev/null @@ -1,262 +0,0 @@ -ipaddr = require '../lib/ipaddr' - -module.exports = - 'should define main classes': (test) -> - test.ok(ipaddr.IPv4?, 'defines IPv4 class') - test.ok(ipaddr.IPv6?, 'defines IPv6 class') - test.done() - - 'can construct IPv4 from octets': (test) -> - test.doesNotThrow -> - new ipaddr.IPv4([192, 168, 1, 2]) - test.done() - - 'refuses to construct invalid IPv4': (test) -> - test.throws -> - new ipaddr.IPv4([300, 1, 2, 3]) - test.throws -> - new ipaddr.IPv4([8, 8, 8]) - test.done() - - 'converts IPv4 to string correctly': (test) -> - addr = new ipaddr.IPv4([192, 168, 1, 1]) - test.equal(addr.toString(), '192.168.1.1') - test.done() - - 'returns correct kind for IPv4': (test) -> - addr = new ipaddr.IPv4([1, 2, 3, 4]) - test.equal(addr.kind(), 'ipv4') - test.done() - - 'allows to access IPv4 octets': (test) -> - addr = new ipaddr.IPv4([42, 0, 0, 0]) - test.equal(addr.octets[0], 42) - test.done() - - 'checks IPv4 address format': (test) -> - test.equal(ipaddr.IPv4.isIPv4('192.168.007.0xa'), true) - test.equal(ipaddr.IPv4.isIPv4('1024.0.0.1'), true) - test.equal(ipaddr.IPv4.isIPv4('8.0xa.wtf.6'), false) - test.done() - - 'validates IPv4 addresses': (test) -> - test.equal(ipaddr.IPv4.isValid('192.168.007.0xa'), true) - test.equal(ipaddr.IPv4.isValid('1024.0.0.1'), false) - test.equal(ipaddr.IPv4.isValid('8.0xa.wtf.6'), false) - test.done() - - 'parses IPv4 in several weird formats': (test) -> - test.deepEqual(ipaddr.IPv4.parse('192.168.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('0xc0.168.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('192.0250.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('0xc0a80101').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('030052000401').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('3232235777').octets, [192, 168, 1, 1]) - test.done() - - 'barfs at invalid IPv4': (test) -> - test.throws -> - ipaddr.IPv4.parse('10.0.0.wtf') - test.done() - - 'matches IPv4 CIDR correctly': (test) -> - addr = new ipaddr.IPv4([10, 5, 0, 1]) - test.equal(addr.match(ipaddr.IPv4.parse('0.0.0.0'), 0), true) - test.equal(addr.match(ipaddr.IPv4.parse('11.0.0.0'), 8), false) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.0'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.1'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.10'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.5.5.0'), 16), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 16), false) - test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 15), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.5.0.2'), 32), false) - test.equal(addr.match(addr, 32), true) - test.done() - - 'parses IPv4 CIDR correctly': (test) -> - addr = new ipaddr.IPv4([10, 5, 0, 1]) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('0.0.0.0/0')), true) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('11.0.0.0/8')), false) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.0.0.0/8')), true) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.0.0.1/8')), true) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.0.0.10/8')), true) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.5.5.0/16')), true) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.4.5.0/16')), false) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.4.5.0/15')), true) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.5.0.2/32')), false) - test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.5.0.1/32')), true) - test.throws -> - ipaddr.IPv4.parseCIDR('10.5.0.1') - test.done() - - 'detects reserved IPv4 networks': (test) -> - test.equal(ipaddr.IPv4.parse('0.0.0.0').range(), 'unspecified') - test.equal(ipaddr.IPv4.parse('0.1.0.0').range(), 'unspecified') - test.equal(ipaddr.IPv4.parse('10.1.0.1').range(), 'private') - test.equal(ipaddr.IPv4.parse('192.168.2.1').range(), 'private') - test.equal(ipaddr.IPv4.parse('224.100.0.1').range(), 'multicast') - test.equal(ipaddr.IPv4.parse('169.254.15.0').range(), 'linkLocal') - test.equal(ipaddr.IPv4.parse('127.1.1.1').range(), 'loopback') - test.equal(ipaddr.IPv4.parse('255.255.255.255').range(), 'broadcast') - test.equal(ipaddr.IPv4.parse('240.1.2.3').range(), 'reserved') - test.equal(ipaddr.IPv4.parse('8.8.8.8').range(), 'unicast') - test.done() - - 'can construct IPv6 from parts': (test) -> - test.doesNotThrow -> - new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.done() - - 'refuses to construct invalid IPv6': (test) -> - test.throws -> - new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 0, 1]) - test.throws -> - new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 1]) - test.done() - - 'converts IPv6 to string correctly': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.equal(addr.toNormalizedString(), '2001:db8:f53a:0:0:0:0:1') - test.equal(addr.toString(), '2001:db8:f53a::1') - test.equal(new ipaddr.IPv6([0, 0, 0, 0, 0, 0, 0, 1]).toString(), '::1') - test.equal(new ipaddr.IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]).toString(), '2001:db8::') - test.done() - - 'returns correct kind for IPv6': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.equal(addr.kind(), 'ipv6') - test.done() - - 'allows to access IPv6 address parts': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 42, 0, 1]) - test.equal(addr.parts[5], 42) - test.done() - - 'checks IPv6 address format': (test) -> - test.equal(ipaddr.IPv6.isIPv6('2001:db8:F53A::1'), true) - test.equal(ipaddr.IPv6.isIPv6('200001::1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:192.168.1.1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1:0'), false) - test.equal(ipaddr.IPv6.isIPv6('fe80::wtf'), false) - test.done() - - 'validates IPv6 addresses': (test) -> - test.equal(ipaddr.IPv6.isValid('2001:db8:F53A::1'), true) - test.equal(ipaddr.IPv6.isValid('200001::1'), false) - test.equal(ipaddr.IPv6.isValid('::ffff:192.168.1.1'), true) - test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1'), false) - test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1:0'), false) - test.equal(ipaddr.IPv6.isValid('2001:db8::F53A::1'), false) - test.equal(ipaddr.IPv6.isValid('fe80::wtf'), false) - test.done() - - 'parses IPv6 in different formats': (test) -> - test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A:0:0:0:0:1').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.deepEqual(ipaddr.IPv6.parse('fe80::10').parts, [0xfe80, 0, 0, 0, 0, 0, 0, 0x10]) - test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A::').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 0]) - test.deepEqual(ipaddr.IPv6.parse('::1').parts, [0, 0, 0, 0, 0, 0, 0, 1]) - test.deepEqual(ipaddr.IPv6.parse('::').parts, [0, 0, 0, 0, 0, 0, 0, 0]) - test.done() - - 'barfs at invalid IPv6': (test) -> - test.throws -> - ipaddr.IPv6.parse('fe80::0::1') - test.done() - - 'matches IPv6 CIDR correctly': (test) -> - addr = ipaddr.IPv6.parse('2001:db8:f53a::1') - test.equal(addr.match(ipaddr.IPv6.parse('::'), 0), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53a::1:1'), 64), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53b::1:1'), 48), false) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f531::1:1'), 44), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f500::1'), 40), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db9:f500::1'), 40), false) - test.equal(addr.match(addr, 128), true) - test.done() - - 'parses IPv6 CIDR correctly': (test) -> - addr = ipaddr.IPv6.parse('2001:db8:f53a::1') - test.equal(addr.match(ipaddr.IPv6.parseCIDR('::/0')), true) - test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f53a::1:1/64')), true) - test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f53b::1:1/48')), false) - test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f531::1:1/44')), true) - test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f500::1/40')), true) - test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db9:f500::1/40')), false) - test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f53a::1/128')), true) - test.throws -> - ipaddr.IPv6.parseCIDR('2001:db8:f53a::1') - test.done() - - 'converts between IPv4-mapped IPv6 addresses and IPv4 addresses': (test) -> - addr = ipaddr.IPv4.parse('77.88.21.11') - mapped = addr.toIPv4MappedAddress() - test.deepEqual(mapped.parts, [0, 0, 0, 0, 0, 0xffff, 0x4d58, 0x150b]) - test.deepEqual(mapped.toIPv4Address().octets, addr.octets) - test.done() - - 'refuses to convert non-IPv4-mapped IPv6 address to IPv4 address': (test) -> - test.throws -> - ipaddr.IPv6.parse('2001:db8::1').toIPv4Address() - test.done() - - 'detects reserved IPv6 networks': (test) -> - test.equal(ipaddr.IPv6.parse('::').range(), 'unspecified') - test.equal(ipaddr.IPv6.parse('fe80::1234:5678:abcd:0123').range(), 'linkLocal') - test.equal(ipaddr.IPv6.parse('ff00::1234').range(), 'multicast') - test.equal(ipaddr.IPv6.parse('::1').range(), 'loopback') - test.equal(ipaddr.IPv6.parse('fc00::').range(), 'uniqueLocal') - test.equal(ipaddr.IPv6.parse('::ffff:192.168.1.10').range(), 'ipv4Mapped') - test.equal(ipaddr.IPv6.parse('::ffff:0:192.168.1.10').range(), 'rfc6145') - test.equal(ipaddr.IPv6.parse('64:ff9b::1234').range(), 'rfc6052') - test.equal(ipaddr.IPv6.parse('2002:1f63:45e8::1').range(), '6to4') - test.equal(ipaddr.IPv6.parse('2001::4242').range(), 'teredo') - test.equal(ipaddr.IPv6.parse('2001:db8::3210').range(), 'reserved') - test.equal(ipaddr.IPv6.parse('2001:470:8:66::1').range(), 'unicast') - test.done() - - 'is able to determine IP address type': (test) -> - test.equal(ipaddr.parse('8.8.8.8').kind(), 'ipv4') - test.equal(ipaddr.parse('2001:db8:3312::1').kind(), 'ipv6') - test.done() - - 'throws an error if tried to parse an invalid address': (test) -> - test.throws -> - ipaddr.parse('::some.nonsense') - test.done() - - 'correctly processes IPv4-mapped addresses': (test) -> - test.equal(ipaddr.process('8.8.8.8').kind(), 'ipv4') - test.equal(ipaddr.process('2001:db8:3312::1').kind(), 'ipv6') - test.equal(ipaddr.process('::ffff:192.168.1.1').kind(), 'ipv4') - test.done() - - 'correctly converts IPv6 and IPv4 addresses to byte arrays': (test) -> - test.deepEqual(ipaddr.parse('1.2.3.4').toByteArray(), - [0x1, 0x2, 0x3, 0x4]); - # Fuck yeah. The first byte of Google's IPv6 address is 42. 42! - test.deepEqual(ipaddr.parse('2a00:1450:8007::68').toByteArray(), - [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68 ]) - test.done() - - 'correctly parses 1 as an IPv4 address': (test) -> - test.equal(ipaddr.IPv6.isValid('1'), false) - test.equal(ipaddr.IPv4.isValid('1'), true) - test.deepEqual(new ipaddr.IPv4([0, 0, 0, 1]), ipaddr.parse('1')) - test.done() - - 'correctly detects IPv4 and IPv6 CIDR addresses': (test) -> - test.deepEqual([ipaddr.IPv6.parse('fc00::'), 64], - ipaddr.parseCIDR('fc00::/64')) - test.deepEqual([ipaddr.IPv4.parse('1.2.3.4'), 5], - ipaddr.parseCIDR('1.2.3.4/5')) - test.done() - - 'does not consider a very large or very small number a valid IP address': (test) -> - test.equal(ipaddr.isValid('4999999999'), false) - test.equal(ipaddr.isValid('-1'), false) - test.done() - - 'does not hang on ::8:8:8:8:8:8:8:8:8': (test) -> - test.equal(ipaddr.IPv6.isValid('::8:8:8:8:8:8:8:8:8'), false) - test.done() diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/package.json deleted file mode 100644 index a1b58c2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/proxy-addr/package.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "name": "proxy-addr", - "description": "Determine address of proxied request", - "version": "1.0.8", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "ip", - "proxy", - "x-forwarded-for" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/proxy-addr" - }, - "dependencies": { - "forwarded": "~0.1.0", - "ipaddr.js": "1.0.1" - }, - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "istanbul": "0.3.9", - "mocha": "~1.21.5" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "b32d9bda51c92f67a5c2c7b4f81971dbef41783c", - "bugs": { - "url": "https://github.com/jshttp/proxy-addr/issues" - }, - "homepage": "https://github.com/jshttp/proxy-addr", - "_id": "proxy-addr@1.0.8", - "_shasum": "db54ec878bcc1053d57646609219b3715678bafe", - "_from": "proxy-addr@>=1.0.8 <1.1.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "db54ec878bcc1053d57646609219b3715678bafe", - "tarball": "http://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.8.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.8.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/.eslintignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/.eslintignore deleted file mode 100644 index 1521c8b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/.npmignore deleted file mode 100644 index 2abba8d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/.npmignore +++ /dev/null @@ -1,19 +0,0 @@ -.idea -*.iml -npm-debug.log -dump.rdb -node_modules -results.tap -results.xml -npm-shrinkwrap.json -config.json -.DS_Store -*/.DS_Store -*/*/.DS_Store -._* -*/._* -*/*/._* -coverage.* -lib-cov -complexity.md -dist diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/.travis.yml deleted file mode 100644 index f502178..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js - -node_js: - - 0.10 - - 0.12 - - iojs diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/CHANGELOG.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/CHANGELOG.md deleted file mode 100644 index 1fadc78..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/CHANGELOG.md +++ /dev/null @@ -1,88 +0,0 @@ - -## [**3.1.0**](https://github.com/hapijs/qs/issues?milestone=24&state=open) -- [**#89**](https://github.com/hapijs/qs/issues/89) Add option to disable "Transform dot notation to bracket notation" - -## [**3.0.0**](https://github.com/hapijs/qs/issues?milestone=23&state=closed) -- [**#77**](https://github.com/hapijs/qs/issues/77) Perf boost -- [**#60**](https://github.com/hapijs/qs/issues/60) Add explicit option to disable array parsing -- [**#80**](https://github.com/hapijs/qs/issues/80) qs.parse silently drops properties -- [**#74**](https://github.com/hapijs/qs/issues/74) Bad parse when turning array into object -- [**#81**](https://github.com/hapijs/qs/issues/81) Add a `filter` option -- [**#68**](https://github.com/hapijs/qs/issues/68) Fixed issue with recursion and passing strings into objects. -- [**#66**](https://github.com/hapijs/qs/issues/66) Add mixed array and object dot notation support Closes: #47 -- [**#76**](https://github.com/hapijs/qs/issues/76) RFC 3986 -- [**#85**](https://github.com/hapijs/qs/issues/85) No equal sign -- [**#84**](https://github.com/hapijs/qs/issues/84) update license attribute - -## [**2.4.1**](https://github.com/hapijs/qs/issues?milestone=20&state=closed) -- [**#73**](https://github.com/hapijs/qs/issues/73) Property 'hasOwnProperty' of object # is not a function - -## [**2.4.0**](https://github.com/hapijs/qs/issues?milestone=19&state=closed) -- [**#70**](https://github.com/hapijs/qs/issues/70) Add arrayFormat option - -## [**2.3.3**](https://github.com/hapijs/qs/issues?milestone=18&state=closed) -- [**#59**](https://github.com/hapijs/qs/issues/59) make sure array indexes are >= 0, closes #57 -- [**#58**](https://github.com/hapijs/qs/issues/58) make qs usable for browser loader - -## [**2.3.2**](https://github.com/hapijs/qs/issues?milestone=17&state=closed) -- [**#55**](https://github.com/hapijs/qs/issues/55) allow merging a string into an object - -## [**2.3.1**](https://github.com/hapijs/qs/issues?milestone=16&state=closed) -- [**#52**](https://github.com/hapijs/qs/issues/52) Return "undefined" and "false" instead of throwing "TypeError". - -## [**2.3.0**](https://github.com/hapijs/qs/issues?milestone=15&state=closed) -- [**#50**](https://github.com/hapijs/qs/issues/50) add option to omit array indices, closes #46 - -## [**2.2.5**](https://github.com/hapijs/qs/issues?milestone=14&state=closed) -- [**#39**](https://github.com/hapijs/qs/issues/39) Is there an alternative to Buffer.isBuffer? -- [**#49**](https://github.com/hapijs/qs/issues/49) refactor utils.merge, fixes #45 -- [**#41**](https://github.com/hapijs/qs/issues/41) avoid browserifying Buffer, for #39 - -## [**2.2.4**](https://github.com/hapijs/qs/issues?milestone=13&state=closed) -- [**#38**](https://github.com/hapijs/qs/issues/38) how to handle object keys beginning with a number - -## [**2.2.3**](https://github.com/hapijs/qs/issues?milestone=12&state=closed) -- [**#37**](https://github.com/hapijs/qs/issues/37) parser discards first empty value in array -- [**#36**](https://github.com/hapijs/qs/issues/36) Update to lab 4.x - -## [**2.2.2**](https://github.com/hapijs/qs/issues?milestone=11&state=closed) -- [**#33**](https://github.com/hapijs/qs/issues/33) Error when plain object in a value -- [**#34**](https://github.com/hapijs/qs/issues/34) use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty -- [**#24**](https://github.com/hapijs/qs/issues/24) Changelog? Semver? - -## [**2.2.1**](https://github.com/hapijs/qs/issues?milestone=10&state=closed) -- [**#32**](https://github.com/hapijs/qs/issues/32) account for circular references properly, closes #31 -- [**#31**](https://github.com/hapijs/qs/issues/31) qs.parse stackoverflow on circular objects - -## [**2.2.0**](https://github.com/hapijs/qs/issues?milestone=9&state=closed) -- [**#26**](https://github.com/hapijs/qs/issues/26) Don't use Buffer global if it's not present -- [**#30**](https://github.com/hapijs/qs/issues/30) Bug when merging non-object values into arrays -- [**#29**](https://github.com/hapijs/qs/issues/29) Don't call Utils.clone at the top of Utils.merge -- [**#23**](https://github.com/hapijs/qs/issues/23) Ability to not limit parameters? - -## [**2.1.0**](https://github.com/hapijs/qs/issues?milestone=8&state=closed) -- [**#22**](https://github.com/hapijs/qs/issues/22) Enable using a RegExp as delimiter - -## [**2.0.0**](https://github.com/hapijs/qs/issues?milestone=7&state=closed) -- [**#18**](https://github.com/hapijs/qs/issues/18) Why is there arrayLimit? -- [**#20**](https://github.com/hapijs/qs/issues/20) Configurable parametersLimit -- [**#21**](https://github.com/hapijs/qs/issues/21) make all limits optional, for #18, for #20 - -## [**1.2.2**](https://github.com/hapijs/qs/issues?milestone=6&state=closed) -- [**#19**](https://github.com/hapijs/qs/issues/19) Don't overwrite null values - -## [**1.2.1**](https://github.com/hapijs/qs/issues?milestone=5&state=closed) -- [**#16**](https://github.com/hapijs/qs/issues/16) ignore non-string delimiters -- [**#15**](https://github.com/hapijs/qs/issues/15) Close code block - -## [**1.2.0**](https://github.com/hapijs/qs/issues?milestone=4&state=closed) -- [**#12**](https://github.com/hapijs/qs/issues/12) Add optional delim argument -- [**#13**](https://github.com/hapijs/qs/issues/13) fix #11: flattened keys in array are now correctly parsed - -## [**1.1.0**](https://github.com/hapijs/qs/issues?milestone=3&state=closed) -- [**#7**](https://github.com/hapijs/qs/issues/7) Empty values of a POST array disappear after being submitted -- [**#9**](https://github.com/hapijs/qs/issues/9) Should not omit equals signs (=) when value is null -- [**#6**](https://github.com/hapijs/qs/issues/6) Minor grammar fix in README - -## [**1.0.2**](https://github.com/hapijs/qs/issues?milestone=2&state=closed) -- [**#5**](https://github.com/hapijs/qs/issues/5) array holes incorrectly copied into object on large index diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/CONTRIBUTING.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/CONTRIBUTING.md deleted file mode 100644 index 8928361..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/CONTRIBUTING.md +++ /dev/null @@ -1 +0,0 @@ -Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md). diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/LICENSE deleted file mode 100644 index d456948..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2014 Nathan LaFreniere and other contributors. -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. - * The names of any contributors may not 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 HOLDERS AND 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. - - * * * - -The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/README.md deleted file mode 100644 index 48a0de9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/README.md +++ /dev/null @@ -1,317 +0,0 @@ -# qs - -A querystring parsing and stringifying library with some added security. - -[![Build Status](https://secure.travis-ci.org/hapijs/qs.svg)](http://travis-ci.org/hapijs/qs) - -Lead Maintainer: [Nathan LaFreniere](https://github.com/nlf) - -The **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring). - -## Usage - -```javascript -var Qs = require('qs'); - -var obj = Qs.parse('a=c'); // { a: 'c' } -var str = Qs.stringify(obj); // 'a=c' -``` - -### Parsing Objects - -```javascript -Qs.parse(string, [options]); -``` - -**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`, or prefixing the sub-key with a dot `.`. -For example, the string `'foo[bar]=baz'` converts to: - -```javascript -{ - foo: { - bar: 'baz' - } -} -``` - -When using the `plainObjects` option the parsed value is returned as a plain object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like: - -```javascript -Qs.parse('a.hasOwnProperty=b', { plainObjects: true }); -// { a: { hasOwnProperty: 'b' } } -``` - -By default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option. - -```javascript -Qs.parse('a.hasOwnProperty=b', { allowPrototypes: true }); -// { a: { hasOwnProperty: 'b' } } -``` - -URI encoded strings work too: - -```javascript -Qs.parse('a%5Bb%5D=c'); -// { a: { b: 'c' } } -``` - -You can also nest your objects, like `'foo[bar][baz]=foobarbaz'`: - -```javascript -{ - foo: { - bar: { - baz: 'foobarbaz' - } - } -} -``` - -By default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like -`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be: - -```javascript -{ - a: { - b: { - c: { - d: { - e: { - f: { - '[g][h][i]': 'j' - } - } - } - } - } - } -} -``` - -This depth can be overridden by passing a `depth` option to `Qs.parse(string, [options])`: - -```javascript -Qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 }); -// { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } } -``` - -The depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number. - -For similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option: - -```javascript -Qs.parse('a=b&c=d', { parameterLimit: 1 }); -// { a: 'b' } -``` - -An optional delimiter can also be passed: - -```javascript -Qs.parse('a=b;c=d', { delimiter: ';' }); -// { a: 'b', c: 'd' } -``` - -Delimiters can be a regular expression too: - -```javascript -Qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ }); -// { a: 'b', c: 'd', e: 'f' } -``` - -Option `allowDots` can be used to disable dot notation: - -```javascript -Qs.parse('a.b=c', { allowDots: false }); -// { 'a.b': 'c' } } -``` - -### Parsing Arrays - -**qs** can also parse arrays using a similar `[]` notation: - -```javascript -Qs.parse('a[]=b&a[]=c'); -// { a: ['b', 'c'] } -``` - -You may specify an index as well: - -```javascript -Qs.parse('a[1]=c&a[0]=b'); -// { a: ['b', 'c'] } -``` - -Note that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number -to create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving -their order: - -```javascript -Qs.parse('a[1]=b&a[15]=c'); -// { a: ['b', 'c'] } -``` - -Note that an empty string is also a value, and will be preserved: - -```javascript -Qs.parse('a[]=&a[]=b'); -// { a: ['', 'b'] } -Qs.parse('a[0]=b&a[1]=&a[2]=c'); -// { a: ['b', '', 'c'] } -``` - -**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will -instead be converted to an object with the index as the key: - -```javascript -Qs.parse('a[100]=b'); -// { a: { '100': 'b' } } -``` - -This limit can be overridden by passing an `arrayLimit` option: - -```javascript -Qs.parse('a[1]=b', { arrayLimit: 0 }); -// { a: { '1': 'b' } } -``` - -To disable array parsing entirely, set `parseArrays` to `false`. - -```javascript -Qs.parse('a[]=b', { parseArrays: false }); -// { a: { '0': 'b' } } -``` - -If you mix notations, **qs** will merge the two items into an object: - -```javascript -Qs.parse('a[0]=b&a[b]=c'); -// { a: { '0': 'b', b: 'c' } } -``` - -You can also create arrays of objects: - -```javascript -Qs.parse('a[][b]=c'); -// { a: [{ b: 'c' }] } -``` - -### Stringifying - -```javascript -Qs.stringify(object, [options]); -``` - -When stringifying, **qs** always URI encodes output. Objects are stringified as you would expect: - -```javascript -Qs.stringify({ a: 'b' }); -// 'a=b' -Qs.stringify({ a: { b: 'c' } }); -// 'a%5Bb%5D=c' -``` - -Examples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage. - -When arrays are stringified, by default they are given explicit indices: - -```javascript -Qs.stringify({ a: ['b', 'c', 'd'] }); -// 'a[0]=b&a[1]=c&a[2]=d' -``` - -You may override this by setting the `indices` option to `false`: - -```javascript -Qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }); -// 'a=b&a=c&a=d' -``` - -You may use the `arrayFormat` option to specify the format of the output array - -```javascript -Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }) -// 'a[0]=b&a[1]=c' -Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }) -// 'a[]=b&a[]=c' -Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }) -// 'a=b&a=c' -``` - -Empty strings and null values will omit the value, but the equals sign (=) remains in place: - -```javascript -Qs.stringify({ a: '' }); -// 'a=' -``` - -Properties that are set to `undefined` will be omitted entirely: - -```javascript -Qs.stringify({ a: null, b: undefined }); -// 'a=' -``` - -The delimiter may be overridden with stringify as well: - -```javascript -Qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }); -// 'a=b;c=d' -``` - -Finally, you can use the `filter` option to restrict which keys will be included in the stringified output. -If you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you -pass an array, it will be used to select properties and array indices for stringification: - -```javascript -function filterFunc(prefix, value) { - if (prefix == 'b') { - // Return an `undefined` value to omit a property. - return; - } - if (prefix == 'e[f]') { - return value.getTime(); - } - if (prefix == 'e[g][0]') { - return value * 2; - } - return value; -} -Qs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc }) -// 'a=b&c=d&e[f]=123&e[g][0]=4' -Qs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] }) -// 'a=b&e=f' -Qs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] }) -// 'a[0]=b&a[2]=d' -``` - -### Handling of `null` values - -By default, `null` values are treated like empty strings: - -```javascript -Qs.stringify({ a: null, b: '' }); -// 'a=&b=' -``` - -Parsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings. - -```javascript -Qs.parse('a&b=') -// { a: '', b: '' } -``` - -To distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null` -values have no `=` sign: - -```javascript -Qs.stringify({ a: null, b: '' }, { strictNullHandling: true }); -// 'a&b=' -``` - -To parse values without `=` back to `null` use the `strictNullHandling` flag: - -```javascript -Qs.parse('a&b=', { strictNullHandling: true }); -// { a: null, b: '' } - -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/bower.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/bower.json deleted file mode 100644 index ffd0641..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/bower.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "qs", - "main": "dist/qs.js", - "version": "3.0.0", - "homepage": "https://github.com/hapijs/qs", - "authors": [ - "Nathan LaFreniere " - ], - "description": "A querystring parser that supports nesting and arrays, with a depth limit", - "keywords": [ - "querystring", - "qs" - ], - "license": "BSD-3-Clause", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/index.js deleted file mode 100644 index 0e09493..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/index.js +++ /dev/null @@ -1,15 +0,0 @@ -// Load modules - -var Stringify = require('./stringify'); -var Parse = require('./parse'); - - -// Declare internals - -var internals = {}; - - -module.exports = { - stringify: Stringify, - parse: Parse -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/parse.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/parse.js deleted file mode 100644 index e7c56c5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/parse.js +++ /dev/null @@ -1,186 +0,0 @@ -// Load modules - -var Utils = require('./utils'); - - -// Declare internals - -var internals = { - delimiter: '&', - depth: 5, - arrayLimit: 20, - parameterLimit: 1000, - strictNullHandling: false, - plainObjects: false, - allowPrototypes: false -}; - - -internals.parseValues = function (str, options) { - - var obj = {}; - var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit); - - for (var i = 0, il = parts.length; i < il; ++i) { - var part = parts[i]; - var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1; - - if (pos === -1) { - obj[Utils.decode(part)] = ''; - - if (options.strictNullHandling) { - obj[Utils.decode(part)] = null; - } - } - else { - var key = Utils.decode(part.slice(0, pos)); - var val = Utils.decode(part.slice(pos + 1)); - - if (!Object.prototype.hasOwnProperty.call(obj, key)) { - obj[key] = val; - } - else { - obj[key] = [].concat(obj[key]).concat(val); - } - } - } - - return obj; -}; - - -internals.parseObject = function (chain, val, options) { - - if (!chain.length) { - return val; - } - - var root = chain.shift(); - - var obj; - if (root === '[]') { - obj = []; - obj = obj.concat(internals.parseObject(chain, val, options)); - } - else { - obj = options.plainObjects ? Object.create(null) : {}; - var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root; - var index = parseInt(cleanRoot, 10); - var indexString = '' + index; - if (!isNaN(index) && - root !== cleanRoot && - indexString === cleanRoot && - index >= 0 && - (options.parseArrays && - index <= options.arrayLimit)) { - - obj = []; - obj[index] = internals.parseObject(chain, val, options); - } - else { - obj[cleanRoot] = internals.parseObject(chain, val, options); - } - } - - return obj; -}; - - -internals.parseKeys = function (key, val, options) { - - if (!key) { - return; - } - - // Transform dot notation to bracket notation - - if (options.allowDots) { - key = key.replace(/\.([^\.\[]+)/g, '[$1]'); - } - - // The regex chunks - - var parent = /^([^\[\]]*)/; - var child = /(\[[^\[\]]*\])/g; - - // Get the parent - - var segment = parent.exec(key); - - // Stash the parent if it exists - - var keys = []; - if (segment[1]) { - // If we aren't using plain objects, optionally prefix keys - // that would overwrite object prototype properties - if (!options.plainObjects && - Object.prototype.hasOwnProperty(segment[1])) { - - if (!options.allowPrototypes) { - return; - } - } - - keys.push(segment[1]); - } - - // Loop through children appending to the array until we hit depth - - var i = 0; - while ((segment = child.exec(key)) !== null && i < options.depth) { - - ++i; - if (!options.plainObjects && - Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) { - - if (!options.allowPrototypes) { - continue; - } - } - keys.push(segment[1]); - } - - // If there's a remainder, just add whatever is left - - if (segment) { - keys.push('[' + key.slice(segment.index) + ']'); - } - - return internals.parseObject(keys, val, options); -}; - - -module.exports = function (str, options) { - - options = options || {}; - options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : internals.delimiter; - options.depth = typeof options.depth === 'number' ? options.depth : internals.depth; - options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : internals.arrayLimit; - options.parseArrays = options.parseArrays !== false; - options.allowDots = options.allowDots !== false; - options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : internals.plainObjects; - options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : internals.allowPrototypes; - options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : internals.parameterLimit; - options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling; - - if (str === '' || - str === null || - typeof str === 'undefined') { - - return options.plainObjects ? Object.create(null) : {}; - } - - var tempObj = typeof str === 'string' ? internals.parseValues(str, options) : str; - var obj = options.plainObjects ? Object.create(null) : {}; - - // Iterate over the keys and setup the new object - - var keys = Object.keys(tempObj); - for (var i = 0, il = keys.length; i < il; ++i) { - var key = keys[i]; - var newObj = internals.parseKeys(key, tempObj[key], options); - obj = Utils.merge(obj, newObj, options); - } - - return Utils.compact(obj); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/stringify.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/stringify.js deleted file mode 100644 index 7414284..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/stringify.js +++ /dev/null @@ -1,121 +0,0 @@ -// Load modules - -var Utils = require('./utils'); - - -// Declare internals - -var internals = { - delimiter: '&', - arrayPrefixGenerators: { - brackets: function (prefix, key) { - - return prefix + '[]'; - }, - indices: function (prefix, key) { - - return prefix + '[' + key + ']'; - }, - repeat: function (prefix, key) { - - return prefix; - } - }, - strictNullHandling: false -}; - - -internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, filter) { - - if (typeof filter === 'function') { - obj = filter(prefix, obj); - } - else if (Utils.isBuffer(obj)) { - obj = obj.toString(); - } - else if (obj instanceof Date) { - obj = obj.toISOString(); - } - else if (obj === null) { - if (strictNullHandling) { - return Utils.encode(prefix); - } - - obj = ''; - } - - if (typeof obj === 'string' || - typeof obj === 'number' || - typeof obj === 'boolean') { - - return [Utils.encode(prefix) + '=' + Utils.encode(obj)]; - } - - var values = []; - - if (typeof obj === 'undefined') { - return values; - } - - var objKeys = Array.isArray(filter) ? filter : Object.keys(obj); - for (var i = 0, il = objKeys.length; i < il; ++i) { - var key = objKeys[i]; - - if (Array.isArray(obj)) { - values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, filter)); - } - else { - values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix, strictNullHandling, filter)); - } - } - - return values; -}; - - -module.exports = function (obj, options) { - - options = options || {}; - var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter; - var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling; - var objKeys; - var filter; - if (typeof options.filter === 'function') { - filter = options.filter; - obj = filter('', obj); - } - else if (Array.isArray(options.filter)) { - objKeys = filter = options.filter; - } - - var keys = []; - - if (typeof obj !== 'object' || - obj === null) { - - return ''; - } - - var arrayFormat; - if (options.arrayFormat in internals.arrayPrefixGenerators) { - arrayFormat = options.arrayFormat; - } - else if ('indices' in options) { - arrayFormat = options.indices ? 'indices' : 'repeat'; - } - else { - arrayFormat = 'indices'; - } - - var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat]; - - if (!objKeys) { - objKeys = Object.keys(obj); - } - for (var i = 0, il = objKeys.length; i < il; ++i) { - var key = objKeys[i]; - keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, filter)); - } - - return keys.join(delimiter); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/utils.js deleted file mode 100644 index 88f3147..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/lib/utils.js +++ /dev/null @@ -1,190 +0,0 @@ -// Load modules - - -// Declare internals - -var internals = {}; -internals.hexTable = new Array(256); -for (var h = 0; h < 256; ++h) { - internals.hexTable[h] = '%' + ((h < 16 ? '0' : '') + h.toString(16)).toUpperCase(); -} - - -exports.arrayToObject = function (source, options) { - - var obj = options.plainObjects ? Object.create(null) : {}; - for (var i = 0, il = source.length; i < il; ++i) { - if (typeof source[i] !== 'undefined') { - - obj[i] = source[i]; - } - } - - return obj; -}; - - -exports.merge = function (target, source, options) { - - if (!source) { - return target; - } - - if (typeof source !== 'object') { - if (Array.isArray(target)) { - target.push(source); - } - else if (typeof target === 'object') { - target[source] = true; - } - else { - target = [target, source]; - } - - return target; - } - - if (typeof target !== 'object') { - target = [target].concat(source); - return target; - } - - if (Array.isArray(target) && - !Array.isArray(source)) { - - target = exports.arrayToObject(target, options); - } - - var keys = Object.keys(source); - for (var k = 0, kl = keys.length; k < kl; ++k) { - var key = keys[k]; - var value = source[key]; - - if (!Object.prototype.hasOwnProperty.call(target, key)) { - target[key] = value; - } - else { - target[key] = exports.merge(target[key], value, options); - } - } - - return target; -}; - - -exports.decode = function (str) { - - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (e) { - return str; - } -}; - -exports.encode = function (str) { - - // This code was originally written by Brian White (mscdex) for the io.js core querystring library. - // It has been adapted here for stricter adherence to RFC 3986 - if (str.length === 0) { - return str; - } - - if (typeof str !== 'string') { - str = '' + str; - } - - var out = ''; - for (var i = 0, il = str.length; i < il; ++i) { - var c = str.charCodeAt(i); - - if (c === 0x2D || // - - c === 0x2E || // . - c === 0x5F || // _ - c === 0x7E || // ~ - (c >= 0x30 && c <= 0x39) || // 0-9 - (c >= 0x41 && c <= 0x5A) || // a-z - (c >= 0x61 && c <= 0x7A)) { // A-Z - - out += str[i]; - continue; - } - - if (c < 0x80) { - out += internals.hexTable[c]; - continue; - } - - if (c < 0x800) { - out += internals.hexTable[0xC0 | (c >> 6)] + internals.hexTable[0x80 | (c & 0x3F)]; - continue; - } - - if (c < 0xD800 || c >= 0xE000) { - out += internals.hexTable[0xE0 | (c >> 12)] + internals.hexTable[0x80 | ((c >> 6) & 0x3F)] + internals.hexTable[0x80 | (c & 0x3F)]; - continue; - } - - ++i; - c = 0x10000 + (((c & 0x3FF) << 10) | (str.charCodeAt(i) & 0x3FF)); - out += internals.hexTable[0xF0 | (c >> 18)] + internals.hexTable[0x80 | ((c >> 12) & 0x3F)] + internals.hexTable[0x80 | ((c >> 6) & 0x3F)] + internals.hexTable[0x80 | (c & 0x3F)]; - } - - return out; -}; - -exports.compact = function (obj, refs) { - - if (typeof obj !== 'object' || - obj === null) { - - return obj; - } - - refs = refs || []; - var lookup = refs.indexOf(obj); - if (lookup !== -1) { - return refs[lookup]; - } - - refs.push(obj); - - if (Array.isArray(obj)) { - var compacted = []; - - for (var i = 0, il = obj.length; i < il; ++i) { - if (typeof obj[i] !== 'undefined') { - compacted.push(obj[i]); - } - } - - return compacted; - } - - var keys = Object.keys(obj); - for (i = 0, il = keys.length; i < il; ++i) { - var key = keys[i]; - obj[key] = exports.compact(obj[key], refs); - } - - return obj; -}; - - -exports.isRegExp = function (obj) { - - return Object.prototype.toString.call(obj) === '[object RegExp]'; -}; - - -exports.isBuffer = function (obj) { - - if (obj === null || - typeof obj === 'undefined') { - - return false; - } - - return !!(obj.constructor && - obj.constructor.isBuffer && - obj.constructor.isBuffer(obj)); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/package.json deleted file mode 100644 index 1bae0ed..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "qs", - "version": "4.0.0", - "description": "A querystring parser that supports nesting and arrays, with a depth limit", - "homepage": "https://github.com/hapijs/qs", - "main": "lib/index.js", - "dependencies": {}, - "devDependencies": { - "browserify": "^10.2.1", - "code": "1.x.x", - "lab": "5.x.x" - }, - "scripts": { - "test": "lab -a code -t 100 -L", - "test-cov-html": "lab -a code -r html -o coverage.html", - "dist": "browserify --standalone Qs lib/index.js > dist/qs.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/hapijs/qs.git" - }, - "keywords": [ - "querystring", - "qs" - ], - "license": "BSD-3-Clause", - "gitHead": "e573dd08eae6cce30d2202704691a102dfa3782a", - "bugs": { - "url": "https://github.com/hapijs/qs/issues" - }, - "_id": "qs@4.0.0", - "_shasum": "c31d9b74ec27df75e543a86c78728ed8d4623607", - "_from": "qs@4.0.0", - "_npmVersion": "2.12.0", - "_nodeVersion": "0.12.4", - "_npmUser": { - "name": "nlf", - "email": "quitlahok@gmail.com" - }, - "dist": { - "shasum": "c31d9b74ec27df75e543a86c78728ed8d4623607", - "tarball": "http://registry.npmjs.org/qs/-/qs-4.0.0.tgz" - }, - "maintainers": [ - { - "name": "nlf", - "email": "quitlahok@gmail.com" - }, - { - "name": "hueniverse", - "email": "eran@hueniverse.com" - } - ], - "directories": {}, - "_resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/test/parse.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/test/parse.js deleted file mode 100644 index a19d764..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/test/parse.js +++ /dev/null @@ -1,478 +0,0 @@ -/* eslint no-extend-native:0 */ -// Load modules - -var Code = require('code'); -var Lab = require('lab'); -var Qs = require('../'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var expect = Code.expect; -var describe = lab.experiment; -var it = lab.test; - - -describe('parse()', function () { - - it('parses a simple string', function (done) { - - expect(Qs.parse('0=foo')).to.deep.equal({ '0': 'foo' }); - expect(Qs.parse('foo=c++')).to.deep.equal({ foo: 'c ' }); - expect(Qs.parse('a[>=]=23')).to.deep.equal({ a: { '>=': '23' } }); - expect(Qs.parse('a[<=>]==23')).to.deep.equal({ a: { '<=>': '=23' } }); - expect(Qs.parse('a[==]=23')).to.deep.equal({ a: { '==': '23' } }); - expect(Qs.parse('foo', { strictNullHandling: true })).to.deep.equal({ foo: null }); - expect(Qs.parse('foo' )).to.deep.equal({ foo: '' }); - expect(Qs.parse('foo=')).to.deep.equal({ foo: '' }); - expect(Qs.parse('foo=bar')).to.deep.equal({ foo: 'bar' }); - expect(Qs.parse(' foo = bar = baz ')).to.deep.equal({ ' foo ': ' bar = baz ' }); - expect(Qs.parse('foo=bar=baz')).to.deep.equal({ foo: 'bar=baz' }); - expect(Qs.parse('foo=bar&bar=baz')).to.deep.equal({ foo: 'bar', bar: 'baz' }); - expect(Qs.parse('foo2=bar2&baz2=')).to.deep.equal({ foo2: 'bar2', baz2: '' }); - expect(Qs.parse('foo=bar&baz', { strictNullHandling: true })).to.deep.equal({ foo: 'bar', baz: null }); - expect(Qs.parse('foo=bar&baz')).to.deep.equal({ foo: 'bar', baz: '' }); - expect(Qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World')).to.deep.equal({ - cht: 'p3', - chd: 't:60,40', - chs: '250x100', - chl: 'Hello|World' - }); - done(); - }); - - it('allows disabling dot notation', function (done) { - - expect(Qs.parse('a.b=c')).to.deep.equal({ a: { b: 'c' } }); - expect(Qs.parse('a.b=c', { allowDots: false })).to.deep.equal({ 'a.b': 'c' }); - done(); - }); - - it('parses a single nested string', function (done) { - - expect(Qs.parse('a[b]=c')).to.deep.equal({ a: { b: 'c' } }); - done(); - }); - - it('parses a double nested string', function (done) { - - expect(Qs.parse('a[b][c]=d')).to.deep.equal({ a: { b: { c: 'd' } } }); - done(); - }); - - it('defaults to a depth of 5', function (done) { - - expect(Qs.parse('a[b][c][d][e][f][g][h]=i')).to.deep.equal({ a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } }); - done(); - }); - - it('only parses one level when depth = 1', function (done) { - - expect(Qs.parse('a[b][c]=d', { depth: 1 })).to.deep.equal({ a: { b: { '[c]': 'd' } } }); - expect(Qs.parse('a[b][c][d]=e', { depth: 1 })).to.deep.equal({ a: { b: { '[c][d]': 'e' } } }); - done(); - }); - - it('parses a simple array', function (done) { - - expect(Qs.parse('a=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); - done(); - }); - - it('parses an explicit array', function (done) { - - expect(Qs.parse('a[]=b')).to.deep.equal({ a: ['b'] }); - expect(Qs.parse('a[]=b&a[]=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[]=b&a[]=c&a[]=d')).to.deep.equal({ a: ['b', 'c', 'd'] }); - done(); - }); - - it('parses a mix of simple and explicit arrays', function (done) { - - expect(Qs.parse('a=b&a[]=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[]=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[0]=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a=b&a[0]=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[1]=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a=b&a[1]=c')).to.deep.equal({ a: ['b', 'c'] }); - done(); - }); - - it('parses a nested array', function (done) { - - expect(Qs.parse('a[b][]=c&a[b][]=d')).to.deep.equal({ a: { b: ['c', 'd'] } }); - expect(Qs.parse('a[>=]=25')).to.deep.equal({ a: { '>=': '25' } }); - done(); - }); - - it('allows to specify array indices', function (done) { - - expect(Qs.parse('a[1]=c&a[0]=b&a[2]=d')).to.deep.equal({ a: ['b', 'c', 'd'] }); - expect(Qs.parse('a[1]=c&a[0]=b')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[1]=c')).to.deep.equal({ a: ['c'] }); - done(); - }); - - it('limits specific array indices to 20', function (done) { - - expect(Qs.parse('a[20]=a')).to.deep.equal({ a: ['a'] }); - expect(Qs.parse('a[21]=a')).to.deep.equal({ a: { '21': 'a' } }); - done(); - }); - - it('supports keys that begin with a number', function (done) { - - expect(Qs.parse('a[12b]=c')).to.deep.equal({ a: { '12b': 'c' } }); - done(); - }); - - it('supports encoded = signs', function (done) { - - expect(Qs.parse('he%3Dllo=th%3Dere')).to.deep.equal({ 'he=llo': 'th=ere' }); - done(); - }); - - it('is ok with url encoded strings', function (done) { - - expect(Qs.parse('a[b%20c]=d')).to.deep.equal({ a: { 'b c': 'd' } }); - expect(Qs.parse('a[b]=c%20d')).to.deep.equal({ a: { b: 'c d' } }); - done(); - }); - - it('allows brackets in the value', function (done) { - - expect(Qs.parse('pets=["tobi"]')).to.deep.equal({ pets: '["tobi"]' }); - expect(Qs.parse('operators=[">=", "<="]')).to.deep.equal({ operators: '[">=", "<="]' }); - done(); - }); - - it('allows empty values', function (done) { - - expect(Qs.parse('')).to.deep.equal({}); - expect(Qs.parse(null)).to.deep.equal({}); - expect(Qs.parse(undefined)).to.deep.equal({}); - done(); - }); - - it('transforms arrays to objects', function (done) { - - expect(Qs.parse('foo[0]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }); - expect(Qs.parse('foo[bad]=baz&foo[0]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); - expect(Qs.parse('foo[bad]=baz&foo[]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); - expect(Qs.parse('foo[]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }); - expect(Qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar', '1': 'foo' } }); - expect(Qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb')).to.deep.equal({ foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); - expect(Qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c')).to.deep.equal({ a: { '0': 'b', t: 'u', c: true } }); - expect(Qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y')).to.deep.equal({ a: { '0': 'b', '1': 'c', x: 'y' } }); - done(); - }); - - it('transforms arrays to objects (dot notation)', function (done) { - - expect(Qs.parse('foo[0].baz=bar&fool.bad=baz')).to.deep.equal({ foo: [{ baz: 'bar' }], fool: { bad: 'baz' } }); - expect(Qs.parse('foo[0].baz=bar&fool.bad.boo=baz')).to.deep.equal({ foo: [{ baz: 'bar' }], fool: { bad: { boo: 'baz' } } }); - expect(Qs.parse('foo[0][0].baz=bar&fool.bad=baz')).to.deep.equal({ foo: [[{ baz: 'bar' }]], fool: { bad: 'baz' } }); - expect(Qs.parse('foo[0].baz[0]=15&foo[0].bar=2')).to.deep.equal({ foo: [{ baz: ['15'], bar: '2' }] }); - expect(Qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2')).to.deep.equal({ foo: [{ baz: ['15', '16'], bar: '2' }] }); - expect(Qs.parse('foo.bad=baz&foo[0]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); - expect(Qs.parse('foo.bad=baz&foo[]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); - expect(Qs.parse('foo[]=bar&foo.bad=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }); - expect(Qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar', '1': 'foo' } }); - expect(Qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb')).to.deep.equal({ foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); - done(); - }); - - it('can add keys to objects', function (done) { - - expect(Qs.parse('a[b]=c&a=d')).to.deep.equal({ a: { b: 'c', d: true } }); - done(); - }); - - it('correctly prunes undefined values when converting an array to an object', function (done) { - - expect(Qs.parse('a[2]=b&a[99999999]=c')).to.deep.equal({ a: { '2': 'b', '99999999': 'c' } }); - done(); - }); - - it('supports malformed uri characters', function (done) { - - expect(Qs.parse('{%:%}', { strictNullHandling: true })).to.deep.equal({ '{%:%}': null }); - expect(Qs.parse('{%:%}=')).to.deep.equal({ '{%:%}': '' }); - expect(Qs.parse('foo=%:%}')).to.deep.equal({ foo: '%:%}' }); - done(); - }); - - it('doesn\'t produce empty keys', function (done) { - - expect(Qs.parse('_r=1&')).to.deep.equal({ '_r': '1' }); - done(); - }); - - it('cannot access Object prototype', function (done) { - - Qs.parse('constructor[prototype][bad]=bad'); - Qs.parse('bad[constructor][prototype][bad]=bad'); - expect(typeof Object.prototype.bad).to.equal('undefined'); - done(); - }); - - it('parses arrays of objects', function (done) { - - expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }); - expect(Qs.parse('a[0][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }); - done(); - }); - - it('allows for empty strings in arrays', function (done) { - - expect(Qs.parse('a[]=b&a[]=&a[]=c')).to.deep.equal({ a: ['b', '', 'c'] }); - expect(Qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', { strictNullHandling: true })).to.deep.equal({ a: ['b', null, 'c', ''] }); - expect(Qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', { strictNullHandling: true })).to.deep.equal({ a: ['b', '', 'c', null] }); - expect(Qs.parse('a[]=&a[]=b&a[]=c')).to.deep.equal({ a: ['', 'b', 'c'] }); - done(); - }); - - it('compacts sparse arrays', function (done) { - - expect(Qs.parse('a[10]=1&a[2]=2')).to.deep.equal({ a: ['2', '1'] }); - done(); - }); - - it('parses semi-parsed strings', function (done) { - - expect(Qs.parse({ 'a[b]': 'c' })).to.deep.equal({ a: { b: 'c' } }); - expect(Qs.parse({ 'a[b]': 'c', 'a[d]': 'e' })).to.deep.equal({ a: { b: 'c', d: 'e' } }); - done(); - }); - - it('parses buffers correctly', function (done) { - - var b = new Buffer('test'); - expect(Qs.parse({ a: b })).to.deep.equal({ a: b }); - done(); - }); - - it('continues parsing when no parent is found', function (done) { - - expect(Qs.parse('[]=&a=b')).to.deep.equal({ '0': '', a: 'b' }); - expect(Qs.parse('[]&a=b', { strictNullHandling: true })).to.deep.equal({ '0': null, a: 'b' }); - expect(Qs.parse('[foo]=bar')).to.deep.equal({ foo: 'bar' }); - done(); - }); - - it('does not error when parsing a very long array', function (done) { - - var str = 'a[]=a'; - while (Buffer.byteLength(str) < 128 * 1024) { - str += '&' + str; - } - - expect(function () { - - Qs.parse(str); - }).to.not.throw(); - - done(); - }); - - it('should not throw when a native prototype has an enumerable property', { parallel: false }, function (done) { - - Object.prototype.crash = ''; - Array.prototype.crash = ''; - expect(Qs.parse.bind(null, 'a=b')).to.not.throw(); - expect(Qs.parse('a=b')).to.deep.equal({ a: 'b' }); - expect(Qs.parse.bind(null, 'a[][b]=c')).to.not.throw(); - expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }); - delete Object.prototype.crash; - delete Array.prototype.crash; - done(); - }); - - it('parses a string with an alternative string delimiter', function (done) { - - expect(Qs.parse('a=b;c=d', { delimiter: ';' })).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('parses a string with an alternative RegExp delimiter', function (done) { - - expect(Qs.parse('a=b; c=d', { delimiter: /[;,] */ })).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('does not use non-splittable objects as delimiters', function (done) { - - expect(Qs.parse('a=b&c=d', { delimiter: true })).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('allows overriding parameter limit', function (done) { - - expect(Qs.parse('a=b&c=d', { parameterLimit: 1 })).to.deep.equal({ a: 'b' }); - done(); - }); - - it('allows setting the parameter limit to Infinity', function (done) { - - expect(Qs.parse('a=b&c=d', { parameterLimit: Infinity })).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('allows overriding array limit', function (done) { - - expect(Qs.parse('a[0]=b', { arrayLimit: -1 })).to.deep.equal({ a: { '0': 'b' } }); - expect(Qs.parse('a[-1]=b', { arrayLimit: -1 })).to.deep.equal({ a: { '-1': 'b' } }); - expect(Qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 })).to.deep.equal({ a: { '0': 'b', '1': 'c' } }); - done(); - }); - - it('allows disabling array parsing', function (done) { - - expect(Qs.parse('a[0]=b&a[1]=c', { parseArrays: false })).to.deep.equal({ a: { '0': 'b', '1': 'c' } }); - done(); - }); - - it('parses an object', function (done) { - - var input = { - 'user[name]': { 'pop[bob]': 3 }, - 'user[email]': null - }; - - var expected = { - 'user': { - 'name': { 'pop[bob]': 3 }, - 'email': null - } - }; - - var result = Qs.parse(input); - - expect(result).to.deep.equal(expected); - done(); - }); - - it('parses an object in dot notation', function (done) { - - var input = { - 'user.name': { 'pop[bob]': 3 }, - 'user.email.': null - }; - - var expected = { - 'user': { - 'name': { 'pop[bob]': 3 }, - 'email': null - } - }; - - var result = Qs.parse(input); - - expect(result).to.deep.equal(expected); - done(); - }); - - it('parses an object and not child values', function (done) { - - var input = { - 'user[name]': { 'pop[bob]': { 'test': 3 } }, - 'user[email]': null - }; - - var expected = { - 'user': { - 'name': { 'pop[bob]': { 'test': 3 } }, - 'email': null - } - }; - - var result = Qs.parse(input); - - expect(result).to.deep.equal(expected); - done(); - }); - - it('does not blow up when Buffer global is missing', function (done) { - - var tempBuffer = global.Buffer; - delete global.Buffer; - var result = Qs.parse('a=b&c=d'); - global.Buffer = tempBuffer; - expect(result).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('does not crash when parsing circular references', function (done) { - - var a = {}; - a.b = a; - - var parsed; - - expect(function () { - - parsed = Qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a }); - }).to.not.throw(); - - expect(parsed).to.contain('foo'); - expect(parsed.foo).to.contain('bar', 'baz'); - expect(parsed.foo.bar).to.equal('baz'); - expect(parsed.foo.baz).to.deep.equal(a); - done(); - }); - - it('parses plain objects correctly', function (done) { - - var a = Object.create(null); - a.b = 'c'; - - expect(Qs.parse(a)).to.deep.equal({ b: 'c' }); - var result = Qs.parse({ a: a }); - expect(result).to.contain('a'); - expect(result.a).to.deep.equal(a); - done(); - }); - - it('parses dates correctly', function (done) { - - var now = new Date(); - expect(Qs.parse({ a: now })).to.deep.equal({ a: now }); - done(); - }); - - it('parses regular expressions correctly', function (done) { - - var re = /^test$/; - expect(Qs.parse({ a: re })).to.deep.equal({ a: re }); - done(); - }); - - it('can allow overwriting prototype properties', function (done) { - - expect(Qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true })).to.deep.equal({ a: { hasOwnProperty: 'b' } }, { prototype: false }); - expect(Qs.parse('hasOwnProperty=b', { allowPrototypes: true })).to.deep.equal({ hasOwnProperty: 'b' }, { prototype: false }); - done(); - }); - - it('can return plain objects', function (done) { - - var expected = Object.create(null); - expected.a = Object.create(null); - expected.a.b = 'c'; - expected.a.hasOwnProperty = 'd'; - expect(Qs.parse('a[b]=c&a[hasOwnProperty]=d', { plainObjects: true })).to.deep.equal(expected); - expect(Qs.parse(null, { plainObjects: true })).to.deep.equal(Object.create(null)); - var expectedArray = Object.create(null); - expectedArray.a = Object.create(null); - expectedArray.a['0'] = 'b'; - expectedArray.a.c = 'd'; - expect(Qs.parse('a[]=b&a[c]=d', { plainObjects: true })).to.deep.equal(expectedArray); - done(); - }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/test/stringify.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/test/stringify.js deleted file mode 100644 index 48b7803..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/test/stringify.js +++ /dev/null @@ -1,259 +0,0 @@ -/* eslint no-extend-native:0 */ -// Load modules - -var Code = require('code'); -var Lab = require('lab'); -var Qs = require('../'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var expect = Code.expect; -var describe = lab.experiment; -var it = lab.test; - - -describe('stringify()', function () { - - it('stringifies a querystring object', function (done) { - - expect(Qs.stringify({ a: 'b' })).to.equal('a=b'); - expect(Qs.stringify({ a: 1 })).to.equal('a=1'); - expect(Qs.stringify({ a: 1, b: 2 })).to.equal('a=1&b=2'); - expect(Qs.stringify({ a: 'A_Z' })).to.equal('a=A_Z'); - expect(Qs.stringify({ a: '€' })).to.equal('a=%E2%82%AC'); - expect(Qs.stringify({ a: '' })).to.equal('a=%EE%80%80'); - expect(Qs.stringify({ a: 'א' })).to.equal('a=%D7%90'); - expect(Qs.stringify({ a: '𐐷' })).to.equal('a=%F0%90%90%B7'); - done(); - }); - - it('stringifies a nested object', function (done) { - - expect(Qs.stringify({ a: { b: 'c' } })).to.equal('a%5Bb%5D=c'); - expect(Qs.stringify({ a: { b: { c: { d: 'e' } } } })).to.equal('a%5Bb%5D%5Bc%5D%5Bd%5D=e'); - done(); - }); - - it('stringifies an array value', function (done) { - - expect(Qs.stringify({ a: ['b', 'c', 'd'] })).to.equal('a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d'); - done(); - }); - - it('omits array indices when asked', function (done) { - - expect(Qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false })).to.equal('a=b&a=c&a=d'); - done(); - }); - - it('stringifies a nested array value', function (done) { - - expect(Qs.stringify({ a: { b: ['c', 'd'] } })).to.equal('a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); - done(); - }); - - it('stringifies an object inside an array', function (done) { - - expect(Qs.stringify({ a: [{ b: 'c' }] })).to.equal('a%5B0%5D%5Bb%5D=c'); - expect(Qs.stringify({ a: [{ b: { c: [1] } }] })).to.equal('a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1'); - done(); - }); - - it('does not omit object keys when indices = false', function (done) { - - expect(Qs.stringify({ a: [{ b: 'c' }] }, { indices: false })).to.equal('a%5Bb%5D=c'); - done(); - }); - - it('uses indices notation for arrays when indices=true', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] }, { indices: true })).to.equal('a%5B0%5D=b&a%5B1%5D=c'); - done(); - }); - - it('uses indices notation for arrays when no arrayFormat is specified', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] })).to.equal('a%5B0%5D=b&a%5B1%5D=c'); - done(); - }); - - it('uses indices notation for arrays when no arrayFormat=indices', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })).to.equal('a%5B0%5D=b&a%5B1%5D=c'); - done(); - }); - - it('uses repeat notation for arrays when no arrayFormat=repeat', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })).to.equal('a=b&a=c'); - done(); - }); - - it('uses brackets notation for arrays when no arrayFormat=brackets', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })).to.equal('a%5B%5D=b&a%5B%5D=c'); - done(); - }); - - it('stringifies a complicated object', function (done) { - - expect(Qs.stringify({ a: { b: 'c', d: 'e' } })).to.equal('a%5Bb%5D=c&a%5Bd%5D=e'); - done(); - }); - - it('stringifies an empty value', function (done) { - - expect(Qs.stringify({ a: '' })).to.equal('a='); - expect(Qs.stringify({ a: null }, { strictNullHandling: true })).to.equal('a'); - - expect(Qs.stringify({ a: '', b: '' })).to.equal('a=&b='); - expect(Qs.stringify({ a: null, b: '' }, { strictNullHandling: true })).to.equal('a&b='); - - expect(Qs.stringify({ a: { b: '' } })).to.equal('a%5Bb%5D='); - expect(Qs.stringify({ a: { b: null } }, { strictNullHandling: true })).to.equal('a%5Bb%5D'); - expect(Qs.stringify({ a: { b: null } }, { strictNullHandling: false })).to.equal('a%5Bb%5D='); - - done(); - }); - - it('stringifies an empty object', function (done) { - - var obj = Object.create(null); - obj.a = 'b'; - expect(Qs.stringify(obj)).to.equal('a=b'); - done(); - }); - - it('returns an empty string for invalid input', function (done) { - - expect(Qs.stringify(undefined)).to.equal(''); - expect(Qs.stringify(false)).to.equal(''); - expect(Qs.stringify(null)).to.equal(''); - expect(Qs.stringify('')).to.equal(''); - done(); - }); - - it('stringifies an object with an empty object as a child', function (done) { - - var obj = { - a: Object.create(null) - }; - - obj.a.b = 'c'; - expect(Qs.stringify(obj)).to.equal('a%5Bb%5D=c'); - done(); - }); - - it('drops keys with a value of undefined', function (done) { - - expect(Qs.stringify({ a: undefined })).to.equal(''); - - expect(Qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true })).to.equal('a%5Bc%5D'); - expect(Qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false })).to.equal('a%5Bc%5D='); - expect(Qs.stringify({ a: { b: undefined, c: '' } })).to.equal('a%5Bc%5D='); - done(); - }); - - it('url encodes values', function (done) { - - expect(Qs.stringify({ a: 'b c' })).to.equal('a=b%20c'); - done(); - }); - - it('stringifies a date', function (done) { - - var now = new Date(); - var str = 'a=' + encodeURIComponent(now.toISOString()); - expect(Qs.stringify({ a: now })).to.equal(str); - done(); - }); - - it('stringifies the weird object from qs', function (done) { - - expect(Qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' })).to.equal('my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F'); - done(); - }); - - it('skips properties that are part of the object prototype', function (done) { - - Object.prototype.crash = 'test'; - expect(Qs.stringify({ a: 'b' })).to.equal('a=b'); - expect(Qs.stringify({ a: { b: 'c' } })).to.equal('a%5Bb%5D=c'); - delete Object.prototype.crash; - done(); - }); - - it('stringifies boolean values', function (done) { - - expect(Qs.stringify({ a: true })).to.equal('a=true'); - expect(Qs.stringify({ a: { b: true } })).to.equal('a%5Bb%5D=true'); - expect(Qs.stringify({ b: false })).to.equal('b=false'); - expect(Qs.stringify({ b: { c: false } })).to.equal('b%5Bc%5D=false'); - done(); - }); - - it('stringifies buffer values', function (done) { - - expect(Qs.stringify({ a: new Buffer('test') })).to.equal('a=test'); - expect(Qs.stringify({ a: { b: new Buffer('test') } })).to.equal('a%5Bb%5D=test'); - done(); - }); - - it('stringifies an object using an alternative delimiter', function (done) { - - expect(Qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' })).to.equal('a=b;c=d'); - done(); - }); - - it('doesn\'t blow up when Buffer global is missing', function (done) { - - var tempBuffer = global.Buffer; - delete global.Buffer; - expect(Qs.stringify({ a: 'b', c: 'd' })).to.equal('a=b&c=d'); - global.Buffer = tempBuffer; - done(); - }); - - it('selects properties when filter=array', function (done) { - - expect(Qs.stringify({ a: 'b' }, { filter: ['a'] })).to.equal('a=b'); - expect(Qs.stringify({ a: 1 }, { filter: [] })).to.equal(''); - expect(Qs.stringify({ a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, { filter: ['a', 'b', 0, 2] })).to.equal('a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3'); - done(); - - }); - - it('supports custom representations when filter=function', function (done) { - - var calls = 0; - var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } }; - var filterFunc = function (prefix, value) { - - calls++; - if (calls === 1) { - expect(prefix).to.be.empty(); - expect(value).to.equal(obj); - } - else if (prefix === 'c') { - return; - } - else if (value instanceof Date) { - expect(prefix).to.equal('e[f]'); - return value.getTime(); - } - return value; - }; - - expect(Qs.stringify(obj, { filter: filterFunc })).to.equal('a=b&e%5Bf%5D=1257894000000'); - expect(calls).to.equal(5); - done(); - - }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/test/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/test/utils.js deleted file mode 100644 index a9a6b52..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/qs/test/utils.js +++ /dev/null @@ -1,28 +0,0 @@ -// Load modules - -var Code = require('code'); -var Lab = require('lab'); -var Utils = require('../lib/utils'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var expect = Code.expect; -var describe = lab.experiment; -var it = lab.test; - - -describe('merge()', function () { - - it('can merge two objects with the same key', function (done) { - - expect(Utils.merge({ a: 'b' }, { a: 'c' })).to.deep.equal({ a: ['b', 'c'] }); - done(); - }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/HISTORY.md deleted file mode 100644 index 1bb53bd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/HISTORY.md +++ /dev/null @@ -1,35 +0,0 @@ -1.0.2 / 2014-09-08 -================== - - * Support Node.js 0.6 - -1.0.1 / 2014-09-07 -================== - - * Move repository to jshttp - -1.0.0 / 2013-12-11 -================== - - * Add repository to package.json - * Add MIT license - -0.0.4 / 2012-06-17 -================== - - * Change ret -1 for unsatisfiable and -2 when invalid - -0.0.3 / 2012-06-17 -================== - - * Fix last-byte-pos default to len - 1 - -0.0.2 / 2012-06-14 -================== - - * Add `.type` - -0.0.1 / 2012-06-11 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/LICENSE deleted file mode 100644 index a491841..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2012-2014 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. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/README.md deleted file mode 100644 index 6a2682f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# range-parser - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Range header field parser. - -## Installation - -``` -$ npm install range-parser -``` - -## Examples - -```js -assert(-1 == parse(200, 'bytes=500-20')); -assert(-2 == parse(200, 'bytes=malformed')); -parse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }])); -parse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }])); -parse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }])); -parse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }])); -parse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }])); -parse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }])); -parse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }])); -parse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }])); -parse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }])); -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/range-parser.svg?style=flat -[npm-url]: https://npmjs.org/package/range-parser -[node-version-image]: https://img.shields.io/badge/node.js-%3E%3D_0.6-brightgreen.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/range-parser.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/range-parser -[coveralls-image]: https://img.shields.io/coveralls/jshttp/range-parser.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/range-parser -[downloads-image]: https://img.shields.io/npm/dm/range-parser.svg?style=flat -[downloads-url]: https://npmjs.org/package/range-parser diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/index.js deleted file mode 100644 index 09a6c40..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/index.js +++ /dev/null @@ -1,49 +0,0 @@ - -/** - * Parse "Range" header `str` relative to the given file `size`. - * - * @param {Number} size - * @param {String} str - * @return {Array} - * @api public - */ - -module.exports = function(size, str){ - var valid = true; - var i = str.indexOf('='); - - if (-1 == i) return -2; - - var arr = str.slice(i + 1).split(',').map(function(range){ - var range = range.split('-') - , start = parseInt(range[0], 10) - , end = parseInt(range[1], 10); - - // -nnn - if (isNaN(start)) { - start = size - end; - end = size - 1; - // nnn- - } else if (isNaN(end)) { - end = size - 1; - } - - // limit last-byte-pos to current length - if (end > size - 1) end = size - 1; - - // invalid - if (isNaN(start) - || isNaN(end) - || start > end - || start < 0) valid = false; - - return { - start: start, - end: end - }; - }); - - arr.type = str.slice(0, i); - - return valid ? arr : -1; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/package.json deleted file mode 100644 index c4f8b2f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/range-parser/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "range-parser", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "Range header field string parser", - "version": "1.0.2", - "license": "MIT", - "keywords": [ - "range", - "parser", - "http" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/range-parser" - }, - "devDependencies": { - "istanbul": "0", - "mocha": "1", - "should": "2" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --require should", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --require should", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot --require should" - }, - "gitHead": "ae23b02ce705b56e7f7c48e832d41fa710227ecc", - "bugs": { - "url": "https://github.com/jshttp/range-parser/issues" - }, - "homepage": "https://github.com/jshttp/range-parser", - "_id": "range-parser@1.0.2", - "_shasum": "06a12a42e5131ba8e457cd892044867f2344e549", - "_from": "range-parser@>=1.0.2 <1.1.0", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "06a12a42e5131ba8e457cd892044867f2344e549", - "tarball": "http://registry.npmjs.org/range-parser/-/range-parser-1.0.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/HISTORY.md deleted file mode 100644 index 1fa40b5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/HISTORY.md +++ /dev/null @@ -1,295 +0,0 @@ -0.13.0 / 2015-06-16 -=================== - - * Allow Node.js HTTP server to set `Date` response header - * Fix incorrectly removing `Content-Location` on 304 response - * Improve the default redirect response headers - * Send appropriate headers on default error response - * Use `http-errors` for standard emitted errors - * Use `statuses` instead of `http` module for status messages - * deps: escape-html@1.0.2 - * deps: etag@~1.7.0 - - Improve stat performance by removing hashing - * deps: fresh@0.3.0 - - Add weak `ETag` matching support - * deps: on-finished@~2.3.0 - - Add defined behavior for HTTP `CONNECT` requests - - Add defined behavior for HTTP `Upgrade` requests - - deps: ee-first@1.1.1 - * perf: enable strict mode - * perf: remove unnecessary array allocations - -0.12.3 / 2015-05-13 -=================== - - * deps: debug@~2.2.0 - - deps: ms@0.7.1 - * deps: depd@~1.0.1 - * deps: etag@~1.6.0 - - Improve support for JXcore - - Support "fake" stats objects in environments without `fs` - * deps: ms@0.7.1 - - Prevent extraordinarily long inputs - * deps: on-finished@~2.2.1 - -0.12.2 / 2015-03-13 -=================== - - * Throw errors early for invalid `extensions` or `index` options - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - -0.12.1 / 2015-02-17 -=================== - - * Fix regression sending zero-length files - -0.12.0 / 2015-02-16 -=================== - - * Always read the stat size from the file - * Fix mutating passed-in `options` - * deps: mime@1.3.4 - -0.11.1 / 2015-01-20 -=================== - - * Fix `root` path disclosure - -0.11.0 / 2015-01-05 -=================== - - * deps: debug@~2.1.1 - * deps: etag@~1.5.1 - - deps: crc@3.2.1 - * deps: ms@0.7.0 - - Add `milliseconds` - - Add `msecs` - - Add `secs` - - Add `mins` - - Add `hrs` - - Add `yrs` - * deps: on-finished@~2.2.0 - -0.10.1 / 2014-10-22 -=================== - - * deps: on-finished@~2.1.1 - - Fix handling of pipelined requests - -0.10.0 / 2014-10-15 -=================== - - * deps: debug@~2.1.0 - - Implement `DEBUG_FD` env variable support - * deps: depd@~1.0.0 - * deps: etag@~1.5.0 - - Improve string performance - - Slightly improve speed for weak ETags over 1KB - -0.9.3 / 2014-09-24 -================== - - * deps: etag@~1.4.0 - - Support "fake" stats objects - -0.9.2 / 2014-09-15 -================== - - * deps: depd@0.4.5 - * deps: etag@~1.3.1 - * deps: range-parser@~1.0.2 - -0.9.1 / 2014-09-07 -================== - - * deps: fresh@0.2.4 - -0.9.0 / 2014-09-07 -================== - - * Add `lastModified` option - * Use `etag` to generate `ETag` header - * deps: debug@~2.0.0 - -0.8.5 / 2014-09-04 -================== - - * Fix malicious path detection for empty string path - -0.8.4 / 2014-09-04 -================== - - * Fix a path traversal issue when using `root` - -0.8.3 / 2014-08-16 -================== - - * deps: destroy@1.0.3 - - renamed from dethroy - * deps: on-finished@2.1.0 - -0.8.2 / 2014-08-14 -================== - - * Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` - * deps: dethroy@1.0.2 - -0.8.1 / 2014-08-05 -================== - - * Fix `extensions` behavior when file already has extension - -0.8.0 / 2014-08-05 -================== - - * Add `extensions` option - -0.7.4 / 2014-08-04 -================== - - * Fix serving index files without root dir - -0.7.3 / 2014-07-29 -================== - - * Fix incorrect 403 on Windows and Node.js 0.11 - -0.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -0.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -0.7.0 / 2014-07-20 -================== - - * Deprecate `hidden` option; use `dotfiles` option - * Add `dotfiles` option - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - -0.6.0 / 2014-07-11 -================== - - * Deprecate `from` option; use `root` option - * Deprecate `send.etag()` -- use `etag` in `options` - * Deprecate `send.hidden()` -- use `hidden` in `options` - * Deprecate `send.index()` -- use `index` in `options` - * Deprecate `send.maxage()` -- use `maxAge` in `options` - * Deprecate `send.root()` -- use `root` in `options` - * Cap `maxAge` value to 1 year - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.5.0 / 2014-06-28 -================== - - * Accept string for `maxAge` (converted by `ms`) - * Add `headers` event - * Include link in default redirect response - * Use `EventEmitter.listenerCount` to count listeners - -0.4.3 / 2014-06-11 -================== - - * Do not throw un-catchable error on file open race condition - * Use `escape-html` for HTML escaping - * deps: debug@1.0.2 - - fix some debugging output colors on node.js 0.8 - * deps: finished@1.2.2 - * deps: fresh@0.2.2 - -0.4.2 / 2014-06-09 -================== - - * fix "event emitter leak" warnings - * deps: debug@1.0.1 - * deps: finished@1.2.1 - -0.4.1 / 2014-06-02 -================== - - * Send `max-age` in `Cache-Control` in correct format - -0.4.0 / 2014-05-27 -================== - - * Calculate ETag with md5 for reduced collisions - * Fix wrong behavior when index file matches directory - * Ignore stream errors after request ends - - Goodbye `EBADF, read` - * Skip directories in index file search - * deps: debug@0.8.1 - -0.3.0 / 2014-04-24 -================== - - * Fix sending files with dots without root set - * Coerce option types - * Accept API options in options object - * Set etags to "weak" - * Include file path in etag - * Make "Can't set headers after they are sent." catchable - * Send full entity-body for multi range requests - * Default directory access to 403 when index disabled - * Support multiple index paths - * Support "If-Range" header - * Control whether to generate etags - * deps: mime@1.2.11 - -0.2.0 / 2014-01-29 -================== - - * update range-parser and fresh - -0.1.4 / 2013-08-11 -================== - - * update fresh - -0.1.3 / 2013-07-08 -================== - - * Revert "Fix fd leak" - -0.1.2 / 2013-07-03 -================== - - * Fix fd leak - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/LICENSE deleted file mode 100644 index e4d595b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/README.md deleted file mode 100644 index 3586060..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/README.md +++ /dev/null @@ -1,195 +0,0 @@ -# send - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Linux Build][travis-image]][travis-url] -[![Windows Build][appveyor-image]][appveyor-url] -[![Test Coverage][coveralls-image]][coveralls-url] -[![Gratipay][gratipay-image]][gratipay-url] - -Send is a library for streaming files from the file system as a http response -supporting partial responses (Ranges), conditional-GET negotiation, high test -coverage, and granular events which may be leveraged to take appropriate actions -in your application or framework. - -Looking to serve up entire folders mapped to URLs? Try [serve-static](https://www.npmjs.org/package/serve-static). - -## Installation - -```bash -$ npm install send -``` - -## API - -```js -var send = require('send') -``` - -### send(req, path, [options]) - -Create a new `SendStream` for the given path to send to a `res`. The `req` is -the Node.js HTTP request and the `path` is a urlencoded path to send (urlencoded, -not the actual file-system path). - -#### Options - -##### dotfiles - -Set how "dotfiles" are treated when encountered. A dotfile is a file -or directory that begins with a dot ("."). Note this check is done on -the path itself without checking if the path actually exists on the -disk. If `root` is specified, only the dotfiles above the root are -checked (i.e. the root itself can be within a dotfile when when set -to "deny"). - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and 404. - -The default value is _similar_ to `'ignore'`, with the exception that -this default will not ignore the files within a directory that begins -with a dot, for backward-compatibility. - -##### etag - -Enable or disable etag generation, defaults to true. - -##### extensions - -If a given file doesn't exist, try appending one of the given extensions, -in the given order. By default, this is disabled (set to `false`). An -example value that will serve extension-less HTML files: `['html', 'htm']`. -This is skipped if the requested file already has an extension. - -##### index - -By default send supports "index.html" files, to disable this -set `false` or to supply a new index pass a string or an array -in preferred order. - -##### lastModified - -Enable or disable `Last-Modified` header, defaults to true. Uses the file -system's last modified value. - -##### maxAge - -Provide a max-age in milliseconds for http caching, defaults to 0. -This can also be a string accepted by the -[ms](https://www.npmjs.org/package/ms#readme) module. - -##### root - -Serve files relative to `path`. - -### Events - -The `SendStream` is an event emitter and will emit the following events: - - - `error` an error occurred `(err)` - - `directory` a directory was requested - - `file` a file was requested `(path, stat)` - - `headers` the headers are about to be set on a file `(res, path, stat)` - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -### .pipe - -The `pipe` method is used to pipe the response into the Node.js HTTP response -object, typically `send(req, path, options).pipe(res)`. - -## Error-handling - -By default when no `error` listeners are present an automatic response will be -made, otherwise you have full control over the response, aka you may show a 5xx -page etc. - -## Caching - -It does _not_ perform internal caching, you should use a reverse proxy cache -such as Varnish for this, or those fancy things called CDNs. If your -application is small enough that it would benefit from single-node memory -caching, it's small enough that it does not need caching at all ;). - -## Debugging - -To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ npm test -``` - -## Examples - -### Small example - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - send(req, req.url).pipe(res); -}).listen(3000); -``` - -Serving from a root directory with custom error-handling: - -```js -var http = require('http'); -var send = require('send'); -var url = require('url'); - -var app = http.createServer(function(req, res){ - // your custom error-handling logic: - function error(err) { - res.statusCode = err.status || 500; - res.end(err.message); - } - - // your custom headers - function headers(res, path, stat) { - // serve all files for download - res.setHeader('Content-Disposition', 'attachment'); - } - - // your custom directory handling logic: - function redirect() { - res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, url.parse(req.url).pathname, {root: '/www/example.com/public'}) - .on('error', error) - .on('directory', redirect) - .on('headers', headers) - .pipe(res); -}).listen(3000); -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/send.svg -[npm-url]: https://npmjs.org/package/send -[travis-image]: https://img.shields.io/travis/pillarjs/send/master.svg?label=linux -[travis-url]: https://travis-ci.org/pillarjs/send -[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/send/master.svg?label=windows -[appveyor-url]: https://ci.appveyor.com/project/dougwilson/send -[coveralls-image]: https://img.shields.io/coveralls/pillarjs/send/master.svg -[coveralls-url]: https://coveralls.io/r/pillarjs/send?branch=master -[downloads-image]: https://img.shields.io/npm/dm/send.svg -[downloads-url]: https://npmjs.org/package/send -[gratipay-image]: https://img.shields.io/gratipay/dougwilson.svg -[gratipay-url]: https://www.gratipay.com/dougwilson/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/index.js deleted file mode 100644 index 3510989..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/index.js +++ /dev/null @@ -1,820 +0,0 @@ -/*! - * send - * Copyright(c) 2012 TJ Holowaychuk - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var createError = require('http-errors') -var debug = require('debug')('send') -var deprecate = require('depd')('send') -var destroy = require('destroy') -var escapeHtml = require('escape-html') - , parseRange = require('range-parser') - , Stream = require('stream') - , mime = require('mime') - , fresh = require('fresh') - , path = require('path') - , fs = require('fs') - , normalize = path.normalize - , join = path.join -var etag = require('etag') -var EventEmitter = require('events').EventEmitter; -var ms = require('ms'); -var onFinished = require('on-finished') -var statuses = require('statuses') - -/** - * Variables. - */ -var extname = path.extname -var maxMaxAge = 60 * 60 * 24 * 365 * 1000; // 1 year -var resolve = path.resolve -var sep = path.sep -var toString = Object.prototype.toString -var upPathRegexp = /(?:^|[\\\/])\.\.(?:[\\\/]|$)/ - -/** - * Module exports. - * @public - */ - -module.exports = send -module.exports.mime = mime - -/** - * Shim EventEmitter.listenerCount for node.js < 0.10 - */ - -/* istanbul ignore next */ -var listenerCount = EventEmitter.listenerCount - || function(emitter, type){ return emitter.listeners(type).length; }; - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {object} req - * @param {string} path - * @param {object} [options] - * @return {SendStream} - * @public - */ - -function send(req, path, options) { - return new SendStream(req, path, options); -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * @param {Request} req - * @param {String} path - * @param {object} [options] - * @private - */ - -function SendStream(req, path, options) { - var opts = options || {} - - this.options = opts - this.path = path - this.req = req - - this._etag = opts.etag !== undefined - ? Boolean(opts.etag) - : true - - this._dotfiles = opts.dotfiles !== undefined - ? opts.dotfiles - : 'ignore' - - if (this._dotfiles !== 'ignore' && this._dotfiles !== 'allow' && this._dotfiles !== 'deny') { - throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') - } - - this._hidden = Boolean(opts.hidden) - - if (opts.hidden !== undefined) { - deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') - } - - // legacy support - if (opts.dotfiles === undefined) { - this._dotfiles = undefined - } - - this._extensions = opts.extensions !== undefined - ? normalizeList(opts.extensions, 'extensions option') - : [] - - this._index = opts.index !== undefined - ? normalizeList(opts.index, 'index option') - : ['index.html'] - - this._lastModified = opts.lastModified !== undefined - ? Boolean(opts.lastModified) - : true - - this._maxage = opts.maxAge || opts.maxage - this._maxage = typeof this._maxage === 'string' - ? ms(this._maxage) - : Number(this._maxage) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), maxMaxAge) - : 0 - - this._root = opts.root - ? resolve(opts.root) - : null - - if (!this._root && opts.from) { - this.from(opts.from) - } -} - -/** - * Inherits from `Stream.prototype`. - */ - -SendStream.prototype.__proto__ = Stream.prototype; - -/** - * Enable or disable etag generation. - * - * @param {Boolean} val - * @return {SendStream} - * @api public - */ - -SendStream.prototype.etag = deprecate.function(function etag(val) { - val = Boolean(val); - debug('etag %s', val); - this._etag = val; - return this; -}, 'send.etag: pass etag as option'); - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = deprecate.function(function hidden(val) { - val = Boolean(val); - debug('hidden %s', val); - this._hidden = val; - this._dotfiles = undefined - return this; -}, 'send.hidden: use dotfiles option'); - -/** - * Set index `paths`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean|Array} paths - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = deprecate.function(function index(paths) { - var index = !paths ? [] : normalizeList(paths, 'paths argument'); - debug('index %o', paths); - this._index = index; - return this; -}, 'send.index: pass index as option'); - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = function(path){ - path = String(path); - this._root = resolve(path) - return this; -}; - -SendStream.prototype.from = deprecate.function(SendStream.prototype.root, - 'send.from: pass root as option'); - -SendStream.prototype.root = deprecate.function(SendStream.prototype.root, - 'send.root: pass root as option'); - -/** - * Set max-age to `maxAge`. - * - * @param {Number} maxAge - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = deprecate.function(function maxage(maxAge) { - maxAge = typeof maxAge === 'string' - ? ms(maxAge) - : Number(maxAge); - if (isNaN(maxAge)) maxAge = 0; - if (Infinity == maxAge) maxAge = 60 * 60 * 24 * 365 * 1000; - debug('max-age %d', maxAge); - this._maxage = maxAge; - return this; -}, 'send.maxage: pass maxAge as option'); - -/** - * Emit error with `status`. - * - * @param {number} status - * @param {Error} [error] - * @private - */ - -SendStream.prototype.error = function error(status, error) { - // emit if listeners instead of responding - if (listenerCount(this, 'error') !== 0) { - return this.emit('error', createError(error, status, { - expose: false - })) - } - - var res = this.res - var msg = statuses[status] - - // wipe all existing headers - res._headers = null - - // send basic response - res.statusCode = status - res.setHeader('Content-Type', 'text/plain; charset=UTF-8') - res.setHeader('Content-Length', Buffer.byteLength(msg)) - res.setHeader('X-Content-Type-Options', 'nosniff') - res.end(msg) -} - -/** - * Check if the pathname ends with "/". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasTrailingSlash = function(){ - return '/' == this.path[this.path.length - 1]; -}; - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function(){ - return this.req.headers['if-none-match'] - || this.req.headers['if-modified-since']; -}; - -/** - * Strip content-* header fields. - * - * @private - */ - -SendStream.prototype.removeContentHeaderFields = function removeContentHeaderFields() { - var res = this.res - var headers = Object.keys(res._headers || {}) - - for (var i = 0; i < headers.length; i++) { - var header = headers[i] - if (header.substr(0, 8) === 'content-' && header !== 'content-location') { - res.removeHeader(header) - } - } -} - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function(){ - var res = this.res; - debug('not modified'); - this.removeContentHeaderFields(); - res.statusCode = 304; - res.end(); -}; - -/** - * Raise error that headers already sent. - * - * @api private - */ - -SendStream.prototype.headersAlreadySent = function headersAlreadySent(){ - var err = new Error('Can\'t set headers after they are sent.'); - debug('headers already sent'); - this.error(500, err); -}; - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function(){ - var res = this.res; - return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; -}; - -/** - * Handle stat() error. - * - * @param {Error} error - * @private - */ - -SendStream.prototype.onStatError = function onStatError(error) { - switch (error.code) { - case 'ENAMETOOLONG': - case 'ENOENT': - case 'ENOTDIR': - this.error(404, error) - break - default: - this.error(500, error) - break - } -} - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function(){ - return fresh(this.req.headers, this.res._headers); -}; - -/** - * Check if the range is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isRangeFresh = function isRangeFresh(){ - var ifRange = this.req.headers['if-range']; - - if (!ifRange) return true; - - return ~ifRange.indexOf('"') - ? ~ifRange.indexOf(this.res._headers['etag']) - : Date.parse(this.res._headers['last-modified']) <= Date.parse(ifRange); -}; - -/** - * Redirect to path. - * - * @param {string} path - * @private - */ - -SendStream.prototype.redirect = function redirect(path) { - if (listenerCount(this, 'directory') !== 0) { - this.emit('directory') - return - } - - if (this.hasTrailingSlash()) { - this.error(403) - return - } - - var loc = path + '/' - var msg = 'Redirecting to ' + escapeHtml(loc) + '\n' - var res = this.res - - // redirect - res.statusCode = 301 - res.setHeader('Content-Type', 'text/html; charset=UTF-8') - res.setHeader('Content-Length', Buffer.byteLength(msg)) - res.setHeader('X-Content-Type-Options', 'nosniff') - res.setHeader('Location', loc) - res.end(msg) -} - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function(res){ - var self = this - , args = arguments - , root = this._root; - - // references - this.res = res; - - // decode the path - var path = decode(this.path) - if (path === -1) return this.error(400) - - // null byte(s) - if (~path.indexOf('\0')) return this.error(400); - - var parts - if (root !== null) { - // malicious path - if (upPathRegexp.test(normalize('.' + sep + path))) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // join / normalize from optional root dir - path = normalize(join(root, path)) - root = normalize(root + sep) - - // explode path parts - parts = path.substr(root.length).split(sep) - } else { - // ".." is malicious without "root" - if (upPathRegexp.test(path)) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = normalize(path).split(sep) - - // resolve the path - path = resolve(path) - } - - // dotfile handling - if (containsDotFile(parts)) { - var access = this._dotfiles - - // legacy support - if (access === undefined) { - access = parts[parts.length - 1][0] === '.' - ? (this._hidden ? 'allow' : 'ignore') - : 'allow' - } - - debug('%s dotfile "%s"', access, path) - switch (access) { - case 'allow': - break - case 'deny': - return this.error(403) - case 'ignore': - default: - return this.error(404) - } - } - - // index file support - if (this._index.length && this.path[this.path.length - 1] === '/') { - this.sendIndex(path); - return res; - } - - this.sendFile(path); - return res; -}; - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function(path, stat){ - var len = stat.size; - var options = this.options - var opts = {} - var res = this.res; - var req = this.req; - var ranges = req.headers.range; - var offset = options.start || 0; - - if (res._header) { - // impossible to send now - return this.headersAlreadySent(); - } - - debug('pipe "%s"', path) - - // set header fields - this.setHeader(path, stat); - - // set content-type - this.type(path); - - // conditional GET support - if (this.isConditionalGET() - && this.isCachable() - && this.isFresh()) { - return this.notModified(); - } - - // adjust len to start/end options - len = Math.max(0, len - offset); - if (options.end !== undefined) { - var bytes = options.end - offset + 1; - if (len > bytes) len = bytes; - } - - // Range support - if (ranges) { - ranges = parseRange(len, ranges); - - // If-Range support - if (!this.isRangeFresh()) { - debug('range stale'); - ranges = -2; - } - - // unsatisfiable - if (-1 == ranges) { - debug('range unsatisfiable'); - res.setHeader('Content-Range', 'bytes */' + stat.size); - return this.error(416); - } - - // valid (syntactically invalid/multiple ranges are treated as a regular response) - if (-2 != ranges && ranges.length === 1) { - debug('range %j', ranges); - - // Content-Range - res.statusCode = 206; - res.setHeader('Content-Range', 'bytes ' - + ranges[0].start - + '-' - + ranges[0].end - + '/' - + len); - - offset += ranges[0].start; - len = ranges[0].end - ranges[0].start + 1; - } - } - - // clone options - for (var prop in options) { - opts[prop] = options[prop] - } - - // set read options - opts.start = offset - opts.end = Math.max(offset, offset + len - 1) - - // content-length - res.setHeader('Content-Length', len); - - // HEAD support - if ('HEAD' == req.method) return res.end(); - - this.stream(path, opts) -}; - -/** - * Transfer file for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendFile = function sendFile(path) { - var i = 0 - var self = this - - debug('stat "%s"', path); - fs.stat(path, function onstat(err, stat) { - if (err && err.code === 'ENOENT' - && !extname(path) - && path[path.length - 1] !== sep) { - // not found, check extensions - return next(err) - } - if (err) return self.onStatError(err) - if (stat.isDirectory()) return self.redirect(self.path) - self.emit('file', path, stat) - self.send(path, stat) - }) - - function next(err) { - if (self._extensions.length <= i) { - return err - ? self.onStatError(err) - : self.error(404) - } - - var p = path + '.' + self._extensions[i++] - - debug('stat "%s"', p) - fs.stat(p, function (err, stat) { - if (err) return next(err) - if (stat.isDirectory()) return next() - self.emit('file', p, stat) - self.send(p, stat) - }) - } -} - -/** - * Transfer index for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendIndex = function sendIndex(path){ - var i = -1; - var self = this; - - function next(err){ - if (++i >= self._index.length) { - if (err) return self.onStatError(err); - return self.error(404); - } - - var p = join(path, self._index[i]); - - debug('stat "%s"', p); - fs.stat(p, function(err, stat){ - if (err) return next(err); - if (stat.isDirectory()) return next(); - self.emit('file', p, stat); - self.send(p, stat); - }); - } - - next(); -}; - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function(path, options){ - // TODO: this is all lame, refactor meeee - var finished = false; - var self = this; - var res = this.res; - var req = this.req; - - // pipe - var stream = fs.createReadStream(path, options); - this.emit('stream', stream); - stream.pipe(res); - - // response finished, done with the fd - onFinished(res, function onfinished(){ - finished = true; - destroy(stream); - }); - - // error handling code-smell - stream.on('error', function onerror(err){ - // request already finished - if (finished) return; - - // clean up stream - finished = true; - destroy(stream); - - // error - self.onStatError(err); - }); - - // end - stream.on('end', function onend(){ - self.emit('end'); - }); -}; - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function(path){ - var res = this.res; - if (res.getHeader('Content-Type')) return; - var type = mime.lookup(path); - var charset = mime.charsets.lookup(type); - debug('content-type %s', type); - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); -}; - -/** - * Set response header fields, most - * fields may be pre-defined. - * - * @param {String} path - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function setHeader(path, stat){ - var res = this.res; - - this.emit('headers', res, path, stat); - - if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); - if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + Math.floor(this._maxage / 1000)); - - if (this._lastModified && !res.getHeader('Last-Modified')) { - var modified = stat.mtime.toUTCString() - debug('modified %s', modified) - res.setHeader('Last-Modified', modified) - } - - if (this._etag && !res.getHeader('ETag')) { - var val = etag(stat) - debug('etag %s', val) - res.setHeader('ETag', val) - } -}; - -/** - * Determine if path parts contain a dotfile. - * - * @api private - */ - -function containsDotFile(parts) { - for (var i = 0; i < parts.length; i++) { - if (parts[i][0] === '.') { - return true - } - } - - return false -} - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -function decode(path) { - try { - return decodeURIComponent(path) - } catch (err) { - return -1 - } -} - -/** - * Normalize the index option into an array. - * - * @param {boolean|string|array} val - * @param {string} name - * @private - */ - -function normalizeList(val, name) { - var list = [].concat(val || []) - - for (var i = 0; i < list.length; i++) { - if (typeof list[i] !== 'string') { - throw new TypeError(name + ' must be array of strings or false') - } - } - - return list -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/.bin/mime b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/.bin/mime deleted file mode 120000 index fbb7ee0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/.bin/mime +++ /dev/null @@ -1 +0,0 @@ -../mime/cli.js \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/destroy/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/destroy/README.md deleted file mode 100644 index 665acb7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/destroy/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Destroy - -[![NPM version][npm-image]][npm-url] -[![Build status][travis-image]][travis-url] -[![Test coverage][coveralls-image]][coveralls-url] -[![Dependency Status][david-image]][david-url] -[![License][license-image]][license-url] -[![Downloads][downloads-image]][downloads-url] -[![Gittip][gittip-image]][gittip-url] - -Destroy a stream. - -## API - -```js -var destroy = require('destroy') - -var fs = require('fs') -var stream = fs.createReadStream('package.json') -destroy(stream) -``` - -[npm-image]: https://img.shields.io/npm/v/destroy.svg?style=flat-square -[npm-url]: https://npmjs.org/package/destroy -[github-tag]: http://img.shields.io/github/tag/stream-utils/destroy.svg?style=flat-square -[github-url]: https://github.com/stream-utils/destroy/tags -[travis-image]: https://img.shields.io/travis/stream-utils/destroy.svg?style=flat-square -[travis-url]: https://travis-ci.org/stream-utils/destroy -[coveralls-image]: https://img.shields.io/coveralls/stream-utils/destroy.svg?style=flat-square -[coveralls-url]: https://coveralls.io/r/stream-utils/destroy?branch=master -[david-image]: http://img.shields.io/david/stream-utils/destroy.svg?style=flat-square -[david-url]: https://david-dm.org/stream-utils/destroy -[license-image]: http://img.shields.io/npm/l/destroy.svg?style=flat-square -[license-url]: LICENSE.md -[downloads-image]: http://img.shields.io/npm/dm/destroy.svg?style=flat-square -[downloads-url]: https://npmjs.org/package/destroy -[gittip-image]: https://img.shields.io/gittip/jonathanong.svg?style=flat-square -[gittip-url]: https://www.gittip.com/jonathanong/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/destroy/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/destroy/index.js deleted file mode 100644 index b455217..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/destroy/index.js +++ /dev/null @@ -1,36 +0,0 @@ -var ReadStream = require('fs').ReadStream -var Stream = require('stream') - -module.exports = function destroy(stream) { - if (stream instanceof ReadStream) { - return destroyReadStream(stream) - } - - if (!(stream instanceof Stream)) { - return stream - } - - if (typeof stream.destroy === 'function') { - stream.destroy() - } - - return stream -} - -function destroyReadStream(stream) { - stream.destroy() - - if (typeof stream.close === 'function') { - // node.js core bug work-around - stream.on('open', onopenClose) - } - - return stream -} - -function onopenClose() { - if (typeof this.fd === 'number') { - // actually close down the fd - this.close() - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/destroy/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/destroy/package.json deleted file mode 100644 index c88380a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/destroy/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "destroy", - "description": "destroy a stream if possible", - "version": "1.0.3", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/stream-utils/destroy" - }, - "devDependencies": { - "istanbul": "0", - "mocha": "1" - }, - "scripts": { - "test": "mocha --reporter spec", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" - }, - "files": [ - "index.js" - ], - "keywords": [ - "stream", - "streams", - "destroy", - "cleanup", - "leak", - "fd" - ], - "gitHead": "50af95ece4a70202f9301bc3edc8f9fdbbad0f26", - "bugs": { - "url": "https://github.com/stream-utils/destroy/issues" - }, - "homepage": "https://github.com/stream-utils/destroy", - "_id": "destroy@1.0.3", - "_shasum": "b433b4724e71fd8551d9885174851c5fc377e2c9", - "_from": "destroy@1.0.3", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "b433b4724e71fd8551d9885174851c5fc377e2c9", - "tarball": "http://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/HISTORY.md deleted file mode 100644 index 4c7087d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/HISTORY.md +++ /dev/null @@ -1,76 +0,0 @@ -2015-02-02 / 1.3.1 -================== - - * Fix regression where status can be overwritten in `createError` `props` - -2015-02-01 / 1.3.0 -================== - - * Construct errors using defined constructors from `createError` - * Fix error names that are not identifiers - - `createError["I'mateapot"]` is now `createError.ImATeapot` - * Set a meaningful `name` property on constructed errors - -2014-12-09 / 1.2.8 -================== - - * Fix stack trace from exported function - * Remove `arguments.callee` usage - -2014-10-14 / 1.2.7 -================== - - * Remove duplicate line - -2014-10-02 / 1.2.6 -================== - - * Fix `expose` to be `true` for `ClientError` constructor - -2014-09-28 / 1.2.5 -================== - - * deps: statuses@1 - -2014-09-21 / 1.2.4 -================== - - * Fix dependency version to work with old `npm`s - -2014-09-21 / 1.2.3 -================== - - * deps: statuses@~1.1.0 - -2014-09-21 / 1.2.2 -================== - - * Fix publish error - -2014-09-21 / 1.2.1 -================== - - * Support Node.js 0.6 - * Use `inherits` instead of `util` - -2014-09-09 / 1.2.0 -================== - - * Fix the way inheriting functions - * Support `expose` being provided in properties argument - -2014-09-08 / 1.1.0 -================== - - * Default status to 500 - * Support provided `error` to extend - -2014-09-08 / 1.0.1 -================== - - * Fix accepting string message - -2014-09-08 / 1.0.0 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/README.md deleted file mode 100644 index 520271e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# http-errors - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Create HTTP errors for Express, Koa, Connect, etc. with ease. - -## Example - -```js -var createError = require('http-errors'); - -app.use(function (req, res, next) { - if (!req.user) return next(createError(401, 'Please login to view this page.')); - next(); -}) -``` - -## API - -This is the current API, currently extracted from Koa and subject to change. - -### Error Properties - -- `message` -- `status` and `statusCode` - the status code of the error, defaulting to `500` - -### createError([status], [message], [properties]) - -```js -var err = createError(404, 'This video does not exist!'); -``` - -- `status: 500` - the status code as a number -- `message` - the message of the error, defaulting to node's text for that status code. -- `properties` - custom properties to attach to the object - -### new createError\[code || name\](\[msg]\)) - -```js -var err = new createError.NotFound(); -``` - -- `code` - the status code as a number -- `name` - the name of the error as a "bumpy case", i.e. `NotFound` or `InternalServerError`. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/http-errors.svg?style=flat -[npm-url]: https://npmjs.org/package/http-errors -[node-version-image]: https://img.shields.io/node/v/http-errors.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/http-errors.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/http-errors -[coveralls-image]: https://img.shields.io/coveralls/jshttp/http-errors.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/http-errors -[downloads-image]: https://img.shields.io/npm/dm/http-errors.svg?style=flat -[downloads-url]: https://npmjs.org/package/http-errors diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/index.js deleted file mode 100644 index d84b114..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/index.js +++ /dev/null @@ -1,120 +0,0 @@ - -var statuses = require('statuses'); -var inherits = require('inherits'); - -function toIdentifier(str) { - return str.split(' ').map(function (token) { - return token.slice(0, 1).toUpperCase() + token.slice(1) - }).join('').replace(/[^ _0-9a-z]/gi, '') -} - -exports = module.exports = function httpError() { - // so much arity going on ~_~ - var err; - var msg; - var status = 500; - var props = {}; - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - if (arg instanceof Error) { - err = arg; - status = err.status || err.statusCode || status; - continue; - } - switch (typeof arg) { - case 'string': - msg = arg; - break; - case 'number': - status = arg; - break; - case 'object': - props = arg; - break; - } - } - - if (typeof status !== 'number' || !statuses[status]) { - status = 500 - } - - // constructor - var HttpError = exports[status] - - if (!err) { - // create error - err = HttpError - ? new HttpError(msg) - : new Error(msg || statuses[status]) - Error.captureStackTrace(err, httpError) - } - - if (!HttpError || !(err instanceof HttpError)) { - // add properties to generic error - err.expose = status < 500 - err.status = err.statusCode = status - } - - for (var key in props) { - if (key !== 'status' && key !== 'statusCode') { - err[key] = props[key] - } - } - - return err; -}; - -// create generic error objects -var codes = statuses.codes.filter(function (num) { - return num >= 400; -}); - -codes.forEach(function (code) { - var name = toIdentifier(statuses[code]) - var className = name.match(/Error$/) ? name : name + 'Error' - - if (code >= 500) { - var ServerError = function ServerError(msg) { - var self = new Error(msg != null ? msg : statuses[code]) - Error.captureStackTrace(self, ServerError) - self.__proto__ = ServerError.prototype - Object.defineProperty(self, 'name', { - enumerable: false, - configurable: true, - value: className, - writable: true - }) - return self - } - inherits(ServerError, Error); - ServerError.prototype.status = - ServerError.prototype.statusCode = code; - ServerError.prototype.expose = false; - exports[code] = - exports[name] = ServerError - return; - } - - var ClientError = function ClientError(msg) { - var self = new Error(msg != null ? msg : statuses[code]) - Error.captureStackTrace(self, ClientError) - self.__proto__ = ClientError.prototype - Object.defineProperty(self, 'name', { - enumerable: false, - configurable: true, - value: className, - writable: true - }) - return self - } - inherits(ClientError, Error); - ClientError.prototype.status = - ClientError.prototype.statusCode = code; - ClientError.prototype.expose = true; - exports[code] = - exports[name] = ClientError - return; -}); - -// backwards-compatibility -exports["I'mateapot"] = exports.ImATeapot diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/LICENSE deleted file mode 100644 index dea3013..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/README.md deleted file mode 100644 index b1c5665..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/README.md +++ /dev/null @@ -1,42 +0,0 @@ -Browser-friendly inheritance fully compatible with standard node.js -[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). - -This package exports standard `inherits` from node.js `util` module in -node environment, but also provides alternative browser-friendly -implementation through [browser -field](https://gist.github.com/shtylman/4339901). Alternative -implementation is a literal copy of standard one located in standalone -module to avoid requiring of `util`. It also has a shim for old -browsers with no `Object.create` support. - -While keeping you sure you are using standard `inherits` -implementation in node.js environment, it allows bundlers such as -[browserify](https://github.com/substack/node-browserify) to not -include full `util` package to your client code if all you need is -just `inherits` function. It worth, because browser shim for `util` -package is large and `inherits` is often the single function you need -from it. - -It's recommended to use this package instead of -`require('util').inherits` for any code that has chances to be used -not only in node.js but in browser too. - -## usage - -```js -var inherits = require('inherits'); -// then use exactly as the standard one -``` - -## note on version ~1.0 - -Version ~1.0 had completely different motivation and is not compatible -neither with 2.0 nor with standard node.js `inherits`. - -If you are using version ~1.0 and planning to switch to ~2.0, be -careful: - -* new version uses `super_` instead of `super` for referencing - superclass -* new version overwrites current prototype while old one preserves any - existing fields on it diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits.js deleted file mode 100644 index 29f5e24..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('util').inherits diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits_browser.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits_browser.js deleted file mode 100644 index c1e78a7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits_browser.js +++ /dev/null @@ -1,23 +0,0 @@ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/package.json deleted file mode 100644 index 005588b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "inherits", - "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", - "version": "2.0.1", - "keywords": [ - "inheritance", - "class", - "klass", - "oop", - "object-oriented", - "inherits", - "browser", - "browserify" - ], - "main": "./inherits.js", - "browser": "./inherits_browser.js", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/inherits" - }, - "license": "ISC", - "scripts": { - "test": "node test" - }, - "bugs": { - "url": "https://github.com/isaacs/inherits/issues" - }, - "_id": "inherits@2.0.1", - "dist": { - "shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", - "tarball": "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "_from": "inherits@>=2.0.1 <2.1.0", - "_npmVersion": "1.3.8", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "directories": {}, - "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", - "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/isaacs/inherits" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/test.js deleted file mode 100644 index fc53012..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/test.js +++ /dev/null @@ -1,25 +0,0 @@ -var inherits = require('./inherits.js') -var assert = require('assert') - -function test(c) { - assert(c.constructor === Child) - assert(c.constructor.super_ === Parent) - assert(Object.getPrototypeOf(c) === Child.prototype) - assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) - assert(c instanceof Child) - assert(c instanceof Parent) -} - -function Child() { - Parent.call(this) - test(this) -} - -function Parent() {} - -inherits(Child, Parent) - -var c = new Child -test(c) - -console.log('ok') diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/package.json deleted file mode 100644 index 43b1c1d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/http-errors/package.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "http-errors", - "description": "Create HTTP error objects", - "version": "1.3.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Alan Plum", - "email": "me@pluma.io" - }, - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jshttp/http-errors" - }, - "dependencies": { - "inherits": "~2.0.1", - "statuses": "1" - }, - "devDependencies": { - "istanbul": "0", - "mocha": "1" - }, - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" - }, - "keywords": [ - "http", - "error" - ], - "files": [ - "index.js", - "HISTORY.md", - "LICENSE", - "README.md" - ], - "gitHead": "89a8502b40d5dd42da2908f265275e2eeb8d0699", - "bugs": { - "url": "https://github.com/jshttp/http-errors/issues" - }, - "homepage": "https://github.com/jshttp/http-errors", - "_id": "http-errors@1.3.1", - "_shasum": "197e22cdebd4198585e8694ef6786197b91ed942", - "_from": "http-errors@>=1.3.1 <1.4.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "egeste", - "email": "npm@egeste.net" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "197e22cdebd4198585e8694ef6786197b91ed942", - "tarball": "http://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/.npmignore deleted file mode 100644 index e69de29..0000000 diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/README.md deleted file mode 100644 index 506fbe5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# mime - -Comprehensive MIME type mapping API based on mime-db module. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## Contributing / Testing - - npm run test - -## Command Line - - mime [path_string] - -E.g. - - > mime scripts/jquery.js - application/javascript - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - -```js -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.default_type -Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) - -### mime.extension(type) -Get the default extension for `type` - -```js -mime.extension('text/html'); // => 'html' -mime.extension('application/octet-stream'); // => 'bin' -``` - -### mime.charsets.lookup() - -Map mime-type to charset - -```js -mime.charsets.lookup('text/plain'); // => 'UTF-8' -``` - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -Custom type mappings can be added on a per-project basis via the following APIs. - -### mime.define() - -Add custom mime/extension mappings - -```js -mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... -}); - -mime.lookup('x-sft'); // => 'text/x-some-format' -``` - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - -```js -mime.extension('text/x-some-format'); // => 'x-sf' -``` - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - -```js -mime.load('./my_project.types'); -``` -The .types file format is simple - See the `types` dir for examples. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/build/build.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/build/build.js deleted file mode 100644 index ed5313e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/build/build.js +++ /dev/null @@ -1,11 +0,0 @@ -var db = require('mime-db'); - -var mapByType = {}; -Object.keys(db).forEach(function(key) { - var extensions = db[key].extensions; - if (extensions) { - mapByType[key] = extensions; - } -}); - -console.log(JSON.stringify(mapByType)); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/build/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/build/test.js deleted file mode 100644 index 58b9ba7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/build/test.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('../mime'); -var assert = require('assert'); -var path = require('path'); - -// -// Test mime lookups -// - -assert.equal('text/plain', mime.lookup('text.txt')); // normal file -assert.equal('text/plain', mime.lookup('TEXT.TXT')); // uppercase -assert.equal('text/plain', mime.lookup('dir/text.txt')); // dir + file -assert.equal('text/plain', mime.lookup('.text.txt')); // hidden file -assert.equal('text/plain', mime.lookup('.txt')); // nameless -assert.equal('text/plain', mime.lookup('txt')); // extension-only -assert.equal('text/plain', mime.lookup('/txt')); // extension-less () -assert.equal('text/plain', mime.lookup('\\txt')); // Windows, extension-less -assert.equal('application/octet-stream', mime.lookup('text.nope')); // unrecognized -assert.equal('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default - -// -// Test extensions -// - -assert.equal('txt', mime.extension(mime.types.text)); -assert.equal('html', mime.extension(mime.types.htm)); -assert.equal('bin', mime.extension('application/octet-stream')); -assert.equal('bin', mime.extension('application/octet-stream ')); -assert.equal('html', mime.extension(' text/html; charset=UTF-8')); -assert.equal('html', mime.extension('text/html; charset=UTF-8 ')); -assert.equal('html', mime.extension('text/html; charset=UTF-8')); -assert.equal('html', mime.extension('text/html ; charset=UTF-8')); -assert.equal('html', mime.extension('text/html;charset=UTF-8')); -assert.equal('html', mime.extension('text/Html;charset=UTF-8')); -assert.equal(undefined, mime.extension('unrecognized')); - -// -// Test node.types lookups -// - -assert.equal('application/font-woff', mime.lookup('file.woff')); -assert.equal('application/octet-stream', mime.lookup('file.buffer')); -assert.equal('audio/mp4', mime.lookup('file.m4a')); -assert.equal('font/opentype', mime.lookup('file.otf')); - -// -// Test charsets -// - -assert.equal('UTF-8', mime.charsets.lookup('text/plain')); -assert.equal(undefined, mime.charsets.lookup(mime.types.js)); -assert.equal('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -console.log('\nAll tests passed'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/cli.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/cli.js deleted file mode 100755 index 20b1ffe..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/cli.js +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env node - -var mime = require('./mime.js'); -var file = process.argv[2]; -var type = mime.lookup(file); - -process.stdout.write(type + '\n'); - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/mime.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/mime.js deleted file mode 100644 index 341b6a5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/mime.js +++ /dev/null @@ -1,108 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - for (var i = 0; i < exts.length; i++) { - if (process.env.DEBUG_MIME && this.types[exts]) { - console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + - this.types[exts] + ' to ' + type); - } - - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - this._loading = file; - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); - - this._loading = null; -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); - return this.extensions[type]; -}; - -// Default instance -var mime = new Mime(); - -// Define built-in types -mime.define(require('./types.json')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -}; - -module.exports = mime; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/package.json deleted file mode 100644 index 721460b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "scripts": { - "prepublish": "node build/build.js > types.json", - "test": "node build/test.js" - }, - "bin": { - "mime": "cli.js" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "description": "A comprehensive library for mime-type mapping", - "licenses": [ - { - "type": "MIT", - "url": "https://raw.github.com/broofa/node-mime/master/LICENSE" - } - ], - "dependencies": {}, - "devDependencies": { - "mime-db": "^1.2.0" - }, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.3.4", - "gitHead": "1628f6e0187095009dcef4805c3a49706f137974", - "bugs": { - "url": "https://github.com/broofa/node-mime/issues" - }, - "homepage": "https://github.com/broofa/node-mime", - "_id": "mime@1.3.4", - "_shasum": "115f9e3b6b3daf2959983cb38f149a2d40eb5d53", - "_from": "mime@1.3.4", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "broofa", - "email": "robert@broofa.com" - }, - "maintainers": [ - { - "name": "broofa", - "email": "robert@broofa.com" - }, - { - "name": "bentomas", - "email": "benjamin@benjaminthomas.org" - } - ], - "dist": { - "shasum": "115f9e3b6b3daf2959983cb38f149a2d40eb5d53", - "tarball": "http://registry.npmjs.org/mime/-/mime-1.3.4.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/types.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/types.json deleted file mode 100644 index c674b1c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/mime/types.json +++ /dev/null @@ -1 +0,0 @@ -{"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomsvc+xml":["atomsvc"],"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/cu-seeme":["cu"],"application/dash+xml":["mdp"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/font-tdpfr":["pfr"],"application/font-woff":["woff"],"application/font-woff2":["woff2"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/java-archive":["jar"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"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/postscript":["ai","eps","ps"],"application/prs.cww":["cww"],"application/pskc+xml":["pskcxml"],"application/rdf+xml":["rdf"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"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-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"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.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.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"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.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.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"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.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"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.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"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.gmx":["gmx"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"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.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.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.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"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.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.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.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"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.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"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-officetheme":["thmx"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["stl"],"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-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.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.data":["ngdat"],"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.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.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"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.teacher":["teacher"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.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.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"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.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"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.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/voicexml+xml":["vxml"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["dmg"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-otf":["otf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-ttf":["ttf","ttc"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["iso"],"application/x-java-jnlp-file":["jnlp"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdownload":["exe","dll","com","bat","msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["wmf","wmz","emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-nzb":["nzb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["rar"],"application/x-research-info-systems":["ris"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["obj"],"application/x-ustar":["ustar"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt"],"application/x-xfig":["fig"],"application/x-xliff+xml":["xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"application/xaml+xml":["xaml"],"application/xcap-diff+xml":["xdf"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xml":["xml","xsl","xsd"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/adpcm":["adp"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mp4":["mp4a","m4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/webm":["weba"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-wav":["wav"],"audio/xm":["xm"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"font/opentype":["otf"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/g3fax":["g3"],"image/gif":["gif"],"image/ief":["ief"],"image/jpeg":["jpeg","jpg","jpe"],"image/ktx":["ktx"],"image/png":["png"],"image/prs.btif":["btif"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/tiff":["tiff","tif"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["sub"],"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.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/webp":["webp"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["ico"],"image/x-mrsid-image":["sid"],"image/x-pcx":["pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/rfc822":["eml","mime"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.vtu":["vtu"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["x3db","x3dbz"],"model/x3d+vrml":["x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee"],"text/css":["css"],"text/csv":["csv"],"text/hjson":["hjson"],"text/html":["html","htm"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/prs.lines.tag":["dsc"],"text/richtext":["rtx"],"text/sgml":["sgml","sgm"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"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.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/vtt":["vtt"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["markdown","md","mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-pascal":["p","pas"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/jpeg":["jpgv"],"video/jpm":["jpm","jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/webm":["webm"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/History.md deleted file mode 100644 index 32fdfc1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/History.md +++ /dev/null @@ -1,66 +0,0 @@ - -0.7.1 / 2015-04-20 -================== - - * prevent extraordinary long inputs (@evilpacket) - * Fixed broken readme link - -0.7.0 / 2014-11-24 -================== - - * add time abbreviations, updated tests and readme for the new units - * fix example in the readme. - * add LICENSE file - -0.6.2 / 2013-12-05 -================== - - * Adding repository section to package.json to suppress warning from NPM. - -0.6.1 / 2013-05-10 -================== - - * fix singularization [visionmedia] - -0.6.0 / 2013-03-15 -================== - - * fix minutes - -0.5.1 / 2013-02-24 -================== - - * add component namespace - -0.5.0 / 2012-11-09 -================== - - * add short formatting as default and .long option - * add .license property to component.json - * add version to component.json - -0.4.0 / 2012-10-22 -================== - - * add rounding to fix crazy decimals - -0.3.0 / 2012-09-07 -================== - - * fix `ms()` [visionmedia] - -0.2.0 / 2012-09-03 -================== - - * add component.json [visionmedia] - * add days support [visionmedia] - * add hours support [visionmedia] - * add minutes support [visionmedia] - * add seconds support [visionmedia] - * add ms string support [visionmedia] - * refactor tests to facilitate ms(number) [visionmedia] - -0.1.0 / 2012-03-07 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/LICENSE deleted file mode 100644 index 6c07561..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Guillermo Rauch - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/README.md deleted file mode 100644 index 9b4fd03..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('2 days') // 172800000 -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2.5 hrs') // 9000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours'), { long: true }) // "10 hours" -``` - -- Node/Browser compatible. Published as [`ms`](https://www.npmjs.org/package/ms) in [NPM](http://nodejs.org/download). -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/index.js deleted file mode 100644 index 4f92771..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/index.js +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = '' + str; - if (str.length > 10000) return; - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/package.json deleted file mode 100644 index 253335e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/ms/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "ms", - "version": "0.7.1", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "gitHead": "713dcf26d9e6fd9dbc95affe7eff9783b7f1b909", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "homepage": "https://github.com/guille/ms.js", - "_id": "ms@0.7.1", - "scripts": {}, - "_shasum": "9cd13c03adbff25b65effde7ce864ee952017098", - "_from": "ms@0.7.1", - "_npmVersion": "2.7.5", - "_nodeVersion": "0.12.2", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "dist": { - "shasum": "9cd13c03adbff25b65effde7ce864ee952017098", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/README.md deleted file mode 100644 index f6ae24c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/README.md +++ /dev/null @@ -1,114 +0,0 @@ -# Statuses - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -HTTP status utility for node. - -## API - -```js -var status = require('statuses'); -``` - -### var code = status(Integer || String) - -If `Integer` or `String` is a valid HTTP code or status message, then the appropriate `code` will be returned. Otherwise, an error will be thrown. - -```js -status(403) // => 'Forbidden' -status('403') // => 'Forbidden' -status('forbidden') // => 403 -status('Forbidden') // => 403 -status(306) // throws, as it's not supported by node.js -``` - -### status.codes - -Returns an array of all the status codes as `Integer`s. - -### var msg = status[code] - -Map of `code` to `status message`. `undefined` for invalid `code`s. - -```js -status[404] // => 'Not Found' -``` - -### var code = status[msg] - -Map of `status message` to `code`. `msg` can either be title-cased or lower-cased. `undefined` for invalid `status message`s. - -```js -status['not found'] // => 404 -status['Not Found'] // => 404 -``` - -### status.redirect[code] - -Returns `true` if a status code is a valid redirect status. - -```js -status.redirect[200] // => undefined -status.redirect[301] // => true -``` - -### status.empty[code] - -Returns `true` if a status code expects an empty body. - -```js -status.empty[200] // => undefined -status.empty[204] // => true -status.empty[304] // => true -``` - -### status.retry[code] - -Returns `true` if you should retry the rest. - -```js -status.retry[501] // => undefined -status.retry[503] // => true -``` - -### statuses/codes.json - -```js -var codes = require('statuses/codes.json'); -``` - -This is a JSON file of the status codes -taken from `require('http').STATUS_CODES`. -This is saved so that codes are consistent even in older node.js versions. -For example, `308` will be added in v0.12. - -## Adding Status Codes - -The status codes are primarily sourced from http://www.iana.org/assignments/http-status-codes/http-status-codes-1.csv. -Additionally, custom codes are added from http://en.wikipedia.org/wiki/List_of_HTTP_status_codes. -These are added manually in the `lib/*.json` files. -If you would like to add a status code, add it to the appropriate JSON file. - -To rebuild `codes.json`, run the following: - -```bash -# update src/iana.json -npm run update -# build codes.json -npm run build -``` - -[npm-image]: https://img.shields.io/npm/v/statuses.svg?style=flat -[npm-url]: https://npmjs.org/package/statuses -[node-version-image]: http://img.shields.io/badge/node.js-%3E%3D_0.6-brightgreen.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/statuses.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/statuses -[coveralls-image]: https://img.shields.io/coveralls/jshttp/statuses.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/statuses?branch=master -[downloads-image]: http://img.shields.io/npm/dm/statuses.svg?style=flat -[downloads-url]: https://npmjs.org/package/statuses diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/codes.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/codes.json deleted file mode 100644 index 4c45a88..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/codes.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "100": "Continue", - "101": "Switching Protocols", - "102": "Processing", - "200": "OK", - "201": "Created", - "202": "Accepted", - "203": "Non-Authoritative Information", - "204": "No Content", - "205": "Reset Content", - "206": "Partial Content", - "207": "Multi-Status", - "208": "Already Reported", - "226": "IM Used", - "300": "Multiple Choices", - "301": "Moved Permanently", - "302": "Found", - "303": "See Other", - "304": "Not Modified", - "305": "Use Proxy", - "306": "(Unused)", - "307": "Temporary Redirect", - "308": "Permanent Redirect", - "400": "Bad Request", - "401": "Unauthorized", - "402": "Payment Required", - "403": "Forbidden", - "404": "Not Found", - "405": "Method Not Allowed", - "406": "Not Acceptable", - "407": "Proxy Authentication Required", - "408": "Request Timeout", - "409": "Conflict", - "410": "Gone", - "411": "Length Required", - "412": "Precondition Failed", - "413": "Payload Too Large", - "414": "URI Too Long", - "415": "Unsupported Media Type", - "416": "Range Not Satisfiable", - "417": "Expectation Failed", - "418": "I'm a teapot", - "422": "Unprocessable Entity", - "423": "Locked", - "424": "Failed Dependency", - "425": "Unordered Collection", - "426": "Upgrade Required", - "428": "Precondition Required", - "429": "Too Many Requests", - "431": "Request Header Fields Too Large", - "451": "Unavailable For Legal Reasons", - "500": "Internal Server Error", - "501": "Not Implemented", - "502": "Bad Gateway", - "503": "Service Unavailable", - "504": "Gateway Timeout", - "505": "HTTP Version Not Supported", - "506": "Variant Also Negotiates", - "507": "Insufficient Storage", - "508": "Loop Detected", - "509": "Bandwidth Limit Exceeded", - "510": "Not Extended", - "511": "Network Authentication Required" -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/index.js deleted file mode 100644 index b06182d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/index.js +++ /dev/null @@ -1,60 +0,0 @@ - -var codes = require('./codes.json'); - -module.exports = status; - -// [Integer...] -status.codes = Object.keys(codes).map(function (code) { - code = ~~code; - var msg = codes[code]; - status[code] = msg; - status[msg] = status[msg.toLowerCase()] = code; - return code; -}); - -// status codes for redirects -status.redirect = { - 300: true, - 301: true, - 302: true, - 303: true, - 305: true, - 307: true, - 308: true, -}; - -// status codes for empty bodies -status.empty = { - 204: true, - 205: true, - 304: true, -}; - -// status codes for when you should retry the request -status.retry = { - 502: true, - 503: true, - 504: true, -}; - -function status(code) { - if (typeof code === 'number') { - if (!status[code]) throw new Error('invalid status code: ' + code); - return code; - } - - if (typeof code !== 'string') { - throw new TypeError('code must be a number or string'); - } - - // '403' - var n = parseInt(code, 10) - if (!isNaN(n)) { - if (!status[n]) throw new Error('invalid status code: ' + n); - return n; - } - - n = status[code.toLowerCase()]; - if (!n) throw new Error('invalid status message: "' + code + '"'); - return n; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/package.json deleted file mode 100644 index affbc79..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/node_modules/statuses/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "statuses", - "description": "HTTP status utility", - "version": "1.2.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "repository": { - "type": "git", - "url": "https://github.com/jshttp/statuses" - }, - "license": "MIT", - "keywords": [ - "http", - "status", - "code" - ], - "files": [ - "index.js", - "codes.json", - "LICENSE" - ], - "devDependencies": { - "csv-parse": "0.0.6", - "istanbul": "0", - "mocha": "1", - "stream-to-array": "2" - }, - "scripts": { - "build": "node scripts/build.js", - "update": "node scripts/update.js", - "test": "mocha --reporter spec --bail --check-leaks", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks" - }, - "gitHead": "49e6ac7ae4c63ee8186f56cb52112a7eeda28ed7", - "bugs": { - "url": "https://github.com/jshttp/statuses/issues" - }, - "homepage": "https://github.com/jshttp/statuses", - "_id": "statuses@1.2.1", - "_shasum": "dded45cc18256d51ed40aec142489d5c61026d28", - "_from": "statuses@>=1.2.1 <1.3.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "dded45cc18256d51ed40aec142489d5c61026d28", - "tarball": "http://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/package.json deleted file mode 100644 index 8b50da2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/send/package.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "send", - "description": "Better streaming static file server with Range and conditional-GET support", - "version": "0.13.0", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/pillarjs/send" - }, - "keywords": [ - "static", - "file", - "server" - ], - "dependencies": { - "debug": "~2.2.0", - "depd": "~1.0.1", - "destroy": "1.0.3", - "escape-html": "1.0.2", - "etag": "~1.7.0", - "fresh": "0.3.0", - "http-errors": "~1.3.1", - "mime": "1.3.4", - "ms": "0.7.1", - "on-finished": "~2.3.0", - "range-parser": "~1.0.2", - "statuses": "~1.2.1" - }, - "devDependencies": { - "after": "0.8.1", - "istanbul": "0.3.9", - "mocha": "2.2.5", - "supertest": "1.0.1" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --check-leaks --reporter spec --bail", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot" - }, - "gitHead": "80cfa7f54ce87c75e92619d5bc510406bd69133a", - "bugs": { - "url": "https://github.com/pillarjs/send/issues" - }, - "homepage": "https://github.com/pillarjs/send", - "_id": "send@0.13.0", - "_shasum": "518f921aeb0560aec7dcab2990b14cf6f3cce5de", - "_from": "send@0.13.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "518f921aeb0560aec7dcab2990b14cf6f3cce5de", - "tarball": "http://registry.npmjs.org/send/-/send-0.13.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/send/-/send-0.13.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/HISTORY.md deleted file mode 100644 index 744b6f1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/HISTORY.md +++ /dev/null @@ -1,284 +0,0 @@ -1.10.0 / 2015-06-17 -=================== - - * Add `fallthrough` option - - Allows declaring this middleware is the final destination - - Provides better integration with Express patterns - * Fix reading options from options prototype - * Improve the default redirect response headers - * deps: escape-html@1.0.2 - * deps: send@0.13.0 - - Allow Node.js HTTP server to set `Date` response header - - Fix incorrectly removing `Content-Location` on 304 response - - Improve the default redirect response headers - - Send appropriate headers on default error response - - Use `http-errors` for standard emitted errors - - Use `statuses` instead of `http` module for status messages - - deps: escape-html@1.0.2 - - deps: etag@~1.7.0 - - deps: fresh@0.3.0 - - deps: on-finished@~2.3.0 - - perf: enable strict mode - - perf: remove unnecessary array allocations - * perf: enable strict mode - * perf: remove argument reassignment - -1.9.3 / 2015-05-14 -================== - - * deps: send@0.12.3 - - deps: debug@~2.2.0 - - deps: depd@~1.0.1 - - deps: etag@~1.6.0 - - deps: ms@0.7.1 - - deps: on-finished@~2.2.1 - -1.9.2 / 2015-03-14 -================== - - * deps: send@0.12.2 - - Throw errors early for invalid `extensions` or `index` options - - deps: debug@~2.1.3 - -1.9.1 / 2015-02-17 -================== - - * deps: send@0.12.1 - - Fix regression sending zero-length files - -1.9.0 / 2015-02-16 -================== - - * deps: send@0.12.0 - - Always read the stat size from the file - - Fix mutating passed-in `options` - - deps: mime@1.3.4 - -1.8.1 / 2015-01-20 -================== - - * Fix redirect loop in Node.js 0.11.14 - * deps: send@0.11.1 - - Fix root path disclosure - -1.8.0 / 2015-01-05 -================== - - * deps: send@0.11.0 - - deps: debug@~2.1.1 - - deps: etag@~1.5.1 - - deps: ms@0.7.0 - - deps: on-finished@~2.2.0 - -1.7.2 / 2015-01-02 -================== - - * Fix potential open redirect when mounted at root - -1.7.1 / 2014-10-22 -================== - - * deps: send@0.10.1 - - deps: on-finished@~2.1.1 - -1.7.0 / 2014-10-15 -================== - - * deps: send@0.10.0 - - deps: debug@~2.1.0 - - deps: depd@~1.0.0 - - deps: etag@~1.5.0 - -1.6.5 / 2015-02-04 -================== - - * Fix potential open redirect when mounted at root - - Back-ported from v1.7.2 - -1.6.4 / 2014-10-08 -================== - - * Fix redirect loop when index file serving disabled - -1.6.3 / 2014-09-24 -================== - - * deps: send@0.9.3 - - deps: etag@~1.4.0 - -1.6.2 / 2014-09-15 -================== - - * deps: send@0.9.2 - - deps: depd@0.4.5 - - deps: etag@~1.3.1 - - deps: range-parser@~1.0.2 - -1.6.1 / 2014-09-07 -================== - - * deps: send@0.9.1 - - deps: fresh@0.2.4 - -1.6.0 / 2014-09-07 -================== - - * deps: send@0.9.0 - - Add `lastModified` option - - Use `etag` to generate `ETag` header - - deps: debug@~2.0.0 - -1.5.4 / 2014-09-04 -================== - - * deps: send@0.8.5 - - Fix a path traversal issue when using `root` - - Fix malicious path detection for empty string path - -1.5.3 / 2014-08-17 -================== - - * deps: send@0.8.3 - -1.5.2 / 2014-08-14 -================== - - * deps: send@0.8.2 - - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` - -1.5.1 / 2014-08-09 -================== - - * Fix parsing of weird `req.originalUrl` values - * deps: parseurl@~1.3.0 - * deps: utils-merge@1.0.0 - -1.5.0 / 2014-08-05 -================== - - * deps: send@0.8.1 - - Add `extensions` option - -1.4.4 / 2014-08-04 -================== - - * deps: send@0.7.4 - - Fix serving index files without root dir - -1.4.3 / 2014-07-29 -================== - - * deps: send@0.7.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - -1.4.2 / 2014-07-27 -================== - - * deps: send@0.7.2 - - deps: depd@0.4.4 - -1.4.1 / 2014-07-26 -================== - - * deps: send@0.7.1 - - deps: depd@0.4.3 - -1.4.0 / 2014-07-21 -================== - - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -1.3.2 / 2014-07-11 -================== - - * deps: send@0.6.0 - - Cap `maxAge` value to 1 year - - deps: debug@1.0.3 - -1.3.1 / 2014-07-09 -================== - - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -1.3.0 / 2014-06-28 -================== - - * Add `setHeaders` option - * Include HTML link in redirect response - * deps: send@0.5.0 - - Accept string for `maxAge` (converted by `ms`) - -1.2.3 / 2014-06-11 -================== - - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -1.2.2 / 2014-06-09 -================== - - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - -1.2.1 / 2014-06-02 -================== - - * use `escape-html` for escaping - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -1.2.0 / 2014-05-29 -================== - - * deps: send@0.4.0 - - Calculate ETag with md5 for reduced collisions - - Fix wrong behavior when index file matches directory - - Ignore stream errors after request ends - - Skip directories in index file search - - deps: debug@0.8.1 - -1.1.0 / 2014-04-24 -================== - - * Accept options directly to `send` module - * deps: send@0.3.0 - -1.0.4 / 2014-04-07 -================== - - * Resolve relative paths at middleware setup - * Use parseurl to parse the URL from request - -1.0.3 / 2014-03-20 -================== - - * Do not rely on connect-like environments - -1.0.2 / 2014-03-06 -================== - - * deps: send@0.2.0 - -1.0.1 / 2014-03-05 -================== - - * Add mime export for back-compat - -1.0.0 / 2014-03-05 -================== - - * Genesis from `connect` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/LICENSE deleted file mode 100644 index d8cce67..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -(The MIT License) - -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 LearnBoost -Copyright (c) 2011 TJ Holowaychuk -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/README.md deleted file mode 100644 index 1a7b054..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/README.md +++ /dev/null @@ -1,235 +0,0 @@ -# serve-static - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Linux Build][travis-image]][travis-url] -[![Windows Build][appveyor-image]][appveyor-url] -[![Test Coverage][coveralls-image]][coveralls-url] -[![Gratipay][gratipay-image]][gratipay-url] - -## Install - -```sh -$ npm install serve-static -``` - -## API - -```js -var serveStatic = require('serve-static') -``` - -### serveStatic(root, options) - -Create a new middleware function to serve files from within a given root -directory. The file to serve will be determined by combining `req.url` -with the provided root directory. When a file is not found, instead of -sending a 404 response, this module will instead call `next()` to move on -to the next middleware, allowing for stacking and fall-backs. - -#### Options - -##### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file -or directory that begins with a dot ("."). Note this check is done on -the path itself without checking if the path actually exists on the -disk. If `root` is specified, only the dotfiles above the root are -checked (i.e. the root itself can be within a dotfile when set -to "deny"). - -The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Deny a request for a dotfile and 403/`next()`. - - `'ignore'` Pretend like the dotfile does not exist and 404/`next()`. - -##### etag - -Enable or disable etag generation, defaults to true. - -##### extensions - -Set file extension fallbacks. When set, if a file is not found, the given -extensions will be added to the file name and search for. The first that -exists will be served. Example: `['html', 'htm']`. - -The default value is `false`. - -##### fallthrough - -Set the middleware to have client errors fall-through as just unhandled -requests, otherwise forward a client error. The difference is that client -errors like a bad request or a request to a non-existent file will cause -this middleware to simply `next()` to your next middleware when this value -is `true`. When this value is `false`, these errors (even 404s), will invoke -`next(err)`. - -Typically `true` is desired such that multiple physical directories can be -mapped to the same web address or for routes to fill in non-existent files. - -The value `false` can be used if this middleware is mounted at a path that -is designed to be strictly a single file system directory, which allows for -short-circuiting 404s for less overhead. This middleware will also reply to -all methods. - -The default value is `true`. - -##### index - -By default this module will send "index.html" files in response to a request -on a directory. To disable this set `false` or to supply a new index pass a -string or an array in preferred order. - -##### lastModified - -Enable or disable `Last-Modified` header, defaults to true. Uses the file -system's last modified value. - -##### maxAge - -Provide a max-age in milliseconds for http caching, defaults to 0. This -can also be a string accepted by the [ms](https://www.npmjs.org/package/ms#readme) -module. - -##### redirect - -Redirect to trailing "/" when the pathname is a dir. Defaults to `true`. - -##### setHeaders - -Function to set custom headers on response. Alterations to the headers need to -occur synchronously. The function is called as `fn(res, path, stat)`, where -the arguments are: - - - `res` the response object - - `path` the file path that is being sent - - `stat` the stat object of the file that is being sent - -## Examples - -### Serve files with vanilla node.js http server - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -// Serve up public/ftp folder -var serve = serveStatic('public/ftp', {'index': ['index.html', 'index.htm']}) - -// Create server -var server = http.createServer(function(req, res){ - var done = finalhandler(req, res) - serve(req, res, done) -}) - -// Listen -server.listen(3000) -``` - -### Serve all files as downloads - -```js -var contentDisposition = require('content-disposition') -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -// Serve up public/ftp folder -var serve = serveStatic('public/ftp', { - 'index': false, - 'setHeaders': setHeaders -}) - -// Set header to force download -function setHeaders(res, path) { - res.setHeader('Content-Disposition', contentDisposition(path)) -} - -// Create server -var server = http.createServer(function(req, res){ - var done = finalhandler(req, res) - serve(req, res, done) -}) - -// Listen -server.listen(3000) -``` - -### Serving using express - -#### Simple - -This is a simple example of using Express. - -```js -var express = require('express') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic('public/ftp', {'index': ['default.html', 'default.htm']})) -app.listen(3000) -``` - -#### Multiple roots - -This example shows a simple way to search through multiple directories. -Files are look for in `public-optimized/` first, then `public/` second as -a fallback. - -```js -var express = require('express') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic(__dirname + '/public-optimized')) -app.use(serveStatic(__dirname + '/public')) -app.listen(3000) -``` - -#### Different settings for paths - -This example shows how to set a different max age depending on the served -file type. In this example, HTML files are not cached, while everything else -is for 1 day. - -```js -var express = require('express') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic(__dirname + '/public', { - maxAge: '1d', - setHeaders: setCustomCacheControl -})) - -app.listen(3000) - -function setCustomCacheControl(res, path) { - if (serveStatic.mime.lookup(path) === 'text/html') { - // Custom Cache-Control for HTML files - res.setHeader('Cache-Control', 'public, max-age=0') - } -} -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/serve-static.svg -[npm-url]: https://npmjs.org/package/serve-static -[travis-image]: https://img.shields.io/travis/expressjs/serve-static/master.svg?label=linux -[travis-url]: https://travis-ci.org/expressjs/serve-static -[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/serve-static/master.svg?label=windows -[appveyor-url]: https://ci.appveyor.com/project/dougwilson/serve-static -[coveralls-image]: https://img.shields.io/coveralls/expressjs/serve-static/master.svg -[coveralls-url]: https://coveralls.io/r/expressjs/serve-static -[downloads-image]: https://img.shields.io/npm/dm/serve-static.svg -[downloads-url]: https://npmjs.org/package/serve-static -[gratipay-image]: https://img.shields.io/gratipay/dougwilson.svg -[gratipay-url]: https://gratipay.com/dougwilson/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/index.js deleted file mode 100644 index 0a9f494..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/index.js +++ /dev/null @@ -1,187 +0,0 @@ -/*! - * serve-static - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var escapeHtml = require('escape-html') -var parseUrl = require('parseurl') -var resolve = require('path').resolve -var send = require('send') -var url = require('url') - -/** - * Module exports. - * @public - */ - -module.exports = serveStatic -module.exports.mime = send.mime - -/** - * @param {string} root - * @param {object} [options] - * @return {function} - * @public - */ - -function serveStatic(root, options) { - if (!root) { - throw new TypeError('root path required') - } - - if (typeof root !== 'string') { - throw new TypeError('root path must be a string') - } - - // copy options object - var opts = Object.create(options || null) - - // fall-though - var fallthrough = opts.fallthrough !== false - - // default redirect - var redirect = opts.redirect !== false - - // headers listener - var setHeaders = opts.setHeaders - - if (setHeaders && typeof setHeaders !== 'function') { - throw new TypeError('option setHeaders must be function') - } - - // setup options for send - opts.maxage = opts.maxage || opts.maxAge || 0 - opts.root = resolve(root) - - // construct directory listener - var onDirectory = redirect - ? createRedirectDirectoryListener() - : createNotFoundDirectoryListener() - - return function serveStatic(req, res, next) { - if (req.method !== 'GET' && req.method !== 'HEAD') { - if (fallthrough) { - return next() - } - - // method not allowed - res.statusCode = 405 - res.setHeader('Allow', 'GET, HEAD') - res.setHeader('Content-Length', '0') - res.end() - return - } - - var forwardError = !fallthrough - var originalUrl = parseUrl.original(req) - var path = parseUrl(req).pathname - - // make sure redirect occurs at mount - if (path === '/' && originalUrl.pathname.substr(-1) !== '/') { - path = '' - } - - // create send stream - var stream = send(req, path, opts) - - // add directory handler - stream.on('directory', onDirectory) - - // add headers listener - if (setHeaders) { - stream.on('headers', setHeaders) - } - - // add file listener for fallthrough - if (fallthrough) { - stream.on('file', function onFile() { - // once file is determined, always forward error - forwardError = true - }) - } - - // forward errors - stream.on('error', function error(err) { - if (forwardError || !(err.statusCode < 500)) { - next(err) - return - } - - next() - }) - - // pipe - stream.pipe(res) - } -} - -/** - * Collapse all leading slashes into a single slash - * @private - */ -function collapseLeadingSlashes(str) { - for (var i = 0; i < str.length; i++) { - if (str[i] !== '/') { - break - } - } - - return i > 1 - ? '/' + str.substr(i) - : str -} - -/** - * Create a directory listener that just 404s. - * @private - */ - -function createNotFoundDirectoryListener() { - return function notFound() { - this.error(404) - } -} - -/** - * Create a directory listener that performs a redirect. - * @private - */ - -function createRedirectDirectoryListener() { - return function redirect() { - if (this.hasTrailingSlash()) { - this.error(404) - return - } - - // get original URL - var originalUrl = parseUrl.original(this.req) - - // append trailing slash - originalUrl.path = null - originalUrl.pathname = collapseLeadingSlashes(originalUrl.pathname + '/') - - // reformat the URL - var loc = url.format(originalUrl) - var msg = 'Redirecting to ' + escapeHtml(loc) + '\n' - var res = this.res - - // send redirect response - res.statusCode = 303 - res.setHeader('Content-Type', 'text/html; charset=UTF-8') - res.setHeader('Content-Length', Buffer.byteLength(msg)) - res.setHeader('X-Content-Type-Options', 'nosniff') - res.setHeader('Location', loc) - res.end(msg) - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/package.json deleted file mode 100644 index c190511..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/serve-static/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "serve-static", - "description": "Serve static files", - "version": "1.10.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/expressjs/serve-static" - }, - "dependencies": { - "escape-html": "1.0.2", - "parseurl": "~1.3.0", - "send": "0.13.0" - }, - "devDependencies": { - "istanbul": "0.3.9", - "mocha": "2.2.5", - "supertest": "1.0.1" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" - }, - "gitHead": "856c5e0f796a8988525c356018594bfb8c51a4fa", - "bugs": { - "url": "https://github.com/expressjs/serve-static/issues" - }, - "homepage": "https://github.com/expressjs/serve-static", - "_id": "serve-static@1.10.0", - "_shasum": "be632faa685820e4a43ed3df1379135cc4f370d7", - "_from": "serve-static@>=1.10.0 <1.11.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "be632faa685820e4a43ed3df1379135cc4f370d7", - "tarball": "http://registry.npmjs.org/serve-static/-/serve-static-1.10.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/HISTORY.md deleted file mode 100644 index 8976fd3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/HISTORY.md +++ /dev/null @@ -1,174 +0,0 @@ -1.6.8 / 2015-09-04 -================== - - * deps: mime-types@~2.1.6 - - Add new mime types - -1.6.7 / 2015-08-20 -================== - - * Fix type error when given invalid type to match against - * deps: mime-types@~2.1.5 - - Add new mime types - -1.6.6 / 2015-07-31 -================== - - * deps: mime-types@~2.1.4 - - Add new mime types - -1.6.5 / 2015-07-16 -================== - - * deps: mime-types@~2.1.3 - - Add new mime types - -1.6.4 / 2015-07-01 -================== - - * deps: mime-types@~2.1.2 - - Add new mime types - * perf: enable strict mode - * perf: remove argument reassignment - -1.6.3 / 2015-06-08 -================== - - * deps: mime-types@~2.1.1 - - Add new mime types - * perf: reduce try block size - * perf: remove bitwise operations - -1.6.2 / 2015-05-10 -================== - - * deps: mime-types@~2.0.11 - - Add new mime types - -1.6.1 / 2015-03-13 -================== - - * deps: mime-types@~2.0.10 - - Add new mime types - -1.6.0 / 2015-02-12 -================== - - * fix false-positives in `hasBody` `Transfer-Encoding` check - * support wildcard for both type and subtype (`*/*`) - -1.5.7 / 2015-02-09 -================== - - * fix argument reassignment - * deps: mime-types@~2.0.9 - - Add new mime types - -1.5.6 / 2015-01-29 -================== - - * deps: mime-types@~2.0.8 - - Add new mime types - -1.5.5 / 2014-12-30 -================== - - * deps: mime-types@~2.0.7 - - Add new mime types - - Fix missing extensions - - Fix various invalid MIME type entries - - Remove example template MIME types - - deps: mime-db@~1.5.0 - -1.5.4 / 2014-12-10 -================== - - * deps: mime-types@~2.0.4 - - Add new mime types - - deps: mime-db@~1.3.0 - -1.5.3 / 2014-11-09 -================== - - * deps: mime-types@~2.0.3 - - Add new mime types - - deps: mime-db@~1.2.0 - -1.5.2 / 2014-09-28 -================== - - * deps: mime-types@~2.0.2 - - Add new mime types - - deps: mime-db@~1.1.0 - -1.5.1 / 2014-09-07 -================== - - * Support Node.js 0.6 - * deps: media-typer@0.3.0 - * deps: mime-types@~2.0.1 - - Support Node.js 0.6 - -1.5.0 / 2014-09-05 -================== - - * fix `hasbody` to be true for `content-length: 0` - -1.4.0 / 2014-09-02 -================== - - * update mime-types - -1.3.2 / 2014-06-24 -================== - - * use `~` range on mime-types - -1.3.1 / 2014-06-19 -================== - - * fix global variable leak - -1.3.0 / 2014-06-19 -================== - - * improve type parsing - - - invalid media type never matches - - media type not case-sensitive - - extra LWS does not affect results - -1.2.2 / 2014-06-19 -================== - - * fix behavior on unknown type argument - -1.2.1 / 2014-06-03 -================== - - * switch dependency from `mime` to `mime-types@1.0.0` - -1.2.0 / 2014-05-11 -================== - - * support suffix matching: - - - `+json` matches `application/vnd+json` - - `*/vnd+json` matches `application/vnd+json` - - `application/*+json` matches `application/vnd+json` - -1.1.0 / 2014-04-12 -================== - - * add non-array values support - * expose internal utilities: - - - `.is()` - - `.hasBody()` - - `.normalize()` - - `.match()` - -1.0.1 / 2014-03-30 -================== - - * add `multipart` as a shorthand diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/LICENSE deleted file mode 100644 index 386b7b6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/README.md deleted file mode 100644 index f75f6be..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/README.md +++ /dev/null @@ -1,132 +0,0 @@ -# type-is - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Infer the content-type of a request. - -### Install - -```sh -$ npm install type-is -``` - -## API - -```js -var http = require('http') -var is = require('type-is') - -http.createServer(function (req, res) { - var istext = is(req, ['text/*']) - res.end('you ' + (istext ? 'sent' : 'did not send') + ' me text') -}) -``` - -### type = is(request, types) - -`request` is the node HTTP request. `types` is an array of types. - -```js -// req.headers.content-type = 'application/json' - -is(req, ['json']) // 'json' -is(req, ['html', 'json']) // 'json' -is(req, ['application/*']) // 'application/json' -is(req, ['application/json']) // 'application/json' - -is(req, ['html']) // false -``` - -### is.hasBody(request) - -Returns a Boolean if the given `request` has a body, regardless of the -`Content-Type` header. - -```js -if (is.hasBody(req)) { - // read the body, since there is one - - req.on('data', function (chunk) { - // ... - }) -} -``` - -### type = is.is(mediaType, types) - -`mediaType` is the [media type](https://tools.ietf.org/html/rfc6838) string. `types` is an array of types. - -```js -var mediaType = 'application/json' - -is.is(mediaType, ['json']) // 'json' -is.is(mediaType, ['html', 'json']) // 'json' -is.is(mediaType, ['application/*']) // 'application/json' -is.is(mediaType, ['application/json']) // 'application/json' - -is.is(mediaType, ['html']) // false -``` - -### Each type can be: - -- An extension name such as `json`. This name will be returned if matched. -- A mime type such as `application/json`. -- A mime type with a wildcard such as `*/*` or `*/json` or `application/*`. The full mime type will be returned if matched. -- A suffix such as `+json`. This can be combined with a wildcard such as `*/vnd+json` or `application/*+json`. The full mime type will be returned if matched. - -`false` will be returned if no type matches or the content type is invalid. - -`null` will be returned if the request does not have a body. - -## Examples - -#### Example body parser - -```js -var is = require('type-is'); - -function bodyParser(req, res, next) { - if (!is.hasBody(req)) { - return next() - } - - switch (is(req, ['urlencoded', 'json', 'multipart'])) { - case 'urlencoded': - // parse urlencoded body - throw new Error('implement urlencoded body parsing') - break - case 'json': - // parse json body - throw new Error('implement json body parsing') - break - case 'multipart': - // parse multipart body - throw new Error('implement multipart body parsing') - break - default: - // 415 error code - res.statusCode = 415 - res.end() - return - } -} -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/type-is.svg -[npm-url]: https://npmjs.org/package/type-is -[node-version-image]: https://img.shields.io/node/v/type-is.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/type-is/master.svg -[travis-url]: https://travis-ci.org/jshttp/type-is -[coveralls-image]: https://img.shields.io/coveralls/jshttp/type-is/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/type-is?branch=master -[downloads-image]: https://img.shields.io/npm/dm/type-is.svg -[downloads-url]: https://npmjs.org/package/type-is diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/index.js deleted file mode 100644 index 5c11ef1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/index.js +++ /dev/null @@ -1,262 +0,0 @@ -/*! - * type-is - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var typer = require('media-typer') -var mime = require('mime-types') - -/** - * Module exports. - * @public - */ - -module.exports = typeofrequest -module.exports.is = typeis -module.exports.hasBody = hasbody -module.exports.normalize = normalize -module.exports.match = mimeMatch - -/** - * Compare a `value` content-type with `types`. - * Each `type` can be an extension like `html`, - * a special shortcut like `multipart` or `urlencoded`, - * or a mime type. - * - * If no types match, `false` is returned. - * Otherwise, the first `type` that matches is returned. - * - * @param {String} value - * @param {Array} types - * @public - */ - -function typeis(value, types_) { - var i - var types = types_ - - // remove parameters and normalize - var val = tryNormalizeType(value) - - // no type or invalid - if (!val) { - return false - } - - // support flattened arguments - if (types && !Array.isArray(types)) { - types = new Array(arguments.length - 1) - for (i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // no types, return the content type - if (!types || !types.length) { - return val - } - - var type - for (i = 0; i < types.length; i++) { - if (mimeMatch(normalize(type = types[i]), val)) { - return type[0] === '+' || type.indexOf('*') !== -1 - ? val - : type - } - } - - // no matches - return false -} - -/** - * Check if a request has a request body. - * A request with a body __must__ either have `transfer-encoding` - * or `content-length` headers set. - * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 - * - * @param {Object} request - * @return {Boolean} - * @public - */ - -function hasbody(req) { - return req.headers['transfer-encoding'] !== undefined - || !isNaN(req.headers['content-length']) -} - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains any of the give mime `type`s. - * If there is no request body, `null` is returned. - * If there is no content type, `false` is returned. - * Otherwise, it returns the first `type` that matches. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * this.is('html'); // => 'html' - * this.is('text/html'); // => 'text/html' - * this.is('text/*', 'application/json'); // => 'text/html' - * - * // When Content-Type is application/json - * this.is('json', 'urlencoded'); // => 'json' - * this.is('application/json'); // => 'application/json' - * this.is('html', 'application/*'); // => 'application/json' - * - * this.is('html'); // => false - * - * @param {String|Array} types... - * @return {String|false|null} - * @public - */ - -function typeofrequest(req, types_) { - var types = types_ - - // no body - if (!hasbody(req)) { - return null - } - - // support flattened arguments - if (arguments.length > 2) { - types = new Array(arguments.length - 1) - for (var i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // request content type - var value = req.headers['content-type'] - - return typeis(value, types) -} - -/** - * Normalize a mime type. - * If it's a shorthand, expand it to a valid mime type. - * - * In general, you probably want: - * - * var type = is(req, ['urlencoded', 'json', 'multipart']); - * - * Then use the appropriate body parsers. - * These three are the most common request body types - * and are thus ensured to work. - * - * @param {String} type - * @private - */ - -function normalize(type) { - if (typeof type !== 'string') { - // invalid type - return false - } - - switch (type) { - case 'urlencoded': - return 'application/x-www-form-urlencoded' - case 'multipart': - return 'multipart/*' - } - - if (type[0] === '+') { - // "+json" -> "*/*+json" expando - return '*/*' + type - } - - return type.indexOf('/') === -1 - ? mime.lookup(type) - : type -} - -/** - * Check if `exected` mime type - * matches `actual` mime type with - * wildcard and +suffix support. - * - * @param {String} expected - * @param {String} actual - * @return {Boolean} - * @private - */ - -function mimeMatch(expected, actual) { - // invalid type - if (expected === false) { - return false - } - - // split types - var actualParts = actual.split('/') - var expectedParts = expected.split('/') - - // invalid format - if (actualParts.length !== 2 || expectedParts.length !== 2) { - return false - } - - // validate type - if (expectedParts[0] !== '*' && expectedParts[0] !== actualParts[0]) { - return false - } - - // validate suffix wildcard - if (expectedParts[1].substr(0, 2) === '*+') { - return expectedParts[1].length <= actualParts[1].length + 1 - && expectedParts[1].substr(1) === actualParts[1].substr(1 - expectedParts[1].length) - } - - // validate subtype - if (expectedParts[1] !== '*' && expectedParts[1] !== actualParts[1]) { - return false - } - - return true -} - -/** - * Normalize a type and remove parameters. - * - * @param {string} value - * @return {string} - * @private - */ - -function normalizeType(value) { - // parse the type - var type = typer.parse(value) - - // remove the parameters - type.parameters = undefined - - // reformat it - return typer.format(type) -} - -/** - * Try to normalize a type and remove parameters. - * - * @param {string} value - * @return {string} - * @private - */ - -function tryNormalizeType(value) { - try { - return normalizeType(value) - } catch (err) { - return null - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/HISTORY.md deleted file mode 100644 index 62c2003..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/HISTORY.md +++ /dev/null @@ -1,22 +0,0 @@ -0.3.0 / 2014-09-07 -================== - - * Support Node.js 0.6 - * Throw error when parameter format invalid on parse - -0.2.0 / 2014-06-18 -================== - - * Add `typer.format()` to format media types - -0.1.0 / 2014-06-17 -================== - - * Accept `req` as argument to `parse` - * Accept `res` as argument to `parse` - * Parse media type with extra LWS between type and first parameter - -0.0.0 / 2014-06-13 -================== - - * Initial implementation diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/README.md deleted file mode 100644 index d8df623..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# media-typer - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Simple RFC 6838 media type parser - -## Installation - -```sh -$ npm install media-typer -``` - -## API - -```js -var typer = require('media-typer') -``` - -### typer.parse(string) - -```js -var obj = typer.parse('image/svg+xml; charset=utf-8') -``` - -Parse a media type string. This will return an object with the following -properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`): - - - `type`: The type of the media type (always lower case). Example: `'image'` - - - `subtype`: The subtype of the media type (always lower case). Example: `'svg'` - - - `suffix`: The suffix of the media type (always lower case). Example: `'xml'` - - - `parameters`: An object of the parameters in the media type (name of parameter always lower case). Example: `{charset: 'utf-8'}` - -### typer.parse(req) - -```js -var obj = typer.parse(req) -``` - -Parse the `content-type` header from the given `req`. Short-cut for -`typer.parse(req.headers['content-type'])`. - -### typer.parse(res) - -```js -var obj = typer.parse(res) -``` - -Parse the `content-type` header set on the given `res`. Short-cut for -`typer.parse(res.getHeader('content-type'))`. - -### typer.format(obj) - -```js -var obj = typer.format({type: 'image', subtype: 'svg', suffix: 'xml'}) -``` - -Format an object into a media type string. This will return a string of the -mime type for the given object. For the properties of the object, see the -documentation for `typer.parse(string)`. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/media-typer.svg?style=flat -[npm-url]: https://npmjs.org/package/media-typer -[node-version-image]: https://img.shields.io/badge/node.js-%3E%3D_0.6-brightgreen.svg?style=flat -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/media-typer.svg?style=flat -[travis-url]: https://travis-ci.org/jshttp/media-typer -[coveralls-image]: https://img.shields.io/coveralls/jshttp/media-typer.svg?style=flat -[coveralls-url]: https://coveralls.io/r/jshttp/media-typer -[downloads-image]: https://img.shields.io/npm/dm/media-typer.svg?style=flat -[downloads-url]: https://npmjs.org/package/media-typer diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/index.js deleted file mode 100644 index 07f7295..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/index.js +++ /dev/null @@ -1,270 +0,0 @@ -/*! - * media-typer - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * RegExp to match *( ";" parameter ) in RFC 2616 sec 3.7 - * - * parameter = token "=" ( token | quoted-string ) - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) - * qdtext = > - * quoted-pair = "\" CHAR - * CHAR = - * TEXT = - * LWS = [CRLF] 1*( SP | HT ) - * CRLF = CR LF - * CR = - * LF = - * SP = - * SHT = - * CTL = - * OCTET = - */ -var paramRegExp = /; *([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *= *("(?:[ !\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u0020-\u007e])*"|[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) */g; -var textRegExp = /^[\u0020-\u007e\u0080-\u00ff]+$/ -var tokenRegExp = /^[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+$/ - -/** - * RegExp to match quoted-pair in RFC 2616 - * - * quoted-pair = "\" CHAR - * CHAR = - */ -var qescRegExp = /\\([\u0000-\u007f])/g; - -/** - * RegExp to match chars that must be quoted-pair in RFC 2616 - */ -var quoteRegExp = /([\\"])/g; - -/** - * RegExp to match type in RFC 6838 - * - * type-name = restricted-name - * subtype-name = restricted-name - * restricted-name = restricted-name-first *126restricted-name-chars - * restricted-name-first = ALPHA / DIGIT - * restricted-name-chars = ALPHA / DIGIT / "!" / "#" / - * "$" / "&" / "-" / "^" / "_" - * restricted-name-chars =/ "." ; Characters before first dot always - * ; specify a facet name - * restricted-name-chars =/ "+" ; Characters after last plus always - * ; specify a structured syntax suffix - * ALPHA = %x41-5A / %x61-7A ; A-Z / a-z - * DIGIT = %x30-39 ; 0-9 - */ -var subtypeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/ -var typeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/ -var typeRegExp = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/; - -/** - * Module exports. - */ - -exports.format = format -exports.parse = parse - -/** - * Format object to media type. - * - * @param {object} obj - * @return {string} - * @api public - */ - -function format(obj) { - if (!obj || typeof obj !== 'object') { - throw new TypeError('argument obj is required') - } - - var parameters = obj.parameters - var subtype = obj.subtype - var suffix = obj.suffix - var type = obj.type - - if (!type || !typeNameRegExp.test(type)) { - throw new TypeError('invalid type') - } - - if (!subtype || !subtypeNameRegExp.test(subtype)) { - throw new TypeError('invalid subtype') - } - - // format as type/subtype - var string = type + '/' + subtype - - // append +suffix - if (suffix) { - if (!typeNameRegExp.test(suffix)) { - throw new TypeError('invalid suffix') - } - - string += '+' + suffix - } - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - if (!tokenRegExp.test(param)) { - throw new TypeError('invalid parameter name') - } - - string += '; ' + param + '=' + qstring(parameters[param]) - } - } - - return string -} - -/** - * Parse media type to object. - * - * @param {string|object} string - * @return {Object} - * @api public - */ - -function parse(string) { - if (!string) { - throw new TypeError('argument string is required') - } - - // support req/res-like objects as argument - if (typeof string === 'object') { - string = getcontenttype(string) - } - - if (typeof string !== 'string') { - throw new TypeError('argument string is required to be a string') - } - - var index = string.indexOf(';') - var type = index !== -1 - ? string.substr(0, index) - : string - - var key - var match - var obj = splitType(type) - var params = {} - var value - - paramRegExp.lastIndex = index - - while (match = paramRegExp.exec(string)) { - if (match.index !== index) { - throw new TypeError('invalid parameter format') - } - - index += match[0].length - key = match[1].toLowerCase() - value = match[2] - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(qescRegExp, '$1') - } - - params[key] = value - } - - if (index !== -1 && index !== string.length) { - throw new TypeError('invalid parameter format') - } - - obj.parameters = params - - return obj -} - -/** - * Get content-type from req/res objects. - * - * @param {object} - * @return {Object} - * @api private - */ - -function getcontenttype(obj) { - if (typeof obj.getHeader === 'function') { - // res-like - return obj.getHeader('content-type') - } - - if (typeof obj.headers === 'object') { - // req-like - return obj.headers && obj.headers['content-type'] - } -} - -/** - * Quote a string if necessary. - * - * @param {string} val - * @return {string} - * @api private - */ - -function qstring(val) { - var str = String(val) - - // no need to quote tokens - if (tokenRegExp.test(str)) { - return str - } - - if (str.length > 0 && !textRegExp.test(str)) { - throw new TypeError('invalid parameter value') - } - - return '"' + str.replace(quoteRegExp, '\\$1') + '"' -} - -/** - * Simply "type/subtype+siffx" into parts. - * - * @param {string} string - * @return {Object} - * @api private - */ - -function splitType(string) { - var match = typeRegExp.exec(string.toLowerCase()) - - if (!match) { - throw new TypeError('invalid media type') - } - - var type = match[1] - var subtype = match[2] - var suffix - - // suffix after last + - var index = subtype.lastIndexOf('+') - if (index !== -1) { - suffix = subtype.substr(index + 1) - subtype = subtype.substr(0, index) - } - - var obj = { - type: type, - subtype: subtype, - suffix: suffix - } - - return obj -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/package.json deleted file mode 100644 index 4bd1a51..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/media-typer/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "media-typer", - "description": "Simple RFC 6838 media type parser and formatter", - "version": "0.3.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jshttp/media-typer" - }, - "devDependencies": { - "istanbul": "0.3.2", - "mocha": "~1.21.4", - "should": "~4.0.4" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "d49d41ffd0bb5a0655fa44a59df2ec0bfc835b16", - "bugs": { - "url": "https://github.com/jshttp/media-typer/issues" - }, - "homepage": "https://github.com/jshttp/media-typer", - "_id": "media-typer@0.3.0", - "_shasum": "8710d7af0aa626f8fffa1ce00168545263255748", - "_from": "media-typer@0.3.0", - "_npmVersion": "1.4.21", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "8710d7af0aa626f8fffa1ce00168545263255748", - "tarball": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/HISTORY.md deleted file mode 100644 index e7bed42..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/HISTORY.md +++ /dev/null @@ -1,165 +0,0 @@ -2.1.6 / 2015-09--03 -================== - - * deps: mime-db@~1.18.0 - - Add new mime types - -2.1.5 / 2015-08-20 -================== - - * deps: mime-db@~1.17.0 - - Add new mime types - -2.1.4 / 2015-07-30 -================== - - * deps: mime-db@~1.16.0 - - Add new mime types - -2.1.3 / 2015-07-13 -================== - - * deps: mime-db@~1.15.0 - - Add new mime types - -2.1.2 / 2015-06-25 -================== - - * deps: mime-db@~1.14.0 - - Add new mime types - -2.1.1 / 2015-06-08 -================== - - * perf: fix deopt during mapping - -2.1.0 / 2015-06-07 -================== - - * Fix incorrectly treating extension-less file name as extension - - i.e. `'path/to/json'` will no longer return `application/json` - * Fix `.charset(type)` to accept parameters - * Fix `.charset(type)` to match case-insensitive - * Improve generation of extension to MIME mapping - * Refactor internals for readability and no argument reassignment - * Prefer `application/*` MIME types from the same source - * Prefer any type over `application/octet-stream` - * deps: mime-db@~1.13.0 - - Add nginx as a source - - Add new mime types - -2.0.14 / 2015-06-06 -=================== - - * deps: mime-db@~1.12.0 - - Add new mime types - -2.0.13 / 2015-05-31 -=================== - - * deps: mime-db@~1.11.0 - - Add new mime types - -2.0.12 / 2015-05-19 -=================== - - * deps: mime-db@~1.10.0 - - Add new mime types - -2.0.11 / 2015-05-05 -=================== - - * deps: mime-db@~1.9.1 - - Add new mime types - -2.0.10 / 2015-03-13 -=================== - - * deps: mime-db@~1.8.0 - - Add new mime types - -2.0.9 / 2015-02-09 -================== - - * deps: mime-db@~1.7.0 - - Add new mime types - - Community extensions ownership transferred from `node-mime` - -2.0.8 / 2015-01-29 -================== - - * deps: mime-db@~1.6.0 - - Add new mime types - -2.0.7 / 2014-12-30 -================== - - * deps: mime-db@~1.5.0 - - Add new mime types - - Fix various invalid MIME type entries - -2.0.6 / 2014-12-30 -================== - - * deps: mime-db@~1.4.0 - - Add new mime types - - Fix various invalid MIME type entries - - Remove example template MIME types - -2.0.5 / 2014-12-29 -================== - - * deps: mime-db@~1.3.1 - - Fix missing extensions - -2.0.4 / 2014-12-10 -================== - - * deps: mime-db@~1.3.0 - - Add new mime types - -2.0.3 / 2014-11-09 -================== - - * deps: mime-db@~1.2.0 - - Add new mime types - -2.0.2 / 2014-09-28 -================== - - * deps: mime-db@~1.1.0 - - Add new mime types - - Add additional compressible - - Update charsets - -2.0.1 / 2014-09-07 -================== - - * Support Node.js 0.6 - -2.0.0 / 2014-09-02 -================== - - * Use `mime-db` - * Remove `.define()` - -1.0.2 / 2014-08-04 -================== - - * Set charset=utf-8 for `text/javascript` - -1.0.1 / 2014-06-24 -================== - - * Add `text/jsx` type - -1.0.0 / 2014-05-12 -================== - - * Return `false` for unknown types - * Set charset=utf-8 for `application/json` - -0.1.0 / 2014-05-02 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE deleted file mode 100644 index 0616607..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Jonathan Ong -Copyright (c) 2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md deleted file mode 100644 index e26295d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md +++ /dev/null @@ -1,103 +0,0 @@ -# mime-types - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -The ultimate javascript content-type utility. - -Similar to [node-mime](https://github.com/broofa/node-mime), except: - -- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, - so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. -- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. -- Additional mime types are added such as jade and stylus via [mime-db](https://github.com/jshttp/mime-db) -- No `.define()` functionality - -Otherwise, the API is compatible. - -## Install - -```sh -$ npm install mime-types -``` - -## Adding Types - -All mime types are based on [mime-db](https://github.com/jshttp/mime-db), -so open a PR there if you'd like to add mime types. - -## API - -```js -var mime = require('mime-types') -``` - -All functions return `false` if input is invalid or not found. - -### mime.lookup(path) - -Lookup the content-type associated with a file. - -```js -mime.lookup('json') // 'application/json' -mime.lookup('.md') // 'text/x-markdown' -mime.lookup('file.html') // 'text/html' -mime.lookup('folder/file.js') // 'application/javascript' -mime.lookup('folder/.htaccess') // false - -mime.lookup('cats') // false -``` - -### mime.contentType(type) - -Create a full content-type header given a content-type or extension. - -```js -mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' -mime.contentType('file.json') // 'application/json; charset=utf-8' - -// from a full path -mime.contentType(path.extname('/path/to/file.json')) // 'application/json; charset=utf-8' -``` - -### mime.extension(type) - -Get the default extension for a content-type. - -```js -mime.extension('application/octet-stream') // 'bin' -``` - -### mime.charset(type) - -Lookup the implied default charset of a content-type. - -```js -mime.charset('text/x-markdown') // 'UTF-8' -``` - -### var type = mime.types[extension] - -A map of content-types by extension. - -### [extensions...] = mime.extensions[type] - -A map of extensions by content-type. - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/mime-types.svg -[npm-url]: https://npmjs.org/package/mime-types -[node-version-image]: https://img.shields.io/node/v/mime-types.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/mime-types/master.svg -[travis-url]: https://travis-ci.org/jshttp/mime-types -[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-types/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/mime-types -[downloads-image]: https://img.shields.io/npm/dm/mime-types.svg -[downloads-url]: https://npmjs.org/package/mime-types diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/index.js deleted file mode 100644 index f7008b2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/index.js +++ /dev/null @@ -1,188 +0,0 @@ -/*! - * mime-types - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module dependencies. - * @private - */ - -var db = require('mime-db') -var extname = require('path').extname - -/** - * Module variables. - * @private - */ - -var extractTypeRegExp = /^\s*([^;\s]*)(?:;|\s|$)/ -var textTypeRegExp = /^text\//i - -/** - * Module exports. - * @public - */ - -exports.charset = charset -exports.charsets = { lookup: charset } -exports.contentType = contentType -exports.extension = extension -exports.extensions = Object.create(null) -exports.lookup = lookup -exports.types = Object.create(null) - -// Populate the extensions/types maps -populateMaps(exports.extensions, exports.types) - -/** - * Get the default charset for a MIME type. - * - * @param {string} type - * @return {boolean|string} - */ - -function charset(type) { - if (!type || typeof type !== 'string') { - return false - } - - // TODO: use media-typer - var match = extractTypeRegExp.exec(type) - var mime = match && db[match[1].toLowerCase()] - - if (mime && mime.charset) { - return mime.charset - } - - // default text/* to utf-8 - if (match && textTypeRegExp.test(match[1])) { - return 'UTF-8' - } - - return false -} - -/** - * Create a full Content-Type header given a MIME type or extension. - * - * @param {string} str - * @return {boolean|string} - */ - -function contentType(str) { - // TODO: should this even be in this module? - if (!str || typeof str !== 'string') { - return false - } - - var mime = str.indexOf('/') === -1 - ? exports.lookup(str) - : str - - if (!mime) { - return false - } - - // TODO: use content-type or other module - if (mime.indexOf('charset') === -1) { - var charset = exports.charset(mime) - if (charset) mime += '; charset=' + charset.toLowerCase() - } - - return mime -} - -/** - * Get the default extension for a MIME type. - * - * @param {string} type - * @return {boolean|string} - */ - -function extension(type) { - if (!type || typeof type !== 'string') { - return false - } - - // TODO: use media-typer - var match = extractTypeRegExp.exec(type) - - // get extensions - var exts = match && exports.extensions[match[1].toLowerCase()] - - if (!exts || !exts.length) { - return false - } - - return exts[0] -} - -/** - * Lookup the MIME type for a file path/extension. - * - * @param {string} path - * @return {boolean|string} - */ - -function lookup(path) { - if (!path || typeof path !== 'string') { - return false - } - - // get the extension ("ext" or ".ext" or full path) - var extension = extname('x.' + path) - .toLowerCase() - .substr(1) - - if (!extension) { - return false - } - - return exports.types[extension] || false -} - -/** - * Populate the extensions and types maps. - * @private - */ - -function populateMaps(extensions, types) { - // source preference (least -> most) - var preference = ['nginx', 'apache', undefined, 'iana'] - - Object.keys(db).forEach(function forEachMimeType(type) { - var mime = db[type] - var exts = mime.extensions - - if (!exts || !exts.length) { - return - } - - // mime -> extensions - extensions[type] = exts - - // extension -> mime - for (var i = 0; i < exts.length; i++) { - var extension = exts[i] - - if (types[extension]) { - var from = preference.indexOf(db[types[extension]].source) - var to = preference.indexOf(mime.source) - - if (types[extension] !== 'application/octet-stream' - && from > to || (from === to && types[extension].substr(0, 12) === 'application/')) { - // skip the remapping - continue - } - } - - // set the extension -> mime - types[extension] = type - } - }) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/HISTORY.md deleted file mode 100644 index 87ab929..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/HISTORY.md +++ /dev/null @@ -1,266 +0,0 @@ -1.18.0 / 2015-09-03 -=================== - - * Add `application/pkcs12` - * Add `application/vnd.3gpp-prose+xml` - * Add `application/vnd.3gpp.mid-call+xml` - * Add `application/vnd.3gpp.state-and-event-info+xml` - * Add `application/vnd.anki` - * Add `application/vnd.firemonkeys.cloudcell` - * Add `application/vnd.openblox.game+xml` - * Add `application/vnd.openblox.game-binary` - -1.17.0 / 2015-08-13 -=================== - - * Add `application/x-msdos-program` - * Add `audio/g711-0` - * Add `image/vnd.mozilla.apng` - * Add extension `.exe` to `application/x-msdos-program` - -1.16.0 / 2015-07-29 -=================== - - * Add `application/vnd.uri-map` - -1.15.0 / 2015-07-13 -=================== - - * Add `application/x-httpd-php` - -1.14.0 / 2015-06-25 -=================== - - * Add `application/scim+json` - * Add `application/vnd.3gpp.ussd+xml` - * Add `application/vnd.biopax.rdf+xml` - * Add `text/x-processing` - -1.13.0 / 2015-06-07 -=================== - - * Add nginx as a source - * Add `application/x-cocoa` - * Add `application/x-java-archive-diff` - * Add `application/x-makeself` - * Add `application/x-perl` - * Add `application/x-pilot` - * Add `application/x-redhat-package-manager` - * Add `application/x-sea` - * Add `audio/x-m4a` - * Add `audio/x-realaudio` - * Add `image/x-jng` - * Add `text/mathml` - -1.12.0 / 2015-06-05 -=================== - - * Add `application/bdoc` - * Add `application/vnd.hyperdrive+json` - * Add `application/x-bdoc` - * Add extension `.rtf` to `text/rtf` - -1.11.0 / 2015-05-31 -=================== - - * Add `audio/wav` - * Add `audio/wave` - * Add extension `.litcoffee` to `text/coffeescript` - * Add extension `.sfd-hdstx` to `application/vnd.hydrostatix.sof-data` - * Add extension `.n-gage` to `application/vnd.nokia.n-gage.symbian.install` - -1.10.0 / 2015-05-19 -=================== - - * Add `application/vnd.balsamiq.bmpr` - * Add `application/vnd.microsoft.portable-executable` - * Add `application/x-ns-proxy-autoconfig` - -1.9.1 / 2015-04-19 -================== - - * Remove `.json` extension from `application/manifest+json` - - This is causing bugs downstream - -1.9.0 / 2015-04-19 -================== - - * Add `application/manifest+json` - * Add `application/vnd.micro+json` - * Add `image/vnd.zbrush.pcx` - * Add `image/x-ms-bmp` - -1.8.0 / 2015-03-13 -================== - - * Add `application/vnd.citationstyles.style+xml` - * Add `application/vnd.fastcopy-disk-image` - * Add `application/vnd.gov.sk.xmldatacontainer+xml` - * Add extension `.jsonld` to `application/ld+json` - -1.7.0 / 2015-02-08 -================== - - * Add `application/vnd.gerber` - * Add `application/vnd.msa-disk-image` - -1.6.1 / 2015-02-05 -================== - - * Community extensions ownership transferred from `node-mime` - -1.6.0 / 2015-01-29 -================== - - * Add `application/jose` - * Add `application/jose+json` - * Add `application/json-seq` - * Add `application/jwk+json` - * Add `application/jwk-set+json` - * Add `application/jwt` - * Add `application/rdap+json` - * Add `application/vnd.gov.sk.e-form+xml` - * Add `application/vnd.ims.imsccv1p3` - -1.5.0 / 2014-12-30 -================== - - * Add `application/vnd.oracle.resource+json` - * Fix various invalid MIME type entries - - `application/mbox+xml` - - `application/oscp-response` - - `application/vwg-multiplexed` - - `audio/g721` - -1.4.0 / 2014-12-21 -================== - - * Add `application/vnd.ims.imsccv1p2` - * Fix various invalid MIME type entries - - `application/vnd-acucobol` - - `application/vnd-curl` - - `application/vnd-dart` - - `application/vnd-dxr` - - `application/vnd-fdf` - - `application/vnd-mif` - - `application/vnd-sema` - - `application/vnd-wap-wmlc` - - `application/vnd.adobe.flash-movie` - - `application/vnd.dece-zip` - - `application/vnd.dvb_service` - - `application/vnd.micrografx-igx` - - `application/vnd.sealed-doc` - - `application/vnd.sealed-eml` - - `application/vnd.sealed-mht` - - `application/vnd.sealed-ppt` - - `application/vnd.sealed-tiff` - - `application/vnd.sealed-xls` - - `application/vnd.sealedmedia.softseal-html` - - `application/vnd.sealedmedia.softseal-pdf` - - `application/vnd.wap-slc` - - `application/vnd.wap-wbxml` - - `audio/vnd.sealedmedia.softseal-mpeg` - - `image/vnd-djvu` - - `image/vnd-svf` - - `image/vnd-wap-wbmp` - - `image/vnd.sealed-png` - - `image/vnd.sealedmedia.softseal-gif` - - `image/vnd.sealedmedia.softseal-jpg` - - `model/vnd-dwf` - - `model/vnd.parasolid.transmit-binary` - - `model/vnd.parasolid.transmit-text` - - `text/vnd-a` - - `text/vnd-curl` - - `text/vnd.wap-wml` - * Remove example template MIME types - - `application/example` - - `audio/example` - - `image/example` - - `message/example` - - `model/example` - - `multipart/example` - - `text/example` - - `video/example` - -1.3.1 / 2014-12-16 -================== - - * Fix missing extensions - - `application/json5` - - `text/hjson` - -1.3.0 / 2014-12-07 -================== - - * Add `application/a2l` - * Add `application/aml` - * Add `application/atfx` - * Add `application/atxml` - * Add `application/cdfx+xml` - * Add `application/dii` - * Add `application/json5` - * Add `application/lxf` - * Add `application/mf4` - * Add `application/vnd.apache.thrift.compact` - * Add `application/vnd.apache.thrift.json` - * Add `application/vnd.coffeescript` - * Add `application/vnd.enphase.envoy` - * Add `application/vnd.ims.imsccv1p1` - * Add `text/csv-schema` - * Add `text/hjson` - * Add `text/markdown` - * Add `text/yaml` - -1.2.0 / 2014-11-09 -================== - - * Add `application/cea` - * Add `application/dit` - * Add `application/vnd.gov.sk.e-form+zip` - * Add `application/vnd.tmd.mediaflex.api+xml` - * Type `application/epub+zip` is now IANA-registered - -1.1.2 / 2014-10-23 -================== - - * Rebuild database for `application/x-www-form-urlencoded` change - -1.1.1 / 2014-10-20 -================== - - * Mark `application/x-www-form-urlencoded` as compressible. - -1.1.0 / 2014-09-28 -================== - - * Add `application/font-woff2` - -1.0.3 / 2014-09-25 -================== - - * Fix engine requirement in package - -1.0.2 / 2014-09-25 -================== - - * Add `application/coap-group+json` - * Add `application/dcd` - * Add `application/vnd.apache.thrift.binary` - * Add `image/vnd.tencent.tap` - * Mark all JSON-derived types as compressible - * Update `text/vtt` data - -1.0.1 / 2014-08-30 -================== - - * Fix extension ordering - -1.0.0 / 2014-08-30 -================== - - * Add `application/atf` - * Add `application/merge-patch+json` - * Add `multipart/x-mixed-replace` - * Add `source: 'apache'` metadata - * Add `source: 'iana'` metadata - * Remove badly-assumed charset data diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/README.md deleted file mode 100644 index 164cca0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# mime-db - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Downloads][npm-downloads-image]][npm-url] -[![Node.js Version][node-image]][node-url] -[![Build Status][travis-image]][travis-url] -[![Coverage Status][coveralls-image]][coveralls-url] - -This is a database of all mime types. -It consists of a single, public JSON file and does not include any logic, -allowing it to remain as un-opinionated as possible with an API. -It aggregates data from the following sources: - -- http://www.iana.org/assignments/media-types/media-types.xhtml -- http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -- http://hg.nginx.org/nginx/raw-file/default/conf/mime.types - -## Installation - -```bash -npm install mime-db -``` - -### Database Download - -If you're crazy enough to use this in the browser, you can just grab the -JSON file using [RawGit](https://rawgit.com/). It is recommended to replace -`master` with [a release tag](https://github.com/jshttp/mime-db/tags) as the -JSON format may change in the future. - -``` -https://cdn.rawgit.com/jshttp/mime-db/master/db.json -``` - -## Usage - -```js -var db = require('mime-db'); - -// grab data on .js files -var data = db['application/javascript']; -``` - -## Data Structure - -The JSON file is a map lookup for lowercased mime types. -Each mime type has the following properties: - -- `.source` - where the mime type is defined. - If not set, it's probably a custom media type. - - `apache` - [Apache common media types](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types) - - `iana` - [IANA-defined media types](http://www.iana.org/assignments/media-types/media-types.xhtml) - - `nginx` - [nginx media types](http://hg.nginx.org/nginx/raw-file/default/conf/mime.types) -- `.extensions[]` - known extensions associated with this mime type. -- `.compressible` - whether a file of this type is can be gzipped. -- `.charset` - the default charset associated with this type, if any. - -If unknown, every property could be `undefined`. - -## Contributing - -To edit the database, only make PRs against `src/custom.json` or -`src/custom-suffix.json`. - -To update the build, run `npm run build`. - -## Adding Custom Media Types - -The best way to get new media types included in this library is to register -them with the IANA. The community registration procedure is outlined in -[RFC 6838 section 5](http://tools.ietf.org/html/rfc6838#section-5). Types -registered with the IANA are automatically pulled into this library. - -[npm-version-image]: https://img.shields.io/npm/v/mime-db.svg -[npm-downloads-image]: https://img.shields.io/npm/dm/mime-db.svg -[npm-url]: https://npmjs.org/package/mime-db -[travis-image]: https://img.shields.io/travis/jshttp/mime-db/master.svg -[travis-url]: https://travis-ci.org/jshttp/mime-db -[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-db/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/mime-db?branch=master -[node-image]: https://img.shields.io/node/v/mime-db.svg -[node-url]: http://nodejs.org/download/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/db.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/db.json deleted file mode 100644 index 96aae45..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/db.json +++ /dev/null @@ -1,6460 +0,0 @@ -{ - "application/1d-interleaved-parityfec": { - "source": "iana" - }, - "application/3gpdash-qoe-report+xml": { - "source": "iana" - }, - "application/3gpp-ims+xml": { - "source": "iana" - }, - "application/a2l": { - "source": "iana" - }, - "application/activemessage": { - "source": "iana" - }, - "application/alto-costmap+json": { - "source": "iana", - "compressible": true - }, - "application/alto-costmapfilter+json": { - "source": "iana", - "compressible": true - }, - "application/alto-directory+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointcost+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointcostparams+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointprop+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointpropparams+json": { - "source": "iana", - "compressible": true - }, - "application/alto-error+json": { - "source": "iana", - "compressible": true - }, - "application/alto-networkmap+json": { - "source": "iana", - "compressible": true - }, - "application/alto-networkmapfilter+json": { - "source": "iana", - "compressible": true - }, - "application/aml": { - "source": "iana" - }, - "application/andrew-inset": { - "source": "iana", - "extensions": ["ez"] - }, - "application/applefile": { - "source": "iana" - }, - "application/applixware": { - "source": "apache", - "extensions": ["aw"] - }, - "application/atf": { - "source": "iana" - }, - "application/atfx": { - "source": "iana" - }, - "application/atom+xml": { - "source": "iana", - "compressible": true, - "extensions": ["atom"] - }, - "application/atomcat+xml": { - "source": "iana", - "extensions": ["atomcat"] - }, - "application/atomdeleted+xml": { - "source": "iana" - }, - "application/atomicmail": { - "source": "iana" - }, - "application/atomsvc+xml": { - "source": "iana", - "extensions": ["atomsvc"] - }, - "application/atxml": { - "source": "iana" - }, - "application/auth-policy+xml": { - "source": "iana" - }, - "application/bacnet-xdd+zip": { - "source": "iana" - }, - "application/batch-smtp": { - "source": "iana" - }, - "application/bdoc": { - "compressible": false, - "extensions": ["bdoc"] - }, - "application/beep+xml": { - "source": "iana" - }, - "application/calendar+json": { - "source": "iana", - "compressible": true - }, - "application/calendar+xml": { - "source": "iana" - }, - "application/call-completion": { - "source": "iana" - }, - "application/cals-1840": { - "source": "iana" - }, - "application/cbor": { - "source": "iana" - }, - "application/ccmp+xml": { - "source": "iana" - }, - "application/ccxml+xml": { - "source": "iana", - "extensions": ["ccxml"] - }, - "application/cdfx+xml": { - "source": "iana" - }, - "application/cdmi-capability": { - "source": "iana", - "extensions": ["cdmia"] - }, - "application/cdmi-container": { - "source": "iana", - "extensions": ["cdmic"] - }, - "application/cdmi-domain": { - "source": "iana", - "extensions": ["cdmid"] - }, - "application/cdmi-object": { - "source": "iana", - "extensions": ["cdmio"] - }, - "application/cdmi-queue": { - "source": "iana", - "extensions": ["cdmiq"] - }, - "application/cea": { - "source": "iana" - }, - "application/cea-2018+xml": { - "source": "iana" - }, - "application/cellml+xml": { - "source": "iana" - }, - "application/cfw": { - "source": "iana" - }, - "application/cms": { - "source": "iana" - }, - "application/cnrp+xml": { - "source": "iana" - }, - "application/coap-group+json": { - "source": "iana", - "compressible": true - }, - "application/commonground": { - "source": "iana" - }, - "application/conference-info+xml": { - "source": "iana" - }, - "application/cpl+xml": { - "source": "iana" - }, - "application/csrattrs": { - "source": "iana" - }, - "application/csta+xml": { - "source": "iana" - }, - "application/cstadata+xml": { - "source": "iana" - }, - "application/cu-seeme": { - "source": "apache", - "extensions": ["cu"] - }, - "application/cybercash": { - "source": "iana" - }, - "application/dart": { - "compressible": true - }, - "application/dash+xml": { - "source": "iana", - "extensions": ["mdp"] - }, - "application/dashdelta": { - "source": "iana" - }, - "application/davmount+xml": { - "source": "iana", - "extensions": ["davmount"] - }, - "application/dca-rft": { - "source": "iana" - }, - "application/dcd": { - "source": "iana" - }, - "application/dec-dx": { - "source": "iana" - }, - "application/dialog-info+xml": { - "source": "iana" - }, - "application/dicom": { - "source": "iana" - }, - "application/dii": { - "source": "iana" - }, - "application/dit": { - "source": "iana" - }, - "application/dns": { - "source": "iana" - }, - "application/docbook+xml": { - "source": "apache", - "extensions": ["dbk"] - }, - "application/dskpp+xml": { - "source": "iana" - }, - "application/dssc+der": { - "source": "iana", - "extensions": ["dssc"] - }, - "application/dssc+xml": { - "source": "iana", - "extensions": ["xdssc"] - }, - "application/dvcs": { - "source": "iana" - }, - "application/ecmascript": { - "source": "iana", - "compressible": true, - "extensions": ["ecma"] - }, - "application/edi-consent": { - "source": "iana" - }, - "application/edi-x12": { - "source": "iana", - "compressible": false - }, - "application/edifact": { - "source": "iana", - "compressible": false - }, - "application/emma+xml": { - "source": "iana", - "extensions": ["emma"] - }, - "application/emotionml+xml": { - "source": "iana" - }, - "application/encaprtp": { - "source": "iana" - }, - "application/epp+xml": { - "source": "iana" - }, - "application/epub+zip": { - "source": "iana", - "extensions": ["epub"] - }, - "application/eshop": { - "source": "iana" - }, - "application/exi": { - "source": "iana", - "extensions": ["exi"] - }, - "application/fastinfoset": { - "source": "iana" - }, - "application/fastsoap": { - "source": "iana" - }, - "application/fdt+xml": { - "source": "iana" - }, - "application/fits": { - "source": "iana" - }, - "application/font-sfnt": { - "source": "iana" - }, - "application/font-tdpfr": { - "source": "iana", - "extensions": ["pfr"] - }, - "application/font-woff": { - "source": "iana", - "compressible": false, - "extensions": ["woff"] - }, - "application/font-woff2": { - "compressible": false, - "extensions": ["woff2"] - }, - "application/framework-attributes+xml": { - "source": "iana" - }, - "application/gml+xml": { - "source": "apache", - "extensions": ["gml"] - }, - "application/gpx+xml": { - "source": "apache", - "extensions": ["gpx"] - }, - "application/gxf": { - "source": "apache", - "extensions": ["gxf"] - }, - "application/gzip": { - "source": "iana", - "compressible": false - }, - "application/h224": { - "source": "iana" - }, - "application/held+xml": { - "source": "iana" - }, - "application/http": { - "source": "iana" - }, - "application/hyperstudio": { - "source": "iana", - "extensions": ["stk"] - }, - "application/ibe-key-request+xml": { - "source": "iana" - }, - "application/ibe-pkg-reply+xml": { - "source": "iana" - }, - "application/ibe-pp-data": { - "source": "iana" - }, - "application/iges": { - "source": "iana" - }, - "application/im-iscomposing+xml": { - "source": "iana" - }, - "application/index": { - "source": "iana" - }, - "application/index.cmd": { - "source": "iana" - }, - "application/index.obj": { - "source": "iana" - }, - "application/index.response": { - "source": "iana" - }, - "application/index.vnd": { - "source": "iana" - }, - "application/inkml+xml": { - "source": "iana", - "extensions": ["ink","inkml"] - }, - "application/iotp": { - "source": "iana" - }, - "application/ipfix": { - "source": "iana", - "extensions": ["ipfix"] - }, - "application/ipp": { - "source": "iana" - }, - "application/isup": { - "source": "iana" - }, - "application/its+xml": { - "source": "iana" - }, - "application/java-archive": { - "source": "apache", - "compressible": false, - "extensions": ["jar","war","ear"] - }, - "application/java-serialized-object": { - "source": "apache", - "compressible": false, - "extensions": ["ser"] - }, - "application/java-vm": { - "source": "apache", - "compressible": false, - "extensions": ["class"] - }, - "application/javascript": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["js"] - }, - "application/jose": { - "source": "iana" - }, - "application/jose+json": { - "source": "iana", - "compressible": true - }, - "application/jrd+json": { - "source": "iana", - "compressible": true - }, - "application/json": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["json","map"] - }, - "application/json-patch+json": { - "source": "iana", - "compressible": true - }, - "application/json-seq": { - "source": "iana" - }, - "application/json5": { - "extensions": ["json5"] - }, - "application/jsonml+json": { - "source": "apache", - "compressible": true, - "extensions": ["jsonml"] - }, - "application/jwk+json": { - "source": "iana", - "compressible": true - }, - "application/jwk-set+json": { - "source": "iana", - "compressible": true - }, - "application/jwt": { - "source": "iana" - }, - "application/kpml-request+xml": { - "source": "iana" - }, - "application/kpml-response+xml": { - "source": "iana" - }, - "application/ld+json": { - "source": "iana", - "compressible": true, - "extensions": ["jsonld"] - }, - "application/link-format": { - "source": "iana" - }, - "application/load-control+xml": { - "source": "iana" - }, - "application/lost+xml": { - "source": "iana", - "extensions": ["lostxml"] - }, - "application/lostsync+xml": { - "source": "iana" - }, - "application/lxf": { - "source": "iana" - }, - "application/mac-binhex40": { - "source": "iana", - "extensions": ["hqx"] - }, - "application/mac-compactpro": { - "source": "apache", - "extensions": ["cpt"] - }, - "application/macwriteii": { - "source": "iana" - }, - "application/mads+xml": { - "source": "iana", - "extensions": ["mads"] - }, - "application/manifest+json": { - "charset": "UTF-8", - "compressible": true, - "extensions": ["webmanifest"] - }, - "application/marc": { - "source": "iana", - "extensions": ["mrc"] - }, - "application/marcxml+xml": { - "source": "iana", - "extensions": ["mrcx"] - }, - "application/mathematica": { - "source": "iana", - "extensions": ["ma","nb","mb"] - }, - "application/mathml+xml": { - "source": "iana", - "extensions": ["mathml"] - }, - "application/mathml-content+xml": { - "source": "iana" - }, - "application/mathml-presentation+xml": { - "source": "iana" - }, - "application/mbms-associated-procedure-description+xml": { - "source": "iana" - }, - "application/mbms-deregister+xml": { - "source": "iana" - }, - "application/mbms-envelope+xml": { - "source": "iana" - }, - "application/mbms-msk+xml": { - "source": "iana" - }, - "application/mbms-msk-response+xml": { - "source": "iana" - }, - "application/mbms-protection-description+xml": { - "source": "iana" - }, - "application/mbms-reception-report+xml": { - "source": "iana" - }, - "application/mbms-register+xml": { - "source": "iana" - }, - "application/mbms-register-response+xml": { - "source": "iana" - }, - "application/mbms-schedule+xml": { - "source": "iana" - }, - "application/mbms-user-service-description+xml": { - "source": "iana" - }, - "application/mbox": { - "source": "iana", - "extensions": ["mbox"] - }, - "application/media-policy-dataset+xml": { - "source": "iana" - }, - "application/media_control+xml": { - "source": "iana" - }, - "application/mediaservercontrol+xml": { - "source": "iana", - "extensions": ["mscml"] - }, - "application/merge-patch+json": { - "source": "iana", - "compressible": true - }, - "application/metalink+xml": { - "source": "apache", - "extensions": ["metalink"] - }, - "application/metalink4+xml": { - "source": "iana", - "extensions": ["meta4"] - }, - "application/mets+xml": { - "source": "iana", - "extensions": ["mets"] - }, - "application/mf4": { - "source": "iana" - }, - "application/mikey": { - "source": "iana" - }, - "application/mods+xml": { - "source": "iana", - "extensions": ["mods"] - }, - "application/moss-keys": { - "source": "iana" - }, - "application/moss-signature": { - "source": "iana" - }, - "application/mosskey-data": { - "source": "iana" - }, - "application/mosskey-request": { - "source": "iana" - }, - "application/mp21": { - "source": "iana", - "extensions": ["m21","mp21"] - }, - "application/mp4": { - "source": "iana", - "extensions": ["mp4s","m4p"] - }, - "application/mpeg4-generic": { - "source": "iana" - }, - "application/mpeg4-iod": { - "source": "iana" - }, - "application/mpeg4-iod-xmt": { - "source": "iana" - }, - "application/mrb-consumer+xml": { - "source": "iana" - }, - "application/mrb-publish+xml": { - "source": "iana" - }, - "application/msc-ivr+xml": { - "source": "iana" - }, - "application/msc-mixer+xml": { - "source": "iana" - }, - "application/msword": { - "source": "iana", - "compressible": false, - "extensions": ["doc","dot"] - }, - "application/mxf": { - "source": "iana", - "extensions": ["mxf"] - }, - "application/nasdata": { - "source": "iana" - }, - "application/news-checkgroups": { - "source": "iana" - }, - "application/news-groupinfo": { - "source": "iana" - }, - "application/news-transmission": { - "source": "iana" - }, - "application/nlsml+xml": { - "source": "iana" - }, - "application/nss": { - "source": "iana" - }, - "application/ocsp-request": { - "source": "iana" - }, - "application/ocsp-response": { - "source": "iana" - }, - "application/octet-stream": { - "source": "iana", - "compressible": false, - "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"] - }, - "application/oda": { - "source": "iana", - "extensions": ["oda"] - }, - "application/odx": { - "source": "iana" - }, - "application/oebps-package+xml": { - "source": "iana", - "extensions": ["opf"] - }, - "application/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["ogx"] - }, - "application/omdoc+xml": { - "source": "apache", - "extensions": ["omdoc"] - }, - "application/onenote": { - "source": "apache", - "extensions": ["onetoc","onetoc2","onetmp","onepkg"] - }, - "application/oxps": { - "source": "iana", - "extensions": ["oxps"] - }, - "application/p2p-overlay+xml": { - "source": "iana" - }, - "application/parityfec": { - "source": "iana" - }, - "application/patch-ops-error+xml": { - "source": "iana", - "extensions": ["xer"] - }, - "application/pdf": { - "source": "iana", - "compressible": false, - "extensions": ["pdf"] - }, - "application/pdx": { - "source": "iana" - }, - "application/pgp-encrypted": { - "source": "iana", - "compressible": false, - "extensions": ["pgp"] - }, - "application/pgp-keys": { - "source": "iana" - }, - "application/pgp-signature": { - "source": "iana", - "extensions": ["asc","sig"] - }, - "application/pics-rules": { - "source": "apache", - "extensions": ["prf"] - }, - "application/pidf+xml": { - "source": "iana" - }, - "application/pidf-diff+xml": { - "source": "iana" - }, - "application/pkcs10": { - "source": "iana", - "extensions": ["p10"] - }, - "application/pkcs12": { - "source": "iana" - }, - "application/pkcs7-mime": { - "source": "iana", - "extensions": ["p7m","p7c"] - }, - "application/pkcs7-signature": { - "source": "iana", - "extensions": ["p7s"] - }, - "application/pkcs8": { - "source": "iana", - "extensions": ["p8"] - }, - "application/pkix-attr-cert": { - "source": "iana", - "extensions": ["ac"] - }, - "application/pkix-cert": { - "source": "iana", - "extensions": ["cer"] - }, - "application/pkix-crl": { - "source": "iana", - "extensions": ["crl"] - }, - "application/pkix-pkipath": { - "source": "iana", - "extensions": ["pkipath"] - }, - "application/pkixcmp": { - "source": "iana", - "extensions": ["pki"] - }, - "application/pls+xml": { - "source": "iana", - "extensions": ["pls"] - }, - "application/poc-settings+xml": { - "source": "iana" - }, - "application/postscript": { - "source": "iana", - "compressible": true, - "extensions": ["ai","eps","ps"] - }, - "application/provenance+xml": { - "source": "iana" - }, - "application/prs.alvestrand.titrax-sheet": { - "source": "iana" - }, - "application/prs.cww": { - "source": "iana", - "extensions": ["cww"] - }, - "application/prs.hpub+zip": { - "source": "iana" - }, - "application/prs.nprend": { - "source": "iana" - }, - "application/prs.plucker": { - "source": "iana" - }, - "application/prs.rdf-xml-crypt": { - "source": "iana" - }, - "application/prs.xsf+xml": { - "source": "iana" - }, - "application/pskc+xml": { - "source": "iana", - "extensions": ["pskcxml"] - }, - "application/qsig": { - "source": "iana" - }, - "application/raptorfec": { - "source": "iana" - }, - "application/rdap+json": { - "source": "iana", - "compressible": true - }, - "application/rdf+xml": { - "source": "iana", - "compressible": true, - "extensions": ["rdf"] - }, - "application/reginfo+xml": { - "source": "iana", - "extensions": ["rif"] - }, - "application/relax-ng-compact-syntax": { - "source": "iana", - "extensions": ["rnc"] - }, - "application/remote-printing": { - "source": "iana" - }, - "application/reputon+json": { - "source": "iana", - "compressible": true - }, - "application/resource-lists+xml": { - "source": "iana", - "extensions": ["rl"] - }, - "application/resource-lists-diff+xml": { - "source": "iana", - "extensions": ["rld"] - }, - "application/riscos": { - "source": "iana" - }, - "application/rlmi+xml": { - "source": "iana" - }, - "application/rls-services+xml": { - "source": "iana", - "extensions": ["rs"] - }, - "application/rpki-ghostbusters": { - "source": "iana", - "extensions": ["gbr"] - }, - "application/rpki-manifest": { - "source": "iana", - "extensions": ["mft"] - }, - "application/rpki-roa": { - "source": "iana", - "extensions": ["roa"] - }, - "application/rpki-updown": { - "source": "iana" - }, - "application/rsd+xml": { - "source": "apache", - "extensions": ["rsd"] - }, - "application/rss+xml": { - "source": "apache", - "compressible": true, - "extensions": ["rss"] - }, - "application/rtf": { - "source": "iana", - "compressible": true, - "extensions": ["rtf"] - }, - "application/rtploopback": { - "source": "iana" - }, - "application/rtx": { - "source": "iana" - }, - "application/samlassertion+xml": { - "source": "iana" - }, - "application/samlmetadata+xml": { - "source": "iana" - }, - "application/sbml+xml": { - "source": "iana", - "extensions": ["sbml"] - }, - "application/scaip+xml": { - "source": "iana" - }, - "application/scim+json": { - "source": "iana", - "compressible": true - }, - "application/scvp-cv-request": { - "source": "iana", - "extensions": ["scq"] - }, - "application/scvp-cv-response": { - "source": "iana", - "extensions": ["scs"] - }, - "application/scvp-vp-request": { - "source": "iana", - "extensions": ["spq"] - }, - "application/scvp-vp-response": { - "source": "iana", - "extensions": ["spp"] - }, - "application/sdp": { - "source": "iana", - "extensions": ["sdp"] - }, - "application/sep+xml": { - "source": "iana" - }, - "application/sep-exi": { - "source": "iana" - }, - "application/session-info": { - "source": "iana" - }, - "application/set-payment": { - "source": "iana" - }, - "application/set-payment-initiation": { - "source": "iana", - "extensions": ["setpay"] - }, - "application/set-registration": { - "source": "iana" - }, - "application/set-registration-initiation": { - "source": "iana", - "extensions": ["setreg"] - }, - "application/sgml": { - "source": "iana" - }, - "application/sgml-open-catalog": { - "source": "iana" - }, - "application/shf+xml": { - "source": "iana", - "extensions": ["shf"] - }, - "application/sieve": { - "source": "iana" - }, - "application/simple-filter+xml": { - "source": "iana" - }, - "application/simple-message-summary": { - "source": "iana" - }, - "application/simplesymbolcontainer": { - "source": "iana" - }, - "application/slate": { - "source": "iana" - }, - "application/smil": { - "source": "iana" - }, - "application/smil+xml": { - "source": "iana", - "extensions": ["smi","smil"] - }, - "application/smpte336m": { - "source": "iana" - }, - "application/soap+fastinfoset": { - "source": "iana" - }, - "application/soap+xml": { - "source": "iana", - "compressible": true - }, - "application/sparql-query": { - "source": "iana", - "extensions": ["rq"] - }, - "application/sparql-results+xml": { - "source": "iana", - "extensions": ["srx"] - }, - "application/spirits-event+xml": { - "source": "iana" - }, - "application/sql": { - "source": "iana" - }, - "application/srgs": { - "source": "iana", - "extensions": ["gram"] - }, - "application/srgs+xml": { - "source": "iana", - "extensions": ["grxml"] - }, - "application/sru+xml": { - "source": "iana", - "extensions": ["sru"] - }, - "application/ssdl+xml": { - "source": "apache", - "extensions": ["ssdl"] - }, - "application/ssml+xml": { - "source": "iana", - "extensions": ["ssml"] - }, - "application/tamp-apex-update": { - "source": "iana" - }, - "application/tamp-apex-update-confirm": { - "source": "iana" - }, - "application/tamp-community-update": { - "source": "iana" - }, - "application/tamp-community-update-confirm": { - "source": "iana" - }, - "application/tamp-error": { - "source": "iana" - }, - "application/tamp-sequence-adjust": { - "source": "iana" - }, - "application/tamp-sequence-adjust-confirm": { - "source": "iana" - }, - "application/tamp-status-query": { - "source": "iana" - }, - "application/tamp-status-response": { - "source": "iana" - }, - "application/tamp-update": { - "source": "iana" - }, - "application/tamp-update-confirm": { - "source": "iana" - }, - "application/tar": { - "compressible": true - }, - "application/tei+xml": { - "source": "iana", - "extensions": ["tei","teicorpus"] - }, - "application/thraud+xml": { - "source": "iana", - "extensions": ["tfi"] - }, - "application/timestamp-query": { - "source": "iana" - }, - "application/timestamp-reply": { - "source": "iana" - }, - "application/timestamped-data": { - "source": "iana", - "extensions": ["tsd"] - }, - "application/ttml+xml": { - "source": "iana" - }, - "application/tve-trigger": { - "source": "iana" - }, - "application/ulpfec": { - "source": "iana" - }, - "application/urc-grpsheet+xml": { - "source": "iana" - }, - "application/urc-ressheet+xml": { - "source": "iana" - }, - "application/urc-targetdesc+xml": { - "source": "iana" - }, - "application/urc-uisocketdesc+xml": { - "source": "iana" - }, - "application/vcard+json": { - "source": "iana", - "compressible": true - }, - "application/vcard+xml": { - "source": "iana" - }, - "application/vemmi": { - "source": "iana" - }, - "application/vividence.scriptfile": { - "source": "apache" - }, - "application/vnd.3gpp-prose+xml": { - "source": "iana" - }, - "application/vnd.3gpp.bsf+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mid-call+xml": { - "source": "iana" - }, - "application/vnd.3gpp.pic-bw-large": { - "source": "iana", - "extensions": ["plb"] - }, - "application/vnd.3gpp.pic-bw-small": { - "source": "iana", - "extensions": ["psb"] - }, - "application/vnd.3gpp.pic-bw-var": { - "source": "iana", - "extensions": ["pvb"] - }, - "application/vnd.3gpp.sms": { - "source": "iana" - }, - "application/vnd.3gpp.state-and-event-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.ussd+xml": { - "source": "iana" - }, - "application/vnd.3gpp2.bcmcsinfo+xml": { - "source": "iana" - }, - "application/vnd.3gpp2.sms": { - "source": "iana" - }, - "application/vnd.3gpp2.tcap": { - "source": "iana", - "extensions": ["tcap"] - }, - "application/vnd.3m.post-it-notes": { - "source": "iana", - "extensions": ["pwn"] - }, - "application/vnd.accpac.simply.aso": { - "source": "iana", - "extensions": ["aso"] - }, - "application/vnd.accpac.simply.imp": { - "source": "iana", - "extensions": ["imp"] - }, - "application/vnd.acucobol": { - "source": "iana", - "extensions": ["acu"] - }, - "application/vnd.acucorp": { - "source": "iana", - "extensions": ["atc","acutc"] - }, - "application/vnd.adobe.air-application-installer-package+zip": { - "source": "apache", - "extensions": ["air"] - }, - "application/vnd.adobe.flash.movie": { - "source": "iana" - }, - "application/vnd.adobe.formscentral.fcdt": { - "source": "iana", - "extensions": ["fcdt"] - }, - "application/vnd.adobe.fxp": { - "source": "iana", - "extensions": ["fxp","fxpl"] - }, - "application/vnd.adobe.partial-upload": { - "source": "iana" - }, - "application/vnd.adobe.xdp+xml": { - "source": "iana", - "extensions": ["xdp"] - }, - "application/vnd.adobe.xfdf": { - "source": "iana", - "extensions": ["xfdf"] - }, - "application/vnd.aether.imp": { - "source": "iana" - }, - "application/vnd.ah-barcode": { - "source": "iana" - }, - "application/vnd.ahead.space": { - "source": "iana", - "extensions": ["ahead"] - }, - "application/vnd.airzip.filesecure.azf": { - "source": "iana", - "extensions": ["azf"] - }, - "application/vnd.airzip.filesecure.azs": { - "source": "iana", - "extensions": ["azs"] - }, - "application/vnd.amazon.ebook": { - "source": "apache", - "extensions": ["azw"] - }, - "application/vnd.americandynamics.acc": { - "source": "iana", - "extensions": ["acc"] - }, - "application/vnd.amiga.ami": { - "source": "iana", - "extensions": ["ami"] - }, - "application/vnd.amundsen.maze+xml": { - "source": "iana" - }, - "application/vnd.android.package-archive": { - "source": "apache", - "compressible": false, - "extensions": ["apk"] - }, - "application/vnd.anki": { - "source": "iana" - }, - "application/vnd.anser-web-certificate-issue-initiation": { - "source": "iana", - "extensions": ["cii"] - }, - "application/vnd.anser-web-funds-transfer-initiation": { - "source": "apache", - "extensions": ["fti"] - }, - "application/vnd.antix.game-component": { - "source": "iana", - "extensions": ["atx"] - }, - "application/vnd.apache.thrift.binary": { - "source": "iana" - }, - "application/vnd.apache.thrift.compact": { - "source": "iana" - }, - "application/vnd.apache.thrift.json": { - "source": "iana" - }, - "application/vnd.api+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.apple.installer+xml": { - "source": "iana", - "extensions": ["mpkg"] - }, - "application/vnd.apple.mpegurl": { - "source": "iana", - "extensions": ["m3u8"] - }, - "application/vnd.arastra.swi": { - "source": "iana" - }, - "application/vnd.aristanetworks.swi": { - "source": "iana", - "extensions": ["swi"] - }, - "application/vnd.artsquare": { - "source": "iana" - }, - "application/vnd.astraea-software.iota": { - "source": "iana", - "extensions": ["iota"] - }, - "application/vnd.audiograph": { - "source": "iana", - "extensions": ["aep"] - }, - "application/vnd.autopackage": { - "source": "iana" - }, - "application/vnd.avistar+xml": { - "source": "iana" - }, - "application/vnd.balsamiq.bmml+xml": { - "source": "iana" - }, - "application/vnd.balsamiq.bmpr": { - "source": "iana" - }, - "application/vnd.bekitzur-stech+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.biopax.rdf+xml": { - "source": "iana" - }, - "application/vnd.blueice.multipass": { - "source": "iana", - "extensions": ["mpm"] - }, - "application/vnd.bluetooth.ep.oob": { - "source": "iana" - }, - "application/vnd.bluetooth.le.oob": { - "source": "iana" - }, - "application/vnd.bmi": { - "source": "iana", - "extensions": ["bmi"] - }, - "application/vnd.businessobjects": { - "source": "iana", - "extensions": ["rep"] - }, - "application/vnd.cab-jscript": { - "source": "iana" - }, - "application/vnd.canon-cpdl": { - "source": "iana" - }, - "application/vnd.canon-lips": { - "source": "iana" - }, - "application/vnd.cendio.thinlinc.clientconf": { - "source": "iana" - }, - "application/vnd.century-systems.tcp_stream": { - "source": "iana" - }, - "application/vnd.chemdraw+xml": { - "source": "iana", - "extensions": ["cdxml"] - }, - "application/vnd.chipnuts.karaoke-mmd": { - "source": "iana", - "extensions": ["mmd"] - }, - "application/vnd.cinderella": { - "source": "iana", - "extensions": ["cdy"] - }, - "application/vnd.cirpack.isdn-ext": { - "source": "iana" - }, - "application/vnd.citationstyles.style+xml": { - "source": "iana" - }, - "application/vnd.claymore": { - "source": "iana", - "extensions": ["cla"] - }, - "application/vnd.cloanto.rp9": { - "source": "iana", - "extensions": ["rp9"] - }, - "application/vnd.clonk.c4group": { - "source": "iana", - "extensions": ["c4g","c4d","c4f","c4p","c4u"] - }, - "application/vnd.cluetrust.cartomobile-config": { - "source": "iana", - "extensions": ["c11amc"] - }, - "application/vnd.cluetrust.cartomobile-config-pkg": { - "source": "iana", - "extensions": ["c11amz"] - }, - "application/vnd.coffeescript": { - "source": "iana" - }, - "application/vnd.collection+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.collection.doc+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.collection.next+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.commerce-battelle": { - "source": "iana" - }, - "application/vnd.commonspace": { - "source": "iana", - "extensions": ["csp"] - }, - "application/vnd.contact.cmsg": { - "source": "iana", - "extensions": ["cdbcmsg"] - }, - "application/vnd.cosmocaller": { - "source": "iana", - "extensions": ["cmc"] - }, - "application/vnd.crick.clicker": { - "source": "iana", - "extensions": ["clkx"] - }, - "application/vnd.crick.clicker.keyboard": { - "source": "iana", - "extensions": ["clkk"] - }, - "application/vnd.crick.clicker.palette": { - "source": "iana", - "extensions": ["clkp"] - }, - "application/vnd.crick.clicker.template": { - "source": "iana", - "extensions": ["clkt"] - }, - "application/vnd.crick.clicker.wordbank": { - "source": "iana", - "extensions": ["clkw"] - }, - "application/vnd.criticaltools.wbs+xml": { - "source": "iana", - "extensions": ["wbs"] - }, - "application/vnd.ctc-posml": { - "source": "iana", - "extensions": ["pml"] - }, - "application/vnd.ctct.ws+xml": { - "source": "iana" - }, - "application/vnd.cups-pdf": { - "source": "iana" - }, - "application/vnd.cups-postscript": { - "source": "iana" - }, - "application/vnd.cups-ppd": { - "source": "iana", - "extensions": ["ppd"] - }, - "application/vnd.cups-raster": { - "source": "iana" - }, - "application/vnd.cups-raw": { - "source": "iana" - }, - "application/vnd.curl": { - "source": "iana" - }, - "application/vnd.curl.car": { - "source": "apache", - "extensions": ["car"] - }, - "application/vnd.curl.pcurl": { - "source": "apache", - "extensions": ["pcurl"] - }, - "application/vnd.cyan.dean.root+xml": { - "source": "iana" - }, - "application/vnd.cybank": { - "source": "iana" - }, - "application/vnd.dart": { - "source": "iana", - "compressible": true, - "extensions": ["dart"] - }, - "application/vnd.data-vision.rdz": { - "source": "iana", - "extensions": ["rdz"] - }, - "application/vnd.debian.binary-package": { - "source": "iana" - }, - "application/vnd.dece.data": { - "source": "iana", - "extensions": ["uvf","uvvf","uvd","uvvd"] - }, - "application/vnd.dece.ttml+xml": { - "source": "iana", - "extensions": ["uvt","uvvt"] - }, - "application/vnd.dece.unspecified": { - "source": "iana", - "extensions": ["uvx","uvvx"] - }, - "application/vnd.dece.zip": { - "source": "iana", - "extensions": ["uvz","uvvz"] - }, - "application/vnd.denovo.fcselayout-link": { - "source": "iana", - "extensions": ["fe_launch"] - }, - "application/vnd.desmume-movie": { - "source": "iana" - }, - "application/vnd.dir-bi.plate-dl-nosuffix": { - "source": "iana" - }, - "application/vnd.dm.delegation+xml": { - "source": "iana" - }, - "application/vnd.dna": { - "source": "iana", - "extensions": ["dna"] - }, - "application/vnd.document+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.dolby.mlp": { - "source": "apache", - "extensions": ["mlp"] - }, - "application/vnd.dolby.mobile.1": { - "source": "iana" - }, - "application/vnd.dolby.mobile.2": { - "source": "iana" - }, - "application/vnd.doremir.scorecloud-binary-document": { - "source": "iana" - }, - "application/vnd.dpgraph": { - "source": "iana", - "extensions": ["dpg"] - }, - "application/vnd.dreamfactory": { - "source": "iana", - "extensions": ["dfac"] - }, - "application/vnd.ds-keypoint": { - "source": "apache", - "extensions": ["kpxx"] - }, - "application/vnd.dtg.local": { - "source": "iana" - }, - "application/vnd.dtg.local.flash": { - "source": "iana" - }, - "application/vnd.dtg.local.html": { - "source": "iana" - }, - "application/vnd.dvb.ait": { - "source": "iana", - "extensions": ["ait"] - }, - "application/vnd.dvb.dvbj": { - "source": "iana" - }, - "application/vnd.dvb.esgcontainer": { - "source": "iana" - }, - "application/vnd.dvb.ipdcdftnotifaccess": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgaccess": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgaccess2": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgpdd": { - "source": "iana" - }, - "application/vnd.dvb.ipdcroaming": { - "source": "iana" - }, - "application/vnd.dvb.iptv.alfec-base": { - "source": "iana" - }, - "application/vnd.dvb.iptv.alfec-enhancement": { - "source": "iana" - }, - "application/vnd.dvb.notif-aggregate-root+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-container+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-generic+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-msglist+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-registration-request+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-registration-response+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-init+xml": { - "source": "iana" - }, - "application/vnd.dvb.pfr": { - "source": "iana" - }, - "application/vnd.dvb.service": { - "source": "iana", - "extensions": ["svc"] - }, - "application/vnd.dxr": { - "source": "iana" - }, - "application/vnd.dynageo": { - "source": "iana", - "extensions": ["geo"] - }, - "application/vnd.dzr": { - "source": "iana" - }, - "application/vnd.easykaraoke.cdgdownload": { - "source": "iana" - }, - "application/vnd.ecdis-update": { - "source": "iana" - }, - "application/vnd.ecowin.chart": { - "source": "iana", - "extensions": ["mag"] - }, - "application/vnd.ecowin.filerequest": { - "source": "iana" - }, - "application/vnd.ecowin.fileupdate": { - "source": "iana" - }, - "application/vnd.ecowin.series": { - "source": "iana" - }, - "application/vnd.ecowin.seriesrequest": { - "source": "iana" - }, - "application/vnd.ecowin.seriesupdate": { - "source": "iana" - }, - "application/vnd.emclient.accessrequest+xml": { - "source": "iana" - }, - "application/vnd.enliven": { - "source": "iana", - "extensions": ["nml"] - }, - "application/vnd.enphase.envoy": { - "source": "iana" - }, - "application/vnd.eprints.data+xml": { - "source": "iana" - }, - "application/vnd.epson.esf": { - "source": "iana", - "extensions": ["esf"] - }, - "application/vnd.epson.msf": { - "source": "iana", - "extensions": ["msf"] - }, - "application/vnd.epson.quickanime": { - "source": "iana", - "extensions": ["qam"] - }, - "application/vnd.epson.salt": { - "source": "iana", - "extensions": ["slt"] - }, - "application/vnd.epson.ssf": { - "source": "iana", - "extensions": ["ssf"] - }, - "application/vnd.ericsson.quickcall": { - "source": "iana" - }, - "application/vnd.eszigno3+xml": { - "source": "iana", - "extensions": ["es3","et3"] - }, - "application/vnd.etsi.aoc+xml": { - "source": "iana" - }, - "application/vnd.etsi.asic-e+zip": { - "source": "iana" - }, - "application/vnd.etsi.asic-s+zip": { - "source": "iana" - }, - "application/vnd.etsi.cug+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvcommand+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvdiscovery+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvprofile+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-bc+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-cod+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-npvr+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvservice+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsync+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvueprofile+xml": { - "source": "iana" - }, - "application/vnd.etsi.mcid+xml": { - "source": "iana" - }, - "application/vnd.etsi.mheg5": { - "source": "iana" - }, - "application/vnd.etsi.overload-control-policy-dataset+xml": { - "source": "iana" - }, - "application/vnd.etsi.pstn+xml": { - "source": "iana" - }, - "application/vnd.etsi.sci+xml": { - "source": "iana" - }, - "application/vnd.etsi.simservs+xml": { - "source": "iana" - }, - "application/vnd.etsi.timestamp-token": { - "source": "iana" - }, - "application/vnd.etsi.tsl+xml": { - "source": "iana" - }, - "application/vnd.etsi.tsl.der": { - "source": "iana" - }, - "application/vnd.eudora.data": { - "source": "iana" - }, - "application/vnd.ezpix-album": { - "source": "iana", - "extensions": ["ez2"] - }, - "application/vnd.ezpix-package": { - "source": "iana", - "extensions": ["ez3"] - }, - "application/vnd.f-secure.mobile": { - "source": "iana" - }, - "application/vnd.fastcopy-disk-image": { - "source": "iana" - }, - "application/vnd.fdf": { - "source": "iana", - "extensions": ["fdf"] - }, - "application/vnd.fdsn.mseed": { - "source": "iana", - "extensions": ["mseed"] - }, - "application/vnd.fdsn.seed": { - "source": "iana", - "extensions": ["seed","dataless"] - }, - "application/vnd.ffsns": { - "source": "iana" - }, - "application/vnd.fints": { - "source": "iana" - }, - "application/vnd.firemonkeys.cloudcell": { - "source": "iana" - }, - "application/vnd.flographit": { - "source": "iana", - "extensions": ["gph"] - }, - "application/vnd.fluxtime.clip": { - "source": "iana", - "extensions": ["ftc"] - }, - "application/vnd.font-fontforge-sfd": { - "source": "iana" - }, - "application/vnd.framemaker": { - "source": "iana", - "extensions": ["fm","frame","maker","book"] - }, - "application/vnd.frogans.fnc": { - "source": "iana", - "extensions": ["fnc"] - }, - "application/vnd.frogans.ltf": { - "source": "iana", - "extensions": ["ltf"] - }, - "application/vnd.fsc.weblaunch": { - "source": "iana", - "extensions": ["fsc"] - }, - "application/vnd.fujitsu.oasys": { - "source": "iana", - "extensions": ["oas"] - }, - "application/vnd.fujitsu.oasys2": { - "source": "iana", - "extensions": ["oa2"] - }, - "application/vnd.fujitsu.oasys3": { - "source": "iana", - "extensions": ["oa3"] - }, - "application/vnd.fujitsu.oasysgp": { - "source": "iana", - "extensions": ["fg5"] - }, - "application/vnd.fujitsu.oasysprs": { - "source": "iana", - "extensions": ["bh2"] - }, - "application/vnd.fujixerox.art-ex": { - "source": "iana" - }, - "application/vnd.fujixerox.art4": { - "source": "iana" - }, - "application/vnd.fujixerox.ddd": { - "source": "iana", - "extensions": ["ddd"] - }, - "application/vnd.fujixerox.docuworks": { - "source": "iana", - "extensions": ["xdw"] - }, - "application/vnd.fujixerox.docuworks.binder": { - "source": "iana", - "extensions": ["xbd"] - }, - "application/vnd.fujixerox.docuworks.container": { - "source": "iana" - }, - "application/vnd.fujixerox.hbpl": { - "source": "iana" - }, - "application/vnd.fut-misnet": { - "source": "iana" - }, - "application/vnd.fuzzysheet": { - "source": "iana", - "extensions": ["fzs"] - }, - "application/vnd.genomatix.tuxedo": { - "source": "iana", - "extensions": ["txd"] - }, - "application/vnd.geo+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.geocube+xml": { - "source": "iana" - }, - "application/vnd.geogebra.file": { - "source": "iana", - "extensions": ["ggb"] - }, - "application/vnd.geogebra.tool": { - "source": "iana", - "extensions": ["ggt"] - }, - "application/vnd.geometry-explorer": { - "source": "iana", - "extensions": ["gex","gre"] - }, - "application/vnd.geonext": { - "source": "iana", - "extensions": ["gxt"] - }, - "application/vnd.geoplan": { - "source": "iana", - "extensions": ["g2w"] - }, - "application/vnd.geospace": { - "source": "iana", - "extensions": ["g3w"] - }, - "application/vnd.gerber": { - "source": "iana" - }, - "application/vnd.globalplatform.card-content-mgt": { - "source": "iana" - }, - "application/vnd.globalplatform.card-content-mgt-response": { - "source": "iana" - }, - "application/vnd.gmx": { - "source": "iana", - "extensions": ["gmx"] - }, - "application/vnd.google-earth.kml+xml": { - "source": "iana", - "compressible": true, - "extensions": ["kml"] - }, - "application/vnd.google-earth.kmz": { - "source": "iana", - "compressible": false, - "extensions": ["kmz"] - }, - "application/vnd.gov.sk.e-form+xml": { - "source": "iana" - }, - "application/vnd.gov.sk.e-form+zip": { - "source": "iana" - }, - "application/vnd.gov.sk.xmldatacontainer+xml": { - "source": "iana" - }, - "application/vnd.grafeq": { - "source": "iana", - "extensions": ["gqf","gqs"] - }, - "application/vnd.gridmp": { - "source": "iana" - }, - "application/vnd.groove-account": { - "source": "iana", - "extensions": ["gac"] - }, - "application/vnd.groove-help": { - "source": "iana", - "extensions": ["ghf"] - }, - "application/vnd.groove-identity-message": { - "source": "iana", - "extensions": ["gim"] - }, - "application/vnd.groove-injector": { - "source": "iana", - "extensions": ["grv"] - }, - "application/vnd.groove-tool-message": { - "source": "iana", - "extensions": ["gtm"] - }, - "application/vnd.groove-tool-template": { - "source": "iana", - "extensions": ["tpl"] - }, - "application/vnd.groove-vcard": { - "source": "iana", - "extensions": ["vcg"] - }, - "application/vnd.hal+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hal+xml": { - "source": "iana", - "extensions": ["hal"] - }, - "application/vnd.handheld-entertainment+xml": { - "source": "iana", - "extensions": ["zmm"] - }, - "application/vnd.hbci": { - "source": "iana", - "extensions": ["hbci"] - }, - "application/vnd.hcl-bireports": { - "source": "iana" - }, - "application/vnd.heroku+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hhe.lesson-player": { - "source": "iana", - "extensions": ["les"] - }, - "application/vnd.hp-hpgl": { - "source": "iana", - "extensions": ["hpgl"] - }, - "application/vnd.hp-hpid": { - "source": "iana", - "extensions": ["hpid"] - }, - "application/vnd.hp-hps": { - "source": "iana", - "extensions": ["hps"] - }, - "application/vnd.hp-jlyt": { - "source": "iana", - "extensions": ["jlt"] - }, - "application/vnd.hp-pcl": { - "source": "iana", - "extensions": ["pcl"] - }, - "application/vnd.hp-pclxl": { - "source": "iana", - "extensions": ["pclxl"] - }, - "application/vnd.httphone": { - "source": "iana" - }, - "application/vnd.hydrostatix.sof-data": { - "source": "iana", - "extensions": ["sfd-hdstx"] - }, - "application/vnd.hyperdrive+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hzn-3d-crossword": { - "source": "iana" - }, - "application/vnd.ibm.afplinedata": { - "source": "iana" - }, - "application/vnd.ibm.electronic-media": { - "source": "iana" - }, - "application/vnd.ibm.minipay": { - "source": "iana", - "extensions": ["mpy"] - }, - "application/vnd.ibm.modcap": { - "source": "iana", - "extensions": ["afp","listafp","list3820"] - }, - "application/vnd.ibm.rights-management": { - "source": "iana", - "extensions": ["irm"] - }, - "application/vnd.ibm.secure-container": { - "source": "iana", - "extensions": ["sc"] - }, - "application/vnd.iccprofile": { - "source": "iana", - "extensions": ["icc","icm"] - }, - "application/vnd.ieee.1905": { - "source": "iana" - }, - "application/vnd.igloader": { - "source": "iana", - "extensions": ["igl"] - }, - "application/vnd.immervision-ivp": { - "source": "iana", - "extensions": ["ivp"] - }, - "application/vnd.immervision-ivu": { - "source": "iana", - "extensions": ["ivu"] - }, - "application/vnd.ims.imsccv1p1": { - "source": "iana" - }, - "application/vnd.ims.imsccv1p2": { - "source": "iana" - }, - "application/vnd.ims.imsccv1p3": { - "source": "iana" - }, - "application/vnd.ims.lis.v2.result+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolconsumerprofile+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolproxy+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolproxy.id+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolsettings+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolsettings.simple+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.informedcontrol.rms+xml": { - "source": "iana" - }, - "application/vnd.informix-visionary": { - "source": "iana" - }, - "application/vnd.infotech.project": { - "source": "iana" - }, - "application/vnd.infotech.project+xml": { - "source": "iana" - }, - "application/vnd.innopath.wamp.notification": { - "source": "iana" - }, - "application/vnd.insors.igm": { - "source": "iana", - "extensions": ["igm"] - }, - "application/vnd.intercon.formnet": { - "source": "iana", - "extensions": ["xpw","xpx"] - }, - "application/vnd.intergeo": { - "source": "iana", - "extensions": ["i2g"] - }, - "application/vnd.intertrust.digibox": { - "source": "iana" - }, - "application/vnd.intertrust.nncp": { - "source": "iana" - }, - "application/vnd.intu.qbo": { - "source": "iana", - "extensions": ["qbo"] - }, - "application/vnd.intu.qfx": { - "source": "iana", - "extensions": ["qfx"] - }, - "application/vnd.iptc.g2.catalogitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.conceptitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.knowledgeitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.newsitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.newsmessage+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.packageitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.planningitem+xml": { - "source": "iana" - }, - "application/vnd.ipunplugged.rcprofile": { - "source": "iana", - "extensions": ["rcprofile"] - }, - "application/vnd.irepository.package+xml": { - "source": "iana", - "extensions": ["irp"] - }, - "application/vnd.is-xpr": { - "source": "iana", - "extensions": ["xpr"] - }, - "application/vnd.isac.fcs": { - "source": "iana", - "extensions": ["fcs"] - }, - "application/vnd.jam": { - "source": "iana", - "extensions": ["jam"] - }, - "application/vnd.japannet-directory-service": { - "source": "iana" - }, - "application/vnd.japannet-jpnstore-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-payment-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-registration": { - "source": "iana" - }, - "application/vnd.japannet-registration-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-setstore-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-verification": { - "source": "iana" - }, - "application/vnd.japannet-verification-wakeup": { - "source": "iana" - }, - "application/vnd.jcp.javame.midlet-rms": { - "source": "iana", - "extensions": ["rms"] - }, - "application/vnd.jisp": { - "source": "iana", - "extensions": ["jisp"] - }, - "application/vnd.joost.joda-archive": { - "source": "iana", - "extensions": ["joda"] - }, - "application/vnd.jsk.isdn-ngn": { - "source": "iana" - }, - "application/vnd.kahootz": { - "source": "iana", - "extensions": ["ktz","ktr"] - }, - "application/vnd.kde.karbon": { - "source": "iana", - "extensions": ["karbon"] - }, - "application/vnd.kde.kchart": { - "source": "iana", - "extensions": ["chrt"] - }, - "application/vnd.kde.kformula": { - "source": "iana", - "extensions": ["kfo"] - }, - "application/vnd.kde.kivio": { - "source": "iana", - "extensions": ["flw"] - }, - "application/vnd.kde.kontour": { - "source": "iana", - "extensions": ["kon"] - }, - "application/vnd.kde.kpresenter": { - "source": "iana", - "extensions": ["kpr","kpt"] - }, - "application/vnd.kde.kspread": { - "source": "iana", - "extensions": ["ksp"] - }, - "application/vnd.kde.kword": { - "source": "iana", - "extensions": ["kwd","kwt"] - }, - "application/vnd.kenameaapp": { - "source": "iana", - "extensions": ["htke"] - }, - "application/vnd.kidspiration": { - "source": "iana", - "extensions": ["kia"] - }, - "application/vnd.kinar": { - "source": "iana", - "extensions": ["kne","knp"] - }, - "application/vnd.koan": { - "source": "iana", - "extensions": ["skp","skd","skt","skm"] - }, - "application/vnd.kodak-descriptor": { - "source": "iana", - "extensions": ["sse"] - }, - "application/vnd.las.las+xml": { - "source": "iana", - "extensions": ["lasxml"] - }, - "application/vnd.liberty-request+xml": { - "source": "iana" - }, - "application/vnd.llamagraphics.life-balance.desktop": { - "source": "iana", - "extensions": ["lbd"] - }, - "application/vnd.llamagraphics.life-balance.exchange+xml": { - "source": "iana", - "extensions": ["lbe"] - }, - "application/vnd.lotus-1-2-3": { - "source": "iana", - "extensions": ["123"] - }, - "application/vnd.lotus-approach": { - "source": "iana", - "extensions": ["apr"] - }, - "application/vnd.lotus-freelance": { - "source": "iana", - "extensions": ["pre"] - }, - "application/vnd.lotus-notes": { - "source": "iana", - "extensions": ["nsf"] - }, - "application/vnd.lotus-organizer": { - "source": "iana", - "extensions": ["org"] - }, - "application/vnd.lotus-screencam": { - "source": "iana", - "extensions": ["scm"] - }, - "application/vnd.lotus-wordpro": { - "source": "iana", - "extensions": ["lwp"] - }, - "application/vnd.macports.portpkg": { - "source": "iana", - "extensions": ["portpkg"] - }, - "application/vnd.marlin.drm.actiontoken+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.conftoken+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.license+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.mdcf": { - "source": "iana" - }, - "application/vnd.mason+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.maxmind.maxmind-db": { - "source": "iana" - }, - "application/vnd.mcd": { - "source": "iana", - "extensions": ["mcd"] - }, - "application/vnd.medcalcdata": { - "source": "iana", - "extensions": ["mc1"] - }, - "application/vnd.mediastation.cdkey": { - "source": "iana", - "extensions": ["cdkey"] - }, - "application/vnd.meridian-slingshot": { - "source": "iana" - }, - "application/vnd.mfer": { - "source": "iana", - "extensions": ["mwf"] - }, - "application/vnd.mfmp": { - "source": "iana", - "extensions": ["mfm"] - }, - "application/vnd.micro+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.micrografx.flo": { - "source": "iana", - "extensions": ["flo"] - }, - "application/vnd.micrografx.igx": { - "source": "iana", - "extensions": ["igx"] - }, - "application/vnd.microsoft.portable-executable": { - "source": "iana" - }, - "application/vnd.miele+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.mif": { - "source": "iana", - "extensions": ["mif"] - }, - "application/vnd.minisoft-hp3000-save": { - "source": "iana" - }, - "application/vnd.mitsubishi.misty-guard.trustweb": { - "source": "iana" - }, - "application/vnd.mobius.daf": { - "source": "iana", - "extensions": ["daf"] - }, - "application/vnd.mobius.dis": { - "source": "iana", - "extensions": ["dis"] - }, - "application/vnd.mobius.mbk": { - "source": "iana", - "extensions": ["mbk"] - }, - "application/vnd.mobius.mqy": { - "source": "iana", - "extensions": ["mqy"] - }, - "application/vnd.mobius.msl": { - "source": "iana", - "extensions": ["msl"] - }, - "application/vnd.mobius.plc": { - "source": "iana", - "extensions": ["plc"] - }, - "application/vnd.mobius.txf": { - "source": "iana", - "extensions": ["txf"] - }, - "application/vnd.mophun.application": { - "source": "iana", - "extensions": ["mpn"] - }, - "application/vnd.mophun.certificate": { - "source": "iana", - "extensions": ["mpc"] - }, - "application/vnd.motorola.flexsuite": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.adsi": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.fis": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.gotap": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.kmr": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.ttc": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.wem": { - "source": "iana" - }, - "application/vnd.motorola.iprm": { - "source": "iana" - }, - "application/vnd.mozilla.xul+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xul"] - }, - "application/vnd.ms-3mfdocument": { - "source": "iana" - }, - "application/vnd.ms-artgalry": { - "source": "iana", - "extensions": ["cil"] - }, - "application/vnd.ms-asf": { - "source": "iana" - }, - "application/vnd.ms-cab-compressed": { - "source": "iana", - "extensions": ["cab"] - }, - "application/vnd.ms-color.iccprofile": { - "source": "apache" - }, - "application/vnd.ms-excel": { - "source": "iana", - "compressible": false, - "extensions": ["xls","xlm","xla","xlc","xlt","xlw"] - }, - "application/vnd.ms-excel.addin.macroenabled.12": { - "source": "iana", - "extensions": ["xlam"] - }, - "application/vnd.ms-excel.sheet.binary.macroenabled.12": { - "source": "iana", - "extensions": ["xlsb"] - }, - "application/vnd.ms-excel.sheet.macroenabled.12": { - "source": "iana", - "extensions": ["xlsm"] - }, - "application/vnd.ms-excel.template.macroenabled.12": { - "source": "iana", - "extensions": ["xltm"] - }, - "application/vnd.ms-fontobject": { - "source": "iana", - "compressible": true, - "extensions": ["eot"] - }, - "application/vnd.ms-htmlhelp": { - "source": "iana", - "extensions": ["chm"] - }, - "application/vnd.ms-ims": { - "source": "iana", - "extensions": ["ims"] - }, - "application/vnd.ms-lrm": { - "source": "iana", - "extensions": ["lrm"] - }, - "application/vnd.ms-office.activex+xml": { - "source": "iana" - }, - "application/vnd.ms-officetheme": { - "source": "iana", - "extensions": ["thmx"] - }, - "application/vnd.ms-opentype": { - "source": "apache", - "compressible": true - }, - "application/vnd.ms-package.obfuscated-opentype": { - "source": "apache" - }, - "application/vnd.ms-pki.seccat": { - "source": "apache", - "extensions": ["cat"] - }, - "application/vnd.ms-pki.stl": { - "source": "apache", - "extensions": ["stl"] - }, - "application/vnd.ms-playready.initiator+xml": { - "source": "iana" - }, - "application/vnd.ms-powerpoint": { - "source": "iana", - "compressible": false, - "extensions": ["ppt","pps","pot"] - }, - "application/vnd.ms-powerpoint.addin.macroenabled.12": { - "source": "iana", - "extensions": ["ppam"] - }, - "application/vnd.ms-powerpoint.presentation.macroenabled.12": { - "source": "iana", - "extensions": ["pptm"] - }, - "application/vnd.ms-powerpoint.slide.macroenabled.12": { - "source": "iana", - "extensions": ["sldm"] - }, - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": { - "source": "iana", - "extensions": ["ppsm"] - }, - "application/vnd.ms-powerpoint.template.macroenabled.12": { - "source": "iana", - "extensions": ["potm"] - }, - "application/vnd.ms-printing.printticket+xml": { - "source": "apache" - }, - "application/vnd.ms-project": { - "source": "iana", - "extensions": ["mpp","mpt"] - }, - "application/vnd.ms-tnef": { - "source": "iana" - }, - "application/vnd.ms-windows.printerpairing": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.lic-chlg-req": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.lic-resp": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.meter-chlg-req": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.meter-resp": { - "source": "iana" - }, - "application/vnd.ms-word.document.macroenabled.12": { - "source": "iana", - "extensions": ["docm"] - }, - "application/vnd.ms-word.template.macroenabled.12": { - "source": "iana", - "extensions": ["dotm"] - }, - "application/vnd.ms-works": { - "source": "iana", - "extensions": ["wps","wks","wcm","wdb"] - }, - "application/vnd.ms-wpl": { - "source": "iana", - "extensions": ["wpl"] - }, - "application/vnd.ms-xpsdocument": { - "source": "iana", - "compressible": false, - "extensions": ["xps"] - }, - "application/vnd.msa-disk-image": { - "source": "iana" - }, - "application/vnd.mseq": { - "source": "iana", - "extensions": ["mseq"] - }, - "application/vnd.msign": { - "source": "iana" - }, - "application/vnd.multiad.creator": { - "source": "iana" - }, - "application/vnd.multiad.creator.cif": { - "source": "iana" - }, - "application/vnd.music-niff": { - "source": "iana" - }, - "application/vnd.musician": { - "source": "iana", - "extensions": ["mus"] - }, - "application/vnd.muvee.style": { - "source": "iana", - "extensions": ["msty"] - }, - "application/vnd.mynfc": { - "source": "iana", - "extensions": ["taglet"] - }, - "application/vnd.ncd.control": { - "source": "iana" - }, - "application/vnd.ncd.reference": { - "source": "iana" - }, - "application/vnd.nervana": { - "source": "iana" - }, - "application/vnd.netfpx": { - "source": "iana" - }, - "application/vnd.neurolanguage.nlu": { - "source": "iana", - "extensions": ["nlu"] - }, - "application/vnd.nintendo.nitro.rom": { - "source": "iana" - }, - "application/vnd.nintendo.snes.rom": { - "source": "iana" - }, - "application/vnd.nitf": { - "source": "iana", - "extensions": ["ntf","nitf"] - }, - "application/vnd.noblenet-directory": { - "source": "iana", - "extensions": ["nnd"] - }, - "application/vnd.noblenet-sealer": { - "source": "iana", - "extensions": ["nns"] - }, - "application/vnd.noblenet-web": { - "source": "iana", - "extensions": ["nnw"] - }, - "application/vnd.nokia.catalogs": { - "source": "iana" - }, - "application/vnd.nokia.conml+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.conml+xml": { - "source": "iana" - }, - "application/vnd.nokia.iptv.config+xml": { - "source": "iana" - }, - "application/vnd.nokia.isds-radio-presets": { - "source": "iana" - }, - "application/vnd.nokia.landmark+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.landmark+xml": { - "source": "iana" - }, - "application/vnd.nokia.landmarkcollection+xml": { - "source": "iana" - }, - "application/vnd.nokia.n-gage.ac+xml": { - "source": "iana" - }, - "application/vnd.nokia.n-gage.data": { - "source": "iana", - "extensions": ["ngdat"] - }, - "application/vnd.nokia.n-gage.symbian.install": { - "source": "iana", - "extensions": ["n-gage"] - }, - "application/vnd.nokia.ncd": { - "source": "iana" - }, - "application/vnd.nokia.pcd+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.pcd+xml": { - "source": "iana" - }, - "application/vnd.nokia.radio-preset": { - "source": "iana", - "extensions": ["rpst"] - }, - "application/vnd.nokia.radio-presets": { - "source": "iana", - "extensions": ["rpss"] - }, - "application/vnd.novadigm.edm": { - "source": "iana", - "extensions": ["edm"] - }, - "application/vnd.novadigm.edx": { - "source": "iana", - "extensions": ["edx"] - }, - "application/vnd.novadigm.ext": { - "source": "iana", - "extensions": ["ext"] - }, - "application/vnd.ntt-local.content-share": { - "source": "iana" - }, - "application/vnd.ntt-local.file-transfer": { - "source": "iana" - }, - "application/vnd.ntt-local.ogw_remote-access": { - "source": "iana" - }, - "application/vnd.ntt-local.sip-ta_remote": { - "source": "iana" - }, - "application/vnd.ntt-local.sip-ta_tcp_stream": { - "source": "iana" - }, - "application/vnd.oasis.opendocument.chart": { - "source": "iana", - "extensions": ["odc"] - }, - "application/vnd.oasis.opendocument.chart-template": { - "source": "iana", - "extensions": ["otc"] - }, - "application/vnd.oasis.opendocument.database": { - "source": "iana", - "extensions": ["odb"] - }, - "application/vnd.oasis.opendocument.formula": { - "source": "iana", - "extensions": ["odf"] - }, - "application/vnd.oasis.opendocument.formula-template": { - "source": "iana", - "extensions": ["odft"] - }, - "application/vnd.oasis.opendocument.graphics": { - "source": "iana", - "compressible": false, - "extensions": ["odg"] - }, - "application/vnd.oasis.opendocument.graphics-template": { - "source": "iana", - "extensions": ["otg"] - }, - "application/vnd.oasis.opendocument.image": { - "source": "iana", - "extensions": ["odi"] - }, - "application/vnd.oasis.opendocument.image-template": { - "source": "iana", - "extensions": ["oti"] - }, - "application/vnd.oasis.opendocument.presentation": { - "source": "iana", - "compressible": false, - "extensions": ["odp"] - }, - "application/vnd.oasis.opendocument.presentation-template": { - "source": "iana", - "extensions": ["otp"] - }, - "application/vnd.oasis.opendocument.spreadsheet": { - "source": "iana", - "compressible": false, - "extensions": ["ods"] - }, - "application/vnd.oasis.opendocument.spreadsheet-template": { - "source": "iana", - "extensions": ["ots"] - }, - "application/vnd.oasis.opendocument.text": { - "source": "iana", - "compressible": false, - "extensions": ["odt"] - }, - "application/vnd.oasis.opendocument.text-master": { - "source": "iana", - "extensions": ["odm"] - }, - "application/vnd.oasis.opendocument.text-template": { - "source": "iana", - "extensions": ["ott"] - }, - "application/vnd.oasis.opendocument.text-web": { - "source": "iana", - "extensions": ["oth"] - }, - "application/vnd.obn": { - "source": "iana" - }, - "application/vnd.oftn.l10n+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.oipf.contentaccessdownload+xml": { - "source": "iana" - }, - "application/vnd.oipf.contentaccessstreaming+xml": { - "source": "iana" - }, - "application/vnd.oipf.cspg-hexbinary": { - "source": "iana" - }, - "application/vnd.oipf.dae.svg+xml": { - "source": "iana" - }, - "application/vnd.oipf.dae.xhtml+xml": { - "source": "iana" - }, - "application/vnd.oipf.mippvcontrolmessage+xml": { - "source": "iana" - }, - "application/vnd.oipf.pae.gem": { - "source": "iana" - }, - "application/vnd.oipf.spdiscovery+xml": { - "source": "iana" - }, - "application/vnd.oipf.spdlist+xml": { - "source": "iana" - }, - "application/vnd.oipf.ueprofile+xml": { - "source": "iana" - }, - "application/vnd.oipf.userprofile+xml": { - "source": "iana" - }, - "application/vnd.olpc-sugar": { - "source": "iana", - "extensions": ["xo"] - }, - "application/vnd.oma-scws-config": { - "source": "iana" - }, - "application/vnd.oma-scws-http-request": { - "source": "iana" - }, - "application/vnd.oma-scws-http-response": { - "source": "iana" - }, - "application/vnd.oma.bcast.associated-procedure-parameter+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.drm-trigger+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.imd+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.ltkm": { - "source": "iana" - }, - "application/vnd.oma.bcast.notification+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.provisioningtrigger": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgboot": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgdd+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgdu": { - "source": "iana" - }, - "application/vnd.oma.bcast.simple-symbol-container": { - "source": "iana" - }, - "application/vnd.oma.bcast.smartcard-trigger+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.sprov+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.stkm": { - "source": "iana" - }, - "application/vnd.oma.cab-address-book+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-feature-handler+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-pcc+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-subs-invite+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-user-prefs+xml": { - "source": "iana" - }, - "application/vnd.oma.dcd": { - "source": "iana" - }, - "application/vnd.oma.dcdc": { - "source": "iana" - }, - "application/vnd.oma.dd2+xml": { - "source": "iana", - "extensions": ["dd2"] - }, - "application/vnd.oma.drm.risd+xml": { - "source": "iana" - }, - "application/vnd.oma.group-usage-list+xml": { - "source": "iana" - }, - "application/vnd.oma.pal+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.detailed-progress-report+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.final-report+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.groups+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.invocation-descriptor+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.optimized-progress-report+xml": { - "source": "iana" - }, - "application/vnd.oma.push": { - "source": "iana" - }, - "application/vnd.oma.scidm.messages+xml": { - "source": "iana" - }, - "application/vnd.oma.xcap-directory+xml": { - "source": "iana" - }, - "application/vnd.omads-email+xml": { - "source": "iana" - }, - "application/vnd.omads-file+xml": { - "source": "iana" - }, - "application/vnd.omads-folder+xml": { - "source": "iana" - }, - "application/vnd.omaloc-supl-init": { - "source": "iana" - }, - "application/vnd.openblox.game+xml": { - "source": "iana" - }, - "application/vnd.openblox.game-binary": { - "source": "iana" - }, - "application/vnd.openeye.oeb": { - "source": "iana" - }, - "application/vnd.openofficeorg.extension": { - "source": "apache", - "extensions": ["oxt"] - }, - "application/vnd.openxmlformats-officedocument.custom-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawing+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.extended-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation": { - "source": "iana", - "compressible": false, - "extensions": ["pptx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slide": { - "source": "iana", - "extensions": ["sldx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": { - "source": "iana", - "extensions": ["ppsx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.template": { - "source": "apache", - "extensions": ["potx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { - "source": "iana", - "compressible": false, - "extensions": ["xlsx"] - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": { - "source": "apache", - "extensions": ["xltx"] - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.theme+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.themeoverride+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.vmldrawing": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { - "source": "iana", - "compressible": false, - "extensions": ["docx"] - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": { - "source": "apache", - "extensions": ["dotx"] - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.core-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.relationships+xml": { - "source": "iana" - }, - "application/vnd.oracle.resource+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.orange.indata": { - "source": "iana" - }, - "application/vnd.osa.netdeploy": { - "source": "iana" - }, - "application/vnd.osgeo.mapguide.package": { - "source": "iana", - "extensions": ["mgp"] - }, - "application/vnd.osgi.bundle": { - "source": "iana" - }, - "application/vnd.osgi.dp": { - "source": "iana", - "extensions": ["dp"] - }, - "application/vnd.osgi.subsystem": { - "source": "iana", - "extensions": ["esa"] - }, - "application/vnd.otps.ct-kip+xml": { - "source": "iana" - }, - "application/vnd.palm": { - "source": "iana", - "extensions": ["pdb","pqa","oprc"] - }, - "application/vnd.panoply": { - "source": "iana" - }, - "application/vnd.paos+xml": { - "source": "iana" - }, - "application/vnd.paos.xml": { - "source": "apache" - }, - "application/vnd.pawaafile": { - "source": "iana", - "extensions": ["paw"] - }, - "application/vnd.pcos": { - "source": "iana" - }, - "application/vnd.pg.format": { - "source": "iana", - "extensions": ["str"] - }, - "application/vnd.pg.osasli": { - "source": "iana", - "extensions": ["ei6"] - }, - "application/vnd.piaccess.application-licence": { - "source": "iana" - }, - "application/vnd.picsel": { - "source": "iana", - "extensions": ["efif"] - }, - "application/vnd.pmi.widget": { - "source": "iana", - "extensions": ["wg"] - }, - "application/vnd.poc.group-advertisement+xml": { - "source": "iana" - }, - "application/vnd.pocketlearn": { - "source": "iana", - "extensions": ["plf"] - }, - "application/vnd.powerbuilder6": { - "source": "iana", - "extensions": ["pbd"] - }, - "application/vnd.powerbuilder6-s": { - "source": "iana" - }, - "application/vnd.powerbuilder7": { - "source": "iana" - }, - "application/vnd.powerbuilder7-s": { - "source": "iana" - }, - "application/vnd.powerbuilder75": { - "source": "iana" - }, - "application/vnd.powerbuilder75-s": { - "source": "iana" - }, - "application/vnd.preminet": { - "source": "iana" - }, - "application/vnd.previewsystems.box": { - "source": "iana", - "extensions": ["box"] - }, - "application/vnd.proteus.magazine": { - "source": "iana", - "extensions": ["mgz"] - }, - "application/vnd.publishare-delta-tree": { - "source": "iana", - "extensions": ["qps"] - }, - "application/vnd.pvi.ptid1": { - "source": "iana", - "extensions": ["ptid"] - }, - "application/vnd.pwg-multiplexed": { - "source": "iana" - }, - "application/vnd.pwg-xhtml-print+xml": { - "source": "iana" - }, - "application/vnd.qualcomm.brew-app-res": { - "source": "iana" - }, - "application/vnd.quark.quarkxpress": { - "source": "iana", - "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"] - }, - "application/vnd.quobject-quoxdocument": { - "source": "iana" - }, - "application/vnd.radisys.moml+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-conf+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-conn+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-dialog+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-stream+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-conf+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-base+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-fax-detect+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-group+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-speech+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-transform+xml": { - "source": "iana" - }, - "application/vnd.rainstor.data": { - "source": "iana" - }, - "application/vnd.rapid": { - "source": "iana" - }, - "application/vnd.realvnc.bed": { - "source": "iana", - "extensions": ["bed"] - }, - "application/vnd.recordare.musicxml": { - "source": "iana", - "extensions": ["mxl"] - }, - "application/vnd.recordare.musicxml+xml": { - "source": "iana", - "extensions": ["musicxml"] - }, - "application/vnd.renlearn.rlprint": { - "source": "iana" - }, - "application/vnd.rig.cryptonote": { - "source": "iana", - "extensions": ["cryptonote"] - }, - "application/vnd.rim.cod": { - "source": "apache", - "extensions": ["cod"] - }, - "application/vnd.rn-realmedia": { - "source": "apache", - "extensions": ["rm"] - }, - "application/vnd.rn-realmedia-vbr": { - "source": "apache", - "extensions": ["rmvb"] - }, - "application/vnd.route66.link66+xml": { - "source": "iana", - "extensions": ["link66"] - }, - "application/vnd.rs-274x": { - "source": "iana" - }, - "application/vnd.ruckus.download": { - "source": "iana" - }, - "application/vnd.s3sms": { - "source": "iana" - }, - "application/vnd.sailingtracker.track": { - "source": "iana", - "extensions": ["st"] - }, - "application/vnd.sbm.cid": { - "source": "iana" - }, - "application/vnd.sbm.mid2": { - "source": "iana" - }, - "application/vnd.scribus": { - "source": "iana" - }, - "application/vnd.sealed.3df": { - "source": "iana" - }, - "application/vnd.sealed.csf": { - "source": "iana" - }, - "application/vnd.sealed.doc": { - "source": "iana" - }, - "application/vnd.sealed.eml": { - "source": "iana" - }, - "application/vnd.sealed.mht": { - "source": "iana" - }, - "application/vnd.sealed.net": { - "source": "iana" - }, - "application/vnd.sealed.ppt": { - "source": "iana" - }, - "application/vnd.sealed.tiff": { - "source": "iana" - }, - "application/vnd.sealed.xls": { - "source": "iana" - }, - "application/vnd.sealedmedia.softseal.html": { - "source": "iana" - }, - "application/vnd.sealedmedia.softseal.pdf": { - "source": "iana" - }, - "application/vnd.seemail": { - "source": "iana", - "extensions": ["see"] - }, - "application/vnd.sema": { - "source": "iana", - "extensions": ["sema"] - }, - "application/vnd.semd": { - "source": "iana", - "extensions": ["semd"] - }, - "application/vnd.semf": { - "source": "iana", - "extensions": ["semf"] - }, - "application/vnd.shana.informed.formdata": { - "source": "iana", - "extensions": ["ifm"] - }, - "application/vnd.shana.informed.formtemplate": { - "source": "iana", - "extensions": ["itp"] - }, - "application/vnd.shana.informed.interchange": { - "source": "iana", - "extensions": ["iif"] - }, - "application/vnd.shana.informed.package": { - "source": "iana", - "extensions": ["ipk"] - }, - "application/vnd.simtech-mindmapper": { - "source": "iana", - "extensions": ["twd","twds"] - }, - "application/vnd.siren+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.smaf": { - "source": "iana", - "extensions": ["mmf"] - }, - "application/vnd.smart.notebook": { - "source": "iana" - }, - "application/vnd.smart.teacher": { - "source": "iana", - "extensions": ["teacher"] - }, - "application/vnd.software602.filler.form+xml": { - "source": "iana" - }, - "application/vnd.software602.filler.form-xml-zip": { - "source": "iana" - }, - "application/vnd.solent.sdkm+xml": { - "source": "iana", - "extensions": ["sdkm","sdkd"] - }, - "application/vnd.spotfire.dxp": { - "source": "iana", - "extensions": ["dxp"] - }, - "application/vnd.spotfire.sfs": { - "source": "iana", - "extensions": ["sfs"] - }, - "application/vnd.sss-cod": { - "source": "iana" - }, - "application/vnd.sss-dtf": { - "source": "iana" - }, - "application/vnd.sss-ntf": { - "source": "iana" - }, - "application/vnd.stardivision.calc": { - "source": "apache", - "extensions": ["sdc"] - }, - "application/vnd.stardivision.draw": { - "source": "apache", - "extensions": ["sda"] - }, - "application/vnd.stardivision.impress": { - "source": "apache", - "extensions": ["sdd"] - }, - "application/vnd.stardivision.math": { - "source": "apache", - "extensions": ["smf"] - }, - "application/vnd.stardivision.writer": { - "source": "apache", - "extensions": ["sdw","vor"] - }, - "application/vnd.stardivision.writer-global": { - "source": "apache", - "extensions": ["sgl"] - }, - "application/vnd.stepmania.package": { - "source": "iana", - "extensions": ["smzip"] - }, - "application/vnd.stepmania.stepchart": { - "source": "iana", - "extensions": ["sm"] - }, - "application/vnd.street-stream": { - "source": "iana" - }, - "application/vnd.sun.wadl+xml": { - "source": "iana" - }, - "application/vnd.sun.xml.calc": { - "source": "apache", - "extensions": ["sxc"] - }, - "application/vnd.sun.xml.calc.template": { - "source": "apache", - "extensions": ["stc"] - }, - "application/vnd.sun.xml.draw": { - "source": "apache", - "extensions": ["sxd"] - }, - "application/vnd.sun.xml.draw.template": { - "source": "apache", - "extensions": ["std"] - }, - "application/vnd.sun.xml.impress": { - "source": "apache", - "extensions": ["sxi"] - }, - "application/vnd.sun.xml.impress.template": { - "source": "apache", - "extensions": ["sti"] - }, - "application/vnd.sun.xml.math": { - "source": "apache", - "extensions": ["sxm"] - }, - "application/vnd.sun.xml.writer": { - "source": "apache", - "extensions": ["sxw"] - }, - "application/vnd.sun.xml.writer.global": { - "source": "apache", - "extensions": ["sxg"] - }, - "application/vnd.sun.xml.writer.template": { - "source": "apache", - "extensions": ["stw"] - }, - "application/vnd.sus-calendar": { - "source": "iana", - "extensions": ["sus","susp"] - }, - "application/vnd.svd": { - "source": "iana", - "extensions": ["svd"] - }, - "application/vnd.swiftview-ics": { - "source": "iana" - }, - "application/vnd.symbian.install": { - "source": "apache", - "extensions": ["sis","sisx"] - }, - "application/vnd.syncml+xml": { - "source": "iana", - "extensions": ["xsm"] - }, - "application/vnd.syncml.dm+wbxml": { - "source": "iana", - "extensions": ["bdm"] - }, - "application/vnd.syncml.dm+xml": { - "source": "iana", - "extensions": ["xdm"] - }, - "application/vnd.syncml.dm.notification": { - "source": "iana" - }, - "application/vnd.syncml.dmddf+wbxml": { - "source": "iana" - }, - "application/vnd.syncml.dmddf+xml": { - "source": "iana" - }, - "application/vnd.syncml.dmtnds+wbxml": { - "source": "iana" - }, - "application/vnd.syncml.dmtnds+xml": { - "source": "iana" - }, - "application/vnd.syncml.ds.notification": { - "source": "iana" - }, - "application/vnd.tao.intent-module-archive": { - "source": "iana", - "extensions": ["tao"] - }, - "application/vnd.tcpdump.pcap": { - "source": "iana", - "extensions": ["pcap","cap","dmp"] - }, - "application/vnd.tmd.mediaflex.api+xml": { - "source": "iana" - }, - "application/vnd.tmobile-livetv": { - "source": "iana", - "extensions": ["tmo"] - }, - "application/vnd.trid.tpt": { - "source": "iana", - "extensions": ["tpt"] - }, - "application/vnd.triscape.mxs": { - "source": "iana", - "extensions": ["mxs"] - }, - "application/vnd.trueapp": { - "source": "iana", - "extensions": ["tra"] - }, - "application/vnd.truedoc": { - "source": "iana" - }, - "application/vnd.ubisoft.webplayer": { - "source": "iana" - }, - "application/vnd.ufdl": { - "source": "iana", - "extensions": ["ufd","ufdl"] - }, - "application/vnd.uiq.theme": { - "source": "iana", - "extensions": ["utz"] - }, - "application/vnd.umajin": { - "source": "iana", - "extensions": ["umj"] - }, - "application/vnd.unity": { - "source": "iana", - "extensions": ["unityweb"] - }, - "application/vnd.uoml+xml": { - "source": "iana", - "extensions": ["uoml"] - }, - "application/vnd.uplanet.alert": { - "source": "iana" - }, - "application/vnd.uplanet.alert-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.bearer-choice": { - "source": "iana" - }, - "application/vnd.uplanet.bearer-choice-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.cacheop": { - "source": "iana" - }, - "application/vnd.uplanet.cacheop-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.channel": { - "source": "iana" - }, - "application/vnd.uplanet.channel-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.list": { - "source": "iana" - }, - "application/vnd.uplanet.list-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.listcmd": { - "source": "iana" - }, - "application/vnd.uplanet.listcmd-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.signal": { - "source": "iana" - }, - "application/vnd.uri-map": { - "source": "iana" - }, - "application/vnd.valve.source.material": { - "source": "iana" - }, - "application/vnd.vcx": { - "source": "iana", - "extensions": ["vcx"] - }, - "application/vnd.vd-study": { - "source": "iana" - }, - "application/vnd.vectorworks": { - "source": "iana" - }, - "application/vnd.verimatrix.vcas": { - "source": "iana" - }, - "application/vnd.vidsoft.vidconference": { - "source": "iana" - }, - "application/vnd.visio": { - "source": "iana", - "extensions": ["vsd","vst","vss","vsw"] - }, - "application/vnd.visionary": { - "source": "iana", - "extensions": ["vis"] - }, - "application/vnd.vividence.scriptfile": { - "source": "iana" - }, - "application/vnd.vsf": { - "source": "iana", - "extensions": ["vsf"] - }, - "application/vnd.wap.sic": { - "source": "iana" - }, - "application/vnd.wap.slc": { - "source": "iana" - }, - "application/vnd.wap.wbxml": { - "source": "iana", - "extensions": ["wbxml"] - }, - "application/vnd.wap.wmlc": { - "source": "iana", - "extensions": ["wmlc"] - }, - "application/vnd.wap.wmlscriptc": { - "source": "iana", - "extensions": ["wmlsc"] - }, - "application/vnd.webturbo": { - "source": "iana", - "extensions": ["wtb"] - }, - "application/vnd.wfa.p2p": { - "source": "iana" - }, - "application/vnd.wfa.wsc": { - "source": "iana" - }, - "application/vnd.windows.devicepairing": { - "source": "iana" - }, - "application/vnd.wmc": { - "source": "iana" - }, - "application/vnd.wmf.bootstrap": { - "source": "iana" - }, - "application/vnd.wolfram.mathematica": { - "source": "iana" - }, - "application/vnd.wolfram.mathematica.package": { - "source": "iana" - }, - "application/vnd.wolfram.player": { - "source": "iana", - "extensions": ["nbp"] - }, - "application/vnd.wordperfect": { - "source": "iana", - "extensions": ["wpd"] - }, - "application/vnd.wqd": { - "source": "iana", - "extensions": ["wqd"] - }, - "application/vnd.wrq-hp3000-labelled": { - "source": "iana" - }, - "application/vnd.wt.stf": { - "source": "iana", - "extensions": ["stf"] - }, - "application/vnd.wv.csp+wbxml": { - "source": "iana" - }, - "application/vnd.wv.csp+xml": { - "source": "iana" - }, - "application/vnd.wv.ssp+xml": { - "source": "iana" - }, - "application/vnd.xacml+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.xara": { - "source": "iana", - "extensions": ["xar"] - }, - "application/vnd.xfdl": { - "source": "iana", - "extensions": ["xfdl"] - }, - "application/vnd.xfdl.webform": { - "source": "iana" - }, - "application/vnd.xmi+xml": { - "source": "iana" - }, - "application/vnd.xmpie.cpkg": { - "source": "iana" - }, - "application/vnd.xmpie.dpkg": { - "source": "iana" - }, - "application/vnd.xmpie.plan": { - "source": "iana" - }, - "application/vnd.xmpie.ppkg": { - "source": "iana" - }, - "application/vnd.xmpie.xlim": { - "source": "iana" - }, - "application/vnd.yamaha.hv-dic": { - "source": "iana", - "extensions": ["hvd"] - }, - "application/vnd.yamaha.hv-script": { - "source": "iana", - "extensions": ["hvs"] - }, - "application/vnd.yamaha.hv-voice": { - "source": "iana", - "extensions": ["hvp"] - }, - "application/vnd.yamaha.openscoreformat": { - "source": "iana", - "extensions": ["osf"] - }, - "application/vnd.yamaha.openscoreformat.osfpvg+xml": { - "source": "iana", - "extensions": ["osfpvg"] - }, - "application/vnd.yamaha.remote-setup": { - "source": "iana" - }, - "application/vnd.yamaha.smaf-audio": { - "source": "iana", - "extensions": ["saf"] - }, - "application/vnd.yamaha.smaf-phrase": { - "source": "iana", - "extensions": ["spf"] - }, - "application/vnd.yamaha.through-ngn": { - "source": "iana" - }, - "application/vnd.yamaha.tunnel-udpencap": { - "source": "iana" - }, - "application/vnd.yaoweme": { - "source": "iana" - }, - "application/vnd.yellowriver-custom-menu": { - "source": "iana", - "extensions": ["cmp"] - }, - "application/vnd.zul": { - "source": "iana", - "extensions": ["zir","zirz"] - }, - "application/vnd.zzazz.deck+xml": { - "source": "iana", - "extensions": ["zaz"] - }, - "application/voicexml+xml": { - "source": "iana", - "extensions": ["vxml"] - }, - "application/vq-rtcpxr": { - "source": "iana" - }, - "application/watcherinfo+xml": { - "source": "iana" - }, - "application/whoispp-query": { - "source": "iana" - }, - "application/whoispp-response": { - "source": "iana" - }, - "application/widget": { - "source": "iana", - "extensions": ["wgt"] - }, - "application/winhlp": { - "source": "apache", - "extensions": ["hlp"] - }, - "application/wita": { - "source": "iana" - }, - "application/wordperfect5.1": { - "source": "iana" - }, - "application/wsdl+xml": { - "source": "iana", - "extensions": ["wsdl"] - }, - "application/wspolicy+xml": { - "source": "iana", - "extensions": ["wspolicy"] - }, - "application/x-7z-compressed": { - "source": "apache", - "compressible": false, - "extensions": ["7z"] - }, - "application/x-abiword": { - "source": "apache", - "extensions": ["abw"] - }, - "application/x-ace-compressed": { - "source": "apache", - "extensions": ["ace"] - }, - "application/x-amf": { - "source": "apache" - }, - "application/x-apple-diskimage": { - "source": "apache", - "extensions": ["dmg"] - }, - "application/x-authorware-bin": { - "source": "apache", - "extensions": ["aab","x32","u32","vox"] - }, - "application/x-authorware-map": { - "source": "apache", - "extensions": ["aam"] - }, - "application/x-authorware-seg": { - "source": "apache", - "extensions": ["aas"] - }, - "application/x-bcpio": { - "source": "apache", - "extensions": ["bcpio"] - }, - "application/x-bdoc": { - "compressible": false, - "extensions": ["bdoc"] - }, - "application/x-bittorrent": { - "source": "apache", - "extensions": ["torrent"] - }, - "application/x-blorb": { - "source": "apache", - "extensions": ["blb","blorb"] - }, - "application/x-bzip": { - "source": "apache", - "compressible": false, - "extensions": ["bz"] - }, - "application/x-bzip2": { - "source": "apache", - "compressible": false, - "extensions": ["bz2","boz"] - }, - "application/x-cbr": { - "source": "apache", - "extensions": ["cbr","cba","cbt","cbz","cb7"] - }, - "application/x-cdlink": { - "source": "apache", - "extensions": ["vcd"] - }, - "application/x-cfs-compressed": { - "source": "apache", - "extensions": ["cfs"] - }, - "application/x-chat": { - "source": "apache", - "extensions": ["chat"] - }, - "application/x-chess-pgn": { - "source": "apache", - "extensions": ["pgn"] - }, - "application/x-chrome-extension": { - "extensions": ["crx"] - }, - "application/x-cocoa": { - "source": "nginx", - "extensions": ["cco"] - }, - "application/x-compress": { - "source": "apache" - }, - "application/x-conference": { - "source": "apache", - "extensions": ["nsc"] - }, - "application/x-cpio": { - "source": "apache", - "extensions": ["cpio"] - }, - "application/x-csh": { - "source": "apache", - "extensions": ["csh"] - }, - "application/x-deb": { - "compressible": false - }, - "application/x-debian-package": { - "source": "apache", - "extensions": ["deb","udeb"] - }, - "application/x-dgc-compressed": { - "source": "apache", - "extensions": ["dgc"] - }, - "application/x-director": { - "source": "apache", - "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"] - }, - "application/x-doom": { - "source": "apache", - "extensions": ["wad"] - }, - "application/x-dtbncx+xml": { - "source": "apache", - "extensions": ["ncx"] - }, - "application/x-dtbook+xml": { - "source": "apache", - "extensions": ["dtb"] - }, - "application/x-dtbresource+xml": { - "source": "apache", - "extensions": ["res"] - }, - "application/x-dvi": { - "source": "apache", - "compressible": false, - "extensions": ["dvi"] - }, - "application/x-envoy": { - "source": "apache", - "extensions": ["evy"] - }, - "application/x-eva": { - "source": "apache", - "extensions": ["eva"] - }, - "application/x-font-bdf": { - "source": "apache", - "extensions": ["bdf"] - }, - "application/x-font-dos": { - "source": "apache" - }, - "application/x-font-framemaker": { - "source": "apache" - }, - "application/x-font-ghostscript": { - "source": "apache", - "extensions": ["gsf"] - }, - "application/x-font-libgrx": { - "source": "apache" - }, - "application/x-font-linux-psf": { - "source": "apache", - "extensions": ["psf"] - }, - "application/x-font-otf": { - "source": "apache", - "compressible": true, - "extensions": ["otf"] - }, - "application/x-font-pcf": { - "source": "apache", - "extensions": ["pcf"] - }, - "application/x-font-snf": { - "source": "apache", - "extensions": ["snf"] - }, - "application/x-font-speedo": { - "source": "apache" - }, - "application/x-font-sunos-news": { - "source": "apache" - }, - "application/x-font-ttf": { - "source": "apache", - "compressible": true, - "extensions": ["ttf","ttc"] - }, - "application/x-font-type1": { - "source": "apache", - "extensions": ["pfa","pfb","pfm","afm"] - }, - "application/x-font-vfont": { - "source": "apache" - }, - "application/x-freearc": { - "source": "apache", - "extensions": ["arc"] - }, - "application/x-futuresplash": { - "source": "apache", - "extensions": ["spl"] - }, - "application/x-gca-compressed": { - "source": "apache", - "extensions": ["gca"] - }, - "application/x-glulx": { - "source": "apache", - "extensions": ["ulx"] - }, - "application/x-gnumeric": { - "source": "apache", - "extensions": ["gnumeric"] - }, - "application/x-gramps-xml": { - "source": "apache", - "extensions": ["gramps"] - }, - "application/x-gtar": { - "source": "apache", - "extensions": ["gtar"] - }, - "application/x-gzip": { - "source": "apache" - }, - "application/x-hdf": { - "source": "apache", - "extensions": ["hdf"] - }, - "application/x-httpd-php": { - "compressible": true, - "extensions": ["php"] - }, - "application/x-install-instructions": { - "source": "apache", - "extensions": ["install"] - }, - "application/x-iso9660-image": { - "source": "apache", - "extensions": ["iso"] - }, - "application/x-java-archive-diff": { - "source": "nginx", - "extensions": ["jardiff"] - }, - "application/x-java-jnlp-file": { - "source": "apache", - "compressible": false, - "extensions": ["jnlp"] - }, - "application/x-javascript": { - "compressible": true - }, - "application/x-latex": { - "source": "apache", - "compressible": false, - "extensions": ["latex"] - }, - "application/x-lua-bytecode": { - "extensions": ["luac"] - }, - "application/x-lzh-compressed": { - "source": "apache", - "extensions": ["lzh","lha"] - }, - "application/x-makeself": { - "source": "nginx", - "extensions": ["run"] - }, - "application/x-mie": { - "source": "apache", - "extensions": ["mie"] - }, - "application/x-mobipocket-ebook": { - "source": "apache", - "extensions": ["prc","mobi"] - }, - "application/x-mpegurl": { - "compressible": false - }, - "application/x-ms-application": { - "source": "apache", - "extensions": ["application"] - }, - "application/x-ms-shortcut": { - "source": "apache", - "extensions": ["lnk"] - }, - "application/x-ms-wmd": { - "source": "apache", - "extensions": ["wmd"] - }, - "application/x-ms-wmz": { - "source": "apache", - "extensions": ["wmz"] - }, - "application/x-ms-xbap": { - "source": "apache", - "extensions": ["xbap"] - }, - "application/x-msaccess": { - "source": "apache", - "extensions": ["mdb"] - }, - "application/x-msbinder": { - "source": "apache", - "extensions": ["obd"] - }, - "application/x-mscardfile": { - "source": "apache", - "extensions": ["crd"] - }, - "application/x-msclip": { - "source": "apache", - "extensions": ["clp"] - }, - "application/x-msdos-program": { - "extensions": ["exe"] - }, - "application/x-msdownload": { - "source": "apache", - "extensions": ["exe","dll","com","bat","msi"] - }, - "application/x-msmediaview": { - "source": "apache", - "extensions": ["mvb","m13","m14"] - }, - "application/x-msmetafile": { - "source": "apache", - "extensions": ["wmf","wmz","emf","emz"] - }, - "application/x-msmoney": { - "source": "apache", - "extensions": ["mny"] - }, - "application/x-mspublisher": { - "source": "apache", - "extensions": ["pub"] - }, - "application/x-msschedule": { - "source": "apache", - "extensions": ["scd"] - }, - "application/x-msterminal": { - "source": "apache", - "extensions": ["trm"] - }, - "application/x-mswrite": { - "source": "apache", - "extensions": ["wri"] - }, - "application/x-netcdf": { - "source": "apache", - "extensions": ["nc","cdf"] - }, - "application/x-ns-proxy-autoconfig": { - "compressible": true, - "extensions": ["pac"] - }, - "application/x-nzb": { - "source": "apache", - "extensions": ["nzb"] - }, - "application/x-perl": { - "source": "nginx", - "extensions": ["pl","pm"] - }, - "application/x-pilot": { - "source": "nginx", - "extensions": ["prc","pdb"] - }, - "application/x-pkcs12": { - "source": "apache", - "compressible": false, - "extensions": ["p12","pfx"] - }, - "application/x-pkcs7-certificates": { - "source": "apache", - "extensions": ["p7b","spc"] - }, - "application/x-pkcs7-certreqresp": { - "source": "apache", - "extensions": ["p7r"] - }, - "application/x-rar-compressed": { - "source": "apache", - "compressible": false, - "extensions": ["rar"] - }, - "application/x-redhat-package-manager": { - "source": "nginx", - "extensions": ["rpm"] - }, - "application/x-research-info-systems": { - "source": "apache", - "extensions": ["ris"] - }, - "application/x-sea": { - "source": "nginx", - "extensions": ["sea"] - }, - "application/x-sh": { - "source": "apache", - "compressible": true, - "extensions": ["sh"] - }, - "application/x-shar": { - "source": "apache", - "extensions": ["shar"] - }, - "application/x-shockwave-flash": { - "source": "apache", - "compressible": false, - "extensions": ["swf"] - }, - "application/x-silverlight-app": { - "source": "apache", - "extensions": ["xap"] - }, - "application/x-sql": { - "source": "apache", - "extensions": ["sql"] - }, - "application/x-stuffit": { - "source": "apache", - "compressible": false, - "extensions": ["sit"] - }, - "application/x-stuffitx": { - "source": "apache", - "extensions": ["sitx"] - }, - "application/x-subrip": { - "source": "apache", - "extensions": ["srt"] - }, - "application/x-sv4cpio": { - "source": "apache", - "extensions": ["sv4cpio"] - }, - "application/x-sv4crc": { - "source": "apache", - "extensions": ["sv4crc"] - }, - "application/x-t3vm-image": { - "source": "apache", - "extensions": ["t3"] - }, - "application/x-tads": { - "source": "apache", - "extensions": ["gam"] - }, - "application/x-tar": { - "source": "apache", - "compressible": true, - "extensions": ["tar"] - }, - "application/x-tcl": { - "source": "apache", - "extensions": ["tcl","tk"] - }, - "application/x-tex": { - "source": "apache", - "extensions": ["tex"] - }, - "application/x-tex-tfm": { - "source": "apache", - "extensions": ["tfm"] - }, - "application/x-texinfo": { - "source": "apache", - "extensions": ["texinfo","texi"] - }, - "application/x-tgif": { - "source": "apache", - "extensions": ["obj"] - }, - "application/x-ustar": { - "source": "apache", - "extensions": ["ustar"] - }, - "application/x-wais-source": { - "source": "apache", - "extensions": ["src"] - }, - "application/x-web-app-manifest+json": { - "compressible": true, - "extensions": ["webapp"] - }, - "application/x-www-form-urlencoded": { - "source": "iana", - "compressible": true - }, - "application/x-x509-ca-cert": { - "source": "apache", - "extensions": ["der","crt","pem"] - }, - "application/x-xfig": { - "source": "apache", - "extensions": ["fig"] - }, - "application/x-xliff+xml": { - "source": "apache", - "extensions": ["xlf"] - }, - "application/x-xpinstall": { - "source": "apache", - "compressible": false, - "extensions": ["xpi"] - }, - "application/x-xz": { - "source": "apache", - "extensions": ["xz"] - }, - "application/x-zmachine": { - "source": "apache", - "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"] - }, - "application/x400-bp": { - "source": "iana" - }, - "application/xacml+xml": { - "source": "iana" - }, - "application/xaml+xml": { - "source": "apache", - "extensions": ["xaml"] - }, - "application/xcap-att+xml": { - "source": "iana" - }, - "application/xcap-caps+xml": { - "source": "iana" - }, - "application/xcap-diff+xml": { - "source": "iana", - "extensions": ["xdf"] - }, - "application/xcap-el+xml": { - "source": "iana" - }, - "application/xcap-error+xml": { - "source": "iana" - }, - "application/xcap-ns+xml": { - "source": "iana" - }, - "application/xcon-conference-info+xml": { - "source": "iana" - }, - "application/xcon-conference-info-diff+xml": { - "source": "iana" - }, - "application/xenc+xml": { - "source": "iana", - "extensions": ["xenc"] - }, - "application/xhtml+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xhtml","xht"] - }, - "application/xhtml-voice+xml": { - "source": "apache" - }, - "application/xml": { - "source": "iana", - "compressible": true, - "extensions": ["xml","xsl","xsd"] - }, - "application/xml-dtd": { - "source": "iana", - "compressible": true, - "extensions": ["dtd"] - }, - "application/xml-external-parsed-entity": { - "source": "iana" - }, - "application/xml-patch+xml": { - "source": "iana" - }, - "application/xmpp+xml": { - "source": "iana" - }, - "application/xop+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xop"] - }, - "application/xproc+xml": { - "source": "apache", - "extensions": ["xpl"] - }, - "application/xslt+xml": { - "source": "iana", - "extensions": ["xslt"] - }, - "application/xspf+xml": { - "source": "apache", - "extensions": ["xspf"] - }, - "application/xv+xml": { - "source": "iana", - "extensions": ["mxml","xhvml","xvml","xvm"] - }, - "application/yang": { - "source": "iana", - "extensions": ["yang"] - }, - "application/yin+xml": { - "source": "iana", - "extensions": ["yin"] - }, - "application/zip": { - "source": "iana", - "compressible": false, - "extensions": ["zip"] - }, - "application/zlib": { - "source": "iana" - }, - "audio/1d-interleaved-parityfec": { - "source": "iana" - }, - "audio/32kadpcm": { - "source": "iana" - }, - "audio/3gpp": { - "source": "iana" - }, - "audio/3gpp2": { - "source": "iana" - }, - "audio/ac3": { - "source": "iana" - }, - "audio/adpcm": { - "source": "apache", - "extensions": ["adp"] - }, - "audio/amr": { - "source": "iana" - }, - "audio/amr-wb": { - "source": "iana" - }, - "audio/amr-wb+": { - "source": "iana" - }, - "audio/aptx": { - "source": "iana" - }, - "audio/asc": { - "source": "iana" - }, - "audio/atrac-advanced-lossless": { - "source": "iana" - }, - "audio/atrac-x": { - "source": "iana" - }, - "audio/atrac3": { - "source": "iana" - }, - "audio/basic": { - "source": "iana", - "compressible": false, - "extensions": ["au","snd"] - }, - "audio/bv16": { - "source": "iana" - }, - "audio/bv32": { - "source": "iana" - }, - "audio/clearmode": { - "source": "iana" - }, - "audio/cn": { - "source": "iana" - }, - "audio/dat12": { - "source": "iana" - }, - "audio/dls": { - "source": "iana" - }, - "audio/dsr-es201108": { - "source": "iana" - }, - "audio/dsr-es202050": { - "source": "iana" - }, - "audio/dsr-es202211": { - "source": "iana" - }, - "audio/dsr-es202212": { - "source": "iana" - }, - "audio/dv": { - "source": "iana" - }, - "audio/dvi4": { - "source": "iana" - }, - "audio/eac3": { - "source": "iana" - }, - "audio/encaprtp": { - "source": "iana" - }, - "audio/evrc": { - "source": "iana" - }, - "audio/evrc-qcp": { - "source": "iana" - }, - "audio/evrc0": { - "source": "iana" - }, - "audio/evrc1": { - "source": "iana" - }, - "audio/evrcb": { - "source": "iana" - }, - "audio/evrcb0": { - "source": "iana" - }, - "audio/evrcb1": { - "source": "iana" - }, - "audio/evrcnw": { - "source": "iana" - }, - "audio/evrcnw0": { - "source": "iana" - }, - "audio/evrcnw1": { - "source": "iana" - }, - "audio/evrcwb": { - "source": "iana" - }, - "audio/evrcwb0": { - "source": "iana" - }, - "audio/evrcwb1": { - "source": "iana" - }, - "audio/fwdred": { - "source": "iana" - }, - "audio/g711-0": { - "source": "iana" - }, - "audio/g719": { - "source": "iana" - }, - "audio/g722": { - "source": "iana" - }, - "audio/g7221": { - "source": "iana" - }, - "audio/g723": { - "source": "iana" - }, - "audio/g726-16": { - "source": "iana" - }, - "audio/g726-24": { - "source": "iana" - }, - "audio/g726-32": { - "source": "iana" - }, - "audio/g726-40": { - "source": "iana" - }, - "audio/g728": { - "source": "iana" - }, - "audio/g729": { - "source": "iana" - }, - "audio/g7291": { - "source": "iana" - }, - "audio/g729d": { - "source": "iana" - }, - "audio/g729e": { - "source": "iana" - }, - "audio/gsm": { - "source": "iana" - }, - "audio/gsm-efr": { - "source": "iana" - }, - "audio/gsm-hr-08": { - "source": "iana" - }, - "audio/ilbc": { - "source": "iana" - }, - "audio/ip-mr_v2.5": { - "source": "iana" - }, - "audio/isac": { - "source": "apache" - }, - "audio/l16": { - "source": "iana" - }, - "audio/l20": { - "source": "iana" - }, - "audio/l24": { - "source": "iana", - "compressible": false - }, - "audio/l8": { - "source": "iana" - }, - "audio/lpc": { - "source": "iana" - }, - "audio/midi": { - "source": "apache", - "extensions": ["mid","midi","kar","rmi"] - }, - "audio/mobile-xmf": { - "source": "iana" - }, - "audio/mp4": { - "source": "iana", - "compressible": false, - "extensions": ["mp4a","m4a"] - }, - "audio/mp4a-latm": { - "source": "iana" - }, - "audio/mpa": { - "source": "iana" - }, - "audio/mpa-robust": { - "source": "iana" - }, - "audio/mpeg": { - "source": "iana", - "compressible": false, - "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"] - }, - "audio/mpeg4-generic": { - "source": "iana" - }, - "audio/musepack": { - "source": "apache" - }, - "audio/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["oga","ogg","spx"] - }, - "audio/opus": { - "source": "iana" - }, - "audio/parityfec": { - "source": "iana" - }, - "audio/pcma": { - "source": "iana" - }, - "audio/pcma-wb": { - "source": "iana" - }, - "audio/pcmu": { - "source": "iana" - }, - "audio/pcmu-wb": { - "source": "iana" - }, - "audio/prs.sid": { - "source": "iana" - }, - "audio/qcelp": { - "source": "iana" - }, - "audio/raptorfec": { - "source": "iana" - }, - "audio/red": { - "source": "iana" - }, - "audio/rtp-enc-aescm128": { - "source": "iana" - }, - "audio/rtp-midi": { - "source": "iana" - }, - "audio/rtploopback": { - "source": "iana" - }, - "audio/rtx": { - "source": "iana" - }, - "audio/s3m": { - "source": "apache", - "extensions": ["s3m"] - }, - "audio/silk": { - "source": "apache", - "extensions": ["sil"] - }, - "audio/smv": { - "source": "iana" - }, - "audio/smv-qcp": { - "source": "iana" - }, - "audio/smv0": { - "source": "iana" - }, - "audio/sp-midi": { - "source": "iana" - }, - "audio/speex": { - "source": "iana" - }, - "audio/t140c": { - "source": "iana" - }, - "audio/t38": { - "source": "iana" - }, - "audio/telephone-event": { - "source": "iana" - }, - "audio/tone": { - "source": "iana" - }, - "audio/uemclip": { - "source": "iana" - }, - "audio/ulpfec": { - "source": "iana" - }, - "audio/vdvi": { - "source": "iana" - }, - "audio/vmr-wb": { - "source": "iana" - }, - "audio/vnd.3gpp.iufp": { - "source": "iana" - }, - "audio/vnd.4sb": { - "source": "iana" - }, - "audio/vnd.audiokoz": { - "source": "iana" - }, - "audio/vnd.celp": { - "source": "iana" - }, - "audio/vnd.cisco.nse": { - "source": "iana" - }, - "audio/vnd.cmles.radio-events": { - "source": "iana" - }, - "audio/vnd.cns.anp1": { - "source": "iana" - }, - "audio/vnd.cns.inf1": { - "source": "iana" - }, - "audio/vnd.dece.audio": { - "source": "iana", - "extensions": ["uva","uvva"] - }, - "audio/vnd.digital-winds": { - "source": "iana", - "extensions": ["eol"] - }, - "audio/vnd.dlna.adts": { - "source": "iana" - }, - "audio/vnd.dolby.heaac.1": { - "source": "iana" - }, - "audio/vnd.dolby.heaac.2": { - "source": "iana" - }, - "audio/vnd.dolby.mlp": { - "source": "iana" - }, - "audio/vnd.dolby.mps": { - "source": "iana" - }, - "audio/vnd.dolby.pl2": { - "source": "iana" - }, - "audio/vnd.dolby.pl2x": { - "source": "iana" - }, - "audio/vnd.dolby.pl2z": { - "source": "iana" - }, - "audio/vnd.dolby.pulse.1": { - "source": "iana" - }, - "audio/vnd.dra": { - "source": "iana", - "extensions": ["dra"] - }, - "audio/vnd.dts": { - "source": "iana", - "extensions": ["dts"] - }, - "audio/vnd.dts.hd": { - "source": "iana", - "extensions": ["dtshd"] - }, - "audio/vnd.dvb.file": { - "source": "iana" - }, - "audio/vnd.everad.plj": { - "source": "iana" - }, - "audio/vnd.hns.audio": { - "source": "iana" - }, - "audio/vnd.lucent.voice": { - "source": "iana", - "extensions": ["lvp"] - }, - "audio/vnd.ms-playready.media.pya": { - "source": "iana", - "extensions": ["pya"] - }, - "audio/vnd.nokia.mobile-xmf": { - "source": "iana" - }, - "audio/vnd.nortel.vbk": { - "source": "iana" - }, - "audio/vnd.nuera.ecelp4800": { - "source": "iana", - "extensions": ["ecelp4800"] - }, - "audio/vnd.nuera.ecelp7470": { - "source": "iana", - "extensions": ["ecelp7470"] - }, - "audio/vnd.nuera.ecelp9600": { - "source": "iana", - "extensions": ["ecelp9600"] - }, - "audio/vnd.octel.sbc": { - "source": "iana" - }, - "audio/vnd.qcelp": { - "source": "iana" - }, - "audio/vnd.rhetorex.32kadpcm": { - "source": "iana" - }, - "audio/vnd.rip": { - "source": "iana", - "extensions": ["rip"] - }, - "audio/vnd.rn-realaudio": { - "compressible": false - }, - "audio/vnd.sealedmedia.softseal.mpeg": { - "source": "iana" - }, - "audio/vnd.vmx.cvsd": { - "source": "iana" - }, - "audio/vnd.wave": { - "compressible": false - }, - "audio/vorbis": { - "source": "iana", - "compressible": false - }, - "audio/vorbis-config": { - "source": "iana" - }, - "audio/wav": { - "compressible": false, - "extensions": ["wav"] - }, - "audio/wave": { - "compressible": false, - "extensions": ["wav"] - }, - "audio/webm": { - "source": "apache", - "compressible": false, - "extensions": ["weba"] - }, - "audio/x-aac": { - "source": "apache", - "compressible": false, - "extensions": ["aac"] - }, - "audio/x-aiff": { - "source": "apache", - "extensions": ["aif","aiff","aifc"] - }, - "audio/x-caf": { - "source": "apache", - "compressible": false, - "extensions": ["caf"] - }, - "audio/x-flac": { - "source": "apache", - "extensions": ["flac"] - }, - "audio/x-m4a": { - "source": "nginx", - "extensions": ["m4a"] - }, - "audio/x-matroska": { - "source": "apache", - "extensions": ["mka"] - }, - "audio/x-mpegurl": { - "source": "apache", - "extensions": ["m3u"] - }, - "audio/x-ms-wax": { - "source": "apache", - "extensions": ["wax"] - }, - "audio/x-ms-wma": { - "source": "apache", - "extensions": ["wma"] - }, - "audio/x-pn-realaudio": { - "source": "apache", - "extensions": ["ram","ra"] - }, - "audio/x-pn-realaudio-plugin": { - "source": "apache", - "extensions": ["rmp"] - }, - "audio/x-realaudio": { - "source": "nginx", - "extensions": ["ra"] - }, - "audio/x-tta": { - "source": "apache" - }, - "audio/x-wav": { - "source": "apache", - "extensions": ["wav"] - }, - "audio/xm": { - "source": "apache", - "extensions": ["xm"] - }, - "chemical/x-cdx": { - "source": "apache", - "extensions": ["cdx"] - }, - "chemical/x-cif": { - "source": "apache", - "extensions": ["cif"] - }, - "chemical/x-cmdf": { - "source": "apache", - "extensions": ["cmdf"] - }, - "chemical/x-cml": { - "source": "apache", - "extensions": ["cml"] - }, - "chemical/x-csml": { - "source": "apache", - "extensions": ["csml"] - }, - "chemical/x-pdb": { - "source": "apache" - }, - "chemical/x-xyz": { - "source": "apache", - "extensions": ["xyz"] - }, - "font/opentype": { - "compressible": true, - "extensions": ["otf"] - }, - "image/bmp": { - "source": "apache", - "compressible": true, - "extensions": ["bmp"] - }, - "image/cgm": { - "source": "iana", - "extensions": ["cgm"] - }, - "image/fits": { - "source": "iana" - }, - "image/g3fax": { - "source": "iana", - "extensions": ["g3"] - }, - "image/gif": { - "source": "iana", - "compressible": false, - "extensions": ["gif"] - }, - "image/ief": { - "source": "iana", - "extensions": ["ief"] - }, - "image/jp2": { - "source": "iana" - }, - "image/jpeg": { - "source": "iana", - "compressible": false, - "extensions": ["jpeg","jpg","jpe"] - }, - "image/jpm": { - "source": "iana" - }, - "image/jpx": { - "source": "iana" - }, - "image/ktx": { - "source": "iana", - "extensions": ["ktx"] - }, - "image/naplps": { - "source": "iana" - }, - "image/pjpeg": { - "compressible": false - }, - "image/png": { - "source": "iana", - "compressible": false, - "extensions": ["png"] - }, - "image/prs.btif": { - "source": "iana", - "extensions": ["btif"] - }, - "image/prs.pti": { - "source": "iana" - }, - "image/pwg-raster": { - "source": "iana" - }, - "image/sgi": { - "source": "apache", - "extensions": ["sgi"] - }, - "image/svg+xml": { - "source": "iana", - "compressible": true, - "extensions": ["svg","svgz"] - }, - "image/t38": { - "source": "iana" - }, - "image/tiff": { - "source": "iana", - "compressible": false, - "extensions": ["tiff","tif"] - }, - "image/tiff-fx": { - "source": "iana" - }, - "image/vnd.adobe.photoshop": { - "source": "iana", - "compressible": true, - "extensions": ["psd"] - }, - "image/vnd.airzip.accelerator.azv": { - "source": "iana" - }, - "image/vnd.cns.inf2": { - "source": "iana" - }, - "image/vnd.dece.graphic": { - "source": "iana", - "extensions": ["uvi","uvvi","uvg","uvvg"] - }, - "image/vnd.djvu": { - "source": "iana", - "extensions": ["djvu","djv"] - }, - "image/vnd.dvb.subtitle": { - "source": "iana", - "extensions": ["sub"] - }, - "image/vnd.dwg": { - "source": "iana", - "extensions": ["dwg"] - }, - "image/vnd.dxf": { - "source": "iana", - "extensions": ["dxf"] - }, - "image/vnd.fastbidsheet": { - "source": "iana", - "extensions": ["fbs"] - }, - "image/vnd.fpx": { - "source": "iana", - "extensions": ["fpx"] - }, - "image/vnd.fst": { - "source": "iana", - "extensions": ["fst"] - }, - "image/vnd.fujixerox.edmics-mmr": { - "source": "iana", - "extensions": ["mmr"] - }, - "image/vnd.fujixerox.edmics-rlc": { - "source": "iana", - "extensions": ["rlc"] - }, - "image/vnd.globalgraphics.pgb": { - "source": "iana" - }, - "image/vnd.microsoft.icon": { - "source": "iana" - }, - "image/vnd.mix": { - "source": "iana" - }, - "image/vnd.mozilla.apng": { - "source": "iana" - }, - "image/vnd.ms-modi": { - "source": "iana", - "extensions": ["mdi"] - }, - "image/vnd.ms-photo": { - "source": "apache", - "extensions": ["wdp"] - }, - "image/vnd.net-fpx": { - "source": "iana", - "extensions": ["npx"] - }, - "image/vnd.radiance": { - "source": "iana" - }, - "image/vnd.sealed.png": { - "source": "iana" - }, - "image/vnd.sealedmedia.softseal.gif": { - "source": "iana" - }, - "image/vnd.sealedmedia.softseal.jpg": { - "source": "iana" - }, - "image/vnd.svf": { - "source": "iana" - }, - "image/vnd.tencent.tap": { - "source": "iana" - }, - "image/vnd.valve.source.texture": { - "source": "iana" - }, - "image/vnd.wap.wbmp": { - "source": "iana", - "extensions": ["wbmp"] - }, - "image/vnd.xiff": { - "source": "iana", - "extensions": ["xif"] - }, - "image/vnd.zbrush.pcx": { - "source": "iana" - }, - "image/webp": { - "source": "apache", - "extensions": ["webp"] - }, - "image/x-3ds": { - "source": "apache", - "extensions": ["3ds"] - }, - "image/x-cmu-raster": { - "source": "apache", - "extensions": ["ras"] - }, - "image/x-cmx": { - "source": "apache", - "extensions": ["cmx"] - }, - "image/x-freehand": { - "source": "apache", - "extensions": ["fh","fhc","fh4","fh5","fh7"] - }, - "image/x-icon": { - "source": "apache", - "compressible": true, - "extensions": ["ico"] - }, - "image/x-jng": { - "source": "nginx", - "extensions": ["jng"] - }, - "image/x-mrsid-image": { - "source": "apache", - "extensions": ["sid"] - }, - "image/x-ms-bmp": { - "source": "nginx", - "compressible": true, - "extensions": ["bmp"] - }, - "image/x-pcx": { - "source": "apache", - "extensions": ["pcx"] - }, - "image/x-pict": { - "source": "apache", - "extensions": ["pic","pct"] - }, - "image/x-portable-anymap": { - "source": "apache", - "extensions": ["pnm"] - }, - "image/x-portable-bitmap": { - "source": "apache", - "extensions": ["pbm"] - }, - "image/x-portable-graymap": { - "source": "apache", - "extensions": ["pgm"] - }, - "image/x-portable-pixmap": { - "source": "apache", - "extensions": ["ppm"] - }, - "image/x-rgb": { - "source": "apache", - "extensions": ["rgb"] - }, - "image/x-tga": { - "source": "apache", - "extensions": ["tga"] - }, - "image/x-xbitmap": { - "source": "apache", - "extensions": ["xbm"] - }, - "image/x-xcf": { - "compressible": false - }, - "image/x-xpixmap": { - "source": "apache", - "extensions": ["xpm"] - }, - "image/x-xwindowdump": { - "source": "apache", - "extensions": ["xwd"] - }, - "message/cpim": { - "source": "iana" - }, - "message/delivery-status": { - "source": "iana" - }, - "message/disposition-notification": { - "source": "iana" - }, - "message/external-body": { - "source": "iana" - }, - "message/feedback-report": { - "source": "iana" - }, - "message/global": { - "source": "iana" - }, - "message/global-delivery-status": { - "source": "iana" - }, - "message/global-disposition-notification": { - "source": "iana" - }, - "message/global-headers": { - "source": "iana" - }, - "message/http": { - "source": "iana", - "compressible": false - }, - "message/imdn+xml": { - "source": "iana", - "compressible": true - }, - "message/news": { - "source": "iana" - }, - "message/partial": { - "source": "iana", - "compressible": false - }, - "message/rfc822": { - "source": "iana", - "compressible": true, - "extensions": ["eml","mime"] - }, - "message/s-http": { - "source": "iana" - }, - "message/sip": { - "source": "iana" - }, - "message/sipfrag": { - "source": "iana" - }, - "message/tracking-status": { - "source": "iana" - }, - "message/vnd.si.simp": { - "source": "iana" - }, - "message/vnd.wfa.wsc": { - "source": "iana" - }, - "model/iges": { - "source": "iana", - "compressible": false, - "extensions": ["igs","iges"] - }, - "model/mesh": { - "source": "iana", - "compressible": false, - "extensions": ["msh","mesh","silo"] - }, - "model/vnd.collada+xml": { - "source": "iana", - "extensions": ["dae"] - }, - "model/vnd.dwf": { - "source": "iana", - "extensions": ["dwf"] - }, - "model/vnd.flatland.3dml": { - "source": "iana" - }, - "model/vnd.gdl": { - "source": "iana", - "extensions": ["gdl"] - }, - "model/vnd.gs-gdl": { - "source": "apache" - }, - "model/vnd.gs.gdl": { - "source": "iana" - }, - "model/vnd.gtw": { - "source": "iana", - "extensions": ["gtw"] - }, - "model/vnd.moml+xml": { - "source": "iana" - }, - "model/vnd.mts": { - "source": "iana", - "extensions": ["mts"] - }, - "model/vnd.opengex": { - "source": "iana" - }, - "model/vnd.parasolid.transmit.binary": { - "source": "iana" - }, - "model/vnd.parasolid.transmit.text": { - "source": "iana" - }, - "model/vnd.valve.source.compiled-map": { - "source": "iana" - }, - "model/vnd.vtu": { - "source": "iana", - "extensions": ["vtu"] - }, - "model/vrml": { - "source": "iana", - "compressible": false, - "extensions": ["wrl","vrml"] - }, - "model/x3d+binary": { - "source": "apache", - "compressible": false, - "extensions": ["x3db","x3dbz"] - }, - "model/x3d+fastinfoset": { - "source": "iana" - }, - "model/x3d+vrml": { - "source": "apache", - "compressible": false, - "extensions": ["x3dv","x3dvz"] - }, - "model/x3d+xml": { - "source": "iana", - "compressible": true, - "extensions": ["x3d","x3dz"] - }, - "model/x3d-vrml": { - "source": "iana" - }, - "multipart/alternative": { - "source": "iana", - "compressible": false - }, - "multipart/appledouble": { - "source": "iana" - }, - "multipart/byteranges": { - "source": "iana" - }, - "multipart/digest": { - "source": "iana" - }, - "multipart/encrypted": { - "source": "iana", - "compressible": false - }, - "multipart/form-data": { - "source": "iana", - "compressible": false - }, - "multipart/header-set": { - "source": "iana" - }, - "multipart/mixed": { - "source": "iana", - "compressible": false - }, - "multipart/parallel": { - "source": "iana" - }, - "multipart/related": { - "source": "iana", - "compressible": false - }, - "multipart/report": { - "source": "iana" - }, - "multipart/signed": { - "source": "iana", - "compressible": false - }, - "multipart/voice-message": { - "source": "iana" - }, - "multipart/x-mixed-replace": { - "source": "iana" - }, - "text/1d-interleaved-parityfec": { - "source": "iana" - }, - "text/cache-manifest": { - "source": "iana", - "compressible": true, - "extensions": ["appcache","manifest"] - }, - "text/calendar": { - "source": "iana", - "extensions": ["ics","ifb"] - }, - "text/calender": { - "compressible": true - }, - "text/cmd": { - "compressible": true - }, - "text/coffeescript": { - "extensions": ["coffee","litcoffee"] - }, - "text/css": { - "source": "iana", - "compressible": true, - "extensions": ["css"] - }, - "text/csv": { - "source": "iana", - "compressible": true, - "extensions": ["csv"] - }, - "text/csv-schema": { - "source": "iana" - }, - "text/directory": { - "source": "iana" - }, - "text/dns": { - "source": "iana" - }, - "text/ecmascript": { - "source": "iana" - }, - "text/encaprtp": { - "source": "iana" - }, - "text/enriched": { - "source": "iana" - }, - "text/fwdred": { - "source": "iana" - }, - "text/grammar-ref-list": { - "source": "iana" - }, - "text/hjson": { - "extensions": ["hjson"] - }, - "text/html": { - "source": "iana", - "compressible": true, - "extensions": ["html","htm","shtml"] - }, - "text/jade": { - "extensions": ["jade"] - }, - "text/javascript": { - "source": "iana", - "compressible": true - }, - "text/jcr-cnd": { - "source": "iana" - }, - "text/jsx": { - "compressible": true, - "extensions": ["jsx"] - }, - "text/less": { - "extensions": ["less"] - }, - "text/markdown": { - "source": "iana" - }, - "text/mathml": { - "source": "nginx", - "extensions": ["mml"] - }, - "text/mizar": { - "source": "iana" - }, - "text/n3": { - "source": "iana", - "compressible": true, - "extensions": ["n3"] - }, - "text/parameters": { - "source": "iana" - }, - "text/parityfec": { - "source": "iana" - }, - "text/plain": { - "source": "iana", - "compressible": true, - "extensions": ["txt","text","conf","def","list","log","in","ini"] - }, - "text/provenance-notation": { - "source": "iana" - }, - "text/prs.fallenstein.rst": { - "source": "iana" - }, - "text/prs.lines.tag": { - "source": "iana", - "extensions": ["dsc"] - }, - "text/raptorfec": { - "source": "iana" - }, - "text/red": { - "source": "iana" - }, - "text/rfc822-headers": { - "source": "iana" - }, - "text/richtext": { - "source": "iana", - "compressible": true, - "extensions": ["rtx"] - }, - "text/rtf": { - "source": "iana", - "compressible": true, - "extensions": ["rtf"] - }, - "text/rtp-enc-aescm128": { - "source": "iana" - }, - "text/rtploopback": { - "source": "iana" - }, - "text/rtx": { - "source": "iana" - }, - "text/sgml": { - "source": "iana", - "extensions": ["sgml","sgm"] - }, - "text/stylus": { - "extensions": ["stylus","styl"] - }, - "text/t140": { - "source": "iana" - }, - "text/tab-separated-values": { - "source": "iana", - "compressible": true, - "extensions": ["tsv"] - }, - "text/troff": { - "source": "iana", - "extensions": ["t","tr","roff","man","me","ms"] - }, - "text/turtle": { - "source": "iana", - "extensions": ["ttl"] - }, - "text/ulpfec": { - "source": "iana" - }, - "text/uri-list": { - "source": "iana", - "compressible": true, - "extensions": ["uri","uris","urls"] - }, - "text/vcard": { - "source": "iana", - "compressible": true, - "extensions": ["vcard"] - }, - "text/vnd.a": { - "source": "iana" - }, - "text/vnd.abc": { - "source": "iana" - }, - "text/vnd.curl": { - "source": "iana", - "extensions": ["curl"] - }, - "text/vnd.curl.dcurl": { - "source": "apache", - "extensions": ["dcurl"] - }, - "text/vnd.curl.mcurl": { - "source": "apache", - "extensions": ["mcurl"] - }, - "text/vnd.curl.scurl": { - "source": "apache", - "extensions": ["scurl"] - }, - "text/vnd.debian.copyright": { - "source": "iana" - }, - "text/vnd.dmclientscript": { - "source": "iana" - }, - "text/vnd.dvb.subtitle": { - "source": "iana", - "extensions": ["sub"] - }, - "text/vnd.esmertec.theme-descriptor": { - "source": "iana" - }, - "text/vnd.fly": { - "source": "iana", - "extensions": ["fly"] - }, - "text/vnd.fmi.flexstor": { - "source": "iana", - "extensions": ["flx"] - }, - "text/vnd.graphviz": { - "source": "iana", - "extensions": ["gv"] - }, - "text/vnd.in3d.3dml": { - "source": "iana", - "extensions": ["3dml"] - }, - "text/vnd.in3d.spot": { - "source": "iana", - "extensions": ["spot"] - }, - "text/vnd.iptc.newsml": { - "source": "iana" - }, - "text/vnd.iptc.nitf": { - "source": "iana" - }, - "text/vnd.latex-z": { - "source": "iana" - }, - "text/vnd.motorola.reflex": { - "source": "iana" - }, - "text/vnd.ms-mediapackage": { - "source": "iana" - }, - "text/vnd.net2phone.commcenter.command": { - "source": "iana" - }, - "text/vnd.radisys.msml-basic-layout": { - "source": "iana" - }, - "text/vnd.si.uricatalogue": { - "source": "iana" - }, - "text/vnd.sun.j2me.app-descriptor": { - "source": "iana", - "extensions": ["jad"] - }, - "text/vnd.trolltech.linguist": { - "source": "iana" - }, - "text/vnd.wap.si": { - "source": "iana" - }, - "text/vnd.wap.sl": { - "source": "iana" - }, - "text/vnd.wap.wml": { - "source": "iana", - "extensions": ["wml"] - }, - "text/vnd.wap.wmlscript": { - "source": "iana", - "extensions": ["wmls"] - }, - "text/vtt": { - "charset": "UTF-8", - "compressible": true, - "extensions": ["vtt"] - }, - "text/x-asm": { - "source": "apache", - "extensions": ["s","asm"] - }, - "text/x-c": { - "source": "apache", - "extensions": ["c","cc","cxx","cpp","h","hh","dic"] - }, - "text/x-component": { - "source": "nginx", - "extensions": ["htc"] - }, - "text/x-fortran": { - "source": "apache", - "extensions": ["f","for","f77","f90"] - }, - "text/x-gwt-rpc": { - "compressible": true - }, - "text/x-handlebars-template": { - "extensions": ["hbs"] - }, - "text/x-java-source": { - "source": "apache", - "extensions": ["java"] - }, - "text/x-jquery-tmpl": { - "compressible": true - }, - "text/x-lua": { - "extensions": ["lua"] - }, - "text/x-markdown": { - "compressible": true, - "extensions": ["markdown","md","mkd"] - }, - "text/x-nfo": { - "source": "apache", - "extensions": ["nfo"] - }, - "text/x-opml": { - "source": "apache", - "extensions": ["opml"] - }, - "text/x-pascal": { - "source": "apache", - "extensions": ["p","pas"] - }, - "text/x-processing": { - "compressible": true, - "extensions": ["pde"] - }, - "text/x-sass": { - "extensions": ["sass"] - }, - "text/x-scss": { - "extensions": ["scss"] - }, - "text/x-setext": { - "source": "apache", - "extensions": ["etx"] - }, - "text/x-sfv": { - "source": "apache", - "extensions": ["sfv"] - }, - "text/x-uuencode": { - "source": "apache", - "extensions": ["uu"] - }, - "text/x-vcalendar": { - "source": "apache", - "extensions": ["vcs"] - }, - "text/x-vcard": { - "source": "apache", - "extensions": ["vcf"] - }, - "text/xml": { - "source": "iana", - "compressible": true, - "extensions": ["xml"] - }, - "text/xml-external-parsed-entity": { - "source": "iana" - }, - "text/yaml": { - "extensions": ["yaml","yml"] - }, - "video/1d-interleaved-parityfec": { - "source": "apache" - }, - "video/3gpp": { - "source": "apache", - "extensions": ["3gp","3gpp"] - }, - "video/3gpp-tt": { - "source": "apache" - }, - "video/3gpp2": { - "source": "apache", - "extensions": ["3g2"] - }, - "video/bmpeg": { - "source": "apache" - }, - "video/bt656": { - "source": "apache" - }, - "video/celb": { - "source": "apache" - }, - "video/dv": { - "source": "apache" - }, - "video/h261": { - "source": "apache", - "extensions": ["h261"] - }, - "video/h263": { - "source": "apache", - "extensions": ["h263"] - }, - "video/h263-1998": { - "source": "apache" - }, - "video/h263-2000": { - "source": "apache" - }, - "video/h264": { - "source": "apache", - "extensions": ["h264"] - }, - "video/h264-rcdo": { - "source": "apache" - }, - "video/h264-svc": { - "source": "apache" - }, - "video/jpeg": { - "source": "apache", - "extensions": ["jpgv"] - }, - "video/jpeg2000": { - "source": "apache" - }, - "video/jpm": { - "source": "apache", - "extensions": ["jpm","jpgm"] - }, - "video/mj2": { - "source": "apache", - "extensions": ["mj2","mjp2"] - }, - "video/mp1s": { - "source": "apache" - }, - "video/mp2p": { - "source": "apache" - }, - "video/mp2t": { - "source": "apache", - "extensions": ["ts"] - }, - "video/mp4": { - "source": "apache", - "compressible": false, - "extensions": ["mp4","mp4v","mpg4"] - }, - "video/mp4v-es": { - "source": "apache" - }, - "video/mpeg": { - "source": "apache", - "compressible": false, - "extensions": ["mpeg","mpg","mpe","m1v","m2v"] - }, - "video/mpeg4-generic": { - "source": "apache" - }, - "video/mpv": { - "source": "apache" - }, - "video/nv": { - "source": "apache" - }, - "video/ogg": { - "source": "apache", - "compressible": false, - "extensions": ["ogv"] - }, - "video/parityfec": { - "source": "apache" - }, - "video/pointer": { - "source": "apache" - }, - "video/quicktime": { - "source": "apache", - "compressible": false, - "extensions": ["qt","mov"] - }, - "video/raw": { - "source": "apache" - }, - "video/rtp-enc-aescm128": { - "source": "apache" - }, - "video/rtx": { - "source": "apache" - }, - "video/smpte292m": { - "source": "apache" - }, - "video/ulpfec": { - "source": "apache" - }, - "video/vc1": { - "source": "apache" - }, - "video/vnd.cctv": { - "source": "apache" - }, - "video/vnd.dece.hd": { - "source": "apache", - "extensions": ["uvh","uvvh"] - }, - "video/vnd.dece.mobile": { - "source": "apache", - "extensions": ["uvm","uvvm"] - }, - "video/vnd.dece.mp4": { - "source": "apache" - }, - "video/vnd.dece.pd": { - "source": "apache", - "extensions": ["uvp","uvvp"] - }, - "video/vnd.dece.sd": { - "source": "apache", - "extensions": ["uvs","uvvs"] - }, - "video/vnd.dece.video": { - "source": "apache", - "extensions": ["uvv","uvvv"] - }, - "video/vnd.directv.mpeg": { - "source": "apache" - }, - "video/vnd.directv.mpeg-tts": { - "source": "apache" - }, - "video/vnd.dlna.mpeg-tts": { - "source": "apache" - }, - "video/vnd.dvb.file": { - "source": "apache", - "extensions": ["dvb"] - }, - "video/vnd.fvt": { - "source": "apache", - "extensions": ["fvt"] - }, - "video/vnd.hns.video": { - "source": "apache" - }, - "video/vnd.iptvforum.1dparityfec-1010": { - "source": "apache" - }, - "video/vnd.iptvforum.1dparityfec-2005": { - "source": "apache" - }, - "video/vnd.iptvforum.2dparityfec-1010": { - "source": "apache" - }, - "video/vnd.iptvforum.2dparityfec-2005": { - "source": "apache" - }, - "video/vnd.iptvforum.ttsavc": { - "source": "apache" - }, - "video/vnd.iptvforum.ttsmpeg2": { - "source": "apache" - }, - "video/vnd.motorola.video": { - "source": "apache" - }, - "video/vnd.motorola.videop": { - "source": "apache" - }, - "video/vnd.mpegurl": { - "source": "apache", - "extensions": ["mxu","m4u"] - }, - "video/vnd.ms-playready.media.pyv": { - "source": "apache", - "extensions": ["pyv"] - }, - "video/vnd.nokia.interleaved-multimedia": { - "source": "apache" - }, - "video/vnd.nokia.videovoip": { - "source": "apache" - }, - "video/vnd.objectvideo": { - "source": "apache" - }, - "video/vnd.sealed.mpeg1": { - "source": "apache" - }, - "video/vnd.sealed.mpeg4": { - "source": "apache" - }, - "video/vnd.sealed.swf": { - "source": "apache" - }, - "video/vnd.sealedmedia.softseal.mov": { - "source": "apache" - }, - "video/vnd.uvvu.mp4": { - "source": "apache", - "extensions": ["uvu","uvvu"] - }, - "video/vnd.vivo": { - "source": "apache", - "extensions": ["viv"] - }, - "video/webm": { - "source": "apache", - "compressible": false, - "extensions": ["webm"] - }, - "video/x-f4v": { - "source": "apache", - "extensions": ["f4v"] - }, - "video/x-fli": { - "source": "apache", - "extensions": ["fli"] - }, - "video/x-flv": { - "source": "apache", - "compressible": false, - "extensions": ["flv"] - }, - "video/x-m4v": { - "source": "apache", - "extensions": ["m4v"] - }, - "video/x-matroska": { - "source": "apache", - "compressible": false, - "extensions": ["mkv","mk3d","mks"] - }, - "video/x-mng": { - "source": "apache", - "extensions": ["mng"] - }, - "video/x-ms-asf": { - "source": "apache", - "extensions": ["asf","asx"] - }, - "video/x-ms-vob": { - "source": "apache", - "extensions": ["vob"] - }, - "video/x-ms-wm": { - "source": "apache", - "extensions": ["wm"] - }, - "video/x-ms-wmv": { - "source": "apache", - "compressible": false, - "extensions": ["wmv"] - }, - "video/x-ms-wmx": { - "source": "apache", - "extensions": ["wmx"] - }, - "video/x-ms-wvx": { - "source": "apache", - "extensions": ["wvx"] - }, - "video/x-msvideo": { - "source": "apache", - "extensions": ["avi"] - }, - "video/x-sgi-movie": { - "source": "apache", - "extensions": ["movie"] - }, - "video/x-smv": { - "source": "apache", - "extensions": ["smv"] - }, - "x-conference/x-cooltalk": { - "source": "apache", - "extensions": ["ice"] - }, - "x-shader/x-fragment": { - "compressible": true - }, - "x-shader/x-vertex": { - "compressible": true - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/index.js deleted file mode 100644 index 551031f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * mime-db - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = require('./db.json') diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/package.json deleted file mode 100644 index 493b360..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/package.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "name": "mime-db", - "description": "Media Type Database", - "version": "1.18.0", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - } - ], - "license": "MIT", - "keywords": [ - "mime", - "db", - "type", - "types", - "database", - "charset", - "charsets" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/mime-db" - }, - "devDependencies": { - "bluebird": "2.9.34", - "co": "4.6.0", - "cogent": "1.0.1", - "csv-parse": "1.0.0", - "gnode": "0.1.1", - "istanbul": "0.3.19", - "mocha": "1.21.5", - "raw-body": "2.1.2", - "stream-to-array": "2" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "db.json", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "build": "node scripts/build", - "fetch": "gnode scripts/fetch-apache && gnode scripts/fetch-iana && gnode scripts/fetch-nginx", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", - "update": "npm run fetch && npm run build" - }, - "gitHead": "c48209a8786e61f20499ba14167252ad67638c5f", - "bugs": { - "url": "https://github.com/jshttp/mime-db/issues" - }, - "homepage": "https://github.com/jshttp/mime-db", - "_id": "mime-db@1.18.0", - "_shasum": "5317e28224c08af1d484f60973dd386ba8f389e0", - "_from": "mime-db@>=1.18.0 <1.19.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "5317e28224c08af1d484f60973dd386ba8f389e0", - "tarball": "http://registry.npmjs.org/mime-db/-/mime-db-1.18.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.18.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json deleted file mode 100644 index 09f70c8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "2.1.6", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": "https://searchbeam.jit.su" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - } - ], - "license": "MIT", - "keywords": [ - "mime", - "types" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/mime-types" - }, - "dependencies": { - "mime-db": "~1.18.0" - }, - "devDependencies": { - "istanbul": "0.3.19", - "mocha": "~1.21.5" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "test": "mocha --reporter spec test/test.js", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/test.js", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot test/test.js" - }, - "gitHead": "8bfa7c2c9a4ad07f5807c7a0e547e0246155944d", - "bugs": { - "url": "https://github.com/jshttp/mime-types/issues" - }, - "homepage": "https://github.com/jshttp/mime-types", - "_id": "mime-types@2.1.6", - "_shasum": "949f8788411864ddc70948a0f21c43f29d25667c", - "_from": "mime-types@>=2.1.6 <2.2.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "949f8788411864ddc70948a0f21c43f29d25667c", - "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-2.1.6.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.6.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/package.json deleted file mode 100644 index 5393f8b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/type-is/package.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "name": "type-is", - "description": "Infer the content-type of a request.", - "version": "1.6.8", - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jshttp/type-is" - }, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.6" - }, - "devDependencies": { - "istanbul": "0.3.19", - "mocha": "~1.21.5" - }, - "engines": { - "node": ">= 0.6" - }, - "files": [ - "LICENSE", - "HISTORY.md", - "index.js" - ], - "scripts": { - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "keywords": [ - "content", - "type", - "checking" - ], - "gitHead": "6c93143cead7c596072133491b84f03a05403d3e", - "bugs": { - "url": "https://github.com/jshttp/type-is/issues" - }, - "homepage": "https://github.com/jshttp/type-is", - "_id": "type-is@1.6.8", - "_shasum": "3bac8c0c852754c855143e206d4a16e908bf0315", - "_from": "type-is@>=1.6.6 <1.7.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "3bac8c0c852754c855143e206d4a16e908bf0315", - "tarball": "http://registry.npmjs.org/type-is/-/type-is-1.6.8.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.8.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/.travis.yml deleted file mode 100644 index af92b02..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: "node_js" -node_js: - - "0.4" - - "0.6" - - "0.8" - - "0.10" diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/LICENSE deleted file mode 100644 index e33bd10..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -(The MIT License) - -Copyright (c) 2013 Jared Hanson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/README.md deleted file mode 100644 index 2f94e9b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# utils-merge - -Merges the properties from a source object into a destination object. - -## Install - - $ npm install utils-merge - -## Usage - -```javascript -var a = { foo: 'bar' } - , b = { bar: 'baz' }; - -merge(a, b); -// => { foo: 'bar', bar: 'baz' } -``` - -## Tests - - $ npm install - $ npm test - -[![Build Status](https://secure.travis-ci.org/jaredhanson/utils-merge.png)](http://travis-ci.org/jaredhanson/utils-merge) - -## Credits - - - [Jared Hanson](http://github.com/jaredhanson) - -## License - -[The MIT License](http://opensource.org/licenses/MIT) - -Copyright (c) 2013 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/index.js deleted file mode 100644 index 4265c69..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/index.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Merge object b with object a. - * - * var a = { foo: 'bar' } - * , b = { bar: 'baz' }; - * - * merge(a, b); - * // => { foo: 'bar', bar: 'baz' } - * - * @param {Object} a - * @param {Object} b - * @return {Object} - * @api public - */ - -exports = module.exports = function(a, b){ - if (a && b) { - for (var key in b) { - a[key] = b[key]; - } - } - return a; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/package.json deleted file mode 100644 index 305d5e1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/utils-merge/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "utils-merge", - "version": "1.0.0", - "description": "merge() utility function", - "keywords": [ - "util" - ], - "repository": { - "type": "git", - "url": "git://github.com/jaredhanson/utils-merge.git" - }, - "bugs": { - "url": "http://github.com/jaredhanson/utils-merge/issues" - }, - "author": { - "name": "Jared Hanson", - "email": "jaredhanson@gmail.com", - "url": "http://www.jaredhanson.net/" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://www.opensource.org/licenses/MIT" - } - ], - "main": "./index", - "dependencies": {}, - "devDependencies": { - "mocha": "1.x.x", - "chai": "1.x.x" - }, - "scripts": { - "test": "mocha --reporter spec --require test/bootstrap/node test/*.test.js" - }, - "engines": { - "node": ">= 0.4.0" - }, - "_id": "utils-merge@1.0.0", - "dist": { - "shasum": "0294fb922bb9375153541c4f7096231f287c8af8", - "tarball": "http://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" - }, - "_from": "utils-merge@1.0.0", - "_npmVersion": "1.2.25", - "_npmUser": { - "name": "jaredhanson", - "email": "jaredhanson@gmail.com" - }, - "maintainers": [ - { - "name": "jaredhanson", - "email": "jaredhanson@gmail.com" - } - ], - "directories": {}, - "_shasum": "0294fb922bb9375153541c4f7096231f287c8af8", - "_resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/jaredhanson/utils-merge" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/HISTORY.md deleted file mode 100644 index cddbcd4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/HISTORY.md +++ /dev/null @@ -1,23 +0,0 @@ -1.0.1 / 2015-07-08 -================== - - * Fix setting empty header from empty `field` - * perf: enable strict mode - * perf: remove argument reassignments - -1.0.0 / 2014-08-10 -================== - - * Accept valid `Vary` header string as `field` - * Add `vary.append` for low-level string manipulation - * Move to `jshttp` orgainzation - -0.1.0 / 2014-06-05 -================== - - * Support array of fields to set - -0.0.0 / 2014-06-04 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/LICENSE deleted file mode 100644 index 142ede3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014-2015 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/README.md deleted file mode 100644 index 5966542..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# vary - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Manipulate the HTTP Vary header - -## Installation - -```sh -$ npm install vary -``` - -## API - -```js -var vary = require('vary') -``` - -### vary(res, field) - -Adds the given header `field` to the `Vary` response header of `res`. -This can be a string of a single field, a string of a valid `Vary` -header, or an array of multiple fields. - -This will append the header if not already listed, otherwise leaves -it listed in the current location. - -```js -// Append "Origin" to the Vary header of the response -vary(res, 'Origin') -``` - -### vary.append(header, field) - -Adds the given header `field` to the `Vary` response header string `header`. -This can be a string of a single field, a string of a valid `Vary` header, -or an array of multiple fields. - -This will append the header if not already listed, otherwise leaves -it listed in the current location. The new header string is returned. - -```js -// Get header string appending "Origin" to "Accept, User-Agent" -vary.append('Accept, User-Agent', 'Origin') -``` - -## Examples - -### Updating the Vary header when content is based on it - -```js -var http = require('http') -var vary = require('vary') - -http.createServer(function onRequest(req, res) { - // about to user-agent sniff - vary(res, 'User-Agent') - - var ua = req.headers['user-agent'] || '' - var isMobile = /mobi|android|touch|mini/i.test(ua) - - // serve site, depending on isMobile - res.setHeader('Content-Type', 'text/html') - res.end('You are (probably) ' + (isMobile ? '' : 'not ') + 'a mobile user') -}) -``` - -## Testing - -```sh -$ npm test -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/vary.svg -[npm-url]: https://npmjs.org/package/vary -[node-version-image]: https://img.shields.io/node/v/vary.svg -[node-version-url]: http://nodejs.org/download/ -[travis-image]: https://img.shields.io/travis/jshttp/vary/master.svg -[travis-url]: https://travis-ci.org/jshttp/vary -[coveralls-image]: https://img.shields.io/coveralls/jshttp/vary/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/vary -[downloads-image]: https://img.shields.io/npm/dm/vary.svg -[downloads-url]: https://npmjs.org/package/vary diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/index.js deleted file mode 100644 index e818dbb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/index.js +++ /dev/null @@ -1,117 +0,0 @@ -/*! - * vary - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module exports. - */ - -module.exports = vary; -module.exports.append = append; - -/** - * Variables. - */ - -var separators = /[\(\)<>@,;:\\"\/\[\]\?=\{\}\u0020\u0009]/; - -/** - * Append a field to a vary header. - * - * @param {String} header - * @param {String|Array} field - * @return {String} - * @api public - */ - -function append(header, field) { - if (typeof header !== 'string') { - throw new TypeError('header argument is required'); - } - - if (!field) { - throw new TypeError('field argument is required'); - } - - // get fields array - var fields = !Array.isArray(field) - ? parse(String(field)) - : field; - - // assert on invalid fields - for (var i = 0; i < fields.length; i++) { - if (separators.test(fields[i])) { - throw new TypeError('field argument contains an invalid header'); - } - } - - // existing, unspecified vary - if (header === '*') { - return header; - } - - // enumerate current values - var val = header; - var vals = parse(header.toLowerCase()); - - // unspecified vary - if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { - return '*'; - } - - for (var i = 0; i < fields.length; i++) { - var fld = fields[i].toLowerCase(); - - // append value (case-preserving) - if (vals.indexOf(fld) === -1) { - vals.push(fld); - val = val - ? val + ', ' + fields[i] - : fields[i]; - } - } - - return val; -} - -/** - * Parse a vary header into an array. - * - * @param {String} header - * @return {Array} - * @api private - */ - -function parse(header) { - return header.trim().split(/ *, */); -} - -/** - * Mark that a request is varied on a header field. - * - * @param {Object} res - * @param {String|Array} field - * @api public - */ - -function vary(res, field) { - if (!res || !res.getHeader || !res.setHeader) { - // quack quack - throw new TypeError('res argument is required'); - } - - // get existing header - var val = res.getHeader('Vary') || '' - var header = Array.isArray(val) - ? val.join(', ') - : String(val); - - // set new header - if ((val = append(header, field))) { - res.setHeader('Vary', val); - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/package.json deleted file mode 100644 index 1a508fe..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/node_modules/vary/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "vary", - "description": "Manipulate the HTTP Vary header", - "version": "1.0.1", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "http", - "res", - "vary" - ], - "repository": { - "type": "git", - "url": "https://github.com/jshttp/vary" - }, - "devDependencies": { - "istanbul": "0.3.17", - "mocha": "2.2.5", - "supertest": "1.0.1" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "650282ff8e614731837040a23e10f51c20728392", - "bugs": { - "url": "https://github.com/jshttp/vary/issues" - }, - "homepage": "https://github.com/jshttp/vary", - "_id": "vary@1.0.1", - "_shasum": "99e4981566a286118dfb2b817357df7993376d10", - "_from": "vary@>=1.0.1 <1.1.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "99e4981566a286118dfb2b817357df7993376d10", - "tarball": "http://registry.npmjs.org/vary/-/vary-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/package.json deleted file mode 100644 index 16f99ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express/package.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "name": "express", - "description": "Fast, unopinionated, minimalist web framework", - "version": "4.13.3", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Aaron Heckmann", - "email": "aaron.heckmann+github@gmail.com" - }, - { - "name": "Ciaran Jessup", - "email": "ciaranj@gmail.com" - }, - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Guillermo Rauch", - "email": "rauchg@gmail.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com" - }, - { - "name": "Roman Shtylman", - "email": "shtylman+expressjs@gmail.com" - }, - { - "name": "Young Jae Sim", - "email": "hanul@hanul.me" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/strongloop/express" - }, - "homepage": "http://expressjs.com/", - "keywords": [ - "express", - "framework", - "sinatra", - "web", - "rest", - "restful", - "router", - "app", - "api" - ], - "dependencies": { - "accepts": "~1.2.12", - "array-flatten": "1.1.1", - "content-disposition": "0.5.0", - "content-type": "~1.0.1", - "cookie": "0.1.3", - "cookie-signature": "1.0.6", - "debug": "~2.2.0", - "depd": "~1.0.1", - "escape-html": "1.0.2", - "etag": "~1.7.0", - "finalhandler": "0.4.0", - "fresh": "0.3.0", - "merge-descriptors": "1.0.0", - "methods": "~1.1.1", - "on-finished": "~2.3.0", - "parseurl": "~1.3.0", - "path-to-regexp": "0.1.7", - "proxy-addr": "~1.0.8", - "qs": "4.0.0", - "range-parser": "~1.0.2", - "send": "0.13.0", - "serve-static": "~1.10.0", - "type-is": "~1.6.6", - "utils-merge": "1.0.0", - "vary": "~1.0.1" - }, - "devDependencies": { - "after": "0.8.1", - "ejs": "2.3.3", - "istanbul": "0.3.17", - "marked": "0.3.5", - "mocha": "2.2.5", - "should": "7.0.2", - "supertest": "1.0.1", - "body-parser": "~1.13.3", - "connect-redis": "~2.4.1", - "cookie-parser": "~1.3.5", - "cookie-session": "~1.2.0", - "express-session": "~1.11.3", - "jade": "~1.11.0", - "method-override": "~2.3.5", - "morgan": "~1.6.1", - "multiparty": "~4.1.2", - "vhost": "~3.0.1" - }, - "engines": { - "node": ">= 0.10.0" - }, - "files": [ - "LICENSE", - "History.md", - "Readme.md", - "index.js", - "lib/" - ], - "scripts": { - "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/", - "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/", - "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/" - }, - "gitHead": "ef7ad681b245fba023843ce94f6bcb8e275bbb8e", - "bugs": { - "url": "https://github.com/strongloop/express/issues" - }, - "_id": "express@4.13.3", - "_shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3", - "_from": "express@*", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "rfeng", - "email": "enjoyjava@gmail.com" - }, - { - "name": "aredridel", - "email": "aredridel@dinhe.net" - }, - { - "name": "strongloop", - "email": "callback@strongloop.com" - }, - { - "name": "defunctzombie", - "email": "shtylman@gmail.com" - } - ], - "dist": { - "shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3", - "tarball": "http://registry.npmjs.org/express/-/express-4.13.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/express/-/express-4.13.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/.npmignore deleted file mode 100644 index 1ca9571..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -npm-debug.log diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/HISTORY.md deleted file mode 100644 index 00bf0ad..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/HISTORY.md +++ /dev/null @@ -1,189 +0,0 @@ -Express3 Handlebars Change History -================================== - -0.5.1 (2014-08-05) ------------------- - -* __[!]__ Last release before `v1.0` which will have breaking changes. - -* Improved `extname` docs in README and added example. ([#30][] @Crashthatch) - -* `extname` can now be specified _without_ the leading `"."`. - ([#51][] @calvinmetcalf) - - -[#30]: https://github.com/ericf/express3-handlebars/issues/30 -[#51]: https://github.com/ericf/express3-handlebars/issues/51 - - -0.5.0 (2013-07-25) ------------------- - -* Added `loadTemplates()` method which will load all the templates in a - specified directory. ([#21][]) - -* Added support for multiple partials directories. This enables the - `partialsDir` configuration property to be specified as an *array* of - directories, and loads all of the templates in each one. - - This feature allows an app's partials to be split up in multiple directories, - which is common if an app has some shared partials which will also be exposed - to the client, and some server-side-only partials. ([#20][]) - -* Added runnable code examples in this package's "examples/" directory. - ([#22][]) - -* Improved optional argument handling in public methods to treat Express - `locals` function objects as `options` and not `callback` params to the method - being invoked. ([#27][]) - - -[#20]: https://github.com/ericf/express3-handlebars/issues/20 -[#21]: https://github.com/ericf/express3-handlebars/issues/21 -[#22]: https://github.com/ericf/express3-handlebars/issues/22 -[#27]: https://github.com/ericf/express3-handlebars/issues/27 - - -0.4.1 (2013-04-06) ------------------- - -* Updated `async` dependency to the latest stable minor version: "~0.2". - - -0.4.0 (2013-03-24) ------------------- - -* __[!]__ Removed the following "get" -> "load" aliases which kept in v0.2.0 for - back-compat: - - * `getPartials()` -> `loadPartials()` - * `getTemplate()` -> `loadTemplate()` - - This is the future version where these aliases have been removed. - -* __[!]__ Renamed `lib/express3-handlebars.js` -> `lib/express-handlebars.js`. - -* Exposed `getHandlebarsSemver()` function as a static property on the - `ExpressHandlebars` constructor. - -* Rearranged module exports by moving the engine factory function to `index.js`, - making the `lib/express3-handlebars.js` module only responsible for exporting - the `ExpressHandlebars` constructor. - - -0.3.3 (2013-03-22) ------------------- - -* Updated internal `_resolveLayoutPath()` method to take the full - `options`/locals objects which the view is rendered with. This makes it easier - to override. ([#14][]) - - -[#14]: https://github.com/ericf/express3-handlebars/issues/14 - - -0.3.2 (2013-02-20) ------------------- - -* Transfered ownership and copyright to Yahoo! Inc. This software is still free - to use, and is now licensed under the Yahoo! Inc. BSD license. - - -0.3.1 (2013-02-18) ------------------- - -* Updated README with info about `options.helpers` for `render()` and - `renderView()` docs. ([#7][]) - - -[#7]: https://github.com/ericf/express3-handlebars/issues/7 - - -0.3.0 (2013-02-18) ------------------- - -* Added support for render-level helpers, via `options.helpers`, to the - `render()` and `renderView()` methods. Handlebars' `registerHelper()` function - now works as expected and does not have to be called before the - `ExpressHandlebars` instance is created. Helpers are now merged from: - `handlebars.helpers` (global), `helpers` (instance), and `options.helpers` - (render-level) before a template is rendered; this provides flexibility at - all levels. ([#3][], [#11][]) - -* Added `handlebarsVersion` property which is the version number of `handlebars` - as a semver. This is used internally to branch on certain operations which - differ between Handlebars releases. - - -[#3]: https://github.com/ericf/express3-handlebars/issues/3 -[#11]: https://github.com/ericf/express3-handlebars/issues/11 - - -0.2.3 (2013-02-13) ------------------- - -* Fixed issue with naming nested partials when using the latest version of - Handlebars (1.0.rc.2). Previous versions require a hack to replace "/"s with - "."s in partial names, and the latest version of Handlebars fixes that bug. - This hack will only be applied to old versions of Handlebars. ([#9][]) - - -[#9]: https://github.com/ericf/express3-handlebars/issues/9 - - -0.2.2 (2013-02-04) ------------------- - -* Updated README with the public method renames which happened v0.2.0. - - -0.2.1 (2013-02-04) ------------------- - -* `extname`, `layoutsDir`, and `partialsDir` property values will now reference - the values on the prototype unless an `ExpressHandlebars` instance is - constructed with config values for these properties. - -* Improved clarity of method implementations, and exposed more override "hooks" - via new private methods: `_getPartialName()`, `_renderTemplate()`, and - `_resolveLayoutPath()`. - - -0.2.0 (2013-02-01) ------------------- - -* __[!]__ Renamed methods prefixed with "get" to "load" for clarity: - - * `getPartials()` -> `loadPartials()` - * `getTemplate()` -> `loadTemplate()` - - Aliases for these methods have been created to maintain back-compat, but the - old method names are now deprecated will be removed in the future. ([#5][]) - -* All paths are resolved before checking in or adding to caches. ([#1][]) - -* Force `{precompiled: false}` option within `render()` and `renderView()` - methods to prevent trying to render with precompiled templates. ([#2][]) - - -[#1]: https://github.com/ericf/express3-handlebars/issues/1 -[#2]: https://github.com/ericf/express3-handlebars/issues/2 -[#5]: https://github.com/ericf/express3-handlebars/issues/5 - - -0.1.2 (2013-01-10) ------------------- - -* Tweaked formatting of README documentation. - - -0.1.1 (2013-01-10) ------------------- - -* Added README documentation. - - -0.1.0 (2013-01-07) ------------------- - -* Initial release. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/LICENSE deleted file mode 100644 index 6fd9545..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright 2013 Yahoo! Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the Yahoo! Inc. nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/README.md deleted file mode 100644 index 28343bb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/README.md +++ /dev/null @@ -1,642 +0,0 @@ -RENAMED TO: `express-handlebars` -================================ - -**This package has been renamed to [`express-handlebars`][new-npm], be sure to -update your `package.json` files.** - -See: - -[new-npm]: https://www.npmjs.org/package/express-handlebars - ----- - -Express3 Handlebars -=================== - -A [Handlebars][] view engine for [Express][] which doesn't suck. - -[![Dependency Status](https://david-dm.org/ericf/express3-handlebars.png)][status] - - -[Express]: https://github.com/visionmedia/express -[Handlebars]: https://github.com/wycats/handlebars.js -[status]: https://david-dm.org/ericf/express3-handlebars - - -Goals & Design --------------- - -I created this project out of frustration with the existing Handlebars view -engines for Express. As of version 3.x, Express got out of the business of being -a generic view engine — this was a great decision — leaving developers to -implement the concepts of layouts, partials, and doing file I/O for their -template engines of choice. - -### Goals and Features - -After building a half-dozen Express apps, I developed requirements and opinions -about what a Handlebars view engine should provide and how it should be -implemented. The following is that list: - -* Add back the concept of "layout", which was removed in Express 3.x. - -* Add back the concept of "partials" via Handlebars' partials mechanism. - -* Support a directory of partials; e.g., `{{> foo/bar}}` which exists on the - file system at `views/partials/foo/bar.handlebars` by default. - -* Smart file system I/O and template caching. When in development, templates are - always loaded from disk. In production, raw files and compiled templates are - cached, including partials. - -* All async and non-blocking. File system I/O is slow and servers should not be - blocked from handling requests while reading from disk. I/O queuing is used to - avoid doing unnecessary work. - -* Ability to expose precompiled templates and partials to the client, enabling - template sharing and reuse. - -* Ability to use a different Handlebars module/implementation other than the - Handlebars npm package. - -### Package Design - -This package was designed to work great for both the simple and complex use -cases. I _intentionally_ made sure the full implementation is exposed and is -easily overrideable. - -The package exports a function which can be invoked with no arguments or with a -`config` object and it will return a function (closed over sane defaults) which -can be registered with an Express app. It's an engine factory function. - -This exported engine factory has two properties which expose the underlying -implementation: - -* `ExpressHandlebars()`: The constructor function which holds the internal - implementation on its `prototype`. This produces instance objects which store - their configuration, `compiled` and `precompiled` templates, and expose an - `engine()` function which can be registered with an Express app. - -* `create()`: A convenience factory function for creating `ExpressHandlebars` - instances. - -An instance-based approach is used so that multiple `ExpressHandlebars` -instances can be created with their own configuration, templates, partials, and -helpers. - - -Installation ------------- - -Install using npm: - -```shell -$ npm install express3-handlebars -``` - - -Usage ------ - -This view engine uses sane defaults that leverage the "Express-way" of -structuring an app's views. This makes it trivial to use in basic apps: - -### Basic Usage - -**Directory Structure:** - -``` -. -├── app.js -└── views - ├── home.handlebars - └── layouts - └── main.handlebars - -2 directories, 3 files -``` - -**app.js:** - -Creates a super simple Express app which shows the basic way to register a -Handlebars view engine using this package. - -```javascript -var express = require('express'), - exphbs = require('express3-handlebars'), - - app = express(); - -app.engine('handlebars', exphbs({defaultLayout: 'main'})); -app.set('view engine', 'handlebars'); - -app.get('/', function (req, res) { - res.render('home'); -}); - -app.listen(3000); -``` - -**views/layouts/main.handlebars:** - -The main layout is the HTML page wrapper which can be reused for the different -views of the app. `{{{body}}}` is used as a placeholder for where the main -content should be rendered. - -```html - - - - - Example App - - - - {{{body}}} - - - -``` - -**views/home.handlebars:** - -The content for the app's home view which will be rendered into the layout's -`{{{body}}}`. - -```html -

Example App: Home

-``` - -#### Running the Example - -The above example is bundled in this package's [examples directory][], where -it can be run by: - -```shell -$ cd examples/basic/ && node app -``` - -### Using Instances - -Another way to use this view engine is to create an instance(s) of -`ExpressHandlebars`, allowing access to the full API: - -```javascript -var express = require('express'), - exphbs = require('express3-handlebars'), - - app = express(), - hbs = exphbs.create({ /* config */ }); - -// Register `hbs.engine` with the Express app. -app.engine('handlebars', hbs.engine); -app.set('view engine', 'handlebars'); - -// ...still have a reference to `hbs`, on which methods like `loadPartials()` -// can be called. -``` - -**Note:** The [Advanced Usage][] example demonstrates how `ExpressHandlebars` -instances can be leveraged. - -### Template Caching - -This view engine uses a smart template caching strategy. In development, -templates will always be loaded from disk, i.e., no caching. In production, raw -files and compiled Handlebars templates are aggressively cached. - -The easiest way to control template/view caching is through Express' -[view cache setting][]: - -```javascript -app.enable('view cache'); -``` - -Express enables this setting by default when in production mode, i.e., -`process.env.NODE_ENV === "production"`. - -**Note:** All of the public API methods accept `options.cache`, which gives -control over caching when calling these methods directly. - -### Layouts - -A layout is simply a Handlebars template with a `{{{body}}}` placeholder. -Usually it will be an HTML page wrapper into which views will be rendered. - -This view engine adds back the concept of "layout", which was removed in Express -3.x. It can be configured with a path to the layouts directory, by default it's -set to `"views/layouts/"`. - -There are two ways to set a default layout: configuring the view engine's -`defaultLayout` property, or setting [Express locals][] `app.locals.layout`. - -The layout into which a view should be rendered can be overridden per-request -by assigning a different value to the `layout` request local. The following -will render the "home" view with no layout: - -```javascript -app.get('/', function (req, res, next) { - res.render('home', {layout: false}); -}); -``` - -### Helpers - -Helper functions, or "helpers" are functions that can be -[registered with Handlebars][] and can be called within a template. Helpers can -be used for transforming output, iterating over data, etc. To keep with the -spirit of *logic-less* templates, helpers are the place where logic should be -defined. - -Handlebars ships with some [built-in helpers][], such as: `with`, `if`, `each`, -etc. Most application will need to extend this set of helpers to include -app-specific logic and transformations. Beyond defining global helpers on -`Handlebars`, this view engine supports `ExpressHandlebars` instance-level -helpers via the `helpers` configuration property, and render-level helpers via -`options.helpers` when calling the `render()` and `renderView()` methods. - -The following example shows helpers being specified at each level: - -**app.js:** - -Creates a super simple Express app which shows the basic way to register -`ExpressHandlebars` instance-level helpers, and override one at the -render-level. - -```javascript -var express = require('express'), - exphbs = require('express3-handlebars'), - - app = express(), - hbs; - -hbs = exphbs.create({ - // Specify helpers which are only registered on this instance. - helpers: { - foo: function () { return 'FOO!'; }, - bar: function () { return 'BAR!'; } - } -}); - -app.engine('handlebars', hbs.engine); -app.set('view engine', 'handlebars'); - -app.get('/', function (req, res, next) { - res.render('home', { - showTitle: true, - - // Override `foo` helper only for this rendering. - helpers: { - foo: function () { return 'foo.'; } - } - }); -}); - -app.listen(3000); -``` - -**views/home.handlebars:** - -The app's home view which uses helper functions to help render the contents. - -```html - - - - - Example App - Home - - - - - {{#if showTitle}} -

Home

- {{/if}} - - -

{{foo}}

- - -

{{bar}}

- - - -``` - -#### More on Helpers - -Refer to the [Handlebars website][] for more information on defining helpers: - -* [Expression Helpers][] -* [Block Helpers][] - - -[examples directory]: https://github.com/ericf/express3-handlebars/tree/master/examples -[view cache setting]: http://expressjs.com/api.html#app-settings -[Express locals]: http://expressjs.com/api.html#app.locals -[registered with Handlebars]: https://github.com/wycats/handlebars.js/#registering-helpers -[built-in helpers]: http://handlebarsjs.com/#builtins -[Handlebars website]: http://handlebarsjs.com/ -[Expression Helpers]: http://handlebarsjs.com/expressions.html#helpers -[Block Helpers]: http://handlebarsjs.com/block_helpers.html - - -API ---- - -### Configuration and Defaults - -There are two main ways to use this package: via its engine factory function, or -creating `ExpressHandlebars` instances; both use the same configuration -properties and defaults. - -```javascript -var exphbs = require('express3-handlebars'); - -// Using the engine factory: -exphbs({ /* config */ }); - -// Create an instance: -exphbs.create({ /* config */ }); -``` - -The following is the list of configuration properties and their default values -(if any): - -#### `defaultLayout` -The string name or path of a template in the `layoutsDir` to use as the default -layout. This is overridden by a `layout` specified in the app or response -`locals`. **Note:** A falsy value will render without a layout; e.g., -`res.render('home', {layout: false});`. - -#### `extname=".handlebars"` -The string name of the file extension used by the templates. This value should -correspond with the `extname` under which this view engine is registered with -Express when calling `app.engine()`. - -The following example sets up an Express app to use `.hbs` as the file extension -for views: - -```javascript -var express = require('express'), - exphbs = require('express3-handlebars'), - - app = express(); - -app.engine('.hbs', exphbs({extname: '.hbs'})); -app.set('view engine', '.hbs'); -``` - -**Note:** Setting the app's `"view engine"` setting will make that value the -default file extension used for looking up views. - -#### `handlebars=require('handlebars')` -The Handlebars module/implementation. This allows for the `ExpressHandlebars` -instance to use a different Handlebars module/implementation than that provided -by the Handlebars npm package. - -#### `helpers` -An object which holds the helper functions used when rendering templates with -this `ExpressHandlebars` instance. When rendering a template, a collection of -helpers will be generated by merging: `handlebars.helpers` (global), `helpers` -(instance), and `options.helpers` (render-level). This allows Handlebars' -`registerHelper()` function to operate as expected, will providing two extra -levels over helper overrides. - -#### `layoutsDir="views/layouts/"` -The string path to the directory where the layout templates reside. - -#### `partialsDir="views/partials/"` -The string path to the directory where the partials templates reside. - -### Properties - -The public API properties are provided via `ExpressHandlebars` instances. In -additional to the properties listed in the **Configuration and Defaults** -section, the following are additional public properties: - -#### `compiled` -An object cache which holds compiled Handlebars template functions in the -format: `{"path/to/template": [Function]}`. - -#### `engine` -A function reference to the `renderView()` method which is bound to `this` -`ExpressHandlebars` instance. This bound function should be used when -registering this view engine with an Express app. - -#### `handlebarsVersion` -The version number of `handlebars` as a semver. This is unsed internally to -branch on certain operations which differ between Handlebars releases. - -#### `precompiled` -An object cache which holds precompiled Handlebars template strings in the -format: `{"path/to/template": [String]}`. - -### Methods - -The following is the list of public API methods provided via `ExpressHandlebars` -instances: - -#### `loadPartials(options|callback, [callback])` - -Retrieves the partials in the `partialsDir` and passes an object mapping the -partials in the form `{name: partial}` to the `callback`. - -By default each partial will be a compiled Handlebars template function. Use -`options.precompiled` to receive the partials as precompiled templates — this is -useful for sharing templates with client code. - -**Parameters:** - -* `[options]`: Optional object containing any of the following properties: - - * `[cache]`: Whether cached templates can be used if they have already been - requested. This is recommended for production to avoid unnecessary file I/O. - - * `[precompiled=false]`: Whether precompiled templates should be provided, - instead of compiled Handlebars template functions. - -* `callback`: Function to call once the partials are retrieved. - -The name of each partial corresponds to its location in `partialsDir`. For -example, consider the following directory structure: - -``` -views -└── partials - ├── foo - │   └── bar.handlebars - └── title.handlebars - -2 directories, 2 files -``` - -`loadPartials()` would produce the following result: - -```javascript -var hbs = require('express3-handlebars').create(); - -hbs.loadPartials(function (err, partials) { - console.log(partials); - // => { 'foo.bar': [Function], - // => title: [Function] } -}); -``` - -**Note:** The partial name `"foo.bar"` would ideally be `"foo/bar"`, but this is -being prevented by a [Handlebars bug][]. Once this bug is fixed, a future -version will use a "/" separator. Templates requiring the partial still use: -`{{> foo/bar}}`. - -#### `loadTemplate(filePath, options|callback, [callback])` - -Retrieves the template at the specified `filePath` and passes a compiled -Handlebars template function to the `callback`. - -Use `options.precompiled` to receive a precompiled Handlebars template. - -**Parameters:** - -* `filePath`: String path to the Handlebars template file. - -* `[options]`: Optional object containing any of the following properties: - - * `[cache]`: Whether a cached template can be used if it have already been - requested. This is recommended for production to avoid necessary file I/O. - - * `[precompiled=false]`: Whether a precompiled template should be provided, - instead of a compiled Handlebars template function. - -* `callback`: Function to call once the template is retrieved. - -#### `loadTemplates(dirPath, options|callback, [callback])` - -Retrieves the all the templates in the specified `dirPath` and passes an object -mapping the compiled templates in the form `{filename: template}` to the -`callback`. - -Use `options.precompiled` to receive precompiled Handlebars templates — this is -useful for sharing templates with client code. - -**Parameters:** - -* `dirPath`: String path to the directory containing Handlebars template files. - -* `[options]`: Optional object containing any of the following properties: - - * `[cache]`: Whether cached templates can be used if it have already been - requested. This is recommended for production to avoid necessary file I/O. - - * `[precompiled=false]`: Whether precompiled templates should be provided, - instead of a compiled Handlebars template function. - -* `callback`: Function to call once the templates are retrieved. - -#### `render(filePath, options|callback, [callback])` - -Renders the template at the specified `filePath` using this instance's `helpers` -and partials, and passes the resulting string to the `callback`. - -The `options` will be used both as the context in which the Handlebars template -is rendered, and to signal this view engine on how it should behave, e.g., -`options.cache = false` will load _always_ load the templates from disk. - -**Parameters:** - -* `filePath`: String path to the Handlebars template file. - -* `[options]`: Optional object which will serve as the context in which the - Handlebars template is rendered. It may also contain any of the following - properties which affect this view engine's behavior: - - * `[cache]`: Whether a cached template can be used if it have already been - requested. This is recommended for production to avoid unnecessary file I/O. - - * `[helpers]`: Render-level helpers should be merged with (and will override) - instance and global helper functions. - -* `callback`: Function to call once the template is retrieved. - -#### `renderView(viewPath, options|callback, [callback])` - -Renders the template at the specified `viewPath` as the `{{{body}}}` within the -layout specified by the `defaultLayout` or `options.layout`. Rendering will use -this instance's `helpers` and partials, and passes the resulting string to the -`callback`. - -This method is called by Express and is the main entry point into this Express -view engine implementation. It adds the concept of a "layout" and delegates -rendering to the `render()` method. - -The `options` will be used both as the context in which the Handlebars templates -are rendered, and to signal this view engine on how it should behave, e.g., -`options.cache=false` will load _always_ load the templates from disk. - -**Parameters:** - -* `viewPath`: String path to the Handlebars template file which should serve as - the `{{{body}}}` when using a layout. - -* `[options]`: Optional object which will serve as the context in which the - Handlebars templates are rendered. It may also contain any of the following - properties which affect this view engine's behavior: - - * `[cache]`: Whether cached templates can be used if they have already been - requested. This is recommended for production to avoid unnecessary file I/O. - - * `[helpers]`: Render-level helpers should be merged with (and will override) - instance and global helper functions. - - * `[layout]`: Optional string path to the Handlebars template file to be used - as the "layout". This overrides any `defaultLayout` value. Passing a falsy - value will render with no layout (even if a `defaultLayout` is defined). - -* `callback`: Function to call once the template is retrieved. - -### Statics - -The following is the list of static API properties and methods provided on the -`ExpressHandlebars` constructor: - -#### `getHandlebarsSemver(handlebars)` - -Returns a semver-compatible version string for the specified `handlebars` -module/implementation. - -This utility function is used to compute the value for an `ExpressHandlebars` -instance's `handlebarsVersion` property. - - -[Handlebars bug]: https://github.com/wycats/handlebars.js/pull/389 - - -Examples --------- - -### [Basic Usage][] - -This example shows the most basic way to use this view engine. - -### [Advanced Usage][] - -This example is more comprehensive and shows how to use many of the features of -this view engine, including helpers, partials, multiple layouts, etc. - -As noted in the **Package Design** section, this view engine's implementation is -instance-based, and more advanced usages can take advantage of this. The -Advanced Usage example demonstrates how to use an `ExpressHandlebars` instance -to share templates with the client, among other features. - - -[Basic Usage]: https://github.com/ericf/express3-handlebars/tree/master/examples/basic -[Advanced Usage]: https://github.com/ericf/express3-handlebars/tree/master/examples/advanced - - -License -------- - -This software is free to use under the Yahoo! Inc. BSD license. -See the [LICENSE file][] for license text and copyright information. - - -[LICENSE file]: https://github.com/ericf/express3-handlebars/blob/master/LICENSE diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/app.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/app.js deleted file mode 100644 index 2b7d8ae..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/app.js +++ /dev/null @@ -1,99 +0,0 @@ -var express = require('express'), - exphbs = require('../../'), // "express3-handlebars" - helpers = require('./lib/helpers'), - - app = express(), - hbs; - -// Create `ExpressHandlebars` instance with a default layout. -hbs = exphbs.create({ - defaultLayout: 'main', - helpers : helpers, - - // Uses multiple partials dirs, templates in "shared/templates/" are shared - // with the client-side of the app (see below). - partialsDir: [ - 'shared/templates/', - 'views/partials/' - ] -}); - -// Register `hbs` as our view engine using its bound `engine()` function. -app.engine('handlebars', hbs.engine); -app.set('view engine', 'handlebars'); - -// Middleware to expose the app's shared templates to the cliet-side of the app -// for pages which need them. -function exposeTemplates(req, res, next) { - // Uses the `ExpressHandlebars` instance to get the get the **precompiled** - // templates which will be shared with the client-side of the app. - hbs.loadTemplates('shared/templates/', { - cache : app.enabled('view cache'), - precompiled: true - }, function (err, templates) { - if (err) { return next(err); } - - // RegExp to remove the ".handlebars" extension from the template names. - var extRegex = new RegExp(hbs.extname + '$'); - - // Creates an array of templates which are exposed via - // `res.locals.templates`. - templates = Object.keys(templates).map(function (name) { - return { - name : name.replace(extRegex, ''), - template: templates[name] - }; - }); - - // Exposes the templates during view rendering. - if (templates.length) { - res.locals.templates = templates; - } - - next(); - }); -} - -app.get('/', function (req, res) { - res.render('home', { - title: 'Home' - }); -}); - -app.get('/yell', function (req, res) { - res.render('yell', { - title: 'Yell', - - // This `message` will be transformed by our `yell()` helper. - message: 'hello world' - }); -}); - -app.get('/exclaim', function (req, res) { - res.render('yell', { - title : 'Exclaim', - message: 'hello world', - - // This overrides _only_ the default `yell()` helper. - helpers: { - yell: function (msg) { - return (msg + '!!!'); - } - } - }); -}); - -app.get('/echo/:message?', exposeTemplates, function (req, res) { - res.render('echo', { - title : 'Echo', - message: req.params.message, - - // Overrides which layout to use, instead of the defaul "main" layout. - layout: 'shared-templates' - }); -}); - -app.use(express.static('public/')); -app.listen(3000); - -console.log('express3-handlebars example server listening on: 3000'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/lib/helpers.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/lib/helpers.js deleted file mode 100644 index 7f36cf6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/lib/helpers.js +++ /dev/null @@ -1,3 +0,0 @@ -exports.yell = function (msg) { - return msg.toUpperCase(); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/.npmignore deleted file mode 100644 index 52fcd60..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/.npmignore +++ /dev/null @@ -1,11 +0,0 @@ -.git* -benchmarks/ -coverage/ -docs/ -examples/ -support/ -test/ -testing.js -.DS_Store -.travis.yml -Contributing.md diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/History.md deleted file mode 100644 index ad56b36..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/History.md +++ /dev/null @@ -1,1924 +0,0 @@ -4.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - * deps: serve-static@~1.4.2 - -4.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - * deps: serve-static@~1.4.1 - -4.7.0 / 2014-07-25 -================== - - * fix `req.protocol` for proxy-direct connections - * configurable query parser with `app.set('query parser', parser)` - - `app.set('query parser', 'extended')` parse with "qs" module - - `app.set('query parser', 'simple')` parse with "querystring" core module - - `app.set('query parser', false)` disable query string parsing - - `app.set('query parser', true)` enable simple parsing - * deprecate `res.json(status, obj)` -- use `res.status(status).json(obj)` instead - * deprecate `res.jsonp(status, obj)` -- use `res.status(status).jsonp(obj)` instead - * deprecate `res.send(status, body)` -- use `res.status(status).send(body)` instead - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: finalhandler@0.1.0 - - Respond after request fully read - - deps: debug@1.0.4 - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - * deps: serve-static@~1.4.0 - - deps: parseurl@~1.2.0 - - deps: send@0.7.0 - * perf: prevent multiple `Buffer` creation in `res.send` - -4.6.1 / 2014-07-12 -================== - - * fix `subapp.mountpath` regression for `app.use(subapp)` - -4.6.0 / 2014-07-11 -================== - - * accept multiple callbacks to `app.use()` - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * catch errors in multiple `req.param(name, fn)` handlers - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * support non-string `path` in `app.use(path, fn)` - - supports array of paths - - supports `RegExp` - * router: fix optimization on router exit - * router: refactor location of `try` blocks - * router: speed up standard `app.use(fn)` - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: finalhandler@0.0.3 - - deps: debug@1.0.3 - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - * deps: path-to-regexp@0.1.3 - * deps: send@0.6.0 - - deps: debug@1.0.3 - * deps: serve-static@~1.3.2 - - deps: parseurl@~1.1.3 - - deps: send@0.6.0 - * perf: fix arguments reassign deopt in some `res` methods - -4.5.1 / 2014-07-06 -================== - - * fix routing regression when altering `req.method` - -4.5.0 / 2014-07-04 -================== - - * add deprecation message to non-plural `req.accepts*` - * add deprecation message to `res.send(body, status)` - * add deprecation message to `res.vary()` - * add `headers` option to `res.sendfile` - - use to set headers on successful file transfer - * add `mergeParams` option to `Router` - - merges `req.params` from parent routes - * add `req.hostname` -- correct name for what `req.host` returns - * deprecate things with `depd` module - * deprecate `req.host` -- use `req.hostname` instead - * fix behavior when handling request without routes - * fix handling when `route.all` is only route - * invoke `router.param()` only when route matches - * restore `req.params` after invoking router - * use `finalhandler` for final response handling - * use `media-typer` to alter content-type charset - * deps: accepts@~1.0.7 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - * deps: serve-static@~1.3.0 - - Accept string for `maxAge` (converted by `ms`) - - Add `setHeaders` option - - Include HTML link in redirect response - - deps: send@0.5.0 - * deps: type-is@~1.3.2 - -4.4.5 / 2014-06-26 -================== - - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -4.4.4 / 2014-06-20 -================== - - * fix `res.attachment` Unicode filenames in Safari - * fix "trim prefix" debug message in `express:router` - * deps: accepts@~1.0.5 - * deps: buffer-crc32@0.2.3 - -4.4.3 / 2014-06-11 -================== - - * fix persistence of modified `req.params[name]` from `app.param()` - * deps: accepts@1.0.3 - - deps: negotiator@0.4.6 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - * deps: serve-static@1.2.3 - - Do not throw un-catchable error on file open race condition - - deps: send@0.4.3 - -4.4.2 / 2014-06-09 -================== - - * fix catching errors from top-level handlers - * use `vary` module for `res.vary` - * deps: debug@1.0.1 - * deps: proxy-addr@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - * deps: serve-static@1.2.2 - - fix "event emitter leak" warnings - - deps: send@0.4.2 - * deps: type-is@1.2.1 - -4.4.1 / 2014-06-02 -================== - - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - * deps: serve-static@1.2.1 - - use `escape-html` for escaping - - deps: send@0.4.1 - -4.4.0 / 2014-05-30 -================== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * mark `res.send` ETag as weak and reduce collisions - * update accepts to 1.0.2 - - Fix interpretation when header not in request - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - * update serve-static to 1.2.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: send@0.4.0 - -4.3.2 / 2014-05-28 -================== - - * fix handling of errors from `router.param()` callbacks - -4.3.1 / 2014-05-23 -================== - - * revert "fix behavior of multiple `app.VERB` for the same path" - - this caused a regression in the order of route execution - -4.3.0 / 2014-05-21 -================== - - * add `req.baseUrl` to access the path stripped from `req.url` in routes - * fix behavior of multiple `app.VERB` for the same path - * fix issue routing requests among sub routers - * invoke `router.param()` only when necessary instead of every match - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * set proper `charset` in `Content-Type` for `res.send` - * update type-is to 1.2.0 - - support suffix matching - -4.2.0 / 2014-05-11 -================== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * fix `req.next` when inside router instance - * include `ETag` header in `HEAD` requests - * keep previous `Content-Type` for `res.jsonp` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update debug to 0.8.0 - - add `enable()` method - - change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - -4.1.2 / 2014-05-08 -================== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -4.1.1 / 2014-04-27 -================== - - * fix package.json to reflect supported node version - -4.1.0 / 2014-04-24 -================== - - * pass options from `res.sendfile` to `send` - * preserve casing of headers in `res.header` and `res.set` - * support unicode file names in `res.attachment` and `res.download` - * update accepts to 1.0.1 - - deps: negotiator@0.4.0 - * update cookie to 0.1.2 - - Fix for maxAge == 0 - - made compat with expires field - * update send to 0.3.0 - - Accept API options in options object - - Coerce option types - - Control whether to generate etags - - Default directory access to 403 when index disabled - - Fix sending files with dots without root set - - Include file path in etag - - Make "Can't set headers after they are sent." catchable - - Send full entity-body for multi range requests - - Set etags to "weak" - - Support "If-Range" header - - Support multiple index paths - - deps: mime@1.2.11 - * update serve-static to 1.1.0 - - Accept options directly to `send` module - - Resolve relative paths at middleware setup - - Use parseurl to parse the URL from request - - deps: send@0.3.0 - * update type-is to 1.1.0 - - add non-array values support - - add `multipart` as a shorthand - -4.0.0 / 2014-04-09 -================== - - * remove: - - node 0.8 support - - connect and connect's patches except for charset handling - - express(1) - moved to [express-generator](https://github.com/expressjs/generator) - - `express.createServer()` - it has been deprecated for a long time. Use `express()` - - `app.configure` - use logic in your own app code - - `app.router` - is removed - - `req.auth` - use `basic-auth` instead - - `req.accepted*` - use `req.accepts*()` instead - - `res.location` - relative URL resolution is removed - - `res.charset` - include the charset in the content type when using `res.set()` - - all bundled middleware except `static` - * change: - - `app.route` -> `app.mountpath` when mounting an express app in another express app - - `json spaces` no longer enabled by default in development - - `req.accepts*` -> `req.accepts*s` - i.e. `req.acceptsEncoding` -> `req.acceptsEncodings` - - `req.params` is now an object instead of an array - - `res.locals` is no longer a function. It is a plain js object. Treat it as such. - - `res.headerSent` -> `res.headersSent` to match node.js ServerResponse object - * refactor: - - `req.accepts*` with [accepts](https://github.com/expressjs/accepts) - - `req.is` with [type-is](https://github.com/expressjs/type-is) - - [path-to-regexp](https://github.com/component/path-to-regexp) - * add: - - `app.router()` - returns the app Router instance - - `app.route()` - Proxy to the app's `Router#route()` method to create a new route - - Router & Route - public API - -3.15.2 / 2014-07-27 -=================== - - * deps: connect@2.24.2 - - deps: body-parser@~1.5.2 - - deps: depd@0.4.4 - - deps: express-session@~1.7.2 - - deps: morgan@~1.2.2 - - deps: serve-static@~1.4.2 - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - -3.15.1 / 2014-07-26 -=================== - - * deps: connect@2.24.1 - - deps: body-parser@~1.5.1 - - deps: depd@0.4.3 - - deps: express-session@~1.7.1 - - deps: morgan@~1.2.1 - - deps: serve-index@~1.1.4 - - deps: serve-static@~1.4.1 - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - -3.15.0 / 2014-07-22 -=================== - - * Fix `req.protocol` for proxy-direct connections - * Pass options from `res.sendfile` to `send` - * deps: connect@2.24.0 - - deps: body-parser@~1.5.0 - - deps: compression@~1.0.9 - - deps: connect-timeout@~1.2.1 - - deps: debug@1.0.4 - - deps: depd@0.4.2 - - deps: express-session@~1.7.0 - - deps: finalhandler@0.1.0 - - deps: method-override@~2.1.2 - - deps: morgan@~1.2.0 - - deps: multiparty@3.3.1 - - deps: parseurl@~1.2.0 - - deps: serve-static@~1.4.0 - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -3.14.0 / 2014-07-11 -=================== - - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * deps: basic-auth@1.0.0 - - support empty password - - support empty username - * deps: connect@2.23.0 - - deps: debug@1.0.3 - - deps: express-session@~1.6.4 - - deps: method-override@~2.1.0 - - deps: parseurl@~1.1.3 - - deps: serve-static@~1.3.1 - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -3.13.0 / 2014-07-03 -=================== - - * add deprecation message to `app.configure` - * add deprecation message to `req.auth` - * use `basic-auth` to parse `Authorization` header - * deps: connect@2.22.0 - - deps: csurf@~1.3.0 - - deps: express-session@~1.6.1 - - deps: multiparty@3.3.0 - - deps: serve-static@~1.3.0 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - -3.12.1 / 2014-06-26 -=================== - - * deps: connect@2.21.1 - - deps: cookie-parser@1.3.2 - - deps: cookie-signature@1.0.4 - - deps: express-session@~1.5.2 - - deps: type-is@~1.3.2 - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -3.12.0 / 2014-06-21 -=================== - - * use `media-typer` to alter content-type charset - * deps: connect@2.21.0 - - deprecate `connect(middleware)` -- use `app.use(middleware)` instead - - deprecate `connect.createServer()` -- use `connect()` instead - - fix `res.setHeader()` patch to work with with get -> append -> set pattern - - deps: compression@~1.0.8 - - deps: errorhandler@~1.1.1 - - deps: express-session@~1.5.0 - - deps: serve-index@~1.1.3 - -3.11.0 / 2014-06-19 -=================== - - * deprecate things with `depd` module - * deps: buffer-crc32@0.2.3 - * deps: connect@2.20.2 - - deprecate `verify` option to `json` -- use `body-parser` npm module instead - - deprecate `verify` option to `urlencoded` -- use `body-parser` npm module instead - - deprecate things with `depd` module - - use `finalhandler` for final response handling - - use `media-typer` to parse `content-type` for charset - - deps: body-parser@1.4.3 - - deps: connect-timeout@1.1.1 - - deps: cookie-parser@1.3.1 - - deps: csurf@1.2.2 - - deps: errorhandler@1.1.0 - - deps: express-session@1.4.0 - - deps: multiparty@3.2.9 - - deps: serve-index@1.1.2 - - deps: type-is@1.3.1 - - deps: vhost@2.0.0 - -3.10.5 / 2014-06-11 -=================== - - * deps: connect@2.19.6 - - deps: body-parser@1.3.1 - - deps: compression@1.0.7 - - deps: debug@1.0.2 - - deps: serve-index@1.1.1 - - deps: serve-static@1.2.3 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -3.10.4 / 2014-06-09 -=================== - - * deps: connect@2.19.5 - - fix "event emitter leak" warnings - - deps: csurf@1.2.1 - - deps: debug@1.0.1 - - deps: serve-static@1.2.2 - - deps: type-is@1.2.1 - * deps: debug@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: finished@1.2.1 - - deps: debug@1.0.1 - -3.10.3 / 2014-06-05 -=================== - - * use `vary` module for `res.vary` - * deps: connect@2.19.4 - - deps: errorhandler@1.0.2 - - deps: method-override@2.0.2 - - deps: serve-favicon@2.0.1 - * deps: debug@1.0.0 - -3.10.2 / 2014-06-03 -=================== - - * deps: connect@2.19.3 - - deps: compression@1.0.6 - -3.10.1 / 2014-06-03 -=================== - - * deps: connect@2.19.2 - - deps: compression@1.0.4 - * deps: proxy-addr@1.0.1 - -3.10.0 / 2014-06-02 -=================== - - * deps: connect@2.19.1 - - deprecate `methodOverride()` -- use `method-override` npm module instead - - deps: body-parser@1.3.0 - - deps: method-override@2.0.1 - - deps: multiparty@3.2.8 - - deps: response-time@2.0.0 - - deps: serve-static@1.2.1 - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -3.9.0 / 2014-05-30 -================== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * Include ETag in HEAD requests - * mark `res.send` ETag as weak and reduce collisions - * update connect to 2.18.0 - - deps: compression@1.0.3 - - deps: serve-index@1.1.0 - - deps: serve-static@1.2.0 - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - -3.8.1 / 2014-05-27 -================== - - * update connect to 2.17.3 - - deps: body-parser@1.2.2 - - deps: express-session@1.2.1 - - deps: method-override@1.0.2 - -3.8.0 / 2014-05-21 -================== - - * keep previous `Content-Type` for `res.jsonp` - * set proper `charset` in `Content-Type` for `res.send` - * update connect to 2.17.1 - - fix `res.charset` appending charset when `content-type` has one - - deps: express-session@1.2.0 - - deps: morgan@1.1.1 - - deps: serve-index@1.0.3 - -3.7.0 / 2014-05-18 -================== - - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * update connect to 2.16.2 - - deprecate `res.headerSent` -- use `res.headersSent` - - deprecate `res.on("header")` -- use on-headers module instead - - fix edge-case in `res.appendHeader` that would append in wrong order - - json: use body-parser - - urlencoded: use body-parser - - dep: bytes@1.0.0 - - dep: cookie-parser@1.1.0 - - dep: csurf@1.2.0 - - dep: express-session@1.1.0 - - dep: method-override@1.0.1 - -3.6.0 / 2014-05-09 -================== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update connect to 2.15.0 - * Add `res.appendHeader` - * Call error stack even when response has been sent - * Patch `res.headerSent` to return Boolean - * Patch `res.headersSent` for node.js 0.8 - * Prevent default 404 handler after response sent - * dep: compression@1.0.2 - * dep: connect-timeout@1.1.0 - * dep: debug@^0.8.0 - * dep: errorhandler@1.0.1 - * dep: express-session@1.0.4 - * dep: morgan@1.0.1 - * dep: serve-favicon@2.0.0 - * dep: serve-index@1.0.2 - * update debug to 0.8.0 - * add `enable()` method - * change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - * update mkdirp to 0.5.0 - -3.5.3 / 2014-05-08 -================== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -3.5.2 / 2014-04-24 -================== - - * update connect to 2.14.5 - * update cookie to 0.1.2 - * update mkdirp to 0.4.0 - * update send to 0.3.0 - -3.5.1 / 2014-03-25 -================== - - * pin less-middleware in generated app - -3.5.0 / 2014-03-06 -================== - - * bump deps - -3.4.8 / 2014-01-13 -================== - - * prevent incorrect automatic OPTIONS responses #1868 @dpatti - * update binary and examples for jade 1.0 #1876 @yossi, #1877 @reqshark, #1892 @matheusazzi - * throw 400 in case of malformed paths @rlidwka - -3.4.7 / 2013-12-10 -================== - - * update connect - -3.4.6 / 2013-12-01 -================== - - * update connect (raw-body) - -3.4.5 / 2013-11-27 -================== - - * update connect - * res.location: remove leading ./ #1802 @kapouer - * res.redirect: fix `res.redirect('toString') #1829 @michaelficarra - * res.send: always send ETag when content-length > 0 - * router: add Router.all() method - -3.4.4 / 2013-10-29 -================== - - * update connect - * update supertest - * update methods - * express(1): replace bodyParser() with urlencoded() and json() #1795 @chirag04 - -3.4.3 / 2013-10-23 -================== - - * update connect - -3.4.2 / 2013-10-18 -================== - - * update connect - * downgrade commander - -3.4.1 / 2013-10-15 -================== - - * update connect - * update commander - * jsonp: check if callback is a function - * router: wrap encodeURIComponent in a try/catch #1735 (@lxe) - * res.format: now includes chraset @1747 (@sorribas) - * res.links: allow multiple calls @1746 (@sorribas) - -3.4.0 / 2013-09-07 -================== - - * add res.vary(). Closes #1682 - * update connect - -3.3.8 / 2013-09-02 -================== - - * update connect - -3.3.7 / 2013-08-28 -================== - - * update connect - -3.3.6 / 2013-08-27 -================== - - * Revert "remove charset from json responses. Closes #1631" (causes issues in some clients) - * add: req.accepts take an argument list - -3.3.4 / 2013-07-08 -================== - - * update send and connect - -3.3.3 / 2013-07-04 -================== - - * update connect - -3.3.2 / 2013-07-03 -================== - - * update connect - * update send - * remove .version export - -3.3.1 / 2013-06-27 -================== - - * update connect - -3.3.0 / 2013-06-26 -================== - - * update connect - * add support for multiple X-Forwarded-Proto values. Closes #1646 - * change: remove charset from json responses. Closes #1631 - * change: return actual booleans from req.accept* functions - * fix jsonp callback array throw - -3.2.6 / 2013-06-02 -================== - - * update connect - -3.2.5 / 2013-05-21 -================== - - * update connect - * update node-cookie - * add: throw a meaningful error when there is no default engine - * change generation of ETags with res.send() to GET requests only. Closes #1619 - -3.2.4 / 2013-05-09 -================== - - * fix `req.subdomains` when no Host is present - * fix `req.host` when no Host is present, return undefined - -3.2.3 / 2013-05-07 -================== - - * update connect / qs - -3.2.2 / 2013-05-03 -================== - - * update qs - -3.2.1 / 2013-04-29 -================== - - * add app.VERB() paths array deprecation warning - * update connect - * update qs and remove all ~ semver crap - * fix: accept number as value of Signed Cookie - -3.2.0 / 2013-04-15 -================== - - * add "view" constructor setting to override view behaviour - * add req.acceptsEncoding(name) - * add req.acceptedEncodings - * revert cookie signature change causing session race conditions - * fix sorting of Accept values of the same quality - -3.1.2 / 2013-04-12 -================== - - * add support for custom Accept parameters - * update cookie-signature - -3.1.1 / 2013-04-01 -================== - - * add X-Forwarded-Host support to `req.host` - * fix relative redirects - * update mkdirp - * update buffer-crc32 - * remove legacy app.configure() method from app template. - -3.1.0 / 2013-01-25 -================== - - * add support for leading "." in "view engine" setting - * add array support to `res.set()` - * add node 0.8.x to travis.yml - * add "subdomain offset" setting for tweaking `req.subdomains` - * add `res.location(url)` implementing `res.redirect()`-like setting of Location - * use app.get() for x-powered-by setting for inheritance - * fix colons in passwords for `req.auth` - -3.0.6 / 2013-01-04 -================== - - * add http verb methods to Router - * update connect - * fix mangling of the `res.cookie()` options object - * fix jsonp whitespace escape. Closes #1132 - -3.0.5 / 2012-12-19 -================== - - * add throwing when a non-function is passed to a route - * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses - * revert "add 'etag' option" - -3.0.4 / 2012-12-05 -================== - - * add 'etag' option to disable `res.send()` Etags - * add escaping of urls in text/plain in `res.redirect()` - for old browsers interpreting as html - * change crc32 module for a more liberal license - * update connect - -3.0.3 / 2012-11-13 -================== - - * update connect - * update cookie module - * fix cookie max-age - -3.0.2 / 2012-11-08 -================== - - * add OPTIONS to cors example. Closes #1398 - * fix route chaining regression. Closes #1397 - -3.0.1 / 2012-11-01 -================== - - * update connect - -3.0.0 / 2012-10-23 -================== - - * add `make clean` - * add "Basic" check to req.auth - * add `req.auth` test coverage - * add cb && cb(payload) to `res.jsonp()`. Closes #1374 - * add backwards compat for `res.redirect()` status. Closes #1336 - * add support for `res.json()` to retain previously defined Content-Types. Closes #1349 - * update connect - * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382 - * remove non-primitive string support for `res.send()` - * fix view-locals example. Closes #1370 - * fix route-separation example - -3.0.0rc5 / 2012-09-18 -================== - - * update connect - * add redis search example - * add static-files example - * add "x-powered-by" setting (`app.disable('x-powered-by')`) - * add "application/octet-stream" redirect Accept test case. Closes #1317 - -3.0.0rc4 / 2012-08-30 -================== - - * add `res.jsonp()`. Closes #1307 - * add "verbose errors" option to error-pages example - * add another route example to express(1) so people are not so confused - * add redis online user activity tracking example - * update connect dep - * fix etag quoting. Closes #1310 - * fix error-pages 404 status - * fix jsonp callback char restrictions - * remove old OPTIONS default response - -3.0.0rc3 / 2012-08-13 -================== - - * update connect dep - * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds] - * fix `res.render()` clobbering of "locals" - -3.0.0rc2 / 2012-08-03 -================== - - * add CORS example - * update connect dep - * deprecate `.createServer()` & remove old stale examples - * fix: escape `res.redirect()` link - * fix vhost example - -3.0.0rc1 / 2012-07-24 -================== - - * add more examples to view-locals - * add scheme-relative redirects (`res.redirect("//foo.com")`) support - * update cookie dep - * update connect dep - * update send dep - * fix `express(1)` -h flag, use -H for hogan. Closes #1245 - * fix `res.sendfile()` socket error handling regression - -3.0.0beta7 / 2012-07-16 -================== - - * update connect dep for `send()` root normalization regression - -3.0.0beta6 / 2012-07-13 -================== - - * add `err.view` property for view errors. Closes #1226 - * add "jsonp callback name" setting - * add support for "/foo/:bar*" non-greedy matches - * change `res.sendfile()` to use `send()` module - * change `res.send` to use "response-send" module - * remove `app.locals.use` and `res.locals.use`, use regular middleware - -3.0.0beta5 / 2012-07-03 -================== - - * add "make check" support - * add route-map example - * add `res.json(obj, status)` support back for BC - * add "methods" dep, remove internal methods module - * update connect dep - * update auth example to utilize cores pbkdf2 - * updated tests to use "supertest" - -3.0.0beta4 / 2012-06-25 -================== - - * Added `req.auth` - * Added `req.range(size)` - * Added `res.links(obj)` - * Added `res.send(body, status)` support back for backwards compat - * Added `.default()` support to `res.format()` - * Added 2xx / 304 check to `req.fresh` - * Revert "Added + support to the router" - * Fixed `res.send()` freshness check, respect res.statusCode - -3.0.0beta3 / 2012-06-15 -================== - - * Added hogan `--hjs` to express(1) [nullfirm] - * Added another example to content-negotiation - * Added `fresh` dep - * Changed: `res.send()` always checks freshness - * Fixed: expose connects mime module. Cloases #1165 - -3.0.0beta2 / 2012-06-06 -================== - - * Added `+` support to the router - * Added `req.host` - * Changed `req.param()` to check route first - * Update connect dep - -3.0.0beta1 / 2012-06-01 -================== - - * Added `res.format()` callback to override default 406 behaviour - * Fixed `res.redirect()` 406. Closes #1154 - -3.0.0alpha5 / 2012-05-30 -================== - - * Added `req.ip` - * Added `{ signed: true }` option to `res.cookie()` - * Removed `res.signedCookie()` - * Changed: dont reverse `req.ips` - * Fixed "trust proxy" setting check for `req.ips` - -3.0.0alpha4 / 2012-05-09 -================== - - * Added: allow `[]` in jsonp callback. Closes #1128 - * Added `PORT` env var support in generated template. Closes #1118 [benatkin] - * Updated: connect 2.2.2 - -3.0.0alpha3 / 2012-05-04 -================== - - * Added public `app.routes`. Closes #887 - * Added _view-locals_ example - * Added _mvc_ example - * Added `res.locals.use()`. Closes #1120 - * Added conditional-GET support to `res.send()` - * Added: coerce `res.set()` values to strings - * Changed: moved `static()` in generated apps below router - * Changed: `res.send()` only set ETag when not previously set - * Changed connect 2.2.1 dep - * Changed: `make test` now runs unit / acceptance tests - * Fixed req/res proto inheritance - -3.0.0alpha2 / 2012-04-26 -================== - - * Added `make benchmark` back - * Added `res.send()` support for `String` objects - * Added client-side data exposing example - * Added `res.header()` and `req.header()` aliases for BC - * Added `express.createServer()` for BC - * Perf: memoize parsed urls - * Perf: connect 2.2.0 dep - * Changed: make `expressInit()` middleware self-aware - * Fixed: use app.get() for all core settings - * Fixed redis session example - * Fixed session example. Closes #1105 - * Fixed generated express dep. Closes #1078 - -3.0.0alpha1 / 2012-04-15 -================== - - * Added `app.locals.use(callback)` - * Added `app.locals` object - * Added `app.locals(obj)` - * Added `res.locals` object - * Added `res.locals(obj)` - * Added `res.format()` for content-negotiation - * Added `app.engine()` - * Added `res.cookie()` JSON cookie support - * Added "trust proxy" setting - * Added `req.subdomains` - * Added `req.protocol` - * Added `req.secure` - * Added `req.path` - * Added `req.ips` - * Added `req.fresh` - * Added `req.stale` - * Added comma-delmited / array support for `req.accepts()` - * Added debug instrumentation - * Added `res.set(obj)` - * Added `res.set(field, value)` - * Added `res.get(field)` - * Added `app.get(setting)`. Closes #842 - * Added `req.acceptsLanguage()` - * Added `req.acceptsCharset()` - * Added `req.accepted` - * Added `req.acceptedLanguages` - * Added `req.acceptedCharsets` - * Added "json replacer" setting - * Added "json spaces" setting - * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92 - * Added `--less` support to express(1) - * Added `express.response` prototype - * Added `express.request` prototype - * Added `express.application` prototype - * Added `app.path()` - * Added `app.render()` - * Added `res.type()` to replace `res.contentType()` - * Changed: `res.redirect()` to add relative support - * Changed: enable "jsonp callback" by default - * Changed: renamed "case sensitive routes" to "case sensitive routing" - * Rewrite of all tests with mocha - * Removed "root" setting - * Removed `res.redirect('home')` support - * Removed `req.notify()` - * Removed `app.register()` - * Removed `app.redirect()` - * Removed `app.is()` - * Removed `app.helpers()` - * Removed `app.dynamicHelpers()` - * Fixed `res.sendfile()` with non-GET. Closes #723 - * Fixed express(1) public dir for windows. Closes #866 - -2.5.9/ 2012-04-02 -================== - - * Added support for PURGE request method [pbuyle] - * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki] - -2.5.8 / 2012-02-08 -================== - - * Update mkdirp dep. Closes #991 - -2.5.7 / 2012-02-06 -================== - - * Fixed `app.all` duplicate DELETE requests [mscdex] - -2.5.6 / 2012-01-13 -================== - - * Updated hamljs dev dep. Closes #953 - -2.5.5 / 2012-01-08 -================== - - * Fixed: set `filename` on cached templates [matthewleon] - -2.5.4 / 2012-01-02 -================== - - * Fixed `express(1)` eol on 0.4.x. Closes #947 - -2.5.3 / 2011-12-30 -================== - - * Fixed `req.is()` when a charset is present - -2.5.2 / 2011-12-10 -================== - - * Fixed: express(1) LF -> CRLF for windows - -2.5.1 / 2011-11-17 -================== - - * Changed: updated connect to 1.8.x - * Removed sass.js support from express(1) - -2.5.0 / 2011-10-24 -================== - - * Added ./routes dir for generated app by default - * Added npm install reminder to express(1) app gen - * Added 0.5.x support - * Removed `make test-cov` since it wont work with node 0.5.x - * Fixed express(1) public dir for windows. Closes #866 - -2.4.7 / 2011-10-05 -================== - - * Added mkdirp to express(1). Closes #795 - * Added simple _json-config_ example - * Added shorthand for the parsed request's pathname via `req.path` - * Changed connect dep to 1.7.x to fix npm issue... - * Fixed `res.redirect()` __HEAD__ support. [reported by xerox] - * Fixed `req.flash()`, only escape args - * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie] - -2.4.6 / 2011-08-22 -================== - - * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode] - -2.4.5 / 2011-08-19 -================== - - * Added support for routes to handle errors. Closes #809 - * Added `app.routes.all()`. Closes #803 - * Added "basepath" setting to work in conjunction with reverse proxies etc. - * Refactored `Route` to use a single array of callbacks - * Added support for multiple callbacks for `app.param()`. Closes #801 -Closes #805 - * Changed: removed .call(self) for route callbacks - * Dependency: `qs >= 0.3.1` - * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808 - -2.4.4 / 2011-08-05 -================== - - * Fixed `res.header()` intention of a set, even when `undefined` - * Fixed `*`, value no longer required - * Fixed `res.send(204)` support. Closes #771 - -2.4.3 / 2011-07-14 -================== - - * Added docs for `status` option special-case. Closes #739 - * Fixed `options.filename`, exposing the view path to template engines - -2.4.2. / 2011-07-06 -================== - - * Revert "removed jsonp stripping" for XSS - -2.4.1 / 2011-07-06 -================== - - * Added `res.json()` JSONP support. Closes #737 - * Added _extending-templates_ example. Closes #730 - * Added "strict routing" setting for trailing slashes - * Added support for multiple envs in `app.configure()` calls. Closes #735 - * Changed: `res.send()` using `res.json()` - * Changed: when cookie `path === null` don't default it - * Changed; default cookie path to "home" setting. Closes #731 - * Removed _pids/logs_ creation from express(1) - -2.4.0 / 2011-06-28 -================== - - * Added chainable `res.status(code)` - * Added `res.json()`, an explicit version of `res.send(obj)` - * Added simple web-service example - -2.3.12 / 2011-06-22 -================== - - * \#express is now on freenode! come join! - * Added `req.get(field, param)` - * Added links to Japanese documentation, thanks @hideyukisaito! - * Added; the `express(1)` generated app outputs the env - * Added `content-negotiation` example - * Dependency: connect >= 1.5.1 < 2.0.0 - * Fixed view layout bug. Closes #720 - * Fixed; ignore body on 304. Closes #701 - -2.3.11 / 2011-06-04 -================== - - * Added `npm test` - * Removed generation of dummy test file from `express(1)` - * Fixed; `express(1)` adds express as a dep - * Fixed; prune on `prepublish` - -2.3.10 / 2011-05-27 -================== - - * Added `req.route`, exposing the current route - * Added _package.json_ generation support to `express(1)` - * Fixed call to `app.param()` function for optional params. Closes #682 - -2.3.9 / 2011-05-25 -================== - - * Fixed bug-ish with `../' in `res.partial()` calls - -2.3.8 / 2011-05-24 -================== - - * Fixed `app.options()` - -2.3.7 / 2011-05-23 -================== - - * Added route `Collection`, ex: `app.get('/user/:id').remove();` - * Added support for `app.param(fn)` to define param logic - * Removed `app.param()` support for callback with return value - * Removed module.parent check from express(1) generated app. Closes #670 - * Refactored router. Closes #639 - -2.3.6 / 2011-05-20 -================== - - * Changed; using devDependencies instead of git submodules - * Fixed redis session example - * Fixed markdown example - * Fixed view caching, should not be enabled in development - -2.3.5 / 2011-05-20 -================== - - * Added export `.view` as alias for `.View` - -2.3.4 / 2011-05-08 -================== - - * Added `./examples/say` - * Fixed `res.sendfile()` bug preventing the transfer of files with spaces - -2.3.3 / 2011-05-03 -================== - - * Added "case sensitive routes" option. - * Changed; split methods supported per rfc [slaskis] - * Fixed route-specific middleware when using the same callback function several times - -2.3.2 / 2011-04-27 -================== - - * Fixed view hints - -2.3.1 / 2011-04-26 -================== - - * Added `app.match()` as `app.match.all()` - * Added `app.lookup()` as `app.lookup.all()` - * Added `app.remove()` for `app.remove.all()` - * Added `app.remove.VERB()` - * Fixed template caching collision issue. Closes #644 - * Moved router over from connect and started refactor - -2.3.0 / 2011-04-25 -================== - - * Added options support to `res.clearCookie()` - * Added `res.helpers()` as alias of `res.locals()` - * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0` - * Changed; auto set Content-Type in res.attachement [Aaron Heckmann] - * Renamed "cache views" to "view cache". Closes #628 - * Fixed caching of views when using several apps. Closes #637 - * Fixed gotcha invoking `app.param()` callbacks once per route middleware. -Closes #638 - * Fixed partial lookup precedence. Closes #631 -Shaw] - -2.2.2 / 2011-04-12 -================== - - * Added second callback support for `res.download()` connection errors - * Fixed `filename` option passing to template engine - -2.2.1 / 2011-04-04 -================== - - * Added `layout(path)` helper to change the layout within a view. Closes #610 - * Fixed `partial()` collection object support. - Previously only anything with `.length` would work. - When `.length` is present one must still be aware of holes, - however now `{ collection: {foo: 'bar'}}` is valid, exposes - `keyInCollection` and `keysInCollection`. - - * Performance improved with better view caching - * Removed `request` and `response` locals - * Changed; errorHandler page title is now `Express` instead of `Connect` - -2.2.0 / 2011-03-30 -================== - - * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606 - * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606 - * Added `app.VERB(path)` as alias of `app.lookup.VERB()`. - * Dependency `connect >= 1.2.0` - -2.1.1 / 2011-03-29 -================== - - * Added; expose `err.view` object when failing to locate a view - * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann] - * Fixed; `res.send(undefined)` responds with 204 [aheckmann] - -2.1.0 / 2011-03-24 -================== - - * Added `/_?` partial lookup support. Closes #447 - * Added `request`, `response`, and `app` local variables - * Added `settings` local variable, containing the app's settings - * Added `req.flash()` exception if `req.session` is not available - * Added `res.send(bool)` support (json response) - * Fixed stylus example for latest version - * Fixed; wrap try/catch around `res.render()` - -2.0.0 / 2011-03-17 -================== - - * Fixed up index view path alternative. - * Changed; `res.locals()` without object returns the locals - -2.0.0rc3 / 2011-03-17 -================== - - * Added `res.locals(obj)` to compliment `res.local(key, val)` - * Added `res.partial()` callback support - * Fixed recursive error reporting issue in `res.render()` - -2.0.0rc2 / 2011-03-17 -================== - - * Changed; `partial()` "locals" are now optional - * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01] - * Fixed .filename view engine option [reported by drudge] - * Fixed blog example - * Fixed `{req,res}.app` reference when mounting [Ben Weaver] - -2.0.0rc / 2011-03-14 -================== - - * Fixed; expose `HTTPSServer` constructor - * Fixed express(1) default test charset. Closes #579 [reported by secoif] - * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP] - -2.0.0beta3 / 2011-03-09 -================== - - * Added support for `res.contentType()` literal - The original `res.contentType('.json')`, - `res.contentType('application/json')`, and `res.contentType('json')` - will work now. - * Added `res.render()` status option support back - * Added charset option for `res.render()` - * Added `.charset` support (via connect 1.0.4) - * Added view resolution hints when in development and a lookup fails - * Added layout lookup support relative to the page view. - For example while rendering `./views/user/index.jade` if you create - `./views/user/layout.jade` it will be used in favour of the root layout. - * Fixed `res.redirect()`. RFC states absolute url [reported by unlink] - * Fixed; default `res.send()` string charset to utf8 - * Removed `Partial` constructor (not currently used) - -2.0.0beta2 / 2011-03-07 -================== - - * Added res.render() `.locals` support back to aid in migration process - * Fixed flash example - -2.0.0beta / 2011-03-03 -================== - - * Added HTTPS support - * Added `res.cookie()` maxAge support - * Added `req.header()` _Referrer_ / _Referer_ special-case, either works - * Added mount support for `res.redirect()`, now respects the mount-point - * Added `union()` util, taking place of `merge(clone())` combo - * Added stylus support to express(1) generated app - * Added secret to session middleware used in examples and generated app - * Added `res.local(name, val)` for progressive view locals - * Added default param support to `req.param(name, default)` - * Added `app.disabled()` and `app.enabled()` - * Added `app.register()` support for omitting leading ".", either works - * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539 - * Added `app.param()` to map route params to async/sync logic - * Added; aliased `app.helpers()` as `app.locals()`. Closes #481 - * Added extname with no leading "." support to `res.contentType()` - * Added `cache views` setting, defaulting to enabled in "production" env - * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_. - * Added `req.accepts()` support for extensions - * Changed; `res.download()` and `res.sendfile()` now utilize Connect's - static file server `connect.static.send()`. - * Changed; replaced `connect.utils.mime()` with npm _mime_ module - * Changed; allow `req.query` to be pre-defined (via middleware or other parent - * Changed view partial resolution, now relative to parent view - * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`. - * Fixed `req.param()` bug returning Array.prototype methods. Closes #552 - * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()` - * Fixed; using _qs_ module instead of _querystring_ - * Fixed; strip unsafe chars from jsonp callbacks - * Removed "stream threshold" setting - -1.0.8 / 2011-03-01 -================== - - * Allow `req.query` to be pre-defined (via middleware or other parent app) - * "connect": ">= 0.5.0 < 1.0.0". Closes #547 - * Removed the long deprecated __EXPRESS_ENV__ support - -1.0.7 / 2011-02-07 -================== - - * Fixed `render()` setting inheritance. - Mounted apps would not inherit "view engine" - -1.0.6 / 2011-02-07 -================== - - * Fixed `view engine` setting bug when period is in dirname - -1.0.5 / 2011-02-05 -================== - - * Added secret to generated app `session()` call - -1.0.4 / 2011-02-05 -================== - - * Added `qs` dependency to _package.json_ - * Fixed namespaced `require()`s for latest connect support - -1.0.3 / 2011-01-13 -================== - - * Remove unsafe characters from JSONP callback names [Ryan Grove] - -1.0.2 / 2011-01-10 -================== - - * Removed nested require, using `connect.router` - -1.0.1 / 2010-12-29 -================== - - * Fixed for middleware stacked via `createServer()` - previously the `foo` middleware passed to `createServer(foo)` - would not have access to Express methods such as `res.send()` - or props like `req.query` etc. - -1.0.0 / 2010-11-16 -================== - - * Added; deduce partial object names from the last segment. - For example by default `partial('forum/post', postObject)` will - give you the _post_ object, providing a meaningful default. - * Added http status code string representation to `res.redirect()` body - * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__. - * Added `req.is()` to aid in content negotiation - * Added partial local inheritance [suggested by masylum]. Closes #102 - providing access to parent template locals. - * Added _-s, --session[s]_ flag to express(1) to add session related middleware - * Added _--template_ flag to express(1) to specify the - template engine to use. - * Added _--css_ flag to express(1) to specify the - stylesheet engine to use (or just plain css by default). - * Added `app.all()` support [thanks aheckmann] - * Added partial direct object support. - You may now `partial('user', user)` providing the "user" local, - vs previously `partial('user', { object: user })`. - * Added _route-separation_ example since many people question ways - to do this with CommonJS modules. Also view the _blog_ example for - an alternative. - * Performance; caching view path derived partial object names - * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454 - * Fixed jsonp support; _text/javascript_ as per mailinglist discussion - -1.0.0rc4 / 2010-10-14 -================== - - * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0 - * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware)) - * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass] - * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass] - * Added `partial()` support for array-like collections. Closes #434 - * Added support for swappable querystring parsers - * Added session usage docs. Closes #443 - * Added dynamic helper caching. Closes #439 [suggested by maritz] - * Added authentication example - * Added basic Range support to `res.sendfile()` (and `res.download()` etc) - * Changed; `express(1)` generated app using 2 spaces instead of 4 - * Default env to "development" again [aheckmann] - * Removed _context_ option is no more, use "scope" - * Fixed; exposing _./support_ libs to examples so they can run without installs - * Fixed mvc example - -1.0.0rc3 / 2010-09-20 -================== - - * Added confirmation for `express(1)` app generation. Closes #391 - * Added extending of flash formatters via `app.flashFormatters` - * Added flash formatter support. Closes #411 - * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold" - * Added _stream threshold_ setting for `res.sendfile()` - * Added `res.send()` __HEAD__ support - * Added `res.clearCookie()` - * Added `res.cookie()` - * Added `res.render()` headers option - * Added `res.redirect()` response bodies - * Added `res.render()` status option support. Closes #425 [thanks aheckmann] - * Fixed `res.sendfile()` responding with 403 on malicious path - * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_ - * Fixed; mounted apps settings now inherit from parent app [aheckmann] - * Fixed; stripping Content-Length / Content-Type when 204 - * Fixed `res.send()` 204. Closes #419 - * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402 - * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo] - - -1.0.0rc2 / 2010-08-17 -================== - - * Added `app.register()` for template engine mapping. Closes #390 - * Added `res.render()` callback support as second argument (no options) - * Added callback support to `res.download()` - * Added callback support for `res.sendfile()` - * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()` - * Added "partials" setting to docs - * Added default expresso tests to `express(1)` generated app. Closes #384 - * Fixed `res.sendfile()` error handling, defer via `next()` - * Fixed `res.render()` callback when a layout is used [thanks guillermo] - * Fixed; `make install` creating ~/.node_libraries when not present - * Fixed issue preventing error handlers from being defined anywhere. Closes #387 - -1.0.0rc / 2010-07-28 -================== - - * Added mounted hook. Closes #369 - * Added connect dependency to _package.json_ - - * Removed "reload views" setting and support code - development env never caches, production always caches. - - * Removed _param_ in route callbacks, signature is now - simply (req, res, next), previously (req, res, params, next). - Use _req.params_ for path captures, _req.query_ for GET params. - - * Fixed "home" setting - * Fixed middleware/router precedence issue. Closes #366 - * Fixed; _configure()_ callbacks called immediately. Closes #368 - -1.0.0beta2 / 2010-07-23 -================== - - * Added more examples - * Added; exporting `Server` constructor - * Added `Server#helpers()` for view locals - * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349 - * Added support for absolute view paths - * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363 - * Added Guillermo Rauch to the contributor list - * Added support for "as" for non-collection partials. Closes #341 - * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf] - * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo] - * Fixed instanceof `Array` checks, now `Array.isArray()` - * Fixed express(1) expansion of public dirs. Closes #348 - * Fixed middleware precedence. Closes #345 - * Fixed view watcher, now async [thanks aheckmann] - -1.0.0beta / 2010-07-15 -================== - - * Re-write - - much faster - - much lighter - - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs - -0.14.0 / 2010-06-15 -================== - - * Utilize relative requires - * Added Static bufferSize option [aheckmann] - * Fixed caching of view and partial subdirectories [aheckmann] - * Fixed mime.type() comments now that ".ext" is not supported - * Updated haml submodule - * Updated class submodule - * Removed bin/express - -0.13.0 / 2010-06-01 -================== - - * Added node v0.1.97 compatibility - * Added support for deleting cookies via Request#cookie('key', null) - * Updated haml submodule - * Fixed not-found page, now using using charset utf-8 - * Fixed show-exceptions page, now using using charset utf-8 - * Fixed view support due to fs.readFile Buffers - * Changed; mime.type() no longer accepts ".type" due to node extname() changes - -0.12.0 / 2010-05-22 -================== - - * Added node v0.1.96 compatibility - * Added view `helpers` export which act as additional local variables - * Updated haml submodule - * Changed ETag; removed inode, modified time only - * Fixed LF to CRLF for setting multiple cookies - * Fixed cookie complation; values are now urlencoded - * Fixed cookies parsing; accepts quoted values and url escaped cookies - -0.11.0 / 2010-05-06 -================== - - * Added support for layouts using different engines - - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' }) - - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml' - - this.render('page.html.haml', { layout: false }) // no layout - * Updated ext submodule - * Updated haml submodule - * Fixed EJS partial support by passing along the context. Issue #307 - -0.10.1 / 2010-05-03 -================== - - * Fixed binary uploads. - -0.10.0 / 2010-04-30 -================== - - * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s - encoding is set to 'utf8' or 'utf-8'. - * Added "encoding" option to Request#render(). Closes #299 - * Added "dump exceptions" setting, which is enabled by default. - * Added simple ejs template engine support - * Added error reponse support for text/plain, application/json. Closes #297 - * Added callback function param to Request#error() - * Added Request#sendHead() - * Added Request#stream() - * Added support for Request#respond(304, null) for empty response bodies - * Added ETag support to Request#sendfile() - * Added options to Request#sendfile(), passed to fs.createReadStream() - * Added filename arg to Request#download() - * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request - * Performance enhanced by preventing several calls to toLowerCase() in Router#match() - * Changed; Request#sendfile() now streams - * Changed; Renamed Request#halt() to Request#respond(). Closes #289 - * Changed; Using sys.inspect() instead of JSON.encode() for error output - * Changed; run() returns the http.Server instance. Closes #298 - * Changed; Defaulting Server#host to null (INADDR_ANY) - * Changed; Logger "common" format scale of 0.4f - * Removed Logger "request" format - * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found - * Fixed several issues with http client - * Fixed Logger Content-Length output - * Fixed bug preventing Opera from retaining the generated session id. Closes #292 - -0.9.0 / 2010-04-14 -================== - - * Added DSL level error() route support - * Added DSL level notFound() route support - * Added Request#error() - * Added Request#notFound() - * Added Request#render() callback function. Closes #258 - * Added "max upload size" setting - * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254 - * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js - * Added callback function support to Request#halt() as 3rd/4th arg - * Added preprocessing of route param wildcards using param(). Closes #251 - * Added view partial support (with collections etc) - * Fixed bug preventing falsey params (such as ?page=0). Closes #286 - * Fixed setting of multiple cookies. Closes #199 - * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml) - * Changed; session cookie is now httpOnly - * Changed; Request is no longer global - * Changed; Event is no longer global - * Changed; "sys" module is no longer global - * Changed; moved Request#download to Static plugin where it belongs - * Changed; Request instance created before body parsing. Closes #262 - * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253 - * Changed; Pre-caching view partials in memory when "cache view partials" is enabled - * Updated support to node --version 0.1.90 - * Updated dependencies - * Removed set("session cookie") in favour of use(Session, { cookie: { ... }}) - * Removed utils.mixin(); use Object#mergeDeep() - -0.8.0 / 2010-03-19 -================== - - * Added coffeescript example app. Closes #242 - * Changed; cache api now async friendly. Closes #240 - * Removed deprecated 'express/static' support. Use 'express/plugins/static' - -0.7.6 / 2010-03-19 -================== - - * Added Request#isXHR. Closes #229 - * Added `make install` (for the executable) - * Added `express` executable for setting up simple app templates - * Added "GET /public/*" to Static plugin, defaulting to /public - * Added Static plugin - * Fixed; Request#render() only calls cache.get() once - * Fixed; Namespacing View caches with "view:" - * Fixed; Namespacing Static caches with "static:" - * Fixed; Both example apps now use the Static plugin - * Fixed set("views"). Closes #239 - * Fixed missing space for combined log format - * Deprecated Request#sendfile() and 'express/static' - * Removed Server#running - -0.7.5 / 2010-03-16 -================== - - * Added Request#flash() support without args, now returns all flashes - * Updated ext submodule - -0.7.4 / 2010-03-16 -================== - - * Fixed session reaper - * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft) - -0.7.3 / 2010-03-16 -================== - - * Added package.json - * Fixed requiring of haml / sass due to kiwi removal - -0.7.2 / 2010-03-16 -================== - - * Fixed GIT submodules (HAH!) - -0.7.1 / 2010-03-16 -================== - - * Changed; Express now using submodules again until a PM is adopted - * Changed; chat example using millisecond conversions from ext - -0.7.0 / 2010-03-15 -================== - - * Added Request#pass() support (finds the next matching route, or the given path) - * Added Logger plugin (default "common" format replaces CommonLogger) - * Removed Profiler plugin - * Removed CommonLogger plugin - -0.6.0 / 2010-03-11 -================== - - * Added seed.yml for kiwi package management support - * Added HTTP client query string support when method is GET. Closes #205 - - * Added support for arbitrary view engines. - For example "foo.engine.html" will now require('engine'), - the exports from this module are cached after the first require(). - - * Added async plugin support - - * Removed usage of RESTful route funcs as http client - get() etc, use http.get() and friends - - * Removed custom exceptions - -0.5.0 / 2010-03-10 -================== - - * Added ext dependency (library of js extensions) - * Removed extname() / basename() utils. Use path module - * Removed toArray() util. Use arguments.values - * Removed escapeRegexp() util. Use RegExp.escape() - * Removed process.mixin() dependency. Use utils.mixin() - * Removed Collection - * Removed ElementCollection - * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com) ;) - -0.4.0 / 2010-02-11 -================== - - * Added flash() example to sample upload app - * Added high level restful http client module (express/http) - * Changed; RESTful route functions double as HTTP clients. Closes #69 - * Changed; throwing error when routes are added at runtime - * Changed; defaulting render() context to the current Request. Closes #197 - * Updated haml submodule - -0.3.0 / 2010-02-11 -================== - - * Updated haml / sass submodules. Closes #200 - * Added flash message support. Closes #64 - * Added accepts() now allows multiple args. fixes #117 - * Added support for plugins to halt. Closes #189 - * Added alternate layout support. Closes #119 - * Removed Route#run(). Closes #188 - * Fixed broken specs due to use(Cookie) missing - -0.2.1 / 2010-02-05 -================== - - * Added "plot" format option for Profiler (for gnuplot processing) - * Added request number to Profiler plugin - * Fixed binary encoding for multi-part file uploads, was previously defaulting to UTF8 - * Fixed issue with routes not firing when not files are present. Closes #184 - * Fixed process.Promise -> events.Promise - -0.2.0 / 2010-02-03 -================== - - * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180 - * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174 - * Added expiration support to cache api with reaper. Closes #133 - * Added cache Store.Memory#reap() - * Added Cache; cache api now uses first class Cache instances - * Added abstract session Store. Closes #172 - * Changed; cache Memory.Store#get() utilizing Collection - * Renamed MemoryStore -> Store.Memory - * Fixed use() of the same plugin several time will always use latest options. Closes #176 - -0.1.0 / 2010-02-03 -================== - - * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context - * Updated node support to 0.1.27 Closes #169 - * Updated dirname(__filename) -> __dirname - * Updated libxmljs support to v0.2.0 - * Added session support with memory store / reaping - * Added quick uid() helper - * Added multi-part upload support - * Added Sass.js support / submodule - * Added production env caching view contents and static files - * Added static file caching. Closes #136 - * Added cache plugin with memory stores - * Added support to StaticFile so that it works with non-textual files. - * Removed dirname() helper - * Removed several globals (now their modules must be required) - -0.0.2 / 2010-01-10 -================== - - * Added view benchmarks; currently haml vs ejs - * Added Request#attachment() specs. Closes #116 - * Added use of node's parseQuery() util. Closes #123 - * Added `make init` for submodules - * Updated Haml - * Updated sample chat app to show messages on load - * Updated libxmljs parseString -> parseHtmlString - * Fixed `make init` to work with older versions of git - * Fixed specs can now run independant specs for those who cant build deps. Closes #127 - * Fixed issues introduced by the node url module changes. Closes 126. - * Fixed two assertions failing due to Collection#keys() returning strings - * Fixed faulty Collection#toArray() spec due to keys() returning strings - * Fixed `make test` now builds libxmljs.node before testing - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/LICENSE deleted file mode 100644 index 0f3c767..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2009-2014 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. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/Readme.md deleted file mode 100644 index 8abbcc4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/Readme.md +++ /dev/null @@ -1,128 +0,0 @@ -[![Express Logo](https://i.cloudup.com/zfY6lL7eFa-3000x3000.png)](https://expressjs.com/) - - Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). - - [![NPM Version](https://badge.fury.io/js/express.svg)](https://badge.fury.io/js/express) - [![Build Status](https://travis-ci.org/visionmedia/express.svg?branch=master)](https://travis-ci.org/visionmedia/express) - [![Coverage Status](https://img.shields.io/coveralls/visionmedia/express.svg)](https://coveralls.io/r/visionmedia/express) - [![Gittip](http://img.shields.io/gittip/dougwilson.svg)](https://www.gittip.com/dougwilson/) - -```js -var express = require('express') -var app = express() - -app.get('/', function (req, res) { - res.send('Hello World') -}) - -app.listen(3000) -``` - - **PROTIP** Be sure to read [Migrating from 3.x to 4.x](https://github.com/visionmedia/express/wiki/Migrating-from-3.x-to-4.x) as well as [New features in 4.x](https://github.com/visionmedia/express/wiki/New-features-in-4.x). - -### Installation - -```bash -$ npm install express -``` - -## Quick Start - - The quickest way to get started with express is to utilize the executable [`express(1)`](https://github.com/expressjs/generator) to generate an application as shown below: - - Install the executable. The executable's major version will match Express's: - -```bash -$ npm install -g express-generator@4 -``` - - Create the app: - -```bash -$ express /tmp/foo && cd /tmp/foo -``` - - Install dependencies: - -```bash -$ npm install -``` - - Start the server: - -```bash -$ npm start -``` - -## Features - - * Robust routing - * HTTP helpers (redirection, caching, etc) - * View system supporting 14+ template engines - * Content negotiation - * Focus on high performance - * Executable for generating applications quickly - * High test coverage - -## Philosophy - - The Express philosophy is to provide small, robust tooling for HTTP servers, making - it a great solution for single page applications, web sites, hybrids, or public - HTTP APIs. - - Express does not force you to use any specific ORM or template engine. With support for over - 14 template engines via [Consolidate.js](https://github.com/visionmedia/consolidate.js), - you can quickly craft your perfect framework. - -## More Information - - * [Website and Documentation](http://expressjs.com/) - [[website repo](https://github.com/visionmedia/expressjs.com)] - * [Github Organization](https://github.com/expressjs) for Official Middleware & Modules - * [#express](https://webchat.freenode.net/?channels=express) on freenode IRC - * Visit the [Wiki](https://github.com/visionmedia/express/wiki) - * [Google Group](https://groups.google.com/group/express-js) for discussion - * [Русскоязычная документация](http://jsman.ru/express/) - * [한국어 문서](http://expressjs.kr) - [[website repo](https://github.com/Hanul/expressjs.kr)] - * Run express examples [online](https://runnable.com/express) - -## Viewing Examples - - Clone the Express repo, then install the dev dependencies to install all the example / test suite dependencies: - -```bash -$ git clone git://github.com/visionmedia/express.git --depth 1 -$ cd express -$ npm install -``` - - Then run whichever example you want: - - $ node examples/content-negotiation - - You can also view live examples here: - - - -## Running Tests - - To run the test suite, first invoke the following command within the repo, installing the development dependencies: - -```bash -$ npm install -``` - - Then run the tests: - -```bash -$ npm test -``` - -### Contributors - - * Author: [TJ Holowaychuk](https://github.com/visionmedia) - * Lead Maintainer: [Douglas Christopher Wilson](https://github.com/dougwilson) - * [All Contributors](https://github.com/visionmedia/express/graphs/contributors) - -### License - - [MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/index.js deleted file mode 100644 index 3da3378..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/express'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/application.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/application.js deleted file mode 100644 index b8b69c0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/application.js +++ /dev/null @@ -1,554 +0,0 @@ -/** - * Module dependencies. - */ - -var finalhandler = require('finalhandler'); -var mixin = require('utils-merge'); -var Router = require('./router'); -var methods = require('methods'); -var middleware = require('./middleware/init'); -var query = require('./middleware/query'); -var debug = require('debug')('express:application'); -var View = require('./view'); -var http = require('http'); -var compileETag = require('./utils').compileETag; -var compileQueryParser = require('./utils').compileQueryParser; -var compileTrust = require('./utils').compileTrust; -var deprecate = require('depd')('express'); -var resolve = require('path').resolve; - -/** - * Application prototype. - */ - -var app = exports = module.exports = {}; - -/** - * Initialize the server. - * - * - setup default configuration - * - setup default middleware - * - setup route reflection methods - * - * @api private - */ - -app.init = function(){ - this.cache = {}; - this.settings = {}; - this.engines = {}; - this.defaultConfiguration(); -}; - -/** - * Initialize application configuration. - * - * @api private - */ - -app.defaultConfiguration = function(){ - // default settings - this.enable('x-powered-by'); - this.set('etag', 'weak'); - var env = process.env.NODE_ENV || 'development'; - this.set('env', env); - this.set('query parser', 'extended'); - this.set('subdomain offset', 2); - this.set('trust proxy', false); - - debug('booting in %s mode', env); - - // inherit protos - this.on('mount', function(parent){ - this.request.__proto__ = parent.request; - this.response.__proto__ = parent.response; - this.engines.__proto__ = parent.engines; - this.settings.__proto__ = parent.settings; - }); - - // setup locals - this.locals = Object.create(null); - - // top-most app is mounted at / - this.mountpath = '/'; - - // default locals - this.locals.settings = this.settings; - - // default configuration - this.set('view', View); - this.set('views', resolve('views')); - this.set('jsonp callback name', 'callback'); - - if (env === 'production') { - this.enable('view cache'); - } - - Object.defineProperty(this, 'router', { - get: function() { - throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.'); - } - }); -}; - -/** - * lazily adds the base router if it has not yet been added. - * - * We cannot add the base router in the defaultConfiguration because - * it reads app settings which might be set after that has run. - * - * @api private - */ -app.lazyrouter = function() { - if (!this._router) { - this._router = new Router({ - caseSensitive: this.enabled('case sensitive routing'), - strict: this.enabled('strict routing') - }); - - this._router.use(query(this.get('query parser fn'))); - this._router.use(middleware.init(this)); - } -}; - -/** - * Dispatch a req, res pair into the application. Starts pipeline processing. - * - * If no _done_ callback is provided, then default error handlers will respond - * in the event of an error bubbling through the stack. - * - * @api private - */ - -app.handle = function(req, res, done) { - var router = this._router; - - // final handler - done = done || finalhandler(req, res, { - env: this.get('env'), - onerror: logerror.bind(this) - }); - - // no routes - if (!router) { - debug('no routes defined on app'); - done(); - return; - } - - router.handle(req, res, done); -}; - -/** - * Proxy `Router#use()` to add middleware to the app router. - * See Router#use() documentation for details. - * - * If the _fn_ parameter is an express app, then it will be - * mounted at the _route_ specified. - * - * @api public - */ - -app.use = function use(path, fn) { - var mount_app; - var mount_path; - - // check for .use(path, app) or .use(app) signature - if (arguments.length <= 2) { - mount_path = typeof path === 'string' - ? path - : '/'; - mount_app = typeof path === 'function' - ? path - : fn; - } - - // setup router - this.lazyrouter(); - var router = this._router; - - // express app - if (mount_app && mount_app.handle && mount_app.set) { - debug('.use app under %s', mount_path); - mount_app.mountpath = mount_path; - mount_app.parent = this; - - // restore .app property on req and res - router.use(mount_path, function mounted_app(req, res, next) { - var orig = req.app; - mount_app.handle(req, res, function(err) { - req.__proto__ = orig.request; - res.__proto__ = orig.response; - next(err); - }); - }); - - // mounted an app - mount_app.emit('mount', this); - - return this; - } - - // pass-through use - router.use.apply(router, arguments); - - return this; -}; - -/** - * Proxy to the app `Router#route()` - * Returns a new `Route` instance for the _path_. - * - * Routes are isolated middleware stacks for specific paths. - * See the Route api docs for details. - * - * @api public - */ - -app.route = function(path){ - this.lazyrouter(); - return this._router.route(path); -}; - -/** - * Register the given template engine callback `fn` - * as `ext`. - * - * By default will `require()` the engine based on the - * file extension. For example if you try to render - * a "foo.jade" file Express will invoke the following internally: - * - * app.engine('jade', require('jade').__express); - * - * For engines that do not provide `.__express` out of the box, - * or if you wish to "map" a different extension to the template engine - * you may use this method. For example mapping the EJS template engine to - * ".html" files: - * - * app.engine('html', require('ejs').renderFile); - * - * In this case EJS provides a `.renderFile()` method with - * the same signature that Express expects: `(path, options, callback)`, - * though note that it aliases this method as `ejs.__express` internally - * so if you're using ".ejs" extensions you dont need to do anything. - * - * Some template engines do not follow this convention, the - * [Consolidate.js](https://github.com/visionmedia/consolidate.js) - * library was created to map all of node's popular template - * engines to follow this convention, thus allowing them to - * work seamlessly within Express. - * - * @param {String} ext - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.engine = function(ext, fn){ - if ('function' != typeof fn) throw new Error('callback function required'); - if ('.' != ext[0]) ext = '.' + ext; - this.engines[ext] = fn; - return this; -}; - -/** - * Proxy to `Router#param()` with one added api feature. The _name_ parameter - * can be an array of names. - * - * See the Router#param() docs for more details. - * - * @param {String|Array} name - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.param = function(name, fn){ - var self = this; - self.lazyrouter(); - - if (Array.isArray(name)) { - name.forEach(function(key) { - self.param(key, fn); - }); - return this; - } - - self._router.param(name, fn); - return this; -}; - -/** - * Assign `setting` to `val`, or return `setting`'s value. - * - * app.set('foo', 'bar'); - * app.get('foo'); - * // => "bar" - * - * Mounted servers inherit their parent server's settings. - * - * @param {String} setting - * @param {*} [val] - * @return {Server} for chaining - * @api public - */ - -app.set = function(setting, val){ - if (arguments.length === 1) { - // app.get(setting) - return this.settings[setting]; - } - - // set value - this.settings[setting] = val; - - // trigger matched settings - switch (setting) { - case 'etag': - debug('compile etag %s', val); - this.set('etag fn', compileETag(val)); - break; - case 'query parser': - debug('compile query parser %s', val); - this.set('query parser fn', compileQueryParser(val)); - break; - case 'trust proxy': - debug('compile trust proxy %s', val); - this.set('trust proxy fn', compileTrust(val)); - break; - } - - return this; -}; - -/** - * Return the app's absolute pathname - * based on the parent(s) that have - * mounted it. - * - * For example if the application was - * mounted as "/admin", which itself - * was mounted as "/blog" then the - * return value would be "/blog/admin". - * - * @return {String} - * @api private - */ - -app.path = function(){ - return this.parent - ? this.parent.path() + this.mountpath - : ''; -}; - -/** - * Check if `setting` is enabled (truthy). - * - * app.enabled('foo') - * // => false - * - * app.enable('foo') - * app.enabled('foo') - * // => true - * - * @param {String} setting - * @return {Boolean} - * @api public - */ - -app.enabled = function(setting){ - return !!this.set(setting); -}; - -/** - * Check if `setting` is disabled. - * - * app.disabled('foo') - * // => true - * - * app.enable('foo') - * app.disabled('foo') - * // => false - * - * @param {String} setting - * @return {Boolean} - * @api public - */ - -app.disabled = function(setting){ - return !this.set(setting); -}; - -/** - * Enable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @api public - */ - -app.enable = function(setting){ - return this.set(setting, true); -}; - -/** - * Disable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @api public - */ - -app.disable = function(setting){ - return this.set(setting, false); -}; - -/** - * Delegate `.VERB(...)` calls to `router.VERB(...)`. - */ - -methods.forEach(function(method){ - app[method] = function(path){ - if ('get' == method && 1 == arguments.length) return this.set(path); - - this.lazyrouter(); - - var route = this._router.route(path); - route[method].apply(route, [].slice.call(arguments, 1)); - return this; - }; -}); - -/** - * Special-cased "all" method, applying the given route `path`, - * middleware, and callback to _every_ HTTP method. - * - * @param {String} path - * @param {Function} ... - * @return {app} for chaining - * @api public - */ - -app.all = function(path){ - this.lazyrouter(); - - var route = this._router.route(path); - var args = [].slice.call(arguments, 1); - methods.forEach(function(method){ - route[method].apply(route, args); - }); - - return this; -}; - -// del -> delete alias - -app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead'); - -/** - * Render the given view `name` name with `options` - * and a callback accepting an error and the - * rendered template string. - * - * Example: - * - * app.render('email', { name: 'Tobi' }, function(err, html){ - * // ... - * }) - * - * @param {String} name - * @param {String|Function} options or fn - * @param {Function} fn - * @api public - */ - -app.render = function(name, options, fn){ - var opts = {}; - var cache = this.cache; - var engines = this.engines; - var view; - - // support callback function as second arg - if ('function' == typeof options) { - fn = options, options = {}; - } - - // merge app.locals - mixin(opts, this.locals); - - // merge options._locals - if (options._locals) mixin(opts, options._locals); - - // merge options - mixin(opts, options); - - // set .cache unless explicitly provided - opts.cache = null == opts.cache - ? this.enabled('view cache') - : opts.cache; - - // primed cache - if (opts.cache) view = cache[name]; - - // view - if (!view) { - view = new (this.get('view'))(name, { - defaultEngine: this.get('view engine'), - root: this.get('views'), - engines: engines - }); - - if (!view.path) { - var err = new Error('Failed to lookup view "' + name + '" in views directory "' + view.root + '"'); - err.view = view; - return fn(err); - } - - // prime the cache - if (opts.cache) cache[name] = view; - } - - // render - try { - view.render(opts, fn); - } catch (err) { - fn(err); - } -}; - -/** - * Listen for connections. - * - * A node `http.Server` is returned, with this - * application (which is a `Function`) as its - * callback. If you wish to create both an HTTP - * and HTTPS server you may do so with the "http" - * and "https" modules as shown here: - * - * var http = require('http') - * , https = require('https') - * , express = require('express') - * , app = express(); - * - * http.createServer(app).listen(80); - * https.createServer({ ... }, app).listen(443); - * - * @return {http.Server} - * @api public - */ - -app.listen = function(){ - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; - -/** -* Log error using console.error. -* -* @param {Error} err -* @api public -*/ - -function logerror(err){ - if (this.get('env') !== 'test') console.error(err.stack || err.toString()); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/express.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/express.js deleted file mode 100644 index 7be6832..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/express.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter; -var mixin = require('utils-merge'); -var proto = require('./application'); -var Route = require('./router/route'); -var Router = require('./router'); -var req = require('./request'); -var res = require('./response'); - -/** - * Expose `createApplication()`. - */ - -exports = module.exports = createApplication; - -/** - * Create an express application. - * - * @return {Function} - * @api public - */ - -function createApplication() { - var app = function(req, res, next) { - app.handle(req, res, next); - }; - - mixin(app, proto); - mixin(app, EventEmitter.prototype); - - app.request = { __proto__: req, app: app }; - app.response = { __proto__: res, app: app }; - app.init(); - return app; -} - -/** - * Expose the prototypes. - */ - -exports.application = proto; -exports.request = req; -exports.response = res; - -/** - * Expose constructors. - */ - -exports.Route = Route; -exports.Router = Router; - -/** - * Expose middleware - */ - -exports.query = require('./middleware/query'); -exports.static = require('serve-static'); - -/** - * Replace removed middleware with an appropriate error message. - */ - -[ - 'json', - 'urlencoded', - 'bodyParser', - 'compress', - 'cookieSession', - 'session', - 'logger', - 'cookieParser', - 'favicon', - 'responseTime', - 'errorHandler', - 'timeout', - 'methodOverride', - 'vhost', - 'csrf', - 'directory', - 'limit', - 'multipart', - 'staticCache', -].forEach(function (name) { - Object.defineProperty(exports, name, { - get: function () { - throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.'); - }, - configurable: true - }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/init.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/init.js deleted file mode 100644 index c09cf0c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/init.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Initialization middleware, exposing the - * request and response to eachother, as well - * as defaulting the X-Powered-By header field. - * - * @param {Function} app - * @return {Function} - * @api private - */ - -exports.init = function(app){ - return function expressInit(req, res, next){ - if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); - req.res = res; - res.req = req; - req.next = next; - - req.__proto__ = app.request; - res.__proto__ = app.response; - - res.locals = res.locals || Object.create(null); - - next(); - }; -}; - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/query.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/query.js deleted file mode 100644 index 092bbd9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/middleware/query.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Module dependencies. - */ - -var parseUrl = require('parseurl'); -var qs = require('qs'); - -/** - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function query(options) { - var queryparse = qs.parse; - - if (typeof options === 'function') { - queryparse = options; - options = undefined; - } - - return function query(req, res, next){ - if (!req.query) { - var val = parseUrl(req).query; - req.query = queryparse(val, options); - } - - next(); - }; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/request.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/request.js deleted file mode 100644 index ea5d037..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/request.js +++ /dev/null @@ -1,454 +0,0 @@ -/** - * Module dependencies. - */ - -var accepts = require('accepts'); -var deprecate = require('depd')('express'); -var typeis = require('type-is'); -var http = require('http'); -var fresh = require('fresh'); -var parseRange = require('range-parser'); -var parse = require('parseurl'); -var proxyaddr = require('proxy-addr'); - -/** - * Request prototype. - */ - -var req = exports = module.exports = { - __proto__: http.IncomingMessage.prototype -}; - -/** - * Return request header. - * - * The `Referrer` header field is special-cased, - * both `Referrer` and `Referer` are interchangeable. - * - * Examples: - * - * req.get('Content-Type'); - * // => "text/plain" - * - * req.get('content-type'); - * // => "text/plain" - * - * req.get('Something'); - * // => undefined - * - * Aliased as `req.header()`. - * - * @param {String} name - * @return {String} - * @api public - */ - -req.get = -req.header = function(name){ - switch (name = name.toLowerCase()) { - case 'referer': - case 'referrer': - return this.headers.referrer - || this.headers.referer; - default: - return this.headers[name]; - } -}; - -/** - * To do: update docs. - * - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json", a comma-delimted list such as "json, html, text/plain", - * an argument list such as `"json", "html", "text/plain"`, - * or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * req.accepts('html'); - * // => "html" - * - * // Accept: text/*, application/json - * req.accepts('html'); - * // => "html" - * req.accepts('text/html'); - * // => "text/html" - * req.accepts('json, text'); - * // => "json" - * req.accepts('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * req.accepts('image/png'); - * req.accepts('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * req.accepts(['html', 'json']); - * req.accepts('html', 'json'); - * req.accepts('html, json'); - * // => "json" - * - * @param {String|Array} type(s) - * @return {String} - * @api public - */ - -req.accepts = function(){ - var accept = accepts(this); - return accept.types.apply(accept, arguments); -}; - -/** - * Check if the given `encoding`s are accepted. - * - * @param {String} ...encoding - * @return {Boolean} - * @api public - */ - -req.acceptsEncodings = function(){ - var accept = accepts(this); - return accept.encodings.apply(accept, arguments); -}; - -req.acceptsEncoding = deprecate.function(req.acceptsEncodings, - 'req.acceptsEncoding: Use acceptsEncodings instead'); - -/** - * Check if the given `charset`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...charset - * @return {Boolean} - * @api public - */ - -req.acceptsCharsets = function(){ - var accept = accepts(this); - return accept.charsets.apply(accept, arguments); -}; - -req.acceptsCharset = deprecate.function(req.acceptsCharsets, - 'req.acceptsCharset: Use acceptsCharsets instead'); - -/** - * Check if the given `lang`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...lang - * @return {Boolean} - * @api public - */ - -req.acceptsLanguages = function(){ - var accept = accepts(this); - return accept.languages.apply(accept, arguments); -}; - -req.acceptsLanguage = deprecate.function(req.acceptsLanguages, - 'req.acceptsLanguage: Use acceptsLanguages instead'); - -/** - * Parse Range header field, - * capping to the given `size`. - * - * Unspecified ranges such as "0-" require - * knowledge of your resource length. In - * the case of a byte range this is of course - * the total number of bytes. If the Range - * header field is not given `null` is returned, - * `-1` when unsatisfiable, `-2` when syntactically invalid. - * - * NOTE: remember that ranges are inclusive, so - * for example "Range: users=0-3" should respond - * with 4 users when available, not 3. - * - * @param {Number} size - * @return {Array} - * @api public - */ - -req.range = function(size){ - var range = this.get('Range'); - if (!range) return; - return parseRange(size, range); -}; - -/** - * Return the value of param `name` when present or `defaultValue`. - * - * - Checks route placeholders, ex: _/user/:id_ - * - Checks body params, ex: id=12, {"id":12} - * - Checks query string params, ex: ?id=12 - * - * To utilize request bodies, `req.body` - * should be an object. This can be done by using - * the `bodyParser()` middleware. - * - * @param {String} name - * @param {Mixed} [defaultValue] - * @return {String} - * @api public - */ - -req.param = function(name, defaultValue){ - var params = this.params || {}; - var body = this.body || {}; - var query = this.query || {}; - if (null != params[name] && params.hasOwnProperty(name)) return params[name]; - if (null != body[name]) return body[name]; - if (null != query[name]) return query[name]; - return defaultValue; -}; - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains the give mime `type`. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * req.is('html'); - * req.is('text/html'); - * req.is('text/*'); - * // => true - * - * // When Content-Type is application/json - * req.is('json'); - * req.is('application/json'); - * req.is('application/*'); - * // => true - * - * req.is('html'); - * // => false - * - * @param {String} type - * @return {Boolean} - * @api public - */ - -req.is = function(types){ - if (!Array.isArray(types)) types = [].slice.call(arguments); - return typeis(this, types); -}; - -/** - * Return the protocol string "http" or "https" - * when requested with TLS. When the "trust proxy" - * setting trusts the socket address, the - * "X-Forwarded-Proto" header field will be trusted - * and used if present. - * - * If you're running behind a reverse proxy that - * supplies https for you this may be enabled. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'protocol', function protocol(){ - var proto = this.connection.encrypted - ? 'https' - : 'http'; - var trust = this.app.get('trust proxy fn'); - - if (!trust(this.connection.remoteAddress)) { - return proto; - } - - // Note: X-Forwarded-Proto is normally only ever a - // single value, but this is to be safe. - proto = this.get('X-Forwarded-Proto') || proto; - return proto.split(/\s*,\s*/)[0]; -}); - -/** - * Short-hand for: - * - * req.protocol == 'https' - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'secure', function secure(){ - return 'https' == this.protocol; -}); - -/** - * Return the remote address from the trusted proxy. - * - * The is the remote address on the socket unless - * "trust proxy" is set. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'ip', function ip(){ - var trust = this.app.get('trust proxy fn'); - return proxyaddr(this, trust); -}); - -/** - * When "trust proxy" is set, trusted proxy addresses + client. - * - * For example if the value were "client, proxy1, proxy2" - * you would receive the array `["client", "proxy1", "proxy2"]` - * where "proxy2" is the furthest down-stream and "proxy1" and - * "proxy2" were trusted. - * - * @return {Array} - * @api public - */ - -defineGetter(req, 'ips', function ips() { - var trust = this.app.get('trust proxy fn'); - var addrs = proxyaddr.all(this, trust); - return addrs.slice(1).reverse(); -}); - -/** - * Return subdomains as an array. - * - * Subdomains are the dot-separated parts of the host before the main domain of - * the app. By default, the domain of the app is assumed to be the last two - * parts of the host. This can be changed by setting "subdomain offset". - * - * For example, if the domain is "tobi.ferrets.example.com": - * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. - * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. - * - * @return {Array} - * @api public - */ - -defineGetter(req, 'subdomains', function subdomains() { - var offset = this.app.get('subdomain offset'); - return (this.hostname || '') - .split('.') - .reverse() - .slice(offset); -}); - -/** - * Short-hand for `url.parse(req.url).pathname`. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'path', function path() { - return parse(this).pathname; -}); - -/** - * Parse the "Host" header field to a hostname. - * - * When the "trust proxy" setting trusts the socket - * address, the "X-Forwarded-Host" header field will - * be trusted. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'hostname', function hostname(){ - var trust = this.app.get('trust proxy fn'); - var host = this.get('X-Forwarded-Host'); - - if (!host || !trust(this.connection.remoteAddress)) { - host = this.get('Host'); - } - - if (!host) return; - - // IPv6 literal support - var offset = host[0] === '[' - ? host.indexOf(']') + 1 - : 0; - var index = host.indexOf(':', offset); - - return ~index - ? host.substring(0, index) - : host; -}); - -// TODO: change req.host to return host in next major - -defineGetter(req, 'host', deprecate.function(function host(){ - return this.hostname; -}, 'req.host: Use req.hostname instead')); - -/** - * Check if the request is fresh, aka - * Last-Modified and/or the ETag - * still match. - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'fresh', function(){ - var method = this.method; - var s = this.res.statusCode; - - // GET or HEAD for weak freshness validation only - if ('GET' != method && 'HEAD' != method) return false; - - // 2xx or 304 as per rfc2616 14.26 - if ((s >= 200 && s < 300) || 304 == s) { - return fresh(this.headers, this.res._headers); - } - - return false; -}); - -/** - * Check if the request is stale, aka - * "Last-Modified" and / or the "ETag" for the - * resource has changed. - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'stale', function stale(){ - return !this.fresh; -}); - -/** - * Check if the request was an _XMLHttpRequest_. - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'xhr', function xhr(){ - var val = this.get('X-Requested-With') || ''; - return 'xmlhttprequest' == val.toLowerCase(); -}); - -/** - * Helper function for creating a getter on an object. - * - * @param {Object} obj - * @param {String} name - * @param {Function} getter - * @api private - */ -function defineGetter(obj, name, getter) { - Object.defineProperty(obj, name, { - configurable: true, - enumerable: true, - get: getter - }); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/response.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/response.js deleted file mode 100644 index eff48d7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/response.js +++ /dev/null @@ -1,831 +0,0 @@ -/** - * Module dependencies. - */ - -var deprecate = require('depd')('express'); -var escapeHtml = require('escape-html'); -var http = require('http'); -var path = require('path'); -var mixin = require('utils-merge'); -var sign = require('cookie-signature').sign; -var normalizeType = require('./utils').normalizeType; -var normalizeTypes = require('./utils').normalizeTypes; -var setCharset = require('./utils').setCharset; -var contentDisposition = require('./utils').contentDisposition; -var statusCodes = http.STATUS_CODES; -var cookie = require('cookie'); -var send = require('send'); -var basename = path.basename; -var extname = path.extname; -var mime = send.mime; -var vary = require('vary'); - -/** - * Response prototype. - */ - -var res = module.exports = { - __proto__: http.ServerResponse.prototype -}; - -/** - * Set status `code`. - * - * @param {Number} code - * @return {ServerResponse} - * @api public - */ - -res.status = function(code){ - this.statusCode = code; - return this; -}; - -/** - * Set Link header field with the given `links`. - * - * Examples: - * - * res.links({ - * next: 'http://api.example.com/users?page=2', - * last: 'http://api.example.com/users?page=5' - * }); - * - * @param {Object} links - * @return {ServerResponse} - * @api public - */ - -res.links = function(links){ - var link = this.get('Link') || ''; - if (link) link += ', '; - return this.set('Link', link + Object.keys(links).map(function(rel){ - return '<' + links[rel] + '>; rel="' + rel + '"'; - }).join(', ')); -}; - -/** - * Send a response. - * - * Examples: - * - * res.send(new Buffer('wahoo')); - * res.send({ some: 'json' }); - * res.send('

some html

'); - * - * @param {string|number|boolean|object|Buffer} body - * @api public - */ - -res.send = function send(body) { - var chunk = body; - var encoding; - var len; - var req = this.req; - var type; - - // settings - var app = this.app; - - // allow status / body - if (arguments.length === 2) { - // res.send(body, status) backwards compat - if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') { - deprecate('res.send(body, status): Use res.status(status).send(body) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.send(status, body): Use res.status(status).send(body) instead'); - this.statusCode = arguments[0]; - chunk = arguments[1]; - } - } - - // disambiguate res.send(status) and res.send(status, num) - if (typeof chunk === 'number' && arguments.length === 1) { - // res.send(status) will set status message as text string - if (!this.get('Content-Type')) { - this.type('txt'); - } - - deprecate('res.send(status): Use res.status(status).end() instead'); - this.statusCode = chunk; - chunk = http.STATUS_CODES[chunk]; - } - - switch (typeof chunk) { - // string defaulting to html - case 'string': - if (!this.get('Content-Type')) { - this.type('html'); - } - break; - case 'boolean': - case 'number': - case 'object': - if (chunk === null) { - chunk = ''; - } else if (Buffer.isBuffer(chunk)) { - if (!this.get('Content-Type')) { - this.type('bin'); - } - } else { - return this.json(chunk); - } - break; - } - - // write strings in utf-8 - if (typeof chunk === 'string') { - encoding = 'utf8'; - type = this.get('Content-Type'); - - // reflect this in content-type - if (typeof type === 'string') { - this.set('Content-Type', setCharset(type, 'utf-8')); - } - } - - // populate Content-Length - if (chunk !== undefined) { - if (!Buffer.isBuffer(chunk)) { - // convert chunk to Buffer; saves later double conversions - chunk = new Buffer(chunk, encoding); - encoding = undefined; - } - - len = chunk.length; - this.set('Content-Length', len); - } - - // method check - var isHead = req.method === 'HEAD'; - - // ETag support - if (len !== undefined && (isHead || req.method === 'GET')) { - var etag = app.get('etag fn'); - if (etag && !this.get('ETag')) { - etag = etag(chunk, encoding); - etag && this.set('ETag', etag); - } - } - - // freshness - if (req.fresh) this.statusCode = 304; - - // strip irrelevant headers - if (204 == this.statusCode || 304 == this.statusCode) { - this.removeHeader('Content-Type'); - this.removeHeader('Content-Length'); - this.removeHeader('Transfer-Encoding'); - chunk = ''; - } - - // skip body for HEAD - if (isHead) { - this.end(); - } - - // respond - this.end(chunk, encoding); - - return this; -}; - -/** - * Send JSON response. - * - * Examples: - * - * res.json(null); - * res.json({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @api public - */ - -res.json = function json(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.json(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.json(status, obj): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(val, replacer, spaces); - - // content-type - if (!this.get('Content-Type')) { - this.set('Content-Type', 'application/json'); - } - - return this.send(body); -}; - -/** - * Send JSON response with JSONP callback support. - * - * Examples: - * - * res.jsonp(null); - * res.jsonp({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @api public - */ - -res.jsonp = function jsonp(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.jsonp(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(val, replacer, spaces); - var callback = this.req.query[app.get('jsonp callback name')]; - - // content-type - if (!this.get('Content-Type')) { - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'application/json'); - } - - // fixup callback - if (Array.isArray(callback)) { - callback = callback[0]; - } - - // jsonp - if (typeof callback === 'string' && callback.length !== 0) { - this.charset = 'utf-8'; - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'text/javascript'); - - // restrict callback charset - callback = callback.replace(/[^\[\]\w$.]/g, ''); - - // replace chars not allowed in JavaScript that are in JSON - body = body - .replace(/\u2028/g, '\\u2028') - .replace(/\u2029/g, '\\u2029'); - - // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse" - // the typeof check is just to reduce client error noise - body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');'; - } - - return this.send(body); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `fn(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.sentHeader` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 (can be string converted by `ms`) - * - `root` root directory for relative filenames - * - `headers` object of headers to serve with file - * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them - * - * Other options are passed along to `send`. - * - * Examples: - * - * The following example illustrates how `res.sendfile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendfile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendfile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @api public - */ - -res.sendfile = function(path, options, fn){ - options = options || {}; - var self = this; - var req = self.req; - var next = this.req.next; - var done; - - - // support function as second arg - if ('function' == typeof options) { - fn = options; - options = {}; - } - - // socket errors - req.socket.on('error', error); - - // errors - function error(err) { - if (done) return; - done = true; - - // clean up - cleanup(); - - // callback available - if (fn) return fn(err); - - // delegate - next(err); - } - - // streaming - function stream(stream) { - if (done) return; - cleanup(); - if (fn) stream.on('end', fn); - } - - // cleanup - function cleanup() { - req.socket.removeListener('error', error); - } - - // transfer - var file = send(req, path, options); - file.on('error', error); - file.on('directory', next); - file.on('stream', stream); - - if (options.headers) { - // set headers on successful transfer - file.on('headers', function headers(res) { - var obj = options.headers; - var keys = Object.keys(obj); - - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - res.setHeader(k, obj[k]); - } - }); - } - - // pipe - file.pipe(this); - this.on('finish', cleanup); -}; - -/** - * Transfer the file at the given `path` as an attachment. - * - * Optionally providing an alternate attachment `filename`, - * and optional callback `fn(err)`. The callback is invoked - * when the data transfer is complete, or when an error has - * ocurred. Be sure to check `res.headersSent` if you plan to respond. - * - * This method uses `res.sendfile()`. - * - * @api public - */ - -res.download = function(path, filename, fn){ - // support function as second arg - if ('function' == typeof filename) { - fn = filename; - filename = null; - } - - filename = filename || path; - - // set Content-Disposition when file is sent - var headers = { - 'Content-Disposition': contentDisposition(filename) - }; - - return this.sendfile(path, { headers: headers }, fn); -}; - -/** - * Set _Content-Type_ response header with `type` through `mime.lookup()` - * when it does not contain "/", or set the Content-Type to `type` otherwise. - * - * Examples: - * - * res.type('.html'); - * res.type('html'); - * res.type('json'); - * res.type('application/json'); - * res.type('png'); - * - * @param {String} type - * @return {ServerResponse} for chaining - * @api public - */ - -res.contentType = -res.type = function(type){ - return this.set('Content-Type', ~type.indexOf('/') - ? type - : mime.lookup(type)); -}; - -/** - * Respond to the Acceptable formats using an `obj` - * of mime-type callbacks. - * - * This method uses `req.accepted`, an array of - * acceptable types ordered by their quality values. - * When "Accept" is not present the _first_ callback - * is invoked, otherwise the first match is used. When - * no match is performed the server responds with - * 406 "Not Acceptable". - * - * Content-Type is set for you, however if you choose - * you may alter this within the callback using `res.type()` - * or `res.set('Content-Type', ...)`. - * - * res.format({ - * 'text/plain': function(){ - * res.send('hey'); - * }, - * - * 'text/html': function(){ - * res.send('

hey

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

hey

'); - * }, - * - * json: function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * By default Express passes an `Error` - * with a `.status` of 406 to `next(err)` - * if a match is not made. If you provide - * a `.default` callback it will be invoked - * instead. - * - * @param {Object} obj - * @return {ServerResponse} for chaining - * @api public - */ - -res.format = function(obj){ - var req = this.req; - var next = req.next; - - var fn = obj.default; - if (fn) delete obj.default; - var keys = Object.keys(obj); - - var key = req.accepts(keys); - - this.vary("Accept"); - - if (key) { - this.set('Content-Type', normalizeType(key).value); - obj[key](req, this, next); - } else if (fn) { - fn(); - } else { - var err = new Error('Not Acceptable'); - err.status = 406; - err.types = normalizeTypes(keys).map(function(o){ return o.value }); - next(err); - } - - return this; -}; - -/** - * Set _Content-Disposition_ header to _attachment_ with optional `filename`. - * - * @param {String} filename - * @return {ServerResponse} - * @api public - */ - -res.attachment = function(filename){ - if (filename) this.type(extname(filename)); - this.set('Content-Disposition', contentDisposition(filename)); - return this; -}; - -/** - * Set header `field` to `val`, or pass - * an object of header fields. - * - * Examples: - * - * res.set('Foo', ['bar', 'baz']); - * res.set('Accept', 'application/json'); - * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); - * - * Aliased as `res.header()`. - * - * @param {String|Object|Array} field - * @param {String} val - * @return {ServerResponse} for chaining - * @api public - */ - -res.set = -res.header = function header(field, val) { - if (arguments.length === 2) { - if (Array.isArray(val)) val = val.map(String); - else val = String(val); - if ('content-type' == field.toLowerCase() && !/;\s*charset\s*=/.test(val)) { - var charset = mime.charsets.lookup(val.split(';')[0]); - if (charset) val += '; charset=' + charset.toLowerCase(); - } - this.setHeader(field, val); - } else { - for (var key in field) { - this.set(key, field[key]); - } - } - return this; -}; - -/** - * Get value for header `field`. - * - * @param {String} field - * @return {String} - * @api public - */ - -res.get = function(field){ - return this.getHeader(field); -}; - -/** - * Clear cookie `name`. - * - * @param {String} name - * @param {Object} options - * @return {ServerResponse} for chaining - * @api public - */ - -res.clearCookie = function(name, options){ - var opts = { expires: new Date(1), path: '/' }; - return this.cookie(name, '', options - ? mixin(opts, options) - : opts); -}; - -/** - * Set cookie `name` to `val`, with the given `options`. - * - * Options: - * - * - `maxAge` max-age in milliseconds, converted to `expires` - * - `signed` sign the cookie - * - `path` defaults to "/" - * - * Examples: - * - * // "Remember Me" for 15 minutes - * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); - * - * // save as above - * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) - * - * @param {String} name - * @param {String|Object} val - * @param {Options} options - * @return {ServerResponse} for chaining - * @api public - */ - -res.cookie = function(name, val, options){ - options = mixin({}, options); - var secret = this.req.secret; - var signed = options.signed; - if (signed && !secret) throw new Error('cookieParser("secret") required for signed cookies'); - if ('number' == typeof val) val = val.toString(); - if ('object' == typeof val) val = 'j:' + JSON.stringify(val); - if (signed) val = 's:' + sign(val, secret); - if ('maxAge' in options) { - options.expires = new Date(Date.now() + options.maxAge); - options.maxAge /= 1000; - } - if (null == options.path) options.path = '/'; - var headerVal = cookie.serialize(name, String(val), options); - - // supports multiple 'res.cookie' calls by getting previous value - var prev = this.get('Set-Cookie'); - if (prev) { - if (Array.isArray(prev)) { - headerVal = prev.concat(headerVal); - } else { - headerVal = [prev, headerVal]; - } - } - this.set('Set-Cookie', headerVal); - return this; -}; - - -/** - * Set the location header to `url`. - * - * The given `url` can also be "back", which redirects - * to the _Referrer_ or _Referer_ headers or "/". - * - * Examples: - * - * res.location('/foo/bar').; - * res.location('http://example.com'); - * res.location('../login'); - * - * @param {String} url - * @return {ServerResponse} for chaining - * @api public - */ - -res.location = function(url){ - var req = this.req; - - // "back" is an alias for the referrer - if ('back' == url) url = req.get('Referrer') || '/'; - - // Respond - this.set('Location', url); - return this; -}; - -/** - * Redirect to the given `url` with optional response `status` - * defaulting to 302. - * - * The resulting `url` is determined by `res.location()`, so - * it will play nicely with mounted apps, relative paths, - * `"back"` etc. - * - * Examples: - * - * res.redirect('/foo/bar'); - * res.redirect('http://example.com'); - * res.redirect(301, 'http://example.com'); - * res.redirect('../login'); // /blog/post/1 -> /blog/login - * - * @api public - */ - -res.redirect = function redirect(url) { - var address = url; - var body; - var status = 302; - - // allow status / url - if (arguments.length === 2) { - if (typeof arguments[0] === 'number') { - status = arguments[0]; - address = arguments[1]; - } else { - deprecate('res.redirect(ur, status): Use res.redirect(status, url) instead'); - status = arguments[1]; - } - } - - // Set location header - this.location(address); - address = this.get('Location'); - - // Support text/{plain,html} by default - this.format({ - text: function(){ - body = statusCodes[status] + '. Redirecting to ' + encodeURI(url); - }, - - html: function(){ - var u = escapeHtml(url); - body = '

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

'; - }, - - default: function(){ - body = ''; - } - }); - - // Respond - this.statusCode = status; - this.set('Content-Length', Buffer.byteLength(body)); - - if (this.req.method === 'HEAD') { - this.end(); - } - - this.end(body); -}; - -/** - * Add `field` to Vary. If already present in the Vary set, then - * this call is simply ignored. - * - * @param {Array|String} field - * @return {ServerResponse} for chaining - * @api public - */ - -res.vary = function(field){ - // checks for back-compat - if (!field || (Array.isArray(field) && !field.length)) { - deprecate('res.vary(): Provide a field name'); - return this; - } - - vary(this, field); - - return this; -}; - -/** - * Render `view` with the given `options` and optional callback `fn`. - * When a callback function is given a response will _not_ be made - * automatically, otherwise a response of _200_ and _text/html_ is given. - * - * Options: - * - * - `cache` boolean hinting to the engine it should cache - * - `filename` filename of the view being rendered - * - * @api public - */ - -res.render = function(view, options, fn){ - options = options || {}; - var self = this; - var req = this.req; - var app = req.app; - - // support callback function as second arg - if ('function' == typeof options) { - fn = options, options = {}; - } - - // merge res.locals - options._locals = self.locals; - - // default callback to respond - fn = fn || function(err, str){ - if (err) return req.next(err); - self.send(str); - }; - - // render - app.render(view, options, fn); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/index.js deleted file mode 100644 index 4e63eb1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/index.js +++ /dev/null @@ -1,548 +0,0 @@ -/** - * Module dependencies. - */ - -var Route = require('./route'); -var Layer = require('./layer'); -var methods = require('methods'); -var mixin = require('utils-merge'); -var debug = require('debug')('express:router'); -var parseUrl = require('parseurl'); -var slice = Array.prototype.slice; -var toString = Object.prototype.toString; -var utils = require('../utils'); - -/** - * Initialize a new `Router` with the given `options`. - * - * @param {Object} options - * @return {Router} which is an callable function - * @api public - */ - -var proto = module.exports = function(options) { - options = options || {}; - - function router(req, res, next) { - router.handle(req, res, next); - } - - // mixin Router class functions - router.__proto__ = proto; - - router.params = {}; - router._params = []; - router.caseSensitive = options.caseSensitive; - router.mergeParams = options.mergeParams; - router.strict = options.strict; - router.stack = []; - - return router; -}; - -/** - * Map the given param placeholder `name`(s) to the given callback. - * - * Parameter mapping is used to provide pre-conditions to routes - * which use normalized placeholders. For example a _:user_id_ parameter - * could automatically load a user's information from the database without - * any additional code, - * - * The callback uses the same signature as middleware, the only difference - * being that the value of the placeholder is passed, in this case the _id_ - * of the user. Once the `next()` function is invoked, just like middleware - * it will continue on to execute the route, or subsequent parameter functions. - * - * Just like in middleware, you must either respond to the request or call next - * to avoid stalling the request. - * - * app.param('user_id', function(req, res, next, id){ - * User.find(id, function(err, user){ - * if (err) { - * return next(err); - * } else if (!user) { - * return next(new Error('failed to load user')); - * } - * req.user = user; - * next(); - * }); - * }); - * - * @param {String} name - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -proto.param = function(name, fn){ - // param logic - if ('function' == typeof name) { - this._params.push(name); - return; - } - - // apply param functions - var params = this._params; - var len = params.length; - var ret; - - if (name[0] === ':') { - name = name.substr(1); - } - - 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; -}; - -/** - * Dispatch a req, res into the router. - * - * @api private - */ - -proto.handle = function(req, res, done) { - var self = this; - - debug('dispatching %s %s', req.method, req.url); - - var search = 1 + req.url.indexOf('?'); - var pathlength = search ? search - 1 : req.url.length; - var fqdn = 1 + req.url.substr(0, pathlength).indexOf('://'); - var protohost = fqdn ? req.url.substr(0, req.url.indexOf('/', 2 + fqdn)) : ''; - var idx = 0; - var removed = ''; - var slashAdded = false; - var paramcalled = {}; - - // store options for OPTIONS request - // only used if OPTIONS request - var options = []; - - // middleware and routes - var stack = self.stack; - - // manage inter-router variables - var parentParams = req.params; - var parentUrl = req.baseUrl || ''; - done = restore(done, req, 'baseUrl', 'next', 'params'); - - // setup next layer - req.next = next; - - // for options requests, respond with a default if nothing else responds - if (req.method === 'OPTIONS') { - done = wrap(done, function(old, err) { - if (err || options.length === 0) return old(err); - - var body = options.join(','); - return res.set('Allow', body).send(body); - }); - } - - // setup basic req values - req.baseUrl = parentUrl; - req.originalUrl = req.originalUrl || req.url; - - next(); - - function next(err) { - var layerError = err === 'route' - ? null - : err; - - var layer = stack[idx++]; - - if (slashAdded) { - req.url = req.url.substr(1); - slashAdded = false; - } - - if (removed.length !== 0) { - req.baseUrl = parentUrl; - req.url = protohost + removed + req.url.substr(protohost.length); - removed = ''; - } - - if (!layer) { - return done(layerError); - } - - self.match_layer(layer, req, res, function (err, path) { - if (err || path === undefined) { - return next(layerError || err); - } - - // route object and not middleware - var route = layer.route; - - // if final route, then we support options - if (route) { - // we don't run any routes with error first - if (layerError) { - return next(layerError); - } - - var method = req.method; - var has_method = route._handles_method(method); - - // build up automatic options response - if (!has_method && method === 'OPTIONS') { - options.push.apply(options, route._options()); - } - - // don't even bother - if (!has_method && method !== 'HEAD') { - return next(); - } - - // we can now dispatch to the route - req.route = route; - } - - // Capture one-time layer values - req.params = self.mergeParams - ? mergeParams(layer.params, parentParams) - : layer.params; - var layerPath = layer.path; - - // this should be done for the layer - self.process_params(layer, paramcalled, req, res, function (err) { - if (err) { - return next(layerError || err); - } - - if (route) { - return layer.handle_request(req, res, next); - } - - trim_prefix(layer, layerError, layerPath, path); - }); - }); - } - - function trim_prefix(layer, layerError, layerPath, path) { - var c = path[layerPath.length]; - if (c && '/' !== c && '.' !== c) return next(layerError); - - // Trim off the part of the url that matches the route - // middleware (.use stuff) needs to have the path stripped - if (layerPath.length !== 0) { - debug('trim prefix (%s) from url %s', layerPath, req.url); - removed = layerPath; - req.url = protohost + req.url.substr(protohost.length + removed.length); - - // Ensure leading slash - if (!fqdn && req.url[0] !== '/') { - req.url = '/' + req.url; - slashAdded = true; - } - - // Setup base URL (no trailing slash) - req.baseUrl = parentUrl + (removed[removed.length - 1] === '/' - ? removed.substring(0, removed.length - 1) - : removed); - } - - debug('%s %s : %s', layer.name, layerPath, req.originalUrl); - - if (layerError) { - layer.handle_error(layerError, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Match request to a layer. - * - * @api private - */ - -proto.match_layer = function match_layer(layer, req, res, done) { - var error = null; - var path; - - try { - path = parseUrl(req).pathname; - - if (!layer.match(path)) { - path = undefined; - } - } catch (err) { - error = err; - } - - done(error, path); -}; - -/** - * Process any parameters for the layer. - * - * @api private - */ - -proto.process_params = function(layer, called, req, res, done) { - var params = this.params; - - // captured parameters from the layer, keys and values - var keys = layer.keys; - - // fast track - if (!keys || keys.length === 0) { - return done(); - } - - var i = 0; - var name; - var paramIndex = 0; - var key; - var paramVal; - var paramCallbacks; - var paramCalled; - - // process params in order - // param callbacks can be async - function param(err) { - if (err) { - return done(err); - } - - if (i >= keys.length ) { - return done(); - } - - paramIndex = 0; - key = keys[i++]; - - if (!key) { - return done(); - } - - name = key.name; - paramVal = req.params[name]; - paramCallbacks = params[name]; - paramCalled = called[name]; - - if (paramVal === undefined || !paramCallbacks) { - return param(); - } - - // param previously called with same value or error occurred - if (paramCalled && (paramCalled.error || paramCalled.match === paramVal)) { - // restore value - req.params[name] = paramCalled.value; - - // next param - return param(paramCalled.error); - } - - called[name] = paramCalled = { - error: null, - match: paramVal, - value: paramVal - }; - - paramCallback(); - } - - // single param callbacks - function paramCallback(err) { - var fn = paramCallbacks[paramIndex++]; - - // store updated value - paramCalled.value = req.params[key.name]; - - if (err) { - // store error - paramCalled.error = err; - param(err); - return; - } - - if (!fn) return param(); - - try { - fn(req, res, paramCallback, paramVal, key.name); - } catch (e) { - paramCallback(e); - } - } - - param(); -}; - -/** - * Use the given middleware function, with optional path, defaulting to "/". - * - * Use (like `.all`) will run for any http METHOD, but it will not add - * handlers for those methods so OPTIONS requests will not consider `.use` - * functions even if they could respond. - * - * The other difference is that _route_ path is stripped and not visible - * to the handler function. The main effect of this feature is that mounted - * handlers can operate without any code changes regardless of the "prefix" - * pathname. - * - * @api public - */ - -proto.use = function use(fn) { - var offset = 0; - var path = '/'; - var self = this; - - // default path to '/' - if (typeof fn !== 'function') { - offset = 1; - path = fn; - } - - var callbacks = utils.flatten(slice.call(arguments, offset)); - - if (callbacks.length === 0) { - throw new TypeError('Router.use() requires callback function'); - } - - callbacks.forEach(function (fn) { - if (typeof fn !== 'function') { - var type = toString.call(fn); - var msg = 'Router.use() requires callback function but got a ' + type; - throw new TypeError(msg); - } - - // add the middleware - debug('use %s %s', path, fn.name || ''); - - var layer = new Layer(path, { - sensitive: self.caseSensitive, - strict: false, - end: false - }, fn); - - layer.route = undefined; - - self.stack.push(layer); - }); - - return this; -}; - -/** - * Create a new Route for the given path. - * - * Each route contains a separate middleware stack and VERB handlers. - * - * See the Route api documentation for details on adding handlers - * and middleware to routes. - * - * @param {String} path - * @return {Route} - * @api public - */ - -proto.route = function(path){ - var route = new Route(path); - - var layer = new Layer(path, { - sensitive: this.caseSensitive, - strict: this.strict, - end: true - }, route.dispatch.bind(route)); - - layer.route = route; - - this.stack.push(layer); - return route; -}; - -// create Router#VERB functions -methods.concat('all').forEach(function(method){ - proto[method] = function(path){ - var route = this.route(path) - route[method].apply(route, slice.call(arguments, 1)); - return this; - }; -}); - -// merge params with parent params -function mergeParams(params, parent) { - if (typeof parent !== 'object' || !parent) { - return params; - } - - // make copy of parent for base - var obj = mixin({}, parent); - - // simple non-numeric merging - if (!(0 in params) || !(0 in parent)) { - return mixin(obj, params); - } - - var i = 0; - var o = 0; - - // determine numeric gaps - while (i === o || o in parent) { - if (i in params) i++; - if (o in parent) o++; - } - - // offset numeric indices in params before merge - for (i--; i >= 0; i--) { - params[i + o] = params[i]; - - // create holes for the merge when necessary - if (i < o) { - delete params[i]; - } - } - - return mixin(parent, params); -} - -// restore obj props after function -function restore(fn, obj) { - var props = new Array(arguments.length - 2); - var vals = new Array(arguments.length - 2); - - for (var i = 0; i < props.length; i++) { - props[i] = arguments[i + 2]; - vals[i] = obj[props[i]]; - } - - return function(err){ - // restore vals - for (var i = 0; i < props.length; i++) { - obj[props[i]] = vals[i]; - } - - return fn.apply(this, arguments); - }; -} - -// wrap a function -function wrap(old, fn) { - return function proxy() { - var args = new Array(arguments.length + 1); - - args[0] = old; - for (var i = 0, len = arguments.length; i < len; i++) { - args[i + 1] = arguments[i]; - } - - fn.apply(this, args); - }; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/layer.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/layer.js deleted file mode 100644 index e292a13..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/layer.js +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Module dependencies. - */ - -var pathRegexp = require('path-to-regexp'); -var debug = require('debug')('express:router:layer'); - -/** - * Expose `Layer`. - */ - -module.exports = Layer; - -function Layer(path, options, fn) { - if (!(this instanceof Layer)) { - return new Layer(path, options, fn); - } - - debug('new %s', path); - options = options || {}; - - this.handle = fn; - this.name = fn.name || ''; - this.params = undefined; - this.path = undefined; - this.regexp = pathRegexp(path, this.keys = [], options); - - if (path === '/' && options.end === false) { - this.regexp.fast_slash = true; - } -} - -/** - * Handle the error for the layer. - * - * @param {Error} error - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_error = function handle_error(error, req, res, next) { - var fn = this.handle; - - if (fn.length !== 4) { - // not a standard error handler - return next(error); - } - - try { - fn(error, req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Handle the request for the layer. - * - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_request = function handle(req, res, next) { - var fn = this.handle; - - if (fn.length > 3) { - // not a standard request handler - return next(); - } - - try { - fn(req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Check if this route matches `path`, if so - * populate `.params`. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -Layer.prototype.match = function match(path) { - if (this.regexp.fast_slash) { - // fast path non-ending match for / (everything matches) - this.params = {}; - this.path = ''; - return true; - } - - var m = this.regexp.exec(path); - - if (!m) { - this.params = undefined; - this.path = undefined; - return false; - } - - // store values - this.params = {}; - this.path = m[0]; - - var keys = this.keys; - var params = this.params; - var n = 0; - var key; - var val; - - for (var i = 1, len = m.length; i < len; ++i) { - key = keys[i - 1]; - val = decode_param(m[i]); - - if (key) { - params[key.name] = val; - } else { - params[n++] = val; - } - } - - return true; -}; - -/** - * Decode param value. - * - * @param {string} val - * @return {string} - * @api private - */ - -function decode_param(val){ - if (typeof val !== 'string') { - return val; - } - - try { - return decodeURIComponent(val); - } catch (e) { - var err = new TypeError("Failed to decode param '" + val + "'"); - err.status = 400; - throw err; - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/match.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/match.js deleted file mode 100644 index ce308c4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/match.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Module dependencies. - */ - -var pathRegexp = require('path-to-regexp'); - -/** - * Expose `Layer`. - */ - -module.exports = Match; - -function Match(layer, path, params) { - this.layer = layer; - this.params = {}; - this.path = path || ''; - - if (!params) { - return this; - } - - var keys = layer.keys; - var n = 0; - var prop; - var key; - var val; - - for (var i = 0; i < params.length; i++) { - key = keys[i]; - val = decode_param(params[i]); - prop = key - ? key.name - : n++; - - this.params[prop] = val; - } - - return this; -}; - -/** - * Decode param value. - * - * @param {string} val - * @return {string} - * @api private - */ - -function decode_param(val){ - if (typeof val !== 'string') { - return val; - } - - try { - return decodeURIComponent(val); - } catch (e) { - var err = new TypeError("Failed to decode param '" + val + "'"); - err.status = 400; - throw err; - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/route.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/route.js deleted file mode 100644 index 6b39211..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/router/route.js +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Module dependencies. - */ - -var debug = require('debug')('express:router:route'); -var Layer = require('./layer'); -var methods = require('methods'); -var utils = require('../utils'); - -/** - * Expose `Route`. - */ - -module.exports = Route; - -/** - * Initialize `Route` with the given `path`, - * - * @param {String} path - * @api private - */ - -function Route(path) { - debug('new %s', path); - this.path = path; - this.stack = []; - - // route handlers for various http methods - this.methods = {}; -} - -/** - * @api private - */ - -Route.prototype._handles_method = function _handles_method(method) { - if (this.methods._all) { - return true; - } - - method = method.toLowerCase(); - - if (method === 'head' && !this.methods['head']) { - method = 'get'; - } - - return Boolean(this.methods[method]); -}; - -/** - * @return {Array} supported HTTP methods - * @api private - */ - -Route.prototype._options = function(){ - return Object.keys(this.methods).map(function(method) { - return method.toUpperCase(); - }); -}; - -/** - * dispatch req, res into this route - * - * @api private - */ - -Route.prototype.dispatch = function(req, res, done){ - var idx = 0; - var stack = this.stack; - if (stack.length === 0) { - return done(); - } - - var method = req.method.toLowerCase(); - if (method === 'head' && !this.methods['head']) { - method = 'get'; - } - - req.route = this; - - next(); - - function next(err) { - if (err && err === 'route') { - return done(); - } - - var layer = stack[idx++]; - if (!layer) { - return done(err); - } - - if (layer.method && layer.method !== method) { - return next(err); - } - - if (err) { - layer.handle_error(err, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Add a handler for all HTTP verbs to this route. - * - * Behaves just like middleware and can respond or call `next` - * to continue processing. - * - * You can use multiple `.all` call to add multiple handlers. - * - * function check_something(req, res, next){ - * next(); - * }; - * - * function validate_user(req, res, next){ - * next(); - * }; - * - * route - * .all(validate_user) - * .all(check_something) - * .get(function(req, res, next){ - * res.send('hello world'); - * }); - * - * @param {function} handler - * @return {Route} for chaining - * @api public - */ - -Route.prototype.all = function(){ - var self = this; - var callbacks = utils.flatten([].slice.call(arguments)); - callbacks.forEach(function(fn) { - if (typeof fn !== 'function') { - var type = {}.toString.call(fn); - var msg = 'Route.all() requires callback functions but got a ' + type; - throw new Error(msg); - } - - var layer = Layer('/', {}, fn); - layer.method = undefined; - - self.methods._all = true; - self.stack.push(layer); - }); - - return self; -}; - -methods.forEach(function(method){ - Route.prototype[method] = function(){ - var self = this; - var callbacks = utils.flatten([].slice.call(arguments)); - - callbacks.forEach(function(fn) { - if (typeof fn !== 'function') { - var type = {}.toString.call(fn); - var msg = 'Route.' + method + '() requires callback functions but got a ' + type; - throw new Error(msg); - } - - debug('%s %s', method, self.path); - - var layer = Layer('/', {}, fn); - layer.method = method; - - self.methods[method] = true; - self.stack.push(layer); - }); - return self; - }; -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/utils.js deleted file mode 100644 index 9f9fdfd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/utils.js +++ /dev/null @@ -1,302 +0,0 @@ -/** - * Module dependencies. - */ - -var mime = require('send').mime; -var crc32 = require('buffer-crc32'); -var crypto = require('crypto'); -var basename = require('path').basename; -var proxyaddr = require('proxy-addr'); -var qs = require('qs'); -var querystring = require('querystring'); -var typer = require('media-typer'); - -/** - * Return strong ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.etag = function etag(body, encoding){ - if (body.length === 0) { - // fast-path empty body - return '"1B2M2Y8AsgTpgAmY7PhCfg=="' - } - - var hash = crypto - .createHash('md5') - .update(body, encoding) - .digest('base64') - return '"' + hash + '"' -}; - -/** - * Return weak ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.wetag = function wetag(body, encoding){ - if (body.length === 0) { - // fast-path empty body - return 'W/"0-0"' - } - - var buf = Buffer.isBuffer(body) - ? body - : new Buffer(body, encoding) - var len = buf.length - return 'W/"' + len.toString(16) + '-' + crc32.unsigned(buf) + '"' -}; - -/** - * 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; - if ('\\\\' == path.substring(0, 2)) return true; // Microsoft Azure absolute path -}; - -/** - * Flatten the given `arr`. - * - * @param {Array} arr - * @return {Array} - * @api private - */ - -exports.flatten = function(arr, ret){ - ret = ret || []; - var len = arr.length; - for (var i = 0; i < len; ++i) { - if (Array.isArray(arr[i])) { - exports.flatten(arr[i], ret); - } else { - ret.push(arr[i]); - } - } - return ret; -}; - -/** - * Normalize the given `type`, for example "html" becomes "text/html". - * - * @param {String} type - * @return {Object} - * @api private - */ - -exports.normalizeType = function(type){ - return ~type.indexOf('/') - ? acceptParams(type) - : { value: mime.lookup(type), params: {} }; -}; - -/** - * Normalize `types`, for example "html" becomes "text/html". - * - * @param {Array} types - * @return {Array} - * @api private - */ - -exports.normalizeTypes = function(types){ - var ret = []; - - for (var i = 0; i < types.length; ++i) { - ret.push(exports.normalizeType(types[i])); - } - - return ret; -}; - -/** - * Generate Content-Disposition header appropriate for the filename. - * non-ascii filenames are urlencoded and a filename* parameter is added - * - * @param {String} filename - * @return {String} - * @api private - */ - -exports.contentDisposition = function(filename){ - var ret = 'attachment'; - if (filename) { - filename = basename(filename); - // if filename contains non-ascii characters, add a utf-8 version ala RFC 5987 - ret = /[^\040-\176]/.test(filename) - ? 'attachment; filename="' + encodeURI(filename) + '"; filename*=UTF-8\'\'' + encodeURI(filename) - : 'attachment; filename="' + filename + '"'; - } - - return ret; -}; - -/** - * Parse accept params `str` returning an - * object with `.value`, `.quality` and `.params`. - * also includes `.originalIndex` for stable sorting - * - * @param {String} str - * @return {Object} - * @api private - */ - -function acceptParams(str, index) { - var parts = str.split(/ *; */); - var ret = { value: parts[0], quality: 1, params: {}, originalIndex: index }; - - for (var i = 1; i < parts.length; ++i) { - var pms = parts[i].split(/ *= */); - if ('q' == pms[0]) { - ret.quality = parseFloat(pms[1]); - } else { - ret.params[pms[0]] = pms[1]; - } - } - - return ret; -} - -/** - * Compile "etag" value to function. - * - * @param {Boolean|String|Function} val - * @return {Function} - * @api private - */ - -exports.compileETag = function(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = exports.wetag; - break; - case false: - break; - case 'strong': - fn = exports.etag; - break; - case 'weak': - fn = exports.wetag; - break; - default: - throw new TypeError('unknown value for etag function: ' + val); - } - - return fn; -} - -/** - * Compile "query parser" value to function. - * - * @param {String|Function} val - * @return {Function} - * @api private - */ - -exports.compileQueryParser = function compileQueryParser(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = querystring.parse; - break; - case false: - fn = newObject; - break; - case 'extended': - fn = qs.parse; - break; - case 'simple': - fn = querystring.parse; - break; - default: - throw new TypeError('unknown value for query parser function: ' + val); - } - - return fn; -} - -/** - * Compile "proxy trust" value to function. - * - * @param {Boolean|String|Number|Array|Function} val - * @return {Function} - * @api private - */ - -exports.compileTrust = function(val) { - if (typeof val === 'function') return val; - - if (val === true) { - // Support plain true/false - return function(){ return true }; - } - - if (typeof val === 'number') { - // Support trusting hop count - return function(a, i){ return i < val }; - } - - if (typeof val === 'string') { - // Support comma-separated values - val = val.split(/ *, */); - } - - return proxyaddr.compile(val || []); -} - -/** - * Set the charset in a given Content-Type string. - * - * @param {String} type - * @param {String} charset - * @return {String} - * @api private - */ - -exports.setCharset = function(type, charset){ - if (!type || !charset) return type; - - // parse type - var parsed = typer.parse(type); - - // set charset - parsed.parameters.charset = charset; - - // format type - return typer.format(parsed); -}; - -/** - * Return new empty objet. - * - * @return {Object} - * @api private - */ - -function newObject() { - return {}; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/view.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/view.js deleted file mode 100644 index 989e8bb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/lib/view.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Module dependencies. - */ - -var path = require('path'); -var fs = require('fs'); -var utils = require('./utils'); -var dirname = path.dirname; -var basename = path.basename; -var extname = path.extname; -var exists = fs.existsSync || path.existsSync; -var join = path.join; - -/** - * Expose `View`. - */ - -module.exports = View; - -/** - * Initialize a new `View` with the given `name`. - * - * Options: - * - * - `defaultEngine` the default template engine name - * - `engines` template engine require() cache - * - `root` root path for view lookup - * - * @param {String} name - * @param {Object} options - * @api private - */ - -function View(name, options) { - options = options || {}; - this.name = name; - this.root = options.root; - var engines = options.engines; - this.defaultEngine = options.defaultEngine; - var ext = this.ext = extname(name); - if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no extension was provided.'); - if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') + this.defaultEngine); - this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express); - this.path = this.lookup(name); -} - -/** - * Lookup view by the given `path` - * - * @param {String} path - * @return {String} - * @api private - */ - -View.prototype.lookup = function(path){ - var ext = this.ext; - - // . - if (!utils.isAbsolute(path)) path = join(this.root, path); - if (exists(path)) return path; - - // /index. - path = join(dirname(path), basename(path, ext), 'index' + ext); - if (exists(path)) return path; -}; - -/** - * Render with the given `options` and callback `fn(err, str)`. - * - * @param {Object} options - * @param {Function} fn - * @api private - */ - -View.prototype.render = function(options, fn){ - this.engine(this.path, options, fn); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/History.md deleted file mode 100644 index 6403131..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/History.md +++ /dev/null @@ -1,42 +0,0 @@ -1.0.7 / 2014-07-04 -================== - - * Fix wrong type returned from `type` when match after unknown extension - -1.0.6 / 2014-06-24 -================== - - * deps: negotiator@0.4.7 - -1.0.5 / 2014-06-20 -================== - - * fix crash when unknown extension given - -1.0.4 / 2014-06-19 -================== - - * use `mime-types` - -1.0.3 / 2014-06-11 -================== - - * deps: negotiator@0.4.6 - - Order by specificity when quality is the same - -1.0.2 / 2014-05-29 -================== - - * Fix interpretation when header not in request - * deps: pin negotiator@0.4.5 - -1.0.1 / 2014-01-18 -================== - - * Identity encoding isn't always acceptable - * deps: negotiator@~0.4.0 - -1.0.0 / 2013-12-27 -================== - - * Genesis diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/README.md deleted file mode 100644 index f65596a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# Accepts - -[![NPM version](https://badge.fury.io/js/accepts.svg)](http://badge.fury.io/js/accepts) -[![Build Status](https://travis-ci.org/expressjs/accepts.svg?branch=master)](https://travis-ci.org/expressjs/accepts) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/accepts.svg?branch=master)](https://coveralls.io/r/expressjs/accepts) - -Higher level content negotation based on [negotiator](https://github.com/federomero/negotiator). Extracted from [koa](https://github.com/koajs/koa) for general use. - -In addition to negotatior, it allows: - -- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` as well as `('text/html', 'application/json')`. -- Allows type shorthands such as `json`. -- Returns `false` when no types match -- Treats non-existent headers as `*` - -## API - -### var accept = new Accepts(req) - -```js -var accepts = require('accepts') - -http.createServer(function (req, res) { - var accept = accepts(req) -}) -``` - -### accept\[property\]\(\) - -Returns all the explicitly accepted content property as an array in descending priority. - -- `accept.types()` -- `accept.encodings()` -- `accept.charsets()` -- `accept.languages()` - -They are also aliased in singular form such as `accept.type()`. `accept.languages()` is also aliased as `accept.langs()`, etc. - -Note: you should almost never do this in a real app as it defeats the purpose of content negotiation. - -Example: - -```js -// in Google Chrome -var encodings = accept.encodings() // -> ['sdch', 'gzip', 'deflate'] -``` - -Since you probably don't support `sdch`, you should just supply the encodings you support: - -```js -var encoding = accept.encodings('gzip', 'deflate') // -> 'gzip', probably -``` - -### accept\[property\]\(values, ...\) - -You can either have `values` be an array or have an argument list of values. - -If the client does not accept any `values`, `false` will be returned. -If the client accepts any `values`, the preferred `value` will be return. - -For `accept.types()`, shorthand mime types are allowed. - -Example: - -```js -// req.headers.accept = 'application/json' - -accept.types('json') // -> 'json' -accept.types('html', 'json') // -> 'json' -accept.types('html') // -> false - -// req.headers.accept = '' -// which is equivalent to `*` - -accept.types() // -> [], no explicit types -accept.types('text/html', 'text/json') // -> 'text/html', since it was first -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/index.js deleted file mode 100644 index 805e33a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/index.js +++ /dev/null @@ -1,160 +0,0 @@ -var Negotiator = require('negotiator') -var mime = require('mime-types') - -var slice = [].slice - -module.exports = Accepts - -function Accepts(req) { - if (!(this instanceof Accepts)) - return new Accepts(req) - - this.headers = req.headers - this.negotiator = Negotiator(req) -} - -/** - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json" or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * this.types('html'); - * // => "html" - * - * // Accept: text/*, application/json - * this.types('html'); - * // => "html" - * this.types('text/html'); - * // => "text/html" - * this.types('json', 'text'); - * // => "json" - * this.types('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * this.types('image/png'); - * this.types('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * this.types(['html', 'json']); - * this.types('html', 'json'); - * // => "json" - * - * @param {String|Array} type(s)... - * @return {String|Array|Boolean} - * @api public - */ - -Accepts.prototype.type = -Accepts.prototype.types = function (types) { - if (!Array.isArray(types)) types = slice.call(arguments); - var n = this.negotiator; - if (!types.length) return n.mediaTypes(); - if (!this.headers.accept) return types[0]; - var mimes = types.map(extToMime); - var accepts = n.mediaTypes(mimes.filter(validMime)); - var first = accepts[0]; - if (!first) return false; - return types[mimes.indexOf(first)]; -} - -/** - * Return accepted encodings or best fit based on `encodings`. - * - * Given `Accept-Encoding: gzip, deflate` - * an array sorted by quality is returned: - * - * ['gzip', 'deflate'] - * - * @param {String|Array} encoding(s)... - * @return {String|Array} - * @api public - */ - -Accepts.prototype.encoding = -Accepts.prototype.encodings = function (encodings) { - if (!Array.isArray(encodings)) encodings = slice.call(arguments); - var n = this.negotiator; - if (!encodings.length) return n.encodings(); - return n.encodings(encodings)[0] || false; -} - -/** - * Return accepted charsets or best fit based on `charsets`. - * - * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` - * an array sorted by quality is returned: - * - * ['utf-8', 'utf-7', 'iso-8859-1'] - * - * @param {String|Array} charset(s)... - * @return {String|Array} - * @api public - */ - -Accepts.prototype.charset = -Accepts.prototype.charsets = function (charsets) { - if (!Array.isArray(charsets)) charsets = [].slice.call(arguments); - var n = this.negotiator; - if (!charsets.length) return n.charsets(); - if (!this.headers['accept-charset']) return charsets[0]; - return n.charsets(charsets)[0] || false; -} - -/** - * Return accepted languages or best fit based on `langs`. - * - * Given `Accept-Language: en;q=0.8, es, pt` - * an array sorted by quality is returned: - * - * ['es', 'pt', 'en'] - * - * @param {String|Array} lang(s)... - * @return {Array|String} - * @api public - */ - -Accepts.prototype.lang = -Accepts.prototype.langs = -Accepts.prototype.language = -Accepts.prototype.languages = function (langs) { - if (!Array.isArray(langs)) langs = slice.call(arguments); - var n = this.negotiator; - if (!langs.length) return n.languages(); - if (!this.headers['accept-language']) return langs[0]; - return n.languages(langs)[0] || false; -} - -/** - * Convert extnames to mime. - * - * @param {String} type - * @return {String} - * @api private - */ - -function extToMime(type) { - if (~type.indexOf('/')) return type; - return mime.lookup(type); -} - -/** - * Check if mime is valid. - * - * @param {String} type - * @return {String} - * @api private - */ - -function validMime(type) { - return typeof type === 'string'; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore deleted file mode 100644 index 919d51b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -test -build.js - -# OS generated files # -###################### -.DS_Store* -# Icon? -ehthumbs.db -Thumbs.db - -# Node.js # -########### -node_modules -npm-debug.log diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml deleted file mode 100644 index 73c85c6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" - - "0.11" -matrix: - allow_failures: - - node_js: "0.11" - fast_finish: true -before_install: - # remove build script deps before install - - node -pe 'f="./package.json";p=require(f);d=p.devDependencies;for(k in d){if("co"===k.substr(0,2))delete d[k]}require("fs").writeFileSync(f,JSON.stringify(p,null,2))' diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile deleted file mode 100644 index ceaf011..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -build: - node --harmony-generators build.js - -test: - node test/mime.js - mocha --require should --reporter spec test/test.js - -.PHONY: build test diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md deleted file mode 100644 index 8e21ee1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# mime-types -[![NPM version](https://badge.fury.io/js/mime-types.svg)](https://badge.fury.io/js/mime-types) [![Build Status](https://travis-ci.org/expressjs/mime-types.svg?branch=master)](https://travis-ci.org/expressjs/mime-types) - -The ultimate javascript content-type utility. - -### Install - -```sh -$ npm install mime-types -``` - -#### Similar to [node-mime](https://github.com/broofa/node-mime), except: - -- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. -- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. -- Additional mime types are added such as jade and stylus. Feel free to add more! -- Browser support via Browserify and Component by converting lists to JSON files. - -Otherwise, the API is compatible. - -### Adding Types - -If you'd like to add additional types, -simply create a PR adding the type to `custom.json` and -a reference link to the [sources](SOURCES.md). - -Do __NOT__ edit `mime.json` or `node.json`. -Those are pulled using `build.js`. -You should only touch `custom.json`. - -## API - -```js -var mime = require('mime-types') -``` - -All functions return `false` if input is invalid or not found. - -### mime.lookup(path) - -Lookup the content-type associated with a file. - -```js -mime.lookup('json') // 'application/json' -mime.lookup('.md') // 'text/x-markdown' -mime.lookup('file.html') // 'text/html' -mime.lookup('folder/file.js') // 'application/javascript' - -mime.lookup('cats') // false -``` - -### mime.contentType(type) - -Create a full content-type header given a content-type or extension. - -```js -mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' -mime.contentType('file.json') // 'application/json; charset=utf-8' -``` - -### mime.extension(type) - -Get the default extension for a content-type. - -```js -mime.extension('application/octet-stream') // 'bin' -``` - -### mime.charset(type) - -Lookup the implied default charset of a content-type. - -```js -mime.charset('text/x-markdown') // 'UTF-8' -``` - -### mime.types[extension] = type - -A map of content-types by extension. - -### mime.extensions[type] = [extensions] - -A map of extensions by content-type. - -### mime.define(types) - -Globally add definitions. -`types` must be an object of the form: - -```js -{ - "": [extensions...], - "": [extensions...] -} -``` - -See the `.json` files in `lib/` for examples. - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md deleted file mode 100644 index 1d65012..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md +++ /dev/null @@ -1,17 +0,0 @@ - -### Sources for custom types - -This is a list of sources for any custom mime types. -When adding custom mime types, please link to where you found the mime type, -even if it's from an unofficial source. - -- `text/coffeescript` - http://coffeescript.org/#scripts -- `text/x-handlebars-template` - https://handlebarsjs.com/#getting-started -- `text/x-sass` & `text/x-scss` - https://github.com/janlelis/rubybuntu-mime/blob/master/sass.xml -- `text.jsx` - http://facebook.github.io/react/docs/getting-started.html [[2]](https://github.com/facebook/react/blob/f230e0a03154e6f8a616e0da1fb3d97ffa1a6472/vendor/browser-transforms.js#L210) - -[Sources for node.json types](https://github.com/broofa/node-mime/blob/master/types/node.types) - -### Notes on weird types - -- `font/opentype` - This type is technically invalid according to the spec. No valid types begin with `font/`. No-one uses the official type of `application/vnd.ms-opentype` as the community standardized `application/x-font-otf`. However, chrome logs nonsense warnings unless opentype fonts are served with `font/opentype`. [[1]](http://stackoverflow.com/questions/2871655/proper-mime-type-for-fonts) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json deleted file mode 100644 index fa67a6d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "0.1.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com", - "twitter": "https://twitter.com/jongleberry" - }, - "repository": "expressjs/mime-types", - "license": "MIT", - "main": "lib/index.js", - "scripts": ["lib/index.js"], - "json": ["mime.json", "node.json", "custom.json"] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json deleted file mode 100644 index 6137da3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "text/jade": [ - "jade" - ], - "text/stylus": [ - "stylus", - "styl" - ], - "text/less": [ - "less" - ], - "text/x-sass": [ - "sass" - ], - "text/x-scss": [ - "scss" - ], - "text/coffeescript": [ - "coffee" - ], - "text/x-handlebars-template": [ - "hbs" - ], - "text/jsx": [ - "jsx" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js deleted file mode 100644 index 27559ea..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js +++ /dev/null @@ -1,74 +0,0 @@ - -// types[extension] = type -exports.types = Object.create(null) -// extensions[type] = [extensions] -exports.extensions = Object.create(null) -// define more mime types -exports.define = define - -// store the json files -exports.json = { - mime: require('./mime.json'), - node: require('./node.json'), - custom: require('./custom.json'), -} - -exports.lookup = function (string) { - if (!string || typeof string !== "string") return false - string = string.replace(/.*[\.\/\\]/, '').toLowerCase() - if (!string) return false - return exports.types[string] || false -} - -exports.extension = function (type) { - if (!type || typeof type !== "string") return false - type = type.match(/^\s*([^;\s]*)(?:;|\s|$)/) - if (!type) return false - var exts = exports.extensions[type[1].toLowerCase()] - if (!exts || !exts.length) return false - return exts[0] -} - -// type has to be an exact mime type -exports.charset = function (type) { - // special cases - switch (type) { - case 'application/json': return 'UTF-8' - } - - // default text/* to utf-8 - if (/^text\//.test(type)) return 'UTF-8' - - return false -} - -// backwards compatibility -exports.charsets = { - lookup: exports.charset -} - -exports.contentType = function (type) { - if (!type || typeof type !== "string") return false - if (!~type.indexOf('/')) type = exports.lookup(type) - if (!type) return false - if (!~type.indexOf('charset')) { - var charset = exports.charset(type) - if (charset) type += '; charset=' + charset.toLowerCase() - } - return type -} - -define(exports.json.mime) -define(exports.json.node) -define(exports.json.custom) - -function define(json) { - Object.keys(json).forEach(function (type) { - var exts = json[type] || [] - exports.extensions[type] = exports.extensions[type] || [] - exts.forEach(function (ext) { - if (!~exports.extensions[type].indexOf(ext)) exports.extensions[type].push(ext) - exports.types[ext] = type - }) - }) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json deleted file mode 100644 index f445a86..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json +++ /dev/null @@ -1,3317 +0,0 @@ -{ - "application/1d-interleaved-parityfec": [], - "application/3gpp-ims+xml": [], - "application/activemessage": [], - "application/andrew-inset": [ - "ez" - ], - "application/applefile": [], - "application/applixware": [ - "aw" - ], - "application/atom+xml": [ - "atom" - ], - "application/atomcat+xml": [ - "atomcat" - ], - "application/atomicmail": [], - "application/atomsvc+xml": [ - "atomsvc" - ], - "application/auth-policy+xml": [], - "application/batch-smtp": [], - "application/beep+xml": [], - "application/calendar+xml": [], - "application/cals-1840": [], - "application/ccmp+xml": [], - "application/ccxml+xml": [ - "ccxml" - ], - "application/cdmi-capability": [ - "cdmia" - ], - "application/cdmi-container": [ - "cdmic" - ], - "application/cdmi-domain": [ - "cdmid" - ], - "application/cdmi-object": [ - "cdmio" - ], - "application/cdmi-queue": [ - "cdmiq" - ], - "application/cea-2018+xml": [], - "application/cellml+xml": [], - "application/cfw": [], - "application/cnrp+xml": [], - "application/commonground": [], - "application/conference-info+xml": [], - "application/cpl+xml": [], - "application/csta+xml": [], - "application/cstadata+xml": [], - "application/cu-seeme": [ - "cu" - ], - "application/cybercash": [], - "application/davmount+xml": [ - "davmount" - ], - "application/dca-rft": [], - "application/dec-dx": [], - "application/dialog-info+xml": [], - "application/dicom": [], - "application/dns": [], - "application/docbook+xml": [ - "dbk" - ], - "application/dskpp+xml": [], - "application/dssc+der": [ - "dssc" - ], - "application/dssc+xml": [ - "xdssc" - ], - "application/dvcs": [], - "application/ecmascript": [ - "ecma" - ], - "application/edi-consent": [], - "application/edi-x12": [], - "application/edifact": [], - "application/emma+xml": [ - "emma" - ], - "application/epp+xml": [], - "application/epub+zip": [ - "epub" - ], - "application/eshop": [], - "application/example": [], - "application/exi": [ - "exi" - ], - "application/fastinfoset": [], - "application/fastsoap": [], - "application/fits": [], - "application/font-tdpfr": [ - "pfr" - ], - "application/framework-attributes+xml": [], - "application/gml+xml": [ - "gml" - ], - "application/gpx+xml": [ - "gpx" - ], - "application/gxf": [ - "gxf" - ], - "application/h224": [], - "application/held+xml": [], - "application/http": [], - "application/hyperstudio": [ - "stk" - ], - "application/ibe-key-request+xml": [], - "application/ibe-pkg-reply+xml": [], - "application/ibe-pp-data": [], - "application/iges": [], - "application/im-iscomposing+xml": [], - "application/index": [], - "application/index.cmd": [], - "application/index.obj": [], - "application/index.response": [], - "application/index.vnd": [], - "application/inkml+xml": [ - "ink", - "inkml" - ], - "application/iotp": [], - "application/ipfix": [ - "ipfix" - ], - "application/ipp": [], - "application/isup": [], - "application/java-archive": [ - "jar" - ], - "application/java-serialized-object": [ - "ser" - ], - "application/java-vm": [ - "class" - ], - "application/javascript": [ - "js" - ], - "application/json": [ - "json" - ], - "application/jsonml+json": [ - "jsonml" - ], - "application/kpml-request+xml": [], - "application/kpml-response+xml": [], - "application/lost+xml": [ - "lostxml" - ], - "application/mac-binhex40": [ - "hqx" - ], - "application/mac-compactpro": [ - "cpt" - ], - "application/macwriteii": [], - "application/mads+xml": [ - "mads" - ], - "application/marc": [ - "mrc" - ], - "application/marcxml+xml": [ - "mrcx" - ], - "application/mathematica": [ - "ma", - "nb", - "mb" - ], - "application/mathml-content+xml": [], - "application/mathml-presentation+xml": [], - "application/mathml+xml": [ - "mathml" - ], - "application/mbms-associated-procedure-description+xml": [], - "application/mbms-deregister+xml": [], - "application/mbms-envelope+xml": [], - "application/mbms-msk+xml": [], - "application/mbms-msk-response+xml": [], - "application/mbms-protection-description+xml": [], - "application/mbms-reception-report+xml": [], - "application/mbms-register+xml": [], - "application/mbms-register-response+xml": [], - "application/mbms-user-service-description+xml": [], - "application/mbox": [ - "mbox" - ], - "application/media_control+xml": [], - "application/mediaservercontrol+xml": [ - "mscml" - ], - "application/metalink+xml": [ - "metalink" - ], - "application/metalink4+xml": [ - "meta4" - ], - "application/mets+xml": [ - "mets" - ], - "application/mikey": [], - "application/mods+xml": [ - "mods" - ], - "application/moss-keys": [], - "application/moss-signature": [], - "application/mosskey-data": [], - "application/mosskey-request": [], - "application/mp21": [ - "m21", - "mp21" - ], - "application/mp4": [ - "mp4s" - ], - "application/mpeg4-generic": [], - "application/mpeg4-iod": [], - "application/mpeg4-iod-xmt": [], - "application/msc-ivr+xml": [], - "application/msc-mixer+xml": [], - "application/msword": [ - "doc", - "dot" - ], - "application/mxf": [ - "mxf" - ], - "application/nasdata": [], - "application/news-checkgroups": [], - "application/news-groupinfo": [], - "application/news-transmission": [], - "application/nss": [], - "application/ocsp-request": [], - "application/ocsp-response": [], - "application/octet-stream": [ - "bin", - "dms", - "lrf", - "mar", - "so", - "dist", - "distz", - "pkg", - "bpk", - "dump", - "elc", - "deploy" - ], - "application/oda": [ - "oda" - ], - "application/oebps-package+xml": [ - "opf" - ], - "application/ogg": [ - "ogx" - ], - "application/omdoc+xml": [ - "omdoc" - ], - "application/onenote": [ - "onetoc", - "onetoc2", - "onetmp", - "onepkg" - ], - "application/oxps": [ - "oxps" - ], - "application/parityfec": [], - "application/patch-ops-error+xml": [ - "xer" - ], - "application/pdf": [ - "pdf" - ], - "application/pgp-encrypted": [ - "pgp" - ], - "application/pgp-keys": [], - "application/pgp-signature": [ - "asc", - "sig" - ], - "application/pics-rules": [ - "prf" - ], - "application/pidf+xml": [], - "application/pidf-diff+xml": [], - "application/pkcs10": [ - "p10" - ], - "application/pkcs7-mime": [ - "p7m", - "p7c" - ], - "application/pkcs7-signature": [ - "p7s" - ], - "application/pkcs8": [ - "p8" - ], - "application/pkix-attr-cert": [ - "ac" - ], - "application/pkix-cert": [ - "cer" - ], - "application/pkix-crl": [ - "crl" - ], - "application/pkix-pkipath": [ - "pkipath" - ], - "application/pkixcmp": [ - "pki" - ], - "application/pls+xml": [ - "pls" - ], - "application/poc-settings+xml": [], - "application/postscript": [ - "ai", - "eps", - "ps" - ], - "application/prs.alvestrand.titrax-sheet": [], - "application/prs.cww": [ - "cww" - ], - "application/prs.nprend": [], - "application/prs.plucker": [], - "application/prs.rdf-xml-crypt": [], - "application/prs.xsf+xml": [], - "application/pskc+xml": [ - "pskcxml" - ], - "application/qsig": [], - "application/rdf+xml": [ - "rdf" - ], - "application/reginfo+xml": [ - "rif" - ], - "application/relax-ng-compact-syntax": [ - "rnc" - ], - "application/remote-printing": [], - "application/resource-lists+xml": [ - "rl" - ], - "application/resource-lists-diff+xml": [ - "rld" - ], - "application/riscos": [], - "application/rlmi+xml": [], - "application/rls-services+xml": [ - "rs" - ], - "application/rpki-ghostbusters": [ - "gbr" - ], - "application/rpki-manifest": [ - "mft" - ], - "application/rpki-roa": [ - "roa" - ], - "application/rpki-updown": [], - "application/rsd+xml": [ - "rsd" - ], - "application/rss+xml": [ - "rss" - ], - "application/rtf": [ - "rtf" - ], - "application/rtx": [], - "application/samlassertion+xml": [], - "application/samlmetadata+xml": [], - "application/sbml+xml": [ - "sbml" - ], - "application/scvp-cv-request": [ - "scq" - ], - "application/scvp-cv-response": [ - "scs" - ], - "application/scvp-vp-request": [ - "spq" - ], - "application/scvp-vp-response": [ - "spp" - ], - "application/sdp": [ - "sdp" - ], - "application/set-payment": [], - "application/set-payment-initiation": [ - "setpay" - ], - "application/set-registration": [], - "application/set-registration-initiation": [ - "setreg" - ], - "application/sgml": [], - "application/sgml-open-catalog": [], - "application/shf+xml": [ - "shf" - ], - "application/sieve": [], - "application/simple-filter+xml": [], - "application/simple-message-summary": [], - "application/simplesymbolcontainer": [], - "application/slate": [], - "application/smil": [], - "application/smil+xml": [ - "smi", - "smil" - ], - "application/soap+fastinfoset": [], - "application/soap+xml": [], - "application/sparql-query": [ - "rq" - ], - "application/sparql-results+xml": [ - "srx" - ], - "application/spirits-event+xml": [], - "application/srgs": [ - "gram" - ], - "application/srgs+xml": [ - "grxml" - ], - "application/sru+xml": [ - "sru" - ], - "application/ssdl+xml": [ - "ssdl" - ], - "application/ssml+xml": [ - "ssml" - ], - "application/tamp-apex-update": [], - "application/tamp-apex-update-confirm": [], - "application/tamp-community-update": [], - "application/tamp-community-update-confirm": [], - "application/tamp-error": [], - "application/tamp-sequence-adjust": [], - "application/tamp-sequence-adjust-confirm": [], - "application/tamp-status-query": [], - "application/tamp-status-response": [], - "application/tamp-update": [], - "application/tamp-update-confirm": [], - "application/tei+xml": [ - "tei", - "teicorpus" - ], - "application/thraud+xml": [ - "tfi" - ], - "application/timestamp-query": [], - "application/timestamp-reply": [], - "application/timestamped-data": [ - "tsd" - ], - "application/tve-trigger": [], - "application/ulpfec": [], - "application/vcard+xml": [], - "application/vemmi": [], - "application/vividence.scriptfile": [], - "application/vnd.3gpp.bsf+xml": [], - "application/vnd.3gpp.pic-bw-large": [ - "plb" - ], - "application/vnd.3gpp.pic-bw-small": [ - "psb" - ], - "application/vnd.3gpp.pic-bw-var": [ - "pvb" - ], - "application/vnd.3gpp.sms": [], - "application/vnd.3gpp2.bcmcsinfo+xml": [], - "application/vnd.3gpp2.sms": [], - "application/vnd.3gpp2.tcap": [ - "tcap" - ], - "application/vnd.3m.post-it-notes": [ - "pwn" - ], - "application/vnd.accpac.simply.aso": [ - "aso" - ], - "application/vnd.accpac.simply.imp": [ - "imp" - ], - "application/vnd.acucobol": [ - "acu" - ], - "application/vnd.acucorp": [ - "atc", - "acutc" - ], - "application/vnd.adobe.air-application-installer-package+zip": [ - "air" - ], - "application/vnd.adobe.formscentral.fcdt": [ - "fcdt" - ], - "application/vnd.adobe.fxp": [ - "fxp", - "fxpl" - ], - "application/vnd.adobe.partial-upload": [], - "application/vnd.adobe.xdp+xml": [ - "xdp" - ], - "application/vnd.adobe.xfdf": [ - "xfdf" - ], - "application/vnd.aether.imp": [], - "application/vnd.ah-barcode": [], - "application/vnd.ahead.space": [ - "ahead" - ], - "application/vnd.airzip.filesecure.azf": [ - "azf" - ], - "application/vnd.airzip.filesecure.azs": [ - "azs" - ], - "application/vnd.amazon.ebook": [ - "azw" - ], - "application/vnd.americandynamics.acc": [ - "acc" - ], - "application/vnd.amiga.ami": [ - "ami" - ], - "application/vnd.amundsen.maze+xml": [], - "application/vnd.android.package-archive": [ - "apk" - ], - "application/vnd.anser-web-certificate-issue-initiation": [ - "cii" - ], - "application/vnd.anser-web-funds-transfer-initiation": [ - "fti" - ], - "application/vnd.antix.game-component": [ - "atx" - ], - "application/vnd.apple.installer+xml": [ - "mpkg" - ], - "application/vnd.apple.mpegurl": [ - "m3u8" - ], - "application/vnd.arastra.swi": [], - "application/vnd.aristanetworks.swi": [ - "swi" - ], - "application/vnd.astraea-software.iota": [ - "iota" - ], - "application/vnd.audiograph": [ - "aep" - ], - "application/vnd.autopackage": [], - "application/vnd.avistar+xml": [], - "application/vnd.blueice.multipass": [ - "mpm" - ], - "application/vnd.bluetooth.ep.oob": [], - "application/vnd.bmi": [ - "bmi" - ], - "application/vnd.businessobjects": [ - "rep" - ], - "application/vnd.cab-jscript": [], - "application/vnd.canon-cpdl": [], - "application/vnd.canon-lips": [], - "application/vnd.cendio.thinlinc.clientconf": [], - "application/vnd.chemdraw+xml": [ - "cdxml" - ], - "application/vnd.chipnuts.karaoke-mmd": [ - "mmd" - ], - "application/vnd.cinderella": [ - "cdy" - ], - "application/vnd.cirpack.isdn-ext": [], - "application/vnd.claymore": [ - "cla" - ], - "application/vnd.cloanto.rp9": [ - "rp9" - ], - "application/vnd.clonk.c4group": [ - "c4g", - "c4d", - "c4f", - "c4p", - "c4u" - ], - "application/vnd.cluetrust.cartomobile-config": [ - "c11amc" - ], - "application/vnd.cluetrust.cartomobile-config-pkg": [ - "c11amz" - ], - "application/vnd.collection+json": [], - "application/vnd.commerce-battelle": [], - "application/vnd.commonspace": [ - "csp" - ], - "application/vnd.contact.cmsg": [ - "cdbcmsg" - ], - "application/vnd.cosmocaller": [ - "cmc" - ], - "application/vnd.crick.clicker": [ - "clkx" - ], - "application/vnd.crick.clicker.keyboard": [ - "clkk" - ], - "application/vnd.crick.clicker.palette": [ - "clkp" - ], - "application/vnd.crick.clicker.template": [ - "clkt" - ], - "application/vnd.crick.clicker.wordbank": [ - "clkw" - ], - "application/vnd.criticaltools.wbs+xml": [ - "wbs" - ], - "application/vnd.ctc-posml": [ - "pml" - ], - "application/vnd.ctct.ws+xml": [], - "application/vnd.cups-pdf": [], - "application/vnd.cups-postscript": [], - "application/vnd.cups-ppd": [ - "ppd" - ], - "application/vnd.cups-raster": [], - "application/vnd.cups-raw": [], - "application/vnd.curl": [], - "application/vnd.curl.car": [ - "car" - ], - "application/vnd.curl.pcurl": [ - "pcurl" - ], - "application/vnd.cybank": [], - "application/vnd.dart": [ - "dart" - ], - "application/vnd.data-vision.rdz": [ - "rdz" - ], - "application/vnd.dece.data": [ - "uvf", - "uvvf", - "uvd", - "uvvd" - ], - "application/vnd.dece.ttml+xml": [ - "uvt", - "uvvt" - ], - "application/vnd.dece.unspecified": [ - "uvx", - "uvvx" - ], - "application/vnd.dece.zip": [ - "uvz", - "uvvz" - ], - "application/vnd.denovo.fcselayout-link": [ - "fe_launch" - ], - "application/vnd.dir-bi.plate-dl-nosuffix": [], - "application/vnd.dna": [ - "dna" - ], - "application/vnd.dolby.mlp": [ - "mlp" - ], - "application/vnd.dolby.mobile.1": [], - "application/vnd.dolby.mobile.2": [], - "application/vnd.dpgraph": [ - "dpg" - ], - "application/vnd.dreamfactory": [ - "dfac" - ], - "application/vnd.ds-keypoint": [ - "kpxx" - ], - "application/vnd.dvb.ait": [ - "ait" - ], - "application/vnd.dvb.dvbj": [], - "application/vnd.dvb.esgcontainer": [], - "application/vnd.dvb.ipdcdftnotifaccess": [], - "application/vnd.dvb.ipdcesgaccess": [], - "application/vnd.dvb.ipdcesgaccess2": [], - "application/vnd.dvb.ipdcesgpdd": [], - "application/vnd.dvb.ipdcroaming": [], - "application/vnd.dvb.iptv.alfec-base": [], - "application/vnd.dvb.iptv.alfec-enhancement": [], - "application/vnd.dvb.notif-aggregate-root+xml": [], - "application/vnd.dvb.notif-container+xml": [], - "application/vnd.dvb.notif-generic+xml": [], - "application/vnd.dvb.notif-ia-msglist+xml": [], - "application/vnd.dvb.notif-ia-registration-request+xml": [], - "application/vnd.dvb.notif-ia-registration-response+xml": [], - "application/vnd.dvb.notif-init+xml": [], - "application/vnd.dvb.pfr": [], - "application/vnd.dvb.service": [ - "svc" - ], - "application/vnd.dxr": [], - "application/vnd.dynageo": [ - "geo" - ], - "application/vnd.easykaraoke.cdgdownload": [], - "application/vnd.ecdis-update": [], - "application/vnd.ecowin.chart": [ - "mag" - ], - "application/vnd.ecowin.filerequest": [], - "application/vnd.ecowin.fileupdate": [], - "application/vnd.ecowin.series": [], - "application/vnd.ecowin.seriesrequest": [], - "application/vnd.ecowin.seriesupdate": [], - "application/vnd.emclient.accessrequest+xml": [], - "application/vnd.enliven": [ - "nml" - ], - "application/vnd.eprints.data+xml": [], - "application/vnd.epson.esf": [ - "esf" - ], - "application/vnd.epson.msf": [ - "msf" - ], - "application/vnd.epson.quickanime": [ - "qam" - ], - "application/vnd.epson.salt": [ - "slt" - ], - "application/vnd.epson.ssf": [ - "ssf" - ], - "application/vnd.ericsson.quickcall": [], - "application/vnd.eszigno3+xml": [ - "es3", - "et3" - ], - "application/vnd.etsi.aoc+xml": [], - "application/vnd.etsi.cug+xml": [], - "application/vnd.etsi.iptvcommand+xml": [], - "application/vnd.etsi.iptvdiscovery+xml": [], - "application/vnd.etsi.iptvprofile+xml": [], - "application/vnd.etsi.iptvsad-bc+xml": [], - "application/vnd.etsi.iptvsad-cod+xml": [], - "application/vnd.etsi.iptvsad-npvr+xml": [], - "application/vnd.etsi.iptvservice+xml": [], - "application/vnd.etsi.iptvsync+xml": [], - "application/vnd.etsi.iptvueprofile+xml": [], - "application/vnd.etsi.mcid+xml": [], - "application/vnd.etsi.overload-control-policy-dataset+xml": [], - "application/vnd.etsi.sci+xml": [], - "application/vnd.etsi.simservs+xml": [], - "application/vnd.etsi.tsl+xml": [], - "application/vnd.etsi.tsl.der": [], - "application/vnd.eudora.data": [], - "application/vnd.ezpix-album": [ - "ez2" - ], - "application/vnd.ezpix-package": [ - "ez3" - ], - "application/vnd.f-secure.mobile": [], - "application/vnd.fdf": [ - "fdf" - ], - "application/vnd.fdsn.mseed": [ - "mseed" - ], - "application/vnd.fdsn.seed": [ - "seed", - "dataless" - ], - "application/vnd.ffsns": [], - "application/vnd.fints": [], - "application/vnd.flographit": [ - "gph" - ], - "application/vnd.fluxtime.clip": [ - "ftc" - ], - "application/vnd.font-fontforge-sfd": [], - "application/vnd.framemaker": [ - "fm", - "frame", - "maker", - "book" - ], - "application/vnd.frogans.fnc": [ - "fnc" - ], - "application/vnd.frogans.ltf": [ - "ltf" - ], - "application/vnd.fsc.weblaunch": [ - "fsc" - ], - "application/vnd.fujitsu.oasys": [ - "oas" - ], - "application/vnd.fujitsu.oasys2": [ - "oa2" - ], - "application/vnd.fujitsu.oasys3": [ - "oa3" - ], - "application/vnd.fujitsu.oasysgp": [ - "fg5" - ], - "application/vnd.fujitsu.oasysprs": [ - "bh2" - ], - "application/vnd.fujixerox.art-ex": [], - "application/vnd.fujixerox.art4": [], - "application/vnd.fujixerox.hbpl": [], - "application/vnd.fujixerox.ddd": [ - "ddd" - ], - "application/vnd.fujixerox.docuworks": [ - "xdw" - ], - "application/vnd.fujixerox.docuworks.binder": [ - "xbd" - ], - "application/vnd.fut-misnet": [], - "application/vnd.fuzzysheet": [ - "fzs" - ], - "application/vnd.genomatix.tuxedo": [ - "txd" - ], - "application/vnd.geocube+xml": [], - "application/vnd.geogebra.file": [ - "ggb" - ], - "application/vnd.geogebra.tool": [ - "ggt" - ], - "application/vnd.geometry-explorer": [ - "gex", - "gre" - ], - "application/vnd.geonext": [ - "gxt" - ], - "application/vnd.geoplan": [ - "g2w" - ], - "application/vnd.geospace": [ - "g3w" - ], - "application/vnd.globalplatform.card-content-mgt": [], - "application/vnd.globalplatform.card-content-mgt-response": [], - "application/vnd.gmx": [ - "gmx" - ], - "application/vnd.google-earth.kml+xml": [ - "kml" - ], - "application/vnd.google-earth.kmz": [ - "kmz" - ], - "application/vnd.grafeq": [ - "gqf", - "gqs" - ], - "application/vnd.gridmp": [], - "application/vnd.groove-account": [ - "gac" - ], - "application/vnd.groove-help": [ - "ghf" - ], - "application/vnd.groove-identity-message": [ - "gim" - ], - "application/vnd.groove-injector": [ - "grv" - ], - "application/vnd.groove-tool-message": [ - "gtm" - ], - "application/vnd.groove-tool-template": [ - "tpl" - ], - "application/vnd.groove-vcard": [ - "vcg" - ], - "application/vnd.hal+json": [], - "application/vnd.hal+xml": [ - "hal" - ], - "application/vnd.handheld-entertainment+xml": [ - "zmm" - ], - "application/vnd.hbci": [ - "hbci" - ], - "application/vnd.hcl-bireports": [], - "application/vnd.hhe.lesson-player": [ - "les" - ], - "application/vnd.hp-hpgl": [ - "hpgl" - ], - "application/vnd.hp-hpid": [ - "hpid" - ], - "application/vnd.hp-hps": [ - "hps" - ], - "application/vnd.hp-jlyt": [ - "jlt" - ], - "application/vnd.hp-pcl": [ - "pcl" - ], - "application/vnd.hp-pclxl": [ - "pclxl" - ], - "application/vnd.httphone": [], - "application/vnd.hzn-3d-crossword": [], - "application/vnd.ibm.afplinedata": [], - "application/vnd.ibm.electronic-media": [], - "application/vnd.ibm.minipay": [ - "mpy" - ], - "application/vnd.ibm.modcap": [ - "afp", - "listafp", - "list3820" - ], - "application/vnd.ibm.rights-management": [ - "irm" - ], - "application/vnd.ibm.secure-container": [ - "sc" - ], - "application/vnd.iccprofile": [ - "icc", - "icm" - ], - "application/vnd.igloader": [ - "igl" - ], - "application/vnd.immervision-ivp": [ - "ivp" - ], - "application/vnd.immervision-ivu": [ - "ivu" - ], - "application/vnd.informedcontrol.rms+xml": [], - "application/vnd.informix-visionary": [], - "application/vnd.infotech.project": [], - "application/vnd.infotech.project+xml": [], - "application/vnd.innopath.wamp.notification": [], - "application/vnd.insors.igm": [ - "igm" - ], - "application/vnd.intercon.formnet": [ - "xpw", - "xpx" - ], - "application/vnd.intergeo": [ - "i2g" - ], - "application/vnd.intertrust.digibox": [], - "application/vnd.intertrust.nncp": [], - "application/vnd.intu.qbo": [ - "qbo" - ], - "application/vnd.intu.qfx": [ - "qfx" - ], - "application/vnd.iptc.g2.conceptitem+xml": [], - "application/vnd.iptc.g2.knowledgeitem+xml": [], - "application/vnd.iptc.g2.newsitem+xml": [], - "application/vnd.iptc.g2.newsmessage+xml": [], - "application/vnd.iptc.g2.packageitem+xml": [], - "application/vnd.iptc.g2.planningitem+xml": [], - "application/vnd.ipunplugged.rcprofile": [ - "rcprofile" - ], - "application/vnd.irepository.package+xml": [ - "irp" - ], - "application/vnd.is-xpr": [ - "xpr" - ], - "application/vnd.isac.fcs": [ - "fcs" - ], - "application/vnd.jam": [ - "jam" - ], - "application/vnd.japannet-directory-service": [], - "application/vnd.japannet-jpnstore-wakeup": [], - "application/vnd.japannet-payment-wakeup": [], - "application/vnd.japannet-registration": [], - "application/vnd.japannet-registration-wakeup": [], - "application/vnd.japannet-setstore-wakeup": [], - "application/vnd.japannet-verification": [], - "application/vnd.japannet-verification-wakeup": [], - "application/vnd.jcp.javame.midlet-rms": [ - "rms" - ], - "application/vnd.jisp": [ - "jisp" - ], - "application/vnd.joost.joda-archive": [ - "joda" - ], - "application/vnd.kahootz": [ - "ktz", - "ktr" - ], - "application/vnd.kde.karbon": [ - "karbon" - ], - "application/vnd.kde.kchart": [ - "chrt" - ], - "application/vnd.kde.kformula": [ - "kfo" - ], - "application/vnd.kde.kivio": [ - "flw" - ], - "application/vnd.kde.kontour": [ - "kon" - ], - "application/vnd.kde.kpresenter": [ - "kpr", - "kpt" - ], - "application/vnd.kde.kspread": [ - "ksp" - ], - "application/vnd.kde.kword": [ - "kwd", - "kwt" - ], - "application/vnd.kenameaapp": [ - "htke" - ], - "application/vnd.kidspiration": [ - "kia" - ], - "application/vnd.kinar": [ - "kne", - "knp" - ], - "application/vnd.koan": [ - "skp", - "skd", - "skt", - "skm" - ], - "application/vnd.kodak-descriptor": [ - "sse" - ], - "application/vnd.las.las+xml": [ - "lasxml" - ], - "application/vnd.liberty-request+xml": [], - "application/vnd.llamagraphics.life-balance.desktop": [ - "lbd" - ], - "application/vnd.llamagraphics.life-balance.exchange+xml": [ - "lbe" - ], - "application/vnd.lotus-1-2-3": [ - "123" - ], - "application/vnd.lotus-approach": [ - "apr" - ], - "application/vnd.lotus-freelance": [ - "pre" - ], - "application/vnd.lotus-notes": [ - "nsf" - ], - "application/vnd.lotus-organizer": [ - "org" - ], - "application/vnd.lotus-screencam": [ - "scm" - ], - "application/vnd.lotus-wordpro": [ - "lwp" - ], - "application/vnd.macports.portpkg": [ - "portpkg" - ], - "application/vnd.marlin.drm.actiontoken+xml": [], - "application/vnd.marlin.drm.conftoken+xml": [], - "application/vnd.marlin.drm.license+xml": [], - "application/vnd.marlin.drm.mdcf": [], - "application/vnd.mcd": [ - "mcd" - ], - "application/vnd.medcalcdata": [ - "mc1" - ], - "application/vnd.mediastation.cdkey": [ - "cdkey" - ], - "application/vnd.meridian-slingshot": [], - "application/vnd.mfer": [ - "mwf" - ], - "application/vnd.mfmp": [ - "mfm" - ], - "application/vnd.micrografx.flo": [ - "flo" - ], - "application/vnd.micrografx.igx": [ - "igx" - ], - "application/vnd.mif": [ - "mif" - ], - "application/vnd.minisoft-hp3000-save": [], - "application/vnd.mitsubishi.misty-guard.trustweb": [], - "application/vnd.mobius.daf": [ - "daf" - ], - "application/vnd.mobius.dis": [ - "dis" - ], - "application/vnd.mobius.mbk": [ - "mbk" - ], - "application/vnd.mobius.mqy": [ - "mqy" - ], - "application/vnd.mobius.msl": [ - "msl" - ], - "application/vnd.mobius.plc": [ - "plc" - ], - "application/vnd.mobius.txf": [ - "txf" - ], - "application/vnd.mophun.application": [ - "mpn" - ], - "application/vnd.mophun.certificate": [ - "mpc" - ], - "application/vnd.motorola.flexsuite": [], - "application/vnd.motorola.flexsuite.adsi": [], - "application/vnd.motorola.flexsuite.fis": [], - "application/vnd.motorola.flexsuite.gotap": [], - "application/vnd.motorola.flexsuite.kmr": [], - "application/vnd.motorola.flexsuite.ttc": [], - "application/vnd.motorola.flexsuite.wem": [], - "application/vnd.motorola.iprm": [], - "application/vnd.mozilla.xul+xml": [ - "xul" - ], - "application/vnd.ms-artgalry": [ - "cil" - ], - "application/vnd.ms-asf": [], - "application/vnd.ms-cab-compressed": [ - "cab" - ], - "application/vnd.ms-color.iccprofile": [], - "application/vnd.ms-excel": [ - "xls", - "xlm", - "xla", - "xlc", - "xlt", - "xlw" - ], - "application/vnd.ms-excel.addin.macroenabled.12": [ - "xlam" - ], - "application/vnd.ms-excel.sheet.binary.macroenabled.12": [ - "xlsb" - ], - "application/vnd.ms-excel.sheet.macroenabled.12": [ - "xlsm" - ], - "application/vnd.ms-excel.template.macroenabled.12": [ - "xltm" - ], - "application/vnd.ms-fontobject": [ - "eot" - ], - "application/vnd.ms-htmlhelp": [ - "chm" - ], - "application/vnd.ms-ims": [ - "ims" - ], - "application/vnd.ms-lrm": [ - "lrm" - ], - "application/vnd.ms-office.activex+xml": [], - "application/vnd.ms-officetheme": [ - "thmx" - ], - "application/vnd.ms-opentype": [], - "application/vnd.ms-package.obfuscated-opentype": [], - "application/vnd.ms-pki.seccat": [ - "cat" - ], - "application/vnd.ms-pki.stl": [ - "stl" - ], - "application/vnd.ms-playready.initiator+xml": [], - "application/vnd.ms-powerpoint": [ - "ppt", - "pps", - "pot" - ], - "application/vnd.ms-powerpoint.addin.macroenabled.12": [ - "ppam" - ], - "application/vnd.ms-powerpoint.presentation.macroenabled.12": [ - "pptm" - ], - "application/vnd.ms-powerpoint.slide.macroenabled.12": [ - "sldm" - ], - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": [ - "ppsm" - ], - "application/vnd.ms-powerpoint.template.macroenabled.12": [ - "potm" - ], - "application/vnd.ms-printing.printticket+xml": [], - "application/vnd.ms-project": [ - "mpp", - "mpt" - ], - "application/vnd.ms-tnef": [], - "application/vnd.ms-wmdrm.lic-chlg-req": [], - "application/vnd.ms-wmdrm.lic-resp": [], - "application/vnd.ms-wmdrm.meter-chlg-req": [], - "application/vnd.ms-wmdrm.meter-resp": [], - "application/vnd.ms-word.document.macroenabled.12": [ - "docm" - ], - "application/vnd.ms-word.template.macroenabled.12": [ - "dotm" - ], - "application/vnd.ms-works": [ - "wps", - "wks", - "wcm", - "wdb" - ], - "application/vnd.ms-wpl": [ - "wpl" - ], - "application/vnd.ms-xpsdocument": [ - "xps" - ], - "application/vnd.mseq": [ - "mseq" - ], - "application/vnd.msign": [], - "application/vnd.multiad.creator": [], - "application/vnd.multiad.creator.cif": [], - "application/vnd.music-niff": [], - "application/vnd.musician": [ - "mus" - ], - "application/vnd.muvee.style": [ - "msty" - ], - "application/vnd.mynfc": [ - "taglet" - ], - "application/vnd.ncd.control": [], - "application/vnd.ncd.reference": [], - "application/vnd.nervana": [], - "application/vnd.netfpx": [], - "application/vnd.neurolanguage.nlu": [ - "nlu" - ], - "application/vnd.nitf": [ - "ntf", - "nitf" - ], - "application/vnd.noblenet-directory": [ - "nnd" - ], - "application/vnd.noblenet-sealer": [ - "nns" - ], - "application/vnd.noblenet-web": [ - "nnw" - ], - "application/vnd.nokia.catalogs": [], - "application/vnd.nokia.conml+wbxml": [], - "application/vnd.nokia.conml+xml": [], - "application/vnd.nokia.isds-radio-presets": [], - "application/vnd.nokia.iptv.config+xml": [], - "application/vnd.nokia.landmark+wbxml": [], - "application/vnd.nokia.landmark+xml": [], - "application/vnd.nokia.landmarkcollection+xml": [], - "application/vnd.nokia.n-gage.ac+xml": [], - "application/vnd.nokia.n-gage.data": [ - "ngdat" - ], - "application/vnd.nokia.ncd": [], - "application/vnd.nokia.pcd+wbxml": [], - "application/vnd.nokia.pcd+xml": [], - "application/vnd.nokia.radio-preset": [ - "rpst" - ], - "application/vnd.nokia.radio-presets": [ - "rpss" - ], - "application/vnd.novadigm.edm": [ - "edm" - ], - "application/vnd.novadigm.edx": [ - "edx" - ], - "application/vnd.novadigm.ext": [ - "ext" - ], - "application/vnd.ntt-local.file-transfer": [], - "application/vnd.ntt-local.sip-ta_remote": [], - "application/vnd.ntt-local.sip-ta_tcp_stream": [], - "application/vnd.oasis.opendocument.chart": [ - "odc" - ], - "application/vnd.oasis.opendocument.chart-template": [ - "otc" - ], - "application/vnd.oasis.opendocument.database": [ - "odb" - ], - "application/vnd.oasis.opendocument.formula": [ - "odf" - ], - "application/vnd.oasis.opendocument.formula-template": [ - "odft" - ], - "application/vnd.oasis.opendocument.graphics": [ - "odg" - ], - "application/vnd.oasis.opendocument.graphics-template": [ - "otg" - ], - "application/vnd.oasis.opendocument.image": [ - "odi" - ], - "application/vnd.oasis.opendocument.image-template": [ - "oti" - ], - "application/vnd.oasis.opendocument.presentation": [ - "odp" - ], - "application/vnd.oasis.opendocument.presentation-template": [ - "otp" - ], - "application/vnd.oasis.opendocument.spreadsheet": [ - "ods" - ], - "application/vnd.oasis.opendocument.spreadsheet-template": [ - "ots" - ], - "application/vnd.oasis.opendocument.text": [ - "odt" - ], - "application/vnd.oasis.opendocument.text-master": [ - "odm" - ], - "application/vnd.oasis.opendocument.text-template": [ - "ott" - ], - "application/vnd.oasis.opendocument.text-web": [ - "oth" - ], - "application/vnd.obn": [], - "application/vnd.oftn.l10n+json": [], - "application/vnd.oipf.contentaccessdownload+xml": [], - "application/vnd.oipf.contentaccessstreaming+xml": [], - "application/vnd.oipf.cspg-hexbinary": [], - "application/vnd.oipf.dae.svg+xml": [], - "application/vnd.oipf.dae.xhtml+xml": [], - "application/vnd.oipf.mippvcontrolmessage+xml": [], - "application/vnd.oipf.pae.gem": [], - "application/vnd.oipf.spdiscovery+xml": [], - "application/vnd.oipf.spdlist+xml": [], - "application/vnd.oipf.ueprofile+xml": [], - "application/vnd.oipf.userprofile+xml": [], - "application/vnd.olpc-sugar": [ - "xo" - ], - "application/vnd.oma-scws-config": [], - "application/vnd.oma-scws-http-request": [], - "application/vnd.oma-scws-http-response": [], - "application/vnd.oma.bcast.associated-procedure-parameter+xml": [], - "application/vnd.oma.bcast.drm-trigger+xml": [], - "application/vnd.oma.bcast.imd+xml": [], - "application/vnd.oma.bcast.ltkm": [], - "application/vnd.oma.bcast.notification+xml": [], - "application/vnd.oma.bcast.provisioningtrigger": [], - "application/vnd.oma.bcast.sgboot": [], - "application/vnd.oma.bcast.sgdd+xml": [], - "application/vnd.oma.bcast.sgdu": [], - "application/vnd.oma.bcast.simple-symbol-container": [], - "application/vnd.oma.bcast.smartcard-trigger+xml": [], - "application/vnd.oma.bcast.sprov+xml": [], - "application/vnd.oma.bcast.stkm": [], - "application/vnd.oma.cab-address-book+xml": [], - "application/vnd.oma.cab-feature-handler+xml": [], - "application/vnd.oma.cab-pcc+xml": [], - "application/vnd.oma.cab-user-prefs+xml": [], - "application/vnd.oma.dcd": [], - "application/vnd.oma.dcdc": [], - "application/vnd.oma.dd2+xml": [ - "dd2" - ], - "application/vnd.oma.drm.risd+xml": [], - "application/vnd.oma.group-usage-list+xml": [], - "application/vnd.oma.pal+xml": [], - "application/vnd.oma.poc.detailed-progress-report+xml": [], - "application/vnd.oma.poc.final-report+xml": [], - "application/vnd.oma.poc.groups+xml": [], - "application/vnd.oma.poc.invocation-descriptor+xml": [], - "application/vnd.oma.poc.optimized-progress-report+xml": [], - "application/vnd.oma.push": [], - "application/vnd.oma.scidm.messages+xml": [], - "application/vnd.oma.xcap-directory+xml": [], - "application/vnd.omads-email+xml": [], - "application/vnd.omads-file+xml": [], - "application/vnd.omads-folder+xml": [], - "application/vnd.omaloc-supl-init": [], - "application/vnd.openofficeorg.extension": [ - "oxt" - ], - "application/vnd.openxmlformats-officedocument.custom-properties+xml": [], - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": [], - "application/vnd.openxmlformats-officedocument.drawing+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": [], - "application/vnd.openxmlformats-officedocument.extended-properties+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presentation": [ - "pptx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slide": [ - "sldx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [ - "ppsx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.template": [ - "potx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [ - "xlsx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [ - "xltx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": [], - "application/vnd.openxmlformats-officedocument.theme+xml": [], - "application/vnd.openxmlformats-officedocument.themeoverride+xml": [], - "application/vnd.openxmlformats-officedocument.vmldrawing": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [ - "docx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [ - "dotx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": [], - "application/vnd.openxmlformats-package.core-properties+xml": [], - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": [], - "application/vnd.openxmlformats-package.relationships+xml": [], - "application/vnd.quobject-quoxdocument": [], - "application/vnd.osa.netdeploy": [], - "application/vnd.osgeo.mapguide.package": [ - "mgp" - ], - "application/vnd.osgi.bundle": [], - "application/vnd.osgi.dp": [ - "dp" - ], - "application/vnd.osgi.subsystem": [ - "esa" - ], - "application/vnd.otps.ct-kip+xml": [], - "application/vnd.palm": [ - "pdb", - "pqa", - "oprc" - ], - "application/vnd.paos.xml": [], - "application/vnd.pawaafile": [ - "paw" - ], - "application/vnd.pg.format": [ - "str" - ], - "application/vnd.pg.osasli": [ - "ei6" - ], - "application/vnd.piaccess.application-licence": [], - "application/vnd.picsel": [ - "efif" - ], - "application/vnd.pmi.widget": [ - "wg" - ], - "application/vnd.poc.group-advertisement+xml": [], - "application/vnd.pocketlearn": [ - "plf" - ], - "application/vnd.powerbuilder6": [ - "pbd" - ], - "application/vnd.powerbuilder6-s": [], - "application/vnd.powerbuilder7": [], - "application/vnd.powerbuilder7-s": [], - "application/vnd.powerbuilder75": [], - "application/vnd.powerbuilder75-s": [], - "application/vnd.preminet": [], - "application/vnd.previewsystems.box": [ - "box" - ], - "application/vnd.proteus.magazine": [ - "mgz" - ], - "application/vnd.publishare-delta-tree": [ - "qps" - ], - "application/vnd.pvi.ptid1": [ - "ptid" - ], - "application/vnd.pwg-multiplexed": [], - "application/vnd.pwg-xhtml-print+xml": [], - "application/vnd.qualcomm.brew-app-res": [], - "application/vnd.quark.quarkxpress": [ - "qxd", - "qxt", - "qwd", - "qwt", - "qxl", - "qxb" - ], - "application/vnd.radisys.moml+xml": [], - "application/vnd.radisys.msml+xml": [], - "application/vnd.radisys.msml-audit+xml": [], - "application/vnd.radisys.msml-audit-conf+xml": [], - "application/vnd.radisys.msml-audit-conn+xml": [], - "application/vnd.radisys.msml-audit-dialog+xml": [], - "application/vnd.radisys.msml-audit-stream+xml": [], - "application/vnd.radisys.msml-conf+xml": [], - "application/vnd.radisys.msml-dialog+xml": [], - "application/vnd.radisys.msml-dialog-base+xml": [], - "application/vnd.radisys.msml-dialog-fax-detect+xml": [], - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": [], - "application/vnd.radisys.msml-dialog-group+xml": [], - "application/vnd.radisys.msml-dialog-speech+xml": [], - "application/vnd.radisys.msml-dialog-transform+xml": [], - "application/vnd.rainstor.data": [], - "application/vnd.rapid": [], - "application/vnd.realvnc.bed": [ - "bed" - ], - "application/vnd.recordare.musicxml": [ - "mxl" - ], - "application/vnd.recordare.musicxml+xml": [ - "musicxml" - ], - "application/vnd.renlearn.rlprint": [], - "application/vnd.rig.cryptonote": [ - "cryptonote" - ], - "application/vnd.rim.cod": [ - "cod" - ], - "application/vnd.rn-realmedia": [ - "rm" - ], - "application/vnd.rn-realmedia-vbr": [ - "rmvb" - ], - "application/vnd.route66.link66+xml": [ - "link66" - ], - "application/vnd.rs-274x": [], - "application/vnd.ruckus.download": [], - "application/vnd.s3sms": [], - "application/vnd.sailingtracker.track": [ - "st" - ], - "application/vnd.sbm.cid": [], - "application/vnd.sbm.mid2": [], - "application/vnd.scribus": [], - "application/vnd.sealed.3df": [], - "application/vnd.sealed.csf": [], - "application/vnd.sealed.doc": [], - "application/vnd.sealed.eml": [], - "application/vnd.sealed.mht": [], - "application/vnd.sealed.net": [], - "application/vnd.sealed.ppt": [], - "application/vnd.sealed.tiff": [], - "application/vnd.sealed.xls": [], - "application/vnd.sealedmedia.softseal.html": [], - "application/vnd.sealedmedia.softseal.pdf": [], - "application/vnd.seemail": [ - "see" - ], - "application/vnd.sema": [ - "sema" - ], - "application/vnd.semd": [ - "semd" - ], - "application/vnd.semf": [ - "semf" - ], - "application/vnd.shana.informed.formdata": [ - "ifm" - ], - "application/vnd.shana.informed.formtemplate": [ - "itp" - ], - "application/vnd.shana.informed.interchange": [ - "iif" - ], - "application/vnd.shana.informed.package": [ - "ipk" - ], - "application/vnd.simtech-mindmapper": [ - "twd", - "twds" - ], - "application/vnd.smaf": [ - "mmf" - ], - "application/vnd.smart.notebook": [], - "application/vnd.smart.teacher": [ - "teacher" - ], - "application/vnd.software602.filler.form+xml": [], - "application/vnd.software602.filler.form-xml-zip": [], - "application/vnd.solent.sdkm+xml": [ - "sdkm", - "sdkd" - ], - "application/vnd.spotfire.dxp": [ - "dxp" - ], - "application/vnd.spotfire.sfs": [ - "sfs" - ], - "application/vnd.sss-cod": [], - "application/vnd.sss-dtf": [], - "application/vnd.sss-ntf": [], - "application/vnd.stardivision.calc": [ - "sdc" - ], - "application/vnd.stardivision.draw": [ - "sda" - ], - "application/vnd.stardivision.impress": [ - "sdd" - ], - "application/vnd.stardivision.math": [ - "smf" - ], - "application/vnd.stardivision.writer": [ - "sdw", - "vor" - ], - "application/vnd.stardivision.writer-global": [ - "sgl" - ], - "application/vnd.stepmania.package": [ - "smzip" - ], - "application/vnd.stepmania.stepchart": [ - "sm" - ], - "application/vnd.street-stream": [], - "application/vnd.sun.xml.calc": [ - "sxc" - ], - "application/vnd.sun.xml.calc.template": [ - "stc" - ], - "application/vnd.sun.xml.draw": [ - "sxd" - ], - "application/vnd.sun.xml.draw.template": [ - "std" - ], - "application/vnd.sun.xml.impress": [ - "sxi" - ], - "application/vnd.sun.xml.impress.template": [ - "sti" - ], - "application/vnd.sun.xml.math": [ - "sxm" - ], - "application/vnd.sun.xml.writer": [ - "sxw" - ], - "application/vnd.sun.xml.writer.global": [ - "sxg" - ], - "application/vnd.sun.xml.writer.template": [ - "stw" - ], - "application/vnd.sun.wadl+xml": [], - "application/vnd.sus-calendar": [ - "sus", - "susp" - ], - "application/vnd.svd": [ - "svd" - ], - "application/vnd.swiftview-ics": [], - "application/vnd.symbian.install": [ - "sis", - "sisx" - ], - "application/vnd.syncml+xml": [ - "xsm" - ], - "application/vnd.syncml.dm+wbxml": [ - "bdm" - ], - "application/vnd.syncml.dm+xml": [ - "xdm" - ], - "application/vnd.syncml.dm.notification": [], - "application/vnd.syncml.ds.notification": [], - "application/vnd.tao.intent-module-archive": [ - "tao" - ], - "application/vnd.tcpdump.pcap": [ - "pcap", - "cap", - "dmp" - ], - "application/vnd.tmobile-livetv": [ - "tmo" - ], - "application/vnd.trid.tpt": [ - "tpt" - ], - "application/vnd.triscape.mxs": [ - "mxs" - ], - "application/vnd.trueapp": [ - "tra" - ], - "application/vnd.truedoc": [], - "application/vnd.ubisoft.webplayer": [], - "application/vnd.ufdl": [ - "ufd", - "ufdl" - ], - "application/vnd.uiq.theme": [ - "utz" - ], - "application/vnd.umajin": [ - "umj" - ], - "application/vnd.unity": [ - "unityweb" - ], - "application/vnd.uoml+xml": [ - "uoml" - ], - "application/vnd.uplanet.alert": [], - "application/vnd.uplanet.alert-wbxml": [], - "application/vnd.uplanet.bearer-choice": [], - "application/vnd.uplanet.bearer-choice-wbxml": [], - "application/vnd.uplanet.cacheop": [], - "application/vnd.uplanet.cacheop-wbxml": [], - "application/vnd.uplanet.channel": [], - "application/vnd.uplanet.channel-wbxml": [], - "application/vnd.uplanet.list": [], - "application/vnd.uplanet.list-wbxml": [], - "application/vnd.uplanet.listcmd": [], - "application/vnd.uplanet.listcmd-wbxml": [], - "application/vnd.uplanet.signal": [], - "application/vnd.vcx": [ - "vcx" - ], - "application/vnd.vd-study": [], - "application/vnd.vectorworks": [], - "application/vnd.verimatrix.vcas": [], - "application/vnd.vidsoft.vidconference": [], - "application/vnd.visio": [ - "vsd", - "vst", - "vss", - "vsw" - ], - "application/vnd.visionary": [ - "vis" - ], - "application/vnd.vividence.scriptfile": [], - "application/vnd.vsf": [ - "vsf" - ], - "application/vnd.wap.sic": [], - "application/vnd.wap.slc": [], - "application/vnd.wap.wbxml": [ - "wbxml" - ], - "application/vnd.wap.wmlc": [ - "wmlc" - ], - "application/vnd.wap.wmlscriptc": [ - "wmlsc" - ], - "application/vnd.webturbo": [ - "wtb" - ], - "application/vnd.wfa.wsc": [], - "application/vnd.wmc": [], - "application/vnd.wmf.bootstrap": [], - "application/vnd.wolfram.mathematica": [], - "application/vnd.wolfram.mathematica.package": [], - "application/vnd.wolfram.player": [ - "nbp" - ], - "application/vnd.wordperfect": [ - "wpd" - ], - "application/vnd.wqd": [ - "wqd" - ], - "application/vnd.wrq-hp3000-labelled": [], - "application/vnd.wt.stf": [ - "stf" - ], - "application/vnd.wv.csp+wbxml": [], - "application/vnd.wv.csp+xml": [], - "application/vnd.wv.ssp+xml": [], - "application/vnd.xara": [ - "xar" - ], - "application/vnd.xfdl": [ - "xfdl" - ], - "application/vnd.xfdl.webform": [], - "application/vnd.xmi+xml": [], - "application/vnd.xmpie.cpkg": [], - "application/vnd.xmpie.dpkg": [], - "application/vnd.xmpie.plan": [], - "application/vnd.xmpie.ppkg": [], - "application/vnd.xmpie.xlim": [], - "application/vnd.yamaha.hv-dic": [ - "hvd" - ], - "application/vnd.yamaha.hv-script": [ - "hvs" - ], - "application/vnd.yamaha.hv-voice": [ - "hvp" - ], - "application/vnd.yamaha.openscoreformat": [ - "osf" - ], - "application/vnd.yamaha.openscoreformat.osfpvg+xml": [ - "osfpvg" - ], - "application/vnd.yamaha.remote-setup": [], - "application/vnd.yamaha.smaf-audio": [ - "saf" - ], - "application/vnd.yamaha.smaf-phrase": [ - "spf" - ], - "application/vnd.yamaha.through-ngn": [], - "application/vnd.yamaha.tunnel-udpencap": [], - "application/vnd.yellowriver-custom-menu": [ - "cmp" - ], - "application/vnd.zul": [ - "zir", - "zirz" - ], - "application/vnd.zzazz.deck+xml": [ - "zaz" - ], - "application/voicexml+xml": [ - "vxml" - ], - "application/vq-rtcpxr": [], - "application/watcherinfo+xml": [], - "application/whoispp-query": [], - "application/whoispp-response": [], - "application/widget": [ - "wgt" - ], - "application/winhlp": [ - "hlp" - ], - "application/wita": [], - "application/wordperfect5.1": [], - "application/wsdl+xml": [ - "wsdl" - ], - "application/wspolicy+xml": [ - "wspolicy" - ], - "application/x-7z-compressed": [ - "7z" - ], - "application/x-abiword": [ - "abw" - ], - "application/x-ace-compressed": [ - "ace" - ], - "application/x-amf": [], - "application/x-apple-diskimage": [ - "dmg" - ], - "application/x-authorware-bin": [ - "aab", - "x32", - "u32", - "vox" - ], - "application/x-authorware-map": [ - "aam" - ], - "application/x-authorware-seg": [ - "aas" - ], - "application/x-bcpio": [ - "bcpio" - ], - "application/x-bittorrent": [ - "torrent" - ], - "application/x-blorb": [ - "blb", - "blorb" - ], - "application/x-bzip": [ - "bz" - ], - "application/x-bzip2": [ - "bz2", - "boz" - ], - "application/x-cbr": [ - "cbr", - "cba", - "cbt", - "cbz", - "cb7" - ], - "application/x-cdlink": [ - "vcd" - ], - "application/x-cfs-compressed": [ - "cfs" - ], - "application/x-chat": [ - "chat" - ], - "application/x-chess-pgn": [ - "pgn" - ], - "application/x-conference": [ - "nsc" - ], - "application/x-compress": [], - "application/x-cpio": [ - "cpio" - ], - "application/x-csh": [ - "csh" - ], - "application/x-debian-package": [ - "deb", - "udeb" - ], - "application/x-dgc-compressed": [ - "dgc" - ], - "application/x-director": [ - "dir", - "dcr", - "dxr", - "cst", - "cct", - "cxt", - "w3d", - "fgd", - "swa" - ], - "application/x-doom": [ - "wad" - ], - "application/x-dtbncx+xml": [ - "ncx" - ], - "application/x-dtbook+xml": [ - "dtb" - ], - "application/x-dtbresource+xml": [ - "res" - ], - "application/x-dvi": [ - "dvi" - ], - "application/x-envoy": [ - "evy" - ], - "application/x-eva": [ - "eva" - ], - "application/x-font-bdf": [ - "bdf" - ], - "application/x-font-dos": [], - "application/x-font-framemaker": [], - "application/x-font-ghostscript": [ - "gsf" - ], - "application/x-font-libgrx": [], - "application/x-font-linux-psf": [ - "psf" - ], - "application/x-font-otf": [ - "otf" - ], - "application/x-font-pcf": [ - "pcf" - ], - "application/x-font-snf": [ - "snf" - ], - "application/x-font-speedo": [], - "application/x-font-sunos-news": [], - "application/x-font-ttf": [ - "ttf", - "ttc" - ], - "application/x-font-type1": [ - "pfa", - "pfb", - "pfm", - "afm" - ], - "application/font-woff": [ - "woff" - ], - "application/x-font-vfont": [], - "application/x-freearc": [ - "arc" - ], - "application/x-futuresplash": [ - "spl" - ], - "application/x-gca-compressed": [ - "gca" - ], - "application/x-glulx": [ - "ulx" - ], - "application/x-gnumeric": [ - "gnumeric" - ], - "application/x-gramps-xml": [ - "gramps" - ], - "application/x-gtar": [ - "gtar" - ], - "application/x-gzip": [], - "application/x-hdf": [ - "hdf" - ], - "application/x-install-instructions": [ - "install" - ], - "application/x-iso9660-image": [ - "iso" - ], - "application/x-java-jnlp-file": [ - "jnlp" - ], - "application/x-latex": [ - "latex" - ], - "application/x-lzh-compressed": [ - "lzh", - "lha" - ], - "application/x-mie": [ - "mie" - ], - "application/x-mobipocket-ebook": [ - "prc", - "mobi" - ], - "application/x-ms-application": [ - "application" - ], - "application/x-ms-shortcut": [ - "lnk" - ], - "application/x-ms-wmd": [ - "wmd" - ], - "application/x-ms-wmz": [ - "wmz" - ], - "application/x-ms-xbap": [ - "xbap" - ], - "application/x-msaccess": [ - "mdb" - ], - "application/x-msbinder": [ - "obd" - ], - "application/x-mscardfile": [ - "crd" - ], - "application/x-msclip": [ - "clp" - ], - "application/x-msdownload": [ - "exe", - "dll", - "com", - "bat", - "msi" - ], - "application/x-msmediaview": [ - "mvb", - "m13", - "m14" - ], - "application/x-msmetafile": [ - "wmf", - "wmz", - "emf", - "emz" - ], - "application/x-msmoney": [ - "mny" - ], - "application/x-mspublisher": [ - "pub" - ], - "application/x-msschedule": [ - "scd" - ], - "application/x-msterminal": [ - "trm" - ], - "application/x-mswrite": [ - "wri" - ], - "application/x-netcdf": [ - "nc", - "cdf" - ], - "application/x-nzb": [ - "nzb" - ], - "application/x-pkcs12": [ - "p12", - "pfx" - ], - "application/x-pkcs7-certificates": [ - "p7b", - "spc" - ], - "application/x-pkcs7-certreqresp": [ - "p7r" - ], - "application/x-rar-compressed": [ - "rar" - ], - "application/x-research-info-systems": [ - "ris" - ], - "application/x-sh": [ - "sh" - ], - "application/x-shar": [ - "shar" - ], - "application/x-shockwave-flash": [ - "swf" - ], - "application/x-silverlight-app": [ - "xap" - ], - "application/x-sql": [ - "sql" - ], - "application/x-stuffit": [ - "sit" - ], - "application/x-stuffitx": [ - "sitx" - ], - "application/x-subrip": [ - "srt" - ], - "application/x-sv4cpio": [ - "sv4cpio" - ], - "application/x-sv4crc": [ - "sv4crc" - ], - "application/x-t3vm-image": [ - "t3" - ], - "application/x-tads": [ - "gam" - ], - "application/x-tar": [ - "tar" - ], - "application/x-tcl": [ - "tcl" - ], - "application/x-tex": [ - "tex" - ], - "application/x-tex-tfm": [ - "tfm" - ], - "application/x-texinfo": [ - "texinfo", - "texi" - ], - "application/x-tgif": [ - "obj" - ], - "application/x-ustar": [ - "ustar" - ], - "application/x-wais-source": [ - "src" - ], - "application/x-x509-ca-cert": [ - "der", - "crt" - ], - "application/x-xfig": [ - "fig" - ], - "application/x-xliff+xml": [ - "xlf" - ], - "application/x-xpinstall": [ - "xpi" - ], - "application/x-xz": [ - "xz" - ], - "application/x-zmachine": [ - "z1", - "z2", - "z3", - "z4", - "z5", - "z6", - "z7", - "z8" - ], - "application/x400-bp": [], - "application/xaml+xml": [ - "xaml" - ], - "application/xcap-att+xml": [], - "application/xcap-caps+xml": [], - "application/xcap-diff+xml": [ - "xdf" - ], - "application/xcap-el+xml": [], - "application/xcap-error+xml": [], - "application/xcap-ns+xml": [], - "application/xcon-conference-info-diff+xml": [], - "application/xcon-conference-info+xml": [], - "application/xenc+xml": [ - "xenc" - ], - "application/xhtml+xml": [ - "xhtml", - "xht" - ], - "application/xhtml-voice+xml": [], - "application/xml": [ - "xml", - "xsl" - ], - "application/xml-dtd": [ - "dtd" - ], - "application/xml-external-parsed-entity": [], - "application/xmpp+xml": [], - "application/xop+xml": [ - "xop" - ], - "application/xproc+xml": [ - "xpl" - ], - "application/xslt+xml": [ - "xslt" - ], - "application/xspf+xml": [ - "xspf" - ], - "application/xv+xml": [ - "mxml", - "xhvml", - "xvml", - "xvm" - ], - "application/yang": [ - "yang" - ], - "application/yin+xml": [ - "yin" - ], - "application/zip": [ - "zip" - ], - "audio/1d-interleaved-parityfec": [], - "audio/32kadpcm": [], - "audio/3gpp": [], - "audio/3gpp2": [], - "audio/ac3": [], - "audio/adpcm": [ - "adp" - ], - "audio/amr": [], - "audio/amr-wb": [], - "audio/amr-wb+": [], - "audio/asc": [], - "audio/atrac-advanced-lossless": [], - "audio/atrac-x": [], - "audio/atrac3": [], - "audio/basic": [ - "au", - "snd" - ], - "audio/bv16": [], - "audio/bv32": [], - "audio/clearmode": [], - "audio/cn": [], - "audio/dat12": [], - "audio/dls": [], - "audio/dsr-es201108": [], - "audio/dsr-es202050": [], - "audio/dsr-es202211": [], - "audio/dsr-es202212": [], - "audio/dv": [], - "audio/dvi4": [], - "audio/eac3": [], - "audio/evrc": [], - "audio/evrc-qcp": [], - "audio/evrc0": [], - "audio/evrc1": [], - "audio/evrcb": [], - "audio/evrcb0": [], - "audio/evrcb1": [], - "audio/evrcwb": [], - "audio/evrcwb0": [], - "audio/evrcwb1": [], - "audio/example": [], - "audio/fwdred": [], - "audio/g719": [], - "audio/g722": [], - "audio/g7221": [], - "audio/g723": [], - "audio/g726-16": [], - "audio/g726-24": [], - "audio/g726-32": [], - "audio/g726-40": [], - "audio/g728": [], - "audio/g729": [], - "audio/g7291": [], - "audio/g729d": [], - "audio/g729e": [], - "audio/gsm": [], - "audio/gsm-efr": [], - "audio/gsm-hr-08": [], - "audio/ilbc": [], - "audio/ip-mr_v2.5": [], - "audio/isac": [], - "audio/l16": [], - "audio/l20": [], - "audio/l24": [], - "audio/l8": [], - "audio/lpc": [], - "audio/midi": [ - "mid", - "midi", - "kar", - "rmi" - ], - "audio/mobile-xmf": [], - "audio/mp4": [ - "mp4a" - ], - "audio/mp4a-latm": [], - "audio/mpa": [], - "audio/mpa-robust": [], - "audio/mpeg": [ - "mpga", - "mp2", - "mp2a", - "mp3", - "m2a", - "m3a" - ], - "audio/mpeg4-generic": [], - "audio/musepack": [], - "audio/ogg": [ - "oga", - "ogg", - "spx" - ], - "audio/opus": [], - "audio/parityfec": [], - "audio/pcma": [], - "audio/pcma-wb": [], - "audio/pcmu-wb": [], - "audio/pcmu": [], - "audio/prs.sid": [], - "audio/qcelp": [], - "audio/red": [], - "audio/rtp-enc-aescm128": [], - "audio/rtp-midi": [], - "audio/rtx": [], - "audio/s3m": [ - "s3m" - ], - "audio/silk": [ - "sil" - ], - "audio/smv": [], - "audio/smv0": [], - "audio/smv-qcp": [], - "audio/sp-midi": [], - "audio/speex": [], - "audio/t140c": [], - "audio/t38": [], - "audio/telephone-event": [], - "audio/tone": [], - "audio/uemclip": [], - "audio/ulpfec": [], - "audio/vdvi": [], - "audio/vmr-wb": [], - "audio/vnd.3gpp.iufp": [], - "audio/vnd.4sb": [], - "audio/vnd.audiokoz": [], - "audio/vnd.celp": [], - "audio/vnd.cisco.nse": [], - "audio/vnd.cmles.radio-events": [], - "audio/vnd.cns.anp1": [], - "audio/vnd.cns.inf1": [], - "audio/vnd.dece.audio": [ - "uva", - "uvva" - ], - "audio/vnd.digital-winds": [ - "eol" - ], - "audio/vnd.dlna.adts": [], - "audio/vnd.dolby.heaac.1": [], - "audio/vnd.dolby.heaac.2": [], - "audio/vnd.dolby.mlp": [], - "audio/vnd.dolby.mps": [], - "audio/vnd.dolby.pl2": [], - "audio/vnd.dolby.pl2x": [], - "audio/vnd.dolby.pl2z": [], - "audio/vnd.dolby.pulse.1": [], - "audio/vnd.dra": [ - "dra" - ], - "audio/vnd.dts": [ - "dts" - ], - "audio/vnd.dts.hd": [ - "dtshd" - ], - "audio/vnd.dvb.file": [], - "audio/vnd.everad.plj": [], - "audio/vnd.hns.audio": [], - "audio/vnd.lucent.voice": [ - "lvp" - ], - "audio/vnd.ms-playready.media.pya": [ - "pya" - ], - "audio/vnd.nokia.mobile-xmf": [], - "audio/vnd.nortel.vbk": [], - "audio/vnd.nuera.ecelp4800": [ - "ecelp4800" - ], - "audio/vnd.nuera.ecelp7470": [ - "ecelp7470" - ], - "audio/vnd.nuera.ecelp9600": [ - "ecelp9600" - ], - "audio/vnd.octel.sbc": [], - "audio/vnd.qcelp": [], - "audio/vnd.rhetorex.32kadpcm": [], - "audio/vnd.rip": [ - "rip" - ], - "audio/vnd.sealedmedia.softseal.mpeg": [], - "audio/vnd.vmx.cvsd": [], - "audio/vorbis": [], - "audio/vorbis-config": [], - "audio/webm": [ - "weba" - ], - "audio/x-aac": [ - "aac" - ], - "audio/x-aiff": [ - "aif", - "aiff", - "aifc" - ], - "audio/x-caf": [ - "caf" - ], - "audio/x-flac": [ - "flac" - ], - "audio/x-matroska": [ - "mka" - ], - "audio/x-mpegurl": [ - "m3u" - ], - "audio/x-ms-wax": [ - "wax" - ], - "audio/x-ms-wma": [ - "wma" - ], - "audio/x-pn-realaudio": [ - "ram", - "ra" - ], - "audio/x-pn-realaudio-plugin": [ - "rmp" - ], - "audio/x-tta": [], - "audio/x-wav": [ - "wav" - ], - "audio/xm": [ - "xm" - ], - "chemical/x-cdx": [ - "cdx" - ], - "chemical/x-cif": [ - "cif" - ], - "chemical/x-cmdf": [ - "cmdf" - ], - "chemical/x-cml": [ - "cml" - ], - "chemical/x-csml": [ - "csml" - ], - "chemical/x-pdb": [], - "chemical/x-xyz": [ - "xyz" - ], - "image/bmp": [ - "bmp" - ], - "image/cgm": [ - "cgm" - ], - "image/example": [], - "image/fits": [], - "image/g3fax": [ - "g3" - ], - "image/gif": [ - "gif" - ], - "image/ief": [ - "ief" - ], - "image/jp2": [], - "image/jpeg": [ - "jpeg", - "jpg", - "jpe" - ], - "image/jpm": [], - "image/jpx": [], - "image/ktx": [ - "ktx" - ], - "image/naplps": [], - "image/png": [ - "png" - ], - "image/prs.btif": [ - "btif" - ], - "image/prs.pti": [], - "image/sgi": [ - "sgi" - ], - "image/svg+xml": [ - "svg", - "svgz" - ], - "image/t38": [], - "image/tiff": [ - "tiff", - "tif" - ], - "image/tiff-fx": [], - "image/vnd.adobe.photoshop": [ - "psd" - ], - "image/vnd.cns.inf2": [], - "image/vnd.dece.graphic": [ - "uvi", - "uvvi", - "uvg", - "uvvg" - ], - "image/vnd.dvb.subtitle": [ - "sub" - ], - "image/vnd.djvu": [ - "djvu", - "djv" - ], - "image/vnd.dwg": [ - "dwg" - ], - "image/vnd.dxf": [ - "dxf" - ], - "image/vnd.fastbidsheet": [ - "fbs" - ], - "image/vnd.fpx": [ - "fpx" - ], - "image/vnd.fst": [ - "fst" - ], - "image/vnd.fujixerox.edmics-mmr": [ - "mmr" - ], - "image/vnd.fujixerox.edmics-rlc": [ - "rlc" - ], - "image/vnd.globalgraphics.pgb": [], - "image/vnd.microsoft.icon": [], - "image/vnd.mix": [], - "image/vnd.ms-modi": [ - "mdi" - ], - "image/vnd.ms-photo": [ - "wdp" - ], - "image/vnd.net-fpx": [ - "npx" - ], - "image/vnd.radiance": [], - "image/vnd.sealed.png": [], - "image/vnd.sealedmedia.softseal.gif": [], - "image/vnd.sealedmedia.softseal.jpg": [], - "image/vnd.svf": [], - "image/vnd.wap.wbmp": [ - "wbmp" - ], - "image/vnd.xiff": [ - "xif" - ], - "image/webp": [ - "webp" - ], - "image/x-3ds": [ - "3ds" - ], - "image/x-cmu-raster": [ - "ras" - ], - "image/x-cmx": [ - "cmx" - ], - "image/x-freehand": [ - "fh", - "fhc", - "fh4", - "fh5", - "fh7" - ], - "image/x-icon": [ - "ico" - ], - "image/x-mrsid-image": [ - "sid" - ], - "image/x-pcx": [ - "pcx" - ], - "image/x-pict": [ - "pic", - "pct" - ], - "image/x-portable-anymap": [ - "pnm" - ], - "image/x-portable-bitmap": [ - "pbm" - ], - "image/x-portable-graymap": [ - "pgm" - ], - "image/x-portable-pixmap": [ - "ppm" - ], - "image/x-rgb": [ - "rgb" - ], - "image/x-tga": [ - "tga" - ], - "image/x-xbitmap": [ - "xbm" - ], - "image/x-xpixmap": [ - "xpm" - ], - "image/x-xwindowdump": [ - "xwd" - ], - "message/cpim": [], - "message/delivery-status": [], - "message/disposition-notification": [], - "message/example": [], - "message/external-body": [], - "message/feedback-report": [], - "message/global": [], - "message/global-delivery-status": [], - "message/global-disposition-notification": [], - "message/global-headers": [], - "message/http": [], - "message/imdn+xml": [], - "message/news": [], - "message/partial": [], - "message/rfc822": [ - "eml", - "mime" - ], - "message/s-http": [], - "message/sip": [], - "message/sipfrag": [], - "message/tracking-status": [], - "message/vnd.si.simp": [], - "model/example": [], - "model/iges": [ - "igs", - "iges" - ], - "model/mesh": [ - "msh", - "mesh", - "silo" - ], - "model/vnd.collada+xml": [ - "dae" - ], - "model/vnd.dwf": [ - "dwf" - ], - "model/vnd.flatland.3dml": [], - "model/vnd.gdl": [ - "gdl" - ], - "model/vnd.gs-gdl": [], - "model/vnd.gs.gdl": [], - "model/vnd.gtw": [ - "gtw" - ], - "model/vnd.moml+xml": [], - "model/vnd.mts": [ - "mts" - ], - "model/vnd.parasolid.transmit.binary": [], - "model/vnd.parasolid.transmit.text": [], - "model/vnd.vtu": [ - "vtu" - ], - "model/vrml": [ - "wrl", - "vrml" - ], - "model/x3d+binary": [ - "x3db", - "x3dbz" - ], - "model/x3d+vrml": [ - "x3dv", - "x3dvz" - ], - "model/x3d+xml": [ - "x3d", - "x3dz" - ], - "multipart/alternative": [], - "multipart/appledouble": [], - "multipart/byteranges": [], - "multipart/digest": [], - "multipart/encrypted": [], - "multipart/example": [], - "multipart/form-data": [], - "multipart/header-set": [], - "multipart/mixed": [], - "multipart/parallel": [], - "multipart/related": [], - "multipart/report": [], - "multipart/signed": [], - "multipart/voice-message": [], - "text/1d-interleaved-parityfec": [], - "text/cache-manifest": [ - "appcache" - ], - "text/calendar": [ - "ics", - "ifb" - ], - "text/css": [ - "css" - ], - "text/csv": [ - "csv" - ], - "text/directory": [], - "text/dns": [], - "text/ecmascript": [], - "text/enriched": [], - "text/example": [], - "text/fwdred": [], - "text/html": [ - "html", - "htm" - ], - "text/javascript": [], - "text/n3": [ - "n3" - ], - "text/parityfec": [], - "text/plain": [ - "txt", - "text", - "conf", - "def", - "list", - "log", - "in" - ], - "text/prs.fallenstein.rst": [], - "text/prs.lines.tag": [ - "dsc" - ], - "text/vnd.radisys.msml-basic-layout": [], - "text/red": [], - "text/rfc822-headers": [], - "text/richtext": [ - "rtx" - ], - "text/rtf": [], - "text/rtp-enc-aescm128": [], - "text/rtx": [], - "text/sgml": [ - "sgml", - "sgm" - ], - "text/t140": [], - "text/tab-separated-values": [ - "tsv" - ], - "text/troff": [ - "t", - "tr", - "roff", - "man", - "me", - "ms" - ], - "text/turtle": [ - "ttl" - ], - "text/ulpfec": [], - "text/uri-list": [ - "uri", - "uris", - "urls" - ], - "text/vcard": [ - "vcard" - ], - "text/vnd.abc": [], - "text/vnd.curl": [ - "curl" - ], - "text/vnd.curl.dcurl": [ - "dcurl" - ], - "text/vnd.curl.scurl": [ - "scurl" - ], - "text/vnd.curl.mcurl": [ - "mcurl" - ], - "text/vnd.dmclientscript": [], - "text/vnd.dvb.subtitle": [ - "sub" - ], - "text/vnd.esmertec.theme-descriptor": [], - "text/vnd.fly": [ - "fly" - ], - "text/vnd.fmi.flexstor": [ - "flx" - ], - "text/vnd.graphviz": [ - "gv" - ], - "text/vnd.in3d.3dml": [ - "3dml" - ], - "text/vnd.in3d.spot": [ - "spot" - ], - "text/vnd.iptc.newsml": [], - "text/vnd.iptc.nitf": [], - "text/vnd.latex-z": [], - "text/vnd.motorola.reflex": [], - "text/vnd.ms-mediapackage": [], - "text/vnd.net2phone.commcenter.command": [], - "text/vnd.si.uricatalogue": [], - "text/vnd.sun.j2me.app-descriptor": [ - "jad" - ], - "text/vnd.trolltech.linguist": [], - "text/vnd.wap.si": [], - "text/vnd.wap.sl": [], - "text/vnd.wap.wml": [ - "wml" - ], - "text/vnd.wap.wmlscript": [ - "wmls" - ], - "text/x-asm": [ - "s", - "asm" - ], - "text/x-c": [ - "c", - "cc", - "cxx", - "cpp", - "h", - "hh", - "dic" - ], - "text/x-fortran": [ - "f", - "for", - "f77", - "f90" - ], - "text/x-java-source": [ - "java" - ], - "text/x-opml": [ - "opml" - ], - "text/x-pascal": [ - "p", - "pas" - ], - "text/x-nfo": [ - "nfo" - ], - "text/x-setext": [ - "etx" - ], - "text/x-sfv": [ - "sfv" - ], - "text/x-uuencode": [ - "uu" - ], - "text/x-vcalendar": [ - "vcs" - ], - "text/x-vcard": [ - "vcf" - ], - "text/xml": [], - "text/xml-external-parsed-entity": [], - "video/1d-interleaved-parityfec": [], - "video/3gpp": [ - "3gp" - ], - "video/3gpp-tt": [], - "video/3gpp2": [ - "3g2" - ], - "video/bmpeg": [], - "video/bt656": [], - "video/celb": [], - "video/dv": [], - "video/example": [], - "video/h261": [ - "h261" - ], - "video/h263": [ - "h263" - ], - "video/h263-1998": [], - "video/h263-2000": [], - "video/h264": [ - "h264" - ], - "video/h264-rcdo": [], - "video/h264-svc": [], - "video/jpeg": [ - "jpgv" - ], - "video/jpeg2000": [], - "video/jpm": [ - "jpm", - "jpgm" - ], - "video/mj2": [ - "mj2", - "mjp2" - ], - "video/mp1s": [], - "video/mp2p": [], - "video/mp2t": [], - "video/mp4": [ - "mp4", - "mp4v", - "mpg4" - ], - "video/mp4v-es": [], - "video/mpeg": [ - "mpeg", - "mpg", - "mpe", - "m1v", - "m2v" - ], - "video/mpeg4-generic": [], - "video/mpv": [], - "video/nv": [], - "video/ogg": [ - "ogv" - ], - "video/parityfec": [], - "video/pointer": [], - "video/quicktime": [ - "qt", - "mov" - ], - "video/raw": [], - "video/rtp-enc-aescm128": [], - "video/rtx": [], - "video/smpte292m": [], - "video/ulpfec": [], - "video/vc1": [], - "video/vnd.cctv": [], - "video/vnd.dece.hd": [ - "uvh", - "uvvh" - ], - "video/vnd.dece.mobile": [ - "uvm", - "uvvm" - ], - "video/vnd.dece.mp4": [], - "video/vnd.dece.pd": [ - "uvp", - "uvvp" - ], - "video/vnd.dece.sd": [ - "uvs", - "uvvs" - ], - "video/vnd.dece.video": [ - "uvv", - "uvvv" - ], - "video/vnd.directv.mpeg": [], - "video/vnd.directv.mpeg-tts": [], - "video/vnd.dlna.mpeg-tts": [], - "video/vnd.dvb.file": [ - "dvb" - ], - "video/vnd.fvt": [ - "fvt" - ], - "video/vnd.hns.video": [], - "video/vnd.iptvforum.1dparityfec-1010": [], - "video/vnd.iptvforum.1dparityfec-2005": [], - "video/vnd.iptvforum.2dparityfec-1010": [], - "video/vnd.iptvforum.2dparityfec-2005": [], - "video/vnd.iptvforum.ttsavc": [], - "video/vnd.iptvforum.ttsmpeg2": [], - "video/vnd.motorola.video": [], - "video/vnd.motorola.videop": [], - "video/vnd.mpegurl": [ - "mxu", - "m4u" - ], - "video/vnd.ms-playready.media.pyv": [ - "pyv" - ], - "video/vnd.nokia.interleaved-multimedia": [], - "video/vnd.nokia.videovoip": [], - "video/vnd.objectvideo": [], - "video/vnd.sealed.mpeg1": [], - "video/vnd.sealed.mpeg4": [], - "video/vnd.sealed.swf": [], - "video/vnd.sealedmedia.softseal.mov": [], - "video/vnd.uvvu.mp4": [ - "uvu", - "uvvu" - ], - "video/vnd.vivo": [ - "viv" - ], - "video/webm": [ - "webm" - ], - "video/x-f4v": [ - "f4v" - ], - "video/x-fli": [ - "fli" - ], - "video/x-flv": [ - "flv" - ], - "video/x-m4v": [ - "m4v" - ], - "video/x-matroska": [ - "mkv", - "mk3d", - "mks" - ], - "video/x-mng": [ - "mng" - ], - "video/x-ms-asf": [ - "asf", - "asx" - ], - "video/x-ms-vob": [ - "vob" - ], - "video/x-ms-wm": [ - "wm" - ], - "video/x-ms-wmv": [ - "wmv" - ], - "video/x-ms-wmx": [ - "wmx" - ], - "video/x-ms-wvx": [ - "wvx" - ], - "video/x-msvideo": [ - "avi" - ], - "video/x-sgi-movie": [ - "movie" - ], - "video/x-smv": [ - "smv" - ], - "x-conference/x-cooltalk": [ - "ice" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json deleted file mode 100644 index ad50d61..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "text/vtt": [ - "vtt" - ], - "application/x-chrome-extension": [ - "crx" - ], - "text/x-component": [ - "htc" - ], - "text/cache-manifest": [ - "manifest" - ], - "application/octet-stream": [ - "buffer" - ], - "application/mp4": [ - "m4p" - ], - "audio/mp4": [ - "m4a" - ], - "video/MP2T": [ - "ts" - ], - "application/x-web-app-manifest+json": [ - "webapp" - ], - "text/x-lua": [ - "lua" - ], - "application/x-lua-bytecode": [ - "luac" - ], - "text/x-markdown": [ - "markdown", - "md", - "mkd" - ], - "text/plain": [ - "ini" - ], - "application/dash+xml": [ - "mdp" - ], - "font/opentype": [ - "otf" - ], - "application/json": [ - "map" - ], - "application/xml": [ - "xsd" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json deleted file mode 100644 index bd487f6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "1.0.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": "https://searchbeam.jit.su" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/mime-types" - }, - "license": "MIT", - "main": "lib", - "devDependencies": { - "co": "3", - "cogent": "0", - "mocha": "1", - "should": "3" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "make test" - }, - "bugs": { - "url": "https://github.com/expressjs/mime-types/issues" - }, - "homepage": "https://github.com/expressjs/mime-types", - "_id": "mime-types@1.0.1", - "_shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "_from": "mime-types@>=1.0.1-0 <1.1.0-0", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore deleted file mode 100644 index a6a8d17..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -examples -test -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE deleted file mode 100644 index 42ca2e7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Original "Negotiator" program Copyright Federico Romero -Port to JavaScript Copyright Isaac Z. Schlueter - -All rights reserved. - -MIT 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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js deleted file mode 100644 index d231291..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js +++ /dev/null @@ -1,90 +0,0 @@ -module.exports = preferredCharsets; -preferredCharsets.preferredCharsets = preferredCharsets; - -function parseAcceptCharset(accept) { - return accept.split(',').map(function(e) { - return parseCharset(e.trim()); - }).filter(function(e) { - return e; - }); -} - -function parseCharset(s) { - var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); - if (!match) return null; - - var charset = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - charset: charset, - q: q - }; -} - -function getCharsetPriority(charset, accepted) { - return (accepted.map(function(a) { - return specify(charset, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q:0}); -} - -function specify(charset, spec) { - var s = 0; - if(spec.charset === charset){ - s |= 1; - } else if (spec.charset !== '*' ) { - return null - } - - return { - s: s, - q: spec.q, - } -} - -function preferredCharsets(accept, provided) { - // RFC 2616 sec 14.2: no header = * - accept = parseAcceptCharset(accept === undefined ? '*' : accept || ''); - if (provided) { - return provided.map(function(type) { - return [type, getCharsetPriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type) { - return type.q > 0; - }).map(function(type) { - return type.charset; - }); - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js deleted file mode 100644 index 207291d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js +++ /dev/null @@ -1,120 +0,0 @@ -module.exports = preferredEncodings; -preferredEncodings.preferredEncodings = preferredEncodings; - -function parseAcceptEncoding(accept) { - var acceptableEncodings; - - if (accept) { - acceptableEncodings = accept.split(',').map(function(e) { - return parseEncoding(e.trim()); - }); - } else { - acceptableEncodings = []; - } - - if (!acceptableEncodings.some(function(e) { - return e && specify('identity', e); - })) { - /* - * If identity doesn't explicitly appear in the accept-encoding header, - * it's added to the list of acceptable encoding with the lowest q - * - */ - var lowestQ = 1; - - for(var i = 0; i < acceptableEncodings.length; i++){ - var e = acceptableEncodings[i]; - if(e && e.q < lowestQ){ - lowestQ = e.q; - } - } - acceptableEncodings.push({ - encoding: 'identity', - q: lowestQ / 2, - }); - } - - return acceptableEncodings.filter(function(e) { - return e; - }); -} - -function parseEncoding(s) { - var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); - - if (!match) return null; - - var encoding = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';'); - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - encoding: encoding, - q: q - }; -} - -function getEncodingPriority(encoding, accepted) { - return (accepted.map(function(a) { - return specify(encoding, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q: 0}); -} - -function specify(encoding, spec) { - var s = 0; - if(spec.encoding === encoding){ - s |= 1; - } else if (spec.encoding !== '*' ) { - return null - } - - return { - s: s, - q: spec.q, - } -}; - -function preferredEncodings(accept, provided) { - accept = parseAcceptEncoding(accept || ''); - if (provided) { - return provided.map(function(type) { - return [type, getEncodingPriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type){ - return type.q > 0; - }).map(function(type) { - return type.encoding; - }); - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js deleted file mode 100644 index 63036c7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js +++ /dev/null @@ -1,103 +0,0 @@ -module.exports = preferredLanguages; -preferredLanguages.preferredLanguages = preferredLanguages; - -function parseAcceptLanguage(accept) { - return accept.split(',').map(function(e) { - return parseLanguage(e.trim()); - }).filter(function(e) { - return e; - }); -} - -function parseLanguage(s) { - var match = s.match(/^\s*(\S+?)(?:-(\S+?))?\s*(?:;(.*))?$/); - if (!match) return null; - - var prefix = match[1], - suffix = match[2], - full = prefix; - - if (suffix) full += "-" + suffix; - - var q = 1; - if (match[3]) { - var params = match[3].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].split('='); - if (p[0] === 'q') q = parseFloat(p[1]); - } - } - - return { - prefix: prefix, - suffix: suffix, - q: q, - full: full - }; -} - -function getLanguagePriority(language, accepted) { - return (accepted.map(function(a){ - return specify(language, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q: 0}); -} - -function specify(language, spec) { - var p = parseLanguage(language) - if (!p) return null; - var s = 0; - if(spec.full === p.full){ - s |= 4; - } else if (spec.prefix === p.full) { - s |= 2; - } else if (spec.full === p.prefix) { - s |= 1; - } else if (spec.full !== '*' ) { - return null - } - - return { - s: s, - q: spec.q, - } -}; - -function preferredLanguages(accept, provided) { - // RFC 2616 sec 14.4: no header = * - accept = parseAcceptLanguage(accept === undefined ? '*' : accept || ''); - if (provided) { - - var ret = provided.map(function(type) { - return [type, getLanguagePriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - return ret; - - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type) { - return type.q > 0; - }).map(function(type) { - return type.full; - }); - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js deleted file mode 100644 index f4dc1ca..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js +++ /dev/null @@ -1,125 +0,0 @@ -module.exports = preferredMediaTypes; -preferredMediaTypes.preferredMediaTypes = preferredMediaTypes; - -function parseAccept(accept) { - return accept.split(',').map(function(e) { - return parseMediaType(e.trim()); - }).filter(function(e) { - return e; - }); -}; - -function parseMediaType(s) { - var match = s.match(/\s*(\S+?)\/([^;\s]+)\s*(?:;(.*))?/); - if (!match) return null; - - var type = match[1], - subtype = match[2], - full = "" + type + "/" + subtype, - params = {}, - q = 1; - - if (match[3]) { - params = match[3].split(';').map(function(s) { - return s.trim().split('='); - }).reduce(function (set, p) { - set[p[0]] = p[1]; - return set - }, params); - - if (params.q != null) { - q = parseFloat(params.q); - delete params.q; - } - } - - return { - type: type, - subtype: subtype, - params: params, - q: q, - full: full - }; -} - -function getMediaTypePriority(type, accepted) { - return (accepted.map(function(a) { - return specify(type, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q: 0}); -} - -function specify(type, spec) { - var p = parseMediaType(type); - var s = 0; - - if (!p) { - return null; - } - - if(spec.type == p.type) { - s |= 4 - } else if(spec.type != '*') { - return null; - } - - if(spec.subtype == p.subtype) { - s |= 2 - } else if(spec.subtype != '*') { - return null; - } - - var keys = Object.keys(spec.params); - if (keys.length > 0) { - if (keys.every(function (k) { - return spec.params[k] == '*' || spec.params[k] == p.params[k]; - })) { - s |= 1 - } else { - return null - } - } - - return { - q: spec.q, - s: s, - } - -} - -function preferredMediaTypes(accept, provided) { - // RFC 2616 sec 14.2: no header = */* - accept = parseAccept(accept === undefined ? '*/*' : accept || ''); - if (provided) { - return provided.map(function(type) { - return [type, getMediaTypePriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type) { - return type.q > 0; - }).map(function(type) { - return type.full; - }); - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js deleted file mode 100644 index ba0c48b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js +++ /dev/null @@ -1,37 +0,0 @@ -module.exports = Negotiator; -Negotiator.Negotiator = Negotiator; - -function Negotiator(request) { - if (!(this instanceof Negotiator)) return new Negotiator(request); - this.request = request; -} - -var set = { charset: 'accept-charset', - encoding: 'accept-encoding', - language: 'accept-language', - mediaType: 'accept' }; - - -function capitalize(string){ - return string.charAt(0).toUpperCase() + string.slice(1); -} - -Object.keys(set).forEach(function (k) { - var header = set[k], - method = require('./'+k+'.js'), - singular = k, - plural = k + 's'; - - Negotiator.prototype[plural] = function (available) { - return method(this.request.headers[header], available); - }; - - Negotiator.prototype[singular] = function(available) { - var set = this[plural](available); - if (set) return set[0]; - }; - - // Keep preferred* methods for legacy compatibility - Negotiator.prototype['preferred'+capitalize(plural)] = Negotiator.prototype[plural]; - Negotiator.prototype['preferred'+capitalize(singular)] = Negotiator.prototype[singular]; -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json deleted file mode 100644 index 0572f18..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "negotiator", - "description": "HTTP content negotiation", - "version": "0.4.7", - "author": { - "name": "Federico Romero", - "email": "federico.romero@outboxlabs.com" - }, - "contributors": [ - { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/federomero/negotiator.git" - }, - "keywords": [ - "http", - "content negotiation", - "accept", - "accept-language", - "accept-encoding", - "accept-charset" - ], - "engine": "node >= 0.6", - "license": "MIT", - "devDependencies": { - "nodeunit": "0.8.x" - }, - "scripts": { - "test": "nodeunit test" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "main": "lib/negotiator.js", - "bugs": { - "url": "https://github.com/federomero/negotiator/issues" - }, - "homepage": "https://github.com/federomero/negotiator", - "dependencies": {}, - "_id": "negotiator@0.4.7", - "dist": { - "shasum": "a4160f7177ec806738631d0d3052325da42abdc8", - "tarball": "http://registry.npmjs.org/negotiator/-/negotiator-0.4.7.tgz" - }, - "_from": "negotiator@0.4.7", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "federomero", - "email": "federomero@gmail.com" - }, - "maintainers": [ - { - "name": "federomero", - "email": "federomero@gmail.com" - } - ], - "directories": {}, - "_shasum": "a4160f7177ec806738631d0d3052325da42abdc8", - "_resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.7.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md deleted file mode 100644 index d982a9c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md +++ /dev/null @@ -1,132 +0,0 @@ -# Negotiator [![Build Status](https://travis-ci.org/federomero/negotiator.png)](https://travis-ci.org/federomero/negotiator) - -An HTTP content negotiator for node.js written in javascript. - -# Accept Negotiation - - Negotiator = require('negotiator') - - availableMediaTypes = ['text/html', 'text/plain', 'application/json'] - - // The negotiator constructor receives a request object - negotiator = new Negotiator(request) - - // Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8' - - negotiator.mediaTypes() - // -> ['text/html', 'image/jpeg', 'application/*'] - - negotiator.mediaTypes(availableMediaTypes) - // -> ['text/html', 'application/json'] - - negotiator.mediaType(availableMediaTypes) - // -> 'text/html' - -You can check a working example at `examples/accept.js`. - -## Methods - -`mediaTypes(availableMediaTypes)`: - -Returns an array of preferred media types ordered by priority from a list of available media types. - -`mediaType(availableMediaType)`: - -Returns the top preferred media type from a list of available media types. - -# Accept-Language Negotiation - - Negotiator = require('negotiator') - - negotiator = new Negotiator(request) - - availableLanguages = 'en', 'es', 'fr' - - // Let's say Accept-Language header is 'en;q=0.8, es, pt' - - negotiator.languages() - // -> ['es', 'pt', 'en'] - - negotiator.languages(availableLanguages) - // -> ['es', 'en'] - - language = negotiator.language(availableLanguages) - // -> 'es' - -You can check a working example at `examples/language.js`. - -## Methods - -`languages(availableLanguages)`: - -Returns an array of preferred languages ordered by priority from a list of available languages. - -`language(availableLanguages)`: - -Returns the top preferred language from a list of available languages. - -# Accept-Charset Negotiation - - Negotiator = require('negotiator') - - availableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5'] - - negotiator = new Negotiator(request) - - // Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2' - - negotiator.charsets() - // -> ['utf-8', 'iso-8859-1', 'utf-7'] - - negotiator.charsets(availableCharsets) - // -> ['utf-8', 'iso-8859-1'] - - negotiator.charset(availableCharsets) - // -> 'utf-8' - -You can check a working example at `examples/charset.js`. - -## Methods - -`charsets(availableCharsets)`: - -Returns an array of preferred charsets ordered by priority from a list of available charsets. - -`charset(availableCharsets)`: - -Returns the top preferred charset from a list of available charsets. - -# Accept-Encoding Negotiation - - Negotiator = require('negotiator').Negotiator - - availableEncodings = ['identity', 'gzip'] - - negotiator = new Negotiator(request) - - // Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5' - - negotiator.encodings() - // -> ['gzip', 'identity', 'compress'] - - negotiator.encodings(availableEncodings) - // -> ['gzip', 'identity'] - - negotiator.encoding(availableEncodings) - // -> 'gzip' - -You can check a working example at `examples/encoding.js`. - -## Methods - -`encodings(availableEncodings)`: - -Returns an array of preferred encodings ordered by priority from a list of available encodings. - -`encoding(availableEncodings)`: - -Returns the top preferred encoding from a list of available encodings. - -# License - -MIT diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/package.json deleted file mode 100644 index 0d8c5bb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/accepts/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "accepts", - "description": "Higher-level content negotiation", - "version": "1.0.7", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/accepts" - }, - "dependencies": { - "mime-types": "~1.0.0", - "negotiator": "0.4.7" - }, - "devDependencies": { - "istanbul": "0.2.11", - "mocha": "*", - "should": "*" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --require should --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require should --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require should --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/accepts/issues" - }, - "homepage": "https://github.com/expressjs/accepts", - "_id": "accepts@1.0.7", - "dist": { - "shasum": "5b501fb4f0704309964ccdb048172541208dab1a", - "tarball": "http://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz" - }, - "_from": "accepts@>=1.0.7-0 <1.1.0-0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "federomero", - "email": "federomero@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "5b501fb4f0704309964ccdb048172541208dab1a", - "_resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.npmignore deleted file mode 100644 index b512c09..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.travis.yml deleted file mode 100644 index 7a902e8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 -notifications: - email: - recipients: - - brianloveswords@gmail.com \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/LICENSE deleted file mode 100644 index caeb849..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/LICENSE +++ /dev/null @@ -1,17 +0,0 @@ -Copyright (c) 2013 Brian J. Brennan - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/README.md deleted file mode 100644 index 0d9d8b8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# buffer-crc32 - -[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32) - -crc32 that works with binary data and fancy character sets, outputs -buffer, signed or unsigned data and has tests. - -Derived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix - -# install -``` -npm install buffer-crc32 -``` - -# example -```js -var crc32 = require('buffer-crc32'); -// works with buffers -var buf = Buffer([0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) -crc32(buf) // -> - -// has convenience methods for getting signed or unsigned ints -crc32.signed(buf) // -> -1805997238 -crc32.unsigned(buf) // -> 2488970058 - -// will cast to buffer if given a string, so you can -// directly use foreign characters safely -crc32('自動販売機') // -> - -// and works in append mode too -var partialCrc = crc32('hey'); -var partialCrc = crc32(' ', partialCrc); -var partialCrc = crc32('sup', partialCrc); -var partialCrc = crc32(' ', partialCrc); -var finalCrc = crc32('bros', partialCrc); // -> -``` - -# tests -This was tested against the output of zlib's crc32 method. You can run -the tests with`npm test` (requires tap) - -# see also -https://github.com/alexgorbatchev/node-crc, `crc.buffer.crc32` also -supports buffer inputs and return unsigned ints (thanks @tjholowaychuk). - -# license -MIT/X11 diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/index.js deleted file mode 100644 index 8694c63..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/index.js +++ /dev/null @@ -1,91 +0,0 @@ -var Buffer = require('buffer').Buffer; - -var CRC_TABLE = [ - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, - 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, - 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, - 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, - 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, - 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, - 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, - 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, - 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, - 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, - 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, - 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, - 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, - 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, - 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, - 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, - 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, - 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, - 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, - 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, - 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, - 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, - 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, - 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, - 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, - 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, - 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, - 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, - 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, - 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, - 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, - 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, - 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, - 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, - 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, - 0x2d02ef8d -]; - -if (typeof Int32Array !== 'undefined') - CRC_TABLE = new Int32Array(CRC_TABLE); - -function bufferizeInt(num) { - var tmp = Buffer(4); - tmp.writeInt32BE(num, 0); - return tmp; -} - -function _crc32(buf, previous) { - if (!Buffer.isBuffer(buf)) { - buf = Buffer(buf); - } - if (Buffer.isBuffer(previous)) { - previous = previous.readUInt32BE(0); - } - var crc = ~~previous ^ -1; - for (var n = 0; n < buf.length; n++) { - crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); - } - return (crc ^ -1); -} - -function crc32() { - return bufferizeInt(_crc32.apply(null, arguments)); -} -crc32.signed = function () { - return _crc32.apply(null, arguments); -}; -crc32.unsigned = function () { - return _crc32.apply(null, arguments) >>> 0; -}; - -module.exports = crc32; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/package.json deleted file mode 100644 index e0d6377..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "author": { - "name": "Brian J. Brennan", - "email": "brianloveswords@gmail.com", - "url": "http://bjb.io" - }, - "name": "buffer-crc32", - "description": "A pure javascript CRC32 algorithm that plays nice with binary data", - "version": "0.2.3", - "contributors": [ - { - "name": "Vladimir Kuznetsov" - } - ], - "homepage": "https://github.com/brianloveswords/buffer-crc32", - "repository": { - "type": "git", - "url": "git://github.com/brianloveswords/buffer-crc32.git" - }, - "main": "index.js", - "scripts": { - "test": "tap tests/*.test.js" - }, - "dependencies": {}, - "devDependencies": { - "tap": "~0.2.5" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "gitHead": "f06dc30bccbad685af30666268c6fd2670805998", - "bugs": { - "url": "https://github.com/brianloveswords/buffer-crc32/issues" - }, - "_id": "buffer-crc32@0.2.3", - "_shasum": "bb54519e95d107cbd2400e76d0cab1467336d921", - "_from": "buffer-crc32@0.2.3", - "_npmVersion": "1.4.14", - "_npmUser": { - "name": "brianloveswords", - "email": "brianloveswords@gmail.com" - }, - "maintainers": [ - { - "name": "brianloveswords", - "email": "brian@nyhacker.org" - } - ], - "dist": { - "shasum": "bb54519e95d107cbd2400e76d0cab1467336d921", - "tarball": "http://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js deleted file mode 100644 index bb0f9ef..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js +++ /dev/null @@ -1,89 +0,0 @@ -var crc32 = require('..'); -var test = require('tap').test; - -test('simple crc32 is no problem', function (t) { - var input = Buffer('hey sup bros'); - var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); - t.same(crc32(input), expected); - t.end(); -}); - -test('another simple one', function (t) { - var input = Buffer('IEND'); - var expected = Buffer([0xae, 0x42, 0x60, 0x82]); - t.same(crc32(input), expected); - t.end(); -}); - -test('slightly more complex', function (t) { - var input = Buffer([0x00, 0x00, 0x00]); - var expected = Buffer([0xff, 0x41, 0xd9, 0x12]); - t.same(crc32(input), expected); - t.end(); -}); - -test('complex crc32 gets calculated like a champ', function (t) { - var input = Buffer('शीर्षक'); - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('casts to buffer if necessary', function (t) { - var input = 'शीर्षक'; - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('can do signed', function (t) { - var input = 'ham sandwich'; - var expected = -1891873021; - t.same(crc32.signed(input), expected); - t.end(); -}); - -test('can do unsigned', function (t) { - var input = 'bear sandwich'; - var expected = 3711466352; - t.same(crc32.unsigned(input), expected); - t.end(); -}); - - -test('simple crc32 in append mode', function (t) { - var input = [Buffer('hey'), Buffer(' '), Buffer('sup'), Buffer(' '), Buffer('bros')]; - var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); - for (var crc = 0, i = 0; i < input.length; i++) { - crc = crc32(input[i], crc); - } - t.same(crc, expected); - t.end(); -}); - - -test('can do signed in append mode', function (t) { - var input1 = 'ham'; - var input2 = ' '; - var input3 = 'sandwich'; - var expected = -1891873021; - - var crc = crc32.signed(input1); - crc = crc32.signed(input2, crc); - crc = crc32.signed(input3, crc); - - t.same(crc, expected); - t.end(); -}); - -test('can do unsigned in append mode', function (t) { - var input1 = 'bear san'; - var input2 = 'dwich'; - var expected = 3711466352; - - var crc = crc32.unsigned(input1); - crc = crc32.unsigned(input2, crc); - t.same(crc, expected); - t.end(); -}); - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/History.md deleted file mode 100644 index 2bbc4b3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/History.md +++ /dev/null @@ -1,27 +0,0 @@ -1.0.4 / 2014-06-25 -================== - - * corrected avoidance of timing attacks (thanks @tenbits!) - - -1.0.3 / 2014-01-28 -================== - - * [incorrect] fix for timing attacks - -1.0.2 / 2014-01-28 -================== - - * fix missing repository warning - * fix typo in test - -1.0.1 / 2013-04-15 -================== - - * Revert "Changed underlying HMAC algo. to sha512." - * Revert "Fix for timing attacks on MAC verification." - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Makefile deleted file mode 100644 index 4e9c8d3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --require should \ - --reporter spec - -.PHONY: test \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Readme.md deleted file mode 100644 index 2559e84..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/Readme.md +++ /dev/null @@ -1,42 +0,0 @@ - -# cookie-signature - - Sign and unsign cookies. - -## Example - -```js -var cookie = require('cookie-signature'); - -var val = cookie.sign('hello', 'tobiiscool'); -val.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI'); - -var val = cookie.sign('hello', 'tobiiscool'); -cookie.unsign(val, 'tobiiscool').should.equal('hello'); -cookie.unsign(val, 'luna').should.be.false; -``` - -## License - -(The MIT License) - -Copyright (c) 2012 LearnBoost <tj@learnboost.com> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/index.js deleted file mode 100644 index b63bf84..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/index.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Sign the given `val` with `secret`. - * - * @param {String} val - * @param {String} secret - * @return {String} - * @api private - */ - -exports.sign = function(val, secret){ - if ('string' != typeof val) throw new TypeError('cookie required'); - if ('string' != typeof secret) throw new TypeError('secret required'); - return val + '.' + crypto - .createHmac('sha256', secret) - .update(val) - .digest('base64') - .replace(/\=+$/, ''); -}; - -/** - * Unsign and decode the given `val` with `secret`, - * returning `false` if the signature is invalid. - * - * @param {String} val - * @param {String} secret - * @return {String|Boolean} - * @api private - */ - -exports.unsign = function(val, secret){ - if ('string' != typeof val) throw new TypeError('cookie required'); - if ('string' != typeof secret) throw new TypeError('secret required'); - var str = val.slice(0, val.lastIndexOf('.')) - , mac = exports.sign(str, secret); - - return sha1(mac) == sha1(val) ? str : false; -}; - -/** - * Private - */ - -function sha1(str){ - return crypto.createHash('sha1').update(str).digest('hex'); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/package.json deleted file mode 100644 index c15a32d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie-signature/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "cookie-signature", - "version": "1.0.4", - "description": "Sign and unsign cookies", - "keywords": [ - "cookie", - "sign", - "unsign" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@learnboost.com" - }, - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-cookie-signature.git" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "main": "index", - "bugs": { - "url": "https://github.com/visionmedia/node-cookie-signature/issues" - }, - "homepage": "https://github.com/visionmedia/node-cookie-signature", - "_id": "cookie-signature@1.0.4", - "dist": { - "shasum": "0edd22286e3a111b9a2a70db363e925e867f6aca", - "tarball": "http://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.4.tgz" - }, - "_from": "cookie-signature@1.0.4", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "natevw", - "email": "natevw@yahoo.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "natevw", - "email": "natevw@yahoo.com" - } - ], - "directories": {}, - "_shasum": "0edd22286e3a111b9a2a70db363e925e867f6aca", - "_resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/.npmignore deleted file mode 100644 index efab07f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -test -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/LICENSE deleted file mode 100644 index 249d9de..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -// MIT License - -Copyright (C) Roman Shtylman - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/README.md deleted file mode 100644 index 3170b4b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# cookie [![Build Status](https://secure.travis-ci.org/defunctzombie/node-cookie.png?branch=master)](http://travis-ci.org/defunctzombie/node-cookie) # - -cookie is a basic cookie parser and serializer. It doesn't make assumptions about how you are going to deal with your cookies. It basically just provides a way to read and write the HTTP cookie headers. - -See [RFC6265](http://tools.ietf.org/html/rfc6265) for details about the http header for cookies. - -## how? - -``` -npm install cookie -``` - -```javascript -var cookie = require('cookie'); - -var hdr = cookie.serialize('foo', 'bar'); -// hdr = 'foo=bar'; - -var cookies = cookie.parse('foo=bar; cat=meow; dog=ruff'); -// cookies = { foo: 'bar', cat: 'meow', dog: 'ruff' }; -``` - -## more - -The serialize function takes a third parameter, an object, to set cookie options. See the RFC for valid values. - -### path -> cookie path - -### expires -> absolute expiration date for the cookie (Date object) - -### maxAge -> relative max age of the cookie from when the client receives it (seconds) - -### domain -> domain for the cookie - -### secure -> true or false - -### httpOnly -> true or false - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/index.js deleted file mode 100644 index 00d54a7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/index.js +++ /dev/null @@ -1,75 +0,0 @@ - -/// Serialize the a name value pair into a cookie string suitable for -/// http headers. An optional options object specified cookie parameters -/// -/// serialize('foo', 'bar', { httpOnly: true }) -/// => "foo=bar; httpOnly" -/// -/// @param {String} name -/// @param {String} val -/// @param {Object} options -/// @return {String} -var serialize = function(name, val, opt){ - opt = opt || {}; - var enc = opt.encode || encode; - var pairs = [name + '=' + enc(val)]; - - if (null != opt.maxAge) { - var maxAge = opt.maxAge - 0; - if (isNaN(maxAge)) throw new Error('maxAge should be a Number'); - pairs.push('Max-Age=' + maxAge); - } - - if (opt.domain) pairs.push('Domain=' + opt.domain); - if (opt.path) pairs.push('Path=' + opt.path); - if (opt.expires) pairs.push('Expires=' + opt.expires.toUTCString()); - if (opt.httpOnly) pairs.push('HttpOnly'); - if (opt.secure) pairs.push('Secure'); - - return pairs.join('; '); -}; - -/// Parse the given cookie header string into an object -/// The object has the various cookies as keys(names) => values -/// @param {String} str -/// @return {Object} -var parse = function(str, opt) { - opt = opt || {}; - var obj = {} - var pairs = str.split(/; */); - var dec = opt.decode || decode; - - pairs.forEach(function(pair) { - var eq_idx = pair.indexOf('=') - - // skip things that don't look like key=value - if (eq_idx < 0) { - return; - } - - var key = pair.substr(0, eq_idx).trim() - var val = pair.substr(++eq_idx, pair.length).trim(); - - // quoted values - if ('"' == val[0]) { - val = val.slice(1, -1); - } - - // only assign once - if (undefined == obj[key]) { - try { - obj[key] = dec(val); - } catch (e) { - obj[key] = val; - } - } - }); - - return obj; -}; - -var encode = encodeURIComponent; -var decode = decodeURIComponent; - -module.exports.serialize = serialize; -module.exports.parse = parse; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/package.json deleted file mode 100644 index 7dbb395..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/cookie/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "author": { - "name": "Roman Shtylman", - "email": "shtylman@gmail.com" - }, - "name": "cookie", - "description": "cookie parsing and serialization", - "version": "0.1.2", - "repository": { - "type": "git", - "url": "git://github.com/shtylman/node-cookie.git" - }, - "keywords": [ - "cookie", - "cookies" - ], - "main": "index.js", - "scripts": { - "test": "mocha" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "1.x.x" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "bugs": { - "url": "https://github.com/shtylman/node-cookie/issues" - }, - "homepage": "https://github.com/shtylman/node-cookie", - "_id": "cookie@0.1.2", - "dist": { - "shasum": "72fec3d24e48a3432073d90c12642005061004b1", - "tarball": "http://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz" - }, - "_from": "cookie@0.1.2", - "_npmVersion": "1.4.6", - "_npmUser": { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - "maintainers": [ - { - "name": "shtylman", - "email": "shtylman@gmail.com" - } - ], - "directories": {}, - "_shasum": "72fec3d24e48a3432073d90c12642005061004b1", - "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.jshintrc b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.jshintrc deleted file mode 100644 index 299877f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.jshintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "laxbreak": true -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.npmignore deleted file mode 100644 index 7e6163d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -support -test -examples -example -*.sock -dist diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/History.md deleted file mode 100644 index 3b96560..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/History.md +++ /dev/null @@ -1,144 +0,0 @@ - -1.0.4 / 2014-07-15 -================== - - * dist: recompile - * example: remove `console.info()` log usage - * example: add "Content-Type" UTF-8 header to browser example - * browser: place %c marker after the space character - * browser: reset the "content" color via `color: inherit` - * browser: add colors support for Firefox >= v31 - * debug: prefer an instance `log()` function over the global one (#119) - * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) - -1.0.3 / 2014-07-09 -================== - - * Add support for multiple wildcards in namespaces (#122, @seegno) - * browser: fix lint - -1.0.2 / 2014-06-10 -================== - - * browser: update color palette (#113, @gscottolson) - * common: make console logging function configurable (#108, @timoxley) - * node: fix %o colors on old node <= 0.8.x - * Makefile: find node path using shell/which (#109, @timoxley) - -1.0.1 / 2014-06-06 -================== - - * browser: use `removeItem()` to clear localStorage - * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) - * package: add "contributors" section - * node: fix comment typo - * README: list authors - -1.0.0 / 2014-06-04 -================== - - * make ms diff be global, not be scope - * debug: ignore empty strings in enable() - * node: make DEBUG_COLORS able to disable coloring - * *: export the `colors` array - * npmignore: don't publish the `dist` dir - * Makefile: refactor to use browserify - * package: add "browserify" as a dev dependency - * Readme: add Web Inspector Colors section - * node: reset terminal color for the debug content - * node: map "%o" to `util.inspect()` - * browser: map "%j" to `JSON.stringify()` - * debug: add custom "formatters" - * debug: use "ms" module for humanizing the diff - * Readme: add "bash" syntax highlighting - * browser: add Firebug color support - * browser: add colors for WebKit browsers - * node: apply log to `console` - * rewrite: abstract common logic for Node & browsers - * add .jshintrc file - -0.8.1 / 2014-04-14 -================== - - * package: re-add the "component" section - -0.8.0 / 2014-03-30 -================== - - * add `enable()` method for nodejs. Closes #27 - * change from stderr to stdout - * remove unnecessary index.js file - -0.7.4 / 2013-11-13 -================== - - * remove "browserify" key from package.json (fixes something in browserify) - -0.7.3 / 2013-10-30 -================== - - * fix: catch localStorage security error when cookies are blocked (Chrome) - * add debug(err) support. Closes #46 - * add .browser prop to package.json. Closes #42 - -0.7.2 / 2013-02-06 -================== - - * fix package.json - * fix: Mobile Safari (private mode) is broken with debug - * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript - -0.7.1 / 2013-02-05 -================== - - * add repository URL to package.json - * add DEBUG_COLORED to force colored output - * add browserify support - * fix component. Closes #24 - -0.7.0 / 2012-05-04 -================== - - * Added .component to package.json - * Added debug.component.js build - -0.6.0 / 2012-03-16 -================== - - * Added support for "-" prefix in DEBUG [Vinay Pulim] - * Added `.enabled` flag to the node version [TooTallNate] - -0.5.0 / 2012-02-02 -================== - - * Added: humanize diffs. Closes #8 - * Added `debug.disable()` to the CS variant - * Removed padding. Closes #10 - * Fixed: persist client-side variant again. Closes #9 - -0.4.0 / 2012-02-01 -================== - - * Added browser variant support for older browsers [TooTallNate] - * Added `debug.enable('project:*')` to browser variant [TooTallNate] - * Added padding to diff (moved it to the right) - -0.3.0 / 2012-01-26 -================== - - * Added millisecond diff when isatty, otherwise UTC string - -0.2.0 / 2012-01-22 -================== - - * Added wildcard support - -0.1.0 / 2011-12-02 -================== - - * Added: remove colors unless stderr isatty [TooTallNate] - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Makefile deleted file mode 100644 index b0bde6e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Makefile +++ /dev/null @@ -1,33 +0,0 @@ - -# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 -THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) -THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) - -# BIN directory -BIN := $(THIS_DIR)/node_modules/.bin - -# applications -NODE ?= $(shell which node) -NPM ?= $(NODE) $(shell which npm) -BROWSERIFY ?= $(NODE) $(BIN)/browserify - -all: dist/debug.js - -install: node_modules - -clean: - @rm -rf node_modules dist - -dist: - @mkdir -p $@ - -dist/debug.js: node_modules browser.js debug.js dist - @$(BROWSERIFY) \ - --standalone debug \ - . > $@ - -node_modules: package.json - @NODE_ENV= $(NPM) install - @touch node_modules - -.PHONY: all install clean diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Readme.md deleted file mode 100644 index e59b9ad..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/Readme.md +++ /dev/null @@ -1,156 +0,0 @@ -# debug - - tiny node.js debugging utility modelled after node core's debugging technique. - -## Installation - -```bash -$ npm install debug -``` - -## Usage - - With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility. - -Example _app.js_: - -```js -var debug = require('debug')('http') - , http = require('http') - , name = 'My App'; - -// fake app - -debug('booting %s', name); - -http.createServer(function(req, res){ - debug(req.method + ' ' + req.url); - res.end('hello\n'); -}).listen(3000, function(){ - debug('listening'); -}); - -// fake worker of some kind - -require('./worker'); -``` - -Example _worker.js_: - -```js -var debug = require('debug')('worker'); - -setInterval(function(){ - debug('doing some work'); -}, 1000); -``` - - The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: - - ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) - - ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) - -## Millisecond diff - - When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. - - ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) - - When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: - - ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) - -## Conventions - - If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". - -## Wildcards - - The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect.compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. - - You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:". - -## Browser support - - Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. - -```js -a = debug('worker:a'); -b = debug('worker:b'); - -setInterval(function(){ - a('doing some work'); -}, 1000); - -setInterval(function(){ - b('doing some work'); -}, 1200); -``` - -#### Web Inspector Colors - - Colors are also enabled on "Web Inspectors" that understand the `%c` formatting - option. These are WebKit web inspectors, Firefox ([since version - 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) - and the Firebug plugin for Firefox (any version). - - Colored output looks something like: - - ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) - -### stderr vs stdout - -You can set an alternative logging method per-namespace by overriding the `log` method on a per-namespace or globally: - -Example _stderr.js_: - -```js -var debug = require('../'); -var log = debug('app:log'); - -// by default console.log is used -log('goes to stdout!'); - -var error = debug('app:error'); -// set this namespace to log via console.error -error.log = console.error.bind(console); // don't forget to bind to console! -error('goes to stderr'); -log('still goes to stdout!'); - -// set all output to go via console.warn -// overrides all per-namespace log settings -debug.log = console.warn.bind(console); -log('now goes to stderr via console.warn'); -error('still goes to stderr, but via console.warn now'); -``` - -## Authors - - - TJ Holowaychuk - - Nathan Rajlich - -## License - -(The MIT License) - -Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/browser.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/browser.js deleted file mode 100644 index ce6369f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/browser.js +++ /dev/null @@ -1,147 +0,0 @@ - -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // is webkit? http://stackoverflow.com/a/16459606/376773 - return ('WebkitAppearance' in document.documentElement.style) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (window.console && (console.firebug || (console.exception && console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - return JSON.stringify(v); -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs() { - var args = arguments; - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return args; - - var c = 'color: ' + this.color; - args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1)); - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); - return args; -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // This hackery is required for IE8, - // where the `console.log` function doesn't have 'apply' - return 'object' == typeof console - && 'function' == typeof console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - localStorage.removeItem('debug'); - } else { - localStorage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - var r; - try { - r = localStorage.debug; - } catch(e) {} - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/component.json deleted file mode 100644 index ab5f3ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/component.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "debug", - "repo": "visionmedia/debug", - "description": "small debugging utility", - "version": "1.0.4", - "keywords": [ - "debug", - "log", - "debugger" - ], - "main": "browser.js", - "scripts": [ - "browser.js", - "debug.js" - ], - "dependencies": { - "guille/ms.js": "0.6.1" - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/debug.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/debug.js deleted file mode 100644 index 7571a86..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/debug.js +++ /dev/null @@ -1,197 +0,0 @@ - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = debug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = require('ms'); - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lowercased letter, i.e. "n". - */ - -exports.formatters = {}; - -/** - * Previously assigned color. - */ - -var prevColor = 0; - -/** - * Previous log timestamp. - */ - -var prevTime; - -/** - * Select a color. - * - * @return {Number} - * @api private - */ - -function selectColor() { - return exports.colors[prevColor++ % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function debug(namespace) { - - // define the `disabled` version - function disabled() { - } - disabled.enabled = false; - - // define the `enabled` version - function enabled() { - - var self = enabled; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // add the `color` if not set - if (null == self.useColors) self.useColors = exports.useColors(); - if (null == self.color && self.useColors) self.color = selectColor(); - - var args = Array.prototype.slice.call(arguments); - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %o - args = ['%o'].concat(args); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - if ('function' === typeof exports.formatArgs) { - args = exports.formatArgs.apply(self, args); - } - var logFn = enabled.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - enabled.enabled = true; - - var fn = exports.enabled(namespace) ? enabled : disabled; - - fn.namespace = namespace; - - return fn; -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - var split = (namespaces || '').split(/[\s,]+/); - var len = split.length; - - for (var i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node.js deleted file mode 100644 index c94f7d1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node.js +++ /dev/null @@ -1,129 +0,0 @@ - -/** - * Module dependencies. - */ - -var tty = require('tty'); -var util = require('util'); - -/** - * This is the Node.js implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - var debugColors = (process.env.DEBUG_COLORS || '').trim().toLowerCase(); - if (0 === debugColors.length) { - return tty.isatty(1); - } else { - return '0' !== debugColors - && 'no' !== debugColors - && 'false' !== debugColors - && 'disabled' !== debugColors; - } -} - -/** - * Map %o to `util.inspect()`, since Node doesn't do that out of the box. - */ - -var inspect = (4 === util.inspect.length ? - // node <= 0.8.x - function (v, colors) { - return util.inspect(v, void 0, void 0, colors); - } : - // node > 0.8.x - function (v, colors) { - return util.inspect(v, { colors: colors }); - } -); - -exports.formatters.o = function(v) { - return inspect(v, this.useColors) - .replace(/\s*\n\s*/g, ' '); -}; - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs() { - var args = arguments; - var useColors = this.useColors; - var name = this.namespace; - - if (useColors) { - var c = this.color; - - args[0] = ' \u001b[9' + c + 'm' + name + ' ' - + '\u001b[0m' - + args[0] + '\u001b[3' + c + 'm' - + ' +' + exports.humanize(this.diff) + '\u001b[0m'; - } else { - args[0] = new Date().toUTCString() - + ' ' + name + ' ' + args[0]; - } - return args; -} - -/** - * Invokes `console.log()` with the specified arguments. - */ - -function log() { - return console.log.apply(console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ - -exports.enable(load()); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/README.md deleted file mode 100644 index d4ab12a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours', { long: true })) // "10 hours" -``` - -- Node/Browser compatible. Published as `ms` in NPM. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/index.js deleted file mode 100644 index c5847f8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/package.json deleted file mode 100644 index c4dd654..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/node_modules/ms/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "ms", - "version": "0.6.2", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "readme": "# ms.js: miliseconds conversion utility\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('100') // 100\n```\n\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(ms('10 hours', { long: true })) // \"10 hours\"\n```\n\n- Node/Browser compatible. Published as `ms` in NPM.\n- If a number is supplied to `ms`, a string with a unit is returned.\n- If a string that contains the number is supplied, it returns it as\na number (e.g: it returns `100` for `'100'`).\n- If you pass a string with a number and a valid unit, the number of\nequivalent ms is returned.\n\n## License\n\nMIT", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "_id": "ms@0.6.2", - "dist": { - "shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - }, - "_from": "ms@0.6.2", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "directories": {}, - "_shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "homepage": "https://github.com/guille/ms.js" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/package.json deleted file mode 100644 index 823c26d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/debug/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "debug", - "version": "1.0.4", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/debug.git" - }, - "description": "small debugging utility", - "keywords": [ - "debug", - "log", - "debugger" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Nathan Rajlich", - "email": "nathan@tootallnate.net", - "url": "http://n8.io" - } - ], - "dependencies": { - "ms": "0.6.2" - }, - "devDependencies": { - "browserify": "4.1.6", - "mocha": "*" - }, - "main": "./node.js", - "browser": "./browser.js", - "component": { - "scripts": { - "debug/index.js": "browser.js", - "debug/debug.js": "debug.js" - } - }, - "gitHead": "abc10a5912f79d251752d18350e269fe0b0fbbf9", - "bugs": { - "url": "https://github.com/visionmedia/debug/issues" - }, - "homepage": "https://github.com/visionmedia/debug", - "_id": "debug@1.0.4", - "scripts": {}, - "_shasum": "5b9c256bd54b6ec02283176fa8a0ede6d154cbf8", - "_from": "debug@1.0.4", - "_npmVersion": "1.4.14", - "_npmUser": { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - } - ], - "dist": { - "shasum": "5b9c256bd54b6ec02283176fa8a0ede6d154cbf8", - "tarball": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/.npmignore deleted file mode 100644 index 0c7e391..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -coverage/ -files/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/History.md deleted file mode 100644 index ba1af12..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/History.md +++ /dev/null @@ -1,56 +0,0 @@ -0.4.4 / 2014-07-27 -================== - - * Work-around v8 generating empty stack traces - -0.4.3 / 2014-07-26 -================== - - * Fix exception when global `Error.stackTraceLimit` is too low - -0.4.2 / 2014-07-19 -================== - - * Correct call site for wrapped functions and properties - -0.4.1 / 2014-07-19 -================== - - * Improve automatic message generation for function properties - -0.4.0 / 2014-07-19 -================== - - * Add `TRACE_DEPRECATION` environment variable - * Remove non-standard grey color from color output - * Support `--no-deprecation` argument - * Support `--trace-deprecation` argument - * Support `deprecate.property(fn, prop, message)` - -0.3.0 / 2014-06-16 -================== - - * Add `NO_DEPRECATION` environment variable - -0.2.0 / 2014-06-15 -================== - - * Add `deprecate.property(obj, prop, message)` - * Remove `supports-color` dependency for node.js 0.8 - -0.1.0 / 2014-06-15 -================== - - * Add `deprecate.function(fn, message)` - * Add `process.on('deprecation', fn)` emitter - * Automatically generate message when omitted from `deprecate()` - -0.0.1 / 2014-06-15 -================== - - * Fix warning for dynamic calls at singe call site - -0.0.0 / 2014-06-15 -================== - - * Initial implementation diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/Readme.md deleted file mode 100644 index 47a53a1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/Readme.md +++ /dev/null @@ -1,272 +0,0 @@ -# depd - -[![NPM version](https://badge.fury.io/js/depd.svg)](http://badge.fury.io/js/depd) -[![Build Status](https://travis-ci.org/dougwilson/nodejs-depd.svg?branch=master)](https://travis-ci.org/dougwilson/nodejs-depd) -[![Coverage Status](https://img.shields.io/coveralls/dougwilson/nodejs-depd.svg?branch=master)](https://coveralls.io/r/dougwilson/nodejs-depd) -[![Gittip](http://img.shields.io/gittip/dougwilson.svg)](https://www.gittip.com/dougwilson/) - -Deprecate all the things - -> With great modules comes great responsibility; mark things deprecated! - -## Install - -```sh -$ npm install depd -``` - -## API - -```js -var deprecate = require('depd')('my-module') -``` - -This library allows you to display deprecation messages to your users. -This library goes above and beyond with deprecation warnings by -introspecting the call stack (but only the bits that it is interested -in). - -Instead of just warning on the first invocation of a deprecated -function and never again, this module will warn on the first invocation -of a deprecated function per unique call site, making it ideal to alert -users of all deprecated uses across the code base, rather than just -whatever happens to execute first. - -The deprecation warnings from this module also include the file and line -information for the call into the module that the deprecated function was -in. - -### depd(namespace) - -Create a new deprecate function that uses the given namespace name in the -messages and will display the call site prior to the stack entering the -file this function was called from. It is highly suggested you use the -name of your module as the namespace. - -### deprecate(message) - -Call this function from deprecated code to display a deprecation message. -This message will appear once per unique caller site. Caller site is the -first call site in the stack in a different file from the caller of this -function. - -If the message is omitted, a message is generated for you based on the site -of the `deprecate()` call and will display the name of the function called, -similar to the name displayed in a stack trace. - -### deprecate.function(fn, message) - -Call this function to wrap a given function in a deprecation message on any -call to the function. An optional message can be supplied to provide a custom -message. - -### deprecate.property(obj, prop, message) - -Call this function to wrap a given property on object in a deprecation message -on any accessing or setting of the property. An optional message can be supplied -to provide a custom message. - -The method must be called on the object where the property belongs (not -inherited from the prototype). - -If the property is a data descriptor, it will be converted to an accessor -descriptor in order to display the deprecation message. - -### process.on('deprecation', fn) - -This module will allow easy capturing of deprecation errors by emitting the -errors as the type "deprecation" on the global `process`. If there are no -listeners for this type, the errors are written to STDERR as normal, but if -there are any listeners, nothing will be written to STDERR and instead only -emitted. From there, you can write the errors in a different format or to a -logging source. - -The error represents the deprecation and is emitted only once with the same -rules as writing to STDERR. The error has the following properties: - - - `message` - This is the message given by the library - - `name` - This is always `'DeprecationError'` - - `namespace` - This is the namespace the deprecation came from - - `stack` - This is the stack of the call to the deprecated thing - -Example `error.stack` output: - -``` -DeprecationError: my-cool-module deprecated oldfunction - at Object. ([eval]-wrapper:6:22) - at Module._compile (module.js:456:26) - at evalScript (node.js:532:25) - at startup (node.js:80:7) - at node.js:902:3 -``` - -### process.env.NO_DEPRECATION - -As a user of modules that are deprecated, the environment variable `NO_DEPRECATION` -is provided as a quick solution to silencing deprecation warnings from being -output. The format of this is similar to that of `DEBUG`: - -```sh -$ NO_DEPRECATION=my-module,othermod node app.js -``` - -This will suppress deprecations from being output for "my-module" and "othermod". -The value is a list of comma-separated namespaces. To suppress every warning -across all namespaces, use the value `*` for a namespace. - -Providing the argument `--no-deprecation` to the `node` executable will suppress -all deprecations. - -**NOTE** This will not suppress the deperecations given to any "deprecation" -event listeners, just the output to STDERR. - -### process.env.TRACE_DEPRECATION - -As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION` -is provided as a solution to getting more detailed location information in deprecation -warnings by including the entire stack trace. The format of this is the same as -`NO_DEPRECATION`: - -```sh -$ TRACE_DEPRECATION=my-module,othermod node app.js -``` - -This will include stack traces for deprecations being output for "my-module" and -"othermod". The value is a list of comma-separated namespaces. To trace every -warning across all namespaces, use the value `*` for a namespace. - -Providing the argument `--trace-deprecation` to the `node` executable will trace -all deprecations. - -**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`. - -## Display - -![message](files/message.png) - -When a user calls a function in your library that you mark deprecated, they -will see the following written to STDERR (in the given colors, similar colors -and layout to the `debug` module): - -``` -bright cyan bright yellow -| | reset cyan -| | | | -▼ ▼ ▼ ▼ -my-cool-module deprecated oldfunction [eval]-wrapper:6:22 -▲ ▲ ▲ ▲ -| | | | -namespace | | location of mycoolmod.oldfunction() call - | deprecation message - the word "deprecated" -``` - -If the user redirects their STDERR to a file or somewhere that does not support -colors, they see (similar layout to the `debug` module): - -``` -Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22 -▲ ▲ ▲ ▲ ▲ -| | | | | -timestamp of message namespace | | location of mycoolmod.oldfunction() call - | deprecation message - the word "deprecated" -``` - -## Examples - -### Deprecating all calls to a function - -This will display a deprecated message about "oldfunction" being deprecated -from "my-module" on STDERR. - -```js -var deprecate = require('depd')('my-cool-module') - -// message automatically derived from function name -// Object.oldfunction -exports.oldfunction = deprecate.function(function oldfunction() { - // all calls to function are deprecated -}) - -// specific message -exports.oldfunction = deprecate.function(function () { - // all calls to function are deprecated -}, 'oldfunction') -``` - -### Conditionally deprecating a function call - -This will display a deprecated message about "weirdfunction" being deprecated -from "my-module" on STDERR when called with less than 2 arguments. - -```js -var deprecate = require('depd')('my-cool-module') - -exports.weirdfunction = function () { - if (arguments.length < 2) { - // calls with 0 or 1 args are deprecated - deprecate('weirdfunction args < 2') - } -} -``` - -When calling `deprecate` as a function, the warning is counted per call site -within your own module, so you can display different deprecations depending -on different situations and the users will still get all the warnings: - -```js -var deprecate = require('depd')('my-cool-module') - -exports.weirdfunction = function () { - if (arguments.length < 2) { - // calls with 0 or 1 args are deprecated - deprecate('weirdfunction args < 2') - } else if (typeof arguments[0] !== 'string') { - // calls with non-string first argument are deprecated - deprecate('weirdfunction non-string first arg') - } -} -``` - -### Deprecating property access - -This will display a deprecated message about "oldprop" being deprecated -from "my-module" on STDERR when accessed. A deprecation will be displayed -when setting the value and when getting the value. - -```js -var deprecate = require('depd')('my-cool-module') - -exports.oldprop = 'something' - -// message automatically derives from property name -deprecate.property(exports, 'oldprop') - -// explicit message -deprecate.property(exports, 'oldprop', 'oldprop >= 0.10') -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/index.js deleted file mode 100644 index a6fb372..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/index.js +++ /dev/null @@ -1,520 +0,0 @@ -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter -var relative = require('path').relative - -/** - * Module exports. - */ - -module.exports = depd - -/** - * Get the path to base files on. - */ - -var basePath = process.cwd() - -/** - * Get listener count on event emitter. - */ - -/*istanbul ignore next*/ -var eventListenerCount = EventEmitter.listenerCount - || function (emitter, type) { return emitter.listeners(type).length } - -/** - * Determine if namespace is contained in the string. - */ - -function containsNamespace(str, namespace) { - var val = str.split(/[ ,]+/) - - namespace = String(namespace).toLowerCase() - - for (var i = 0 ; i < val.length; i++) { - if (!(str = val[i])) continue; - - // namespace contained - if (str === '*' || str.toLowerCase() === namespace) { - return true - } - } - - return false -} - -/** - * Convert a data descriptor to accessor descriptor. - */ - -function convertDataDescriptorToAccessor(obj, prop, message) { - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - var value = descriptor.value - - descriptor.get = function getter() { return value } - - if (descriptor.writable) { - descriptor.set = function setter(val) { return value = val } - } - - delete descriptor.value - delete descriptor.writable - - Object.defineProperty(obj, prop, descriptor) - - return descriptor -} - -/** - * Create arguments string to keep arity. - */ - -function createArgumentsString(arity) { - var str = '' - - for (var i = 0; i < arity; i++) { - str += ', arg' + i - } - - return str.substr(2) -} - -/** - * Create stack string from stack. - */ - -function createStackString(stack) { - var str = this.name + ': ' + this.namespace - - if (this.message) { - str += ' deprecated ' + this.message - } - - for (var i = 0; i < stack.length; i++) { - str += '\n at ' + stack[i].toString() - } - - return str -} - -/** - * Create deprecate for namespace in caller. - */ - -function depd(namespace) { - if (!namespace) { - throw new TypeError('argument namespace is required') - } - - var stack = getStack() - var site = callSiteLocation(stack[1]) - var file = site[0] - - function deprecate(message) { - // call to self as log - log.call(deprecate, message) - } - - deprecate._file = file - deprecate._ignored = isignored(namespace) - deprecate._namespace = namespace - deprecate._traced = istraced(namespace) - deprecate._warned = Object.create(null) - - deprecate.function = wrapfunction - deprecate.property = wrapproperty - - return deprecate -} - -/** - * Determine if namespace is ignored. - */ - -function isignored(namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.noDeprecation) { - // --no-deprecation support - return true - } - - var str = process.env.NO_DEPRECATION || '' - - // namespace ignored - return containsNamespace(str, namespace) -} - -/** - * Determine if namespace is traced. - */ - -function istraced(namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.traceDeprecation) { - // --trace-deprecation support - return true - } - - var str = process.env.TRACE_DEPRECATION || '' - - // namespace traced - return containsNamespace(str, namespace) -} - -/** - * Display deprecation message. - */ - -function log(message, site) { - var haslisteners = eventListenerCount(process, 'deprecation') !== 0 - - // abort early if no destination - if (!haslisteners && this._ignored) { - return - } - - var caller - var callFile - var callSite - var i = 0 - var seen = false - var stack = getStack() - var file = this._file - - if (site) { - // provided site - callSite = callSiteLocation(stack[1]) - callSite.name = site.name - file = callSite[0] - } else { - // get call site - i = 2 - site = callSiteLocation(stack[i]) - callSite = site - } - - // get caller of deprecated thing in relation to file - for (; i < stack.length; i++) { - caller = callSiteLocation(stack[i]) - callFile = caller[0] - - if (callFile === file) { - seen = true - } else if (callFile === this._file) { - file = this._file - } else if (seen) { - break - } - } - - var key = caller - ? site.join(':') + '__' + caller.join(':') - : undefined - - if (key !== undefined && key in this._warned) { - // already warned - return - } - - this._warned[key] = true - - // generate automatic message from call site - if (!message) { - message = callSite === site || !callSite.name - ? defaultMessage(site) - : defaultMessage(callSite) - } - - // emit deprecation if listeners exist - if (haslisteners) { - var err = DeprecationError(this._namespace, message, stack.slice(i)) - process.emit('deprecation', err) - return - } - - // format and write message - var format = process.stderr.isTTY - ? formatColor - : formatPlain - var msg = format.call(this, message, caller, stack.slice(i)) - process.stderr.write(msg + '\n', 'utf8') - - return -} - -/** - * Get call site location as array. - */ - -function callSiteLocation(callSite) { - var file = callSite.getFileName() || '' - var line = callSite.getLineNumber() - var colm = callSite.getColumnNumber() - - if (callSite.isEval()) { - file = callSite.getEvalOrigin() + ', ' + file - } - - var site = [file, line, colm] - - site.callSite = callSite - site.name = callSite.getFunctionName() - - return site -} - -/** - * Generate a default message from the site. - */ - -function defaultMessage(site) { - var callSite = site.callSite - var funcName = site.name - var typeName = callSite.getTypeName() - - // make useful anonymous name - if (!funcName) { - funcName = '' - } - - // make useful type name - if (typeName === 'Function') { - typeName = callSite.getThis().name || typeName - } - - return callSite.getMethodName() - ? typeName + '.' + funcName - : funcName -} - -/** - * Format deprecation message without color. - */ - -function formatPlain(msg, caller, stack) { - var timestamp = new Date().toUTCString() - - var formatted = timestamp - + ' ' + this._namespace - + ' deprecated ' + msg - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n at ' + stack[i].toString() - } - - return formatted - } - - if (caller) { - formatted += ' at ' + formatLocation(caller) - } - - return formatted -} - -/** - * Format deprecation message with color. - */ - -function formatColor(msg, caller, stack) { - var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' // bold cyan - + ' \x1b[33;1mdeprecated\x1b[22;39m' // bold yellow - + ' \x1b[0m' + msg + '\x1b[39m' // reset - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n \x1b[36mat ' + stack[i].toString() + '\x1b[39m' // cyan - } - - return formatted - } - - if (caller) { - formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan - } - - return formatted -} - -/** - * Format call site location. - */ - -function formatLocation(callSite) { - return relative(basePath, callSite[0]) - + ':' + callSite[1] - + ':' + callSite[2] -} - -/** - * Get the stack as array of call sites. - */ - -function getStack() { - var limit = Error.stackTraceLimit - var obj = {} - var prep = Error.prepareStackTrace - - Error.prepareStackTrace = prepareObjectStackTrace - Error.stackTraceLimit = Math.max(10, limit) - - // capture the stack - Error.captureStackTrace(obj) - - // slice this function off the top - var stack = obj.stack.slice(1) - - Error.prepareStackTrace = prep - Error.stackTraceLimit = limit - - return stack -} - -/** - * Capture call site stack from v8. - */ - -function prepareObjectStackTrace(obj, stack) { - return stack -} - -/** - * Return a wrapped function in a deprecation message. - */ - -function wrapfunction(fn, message) { - if (typeof fn !== 'function') { - throw new TypeError('argument fn must be a function') - } - - var args = createArgumentsString(fn.length) - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - site.name = fn.name - - var deprecatedfn = eval('(function (' + args + ') {\n' - + 'log.call(deprecate, message, site)\n' - + 'return fn.apply(this, arguments)\n' - + '})') - - return deprecatedfn -} - -/** - * Wrap property in a deprecation message. - */ - -function wrapproperty(obj, prop, message) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - throw new TypeError('argument obj must be object') - } - - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - - if (!descriptor) { - throw new TypeError('must call property on owner object') - } - - if (!descriptor.configurable) { - throw new TypeError('property must be configurable') - } - - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - // set site name - site.name = prop - - // convert data descriptor - if ('value' in descriptor) { - descriptor = convertDataDescriptorToAccessor(obj, prop, message) - } - - var get = descriptor.get - var set = descriptor.set - - // wrap getter - if (typeof get === 'function') { - descriptor.get = function getter() { - log.call(deprecate, message, site) - return get.apply(this, arguments) - } - } - - // wrap setter - if (typeof set === 'function') { - descriptor.set = function setter() { - log.call(deprecate, message, site) - return set.apply(this, arguments) - } - } - - Object.defineProperty(obj, prop, descriptor) -} - -/** - * Create DeprecationError for deprecation - */ - -function DeprecationError(namespace, message, stack) { - var error = new Error() - var stackString - - Object.defineProperty(error, 'constructor', { - value: DeprecationError - }) - - Object.defineProperty(error, 'message', { - configurable: true, - enumerable: false, - value: message, - writable: true - }) - - Object.defineProperty(error, 'name', { - enumerable: false, - configurable: true, - value: 'DeprecationError', - writable: true - }) - - Object.defineProperty(error, 'namespace', { - configurable: true, - enumerable: false, - value: namespace, - writable: true - }) - - Object.defineProperty(error, 'stack', { - configurable: true, - enumerable: false, - get: function () { - if (stackString !== undefined) { - return stackString - } - - // prepare stack trace - return stackString = createStackString.call(this, stack) - }, - set: function setter(val) { - stackString = val - } - }) - - return error -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/package.json deleted file mode 100644 index 6935dc5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/depd/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "depd", - "description": "Deprecate all the things", - "version": "0.4.4", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "deprecate", - "deprecated" - ], - "repository": { - "type": "git", - "url": "git://github.com/dougwilson/nodejs-depd" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.20.1", - "should": "~4.0.4" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec --bail --require should test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --require should test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --require should test/" - }, - "bugs": { - "url": "https://github.com/dougwilson/nodejs-depd/issues" - }, - "homepage": "https://github.com/dougwilson/nodejs-depd", - "_id": "depd@0.4.4", - "dist": { - "shasum": "07091fae75f97828d89b4a02a2d4778f0e7c0662", - "tarball": "http://registry.npmjs.org/depd/-/depd-0.4.4.tgz" - }, - "_from": "depd@0.4.4", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "07091fae75f97828d89b4a02a2d4778f0e7c0662", - "_resolved": "https://registry.npmjs.org/depd/-/depd-0.4.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/.npmignore deleted file mode 100644 index 48a2e24..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -components -build diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Makefile deleted file mode 100644 index 3f6119d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Makefile +++ /dev/null @@ -1,11 +0,0 @@ - -build: components index.js - @component build - -components: - @Component install - -clean: - rm -fr build components template.js - -.PHONY: clean diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Readme.md deleted file mode 100644 index 2cfcc99..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/Readme.md +++ /dev/null @@ -1,15 +0,0 @@ - -# escape-html - - Escape HTML entities - -## Example - -```js -var escape = require('escape-html'); -escape(str); -``` - -## License - - MIT \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/component.json deleted file mode 100644 index cb9740f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/component.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "escape-html", - "description": "Escape HTML entities", - "version": "1.0.1", - "keywords": ["escape", "html", "utility"], - "dependencies": {}, - "scripts": [ - "index.js" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/index.js deleted file mode 100644 index 2765211..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/index.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Escape special characters in the given string of html. - * - * @param {String} html - * @return {String} - * @api private - */ - -module.exports = function(html) { - return String(html) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(//g, '>'); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/package.json deleted file mode 100644 index ee240f0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/escape-html/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "escape-html", - "description": "Escape HTML entities", - "version": "1.0.1", - "keywords": [ - "escape", - "html", - "utility" - ], - "dependencies": {}, - "main": "index.js", - "component": { - "scripts": { - "escape-html/index.js": "index.js" - } - }, - "repository": { - "type": "git", - "url": "https://github.com/component/escape-html.git" - }, - "readme": "\n# escape-html\n\n Escape HTML entities\n\n## Example\n\n```js\nvar escape = require('escape-html');\nescape(str);\n```\n\n## License\n\n MIT", - "readmeFilename": "Readme.md", - "bugs": { - "url": "https://github.com/component/escape-html/issues" - }, - "homepage": "https://github.com/component/escape-html", - "_id": "escape-html@1.0.1", - "dist": { - "shasum": "181a286ead397a39a92857cfb1d43052e356bff0", - "tarball": "http://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz" - }, - "_from": "escape-html@1.0.1", - "_npmVersion": "1.3.15", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "181a286ead397a39a92857cfb1d43052e356bff0", - "_resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/HISTORY.md deleted file mode 100644 index 236e95e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/HISTORY.md +++ /dev/null @@ -1,27 +0,0 @@ -0.1.0 / 2014-07-16 -================== - - * Respond after request fully read - - prevents hung responses and socket hang ups - * deps: debug@1.0.4 - -0.0.3 / 2014-07-11 -================== - - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.0.2 / 2014-06-19 -================== - - * Handle invalid status codes - -0.0.1 / 2014-06-05 -================== - - * deps: debug@1.0.2 - -0.0.0 / 2014-06-05 -================== - - * Extracted from connect/express diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/README.md deleted file mode 100644 index c701e3a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/README.md +++ /dev/null @@ -1,140 +0,0 @@ -# finalhandler - -[![NPM version](https://badge.fury.io/js/finalhandler.svg)](https://badge.fury.io/js/finalhandler) -[![Build Status](https://travis-ci.org/expressjs/finalhandler.svg?branch=master)](https://travis-ci.org/expressjs/finalhandler) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/finalhandler.svg?branch=master)](https://coveralls.io/r/expressjs/finalhandler) - -Node.js function to invoke as the final step to respond to HTTP request. - -## Installation - -```sh -$ npm install finalhandler -``` - -## API - -```js -var finalhandler = require('finalhandler') -``` - -### finalhandler(req, res, [options]) - -Returns function to be invoked as the final step for the given `req` and `res`. -This function is to be invoked as `fn(err)`. If `err` is falsy, the handler will -write out a 404 response to the `res`. If it is truthy, an error response will -be written out to the `res`, and `res.statusCode` is set from `err.status`. - -The final handler will also unpipe anything from `req` when it is invoked. - -#### options.env - -By default, the environment is determined by `NODE_ENV` variable, but it can be -overridden by this option. - -#### options.onerror - -Provide a function to be called with the `err` when it exists. Can be used for -writing errors to a central location without excessive function generation. Called -as `onerror(err, req, res)`. - -## Examples - -### always 404 - -```js -var finalhandler = require('finalhandler') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - done() -}) - -server.listen(3000) -``` - -### perform simple action - -```js -var finalhandler = require('finalhandler') -var fs = require('fs') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - - fs.readFile('index.html', function (err, buf) { - if (err) return done(err) - res.setHeader('Content-Type', 'text/html') - res.end(buf) - }) -}) - -server.listen(3000) -``` - -### use with middleware-style functions - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -var serve = serveStatic('public') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - serve(req, res, done) -}) - -server.listen(3000) -``` - -### keep log of all errors - -```js -var finalhandler = require('finalhandler') -var fs = require('fs') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res, {onerror: logerror}) - - fs.readFile('index.html', function (err, buf) { - if (err) return done(err) - res.setHeader('Content-Type', 'text/html') - res.end(buf) - }) -}) - -server.listen(3000) - -function logerror(err) { - console.error(err.stack || err.toString()) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/index.js deleted file mode 100644 index 1ee90c6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/index.js +++ /dev/null @@ -1,158 +0,0 @@ -/*! - * finalhandler - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var debug = require('debug')('finalhandler') -var escapeHtml = require('escape-html') -var http = require('http') - -/** - * Variables. - */ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Module exports. - */ - -module.exports = finalhandler - -/** - * Final handler: - * - * @param {Request} req - * @param {Response} res - * @param {Object} [options] - * @return {Function} - * @api public - */ - -function finalhandler(req, res, options) { - options = options || {} - - // get environment - var env = options.env || process.env.NODE_ENV || 'development' - - // get error callback - var onerror = options.onerror - - return function (err) { - var msg - - // unhandled error - if (err) { - // default status code to 500 - if (!res.statusCode || res.statusCode < 400) { - res.statusCode = 500 - } - - // respect err.status - if (err.status) { - res.statusCode = err.status - } - - // production gets a basic error message - var msg = env === 'production' - ? http.STATUS_CODES[res.statusCode] - : err.stack || err.toString() - msg = escapeHtml(msg) - .replace(/\n/g, '
') - .replace(/ /g, '  ') + '\n' - } else { - res.statusCode = 404 - msg = 'Cannot ' + escapeHtml(req.method) + ' ' + escapeHtml(req.originalUrl || req.url) + '\n' - } - - debug('default %s', res.statusCode) - - // schedule onerror callback - if (err && onerror) { - defer(onerror, err, req, res) - } - - // cannot actually respond - if (res._header) { - return req.socket.destroy() - } - - send(req, res, res.statusCode, msg) - } -} - -/** - * Send response. - * - * @param {IncomingMessage} req - * @param {OutgoingMessage} res - * @param {number} status - * @param {string} body - * @api private - */ - -function send(req, res, status, body) { - function write() { - res.statusCode = status - res.setHeader('Content-Type', 'text/html; charset=utf-8') - res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8')) - - if (req.method === 'HEAD') { - res.end() - return - } - - res.end(body, 'utf8') - } - - if (!req.readable) { - write() - return - } - - // unpipe everything from the request - unpipe(req) - - // flush the request - req.once('end', write) - req.resume() -} - -/** - * Unpipe everything from a stream. - * - * @param {Object} stream - * @api private - */ - -/* istanbul ignore next: implementation differs between versions */ -function unpipe(stream) { - if (typeof stream.unpipe === 'function') { - // new-style - stream.unpipe() - return - } - - // Node.js 0.8 hack - var listener - var listeners = stream.listeners('close') - - for (var i = 0; i < listeners.length; i++) { - listener = listeners[i] - - if (listener.name !== 'cleanup' && listener.name !== 'onclose') { - continue - } - - // invoke the listener - listener.call(stream) - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/package.json deleted file mode 100644 index a690645..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/finalhandler/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "finalhandler", - "description": "Node.js final http responder", - "version": "0.1.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/finalhandler" - }, - "dependencies": { - "debug": "1.0.4", - "escape-html": "1.0.1" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.20.1", - "readable-stream": "~1.0.27", - "should": "~4.0.1", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/finalhandler/issues" - }, - "homepage": "https://github.com/expressjs/finalhandler", - "_id": "finalhandler@0.1.0", - "dist": { - "shasum": "da05bbc4f5f4a30c84ce1d91f3c154007c4e9daa", - "tarball": "http://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz" - }, - "_from": "finalhandler@0.1.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "da05bbc4f5f4a30c84ce1d91f3c154007c4e9daa", - "_resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/History.md deleted file mode 100644 index 12e1b3e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/History.md +++ /dev/null @@ -1,10 +0,0 @@ - -0.2.1 / 2014-01-29 -================== - - * fix: support max-age=0 for end-to-end revalidation - -0.2.0 / 2013-08-11 -================== - - * fix: return false for no-cache diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Readme.md deleted file mode 100644 index 61366c5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/Readme.md +++ /dev/null @@ -1,57 +0,0 @@ - -# node-fresh - - HTTP response freshness testing - -## fresh(req, res) - - Check freshness of `req` and `res` headers. - - When the cache is "fresh" __true__ is returned, - otherwise __false__ is returned to indicate that - the cache is now stale. - -## Example: - -```js -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'luna' }; -fresh(req, res); -// => false - -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'tobi' }; -fresh(req, res); -// => true -``` - -## Installation - -``` -$ npm install fresh -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/index.js deleted file mode 100644 index 9c3f47d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/index.js +++ /dev/null @@ -1,53 +0,0 @@ - -/** - * Expose `fresh()`. - */ - -module.exports = fresh; - -/** - * Check freshness of `req` and `res` headers. - * - * When the cache is "fresh" __true__ is returned, - * otherwise __false__ is returned to indicate that - * the cache is now stale. - * - * @param {Object} req - * @param {Object} res - * @return {Boolean} - * @api public - */ - -function fresh(req, res) { - // defaults - var etagMatches = true; - var notModified = true; - - // fields - var modifiedSince = req['if-modified-since']; - var noneMatch = req['if-none-match']; - var lastModified = res['last-modified']; - var etag = res['etag']; - var cc = req['cache-control']; - - // unconditional request - if (!modifiedSince && !noneMatch) return false; - - // check for no-cache cache request directive - if (cc && cc.indexOf('no-cache') !== -1) return false; - - // parse if-none-match - if (noneMatch) noneMatch = noneMatch.split(/ *, */); - - // if-none-match - if (noneMatch) etagMatches = ~noneMatch.indexOf(etag) || '*' == noneMatch[0]; - - // if-modified-since - if (modifiedSince) { - modifiedSince = new Date(modifiedSince); - lastModified = new Date(lastModified); - notModified = lastModified <= modifiedSince; - } - - return !! (etagMatches && notModified); -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/package.json deleted file mode 100644 index bc9631a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/fresh/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "fresh", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "HTTP response freshness testing", - "version": "0.2.2", - "main": "index.js", - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-fresh.git" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/visionmedia/node-fresh/blob/master/Readme.md#license" - } - ], - "bugs": { - "url": "https://github.com/visionmedia/node-fresh/issues" - }, - "homepage": "https://github.com/visionmedia/node-fresh", - "_id": "fresh@0.2.2", - "dist": { - "shasum": "9731dcf5678c7faeb44fb903c4f72df55187fa77", - "tarball": "http://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz" - }, - "_from": "fresh@0.2.2", - "_npmVersion": "1.3.15", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "9731dcf5678c7faeb44fb903c4f72df55187fa77", - "_resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/HISTORY.md deleted file mode 100644 index 215cc22..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/HISTORY.md +++ /dev/null @@ -1,16 +0,0 @@ -0.2.0 / 2014-06-18 -================== - - * Add `typer.format()` to format media types - -0.1.0 / 2014-06-17 -================== - - * Accept `req` as argument to `parse` - * Accept `res` as argument to `parse` - * Parse media type with extra LWS between type and first parameter - -0.0.0 / 2014-06-13 -================== - - * Initial implementation diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/README.md deleted file mode 100644 index 338b7ce..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# media-typer - -[![NPM version](https://badge.fury.io/js/media-typer.svg)](https://badge.fury.io/js/media-typer) -[![Build Status](https://travis-ci.org/expressjs/media-typer.svg?branch=master)](https://travis-ci.org/expressjs/media-typer) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/media-typer.svg?branch=master)](https://coveralls.io/r/expressjs/media-typer) - -Simple RFC 6838 media type parser - -## Installation - -```sh -$ npm install media-typer -``` - -## API - -```js -var typer = require('media-typer') -``` - -### typer.parse(string) - -```js -var obj = typer.parse('image/svg+xml; charset=utf-8') -``` - -Parse a media type string. This will return an object with the following -properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`): - - - `type`: The type of the media type (always lower case). Example: `'image'` - - - `subtype`: The subtype of the media type (always lower case). Example: `'svg'` - - - `suffix`: The suffix of the media type (always lower case). Example: `'xml'` - - - `parameters`: An object of the parameters in the media type (name of parameter always lower case). Example: `{charset: 'utf-8'}` - -### typer.parse(req) - -```js -var obj = typer.parse(req) -``` - -Parse the `content-type` header from the given `req`. Short-cut for -`typer.parse(req.headers['content-type'])`. - -### typer.parse(res) - -```js -var obj = typer.parse(req) -``` - -Parse the `content-type` header set on the given `res`. Short-cut for -`typer.parse(res.getHeader('content-type'))`. - -### typer.format(obj) - -```js -var obj = typer.format({type: 'image', subtype: 'svg', suffix: 'xml'}) -``` - -Format an object into a media type string. This will return a string of the -mime type for the given object. For the properties of the object, see the -documentation for `typer.parse(string)`. - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/index.js deleted file mode 100644 index cbf2e17..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/index.js +++ /dev/null @@ -1,261 +0,0 @@ -/*! - * media-typer - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * RegExp to match *( ";" parameter ) in RFC 2616 sec 3.7 - * - * parameter = token "=" ( token | quoted-string ) - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) - * qdtext = > - * quoted-pair = "\" CHAR - * CHAR = - * TEXT = - * LWS = [CRLF] 1*( SP | HT ) - * CRLF = CR LF - * CR = - * LF = - * SP = - * SHT = - * CTL = - * OCTET = - */ -var paramRegExp = /; *([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *= *("(?:[ !\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u0020-\u007e])*"|[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) */g; -var textRegExp = /^[\u0020-\u007e\u0080-\u00ff]+$/ -var tokenRegExp = /^[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+$/ - -/** - * RegExp to match quoted-pair in RFC 2616 - * - * quoted-pair = "\" CHAR - * CHAR = - */ -var qescRegExp = /\\([\u0000-\u007f])/g; - -/** - * RegExp to match chars that must be quoted-pair in RFC 2616 - */ -var quoteRegExp = /([\\"])/g; - -/** - * RegExp to match type in RFC 6838 - * - * type-name = restricted-name - * subtype-name = restricted-name - * restricted-name = restricted-name-first *126restricted-name-chars - * restricted-name-first = ALPHA / DIGIT - * restricted-name-chars = ALPHA / DIGIT / "!" / "#" / - * "$" / "&" / "-" / "^" / "_" - * restricted-name-chars =/ "." ; Characters before first dot always - * ; specify a facet name - * restricted-name-chars =/ "+" ; Characters after last plus always - * ; specify a structured syntax suffix - * ALPHA = %x41-5A / %x61-7A ; A-Z / a-z - * DIGIT = %x30-39 ; 0-9 - */ -var subtypeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/ -var typeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/ -var typeRegExp = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/; - -/** - * Module exports. - */ - -exports.format = format -exports.parse = parse - -/** - * Format object to media type. - * - * @param {object} obj - * @return {string} - * @api public - */ - -function format(obj) { - if (!obj || typeof obj !== 'object') { - throw new TypeError('argument obj is required') - } - - var parameters = obj.parameters - var subtype = obj.subtype - var suffix = obj.suffix - var type = obj.type - - if (!type || !typeNameRegExp.test(type)) { - throw new TypeError('invalid type') - } - - if (!subtype || !subtypeNameRegExp.test(subtype)) { - throw new TypeError('invalid subtype') - } - - // format as type/subtype - var string = type + '/' + subtype - - // append +suffix - if (suffix) { - if (!typeNameRegExp.test(suffix)) { - throw new TypeError('invalid suffix') - } - - string += '+' + suffix - } - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - if (!tokenRegExp.test(param)) { - throw new TypeError('invalid parameter name') - } - - string += '; ' + param + '=' + qstring(parameters[param]) - } - } - - return string -} - -/** - * Parse media type to object. - * - * @param {string|object} string - * @return {Object} - * @api public - */ - -function parse(string) { - if (!string) { - throw new TypeError('argument string is required') - } - - // support req/res-like objects as argument - if (typeof string === 'object') { - string = getcontenttype(string) - } - - if (typeof string !== 'string') { - throw new TypeError('argument string is required to be a string') - } - - var index = string.indexOf(';') - var type = index !== -1 - ? string.substr(0, index) - : string - - var key - var match - var obj = splitType(type) - var params = {} - var value - - paramRegExp.lastIndex = index - - while (match = paramRegExp.exec(string)) { - key = match[1].toLowerCase() - value = match[2] - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(qescRegExp, '$1') - } - - params[key] = value - } - - obj.parameters = params - - return obj -} - -/** - * Get content-type from req/res objects. - * - * @param {object} - * @return {Object} - * @api private - */ - -function getcontenttype(obj) { - if (typeof obj.getHeader === 'function') { - // res-like - return obj.getHeader('content-type') - } - - if (typeof obj.headers === 'object') { - // req-like - return obj.headers && obj.headers['content-type'] - } -} - -/** - * Quote a string if necessary. - * - * @param {string} val - * @return {string} - * @api private - */ - -function qstring(val) { - var str = String(val) - - // no need to quote tokens - if (tokenRegExp.test(str)) { - return str - } - - if (str.length > 0 && !textRegExp.test(str)) { - throw new TypeError('invalid parameter value') - } - - return '"' + str.replace(quoteRegExp, '\\$1') + '"' -} - -/** - * Simply "type/subtype+siffx" into parts. - * - * @param {string} string - * @return {Object} - * @api private - */ - -function splitType(string) { - var match = typeRegExp.exec(string.toLowerCase()) - - if (!match) { - throw new TypeError('invalid media type') - } - - var type = match[1] - var subtype = match[2] - var suffix - - // suffix after last + - var index = subtype.lastIndexOf('+') - if (index !== -1) { - suffix = subtype.substr(index + 1) - subtype = subtype.substr(0, index) - } - - var obj = { - type: type, - subtype: subtype, - suffix: suffix - } - - return obj -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/package.json deleted file mode 100644 index 7ba61f9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/media-typer/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "media-typer", - "description": "Simple RFC 6838 media type parser and formatter", - "version": "0.2.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/media-typer" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.1", - "should": "~4.0.4" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/media-typer/issues" - }, - "homepage": "https://github.com/expressjs/media-typer", - "_id": "media-typer@0.2.0", - "dist": { - "shasum": "d8a065213adfeaa2e76321a2b6dda36ff6335984", - "tarball": "http://registry.npmjs.org/media-typer/-/media-typer-0.2.0.tgz" - }, - "_from": "media-typer@0.2.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "d8a065213adfeaa2e76321a2b6dda36ff6335984", - "_resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/.npmignore deleted file mode 100644 index f62e605..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/.npmignore +++ /dev/null @@ -1,59 +0,0 @@ -# Compiled source # -################### -*.com -*.class -*.dll -*.exe -*.o -*.so - -# Packages # -############ -# it's better to unpack these files and commit the raw source -# git has its own built in compression methods -*.7z -*.dmg -*.gz -*.iso -*.jar -*.rar -*.tar -*.zip - -# Logs and databases # -###################### -*.log -*.sql -*.sqlite - -# OS generated files # -###################### -.DS_Store* -ehthumbs.db -Icon? -Thumbs.db - -# Node.js # -########### -lib-cov -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.gz - -pids -logs -results - -node_modules -npm-debug.log - -# Components # -############## - -/build -/components -/vendors \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/README.md deleted file mode 100644 index 50cf50c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Merge Descriptors [![Build Status](https://travis-ci.org/component/merge-descriptors.png)](https://travis-ci.org/component/merge-descriptors) - -Merge objects using descriptors. - -```js -var thing = { - get name() { - return 'jon' - } -} - -var animal = { - -} - -merge(animal, thing) - -animal.name === 'jon' -``` - -## API - -### merge(destination, source) - -Overwrites `destination`'s descriptors with `source`'s. - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/component.json deleted file mode 100644 index 7653906..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/component.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "merge-descriptors", - "description": "Merge objects using descriptors", - "version": "0.0.2", - "scripts": [ - "index.js" - ], - "repo": "component/merge-descriptors", - "license": "MIT" -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/index.js deleted file mode 100644 index e4e2379..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/index.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = function (dest, src) { - Object.getOwnPropertyNames(src).forEach(function (name) { - var descriptor = Object.getOwnPropertyDescriptor(src, name) - Object.defineProperty(dest, name, descriptor) - }) - - return dest -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/package.json deleted file mode 100644 index b1b83d4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/merge-descriptors/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "merge-descriptors", - "description": "Merge objects using descriptors", - "version": "0.0.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/component/merge-descriptors.git" - }, - "bugs": { - "url": "https://github.com/component/merge-descriptors/issues" - }, - "scripts": { - "test": "make test;" - }, - "homepage": "https://github.com/component/merge-descriptors", - "_id": "merge-descriptors@0.0.2", - "dist": { - "shasum": "c36a52a781437513c57275f39dd9d317514ac8c7", - "tarball": "http://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz" - }, - "_from": "merge-descriptors@0.0.2", - "_npmVersion": "1.3.17", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "directories": {}, - "_shasum": "c36a52a781437513c57275f39dd9d317514ac8c7", - "_resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/.npmignore deleted file mode 100644 index c2658d7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/History.md deleted file mode 100644 index d3996c2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/History.md +++ /dev/null @@ -1,20 +0,0 @@ - -1.1.0 / 2014-07-05 -================== - - * add CONNECT - -1.0.1 / 2014-06-02 -================== - - * fix index.js to work with harmony transform - -1.0.0 / 2014-05-08 -================== - - * add PURGE. Closes #9 - -0.1.0 / 2013-10-28 -================== - - * add http.METHODS support diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/LICENSE deleted file mode 100644 index 8bce401..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2013-2014 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. - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/Readme.md deleted file mode 100644 index ac0658e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/Readme.md +++ /dev/null @@ -1,4 +0,0 @@ - -# Methods - - HTTP verbs that node core's parser supports. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/index.js deleted file mode 100644 index f7e3c48..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/index.js +++ /dev/null @@ -1,41 +0,0 @@ - -var http = require('http'); - -if (http.METHODS) { - - module.exports = http.METHODS.map(function(method){ - return method.toLowerCase(); - }); - -} else { - - module.exports = [ - 'get', - 'post', - 'put', - 'head', - 'delete', - 'options', - 'trace', - 'copy', - 'lock', - 'mkcol', - 'move', - 'purge', - 'propfind', - 'proppatch', - 'unlock', - 'report', - 'mkactivity', - 'checkout', - 'merge', - 'm-search', - 'notify', - 'subscribe', - 'unsubscribe', - 'patch', - 'search', - 'connect' - ]; - -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/package.json deleted file mode 100644 index 8d1c198..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "methods", - "version": "1.1.0", - "description": "HTTP methods that node supports", - "main": "index.js", - "scripts": { - "test": "./node_modules/mocha/bin/mocha" - }, - "keywords": [ - "http", - "methods" - ], - "author": { - "name": "TJ Holowaychuk" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/node-methods.git" - }, - "devDependencies": { - "mocha": "1.17.x" - }, - "gitHead": "2a4dd325d18436c33356e6be19e32e08a7c877ab", - "bugs": { - "url": "https://github.com/visionmedia/node-methods/issues" - }, - "homepage": "https://github.com/visionmedia/node-methods", - "_id": "methods@1.1.0", - "_shasum": "5dca4ee12df52ff3b056145986a8f01cbc86436f", - "_from": "methods@1.1.0", - "_npmVersion": "1.4.16", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "5dca4ee12df52ff3b056145986a8f01cbc86436f", - "tarball": "http://registry.npmjs.org/methods/-/methods-1.1.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/test/methods.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/test/methods.js deleted file mode 100644 index 527beab..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/methods/test/methods.js +++ /dev/null @@ -1,33 +0,0 @@ -var http = require('http'); -var assert = require('assert'); -var methods = require('..'); - -describe('methods', function() { - - if (http.METHODS) { - - it('is a lowercased http.METHODS', function() { - var lowercased = http.METHODS.map(function(method) { - return method.toLowerCase(); - }); - assert.deepEqual(lowercased, methods); - }); - - } else { - - it('contains GET, POST, PUT, and DELETE', function() { - assert.notEqual(methods.indexOf('get'), -1); - assert.notEqual(methods.indexOf('post'), -1); - assert.notEqual(methods.indexOf('put'), -1); - assert.notEqual(methods.indexOf('delete'), -1); - }); - - it('is all lowercase', function() { - for (var i = 0; i < methods.length; i ++) { - assert(methods[i], methods[i].toLowerCase(), methods[i] + " isn't all lowercase"); - } - }); - - } - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/.npmignore deleted file mode 100644 index 85c82a5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -benchmark/ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/HISTORY.md deleted file mode 100644 index cf36864..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/HISTORY.md +++ /dev/null @@ -1,36 +0,0 @@ -1.2.0 / 2014-07-21 -================== - - * Cache URLs based on original value - * Remove no-longer-needed URL mis-parse work-around - * Simplify the "fast-path" `RegExp` - -1.1.3 / 2014-07-08 -================== - - * Fix typo - -1.1.2 / 2014-07-08 -================== - - * Seriously fix Node.js 0.8 compatibility - -1.1.1 / 2014-07-08 -================== - - * Fix Node.js 0.8 compatibility - -1.1.0 / 2014-07-08 -================== - - * Incorporate URL href-only parse fast-path - -1.0.1 / 2014-03-08 -================== - - * Add missing `require` - -1.0.0 / 2014-03-08 -================== - - * Genesis from `connect` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/LICENSE deleted file mode 100644 index 991dc7d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ - -(The MIT License) - -Copyright (c) 2014 Jonathan Ong - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/README.md deleted file mode 100644 index 91a70db..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/README.md +++ /dev/null @@ -1,99 +0,0 @@ -# parseurl - -[![NPM version](https://badge.fury.io/js/parseurl.svg)](http://badge.fury.io/js/parseurl) -[![Build Status](https://travis-ci.org/expressjs/parseurl.svg?branch=master)](https://travis-ci.org/expressjs/parseurl) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/parseurl.svg?branch=master)](https://coveralls.io/r/expressjs/parseurl) - -Parse a URL with memoization. - -## Install - -```bash -$ npm install parseurl -``` - -## API - -```js -var parseurl = require('parseurl') -``` - -### parseurl(req) - -Parse the URL of the given request object (looks at the `req.url` property) -and return the result. The result is the same as `url.parse` in Node.js core. -Calling this function multiple times on the same `req` where `req.url` does -not change will return a cached parsed object, rather than parsing again. - -## Benchmark - -```bash -$ npm run-script bench - -> parseurl@1.2.0 bench nodejs-parseurl -> node benchmark/index.js - -> node benchmark/fullurl.js - - Parsing URL "http://localhost:8888/foo/bar?user=tj&pet=fluffy" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 1,290,780 ops/sec ±0.46% (195 runs sampled) - nativeurl x 56,401 ops/sec ±0.22% (196 runs sampled) - parseurl x 55,231 ops/sec ±0.22% (194 runs sampled) - -> node benchmark/pathquery.js - - Parsing URL "/foo/bar?user=tj&pet=fluffy" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 1,986,668 ops/sec ±0.27% (190 runs sampled) - nativeurl x 98,740 ops/sec ±0.21% (195 runs sampled) - parseurl x 2,628,171 ops/sec ±0.36% (195 runs sampled) - -> node benchmark/samerequest.js - - Parsing URL "/foo/bar?user=tj&pet=fluffy" on same request object - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 2,184,468 ops/sec ±0.40% (194 runs sampled) - nativeurl x 99,437 ops/sec ±0.71% (194 runs sampled) - parseurl x 10,498,005 ops/sec ±0.61% (186 runs sampled) - -> node benchmark/simplepath.js - - Parsing URL "/foo/bar" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 4,535,825 ops/sec ±0.27% (191 runs sampled) - nativeurl x 98,769 ops/sec ±0.54% (191 runs sampled) - parseurl x 4,164,865 ops/sec ±0.34% (192 runs sampled) - -> node benchmark/slash.js - - Parsing URL "/" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 4,908,405 ops/sec ±0.42% (191 runs sampled) - nativeurl x 100,945 ops/sec ±0.59% (188 runs sampled) - parseurl x 4,333,208 ops/sec ±0.27% (194 runs sampled) -``` - -## License - - [MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/index.js deleted file mode 100644 index 41e6d00..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/index.js +++ /dev/null @@ -1,87 +0,0 @@ - -/** - * Module dependencies. - */ - -var url = require('url') -var parse = url.parse -var Url = url.Url - -/** - * Pattern for a simple path case. - * See: https://github.com/joyent/node/pull/7878 - */ - -var simplePathRegExp = /^(\/\/?(?!\/)[^\?#\s]*)(\?[^#\s]*)?$/ - -/** - * Parse the `req` url with memoization. - * - * @param {ServerRequest} req - * @return {Object} - * @api public - */ - -module.exports = function parseUrl(req){ - var parsed = req._parsedUrl - var url = req.url - - if (fresh(url, parsed)) { - // Return cached URL parse - return parsed - } - - // Parse the URL - parsed = fastparse(url) - parsed._raw = url - - return req._parsedUrl = parsed -}; - -/** - * Parse the `str` url with fast-path short-cut. - * - * @param {string} str - * @return {Object} - * @api private - */ - -function fastparse(str) { - // Try fast path regexp - // See: https://github.com/joyent/node/pull/7878 - var simplePath = typeof str === 'string' && simplePathRegExp.exec(str) - - // Construct simple URL - if (simplePath) { - var pathname = simplePath[1] - var search = simplePath[2] || null - var url = Url !== undefined - ? new Url() - : {} - url.path = str - url.href = str - url.pathname = pathname - url.search = search - url.query = search && search.substr(1) - - return url - } - - return parse(str) -} - -/** - * Determine if parsed is still fresh for url. - * - * @param {string} url - * @param {object} parsedUrl - * @return {boolean} - * @api private - */ - -function fresh(url, parsedUrl) { - return typeof parsedUrl === 'object' - && parsedUrl !== null - && (Url === undefined || parsedUrl instanceof Url) - && parsedUrl._raw === url -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/package.json deleted file mode 100644 index 5c8e842..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/parseurl/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "parseurl", - "description": "parse a url with memoization", - "version": "1.2.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/parseurl" - }, - "license": "MIT", - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "fast-url-parser": "~1.0.0", - "istanbul": "0.3.0", - "mocha": "~1.20.0" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --check-leaks --bail --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/parseurl/issues" - }, - "homepage": "https://github.com/expressjs/parseurl", - "_id": "parseurl@1.2.0", - "dist": { - "shasum": "be7df2d698eb49ffb10ea62939693e152991c008", - "tarball": "http://registry.npmjs.org/parseurl/-/parseurl-1.2.0.tgz" - }, - "_from": "parseurl@>=1.2.0-0 <1.3.0-0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "be7df2d698eb49ffb10ea62939693e152991c008", - "_resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/.npmignore deleted file mode 100644 index ba2a97b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -coverage diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/History.md deleted file mode 100644 index f962cfa..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/History.md +++ /dev/null @@ -1,16 +0,0 @@ -0.1.3 / 2014-07-06 -================== - - * Better array support - * Improved support for trailing slash in non-ending mode - -0.1.0 / 2014-03-06 -================== - - * add options.end - -0.0.2 / 2013-02-10 -================== - - * Update to match current express - * add .license property to component.json diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/Readme.md deleted file mode 100644 index 9199e38..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/Readme.md +++ /dev/null @@ -1,33 +0,0 @@ - -# Path-to-RegExp - - Turn an Express-style path string such as `/user/:name` into a regular expression. - -## Usage - -```javascript -var pathToRegexp = require('path-to-regexp'); -``` -### pathToRegexp(path, keys, options) - - - **path** A string in the express format, an array of such strings, or a regular expression - - **keys** An array to be populated with the keys present in the url. Once the function completes, this will be an array of strings. - - **options** - - **options.sensitive** Defaults to false, set this to true to make routes case sensitive - - **options.strict** Defaults to false, set this to true to make the trailing slash matter. - - **options.end** Defaults to true, set this to false to only match the prefix of the URL. - -```javascript -var keys = []; -var exp = pathToRegexp('/foo/:bar', keys); -//keys = ['bar'] -//exp = /^\/foo\/(?:([^\/]+?))\/?$/i -``` - -## Live Demo - -You can see a live demo of this library in use at [express-route-tester](http://forbeslindesay.github.com/express-route-tester/). - -## License - - MIT \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/component.json deleted file mode 100644 index 6ab37d3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/component.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "path-to-regexp", - "description": "Express style path to RegExp utility", - "version": "0.1.3", - "keywords": [ - "express", - "regexp", - "route", - "routing" - ], - "scripts": [ - "index.js" - ], - "license": "MIT" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/index.js deleted file mode 100644 index 2801f91..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/index.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Expose `pathtoRegexp`. - */ - -module.exports = pathtoRegexp; - -/** - * Normalize the given path string, - * returning a regular expression. - * - * An empty array should be passed, - * which will contain the placeholder - * key names. For example "/user/:id" will - * then contain ["id"]. - * - * @param {String|RegExp|Array} path - * @param {Array} keys - * @param {Object} options - * @return {RegExp} - * @api private - */ - -function pathtoRegexp(path, keys, options) { - options = options || {}; - var strict = options.strict; - var end = options.end !== false; - var flags = options.sensitive ? '' : 'i'; - keys = keys || []; - - if (path instanceof RegExp) { - return path; - } - - if (Array.isArray(path)) { - // Map array parts into regexps and return their source. We also pass - // the same keys and options instance into every generation to get - // consistent matching groups before we join the sources together. - path = path.map(function (value) { - return pathtoRegexp(value, keys, options).source; - }); - - return new RegExp('(?:' + path.join('|') + ')', flags); - } - - path = ('^' + path + (strict ? '' : path[path.length - 1] === '/' ? '?' : '/?')) - .replace(/\/\(/g, '/(?:') - .replace(/([\/\.])/g, '\\$1') - .replace(/(\\\/)?(\\\.)?:(\w+)(\(.*?\))?(\*)?(\?)?/g, function (match, slash, format, key, capture, star, optional) { - slash = slash || ''; - format = format || ''; - capture = capture || '([^\\/' + format + ']+?)'; - optional = optional || ''; - - keys.push({ name: key, optional: !!optional }); - - return '' - + (optional ? '' : slash) - + '(?:' - + format + (optional ? slash : '') + capture - + (star ? '((?:[\\/' + format + '].+?)?)' : '') - + ')' - + optional; - }) - .replace(/\*/g, '(.*)'); - - // If the path is non-ending, match until the end or a slash. - path += (end ? '$' : (path[path.length - 1] === '/' ? '' : '(?=\\/|$)')); - - return new RegExp(path, flags); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/package.json deleted file mode 100644 index bccfe25..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/package.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "name": "path-to-regexp", - "description": "Express style path to RegExp utility", - "version": "0.1.3", - "scripts": { - "test": "istanbul cover _mocha -- -R spec" - }, - "keywords": [ - "express", - "regexp" - ], - "component": { - "scripts": { - "path-to-regexp": "index.js" - } - }, - "repository": { - "type": "git", - "url": "https://github.com/component/path-to-regexp.git" - }, - "devDependencies": { - "mocha": "^1.17.1", - "istanbul": "^0.2.6" - }, - "bugs": { - "url": "https://github.com/component/path-to-regexp/issues" - }, - "homepage": "https://github.com/component/path-to-regexp", - "_id": "path-to-regexp@0.1.3", - "_shasum": "21b9ab82274279de25b156ea08fd12ca51b8aecb", - "_from": "path-to-regexp@0.1.3", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dominicbarnes", - "email": "dominic@dbarnes.info" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - { - "name": "retrofox", - "email": "rdsuarez@gmail.com" - }, - { - "name": "coreh", - "email": "thecoreh@gmail.com" - }, - { - "name": "forbeslindesay", - "email": "forbes@lindesay.co.uk" - }, - { - "name": "kelonye", - "email": "kelonyemitchel@gmail.com" - }, - { - "name": "mattmueller", - "email": "mattmuelle@gmail.com" - }, - { - "name": "yields", - "email": "yields@icloud.com" - }, - { - "name": "anthonyshort", - "email": "antshort@gmail.com" - }, - { - "name": "ianstormtaylor", - "email": "ian@ianstormtaylor.com" - }, - { - "name": "cristiandouce", - "email": "cristian@gravityonmars.com" - }, - { - "name": "swatinem", - "email": "arpad.borsos@googlemail.com" - }, - { - "name": "stagas", - "email": "gstagas@gmail.com" - }, - { - "name": "amasad", - "email": "amjad.masad@gmail.com" - }, - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "calvinfo", - "email": "calvin@calv.info" - }, - { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - { - "name": "timoxley", - "email": "secoif@gmail.com" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "queckezz", - "email": "fabian.eichenberger@gmail.com" - }, - { - "name": "nami-doc", - "email": "vendethiel@hotmail.fr" - }, - { - "name": "clintwood", - "email": "clint@anotherway.co.za" - }, - { - "name": "thehydroimpulse", - "email": "dnfagnan@gmail.com" - }, - { - "name": "stephenmathieson", - "email": "me@stephenmathieson.com" - }, - { - "name": "trevorgerhardt", - "email": "trevorgerhardt@gmail.com" - } - ], - "dist": { - "shasum": "21b9ab82274279de25b156ea08fd12ca51b8aecb", - "tarball": "http://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/test.js deleted file mode 100644 index 4a0c270..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/path-to-regexp/test.js +++ /dev/null @@ -1,616 +0,0 @@ -var pathToRegExp = require('./'); -var assert = require('assert'); - -describe('path-to-regexp', function () { - describe('strings', function () { - it('should match simple paths', function () { - var params = []; - var m = pathToRegExp('/test', params).exec('/test'); - - assert.equal(params.length, 0); - - assert.equal(m.length, 1); - assert.equal(m[0], '/test'); - }); - - it('should match express format params', function () { - var params = []; - var m = pathToRegExp('/:test', params).exec('/pathname'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/pathname'); - assert.equal(m[1], 'pathname'); - }); - - it('should do strict matches', function () { - var params = []; - var re = pathToRegExp('/:test', params, { strict: true }); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/route'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - - m = re.exec('/route/'); - - assert.ok(!m); - }); - - it('should do strict matches with trailing slashes', function () { - var params = []; - var re = pathToRegExp('/:test/', params, { strict: true }); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/route'); - - assert.ok(!m); - - m = re.exec('/route/'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route/'); - assert.equal(m[1], 'route'); - - m = re.exec('/route//'); - - assert.ok(!m); - }); - - it('should allow optional express format params', function () { - var params = []; - var re = pathToRegExp('/:test?', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, true); - - m = re.exec('/route'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - - m = re.exec('/'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/'); - assert.equal(m[1], undefined); - }); - - it('should allow express format param regexps', function () { - var params = []; - var m = pathToRegExp('/:page(\\d+)', params).exec('/56'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'page'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/56'); - assert.equal(m[1], '56'); - }); - - it('should match without a prefixed slash', function () { - var params = []; - var m = pathToRegExp(':test', params).exec('string'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], 'string'); - assert.equal(m[1], 'string'); - }); - - it('should not match format parts', function () { - var params = []; - var m = pathToRegExp('/:test.json', params).exec('/route.json'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - }); - - it('should match format parts', function () { - var params = []; - var re = pathToRegExp('/:test.:format', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, false); - - m = re.exec('/route.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - assert.equal(m[2], 'json'); - - m = re.exec('/route'); - - assert.ok(!m); - }); - - it('should match route parts with a trailing format', function () { - var params = []; - var m = pathToRegExp('/:test.json', params).exec('/route.json'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - }); - - it('should match optional trailing routes', function () { - var params = []; - var m = pathToRegExp('/test*', params).exec('/test/route'); - - assert.equal(params.length, 0); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test/route'); - assert.equal(m[1], '/route'); - }); - - it('should match optional trailing routes after a param', function () { - var params = []; - var re = pathToRegExp('/:test*', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/test/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/route'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - - m = re.exec('/testing'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/testing'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - }); - - it('should match optional trailing routes before a format', function () { - var params = []; - var re = pathToRegExp('/test*.json', params); - var m; - - assert.equal(params.length, 0); - - m = re.exec('/test.json'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test.json'); - assert.equal(m[1], ''); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'ing'); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], '/route'); - }); - - it('should match optional trailing routes after a param and before a format', function () { - var params = []; - var re = pathToRegExp('/:test*.json', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - - m = re.exec('.json'); - - assert.ok(!m); - }); - - it('should match optional trailing routes between a normal param and a format param', function () { - var params = []; - var re = pathToRegExp('/:test*.:format', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, false); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - assert.equal(m[3], 'json'); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - assert.equal(m[3], 'json'); - - m = re.exec('/test'); - - assert.ok(!m); - - m = re.exec('.json'); - - assert.ok(!m); - }); - - it('should match optional trailing routes after a param and before an optional format param', function () { - var params = []; - var re = pathToRegExp('/:test*.:format?', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, true); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - assert.equal(m[3], 'json'); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - assert.equal(m[3], 'json'); - - m = re.exec('/test'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/test'); - assert.equal(m[1], 'test'); - assert.equal(m[2], ''); - assert.equal(m[3], undefined); - - m = re.exec('.json'); - - assert.ok(!m); - }); - - it('should match optional trailing routes inside optional express param', function () { - var params = []; - var re = pathToRegExp('/:test*?', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, true); - - m = re.exec('/test/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/route'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - - m = re.exec('/test'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test'); - assert.equal(m[1], 'test'); - assert.equal(m[2], ''); - - m = re.exec('/'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/'); - assert.equal(m[1], undefined); - assert.equal(m[2], undefined); - }); - - it('should do case insensitive matches', function () { - var m = pathToRegExp('/test').exec('/TEST'); - - assert.equal(m[0], '/TEST'); - }); - - it('should do case sensitive matches', function () { - var re = pathToRegExp('/test', null, { sensitive: true }); - var m; - - m = re.exec('/test'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/test'); - - m = re.exec('/TEST'); - - assert.ok(!m); - }); - - it('should do non-ending matches', function () { - var params = []; - var m = pathToRegExp('/:test', params, { end: false }).exec('/test/route'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test'); - assert.equal(m[1], 'test'); - }); - - it('should match trailing slashes in non-ending non-strict mode', function () { - var params = []; - var re = pathToRegExp('/:test', params, { end: false }); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/test/'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test/'); - assert.equal(m[1], 'test'); - }); - - it('should match trailing slashes in non-ending non-strict mode', function () { - var params = []; - var re = pathToRegExp('/route/', params, { end: false }); - var m; - - assert.equal(params.length, 0); - - m = re.exec('/route/'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - - m = re.exec('/route/test'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route'); - - m = re.exec('/route'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route'); - - m = re.exec('/route//'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - }); - - it('should match trailing slashing in non-ending strict mode', function () { - var params = []; - var re = pathToRegExp('/route/', params, { end: false, strict: true }); - - assert.equal(params.length, 0); - - m = re.exec('/route/'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - - m = re.exec('/route/test'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - - m = re.exec('/route'); - - assert.ok(!m); - - m = re.exec('/route//'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - }); - - it('should not match trailing slashes in non-ending strict mode', function () { - var params = []; - var re = pathToRegExp('/route', params, { end: false, strict: true }); - - assert.equal(params.length, 0); - - m = re.exec('/route'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route'); - - m = re.exec('/route/'); - - assert.ok(m.length, 1); - assert.equal(m[0], '/route'); - }); - - it('should match text after an express param', function () { - var params = []; - var re = pathToRegExp('/(:test)route', params); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/route'); - - assert.ok(!m); - - m = re.exec('/testroute'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/testroute'); - assert.equal(m[1], 'test'); - - m = re.exec('testroute'); - - assert.ok(!m); - }); - - it('should match text after an optional express param', function () { - var params = []; - var re = pathToRegExp('/(:test?)route', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, true); - - m = re.exec('/route'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route'); - assert.equal(m[1], undefined); - - m = re.exec('/testroute'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/testroute'); - assert.equal(m[1], 'test'); - - m = re.exec('route'); - - assert.ok(!m); - }); - - it('should match optional formats', function () { - var params = []; - var re = pathToRegExp('/:test.:format?', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, true); - - m = re.exec('/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - assert.equal(m[2], undefined); - - m = re.exec('/route.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - assert.equal(m[2], 'json'); - }); - - it('should match full paths with format by default', function () { - var params = []; - var m = pathToRegExp('/:test', params).exec('/test.json'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test.json'); - assert.equal(m[1], 'test.json'); - }); - }); - - describe('regexps', function () { - it('should return the regexp', function () { - assert.deepEqual(pathToRegExp(/.*/), /.*/); - }); - }); - - describe('arrays', function () { - it('should join arrays parts', function () { - var re = pathToRegExp(['/test', '/route']); - - assert.ok(re.test('/test')); - assert.ok(re.test('/route')); - assert.ok(!re.test('/else')); - }); - - it('should match parts properly', function () { - var params = []; - var re = pathToRegExp(['/:test', '/test/:route'], params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'route'); - assert.equal(params[1].optional, false); - - m = re.exec('/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - assert.equal(m[2], undefined); - - m = re.exec('/test/path'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/path'); - assert.equal(m[1], undefined); - assert.equal(m[2], 'path'); - }); - }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/.npmignore deleted file mode 100644 index 85c82a5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -benchmark/ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/History.md deleted file mode 100644 index 61a0d50..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/History.md +++ /dev/null @@ -1,27 +0,0 @@ -1.0.1 / 2014-06-03 -================== - - * Fix links in npm package - -1.0.0 / 2014-05-08 -================== - - * Add `trust` argument to determine proxy trust on - * Accepts custom function - * Accepts IPv4/IPv6 address(es) - * Accepts subnets - * Accepts pre-defined names - * Add optional `trust` argument to `proxyaddr.all` to - stop at first untrusted - * Add `proxyaddr.compile` to pre-compile `trust` function - to make subsequent calls faster - -0.0.1 / 2014-05-04 -================== - - * Fix bad npm publish - -0.0.0 / 2014-05-04 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/README.md deleted file mode 100644 index 4fe57d3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# proxy-addr - -[![NPM version](https://badge.fury.io/js/proxy-addr.svg)](http://badge.fury.io/js/proxy-addr) -[![Build Status](https://travis-ci.org/expressjs/proxy-addr.svg?branch=master)](https://travis-ci.org/expressjs/proxy-addr) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/proxy-addr.svg?branch=master)](https://coveralls.io/r/expressjs/proxy-addr) - -Determine address of proxied request - -## Install - -```sh -$ npm install proxy-addr -``` - -## API - -```js -var proxyaddr = require('proxy-addr') -``` - -### proxyaddr(req, trust) - -Return the address of the request, using the given `trust` parameter. - -The `trust` argument is a function that returns `true` if you trust -the address, `false` if you don't. The closest untrusted address is -returned. - -```js -proxyaddr(req, function(addr){ return addr === '127.0.0.1' }) -proxyaddr(req, function(addr, i){ return i < 1 }) -``` - -The `trust` arugment may also be a single IP address string or an -array of trusted addresses, as plain IP addresses, CIDR-formatted -strings, or IP/netmask strings. - -```js -proxyaddr(req, '127.0.0.1') -proxyaddr(req, ['127.0.0.0/8', '10.0.0.0/8']) -proxyaddr(req, ['127.0.0.0/255.0.0.0', '192.168.0.0/255.255.0.0']) -``` - -This module also supports IPv6. Your IPv6 addresses will be normalized -automatically (i.e. `fe80::00ed:1` equals `fe80:0:0:0:0:0:ed:1`). - -```js -proxyaddr(req, '::1') -proxyaddr(req, ['::1/128', 'fe80::/10']) -proxyaddr(req, ['fe80::/ffc0::']) -``` - -This module will automatically work with IPv4-mapped IPv6 addresses -as well to support node.js in IPv6-only mode. This means that you do -not have to specify both `::ffff:a00:1` and `10.0.0.1`. - -As a convenience, this module also takes certain pre-defined names -in addition to IP addresses, which expand into IP addresses: - -```js -proxyaddr(req, 'loopback') -proxyaddr(req, ['loopback', 'fc00:ac:1ab5:fff::1/64']) -``` - - * `loopback`: IPv4 and IPv6 loopback addresses (like `::1` and - `127.0.0.1`). - * `linklocal`: IPv4 and IPv6 link-local addresses (like - `fe80::1:1:1:1` and `169.254.0.1`). - * `uniquelocal`: IPv4 private addresses and IPv6 unique-local - addresses (like `fc00:ac:1ab5:fff::1` and `192.168.0.1`). - -When `trust` is specified as a function, it will be called for each -address to determine if it is a trusted address. The function is -given two arguments: `addr` and `i`, where `addr` is a string of -the address to check and `i` is a number that represents the distance -from the socket address. - -### proxyaddr.all(req, [trust]) - -Return all the addresses of the request, optionally stopping at the -first untrusted. This array is ordered from closest to furthest -(i.e. `arr[0] === req.connection.remoteAddress`). - -```js -proxyaddr.all(req) -``` - -The optional `trust` argument takes the same arguments as `trust` -does in `proxyaddr(req, trust)`. - -```js -proxyaddr.all(req, 'loopback') -``` - -### proxyaddr.compile(val) - -Compiles argument `val` into a `trust` function. This function takes -the same arguments as `trust` does in `proxyaddr(req, trust)` and -returns a function suitable for `proxyaddr(req, trust)`. - -```js -var trust = proxyaddr.compile('localhost') -var addr = proxyaddr(req, trust) -``` - -This function is meant to be optimized for use against every request. -It is recommend to compile a trust function up-front for the trusted -configuration and pass that to `proxyaddr(req, trust)` for each request. - -## Testing - -```sh -$ npm test -``` - -## Benchmarks - -```sh -$ npm run-script bench -``` - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/index.js deleted file mode 100644 index 75ee432..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/index.js +++ /dev/null @@ -1,353 +0,0 @@ -/*! - * proxy-addr - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = proxyaddr; -module.exports.all = alladdrs; -module.exports.compile = compile; - -/** - * Module dependencies. - */ - -var ipaddr = require('ipaddr.js'); - -/** - * Variables. - */ - -var digitre = /^[0-9]+$/; -var isip = ipaddr.isValid; -var parseip = ipaddr.parse; - -/** - * Pre-defined IP ranges. - */ - -var ipranges = { - linklocal: ['169.254.0.0/16', 'fe80::/10'], - loopback: ['127.0.0.1/8', '::1/128'], - uniquelocal: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fc00::/7'] -}; - -/** - * Get all addresses in the request, optionally stopping - * at the first untrusted. - * - * @param {Object} request - * @param {Function|Array|String} [trust] - * @api public - */ - -function alladdrs(req, trust) { - if (!req) { - throw new TypeError('req argument is required'); - } - - var proxyAddrs = (req.headers['x-forwarded-for'] || '') - .split(/ *, */) - .filter(Boolean) - .reverse(); - var socketAddr = req.connection.remoteAddress; - var addrs = [socketAddr].concat(proxyAddrs); - - if (!trust) { - // Return all addresses - return addrs; - } - - if (typeof trust !== 'function') { - trust = compile(trust); - } - - for (var i = 0; i < addrs.length - 1; i++) { - if (trust(addrs[i], i)) continue; - - addrs.length = i + 1; - } - - return addrs; -} - -/** - * Compile argument into trust function. - * - * @param {Array|String} val - * @api private - */ - -function compile(val) { - if (!val) { - throw new TypeError('argument is required'); - } - - var trust = typeof val === 'string' - ? [val] - : val; - - if (!Array.isArray(trust)) { - throw new TypeError('unsupported trust argument'); - } - - for (var i = 0; i < trust.length; i++) { - val = trust[i]; - - if (!ipranges.hasOwnProperty(val)) { - continue; - } - - // Splice in pre-defined range - val = ipranges[val]; - trust.splice.apply(trust, [i, 1].concat(val)); - i += val.length - 1; - } - - return compileTrust(compileRangeSubnets(trust)); -} - -/** - * Compile `arr` elements into range subnets. - * - * @param {Array} arr - * @api private - */ - -function compileRangeSubnets(arr) { - var rangeSubnets = new Array(arr.length); - - for (var i = 0; i < arr.length; i++) { - rangeSubnets[i] = parseipNotation(arr[i]); - } - - return rangeSubnets; -} - -/** - * Compile range subnet array into trust function. - * - * @param {Array} rangeSubnets - * @api private - */ - -function compileTrust(rangeSubnets) { - // Return optimized function based on length - var len = rangeSubnets.length; - return len === 0 - ? trustNone - : len === 1 - ? trustSingle(rangeSubnets[0]) - : trustMulti(rangeSubnets); -} - -/** - * Parse IP notation string into range subnet. - * - * @param {String} note - * @api private - */ - -function parseipNotation(note) { - var ip; - var kind; - var max; - var pos = note.lastIndexOf('/'); - var range; - - ip = pos !== -1 - ? note.substring(0, pos) - : note; - - if (!isip(ip)) { - throw new TypeError('invalid IP address: ' + ip); - } - - ip = parseip(ip); - - kind = ip.kind(); - max = kind === 'ipv4' ? 32 - : kind === 'ipv6' ? 128 - : 0; - - range = pos !== -1 - ? note.substring(pos + 1, note.length) - : max; - - if (typeof range !== 'number') { - range = digitre.test(range) - ? parseInt(range, 10) - : isip(range) - ? parseNetmask(range) - : 0; - } - - if (ip.kind() === 'ipv6' && ip.isIPv4MappedAddress()) { - // Store as IPv4 - ip = ip.toIPv4Address(); - range = range <= max - ? range - 96 - : range; - } - - if (range <= 0 || range > max) { - throw new TypeError('invalid range on address: ' + note); - } - - return [ip, range]; -} - -/** - * Parse netmask string into CIDR range. - * - * @param {String} note - * @api private - */ - -function parseNetmask(netmask) { - var ip = parseip(netmask); - var parts; - var size; - - switch (ip.kind()) { - case 'ipv4': - parts = ip.octets; - size = 8; - break; - case 'ipv6': - parts = ip.parts; - size = 16; - break; - default: - throw new TypeError('unknown netmask'); - } - - var max = Math.pow(2, size) - 1; - var part; - var range = 0; - - for (var i = 0; i < parts.length; i++) { - part = parts[i] & max; - - if (part === max) { - range += size; - continue; - } - - while (part) { - part = (part << 1) & max; - range += 1; - } - - break; - } - - return range; -} - -/** - * Determine address of proxied request. - * - * @param {Object} request - * @param {Function|Array|String} trust - * @api public - */ - -function proxyaddr(req, trust) { - if (!req) { - throw new TypeError('req argument is required'); - } - - if (!trust) { - throw new TypeError('trust argument is required'); - } - - var addrs = alladdrs(req, trust); - var addr = addrs[addrs.length - 1]; - - return addr; -} - -/** - * Static trust function to trust nothing. - * - * @api private - */ - -function trustNone() { - return false; -} - -/** - * Compile trust function for multiple subnets. - * - * @param {Array} subnets - * @api private - */ - -function trustMulti(subnets) { - return function trust(addr) { - if (!isip(addr)) return false; - - var ip = parseip(addr); - var ipv4; - var kind = ip.kind(); - var subnet; - var subnetip; - var subnetkind; - var trusted; - - for (var i = 0; i < subnets.length; i++) { - subnet = subnets[i]; - subnetip = subnet[0]; - subnetkind = subnetip.kind(); - subnetrange = subnet[1]; - trusted = ip; - - if (kind !== subnetkind) { - if (kind !== 'ipv6' || subnetkind !== 'ipv4' || !ip.isIPv4MappedAddress()) { - continue; - } - - // Store addr as IPv4 - ipv4 = ipv4 || ip.toIPv4Address(); - trusted = ipv4; - } - - if (trusted.match(subnetip, subnetrange)) return true; - } - - return false; - }; -} - -/** - * Compile trust function for single subnet. - * - * @param {Object} subnet - * @api private - */ - -function trustSingle(subnet) { - var subnetip = subnet[0]; - var subnetkind = subnetip.kind(); - var subnetisipv4 = subnetkind === 'ipv4'; - var subnetrange = subnet[1]; - - return function trust(addr) { - if (!isip(addr)) return false; - - var ip = parseip(addr); - var kind = ip.kind(); - - return kind === subnetkind - ? ip.match(subnetip, subnetrange) - : subnetisipv4 && kind === 'ipv6' && ip.isIPv4MappedAddress() - ? ip.toIPv4Address().match(subnetip, subnetrange) - : false; - }; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore deleted file mode 100644 index 7a1537b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.idea -node_modules diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile deleted file mode 100644 index 7fd355a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile +++ /dev/null @@ -1,18 +0,0 @@ -fs = require 'fs' -CoffeeScript = require 'coffee-script' -nodeunit = require 'nodeunit' -UglifyJS = require 'uglify-js' - -task 'build', 'build the JavaScript files from CoffeeScript source', build = (cb) -> - source = fs.readFileSync 'src/ipaddr.coffee' - fs.writeFileSync 'lib/ipaddr.js', CoffeeScript.compile source.toString() - - invoke 'test' - invoke 'compress' - -task 'test', 'run the bundled tests', (cb) -> - nodeunit.reporters.default.run ['test'] - -task 'compress', 'uglify the resulting javascript', (cb) -> - result = UglifyJS.minify('lib/ipaddr.js') - fs.writeFileSync('ipaddr.min.js', result.code) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE deleted file mode 100644 index 3493f0d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2011 Peter Zotov - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md deleted file mode 100644 index a816672..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md +++ /dev/null @@ -1,149 +0,0 @@ -# ipaddr.js — an IPv6 and IPv4 address manipulation library - -ipaddr.js is a small (1.9K minified and gzipped) library for manipulating -IP addresses in JavaScript environments. It runs on both CommonJS runtimes -(e.g. [nodejs]) and in a web browser. - -ipaddr.js allows you to verify and parse string representation of an IP -address, match it against a CIDR range or range list, determine if it falls -into some reserved ranges (examples include loopback and private ranges), -and convert between IPv4 and IPv4-mapped IPv6 addresses. - -[nodejs]: http://nodejs.org - -## Installation - -`npm install ipaddr.js` - -## API - -ipaddr.js defines one object in the global scope: `ipaddr`. In CommonJS, -it is exported from the module: - -```js -var ipaddr = require('ipaddr.js'); -``` - -The API consists of several global methods and two classes: ipaddr.IPv6 and ipaddr.IPv4. - -### Global methods - -There are three global methods defined: `ipaddr.isValid`, `ipaddr.parse` and -`ipaddr.process`. All of them receive a string as a single parameter. - -The `ipaddr.isValid` method returns `true` if the address is a valid IPv4 or -IPv6 address, and `false` otherwise. It does not throw any exceptions. - -The `ipaddr.parse` method returns an object representing the IP address, -or throws an `Error` if the passed string is not a valid representation of an -IP address. - -The `ipaddr.process` method works just like the `ipaddr.parse` one, but it -automatically converts IPv4-mapped IPv6 addresses to their IPv4 couterparts -before returning. It is useful when you have a Node.js instance listening -on an IPv6 socket, and the `net.ivp6.bindv6only` sysctl parameter (or its -equivalent on non-Linux OS) is set to 0. In this case, you can accept IPv4 -connections on your IPv6-only socket, but the remote address will be mangled. -Use `ipaddr.process` method to automatically demangle it. - -### Object representation - -Parsing methods return an object which descends from `ipaddr.IPv6` or -`ipaddr.IPv4`. These objects share some properties, but most of them differ. - -#### Shared properties - -One can determine the type of address by calling `addr.kind()`. It will return -either `"ipv6"` or `"ipv4"`. - -An address can be converted back to its string representation with `addr.toString()`. -Note that this method: - * does not return the original string used to create the object (in fact, there is - no way of getting that string) - * returns a compact representation (when it is applicable) - -A `match(range, bits)` method can be used to check if the address falls into a -certain CIDR range. -Note that an address can be (obviously) matched only against an address of the same type. - -For example: - -```js -var addr = ipaddr.parse("2001:db8:1234::1"); -var range = ipaddr.parse("2001:db8::"); - -addr.match(range, 32); // => true -``` - -A `range()` method returns one of predefined names for several special ranges defined -by IP protocols. The exact names (and their respective CIDR ranges) can be looked up -in the source: [IPv6 ranges] and [IPv4 ranges]. Some common ones include `"unicast"` -(the default one) and `"reserved"`. - -You can match against your own range list by using -`ipaddr.subnetMatch(address, rangeList, defaultName)` method. It can work with both -IPv6 and IPv4 addresses, and accepts a name-to-subnet map as the range list. For example: - -```js -var rangeList = { - documentationOnly: [ ipaddr.parse('2001:db8::'), 32 ], - tunnelProviders: [ - [ ipaddr.parse('2001:470::'), 32 ], // he.net - [ ipaddr.parse('2001:5c0::'), 32 ] // freenet6 - ] -}; -ipaddr.subnetMatch(ipaddr.parse('2001:470:8:66::1'), rangeList, 'unknown'); // => "he.net" -``` - -The addresses can be converted to their byte representation with `toByteArray()`. -(Actually, JavaScript mostly does not know about byte buffers. They are emulated with -arrays of numbers, each in range of 0..255.) - -```js -var bytes = ipaddr.parse('2a00:1450:8007::68').toByteArray(); // ipv6.google.com -bytes // => [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, , 0x00, 0x68 ] -``` - -The `ipaddr.IPv4` and `ipaddr.IPv6` objects have some methods defined, too. All of them -have the same interface for both protocols, and are similar to global methods. - -`ipaddr.IPvX.isValid(string)` can be used to check if the string is a valid address -for particular protocol, and `ipaddr.IPvX.parse(string)` is the error-throwing parser. - -[IPv6 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L186 -[IPv4 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L71 - -#### IPv6 properties - -Sometimes you will want to convert IPv6 not to a compact string representation (with -the `::` substitution); the `toNormalizedString()` method will return an address where -all zeroes are explicit. - -For example: - -```js -var addr = ipaddr.parse("2001:0db8::0001"); -addr.toString(); // => "2001:db8::1" -addr.toNormalizedString(); // => "2001:db8:0:0:0:0:0:1" -``` - -The `isIPv4MappedAddress()` method will return `true` if this address is an IPv4-mapped -one, and `toIPv4Address()` will return an IPv4 object address. - -To access the underlying binary representation of the address, use `addr.parts`. - -```js -var addr = ipaddr.parse("2001:db8:10::1234:DEAD"); -addr.parts // => [0x2001, 0xdb8, 0x10, 0, 0, 0, 0x1234, 0xdead] -``` - -#### IPv4 properties - -`toIPv4MappedAddress()` will return a corresponding IPv4-mapped IPv6 address. - -To access the underlying representation of the address, use `addr.octets`. - -```js -var addr = ipaddr.parse("192.168.1.1"); -addr.octets // => [192, 168, 1, 1] -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js deleted file mode 100644 index 528d48b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var t,r,n,e,i,o,a,s;r={},s=this,"undefined"!=typeof module&&null!==module&&module.exports?module.exports=r:s.ipaddr=r,a=function(t,r,n,e){var i,o;if(t.length!==r.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;e>0;){if(o=n-e,0>o&&(o=0),t[i]>>o!==r[i]>>o)return!1;e-=n,i+=1}return!0},r.subnetMatch=function(t,r,n){var e,i,o,a,s;null==n&&(n="unicast");for(e in r)for(i=r[e],"[object Array]"!==toString.call(i[0])&&(i=[i]),a=0,s=i.length;s>a;a++)if(o=i[a],t.match.apply(t,o))return e;return n},r.IPv4=function(){function t(t){var r,n,e;if(4!==t.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(n=0,e=t.length;e>n;n++)if(r=t[n],!(r>=0&&255>=r))throw new Error("ipaddr: ipv4 octet is a byte");this.octets=t}return t.prototype.kind=function(){return"ipv4"},t.prototype.toString=function(){return this.octets.join(".")},t.prototype.toByteArray=function(){return this.octets.slice(0)},t.prototype.match=function(t,r){if("ipv4"!==t.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return a(this.octets,t.octets,8,r)},t.prototype.SpecialRanges={broadcast:[[new t([255,255,255,255]),32]],multicast:[[new t([224,0,0,0]),4]],linkLocal:[[new t([169,254,0,0]),16]],loopback:[[new t([127,0,0,0]),8]],"private":[[new t([10,0,0,0]),8],[new t([172,16,0,0]),12],[new t([192,168,0,0]),16]],reserved:[[new t([192,0,0,0]),24],[new t([192,0,2,0]),24],[new t([192,88,99,0]),24],[new t([198,51,100,0]),24],[new t([203,0,113,0]),24],[new t([240,0,0,0]),4]]},t.prototype.range=function(){return r.subnetMatch(this,this.SpecialRanges)},t.prototype.toIPv4MappedAddress=function(){return r.IPv6.parse("::ffff:"+this.toString())},t}(),n="(0?\\d+|0x[a-f0-9]+)",e={fourOctet:new RegExp("^"+n+"\\."+n+"\\."+n+"\\."+n+"$","i"),longValue:new RegExp("^"+n+"$","i")},r.IPv4.parser=function(t){var r,n,i,o,a;return n=function(t){return"0"===t[0]&&"x"!==t[1]?parseInt(t,8):parseInt(t)},(r=t.match(e.fourOctet))?function(){var t,e,o,a;for(o=r.slice(1,6),a=[],t=0,e=o.length;e>t;t++)i=o[t],a.push(n(i));return a}():(r=t.match(e.longValue))?(a=n(r[1]),function(){var t,r;for(r=[],o=t=0;24>=t;o=t+=8)r.push(a>>o&255);return r}().reverse()):null},r.IPv6=function(){function t(t){var r,n,e;if(8!==t.length)throw new Error("ipaddr: ipv6 part count should be 8");for(n=0,e=t.length;e>n;n++)if(r=t[n],!(r>=0&&65535>=r))throw new Error("ipaddr: ipv6 part should fit to two octets");this.parts=t}return t.prototype.kind=function(){return"ipv6"},t.prototype.toString=function(){var t,r,n,e,i,o,a;for(i=function(){var t,n,e,i;for(e=this.parts,i=[],t=0,n=e.length;n>t;t++)r=e[t],i.push(r.toString(16));return i}.call(this),t=[],n=function(r){return t.push(r)},e=0,o=0,a=i.length;a>o;o++)switch(r=i[o],e){case 0:"0"===r?n(""):n(r),e=1;break;case 1:"0"===r?e=2:n(r);break;case 2:"0"!==r&&(n(""),n(r),e=3);break;case 3:n(r)}return 2===e&&(n(""),n("")),t.join(":")},t.prototype.toByteArray=function(){var t,r,n,e,i;for(t=[],i=this.parts,n=0,e=i.length;e>n;n++)r=i[n],t.push(r>>8),t.push(255&r);return t},t.prototype.toNormalizedString=function(){var t;return function(){var r,n,e,i;for(e=this.parts,i=[],r=0,n=e.length;n>r;r++)t=e[r],i.push(t.toString(16));return i}.call(this).join(":")},t.prototype.match=function(t,r){if("ipv6"!==t.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return a(this.parts,t.parts,16,r)},t.prototype.SpecialRanges={unspecified:[new t([0,0,0,0,0,0,0,0]),128],linkLocal:[new t([65152,0,0,0,0,0,0,0]),10],multicast:[new t([65280,0,0,0,0,0,0,0]),8],loopback:[new t([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new t([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new t([0,0,0,0,0,65535,0,0]),96],rfc6145:[new t([0,0,0,0,65535,0,0,0]),96],rfc6052:[new t([100,65435,0,0,0,0,0,0]),96],"6to4":[new t([8194,0,0,0,0,0,0,0]),16],teredo:[new t([8193,0,0,0,0,0,0,0]),32],reserved:[[new t([8193,3512,0,0,0,0,0,0]),32]]},t.prototype.range=function(){return r.subnetMatch(this,this.SpecialRanges)},t.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},t.prototype.toIPv4Address=function(){var t,n,e;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return e=this.parts.slice(-2),t=e[0],n=e[1],new r.IPv4([t>>8,255&t,n>>8,255&n])},t}(),i="(?:[0-9a-f]+::?)+",o={"native":new RegExp("^(::)?("+i+")?([0-9a-f]+)?(::)?$","i"),transitional:new RegExp("^((?:"+i+")|(?:::)(?:"+i+")?)"+(""+n+"\\."+n+"\\."+n+"\\."+n+"$"),"i")},t=function(t,r){var n,e,i,o,a;if(t.indexOf("::")!==t.lastIndexOf("::"))return null;for(n=0,e=-1;(e=t.indexOf(":",e+1))>=0;)n++;for(":"===t[0]&&n--,":"===t[t.length-1]&&n--,a=r-n,o=":";a--;)o+="0:";return t=t.replace("::",o),":"===t[0]&&(t=t.slice(1)),":"===t[t.length-1]&&(t=t.slice(0,-1)),function(){var r,n,e,o;for(e=t.split(":"),o=[],r=0,n=e.length;n>r;r++)i=e[r],o.push(parseInt(i,16));return o}()},r.IPv6.parser=function(r){var n,e;return r.match(o["native"])?t(r,8):(n=r.match(o.transitional))&&(e=t(n[1].slice(0,-1),6))?(e.push(parseInt(n[2])<<8|parseInt(n[3])),e.push(parseInt(n[4])<<8|parseInt(n[5])),e):null},r.IPv4.isIPv4=r.IPv6.isIPv6=function(t){return null!==this.parser(t)},r.IPv4.isValid=r.IPv6.isValid=function(t){var r;try{return new this(this.parser(t)),!0}catch(n){return r=n,!1}},r.IPv4.parse=r.IPv6.parse=function(t){var r;if(r=this.parser(t),null===r)throw new Error("ipaddr: string is not formatted like ip address");return new this(r)},r.isValid=function(t){return r.IPv6.isValid(t)||r.IPv4.isValid(t)},r.parse=function(t){if(r.IPv6.isIPv6(t))return r.IPv6.parse(t);if(r.IPv4.isIPv4(t))return r.IPv4.parse(t);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},r.process=function(t){var r;return r=this.parse(t),"ipv6"===r.kind()&&r.isIPv4MappedAddress()?r.toIPv4Address():r}}).call(this); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js deleted file mode 100644 index 2319737..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js +++ /dev/null @@ -1,401 +0,0 @@ -(function() { - var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root; - - ipaddr = {}; - - root = this; - - if ((typeof module !== "undefined" && module !== null) && module.exports) { - module.exports = ipaddr; - } else { - root['ipaddr'] = ipaddr; - } - - matchCIDR = function(first, second, partSize, cidrBits) { - var part, shift; - if (first.length !== second.length) { - throw new Error("ipaddr: cannot match CIDR for objects with different lengths"); - } - part = 0; - while (cidrBits > 0) { - shift = partSize - cidrBits; - if (shift < 0) { - shift = 0; - } - if (first[part] >> shift !== second[part] >> shift) { - return false; - } - cidrBits -= partSize; - part += 1; - } - return true; - }; - - ipaddr.subnetMatch = function(address, rangeList, defaultName) { - var rangeName, rangeSubnets, subnet, _i, _len; - if (defaultName == null) { - defaultName = 'unicast'; - } - for (rangeName in rangeList) { - rangeSubnets = rangeList[rangeName]; - if (toString.call(rangeSubnets[0]) !== '[object Array]') { - rangeSubnets = [rangeSubnets]; - } - for (_i = 0, _len = rangeSubnets.length; _i < _len; _i++) { - subnet = rangeSubnets[_i]; - if (address.match.apply(address, subnet)) { - return rangeName; - } - } - } - return defaultName; - }; - - ipaddr.IPv4 = (function() { - function IPv4(octets) { - var octet, _i, _len; - if (octets.length !== 4) { - throw new Error("ipaddr: ipv4 octet count should be 4"); - } - for (_i = 0, _len = octets.length; _i < _len; _i++) { - octet = octets[_i]; - if (!((0 <= octet && octet <= 255))) { - throw new Error("ipaddr: ipv4 octet is a byte"); - } - } - this.octets = octets; - } - - IPv4.prototype.kind = function() { - return 'ipv4'; - }; - - IPv4.prototype.toString = function() { - return this.octets.join("."); - }; - - IPv4.prototype.toByteArray = function() { - return this.octets.slice(0); - }; - - IPv4.prototype.match = function(other, cidrRange) { - if (other.kind() !== 'ipv4') { - throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one"); - } - return matchCIDR(this.octets, other.octets, 8, cidrRange); - }; - - IPv4.prototype.SpecialRanges = { - broadcast: [[new IPv4([255, 255, 255, 255]), 32]], - multicast: [[new IPv4([224, 0, 0, 0]), 4]], - linkLocal: [[new IPv4([169, 254, 0, 0]), 16]], - loopback: [[new IPv4([127, 0, 0, 0]), 8]], - "private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]], - reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]] - }; - - IPv4.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv4.prototype.toIPv4MappedAddress = function() { - return ipaddr.IPv6.parse("::ffff:" + (this.toString())); - }; - - return IPv4; - - })(); - - ipv4Part = "(0?\\d+|0x[a-f0-9]+)"; - - ipv4Regexes = { - fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'), - longValue: new RegExp("^" + ipv4Part + "$", 'i') - }; - - ipaddr.IPv4.parser = function(string) { - var match, parseIntAuto, part, shift, value; - parseIntAuto = function(string) { - if (string[0] === "0" && string[1] !== "x") { - return parseInt(string, 8); - } else { - return parseInt(string); - } - }; - if (match = string.match(ipv4Regexes.fourOctet)) { - return (function() { - var _i, _len, _ref, _results; - _ref = match.slice(1, 6); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(parseIntAuto(part)); - } - return _results; - })(); - } else if (match = string.match(ipv4Regexes.longValue)) { - value = parseIntAuto(match[1]); - return ((function() { - var _i, _results; - _results = []; - for (shift = _i = 0; _i <= 24; shift = _i += 8) { - _results.push((value >> shift) & 0xff); - } - return _results; - })()).reverse(); - } else { - return null; - } - }; - - ipaddr.IPv6 = (function() { - function IPv6(parts) { - var part, _i, _len; - if (parts.length !== 8) { - throw new Error("ipaddr: ipv6 part count should be 8"); - } - for (_i = 0, _len = parts.length; _i < _len; _i++) { - part = parts[_i]; - if (!((0 <= part && part <= 0xffff))) { - throw new Error("ipaddr: ipv6 part should fit to two octets"); - } - } - this.parts = parts; - } - - IPv6.prototype.kind = function() { - return 'ipv6'; - }; - - IPv6.prototype.toString = function() { - var compactStringParts, part, pushPart, state, stringParts, _i, _len; - stringParts = (function() { - var _i, _len, _ref, _results; - _ref = this.parts; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(part.toString(16)); - } - return _results; - }).call(this); - compactStringParts = []; - pushPart = function(part) { - return compactStringParts.push(part); - }; - state = 0; - for (_i = 0, _len = stringParts.length; _i < _len; _i++) { - part = stringParts[_i]; - switch (state) { - case 0: - if (part === '0') { - pushPart(''); - } else { - pushPart(part); - } - state = 1; - break; - case 1: - if (part === '0') { - state = 2; - } else { - pushPart(part); - } - break; - case 2: - if (part !== '0') { - pushPart(''); - pushPart(part); - state = 3; - } - break; - case 3: - pushPart(part); - } - } - if (state === 2) { - pushPart(''); - pushPart(''); - } - return compactStringParts.join(":"); - }; - - IPv6.prototype.toByteArray = function() { - var bytes, part, _i, _len, _ref; - bytes = []; - _ref = this.parts; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - bytes.push(part >> 8); - bytes.push(part & 0xff); - } - return bytes; - }; - - IPv6.prototype.toNormalizedString = function() { - var part; - return ((function() { - var _i, _len, _ref, _results; - _ref = this.parts; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(part.toString(16)); - } - return _results; - }).call(this)).join(":"); - }; - - IPv6.prototype.match = function(other, cidrRange) { - if (other.kind() !== 'ipv6') { - throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one"); - } - return matchCIDR(this.parts, other.parts, 16, cidrRange); - }; - - IPv6.prototype.SpecialRanges = { - unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128], - linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10], - multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8], - loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128], - uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7], - ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96], - rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96], - rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96], - '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16], - teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32], - reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]] - }; - - IPv6.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv6.prototype.isIPv4MappedAddress = function() { - return this.range() === 'ipv4Mapped'; - }; - - IPv6.prototype.toIPv4Address = function() { - var high, low, _ref; - if (!this.isIPv4MappedAddress()) { - throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4"); - } - _ref = this.parts.slice(-2), high = _ref[0], low = _ref[1]; - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]); - }; - - return IPv6; - - })(); - - ipv6Part = "(?:[0-9a-f]+::?)+"; - - ipv6Regexes = { - "native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?$", 'i'), - transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + ("" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$"), 'i') - }; - - expandIPv6 = function(string, parts) { - var colonCount, lastColon, part, replacement, replacementCount; - if (string.indexOf('::') !== string.lastIndexOf('::')) { - return null; - } - colonCount = 0; - lastColon = -1; - while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) { - colonCount++; - } - if (string[0] === ':') { - colonCount--; - } - if (string[string.length - 1] === ':') { - colonCount--; - } - replacementCount = parts - colonCount; - replacement = ':'; - while (replacementCount--) { - replacement += '0:'; - } - string = string.replace('::', replacement); - if (string[0] === ':') { - string = string.slice(1); - } - if (string[string.length - 1] === ':') { - string = string.slice(0, -1); - } - return (function() { - var _i, _len, _ref, _results; - _ref = string.split(":"); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(parseInt(part, 16)); - } - return _results; - })(); - }; - - ipaddr.IPv6.parser = function(string) { - var match, parts; - if (string.match(ipv6Regexes['native'])) { - return expandIPv6(string, 8); - } else if (match = string.match(ipv6Regexes['transitional'])) { - parts = expandIPv6(match[1].slice(0, -1), 6); - if (parts) { - parts.push(parseInt(match[2]) << 8 | parseInt(match[3])); - parts.push(parseInt(match[4]) << 8 | parseInt(match[5])); - return parts; - } - } - return null; - }; - - ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) { - return this.parser(string) !== null; - }; - - ipaddr.IPv4.isValid = ipaddr.IPv6.isValid = function(string) { - var e; - try { - new this(this.parser(string)); - return true; - } catch (_error) { - e = _error; - return false; - } - }; - - ipaddr.IPv4.parse = ipaddr.IPv6.parse = function(string) { - var parts; - parts = this.parser(string); - if (parts === null) { - throw new Error("ipaddr: string is not formatted like ip address"); - } - return new this(parts); - }; - - ipaddr.isValid = function(string) { - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string); - }; - - ipaddr.parse = function(string) { - if (ipaddr.IPv6.isIPv6(string)) { - return ipaddr.IPv6.parse(string); - } else if (ipaddr.IPv4.isIPv4(string)) { - return ipaddr.IPv4.parse(string); - } else { - throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format"); - } - }; - - ipaddr.process = function(string) { - var addr; - addr = this.parse(string); - if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) { - return addr.toIPv4Address(); - } else { - return addr; - } - }; - -}).call(this); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json deleted file mode 100644 index f375304..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "ipaddr.js", - "description": "A library for manipulating IPv4 and IPv6 addresses in JavaScript.", - "version": "0.1.2", - "author": { - "name": "Peter Zotov", - "email": "whitequark@whitequark.org" - }, - "directories": { - "lib": "./lib" - }, - "dependencies": {}, - "devDependencies": { - "coffee-script": "~1.6", - "nodeunit": "~0.5.3", - "uglify-js": "latest" - }, - "scripts": { - "test": "cake build test" - }, - "keywords": [ - "ip", - "ipv4", - "ipv6" - ], - "repository": { - "type": "git", - "url": "git://github.com/whitequark/ipaddr.js" - }, - "main": "./lib/ipaddr", - "engines": { - "node": ">= 0.2.5" - }, - "bugs": { - "url": "https://github.com/whitequark/ipaddr.js/issues" - }, - "_id": "ipaddr.js@0.1.2", - "dist": { - "shasum": "6a1fd3d854f5002965c34d7bbcd9b4a8d4b0467e", - "tarball": "http://registry.npmjs.org/ipaddr.js/-/ipaddr.js-0.1.2.tgz" - }, - "_from": "ipaddr.js@0.1.2", - "_npmVersion": "1.3.10", - "_npmUser": { - "name": "whitequark", - "email": "whitequark@whitequark.org" - }, - "maintainers": [ - { - "name": "whitequark", - "email": "whitequark@whitequark.org" - } - ], - "_shasum": "6a1fd3d854f5002965c34d7bbcd9b4a8d4b0467e", - "_resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-0.1.2.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/whitequark/ipaddr.js" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee deleted file mode 100644 index 4c89ded..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee +++ /dev/null @@ -1,344 +0,0 @@ -# Define the main object -ipaddr = {} - -root = this - -# Export for both the CommonJS and browser-like environment -if module? && module.exports - module.exports = ipaddr -else - root['ipaddr'] = ipaddr - -# A generic CIDR (Classless Inter-Domain Routing) RFC1518 range matcher. -matchCIDR = (first, second, partSize, cidrBits) -> - if first.length != second.length - throw new Error "ipaddr: cannot match CIDR for objects with different lengths" - - part = 0 - while cidrBits > 0 - shift = partSize - cidrBits - shift = 0 if shift < 0 - - if first[part] >> shift != second[part] >> shift - return false - - cidrBits -= partSize - part += 1 - - return true - -# An utility function to ease named range matching. See examples below. -ipaddr.subnetMatch = (address, rangeList, defaultName='unicast') -> - for rangeName, rangeSubnets of rangeList - # ECMA5 Array.isArray isn't available everywhere - if toString.call(rangeSubnets[0]) != '[object Array]' - rangeSubnets = [ rangeSubnets ] - - for subnet in rangeSubnets - return rangeName if address.match.apply(address, subnet) - - return defaultName - -# An IPv4 address (RFC791). -class ipaddr.IPv4 - # Constructs a new IPv4 address from an array of four octets. - # Verifies the input. - constructor: (octets) -> - if octets.length != 4 - throw new Error "ipaddr: ipv4 octet count should be 4" - - for octet in octets - if !(0 <= octet <= 255) - throw new Error "ipaddr: ipv4 octet is a byte" - - @octets = octets - - # The 'kind' method exists on both IPv4 and IPv6 classes. - kind: -> - return 'ipv4' - - # Returns the address in convenient, decimal-dotted format. - toString: -> - return @octets.join "." - - # Returns an array of byte-sized values in network order - toByteArray: -> - return @octets.slice(0) # octets.clone - - # Checks if this address matches other one within given CIDR range. - match: (other, cidrRange) -> - if other.kind() != 'ipv4' - throw new Error "ipaddr: cannot match ipv4 address with non-ipv4 one" - - return matchCIDR(this.octets, other.octets, 8, cidrRange) - - # Special IPv4 address ranges. - SpecialRanges: - broadcast: [ - [ new IPv4([255, 255, 255, 255]), 32 ] - ] - multicast: [ # RFC3171 - [ new IPv4([224, 0, 0, 0]), 4 ] - ] - linkLocal: [ # RFC3927 - [ new IPv4([169, 254, 0, 0]), 16 ] - ] - loopback: [ # RFC5735 - [ new IPv4([127, 0, 0, 0]), 8 ] - ] - private: [ # RFC1918 - [ new IPv4([10, 0, 0, 0]), 8 ] - [ new IPv4([172, 16, 0, 0]), 12 ] - [ new IPv4([192, 168, 0, 0]), 16 ] - ] - reserved: [ # Reserved and testing-only ranges; RFCs 5735, 5737, 2544, 1700 - [ new IPv4([192, 0, 0, 0]), 24 ] - [ new IPv4([192, 0, 2, 0]), 24 ] - [ new IPv4([192, 88, 99, 0]), 24 ] - [ new IPv4([198, 51, 100, 0]), 24 ] - [ new IPv4([203, 0, 113, 0]), 24 ] - [ new IPv4([240, 0, 0, 0]), 4 ] - ] - - # Checks if the address corresponds to one of the special ranges. - range: -> - return ipaddr.subnetMatch(this, @SpecialRanges) - - # Convrets this IPv4 address to an IPv4-mapped IPv6 address. - toIPv4MappedAddress: -> - return ipaddr.IPv6.parse "::ffff:#{@toString()}" - -# A list of regular expressions that match arbitrary IPv4 addresses, -# for which a number of weird notations exist. -# Note that an address like 0010.0xa5.1.1 is considered legal. -ipv4Part = "(0?\\d+|0x[a-f0-9]+)" -ipv4Regexes = - fourOctet: new RegExp "^#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}$", 'i' - longValue: new RegExp "^#{ipv4Part}$", 'i' - -# Classful variants (like a.b, where a is an octet, and b is a 24-bit -# value representing last three octets; this corresponds to a class C -# address) are omitted due to classless nature of modern Internet. -ipaddr.IPv4.parser = (string) -> - parseIntAuto = (string) -> - if string[0] == "0" && string[1] != "x" - parseInt(string, 8) - else - parseInt(string) - - # parseInt recognizes all that octal & hexadecimal weirdness for us - if match = string.match(ipv4Regexes.fourOctet) - return (parseIntAuto(part) for part in match[1..5]) - else if match = string.match(ipv4Regexes.longValue) - value = parseIntAuto(match[1]) - return ((value >> shift) & 0xff for shift in [0..24] by 8).reverse() - else - return null - -# An IPv6 address (RFC2460) -class ipaddr.IPv6 - # Constructs an IPv6 address from an array of eight 16-bit parts. - # Throws an error if the input is invalid. - constructor: (parts) -> - if parts.length != 8 - throw new Error "ipaddr: ipv6 part count should be 8" - - for part in parts - if !(0 <= part <= 0xffff) - throw new Error "ipaddr: ipv6 part should fit to two octets" - - @parts = parts - - # The 'kind' method exists on both IPv4 and IPv6 classes. - kind: -> - return 'ipv6' - - # Returns the address in compact, human-readable format like - # 2001:db8:8:66::1 - toString: -> - stringParts = (part.toString(16) for part in @parts) - - compactStringParts = [] - pushPart = (part) -> compactStringParts.push part - - state = 0 - for part in stringParts - switch state - when 0 - if part == '0' - pushPart('') - else - pushPart(part) - - state = 1 - when 1 - if part == '0' - state = 2 - else - pushPart(part) - when 2 - unless part == '0' - pushPart('') - pushPart(part) - state = 3 - when 3 - pushPart(part) - - if state == 2 - pushPart('') - pushPart('') - - return compactStringParts.join ":" - - # Returns an array of byte-sized values in network order - toByteArray: -> - bytes = [] - for part in @parts - bytes.push(part >> 8) - bytes.push(part & 0xff) - - return bytes - - # Returns the address in expanded format with all zeroes included, like - # 2001:db8:8:66:0:0:0:1 - toNormalizedString: -> - return (part.toString(16) for part in @parts).join ":" - - # Checks if this address matches other one within given CIDR range. - match: (other, cidrRange) -> - if other.kind() != 'ipv6' - throw new Error "ipaddr: cannot match ipv6 address with non-ipv6 one" - - return matchCIDR(this.parts, other.parts, 16, cidrRange) - - # Special IPv6 ranges - SpecialRanges: - unspecified: [ new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128 ] # RFC4291, here and after - linkLocal: [ new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10 ] - multicast: [ new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8 ] - loopback: [ new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128 ] - uniqueLocal: [ new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7 ] - ipv4Mapped: [ new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96 ] - rfc6145: [ new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96 ] # RFC6145 - rfc6052: [ new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96 ] # RFC6052 - '6to4': [ new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16 ] # RFC3056 - teredo: [ new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32 ] # RFC6052, RFC6146 - reserved: [ - [ new IPv6([ 0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32 ] # RFC4291 - ] - - # Checks if the address corresponds to one of the special ranges. - range: -> - return ipaddr.subnetMatch(this, @SpecialRanges) - - # Checks if this address is an IPv4-mapped IPv6 address. - isIPv4MappedAddress: -> - return @range() == 'ipv4Mapped' - - # Converts this address to IPv4 address if it is an IPv4-mapped IPv6 address. - # Throws an error otherwise. - toIPv4Address: -> - unless @isIPv4MappedAddress() - throw new Error "ipaddr: trying to convert a generic ipv6 address to ipv4" - - [high, low] = @parts[-2..-1] - - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]) - -# IPv6-matching regular expressions. -# For IPv6, the task is simpler: it is enough to match the colon-delimited -# hexadecimal IPv6 and a transitional variant with dotted-decimal IPv4 at -# the end. -ipv6Part = "(?:[0-9a-f]+::?)+" -ipv6Regexes = - native: new RegExp "^(::)?(#{ipv6Part})?([0-9a-f]+)?(::)?$", 'i' - transitional: new RegExp "^((?:#{ipv6Part})|(?:::)(?:#{ipv6Part})?)" + - "#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}$", 'i' - -# Expand :: in an IPv6 address or address part consisting of `parts` groups. -expandIPv6 = (string, parts) -> - # More than one '::' means invalid adddress - if string.indexOf('::') != string.lastIndexOf('::') - return null - - # How many parts do we already have? - colonCount = 0 - lastColon = -1 - while (lastColon = string.indexOf(':', lastColon + 1)) >= 0 - colonCount++ - - # 0::0 is two parts more than :: - colonCount-- if string[0] == ':' - colonCount-- if string[string.length-1] == ':' - - # replacement = ':' + '0:' * (parts - colonCount) - replacementCount = parts - colonCount - replacement = ':' - while replacementCount-- - replacement += '0:' - - # Insert the missing zeroes - string = string.replace('::', replacement) - - # Trim any garbage which may be hanging around if :: was at the edge in - # the source string - string = string[1..-1] if string[0] == ':' - string = string[0..-2] if string[string.length-1] == ':' - - return (parseInt(part, 16) for part in string.split(":")) - -# Parse an IPv6 address. -ipaddr.IPv6.parser = (string) -> - if string.match(ipv6Regexes['native']) - return expandIPv6(string, 8) - - else if match = string.match(ipv6Regexes['transitional']) - parts = expandIPv6(match[1][0..-2], 6) - if parts - parts.push(parseInt(match[2]) << 8 | parseInt(match[3])) - parts.push(parseInt(match[4]) << 8 | parseInt(match[5])) - return parts - - return null - -# Checks if a given string is formatted like IPv4/IPv6 address. -ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = (string) -> - return @parser(string) != null - -# Checks if a given string is a valid IPv4/IPv6 address. -ipaddr.IPv4.isValid = ipaddr.IPv6.isValid = (string) -> - try - new this(@parser(string)) - return true - catch e - return false - -# Tries to parse and validate a string with IPv4/IPv6 address. -# Throws an error if it fails. -ipaddr.IPv4.parse = ipaddr.IPv6.parse = (string) -> - parts = @parser(string) - if parts == null - throw new Error "ipaddr: string is not formatted like ip address" - - return new this(parts) - -# Checks if the address is valid IP address -ipaddr.isValid = (string) -> - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string) - -# Try to parse an address and throw an error if it is impossible -ipaddr.parse = (string) -> - if ipaddr.IPv6.isIPv6(string) - return ipaddr.IPv6.parse(string) - else if ipaddr.IPv4.isIPv4(string) - return ipaddr.IPv4.parse(string) - else - throw new Error "ipaddr: the address has neither IPv6 nor IPv4 format" - -# Parse an address and return plain IPv4 address if it is an IPv4-mapped address -ipaddr.process = (string) -> - addr = @parse(string) - if addr.kind() == 'ipv6' && addr.isIPv4MappedAddress() - return addr.toIPv4Address() - else - return addr diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee deleted file mode 100644 index 56751da..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee +++ /dev/null @@ -1,209 +0,0 @@ -ipaddr = require '../lib/ipaddr' - -module.exports = - 'should define main classes': (test) -> - test.ok(ipaddr.IPv4?, 'defines IPv4 class') - test.ok(ipaddr.IPv6?, 'defines IPv6 class') - test.done() - - 'can construct IPv4 from octets': (test) -> - test.doesNotThrow -> - new ipaddr.IPv4([192, 168, 1, 2]) - test.done() - - 'refuses to construct invalid IPv4': (test) -> - test.throws -> - new ipaddr.IPv4([300, 1, 2, 3]) - test.throws -> - new ipaddr.IPv4([8, 8, 8]) - test.done() - - 'converts IPv4 to string correctly': (test) -> - addr = new ipaddr.IPv4([192, 168, 1, 1]) - test.equal(addr.toString(), '192.168.1.1') - test.done() - - 'returns correct kind for IPv4': (test) -> - addr = new ipaddr.IPv4([1, 2, 3, 4]) - test.equal(addr.kind(), 'ipv4') - test.done() - - 'allows to access IPv4 octets': (test) -> - addr = new ipaddr.IPv4([42, 0, 0, 0]) - test.equal(addr.octets[0], 42) - test.done() - - 'checks IPv4 address format': (test) -> - test.equal(ipaddr.IPv4.isIPv4('192.168.007.0xa'), true) - test.equal(ipaddr.IPv4.isIPv4('1024.0.0.1'), true) - test.equal(ipaddr.IPv4.isIPv4('8.0xa.wtf.6'), false) - test.done() - - 'validates IPv4 addresses': (test) -> - test.equal(ipaddr.IPv4.isValid('192.168.007.0xa'), true) - test.equal(ipaddr.IPv4.isValid('1024.0.0.1'), false) - test.equal(ipaddr.IPv4.isValid('8.0xa.wtf.6'), false) - test.done() - - 'parses IPv4 in several weird formats': (test) -> - test.deepEqual(ipaddr.IPv4.parse('192.168.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('0xc0.168.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('192.0250.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('0xc0a80101').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('030052000401').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('3232235777').octets, [192, 168, 1, 1]) - test.done() - - 'barfs at invalid IPv4': (test) -> - test.throws -> - ipaddr.IPv4.parse('10.0.0.wtf') - test.done() - - 'matches IPv4 CIDR correctly': (test) -> - addr = new ipaddr.IPv4([10, 5, 0, 1]) - test.equal(addr.match(ipaddr.IPv4.parse('0.0.0.0'), 0), true) - test.equal(addr.match(ipaddr.IPv4.parse('11.0.0.0'), 8), false) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.0'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.1'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.10'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.5.5.0'), 16), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 16), false) - test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 15), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.5.0.2'), 32), false) - test.equal(addr.match(addr, 32), true) - test.done() - - 'detects reserved IPv4 networks': (test) -> - test.equal(ipaddr.IPv4.parse('10.1.0.1').range(), 'private') - test.equal(ipaddr.IPv4.parse('192.168.2.1').range(), 'private') - test.equal(ipaddr.IPv4.parse('224.100.0.1').range(), 'multicast') - test.equal(ipaddr.IPv4.parse('169.254.15.0').range(), 'linkLocal') - test.equal(ipaddr.IPv4.parse('127.1.1.1').range(), 'loopback') - test.equal(ipaddr.IPv4.parse('255.255.255.255').range(), 'broadcast') - test.equal(ipaddr.IPv4.parse('240.1.2.3').range(), 'reserved') - test.equal(ipaddr.IPv4.parse('8.8.8.8').range(), 'unicast') - test.done() - - 'can construct IPv6 from parts': (test) -> - test.doesNotThrow -> - new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.done() - - 'refuses to construct invalid IPv6': (test) -> - test.throws -> - new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 0, 1]) - test.throws -> - new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 1]) - test.done() - - 'converts IPv6 to string correctly': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.equal(addr.toNormalizedString(), '2001:db8:f53a:0:0:0:0:1') - test.equal(addr.toString(), '2001:db8:f53a::1') - test.equal(new ipaddr.IPv6([0, 0, 0, 0, 0, 0, 0, 1]).toString(), '::1') - test.equal(new ipaddr.IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]).toString(), '2001:db8::') - test.done() - - 'returns correct kind for IPv6': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.equal(addr.kind(), 'ipv6') - test.done() - - 'allows to access IPv6 address parts': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 42, 0, 1]) - test.equal(addr.parts[5], 42) - test.done() - - 'checks IPv6 address format': (test) -> - test.equal(ipaddr.IPv6.isIPv6('2001:db8:F53A::1'), true) - test.equal(ipaddr.IPv6.isIPv6('200001::1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:192.168.1.1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1:0'), false) - test.equal(ipaddr.IPv6.isIPv6('fe80::wtf'), false) - test.done() - - 'validates IPv6 addresses': (test) -> - test.equal(ipaddr.IPv6.isValid('2001:db8:F53A::1'), true) - test.equal(ipaddr.IPv6.isValid('200001::1'), false) - test.equal(ipaddr.IPv6.isValid('::ffff:192.168.1.1'), true) - test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1'), false) - test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1:0'), false) - test.equal(ipaddr.IPv6.isValid('2001:db8::F53A::1'), false) - test.equal(ipaddr.IPv6.isValid('fe80::wtf'), false) - test.done() - - 'parses IPv6 in different formats': (test) -> - test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A:0:0:0:0:1').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.deepEqual(ipaddr.IPv6.parse('fe80::10').parts, [0xfe80, 0, 0, 0, 0, 0, 0, 0x10]) - test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A::').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 0]) - test.deepEqual(ipaddr.IPv6.parse('::1').parts, [0, 0, 0, 0, 0, 0, 0, 1]) - test.deepEqual(ipaddr.IPv6.parse('::').parts, [0, 0, 0, 0, 0, 0, 0, 0]) - test.done() - - 'barfs at invalid IPv6': (test) -> - test.throws -> - ipaddr.IPv6.parse('fe80::0::1') - test.done() - - 'matches IPv6 CIDR correctly': (test) -> - addr = ipaddr.IPv6.parse('2001:db8:f53a::1') - test.equal(addr.match(ipaddr.IPv6.parse('::'), 0), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53a::1:1'), 64), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53b::1:1'), 48), false) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f531::1:1'), 44), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f500::1'), 40), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db9:f500::1'), 40), false) - test.equal(addr.match(addr, 128), true) - test.done() - - 'converts between IPv4-mapped IPv6 addresses and IPv4 addresses': (test) -> - addr = ipaddr.IPv4.parse('77.88.21.11') - mapped = addr.toIPv4MappedAddress() - test.deepEqual(mapped.parts, [0, 0, 0, 0, 0, 0xffff, 0x4d58, 0x150b]) - test.deepEqual(mapped.toIPv4Address().octets, addr.octets) - test.done() - - 'refuses to convert non-IPv4-mapped IPv6 address to IPv4 address': (test) -> - test.throws -> - ipaddr.IPv6.parse('2001:db8::1').toIPv4Address() - test.done() - - 'detects reserved IPv6 networks': (test) -> - test.equal(ipaddr.IPv6.parse('::').range(), 'unspecified') - test.equal(ipaddr.IPv6.parse('fe80::1234:5678:abcd:0123').range(), 'linkLocal') - test.equal(ipaddr.IPv6.parse('ff00::1234').range(), 'multicast') - test.equal(ipaddr.IPv6.parse('::1').range(), 'loopback') - test.equal(ipaddr.IPv6.parse('fc00::').range(), 'uniqueLocal') - test.equal(ipaddr.IPv6.parse('::ffff:192.168.1.10').range(), 'ipv4Mapped') - test.equal(ipaddr.IPv6.parse('::ffff:0:192.168.1.10').range(), 'rfc6145') - test.equal(ipaddr.IPv6.parse('64:ff9b::1234').range(), 'rfc6052') - test.equal(ipaddr.IPv6.parse('2002:1f63:45e8::1').range(), '6to4') - test.equal(ipaddr.IPv6.parse('2001::4242').range(), 'teredo') - test.equal(ipaddr.IPv6.parse('2001:db8::3210').range(), 'reserved') - test.equal(ipaddr.IPv6.parse('2001:470:8:66::1').range(), 'unicast') - test.done() - - 'is able to determine IP address type': (test) -> - test.equal(ipaddr.parse('8.8.8.8').kind(), 'ipv4') - test.equal(ipaddr.parse('2001:db8:3312::1').kind(), 'ipv6') - test.done() - - 'throws an error if tried to parse an invalid address': (test) -> - test.throws -> - ipaddr.parse('::some.nonsense') - test.done() - - 'correctly processes IPv4-mapped addresses': (test) -> - test.equal(ipaddr.process('8.8.8.8').kind(), 'ipv4') - test.equal(ipaddr.process('2001:db8:3312::1').kind(), 'ipv6') - test.equal(ipaddr.process('::ffff:192.168.1.1').kind(), 'ipv4') - test.done() - - 'correctly converts IPv6 and IPv4 addresses to byte arrays': (test) -> - test.deepEqual(ipaddr.parse('1.2.3.4').toByteArray(), - [0x1, 0x2, 0x3, 0x4]); - # Fuck yeah. The first byte of Google's IPv6 address is 42. 42! - test.deepEqual(ipaddr.parse('2a00:1450:8007::68').toByteArray(), - [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68 ]) - test.done() diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/package.json deleted file mode 100644 index e5dfcb6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/proxy-addr/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "proxy-addr", - "description": "Determine address of proxied request", - "version": "1.0.1", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "ip", - "proxy", - "x-forwarded-for" - ], - "repository": { - "type": "git", - "url": "https://github.com/expressjs/proxy-addr.git" - }, - "bugs": { - "url": "https://github.com/expressjs/proxy-addr/issues" - }, - "dependencies": { - "ipaddr.js": "0.1.2" - }, - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "istanbul": "0.2.10", - "mocha": "~1.20.0", - "should": "~4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "homepage": "https://github.com/expressjs/proxy-addr", - "_id": "proxy-addr@1.0.1", - "dist": { - "shasum": "c7c566d5eb4e3fad67eeb9c77c5558ccc39b88a8", - "tarball": "http://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.1.tgz" - }, - "_from": "proxy-addr@1.0.1", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "c7c566d5eb4e3fad67eeb9c77c5558ccc39b88a8", - "_resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.gitmodules b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.gitmodules deleted file mode 100644 index 49e31da..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "support/expresso"] - path = support/expresso - url = git://github.com/visionmedia/expresso.git -[submodule "support/should"] - path = support/should - url = git://github.com/visionmedia/should.js.git diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.npmignore deleted file mode 100644 index e85ce2a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -test -.travis.yml -benchmark.js -component.json -examples.js -History.md -Makefile diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/Readme.md deleted file mode 100644 index 27e54a4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/Readme.md +++ /dev/null @@ -1,58 +0,0 @@ -# node-querystring - - query string parser for node and the browser supporting nesting, as it was removed from `0.3.x`, so this library provides the previous and commonly desired behaviour (and twice as fast). Used by [express](http://expressjs.com), [connect](http://senchalabs.github.com/connect) and others. - -## Installation - - $ npm install qs - -## Examples - -```js -var qs = require('qs'); - -qs.parse('user[name][first]=Tobi&user[email]=tobi@learnboost.com'); -// => { user: { name: { first: 'Tobi' }, email: 'tobi@learnboost.com' } } - -qs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }}) -// => user[name]=Tobi&user[email]=tobi%40learnboost.com -``` - -## Testing - -Install dev dependencies: - - $ npm install -d - -and execute: - - $ make test - -browser: - - $ open test/browser/index.html - -## License - -(The MIT License) - -Copyright (c) 2010 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/index.js deleted file mode 100644 index b05938a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/index.js +++ /dev/null @@ -1,366 +0,0 @@ -/** - * Object#toString() ref for stringify(). - */ - -var toString = Object.prototype.toString; - -/** - * Object#hasOwnProperty ref - */ - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -/** - * Array#indexOf shim. - */ - -var indexOf = typeof Array.prototype.indexOf === 'function' - ? function(arr, el) { return arr.indexOf(el); } - : function(arr, el) { - for (var i = 0; i < arr.length; i++) { - if (arr[i] === el) return i; - } - return -1; - }; - -/** - * Array.isArray shim. - */ - -var isArray = Array.isArray || function(arr) { - return toString.call(arr) == '[object Array]'; -}; - -/** - * Object.keys shim. - */ - -var objectKeys = Object.keys || function(obj) { - var ret = []; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - ret.push(key); - } - } - return ret; -}; - -/** - * Array#forEach shim. - */ - -var forEach = typeof Array.prototype.forEach === 'function' - ? function(arr, fn) { return arr.forEach(fn); } - : function(arr, fn) { - for (var i = 0; i < arr.length; i++) fn(arr[i]); - }; - -/** - * Array#reduce shim. - */ - -var reduce = function(arr, fn, initial) { - if (typeof arr.reduce === 'function') return arr.reduce(fn, initial); - var res = initial; - for (var i = 0; i < arr.length; i++) res = fn(res, arr[i]); - return res; -}; - -/** - * 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]) { - if (hasOwnProperty.call(parent[key], i)) { - t[i] = parent[key][i]; - } - } - parent[key] = t; - return t; -} - -function parse(parts, parent, key, val) { - var part = parts.shift(); - - // illegal - if (Object.getOwnPropertyDescriptor(Object.prototype, key)) return; - - // end - if (!part) { - if (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 (isArray(obj)) { - if ('' != val) obj.push(val); - } else if ('object' == typeof obj) { - obj[objectKeys(obj).length] = val; - } else { - obj = parent[key] = [parent[key], val]; - } - // prop - } else if (~indexOf(part, ']')) { - part = part.substr(0, part.length - 1); - if (!isint.test(part) && isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - // key - } else { - if (!isint.test(part) && isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - } - } -} - -/** - * Merge parent key/val pair. - */ - -function merge(parent, key, val){ - if (~indexOf(key, ']')) { - var parts = key.split('[') - , len = parts.length - , last = len - 1; - parse(parts, parent, 'base', val); - // optimize - } else { - if (!isint.test(key) && 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; -} - -/** - * Compact sparse arrays. - */ - -function compact(obj) { - if ('object' != typeof obj) return obj; - - if (isArray(obj)) { - var ret = []; - - for (var i in obj) { - if (hasOwnProperty.call(obj, i)) { - ret.push(obj[i]); - } - } - - return ret; - } - - for (var key in obj) { - obj[key] = compact(obj[key]); - } - - return obj; -} - -/** - * Parse the given obj. - */ - -function parseObject(obj){ - var ret = { base: {} }; - - forEach(objectKeys(obj), function(name){ - merge(ret, name, obj[name]); - }); - - return compact(ret.base); -} - -/** - * Parse the given str. - */ - -function parseString(str){ - var ret = reduce(String(str).split('&'), function(ret, pair){ - var eql = indexOf(pair, '=') - , brace = lastBraceInKey(pair) - , key = pair.substr(0, brace || eql) - , val = pair.substr(brace || eql, pair.length) - , val = val.substr(indexOf(val, '=') + 1, val.length); - - // ?foo - if ('' == key) key = pair, val = ''; - if ('' == key) return ret; - - return merge(ret, decode(key), decode(val)); - }, { base: {} }).base; - - return compact(ret); -} - -/** - * 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 (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 + '=' + encodeURIComponent(String(obj)); - } -}; - -/** - * Stringify the given `str`. - * - * @param {String} str - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyString(str, prefix) { - if (!prefix) throw new TypeError('stringify expects an object'); - return prefix + '=' + encodeURIComponent(str); -} - -/** - * Stringify the given `arr`. - * - * @param {Array} arr - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyArray(arr, prefix) { - var ret = []; - if (!prefix) throw new TypeError('stringify expects an object'); - for (var i = 0; i < arr.length; i++) { - ret.push(stringify(arr[i], prefix + '[' + i + ']')); - } - return ret.join('&'); -} - -/** - * Stringify the given `obj`. - * - * @param {Object} obj - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyObject(obj, prefix) { - var ret = [] - , keys = objectKeys(obj) - , key; - - for (var i = 0, len = keys.length; i < len; ++i) { - key = keys[i]; - if ('' == key) continue; - if (null == obj[key]) { - ret.push(encodeURIComponent(key) + '='); - } else { - 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 (Object.getOwnPropertyDescriptor(Object.prototype, key)) return; - if (undefined === v) { - obj[key] = val; - } else if (isArray(v)) { - v.push(val); - } else { - obj[key] = [v, val]; - } -} - -/** - * Locate last brace in `str` within the key. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function lastBraceInKey(str) { - var len = str.length - , brace - , c; - for (var i = 0; i < len; ++i) { - c = str[i]; - if (']' == c) brace = false; - if ('[' == c) brace = true; - if ('=' == c && !brace) return i; - } -} - -/** - * Decode `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -function decode(str) { - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (err) { - return str; - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/package.json deleted file mode 100644 index 3568353..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/qs/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "qs", - "description": "querystring parser", - "version": "0.6.6", - "keywords": [ - "query string", - "parser", - "component" - ], - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/node-querystring.git" - }, - "devDependencies": { - "mocha": "*", - "expect.js": "*" - }, - "scripts": { - "test": "make test" - }, - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "main": "index", - "engines": { - "node": "*" - }, - "bugs": { - "url": "https://github.com/visionmedia/node-querystring/issues" - }, - "_id": "qs@0.6.6", - "dist": { - "shasum": "6e015098ff51968b8a3c819001d5f2c89bc4b107", - "tarball": "http://registry.npmjs.org/qs/-/qs-0.6.6.tgz" - }, - "_from": "qs@0.6.6", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "6e015098ff51968b8a3c819001d5f2c89bc4b107", - "_resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/visionmedia/node-querystring" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/History.md deleted file mode 100644 index b35ba51..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/History.md +++ /dev/null @@ -1,21 +0,0 @@ - -1.0.0 / 2013-12-11 -================== - - * add repository to package.json - * add MIT license - -0.0.4 / 2012-06-17 -================== - - * changed: ret -1 for unsatisfiable and -2 when invalid - -0.0.3 / 2012-06-17 -================== - - * fix last-byte-pos default to len - 1 - -0.0.2 / 2012-06-14 -================== - - * add `.type` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Readme.md deleted file mode 100644 index cb30a5a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/Readme.md +++ /dev/null @@ -1,53 +0,0 @@ - -# node-range-parser - - Range header field parser. - -## Example: - -```js -assert(-1 == parse(200, 'bytes=500-20')); -assert(-2 == parse(200, 'bytes=malformed')); -parse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }])); -parse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }])); -parse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }])); -parse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }])); -parse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }])); -parse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }])); -parse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }])); -parse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }])); -parse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }])); -``` - -## Installation - -``` -$ npm install range-parser -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/index.js deleted file mode 100644 index 9b0f7a8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/index.js +++ /dev/null @@ -1,49 +0,0 @@ - -/** - * Parse "Range" header `str` relative to the given file `size`. - * - * @param {Number} size - * @param {String} str - * @return {Array} - * @api public - */ - -module.exports = function(size, str){ - var valid = true; - var i = str.indexOf('='); - - if (-1 == i) return -2; - - var arr = str.slice(i + 1).split(',').map(function(range){ - var range = range.split('-') - , start = parseInt(range[0], 10) - , end = parseInt(range[1], 10); - - // -nnn - if (isNaN(start)) { - start = size - end; - end = size - 1; - // nnn- - } else if (isNaN(end)) { - end = size - 1; - } - - // limit last-byte-pos to current length - if (end > size - 1) end = size - 1; - - // invalid - if (isNaN(start) - || isNaN(end) - || start > end - || start < 0) valid = false; - - return { - start: start, - end: end - }; - }); - - arr.type = str.slice(0, i); - - return valid ? arr : -1; -}; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/package.json deleted file mode 100644 index 568c0f1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/range-parser/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "range-parser", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "Range header field string parser", - "version": "1.0.0", - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-range-parser.git" - }, - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/visionmedia/node-range-parser#license" - } - ], - "bugs": { - "url": "https://github.com/visionmedia/node-range-parser/issues" - }, - "_id": "range-parser@1.0.0", - "dist": { - "shasum": "a4b264cfe0be5ce36abe3765ac9c2a248746dbc0", - "tarball": "http://registry.npmjs.org/range-parser/-/range-parser-1.0.0.tgz" - }, - "_from": "range-parser@1.0.0", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "a4b264cfe0be5ce36abe3765ac9c2a248746dbc0", - "_resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.0.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/visionmedia/node-range-parser" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/.npmignore deleted file mode 100644 index 223570e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -coverage -test -examples -.travis.yml -*.sock diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/History.md deleted file mode 100644 index 9cf4069..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/History.md +++ /dev/null @@ -1,137 +0,0 @@ -0.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -0.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -0.7.0 / 2014-07-20 -================== - - * Deprecate `hidden` option; use `dotfiles` option - * Add `dotfiles` option - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - -0.6.0 / 2014-07-11 -================== - - * Deprecate `from` option; use `root` option - * Deprecate `send.etag()` -- use `etag` in `options` - * Deprecate `send.hidden()` -- use `hidden` in `options` - * Deprecate `send.index()` -- use `index` in `options` - * Deprecate `send.maxage()` -- use `maxAge` in `options` - * Deprecate `send.root()` -- use `root` in `options` - * Cap `maxAge` value to 1 year - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.5.0 / 2014-06-28 -================== - - * Accept string for `maxAge` (converted by `ms`) - * Add `headers` event - * Include link in default redirect response - * Use `EventEmitter.listenerCount` to count listeners - -0.4.3 / 2014-06-11 -================== - - * Do not throw un-catchable error on file open race condition - * Use `escape-html` for HTML escaping - * deps: debug@1.0.2 - - fix some debugging output colors on node.js 0.8 - * deps: finished@1.2.2 - * deps: fresh@0.2.2 - -0.4.2 / 2014-06-09 -================== - - * fix "event emitter leak" warnings - * deps: debug@1.0.1 - * deps: finished@1.2.1 - -0.4.1 / 2014-06-02 -================== - - * Send `max-age` in `Cache-Control` in correct format - -0.4.0 / 2014-05-27 -================== - - * Calculate ETag with md5 for reduced collisions - * Fix wrong behavior when index file matches directory - * Ignore stream errors after request ends - - Goodbye `EBADF, read` - * Skip directories in index file search - * deps: debug@0.8.1 - -0.3.0 / 2014-04-24 -================== - - * Fix sending files with dots without root set - * Coerce option types - * Accept API options in options object - * Set etags to "weak" - * Include file path in etag - * Make "Can't set headers after they are sent." catchable - * Send full entity-body for multi range requests - * Default directory access to 403 when index disabled - * Support multiple index paths - * Support "If-Range" header - * Control whether to generate etags - * deps: mime@1.2.11 - -0.2.0 / 2014-01-29 -================== - - * update range-parser and fresh - -0.1.4 / 2013-08-11 -================== - - * update fresh - -0.1.3 / 2013-07-08 -================== - - * Revert "Fix fd leak" - -0.1.2 / 2013-07-03 -================== - - * Fix fd leak - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/Readme.md deleted file mode 100644 index 5eceeef..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/Readme.md +++ /dev/null @@ -1,159 +0,0 @@ -# send - -[![NPM version](https://badge.fury.io/js/send.svg)](https://badge.fury.io/js/send) -[![Build Status](https://travis-ci.org/visionmedia/send.svg?branch=master)](https://travis-ci.org/visionmedia/send) -[![Coverage Status](https://img.shields.io/coveralls/visionmedia/send.svg?branch=master)](https://coveralls.io/r/visionmedia/send) - - Send is Connect's `static()` extracted for generalized use, a streaming static file - server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework. - -## Installation - - $ npm install send - -## Examples - - Small: - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - send(req, req.url).pipe(res); -}).listen(3000); -``` - - Serving from a root directory with custom error-handling: - -```js -var http = require('http'); -var send = require('send'); -var url = require('url'); - -var app = http.createServer(function(req, res){ - // your custom error-handling logic: - function error(err) { - res.statusCode = err.status || 500; - res.end(err.message); - } - - // your custom headers - function headers(res, path, stat) { - // serve all files for download - res.setHeader('Content-Disposition', 'attachment'); - } - - // your custom directory handling logic: - function redirect() { - res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, url.parse(req.url).pathname, {root: '/www/example.com/public'}) - .on('error', error) - .on('directory', redirect) - .on('headers', headers) - .pipe(res); -}).listen(3000); -``` - -## API - -### Options - -#### etag - - Enable or disable etag generation, defaults to true. - -#### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file - or directory that begins with a dot ("."). Note this check is done on - the path itself without checking if the path actually exists on the - disk. If `root` is specified, only the dotfiles above the root are - checked (i.e. the root itself can be within a dotfile when when set - to "deny"). - - The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and 404. - -#### index - - By default send supports "index.html" files, to disable this - set `false` or to supply a new index pass a string or an array - in preferred order. - -#### maxAge - - Provide a max-age in milliseconds for http caching, defaults to 0. - This can also be a string accepted by the - [ms](https://www.npmjs.org/package/ms#readme) module. - -#### root - - Serve files relative to `path`. - -### Events - - - `error` an error occurred `(err)` - - `directory` a directory was requested - - `file` a file was requested `(path, stat)` - - `headers` the headers are about to be set on a file `(res, path, stat)` - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -## Error-handling - - By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc. - -## Caching - - It does _not_ perform internal caching, you should use a reverse proxy cache such - as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;). - -## Debugging - - To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ npm test -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/index.js deleted file mode 100644 index 51b2b57..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/send'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/send.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/send.js deleted file mode 100644 index 1e71b58..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/send.js +++ /dev/null @@ -1,711 +0,0 @@ - -/** - * Module dependencies. - */ - -var debug = require('debug')('send') -var deprecate = require('depd')('send') -var escapeHtml = require('escape-html') - , parseRange = require('range-parser') - , Stream = require('stream') - , mime = require('mime') - , fresh = require('fresh') - , path = require('path') - , http = require('http') - , onFinished = require('finished') - , fs = require('fs') - , normalize = path.normalize - , join = path.join - , utils = require('./utils'); -var EventEmitter = require('events').EventEmitter; -var ms = require('ms'); - -/** - * Variables. - */ -var maxMaxAge = 60 * 60 * 24 * 365 * 1000; // 1 year -var resolve = path.resolve -var sep = path.sep -var upPathRegexp = /(?:^|[\\\/])\.\.(?:[\\\/]|$)/ - -/** - * Expose `send`. - */ - -exports = module.exports = send; - -/** - * Expose mime module. - */ - -exports.mime = mime; - -/** - * Shim EventEmitter.listenerCount for node.js < 0.10 - */ - -/* istanbul ignore next */ -var listenerCount = EventEmitter.listenerCount - || function(emitter, type){ return emitter.listeners(type).length; }; - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @return {SendStream} - * @api public - */ - -function send(req, path, options) { - return new SendStream(req, path, options); -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @api private - */ - -function SendStream(req, path, options) { - var self = this; - options = options || {}; - this.req = req; - this.path = path; - this.options = options; - - this._etag = options.etag !== undefined - ? Boolean(options.etag) - : true - - this._dotfiles = options.dotfiles !== undefined - ? options.dotfiles - : 'ignore' - - if (['allow', 'deny', 'ignore'].indexOf(this._dotfiles) === -1) { - throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') - } - - this._hidden = Boolean(options.hidden) - - if ('hidden' in options) { - deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') - } - - // legacy support - if (!('dotfiles' in options)) { - this._dotfiles = undefined - } - - this._index = options.index !== undefined - ? normalizeIndex(options.index) - : ['index.html'] - - this._maxage = options.maxAge || options.maxage - this._maxage = typeof this._maxage === 'string' - ? ms(this._maxage) - : Number(this._maxage) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), maxMaxAge) - : 0 - - this._root = options.root - ? resolve(options.root) - : null - - if (!this._root && options.from) { - this.from(options.from); - } -} - -/** - * Inherits from `Stream.prototype`. - */ - -SendStream.prototype.__proto__ = Stream.prototype; - -/** - * Enable or disable etag generation. - * - * @param {Boolean} val - * @return {SendStream} - * @api public - */ - -SendStream.prototype.etag = deprecate.function(function etag(val) { - val = Boolean(val); - debug('etag %s', val); - this._etag = val; - return this; -}, 'send.etag: pass etag as option'); - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = deprecate.function(function hidden(val) { - val = Boolean(val); - debug('hidden %s', val); - this._hidden = val; - this._dotfiles = undefined - return this; -}, 'send.hidden: use dotfiles option'); - -/** - * Set index `paths`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean|Array} paths - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = deprecate.function(function index(paths) { - var index = !paths ? [] : normalizeIndex(paths); - debug('index %o', paths); - this._index = index; - return this; -}, 'send.index: pass index as option'); - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = function(path){ - path = String(path); - this._root = resolve(path) - return this; -}; - -SendStream.prototype.from = deprecate.function(SendStream.prototype.root, - 'send.from: pass root as option'); - -SendStream.prototype.root = deprecate.function(SendStream.prototype.root, - 'send.root: pass root as option'); - -/** - * Set max-age to `maxAge`. - * - * @param {Number} maxAge - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = deprecate.function(function maxage(maxAge) { - maxAge = typeof maxAge === 'string' - ? ms(maxAge) - : Number(maxAge); - if (isNaN(maxAge)) maxAge = 0; - if (Infinity == maxAge) maxAge = 60 * 60 * 24 * 365 * 1000; - debug('max-age %d', maxAge); - this._maxage = maxAge; - return this; -}, 'send.maxage: pass maxAge as option'); - -/** - * Emit error with `status`. - * - * @param {Number} status - * @api private - */ - -SendStream.prototype.error = function(status, err){ - var res = this.res; - var msg = http.STATUS_CODES[status]; - - err = err || new Error(msg); - err.status = status; - - // emit if listeners instead of responding - if (listenerCount(this, 'error') !== 0) { - return this.emit('error', err); - } - - // wipe all existing headers - res._headers = undefined; - - res.statusCode = err.status; - res.end(msg); -}; - -/** - * Check if the pathname ends with "/". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasTrailingSlash = function(){ - return '/' == this.path[this.path.length - 1]; -}; - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function(){ - return this.req.headers['if-none-match'] - || this.req.headers['if-modified-since']; -}; - -/** - * Strip content-* header fields. - * - * @api private - */ - -SendStream.prototype.removeContentHeaderFields = function(){ - var res = this.res; - Object.keys(res._headers).forEach(function(field){ - if (0 == field.indexOf('content')) { - res.removeHeader(field); - } - }); -}; - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function(){ - var res = this.res; - debug('not modified'); - this.removeContentHeaderFields(); - res.statusCode = 304; - res.end(); -}; - -/** - * Raise error that headers already sent. - * - * @api private - */ - -SendStream.prototype.headersAlreadySent = function headersAlreadySent(){ - var err = new Error('Can\'t set headers after they are sent.'); - debug('headers already sent'); - this.error(500, err); -}; - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function(){ - var res = this.res; - return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; -}; - -/** - * Handle stat() error. - * - * @param {Error} err - * @api private - */ - -SendStream.prototype.onStatError = function(err){ - var notfound = ['ENOENT', 'ENAMETOOLONG', 'ENOTDIR']; - if (~notfound.indexOf(err.code)) return this.error(404, err); - this.error(500, err); -}; - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function(){ - return fresh(this.req.headers, this.res._headers); -}; - -/** - * Check if the range is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isRangeFresh = function isRangeFresh(){ - var ifRange = this.req.headers['if-range']; - - if (!ifRange) return true; - - return ~ifRange.indexOf('"') - ? ~ifRange.indexOf(this.res._headers['etag']) - : Date.parse(this.res._headers['last-modified']) <= Date.parse(ifRange); -}; - -/** - * Redirect to `path`. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.redirect = function(path){ - if (listenerCount(this, 'directory') !== 0) { - return this.emit('directory'); - } - - if (this.hasTrailingSlash()) return this.error(403); - var res = this.res; - path += '/'; - res.statusCode = 301; - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.setHeader('Location', path); - res.end('Redirecting to ' + escapeHtml(path) + '\n'); -}; - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function(res){ - var self = this - , args = arguments - , root = this._root; - - // references - this.res = res; - - // decode the path - var path = utils.decode(this.path) - if (path === -1) return this.error(400) - - // null byte(s) - if (~path.indexOf('\0')) return this.error(400); - - var parts - if (root !== null) { - // join / normalize from optional root dir - path = normalize(join(root, path)) - - // malicious path - if (path.substr(0, root.length) !== root) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = path.substr(root.length + 1).split(sep) - } else { - // ".." is malicious without "root" - if (upPathRegexp.test(path)) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = normalize(path).split(sep) - - // resolve the path - path = resolve(path) - } - - // dotfile handling - if (containsDotFile(parts)) { - var access = this._dotfiles - - // legacy support - if (access === undefined) { - access = parts[parts.length - 1][0] === '.' - ? (this._hidden ? 'allow' : 'ignore') - : 'allow' - } - - debug('%s dotfile "%s"', access, path) - switch (access) { - case 'allow': - break - case 'deny': - return this.error(403) - case 'ignore': - default: - return this.error(404) - } - } - - // index file support - if (this._index.length && this.hasTrailingSlash()) { - this.sendIndex(path); - return res; - } - - debug('stat "%s"', path); - fs.stat(path, function(err, stat){ - if (err) return self.onStatError(err); - if (stat.isDirectory()) return self.redirect(self.path); - self.emit('file', path, stat); - self.send(path, stat); - }); - - return res; -}; - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function(path, stat){ - var options = this.options; - var len = stat.size; - var res = this.res; - var req = this.req; - var ranges = req.headers.range; - var offset = options.start || 0; - - if (res._header) { - // impossible to send now - return this.headersAlreadySent(); - } - - debug('pipe "%s"', path) - - // set header fields - this.setHeader(path, stat); - - // set content-type - this.type(path); - - // conditional GET support - if (this.isConditionalGET() - && this.isCachable() - && this.isFresh()) { - return this.notModified(); - } - - // adjust len to start/end options - len = Math.max(0, len - offset); - if (options.end !== undefined) { - var bytes = options.end - offset + 1; - if (len > bytes) len = bytes; - } - - // Range support - if (ranges) { - ranges = parseRange(len, ranges); - - // If-Range support - if (!this.isRangeFresh()) { - debug('range stale'); - ranges = -2; - } - - // unsatisfiable - if (-1 == ranges) { - debug('range unsatisfiable'); - res.setHeader('Content-Range', 'bytes */' + stat.size); - return this.error(416); - } - - // valid (syntactically invalid/multiple ranges are treated as a regular response) - if (-2 != ranges && ranges.length === 1) { - debug('range %j', ranges); - - options.start = offset + ranges[0].start; - options.end = offset + ranges[0].end; - - // Content-Range - res.statusCode = 206; - res.setHeader('Content-Range', 'bytes ' - + ranges[0].start - + '-' - + ranges[0].end - + '/' - + len); - len = options.end - options.start + 1; - } - } - - // content-length - res.setHeader('Content-Length', len); - - // HEAD support - if ('HEAD' == req.method) return res.end(); - - this.stream(path, options); -}; - -/** - * Transfer index for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendIndex = function sendIndex(path){ - var i = -1; - var self = this; - - function next(err){ - if (++i >= self._index.length) { - if (err) return self.onStatError(err); - return self.error(404); - } - - var p = path + self._index[i]; - - debug('stat "%s"', p); - fs.stat(p, function(err, stat){ - if (err) return next(err); - if (stat.isDirectory()) return next(); - self.emit('file', p, stat); - self.send(p, stat); - }); - } - - if (!this.hasTrailingSlash()) path += '/'; - - next(); -}; - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function(path, options){ - // TODO: this is all lame, refactor meeee - var finished = false; - var self = this; - var res = this.res; - var req = this.req; - - // pipe - var stream = fs.createReadStream(path, options); - this.emit('stream', stream); - stream.pipe(res); - - // response finished, done with the fd - onFinished(res, function onfinished(){ - finished = true; - stream.destroy(); - }); - - // error handling code-smell - stream.on('error', function onerror(err){ - // request already finished - if (finished) return; - - // clean up stream - finished = true; - stream.destroy(); - - // no hope in responding - if (res._header) { - console.error(err.stack); - req.destroy(); - return; - } - - // error - self.onStatError(err); - }); - - // end - stream.on('end', function onend(){ - self.emit('end'); - }); -}; - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function(path){ - var res = this.res; - if (res.getHeader('Content-Type')) return; - var type = mime.lookup(path); - var charset = mime.charsets.lookup(type); - debug('content-type %s', type); - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); -}; - -/** - * Set response header fields, most - * fields may be pre-defined. - * - * @param {String} path - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function setHeader(path, stat){ - var res = this.res; - - this.emit('headers', res, path, stat); - - if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); - if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString()); - if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + Math.floor(this._maxage / 1000)); - if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString()); - - if (this._etag && !res.getHeader('ETag')) { - var etag = utils.etag(path, stat); - debug('etag %s', etag); - res.setHeader('ETag', etag); - } -}; - -/** - * Determine if path parts contain a dotfile. - * - * @api private - */ - -function containsDotFile(parts) { - for (var i = 0; i < parts.length; i++) { - if (parts[i][0] === '.') { - return true - } - } - - return false -} - -/** - * Normalize the index option into an array. - * - * @param {boolean|string|array} val - * @api private - */ - -function normalizeIndex(val){ - return [].concat(val || []) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/utils.js deleted file mode 100644 index 3a88bf9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/lib/utils.js +++ /dev/null @@ -1,42 +0,0 @@ - -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Return a weak ETag from the given `path` and `stat`. - * - * @param {String} path - * @param {Object} stat - * @return {String} - * @api private - */ - -exports.etag = function etag(path, stat) { - var tag = String(stat.mtime.getTime()) + ':' + String(stat.size) + ':' + path; - var str = crypto - .createHash('md5') - .update(tag, 'utf8') - .digest('base64'); - return 'W/"' + str + '"'; -}; - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -exports.decode = function(path){ - try { - return decodeURIComponent(path); - } catch (err) { - return -1; - } -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md deleted file mode 100644 index 8937250..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md +++ /dev/null @@ -1,50 +0,0 @@ -1.2.2 / 2014-06-10 -========== - - * reduce listeners added to emitters - - avoids "event emitter leak" warnings when used multiple times on same request - -1.2.1 / 2014-06-08 -================== - - * fix returned value when already finished - -1.2.0 / 2014-06-05 -================== - - * call callback when called on already-finished socket - -1.1.4 / 2014-05-27 -================== - - * support node.js 0.8 - -1.1.3 / 2014-04-30 -================== - - * make sure errors passed as instanceof `Error` - -1.1.2 / 2014-04-18 -================== - - * default the `socket` to passed-in object - -1.1.1 / 2014-01-16 -================== - - * rename module to `finished` - -1.1.0 / 2013-12-25 -================== - - * call callback when called on already-errored socket - -1.0.1 / 2013-12-20 -================== - - * actually pass the error to the callback - -1.0.0 / 2013-12-20 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/README.md deleted file mode 100644 index 79facd5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# finished - -[![NPM Version](https://badge.fury.io/js/finished.svg)](http://badge.fury.io/js/finished) -[![Build Status](https://travis-ci.org/expressjs/finished.svg?branch=master)](https://travis-ci.org/expressjs/finished) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/finished.svg?branch=master)](https://coveralls.io/r/expressjs/finished) - -Execute a callback when a request closes, finishes, or errors. - -#### Install - -```sh -$ npm install finished -``` - -#### Uses - -This is useful for cleaning up streams. For example, you want to destroy any file streams you create on socket errors otherwise you will leak file descriptors. - -This is required to fix what many perceive as issues with node's streams. Relevant: - -- [node#6041](https://github.com/joyent/node/issues/6041) -- [koa#184](https://github.com/koajs/koa/issues/184) -- [koa#165](https://github.com/koajs/koa/issues/165) - -## API - -### finished(response, callback) - -```js -var onFinished = require('finished') - -onFinished(res, function (err) { - // do something maybe -}) -``` - -### Examples - -The following code ensures that file descriptors are always closed once the response finishes. - -#### Node / Connect / Express - -```js -var onFinished = require('finished') - -function (req, res, next) { - var stream = fs.createReadStream('thingie.json') - stream.pipe(res) - onFinished(res, function (err) { - stream.destroy() - }) -} -``` - -#### Koa - -```js -function* () { - var stream = this.body = fs.createReadStream('thingie.json') - onFinished(this, function (err) { - stream.destroy() - }) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/index.js deleted file mode 100644 index 90709d4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/index.js +++ /dev/null @@ -1,62 +0,0 @@ -/*! - * finished - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** -* Module dependencies. -*/ - -var first = require('ee-first') - -/** -* Variables. -*/ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Invoke callback when the response has finished, useful for - * cleaning up resources afterwards. - * - * @param {object} thingie - * @param {function} callback - * @return {object} - * @api public - */ - -module.exports = function finished(thingie, callback) { - var socket = thingie.socket || thingie - var res = thingie.res || thingie - - if (res.finished || !socket.writable) { - defer(callback) - return thingie - } - - var listener = res.__onFinished - - // create a private single listener with queue - if (!listener || !listener.queue) { - listener = res.__onFinished = function onFinished(err) { - if (res.__onFinished === listener) res.__onFinished = null - var queue = listener.queue || [] - while (queue.length) queue.shift()(err) - } - listener.queue = [] - - // finished on first event - first([ - [socket, 'error', 'close'], - [res, 'finish'], - ], listener) - } - - listener.queue.push(callback) - - return thingie -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore deleted file mode 100644 index 72921ab..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.DS_Store* -node_modules diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md deleted file mode 100644 index 7eae173..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -# EE First - -Get the first event in a set of event emitters and event pairs, -then clean up after itself. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js deleted file mode 100644 index d0c48c9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js +++ /dev/null @@ -1,60 +0,0 @@ - -module.exports = function first(stuff, done) { - if (!Array.isArray(stuff)) - throw new TypeError('arg must be an array of [ee, events...] arrays') - - var cleanups = [] - - for (var i = 0; i < stuff.length; i++) { - var arr = stuff[i] - - if (!Array.isArray(arr) || arr.length < 2) - throw new TypeError('each array member must be [ee, events...]') - - var ee = arr[0] - - for (var j = 1; j < arr.length; j++) { - var event = arr[j] - var fn = listener(event, cleanup) - - // listen to the event - ee.on(event, fn) - // push this listener to the list of cleanups - cleanups.push({ - ee: ee, - event: event, - fn: fn, - }) - } - } - - return function (fn) { - done = fn - } - - function cleanup() { - var x - for (var i = 0; i < cleanups.length; i++) { - x = cleanups[i] - x.ee.removeListener(x.event, x.fn) - } - done.apply(null, arguments) - } -} - -function listener(event, done) { - return function onevent(arg1) { - var args = new Array(arguments.length) - var ee = this - var err = event === 'error' - ? arg1 - : null - - // copy args to prevent arguments escaping scope - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - done(err, ee, event, args) - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json deleted file mode 100644 index 1f82e3e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "ee-first", - "description": "return the first event in a set of ee/event pairs", - "version": "1.0.3", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/jonathanong/ee-first" - }, - "devDependencies": { - "mocha": "1" - }, - "scripts": { - "test": "mocha --reporter spec" - }, - "bugs": { - "url": "https://github.com/jonathanong/ee-first/issues" - }, - "homepage": "https://github.com/jonathanong/ee-first", - "_id": "ee-first@1.0.3", - "_shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "_from": "ee-first@1.0.3", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "tarball": "http://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js deleted file mode 100644 index adff984..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js +++ /dev/null @@ -1,60 +0,0 @@ - -var EventEmitter = require('events').EventEmitter -var assert = require('assert') - -var first = require('./') - -describe('first', function () { - var ee1 = new EventEmitter() - var ee2 = new EventEmitter() - var ee3 = new EventEmitter() - - it('should emit the first event', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - assert.equal(ee, ee2) - assert.equal(event, 'b') - assert.deepEqual(args, [1, 2, 3]) - done() - }) - - ee2.emit('b', 1, 2, 3) - }) - - it('it should return an error if event === error', function (done) { - first([ - [ee1, 'error', 'b', 'c'], - [ee2, 'error', 'b', 'c'], - [ee3, 'error', 'b', 'c'], - ], function (err, ee, event, args) { - assert.equal(err.message, 'boom') - assert.equal(ee, ee3) - assert.equal(event, 'error') - done() - }) - - ee3.emit('error', new Error('boom')) - }) - - it('should cleanup after itself', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - ;[ee1, ee2, ee3].forEach(function (ee) { - ['a', 'b', 'c'].forEach(function (event) { - assert(!ee.listeners(event).length) - }) - }) - done() - }) - - ee1.emit('a') - }) -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/package.json deleted file mode 100644 index b645a74..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/finished/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "finished", - "description": "Execute a callback when a request closes, finishes, or errors", - "version": "1.2.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/finished" - }, - "dependencies": { - "ee-first": "1.0.3" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.1", - "should": "~4.0.1" - }, - "engine": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/finished/issues" - }, - "homepage": "https://github.com/expressjs/finished", - "_id": "finished@1.2.2", - "_shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "_from": "finished@1.2.2", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "tarball": "http://registry.npmjs.org/finished/-/finished-1.2.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/README.md deleted file mode 100644 index 6ca19bd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.default_type -Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/mime.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/mime.js deleted file mode 100644 index 48be0c5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/mime.js +++ /dev/null @@ -1,114 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - if (process.env.DEBUG_MIME && this.types[exts]) { - console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + - this.types[exts] + ' to ' + type); - } - - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - - this._loading = file; - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); - - this._loading = null; -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); - return this.extensions[type]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -}; - -module.exports = mime; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/package.json deleted file mode 100644 index 917e6af..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.2.11", - "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g.\n\n var mime = require('mime');\n\n mime.lookup('/path/to/file.txt'); // => 'text/plain'\n mime.lookup('file.txt'); // => 'text/plain'\n mime.lookup('.TXT'); // => 'text/plain'\n mime.lookup('htm'); // => 'text/html'\n\n### mime.default_type\nSets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)\n\n### mime.extension(type)\nGet the default extension for `type`\n\n mime.extension('text/html'); // => 'html'\n mime.extension('application/octet-stream'); // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n mime.charsets.lookup('text/plain'); // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n mime.define({\n 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n 'application/x-my-type': ['x-mt', 'x-mtt'],\n // etc ...\n });\n\n mime.lookup('x-sft'); // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n mime.load('./my_project.types');\n\nThe .types file format is simple - See the `types` dir for examples.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/broofa/node-mime/issues" - }, - "_id": "mime@1.2.11", - "dist": { - "shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "tarball": "http://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - }, - "_from": "mime@1.2.11", - "_npmVersion": "1.3.6", - "_npmUser": { - "name": "broofa", - "email": "robert@broofa.com" - }, - "maintainers": [ - { - "name": "broofa", - "email": "robert@broofa.com" - }, - { - "name": "bentomas", - "email": "benjamin@benjaminthomas.org" - } - ], - "directories": {}, - "_shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "_resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "homepage": "https://github.com/broofa/node-mime" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/test.js deleted file mode 100644 index 2cda1c7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/test.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); -var path = require('path'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); // normal file -eq('text/plain', mime.lookup('TEXT.TXT')); // uppercase -eq('text/plain', mime.lookup('dir/text.txt')); // dir + file -eq('text/plain', mime.lookup('.text.txt')); // hidden file -eq('text/plain', mime.lookup('.txt')); // nameless -eq('text/plain', mime.lookup('txt')); // extension-only -eq('text/plain', mime.lookup('/txt')); // extension-less () -eq('text/plain', mime.lookup('\\txt')); // Windows, extension-less -eq('application/octet-stream', mime.lookup('text.nope')); // unrecognized -eq('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq('bin', mime.extension('application/octet-stream ')); -eq('html', mime.extension(' text/html; charset=UTF-8')); -eq('html', mime.extension('text/html; charset=UTF-8 ')); -eq('html', mime.extension('text/html; charset=UTF-8')); -eq('html', mime.extension('text/html ; charset=UTF-8')); -eq('html', mime.extension('text/html;charset=UTF-8')); -eq('html', mime.extension('text/Html;charset=UTF-8')); -eq(undefined, mime.extension('unrecognized')); - -// -// Test node.types lookups -// - -eq('application/font-woff', mime.lookup('file.woff')); -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); -eq('font/opentype', mime.lookup('file.otf')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -// -// Test for overlaps between mime.types and node.types -// - -var apacheTypes = new mime.Mime(), nodeTypes = new mime.Mime(); -apacheTypes.load(path.join(__dirname, 'types/mime.types')); -nodeTypes.load(path.join(__dirname, 'types/node.types')); - -var keys = [].concat(Object.keys(apacheTypes.types)) - .concat(Object.keys(nodeTypes.types)); -keys.sort(); -for (var i = 1; i < keys.length; i++) { - if (keys[i] == keys[i-1]) { - console.warn('Warning: ' + - 'node.types defines ' + keys[i] + '->' + nodeTypes.types[keys[i]] + - ', mime.types defines ' + keys[i] + '->' + apacheTypes.types[keys[i]]); - } -} - -console.log('\nOK'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/mime.types b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/mime.types deleted file mode 100644 index da8cd69..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/node.types b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/node.types deleted file mode 100644 index 55b2cf7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/mime/types/node.types +++ /dev/null @@ -1,77 +0,0 @@ -# What: WebVTT -# Why: To allow formats intended for marking up external text track resources. -# http://dev.w3.org/html5/webvtt/ -# Added by: niftylettuce -text/vtt vtt - -# 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: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifes ('.manifest' extension) -# 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 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: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp - -# What: Lua file types -# Why: Googling around shows de-facto consensus on these -# Added by: creationix (Issue #45) -text/x-lua lua -application/x-lua-bytecode luac - -# What: Markdown files, as per http://daringfireball.net/projects/markdown/syntax -# Why: http://stackoverflow.com/questions/10701983/what-is-the-mime-type-for-markdown -# Added by: avoidwork -text/x-markdown markdown md mkd - -# What: ini files -# Why: because they're just text files -# Added by: Matthew Kastor -text/plain ini - -# What: DASH Adaptive Streaming manifest -# Why: https://developer.mozilla.org/en-US/docs/DASH_Adaptive_Streaming_for_HTML_5_Video -# Added by: eelcocramer -application/dash+xml mdp - -# What: OpenType font files - http://www.microsoft.com/typography/otspec/ -# Why: Browsers usually ignore the font MIME types and sniff the content, -# but Chrome, shows a warning if OpenType fonts aren't served with -# the `font/opentype` MIME type: http://i.imgur.com/8c5RN8M.png. -# Added by: alrra -font/opentype otf diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/README.md deleted file mode 100644 index d4ab12a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours', { long: true })) // "10 hours" -``` - -- Node/Browser compatible. Published as `ms` in NPM. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/index.js deleted file mode 100644 index c5847f8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/package.json deleted file mode 100644 index c4dd654..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/node_modules/ms/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "ms", - "version": "0.6.2", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "readme": "# ms.js: miliseconds conversion utility\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('100') // 100\n```\n\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(ms('10 hours', { long: true })) // \"10 hours\"\n```\n\n- Node/Browser compatible. Published as `ms` in NPM.\n- If a number is supplied to `ms`, a string with a unit is returned.\n- If a string that contains the number is supplied, it returns it as\na number (e.g: it returns `100` for `'100'`).\n- If you pass a string with a number and a valid unit, the number of\nequivalent ms is returned.\n\n## License\n\nMIT", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "_id": "ms@0.6.2", - "dist": { - "shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - }, - "_from": "ms@0.6.2", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "directories": {}, - "_shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "homepage": "https://github.com/guille/ms.js" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/package.json deleted file mode 100644 index bb1dd7a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/send/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "send", - "description": "Better streaming static file server with Range and conditional-GET support", - "version": "0.7.2", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/send" - }, - "keywords": [ - "static", - "file", - "server" - ], - "dependencies": { - "debug": "1.0.4", - "depd": "0.4.4", - "escape-html": "1.0.1", - "finished": "1.2.2", - "fresh": "0.2.2", - "mime": "1.2.11", - "ms": "0.6.2", - "range-parser": "~1.0.0" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.0", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --check-leaks --reporter spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec" - }, - "bugs": { - "url": "https://github.com/visionmedia/send/issues" - }, - "homepage": "https://github.com/visionmedia/send", - "_id": "send@0.7.2", - "dist": { - "shasum": "3b5f696f701d56fe115b860cc6b3f0cdbfbf7804", - "tarball": "http://registry.npmjs.org/send/-/send-0.7.2.tgz" - }, - "_from": "send@0.7.2", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "3b5f696f701d56fe115b860cc6b3f0cdbfbf7804", - "_resolved": "https://registry.npmjs.org/send/-/send-0.7.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/History.md deleted file mode 100644 index 36f430d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/History.md +++ /dev/null @@ -1,117 +0,0 @@ -1.4.3 / 2014-07-29 -================== - - * deps: send@0.7.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - -1.4.2 / 2014-07-27 -================== - - * deps: send@0.7.2 - - deps: depd@0.4.4 - -1.4.1 / 2014-07-26 -================== - - * deps: send@0.7.1 - - deps: depd@0.4.3 - -1.4.0 / 2014-07-21 -================== - - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -1.3.2 / 2014-07-11 -================== - - * deps: send@0.6.0 - - Cap `maxAge` value to 1 year - - deps: debug@1.0.3 - -1.3.1 / 2014-07-09 -================== - - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -1.3.0 / 2014-06-28 -================== - - * Add `setHeaders` option - * Include HTML link in redirect response - * deps: send@0.5.0 - - Accept string for `maxAge` (converted by `ms`) - -1.2.3 / 2014-06-11 -================== - - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -1.2.2 / 2014-06-09 -================== - - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - -1.2.1 / 2014-06-02 -================== - - * use `escape-html` for escaping - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -1.2.0 / 2014-05-29 -================== - - * deps: send@0.4.0 - - Calculate ETag with md5 for reduced collisions - - Fix wrong behavior when index file matches directory - - Ignore stream errors after request ends - - Skip directories in index file search - - deps: debug@0.8.1 - -1.1.0 / 2014-04-24 -================== - - * Accept options directly to `send` module - * deps: send@0.3.0 - -1.0.4 / 2014-04-07 -================== - - * Resolve relative paths at middleware setup - * Use parseurl to parse the URL from request - -1.0.3 / 2014-03-20 -================== - - * Do not rely on connect-like environments - -1.0.2 / 2014-03-06 -================== - - * deps: send@0.2.0 - -1.0.1 / 2014-03-05 -================== - - * Add mime export for back-compat - -1.0.0 / 2014-03-05 -================== - - * Genesis from `connect` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/LICENSE deleted file mode 100644 index b7bc085..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -(The MIT License) - -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 LearnBoost -Copyright (c) 2011 TJ Holowaychuk -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/Readme.md deleted file mode 100644 index 11dbc01..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/Readme.md +++ /dev/null @@ -1,144 +0,0 @@ -# serve-static - -[![NPM version](https://badge.fury.io/js/serve-static.svg)](http://badge.fury.io/js/serve-static) -[![Build Status](https://travis-ci.org/expressjs/serve-static.svg?branch=master)](https://travis-ci.org/expressjs/serve-static) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/serve-static.svg?branch=master)](https://coveralls.io/r/expressjs/serve-static) -[![Gittip](http://img.shields.io/gittip/dougwilson.svg)](https://www.gittip.com/dougwilson/) - -## Install - -```sh -$ npm install serve-static -``` - -## API - -```js -var serveStatic = require('serve-static') -``` - -### serveStatic(root, options) - -Create a new middleware function to serve files from within a given root -directory. The file to serve will be determined by combining `req.url` -with the provided root directory. When a file is not found, instead of -sending a 404 response, this module will instead call `next()` to move on -to the next middleware, allowing for stacking and fall-backs. - -#### Options - -##### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file -or directory that begins with a dot ("."). Note this check is done on -the path itself without checking if the path actually exists on the -disk. If `root` is specified, only the dotfiles above the root are -checked (i.e. the root itself can be within a dotfile when when set -to "deny"). - -The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and call `next()`. - -##### etag - -Enable or disable etag generation, defaults to true. - -##### index - -By default this module will send "index.html" files in response to a request -on a directory. To disable this set `false` or to supply a new index pass a -string or an array in preferred order. - -##### maxAge - -Provide a max-age in milliseconds for http caching, defaults to 0. This -can also be a string accepted by the [ms](https://www.npmjs.org/package/ms#readme) -module. - -##### redirect - -Redirect to trailing "/" when the pathname is a dir. Defaults to `true`. - -##### setHeaders - -Function to set custom headers on response. - -## Examples - -### Serve files with vanilla node.js http server - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -// Serve up public/ftp folder -var serve = serveStatic('public/ftp', {'index': ['index.html', 'index.htm']}) - -// Create server -var server = http.createServer(function(req, res){ - var done = finalhandler(req, res) - serve(req, res, done) -}) - -// Listen -server.listen(3000) -``` - -### Serve all files from ftp folder - -```js -var connect = require('connect') -var serveStatic = require('serve-static') - -var app = connect() - -app.use(serveStatic('public/ftp', {'index': ['default.html', 'default.htm']})) -app.listen(3000) -``` - -### Serve all files as downloads - -```js -var express = require('express') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic('public/ftp', { - 'index': false, - 'setHeaders': setHeaders -})) -app.listen(3000) - -function setHeaders(res, path) { - res.attachment(path) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/index.js deleted file mode 100644 index caa3acb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/index.js +++ /dev/null @@ -1,122 +0,0 @@ -/*! - * serve-static - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var escapeHtml = require('escape-html'); -var parseurl = require('parseurl'); -var resolve = require('path').resolve; -var send = require('send'); -var url = require('url'); - -/** - * @param {String} root - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function(root, options){ - options = extend({}, options); - - // root required - if (!root) throw new TypeError('root path required'); - - // resolve root to absolute - root = resolve(root); - - // default redirect - var redirect = false !== options.redirect; - - // headers listener - var setHeaders = options.setHeaders - delete options.setHeaders - - if (setHeaders && typeof setHeaders !== 'function') { - throw new TypeError('option setHeaders must be function') - } - - // setup options for send - options.maxage = options.maxage || options.maxAge || 0; - options.root = root; - - return function staticMiddleware(req, res, next) { - if ('GET' != req.method && 'HEAD' != req.method) return next(); - var opts = extend({}, options); - var originalUrl = url.parse(req.originalUrl || req.url); - var path = parseurl(req).pathname; - - if (path === '/' && originalUrl.pathname[originalUrl.pathname.length - 1] !== '/') { - // make sure redirect occurs at mount - path = '' - } - - // create send stream - var stream = send(req, path, opts) - - if (redirect) { - // redirect relative to originalUrl - stream.on('directory', function redirect() { - originalUrl.pathname += '/' - - var target = url.format(originalUrl) - - res.statusCode = 303 - res.setHeader('Content-Type', 'text/html; charset=utf-8') - res.setHeader('Location', target) - res.end('Redirecting to ' + escapeHtml(target) + '\n') - }) - } else { - // forward to next middleware on directory - stream.on('directory', next) - } - - // add headers listener - if (setHeaders) { - stream.on('headers', setHeaders) - } - - // forward non-404 errors - stream.on('error', function error(err) { - next(err.status === 404 ? null : err) - }) - - // pipe - stream.pipe(res) - }; -}; - -/** - * Expose mime module. - * - * If you wish to extend the mime table use this - * reference to the "mime" module in the npm registry. - */ - -exports.mime = send.mime; - -/** - * Shallow clone a single object. - * - * @param {Object} obj - * @param {Object} source - * @return {Object} - * @api private - */ - -function extend(obj, source) { - if (!source) return obj; - - for (var prop in source) { - obj[prop] = source[prop]; - } - - return obj; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore deleted file mode 100644 index 223570e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -coverage -test -examples -.travis.yml -*.sock diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/History.md deleted file mode 100644 index 2b3de42..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/History.md +++ /dev/null @@ -1,142 +0,0 @@ -0.7.3 / 2014-07-29 -================== - - * Fix incorrect 403 on Windows and Node.js 0.11 - -0.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -0.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -0.7.0 / 2014-07-20 -================== - - * Deprecate `hidden` option; use `dotfiles` option - * Add `dotfiles` option - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - -0.6.0 / 2014-07-11 -================== - - * Deprecate `from` option; use `root` option - * Deprecate `send.etag()` -- use `etag` in `options` - * Deprecate `send.hidden()` -- use `hidden` in `options` - * Deprecate `send.index()` -- use `index` in `options` - * Deprecate `send.maxage()` -- use `maxAge` in `options` - * Deprecate `send.root()` -- use `root` in `options` - * Cap `maxAge` value to 1 year - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.5.0 / 2014-06-28 -================== - - * Accept string for `maxAge` (converted by `ms`) - * Add `headers` event - * Include link in default redirect response - * Use `EventEmitter.listenerCount` to count listeners - -0.4.3 / 2014-06-11 -================== - - * Do not throw un-catchable error on file open race condition - * Use `escape-html` for HTML escaping - * deps: debug@1.0.2 - - fix some debugging output colors on node.js 0.8 - * deps: finished@1.2.2 - * deps: fresh@0.2.2 - -0.4.2 / 2014-06-09 -================== - - * fix "event emitter leak" warnings - * deps: debug@1.0.1 - * deps: finished@1.2.1 - -0.4.1 / 2014-06-02 -================== - - * Send `max-age` in `Cache-Control` in correct format - -0.4.0 / 2014-05-27 -================== - - * Calculate ETag with md5 for reduced collisions - * Fix wrong behavior when index file matches directory - * Ignore stream errors after request ends - - Goodbye `EBADF, read` - * Skip directories in index file search - * deps: debug@0.8.1 - -0.3.0 / 2014-04-24 -================== - - * Fix sending files with dots without root set - * Coerce option types - * Accept API options in options object - * Set etags to "weak" - * Include file path in etag - * Make "Can't set headers after they are sent." catchable - * Send full entity-body for multi range requests - * Default directory access to 403 when index disabled - * Support multiple index paths - * Support "If-Range" header - * Control whether to generate etags - * deps: mime@1.2.11 - -0.2.0 / 2014-01-29 -================== - - * update range-parser and fresh - -0.1.4 / 2013-08-11 -================== - - * update fresh - -0.1.3 / 2013-07-08 -================== - - * Revert "Fix fd leak" - -0.1.2 / 2013-07-03 -================== - - * Fix fd leak - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md deleted file mode 100644 index 5eceeef..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md +++ /dev/null @@ -1,159 +0,0 @@ -# send - -[![NPM version](https://badge.fury.io/js/send.svg)](https://badge.fury.io/js/send) -[![Build Status](https://travis-ci.org/visionmedia/send.svg?branch=master)](https://travis-ci.org/visionmedia/send) -[![Coverage Status](https://img.shields.io/coveralls/visionmedia/send.svg?branch=master)](https://coveralls.io/r/visionmedia/send) - - Send is Connect's `static()` extracted for generalized use, a streaming static file - server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework. - -## Installation - - $ npm install send - -## Examples - - Small: - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - send(req, req.url).pipe(res); -}).listen(3000); -``` - - Serving from a root directory with custom error-handling: - -```js -var http = require('http'); -var send = require('send'); -var url = require('url'); - -var app = http.createServer(function(req, res){ - // your custom error-handling logic: - function error(err) { - res.statusCode = err.status || 500; - res.end(err.message); - } - - // your custom headers - function headers(res, path, stat) { - // serve all files for download - res.setHeader('Content-Disposition', 'attachment'); - } - - // your custom directory handling logic: - function redirect() { - res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, url.parse(req.url).pathname, {root: '/www/example.com/public'}) - .on('error', error) - .on('directory', redirect) - .on('headers', headers) - .pipe(res); -}).listen(3000); -``` - -## API - -### Options - -#### etag - - Enable or disable etag generation, defaults to true. - -#### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file - or directory that begins with a dot ("."). Note this check is done on - the path itself without checking if the path actually exists on the - disk. If `root` is specified, only the dotfiles above the root are - checked (i.e. the root itself can be within a dotfile when when set - to "deny"). - - The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and 404. - -#### index - - By default send supports "index.html" files, to disable this - set `false` or to supply a new index pass a string or an array - in preferred order. - -#### maxAge - - Provide a max-age in milliseconds for http caching, defaults to 0. - This can also be a string accepted by the - [ms](https://www.npmjs.org/package/ms#readme) module. - -#### root - - Serve files relative to `path`. - -### Events - - - `error` an error occurred `(err)` - - `directory` a directory was requested - - `file` a file was requested `(path, stat)` - - `headers` the headers are about to be set on a file `(res, path, stat)` - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -## Error-handling - - By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc. - -## Caching - - It does _not_ perform internal caching, you should use a reverse proxy cache such - as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;). - -## Debugging - - To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ npm test -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/index.js deleted file mode 100644 index 51b2b57..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/send'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js deleted file mode 100644 index 4bdd001..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js +++ /dev/null @@ -1,712 +0,0 @@ - -/** - * Module dependencies. - */ - -var debug = require('debug')('send') -var deprecate = require('depd')('send') -var escapeHtml = require('escape-html') - , parseRange = require('range-parser') - , Stream = require('stream') - , mime = require('mime') - , fresh = require('fresh') - , path = require('path') - , http = require('http') - , onFinished = require('finished') - , fs = require('fs') - , normalize = path.normalize - , join = path.join - , utils = require('./utils'); -var EventEmitter = require('events').EventEmitter; -var ms = require('ms'); - -/** - * Variables. - */ -var maxMaxAge = 60 * 60 * 24 * 365 * 1000; // 1 year -var resolve = path.resolve -var sep = path.sep -var upPathRegexp = /(?:^|[\\\/])\.\.(?:[\\\/]|$)/ - -/** - * Expose `send`. - */ - -exports = module.exports = send; - -/** - * Expose mime module. - */ - -exports.mime = mime; - -/** - * Shim EventEmitter.listenerCount for node.js < 0.10 - */ - -/* istanbul ignore next */ -var listenerCount = EventEmitter.listenerCount - || function(emitter, type){ return emitter.listeners(type).length; }; - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @return {SendStream} - * @api public - */ - -function send(req, path, options) { - return new SendStream(req, path, options); -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @api private - */ - -function SendStream(req, path, options) { - var self = this; - options = options || {}; - this.req = req; - this.path = path; - this.options = options; - - this._etag = options.etag !== undefined - ? Boolean(options.etag) - : true - - this._dotfiles = options.dotfiles !== undefined - ? options.dotfiles - : 'ignore' - - if (['allow', 'deny', 'ignore'].indexOf(this._dotfiles) === -1) { - throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') - } - - this._hidden = Boolean(options.hidden) - - if ('hidden' in options) { - deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') - } - - // legacy support - if (!('dotfiles' in options)) { - this._dotfiles = undefined - } - - this._index = options.index !== undefined - ? normalizeIndex(options.index) - : ['index.html'] - - this._maxage = options.maxAge || options.maxage - this._maxage = typeof this._maxage === 'string' - ? ms(this._maxage) - : Number(this._maxage) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), maxMaxAge) - : 0 - - this._root = options.root - ? resolve(options.root) - : null - - if (!this._root && options.from) { - this.from(options.from); - } -} - -/** - * Inherits from `Stream.prototype`. - */ - -SendStream.prototype.__proto__ = Stream.prototype; - -/** - * Enable or disable etag generation. - * - * @param {Boolean} val - * @return {SendStream} - * @api public - */ - -SendStream.prototype.etag = deprecate.function(function etag(val) { - val = Boolean(val); - debug('etag %s', val); - this._etag = val; - return this; -}, 'send.etag: pass etag as option'); - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = deprecate.function(function hidden(val) { - val = Boolean(val); - debug('hidden %s', val); - this._hidden = val; - this._dotfiles = undefined - return this; -}, 'send.hidden: use dotfiles option'); - -/** - * Set index `paths`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean|Array} paths - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = deprecate.function(function index(paths) { - var index = !paths ? [] : normalizeIndex(paths); - debug('index %o', paths); - this._index = index; - return this; -}, 'send.index: pass index as option'); - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = function(path){ - path = String(path); - this._root = resolve(path) - return this; -}; - -SendStream.prototype.from = deprecate.function(SendStream.prototype.root, - 'send.from: pass root as option'); - -SendStream.prototype.root = deprecate.function(SendStream.prototype.root, - 'send.root: pass root as option'); - -/** - * Set max-age to `maxAge`. - * - * @param {Number} maxAge - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = deprecate.function(function maxage(maxAge) { - maxAge = typeof maxAge === 'string' - ? ms(maxAge) - : Number(maxAge); - if (isNaN(maxAge)) maxAge = 0; - if (Infinity == maxAge) maxAge = 60 * 60 * 24 * 365 * 1000; - debug('max-age %d', maxAge); - this._maxage = maxAge; - return this; -}, 'send.maxage: pass maxAge as option'); - -/** - * Emit error with `status`. - * - * @param {Number} status - * @api private - */ - -SendStream.prototype.error = function(status, err){ - var res = this.res; - var msg = http.STATUS_CODES[status]; - - err = err || new Error(msg); - err.status = status; - - // emit if listeners instead of responding - if (listenerCount(this, 'error') !== 0) { - return this.emit('error', err); - } - - // wipe all existing headers - res._headers = undefined; - - res.statusCode = err.status; - res.end(msg); -}; - -/** - * Check if the pathname ends with "/". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasTrailingSlash = function(){ - return '/' == this.path[this.path.length - 1]; -}; - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function(){ - return this.req.headers['if-none-match'] - || this.req.headers['if-modified-since']; -}; - -/** - * Strip content-* header fields. - * - * @api private - */ - -SendStream.prototype.removeContentHeaderFields = function(){ - var res = this.res; - Object.keys(res._headers).forEach(function(field){ - if (0 == field.indexOf('content')) { - res.removeHeader(field); - } - }); -}; - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function(){ - var res = this.res; - debug('not modified'); - this.removeContentHeaderFields(); - res.statusCode = 304; - res.end(); -}; - -/** - * Raise error that headers already sent. - * - * @api private - */ - -SendStream.prototype.headersAlreadySent = function headersAlreadySent(){ - var err = new Error('Can\'t set headers after they are sent.'); - debug('headers already sent'); - this.error(500, err); -}; - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function(){ - var res = this.res; - return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; -}; - -/** - * Handle stat() error. - * - * @param {Error} err - * @api private - */ - -SendStream.prototype.onStatError = function(err){ - var notfound = ['ENOENT', 'ENAMETOOLONG', 'ENOTDIR']; - if (~notfound.indexOf(err.code)) return this.error(404, err); - this.error(500, err); -}; - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function(){ - return fresh(this.req.headers, this.res._headers); -}; - -/** - * Check if the range is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isRangeFresh = function isRangeFresh(){ - var ifRange = this.req.headers['if-range']; - - if (!ifRange) return true; - - return ~ifRange.indexOf('"') - ? ~ifRange.indexOf(this.res._headers['etag']) - : Date.parse(this.res._headers['last-modified']) <= Date.parse(ifRange); -}; - -/** - * Redirect to `path`. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.redirect = function(path){ - if (listenerCount(this, 'directory') !== 0) { - return this.emit('directory'); - } - - if (this.hasTrailingSlash()) return this.error(403); - var res = this.res; - path += '/'; - res.statusCode = 301; - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.setHeader('Location', path); - res.end('Redirecting to ' + escapeHtml(path) + '\n'); -}; - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function(res){ - var self = this - , args = arguments - , root = this._root; - - // references - this.res = res; - - // decode the path - var path = utils.decode(this.path) - if (path === -1) return this.error(400) - - // null byte(s) - if (~path.indexOf('\0')) return this.error(400); - - var parts - if (root !== null) { - // join / normalize from optional root dir - path = normalize(join(root, path)) - root = normalize(root) - - // malicious path - if (path.substr(0, root.length) !== root) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = path.substr(root.length + 1).split(sep) - } else { - // ".." is malicious without "root" - if (upPathRegexp.test(path)) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = normalize(path).split(sep) - - // resolve the path - path = resolve(path) - } - - // dotfile handling - if (containsDotFile(parts)) { - var access = this._dotfiles - - // legacy support - if (access === undefined) { - access = parts[parts.length - 1][0] === '.' - ? (this._hidden ? 'allow' : 'ignore') - : 'allow' - } - - debug('%s dotfile "%s"', access, path) - switch (access) { - case 'allow': - break - case 'deny': - return this.error(403) - case 'ignore': - default: - return this.error(404) - } - } - - // index file support - if (this._index.length && this.hasTrailingSlash()) { - this.sendIndex(path); - return res; - } - - debug('stat "%s"', path); - fs.stat(path, function(err, stat){ - if (err) return self.onStatError(err); - if (stat.isDirectory()) return self.redirect(self.path); - self.emit('file', path, stat); - self.send(path, stat); - }); - - return res; -}; - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function(path, stat){ - var options = this.options; - var len = stat.size; - var res = this.res; - var req = this.req; - var ranges = req.headers.range; - var offset = options.start || 0; - - if (res._header) { - // impossible to send now - return this.headersAlreadySent(); - } - - debug('pipe "%s"', path) - - // set header fields - this.setHeader(path, stat); - - // set content-type - this.type(path); - - // conditional GET support - if (this.isConditionalGET() - && this.isCachable() - && this.isFresh()) { - return this.notModified(); - } - - // adjust len to start/end options - len = Math.max(0, len - offset); - if (options.end !== undefined) { - var bytes = options.end - offset + 1; - if (len > bytes) len = bytes; - } - - // Range support - if (ranges) { - ranges = parseRange(len, ranges); - - // If-Range support - if (!this.isRangeFresh()) { - debug('range stale'); - ranges = -2; - } - - // unsatisfiable - if (-1 == ranges) { - debug('range unsatisfiable'); - res.setHeader('Content-Range', 'bytes */' + stat.size); - return this.error(416); - } - - // valid (syntactically invalid/multiple ranges are treated as a regular response) - if (-2 != ranges && ranges.length === 1) { - debug('range %j', ranges); - - options.start = offset + ranges[0].start; - options.end = offset + ranges[0].end; - - // Content-Range - res.statusCode = 206; - res.setHeader('Content-Range', 'bytes ' - + ranges[0].start - + '-' - + ranges[0].end - + '/' - + len); - len = options.end - options.start + 1; - } - } - - // content-length - res.setHeader('Content-Length', len); - - // HEAD support - if ('HEAD' == req.method) return res.end(); - - this.stream(path, options); -}; - -/** - * Transfer index for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendIndex = function sendIndex(path){ - var i = -1; - var self = this; - - function next(err){ - if (++i >= self._index.length) { - if (err) return self.onStatError(err); - return self.error(404); - } - - var p = path + self._index[i]; - - debug('stat "%s"', p); - fs.stat(p, function(err, stat){ - if (err) return next(err); - if (stat.isDirectory()) return next(); - self.emit('file', p, stat); - self.send(p, stat); - }); - } - - if (!this.hasTrailingSlash()) path += '/'; - - next(); -}; - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function(path, options){ - // TODO: this is all lame, refactor meeee - var finished = false; - var self = this; - var res = this.res; - var req = this.req; - - // pipe - var stream = fs.createReadStream(path, options); - this.emit('stream', stream); - stream.pipe(res); - - // response finished, done with the fd - onFinished(res, function onfinished(){ - finished = true; - stream.destroy(); - }); - - // error handling code-smell - stream.on('error', function onerror(err){ - // request already finished - if (finished) return; - - // clean up stream - finished = true; - stream.destroy(); - - // no hope in responding - if (res._header) { - console.error(err.stack); - req.destroy(); - return; - } - - // error - self.onStatError(err); - }); - - // end - stream.on('end', function onend(){ - self.emit('end'); - }); -}; - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function(path){ - var res = this.res; - if (res.getHeader('Content-Type')) return; - var type = mime.lookup(path); - var charset = mime.charsets.lookup(type); - debug('content-type %s', type); - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); -}; - -/** - * Set response header fields, most - * fields may be pre-defined. - * - * @param {String} path - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function setHeader(path, stat){ - var res = this.res; - - this.emit('headers', res, path, stat); - - if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); - if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString()); - if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + Math.floor(this._maxage / 1000)); - if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString()); - - if (this._etag && !res.getHeader('ETag')) { - var etag = utils.etag(path, stat); - debug('etag %s', etag); - res.setHeader('ETag', etag); - } -}; - -/** - * Determine if path parts contain a dotfile. - * - * @api private - */ - -function containsDotFile(parts) { - for (var i = 0; i < parts.length; i++) { - if (parts[i][0] === '.') { - return true - } - } - - return false -} - -/** - * Normalize the index option into an array. - * - * @param {boolean|string|array} val - * @api private - */ - -function normalizeIndex(val){ - return [].concat(val || []) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js deleted file mode 100644 index 3a88bf9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js +++ /dev/null @@ -1,42 +0,0 @@ - -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Return a weak ETag from the given `path` and `stat`. - * - * @param {String} path - * @param {Object} stat - * @return {String} - * @api private - */ - -exports.etag = function etag(path, stat) { - var tag = String(stat.mtime.getTime()) + ':' + String(stat.size) + ':' + path; - var str = crypto - .createHash('md5') - .update(tag, 'utf8') - .digest('base64'); - return 'W/"' + str + '"'; -}; - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -exports.decode = function(path){ - try { - return decodeURIComponent(path); - } catch (err) { - return -1; - } -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md deleted file mode 100644 index 8937250..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md +++ /dev/null @@ -1,50 +0,0 @@ -1.2.2 / 2014-06-10 -========== - - * reduce listeners added to emitters - - avoids "event emitter leak" warnings when used multiple times on same request - -1.2.1 / 2014-06-08 -================== - - * fix returned value when already finished - -1.2.0 / 2014-06-05 -================== - - * call callback when called on already-finished socket - -1.1.4 / 2014-05-27 -================== - - * support node.js 0.8 - -1.1.3 / 2014-04-30 -================== - - * make sure errors passed as instanceof `Error` - -1.1.2 / 2014-04-18 -================== - - * default the `socket` to passed-in object - -1.1.1 / 2014-01-16 -================== - - * rename module to `finished` - -1.1.0 / 2013-12-25 -================== - - * call callback when called on already-errored socket - -1.0.1 / 2013-12-20 -================== - - * actually pass the error to the callback - -1.0.0 / 2013-12-20 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md deleted file mode 100644 index 79facd5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# finished - -[![NPM Version](https://badge.fury.io/js/finished.svg)](http://badge.fury.io/js/finished) -[![Build Status](https://travis-ci.org/expressjs/finished.svg?branch=master)](https://travis-ci.org/expressjs/finished) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/finished.svg?branch=master)](https://coveralls.io/r/expressjs/finished) - -Execute a callback when a request closes, finishes, or errors. - -#### Install - -```sh -$ npm install finished -``` - -#### Uses - -This is useful for cleaning up streams. For example, you want to destroy any file streams you create on socket errors otherwise you will leak file descriptors. - -This is required to fix what many perceive as issues with node's streams. Relevant: - -- [node#6041](https://github.com/joyent/node/issues/6041) -- [koa#184](https://github.com/koajs/koa/issues/184) -- [koa#165](https://github.com/koajs/koa/issues/165) - -## API - -### finished(response, callback) - -```js -var onFinished = require('finished') - -onFinished(res, function (err) { - // do something maybe -}) -``` - -### Examples - -The following code ensures that file descriptors are always closed once the response finishes. - -#### Node / Connect / Express - -```js -var onFinished = require('finished') - -function (req, res, next) { - var stream = fs.createReadStream('thingie.json') - stream.pipe(res) - onFinished(res, function (err) { - stream.destroy() - }) -} -``` - -#### Koa - -```js -function* () { - var stream = this.body = fs.createReadStream('thingie.json') - onFinished(this, function (err) { - stream.destroy() - }) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js deleted file mode 100644 index 90709d4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js +++ /dev/null @@ -1,62 +0,0 @@ -/*! - * finished - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** -* Module dependencies. -*/ - -var first = require('ee-first') - -/** -* Variables. -*/ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Invoke callback when the response has finished, useful for - * cleaning up resources afterwards. - * - * @param {object} thingie - * @param {function} callback - * @return {object} - * @api public - */ - -module.exports = function finished(thingie, callback) { - var socket = thingie.socket || thingie - var res = thingie.res || thingie - - if (res.finished || !socket.writable) { - defer(callback) - return thingie - } - - var listener = res.__onFinished - - // create a private single listener with queue - if (!listener || !listener.queue) { - listener = res.__onFinished = function onFinished(err) { - if (res.__onFinished === listener) res.__onFinished = null - var queue = listener.queue || [] - while (queue.length) queue.shift()(err) - } - listener.queue = [] - - // finished on first event - first([ - [socket, 'error', 'close'], - [res, 'finish'], - ], listener) - } - - listener.queue.push(callback) - - return thingie -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore deleted file mode 100644 index 72921ab..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.DS_Store* -node_modules diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md deleted file mode 100644 index 7eae173..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -# EE First - -Get the first event in a set of event emitters and event pairs, -then clean up after itself. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js deleted file mode 100644 index d0c48c9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js +++ /dev/null @@ -1,60 +0,0 @@ - -module.exports = function first(stuff, done) { - if (!Array.isArray(stuff)) - throw new TypeError('arg must be an array of [ee, events...] arrays') - - var cleanups = [] - - for (var i = 0; i < stuff.length; i++) { - var arr = stuff[i] - - if (!Array.isArray(arr) || arr.length < 2) - throw new TypeError('each array member must be [ee, events...]') - - var ee = arr[0] - - for (var j = 1; j < arr.length; j++) { - var event = arr[j] - var fn = listener(event, cleanup) - - // listen to the event - ee.on(event, fn) - // push this listener to the list of cleanups - cleanups.push({ - ee: ee, - event: event, - fn: fn, - }) - } - } - - return function (fn) { - done = fn - } - - function cleanup() { - var x - for (var i = 0; i < cleanups.length; i++) { - x = cleanups[i] - x.ee.removeListener(x.event, x.fn) - } - done.apply(null, arguments) - } -} - -function listener(event, done) { - return function onevent(arg1) { - var args = new Array(arguments.length) - var ee = this - var err = event === 'error' - ? arg1 - : null - - // copy args to prevent arguments escaping scope - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - done(err, ee, event, args) - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json deleted file mode 100644 index 1f82e3e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "ee-first", - "description": "return the first event in a set of ee/event pairs", - "version": "1.0.3", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/jonathanong/ee-first" - }, - "devDependencies": { - "mocha": "1" - }, - "scripts": { - "test": "mocha --reporter spec" - }, - "bugs": { - "url": "https://github.com/jonathanong/ee-first/issues" - }, - "homepage": "https://github.com/jonathanong/ee-first", - "_id": "ee-first@1.0.3", - "_shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "_from": "ee-first@1.0.3", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "tarball": "http://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js deleted file mode 100644 index adff984..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js +++ /dev/null @@ -1,60 +0,0 @@ - -var EventEmitter = require('events').EventEmitter -var assert = require('assert') - -var first = require('./') - -describe('first', function () { - var ee1 = new EventEmitter() - var ee2 = new EventEmitter() - var ee3 = new EventEmitter() - - it('should emit the first event', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - assert.equal(ee, ee2) - assert.equal(event, 'b') - assert.deepEqual(args, [1, 2, 3]) - done() - }) - - ee2.emit('b', 1, 2, 3) - }) - - it('it should return an error if event === error', function (done) { - first([ - [ee1, 'error', 'b', 'c'], - [ee2, 'error', 'b', 'c'], - [ee3, 'error', 'b', 'c'], - ], function (err, ee, event, args) { - assert.equal(err.message, 'boom') - assert.equal(ee, ee3) - assert.equal(event, 'error') - done() - }) - - ee3.emit('error', new Error('boom')) - }) - - it('should cleanup after itself', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - ;[ee1, ee2, ee3].forEach(function (ee) { - ['a', 'b', 'c'].forEach(function (event) { - assert(!ee.listeners(event).length) - }) - }) - done() - }) - - ee1.emit('a') - }) -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json deleted file mode 100644 index b645a74..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "finished", - "description": "Execute a callback when a request closes, finishes, or errors", - "version": "1.2.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/finished" - }, - "dependencies": { - "ee-first": "1.0.3" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.1", - "should": "~4.0.1" - }, - "engine": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/finished/issues" - }, - "homepage": "https://github.com/expressjs/finished", - "_id": "finished@1.2.2", - "_shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "_from": "finished@1.2.2", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "tarball": "http://registry.npmjs.org/finished/-/finished-1.2.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md deleted file mode 100644 index 6ca19bd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.default_type -Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js deleted file mode 100644 index 48be0c5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js +++ /dev/null @@ -1,114 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - if (process.env.DEBUG_MIME && this.types[exts]) { - console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + - this.types[exts] + ' to ' + type); - } - - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - - this._loading = file; - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); - - this._loading = null; -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); - return this.extensions[type]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -}; - -module.exports = mime; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json deleted file mode 100644 index 917e6af..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.2.11", - "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g.\n\n var mime = require('mime');\n\n mime.lookup('/path/to/file.txt'); // => 'text/plain'\n mime.lookup('file.txt'); // => 'text/plain'\n mime.lookup('.TXT'); // => 'text/plain'\n mime.lookup('htm'); // => 'text/html'\n\n### mime.default_type\nSets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)\n\n### mime.extension(type)\nGet the default extension for `type`\n\n mime.extension('text/html'); // => 'html'\n mime.extension('application/octet-stream'); // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n mime.charsets.lookup('text/plain'); // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n mime.define({\n 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n 'application/x-my-type': ['x-mt', 'x-mtt'],\n // etc ...\n });\n\n mime.lookup('x-sft'); // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n mime.load('./my_project.types');\n\nThe .types file format is simple - See the `types` dir for examples.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/broofa/node-mime/issues" - }, - "_id": "mime@1.2.11", - "dist": { - "shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "tarball": "http://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - }, - "_from": "mime@1.2.11", - "_npmVersion": "1.3.6", - "_npmUser": { - "name": "broofa", - "email": "robert@broofa.com" - }, - "maintainers": [ - { - "name": "broofa", - "email": "robert@broofa.com" - }, - { - "name": "bentomas", - "email": "benjamin@benjaminthomas.org" - } - ], - "directories": {}, - "_shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "_resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "homepage": "https://github.com/broofa/node-mime" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js deleted file mode 100644 index 2cda1c7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); -var path = require('path'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); // normal file -eq('text/plain', mime.lookup('TEXT.TXT')); // uppercase -eq('text/plain', mime.lookup('dir/text.txt')); // dir + file -eq('text/plain', mime.lookup('.text.txt')); // hidden file -eq('text/plain', mime.lookup('.txt')); // nameless -eq('text/plain', mime.lookup('txt')); // extension-only -eq('text/plain', mime.lookup('/txt')); // extension-less () -eq('text/plain', mime.lookup('\\txt')); // Windows, extension-less -eq('application/octet-stream', mime.lookup('text.nope')); // unrecognized -eq('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq('bin', mime.extension('application/octet-stream ')); -eq('html', mime.extension(' text/html; charset=UTF-8')); -eq('html', mime.extension('text/html; charset=UTF-8 ')); -eq('html', mime.extension('text/html; charset=UTF-8')); -eq('html', mime.extension('text/html ; charset=UTF-8')); -eq('html', mime.extension('text/html;charset=UTF-8')); -eq('html', mime.extension('text/Html;charset=UTF-8')); -eq(undefined, mime.extension('unrecognized')); - -// -// Test node.types lookups -// - -eq('application/font-woff', mime.lookup('file.woff')); -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); -eq('font/opentype', mime.lookup('file.otf')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -// -// Test for overlaps between mime.types and node.types -// - -var apacheTypes = new mime.Mime(), nodeTypes = new mime.Mime(); -apacheTypes.load(path.join(__dirname, 'types/mime.types')); -nodeTypes.load(path.join(__dirname, 'types/node.types')); - -var keys = [].concat(Object.keys(apacheTypes.types)) - .concat(Object.keys(nodeTypes.types)); -keys.sort(); -for (var i = 1; i < keys.length; i++) { - if (keys[i] == keys[i-1]) { - console.warn('Warning: ' + - 'node.types defines ' + keys[i] + '->' + nodeTypes.types[keys[i]] + - ', mime.types defines ' + keys[i] + '->' + apacheTypes.types[keys[i]]); - } -} - -console.log('\nOK'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types deleted file mode 100644 index da8cd69..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types deleted file mode 100644 index 55b2cf7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types +++ /dev/null @@ -1,77 +0,0 @@ -# What: WebVTT -# Why: To allow formats intended for marking up external text track resources. -# http://dev.w3.org/html5/webvtt/ -# Added by: niftylettuce -text/vtt vtt - -# 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: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifes ('.manifest' extension) -# 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 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: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp - -# What: Lua file types -# Why: Googling around shows de-facto consensus on these -# Added by: creationix (Issue #45) -text/x-lua lua -application/x-lua-bytecode luac - -# What: Markdown files, as per http://daringfireball.net/projects/markdown/syntax -# Why: http://stackoverflow.com/questions/10701983/what-is-the-mime-type-for-markdown -# Added by: avoidwork -text/x-markdown markdown md mkd - -# What: ini files -# Why: because they're just text files -# Added by: Matthew Kastor -text/plain ini - -# What: DASH Adaptive Streaming manifest -# Why: https://developer.mozilla.org/en-US/docs/DASH_Adaptive_Streaming_for_HTML_5_Video -# Added by: eelcocramer -application/dash+xml mdp - -# What: OpenType font files - http://www.microsoft.com/typography/otspec/ -# Why: Browsers usually ignore the font MIME types and sniff the content, -# but Chrome, shows a warning if OpenType fonts aren't served with -# the `font/opentype` MIME type: http://i.imgur.com/8c5RN8M.png. -# Added by: alrra -font/opentype otf diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md deleted file mode 100644 index d4ab12a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours', { long: true })) // "10 hours" -``` - -- Node/Browser compatible. Published as `ms` in NPM. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js deleted file mode 100644 index c5847f8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json deleted file mode 100644 index c4dd654..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "ms", - "version": "0.6.2", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "readme": "# ms.js: miliseconds conversion utility\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('100') // 100\n```\n\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(ms('10 hours', { long: true })) // \"10 hours\"\n```\n\n- Node/Browser compatible. Published as `ms` in NPM.\n- If a number is supplied to `ms`, a string with a unit is returned.\n- If a string that contains the number is supplied, it returns it as\na number (e.g: it returns `100` for `'100'`).\n- If you pass a string with a number and a valid unit, the number of\nequivalent ms is returned.\n\n## License\n\nMIT", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "_id": "ms@0.6.2", - "dist": { - "shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - }, - "_from": "ms@0.6.2", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "directories": {}, - "_shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "homepage": "https://github.com/guille/ms.js" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/package.json deleted file mode 100644 index bb5e8b4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/node_modules/send/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "send", - "description": "Better streaming static file server with Range and conditional-GET support", - "version": "0.7.3", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/send" - }, - "keywords": [ - "static", - "file", - "server" - ], - "dependencies": { - "debug": "1.0.4", - "depd": "0.4.4", - "escape-html": "1.0.1", - "finished": "1.2.2", - "fresh": "0.2.2", - "mime": "1.2.11", - "ms": "0.6.2", - "range-parser": "~1.0.0" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.0", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --check-leaks --reporter spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec" - }, - "bugs": { - "url": "https://github.com/visionmedia/send/issues" - }, - "homepage": "https://github.com/visionmedia/send", - "_id": "send@0.7.3", - "dist": { - "shasum": "2caa2e2627d2f9c2d109d3f5c2942935480aa993", - "tarball": "http://registry.npmjs.org/send/-/send-0.7.3.tgz" - }, - "_from": "send@0.7.3", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "2caa2e2627d2f9c2d109d3f5c2942935480aa993", - "_resolved": "https://registry.npmjs.org/send/-/send-0.7.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/package.json deleted file mode 100644 index 7345a3c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/serve-static/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "serve-static", - "description": "Serve static files", - "version": "1.4.3", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/serve-static" - }, - "dependencies": { - "escape-html": "1.0.1", - "parseurl": "~1.2.0", - "send": "0.7.3" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.0", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks --require should test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks --require should test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks --require should test/" - }, - "bugs": { - "url": "https://github.com/expressjs/serve-static/issues" - }, - "homepage": "https://github.com/expressjs/serve-static", - "_id": "serve-static@1.4.3", - "dist": { - "shasum": "9f08c7dea1b15e2eb1382ae0e12b8a0de295de52", - "tarball": "http://registry.npmjs.org/serve-static/-/serve-static-1.4.3.tgz" - }, - "_from": "serve-static@>=1.4.2-0 <1.5.0-0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "9f08c7dea1b15e2eb1382ae0e12b8a0de295de52", - "_resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.4.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/HISTORY.md deleted file mode 100644 index b4c94be..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/HISTORY.md +++ /dev/null @@ -1,54 +0,0 @@ - -1.3.2 / 2014-06-24 -================== - - * use `~` range on mime-types - -1.3.1 / 2014-06-19 -================== - - * fix global variable leak - -1.3.0 / 2014-06-19 -================== - - * improve type parsing - - - invalid media type never matches - - media type not case-sensitive - - extra LWS does not affect results - -1.2.2 / 2014-06-19 -================== - - * fix behavior on unknown type argument - -1.2.1 / 2014-06-03 -================== - - * switch dependency from `mime` to `mime-types@1.0.0` - -1.2.0 / 2014-05-11 -================== - - * support suffix matching: - - - `+json` matches `application/vnd+json` - - `*/vnd+json` matches `application/vnd+json` - - `application/*+json` matches `application/vnd+json` - -1.1.0 / 2014-04-12 -================== - - * add non-array values support - * expose internal utilities: - - - `.is()` - - `.hasBody()` - - `.normalize()` - - `.match()` - -1.0.1 / 2014-03-30 -================== - - * add `multipart` as a shorthand diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/README.md deleted file mode 100644 index 5d8b166..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# type-is - -[![NPM version](https://badge.fury.io/js/type-is.svg)](https://badge.fury.io/js/type-is) -[![Build Status](https://travis-ci.org/expressjs/type-is.svg?branch=master)](https://travis-ci.org/expressjs/type-is) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/type-is.svg?branch=master)](https://coveralls.io/r/expressjs/type-is) - -Infer the content-type of a request. - -### Install - -```sh -$ npm install type-is -``` - -## API - -```js -var http = require('http') -var is = require('type-is') - -http.createServer(function (req, res) { - var istext = is(req, ['text/*']) - res.end('you ' + (istext ? 'sent' : 'did not send') + ' me text') -}) -``` - -### type = is(request, types) - -`request` is the node HTTP request. `types` is an array of types. - -```js -// req.headers.content-type = 'application/json' - -is(req, ['json']) // 'json' -is(req, ['html', 'json']) // 'json' -is(req, ['application/*']) // 'application/json' -is(req, ['application/json']) // 'application/json' - -is(req, ['html']) // false -``` - -#### Each type can be: - -- An extension name such as `json`. This name will be returned if matched. -- A mime type such as `application/json`. -- A mime type with a wildcard such as `*/json` or `application/*`. The full mime type will be returned if matched -- A suffix such as `+json`. This can be combined with a wildcard such as `*/vnd+json` or `application/*+json`. The full mime type will be returned if matched. - -`false` will be returned if no type matches. - -## Examples - -#### Example body parser - -```js -var is = require('type-is'); -var parse = require('body'); -var busboy = require('busboy'); - -function bodyParser(req, res, next) { - if (!is.hasBody(req)) return next(); - - switch (is(req, ['urlencoded', 'json', 'multipart'])) { - case 'urlencoded': - // parse urlencoded body - break - case 'json': - // parse json body - break - case 'multipart': - // parse multipart body - break - default: - // 415 error code - } -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/index.js deleted file mode 100644 index 315907a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/index.js +++ /dev/null @@ -1,230 +0,0 @@ - -var typer = require('media-typer') -var mime = require('mime-types') - -module.exports = typeofrequest; -typeofrequest.is = typeis; -typeofrequest.hasBody = hasbody; -typeofrequest.normalize = normalize; -typeofrequest.match = mimeMatch; - -/** - * Compare a `value` content-type with `types`. - * Each `type` can be an extension like `html`, - * a special shortcut like `multipart` or `urlencoded`, - * or a mime type. - * - * If no types match, `false` is returned. - * Otherwise, the first `type` that matches is returned. - * - * @param {String} value - * @param {Array} types - * @return String - */ - -function typeis(value, types_) { - var i - var types = types_ - - // remove parameters and normalize - value = typenormalize(value) - - // no type or invalid - if (!value) { - return false - } - - // support flattened arguments - if (types && !Array.isArray(types)) { - types = new Array(arguments.length - 1) - for (i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // no types, return the content type - if (!types || !types.length) return value; - - var type - for (i = 0; i < types.length; i++) { - if (mimeMatch(normalize(type = types[i]), value)) { - return type[0] === '+' || ~type.indexOf('*') - ? value - : type - } - } - - // no matches - return false; -} - -/** - * Check if a request has a request body. - * A request with a body __must__ either have `transfer-encoding` - * or `content-length` headers set. - * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 - * - * @param {Object} request - * @return {Boolean} - * @api public - */ - -function hasbody(req) { - var headers = req.headers; - if ('transfer-encoding' in headers) return true; - var length = headers['content-length']; - if (!length) return false; - // no idea when this would happen, but `isNaN(null) === false` - if (isNaN(length)) return false; - return !!parseInt(length, 10); -} - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains any of the give mime `type`s. - * If there is no request body, `null` is returned. - * If there is no content type, `false` is returned. - * Otherwise, it returns the first `type` that matches. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * this.is('html'); // => 'html' - * this.is('text/html'); // => 'text/html' - * this.is('text/*', 'application/json'); // => 'text/html' - * - * // When Content-Type is application/json - * this.is('json', 'urlencoded'); // => 'json' - * this.is('application/json'); // => 'application/json' - * this.is('html', 'application/*'); // => 'application/json' - * - * this.is('html'); // => false - * - * @param {String|Array} types... - * @return {String|false|null} - * @api public - */ - -function typeofrequest(req, types_) { - var types = types_ - - // no body - if (!hasbody(req)) { - return null - } - - // support flattened arguments - if (arguments.length > 2) { - types = new Array(arguments.length - 1) - for (var i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // request content type - var value = req.headers['content-type'] - - return typeis(value, types); -} - -/** - * Normalize a mime type. - * If it's a shorthand, expand it to a valid mime type. - * - * In general, you probably want: - * - * var type = is(req, ['urlencoded', 'json', 'multipart']); - * - * Then use the appropriate body parsers. - * These three are the most common request body types - * and are thus ensured to work. - * - * @param {String} type - * @api private - */ - -function normalize(type) { - switch (type) { - case 'urlencoded': return 'application/x-www-form-urlencoded'; - case 'multipart': - type = 'multipart/*'; - break; - } - - return type[0] === '+' || ~type.indexOf('/') - ? type - : mime.lookup(type) -} - -/** - * Check if `exected` mime type - * matches `actual` mime type with - * wildcard and +suffix support. - * - * @param {String} expected - * @param {String} actual - * @return {Boolean} - * @api private - */ - -function mimeMatch(expected, actual) { - // invalid type - if (expected === false) { - return false - } - - // exact match - if (expected === actual) { - return true - } - - actual = actual.split('/'); - - if (expected[0] === '+') { - // support +suffix - return Boolean(actual[1]) - && expected.length <= actual[1].length - && expected === actual[1].substr(0 - expected.length) - } - - if (!~expected.indexOf('*')) return false; - - expected = expected.split('/'); - - if (expected[0] === '*') { - // support */yyy - return expected[1] === actual[1] - } - - if (expected[1] === '*') { - // support xxx/* - return expected[0] === actual[0] - } - - if (expected[1][0] === '*' && expected[1][1] === '+') { - // support xxx/*+zzz - return expected[0] === actual[0] - && expected[1].length <= actual[1].length + 1 - && expected[1].substr(1) === actual[1].substr(1 - expected[1].length) - } - - return false -} - -/** - * Normalize a type and remove parameters. - * - * @param {string} value - * @return {string} - * @api private - */ - -function typenormalize(value) { - try { - var type = typer.parse(value) - delete type.parameters - return typer.format(type) - } catch (err) { - return null - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore deleted file mode 100644 index 919d51b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -test -build.js - -# OS generated files # -###################### -.DS_Store* -# Icon? -ehthumbs.db -Thumbs.db - -# Node.js # -########### -node_modules -npm-debug.log diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml deleted file mode 100644 index 73c85c6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" - - "0.11" -matrix: - allow_failures: - - node_js: "0.11" - fast_finish: true -before_install: - # remove build script deps before install - - node -pe 'f="./package.json";p=require(f);d=p.devDependencies;for(k in d){if("co"===k.substr(0,2))delete d[k]}require("fs").writeFileSync(f,JSON.stringify(p,null,2))' diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile deleted file mode 100644 index ceaf011..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -build: - node --harmony-generators build.js - -test: - node test/mime.js - mocha --require should --reporter spec test/test.js - -.PHONY: build test diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md deleted file mode 100644 index 8e21ee1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# mime-types -[![NPM version](https://badge.fury.io/js/mime-types.svg)](https://badge.fury.io/js/mime-types) [![Build Status](https://travis-ci.org/expressjs/mime-types.svg?branch=master)](https://travis-ci.org/expressjs/mime-types) - -The ultimate javascript content-type utility. - -### Install - -```sh -$ npm install mime-types -``` - -#### Similar to [node-mime](https://github.com/broofa/node-mime), except: - -- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. -- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. -- Additional mime types are added such as jade and stylus. Feel free to add more! -- Browser support via Browserify and Component by converting lists to JSON files. - -Otherwise, the API is compatible. - -### Adding Types - -If you'd like to add additional types, -simply create a PR adding the type to `custom.json` and -a reference link to the [sources](SOURCES.md). - -Do __NOT__ edit `mime.json` or `node.json`. -Those are pulled using `build.js`. -You should only touch `custom.json`. - -## API - -```js -var mime = require('mime-types') -``` - -All functions return `false` if input is invalid or not found. - -### mime.lookup(path) - -Lookup the content-type associated with a file. - -```js -mime.lookup('json') // 'application/json' -mime.lookup('.md') // 'text/x-markdown' -mime.lookup('file.html') // 'text/html' -mime.lookup('folder/file.js') // 'application/javascript' - -mime.lookup('cats') // false -``` - -### mime.contentType(type) - -Create a full content-type header given a content-type or extension. - -```js -mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' -mime.contentType('file.json') // 'application/json; charset=utf-8' -``` - -### mime.extension(type) - -Get the default extension for a content-type. - -```js -mime.extension('application/octet-stream') // 'bin' -``` - -### mime.charset(type) - -Lookup the implied default charset of a content-type. - -```js -mime.charset('text/x-markdown') // 'UTF-8' -``` - -### mime.types[extension] = type - -A map of content-types by extension. - -### mime.extensions[type] = [extensions] - -A map of extensions by content-type. - -### mime.define(types) - -Globally add definitions. -`types` must be an object of the form: - -```js -{ - "": [extensions...], - "": [extensions...] -} -``` - -See the `.json` files in `lib/` for examples. - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md deleted file mode 100644 index 1d65012..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md +++ /dev/null @@ -1,17 +0,0 @@ - -### Sources for custom types - -This is a list of sources for any custom mime types. -When adding custom mime types, please link to where you found the mime type, -even if it's from an unofficial source. - -- `text/coffeescript` - http://coffeescript.org/#scripts -- `text/x-handlebars-template` - https://handlebarsjs.com/#getting-started -- `text/x-sass` & `text/x-scss` - https://github.com/janlelis/rubybuntu-mime/blob/master/sass.xml -- `text.jsx` - http://facebook.github.io/react/docs/getting-started.html [[2]](https://github.com/facebook/react/blob/f230e0a03154e6f8a616e0da1fb3d97ffa1a6472/vendor/browser-transforms.js#L210) - -[Sources for node.json types](https://github.com/broofa/node-mime/blob/master/types/node.types) - -### Notes on weird types - -- `font/opentype` - This type is technically invalid according to the spec. No valid types begin with `font/`. No-one uses the official type of `application/vnd.ms-opentype` as the community standardized `application/x-font-otf`. However, chrome logs nonsense warnings unless opentype fonts are served with `font/opentype`. [[1]](http://stackoverflow.com/questions/2871655/proper-mime-type-for-fonts) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json deleted file mode 100644 index fa67a6d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "0.1.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com", - "twitter": "https://twitter.com/jongleberry" - }, - "repository": "expressjs/mime-types", - "license": "MIT", - "main": "lib/index.js", - "scripts": ["lib/index.js"], - "json": ["mime.json", "node.json", "custom.json"] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json deleted file mode 100644 index 6137da3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "text/jade": [ - "jade" - ], - "text/stylus": [ - "stylus", - "styl" - ], - "text/less": [ - "less" - ], - "text/x-sass": [ - "sass" - ], - "text/x-scss": [ - "scss" - ], - "text/coffeescript": [ - "coffee" - ], - "text/x-handlebars-template": [ - "hbs" - ], - "text/jsx": [ - "jsx" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js deleted file mode 100644 index 27559ea..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js +++ /dev/null @@ -1,74 +0,0 @@ - -// types[extension] = type -exports.types = Object.create(null) -// extensions[type] = [extensions] -exports.extensions = Object.create(null) -// define more mime types -exports.define = define - -// store the json files -exports.json = { - mime: require('./mime.json'), - node: require('./node.json'), - custom: require('./custom.json'), -} - -exports.lookup = function (string) { - if (!string || typeof string !== "string") return false - string = string.replace(/.*[\.\/\\]/, '').toLowerCase() - if (!string) return false - return exports.types[string] || false -} - -exports.extension = function (type) { - if (!type || typeof type !== "string") return false - type = type.match(/^\s*([^;\s]*)(?:;|\s|$)/) - if (!type) return false - var exts = exports.extensions[type[1].toLowerCase()] - if (!exts || !exts.length) return false - return exts[0] -} - -// type has to be an exact mime type -exports.charset = function (type) { - // special cases - switch (type) { - case 'application/json': return 'UTF-8' - } - - // default text/* to utf-8 - if (/^text\//.test(type)) return 'UTF-8' - - return false -} - -// backwards compatibility -exports.charsets = { - lookup: exports.charset -} - -exports.contentType = function (type) { - if (!type || typeof type !== "string") return false - if (!~type.indexOf('/')) type = exports.lookup(type) - if (!type) return false - if (!~type.indexOf('charset')) { - var charset = exports.charset(type) - if (charset) type += '; charset=' + charset.toLowerCase() - } - return type -} - -define(exports.json.mime) -define(exports.json.node) -define(exports.json.custom) - -function define(json) { - Object.keys(json).forEach(function (type) { - var exts = json[type] || [] - exports.extensions[type] = exports.extensions[type] || [] - exts.forEach(function (ext) { - if (!~exports.extensions[type].indexOf(ext)) exports.extensions[type].push(ext) - exports.types[ext] = type - }) - }) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json deleted file mode 100644 index f445a86..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json +++ /dev/null @@ -1,3317 +0,0 @@ -{ - "application/1d-interleaved-parityfec": [], - "application/3gpp-ims+xml": [], - "application/activemessage": [], - "application/andrew-inset": [ - "ez" - ], - "application/applefile": [], - "application/applixware": [ - "aw" - ], - "application/atom+xml": [ - "atom" - ], - "application/atomcat+xml": [ - "atomcat" - ], - "application/atomicmail": [], - "application/atomsvc+xml": [ - "atomsvc" - ], - "application/auth-policy+xml": [], - "application/batch-smtp": [], - "application/beep+xml": [], - "application/calendar+xml": [], - "application/cals-1840": [], - "application/ccmp+xml": [], - "application/ccxml+xml": [ - "ccxml" - ], - "application/cdmi-capability": [ - "cdmia" - ], - "application/cdmi-container": [ - "cdmic" - ], - "application/cdmi-domain": [ - "cdmid" - ], - "application/cdmi-object": [ - "cdmio" - ], - "application/cdmi-queue": [ - "cdmiq" - ], - "application/cea-2018+xml": [], - "application/cellml+xml": [], - "application/cfw": [], - "application/cnrp+xml": [], - "application/commonground": [], - "application/conference-info+xml": [], - "application/cpl+xml": [], - "application/csta+xml": [], - "application/cstadata+xml": [], - "application/cu-seeme": [ - "cu" - ], - "application/cybercash": [], - "application/davmount+xml": [ - "davmount" - ], - "application/dca-rft": [], - "application/dec-dx": [], - "application/dialog-info+xml": [], - "application/dicom": [], - "application/dns": [], - "application/docbook+xml": [ - "dbk" - ], - "application/dskpp+xml": [], - "application/dssc+der": [ - "dssc" - ], - "application/dssc+xml": [ - "xdssc" - ], - "application/dvcs": [], - "application/ecmascript": [ - "ecma" - ], - "application/edi-consent": [], - "application/edi-x12": [], - "application/edifact": [], - "application/emma+xml": [ - "emma" - ], - "application/epp+xml": [], - "application/epub+zip": [ - "epub" - ], - "application/eshop": [], - "application/example": [], - "application/exi": [ - "exi" - ], - "application/fastinfoset": [], - "application/fastsoap": [], - "application/fits": [], - "application/font-tdpfr": [ - "pfr" - ], - "application/framework-attributes+xml": [], - "application/gml+xml": [ - "gml" - ], - "application/gpx+xml": [ - "gpx" - ], - "application/gxf": [ - "gxf" - ], - "application/h224": [], - "application/held+xml": [], - "application/http": [], - "application/hyperstudio": [ - "stk" - ], - "application/ibe-key-request+xml": [], - "application/ibe-pkg-reply+xml": [], - "application/ibe-pp-data": [], - "application/iges": [], - "application/im-iscomposing+xml": [], - "application/index": [], - "application/index.cmd": [], - "application/index.obj": [], - "application/index.response": [], - "application/index.vnd": [], - "application/inkml+xml": [ - "ink", - "inkml" - ], - "application/iotp": [], - "application/ipfix": [ - "ipfix" - ], - "application/ipp": [], - "application/isup": [], - "application/java-archive": [ - "jar" - ], - "application/java-serialized-object": [ - "ser" - ], - "application/java-vm": [ - "class" - ], - "application/javascript": [ - "js" - ], - "application/json": [ - "json" - ], - "application/jsonml+json": [ - "jsonml" - ], - "application/kpml-request+xml": [], - "application/kpml-response+xml": [], - "application/lost+xml": [ - "lostxml" - ], - "application/mac-binhex40": [ - "hqx" - ], - "application/mac-compactpro": [ - "cpt" - ], - "application/macwriteii": [], - "application/mads+xml": [ - "mads" - ], - "application/marc": [ - "mrc" - ], - "application/marcxml+xml": [ - "mrcx" - ], - "application/mathematica": [ - "ma", - "nb", - "mb" - ], - "application/mathml-content+xml": [], - "application/mathml-presentation+xml": [], - "application/mathml+xml": [ - "mathml" - ], - "application/mbms-associated-procedure-description+xml": [], - "application/mbms-deregister+xml": [], - "application/mbms-envelope+xml": [], - "application/mbms-msk+xml": [], - "application/mbms-msk-response+xml": [], - "application/mbms-protection-description+xml": [], - "application/mbms-reception-report+xml": [], - "application/mbms-register+xml": [], - "application/mbms-register-response+xml": [], - "application/mbms-user-service-description+xml": [], - "application/mbox": [ - "mbox" - ], - "application/media_control+xml": [], - "application/mediaservercontrol+xml": [ - "mscml" - ], - "application/metalink+xml": [ - "metalink" - ], - "application/metalink4+xml": [ - "meta4" - ], - "application/mets+xml": [ - "mets" - ], - "application/mikey": [], - "application/mods+xml": [ - "mods" - ], - "application/moss-keys": [], - "application/moss-signature": [], - "application/mosskey-data": [], - "application/mosskey-request": [], - "application/mp21": [ - "m21", - "mp21" - ], - "application/mp4": [ - "mp4s" - ], - "application/mpeg4-generic": [], - "application/mpeg4-iod": [], - "application/mpeg4-iod-xmt": [], - "application/msc-ivr+xml": [], - "application/msc-mixer+xml": [], - "application/msword": [ - "doc", - "dot" - ], - "application/mxf": [ - "mxf" - ], - "application/nasdata": [], - "application/news-checkgroups": [], - "application/news-groupinfo": [], - "application/news-transmission": [], - "application/nss": [], - "application/ocsp-request": [], - "application/ocsp-response": [], - "application/octet-stream": [ - "bin", - "dms", - "lrf", - "mar", - "so", - "dist", - "distz", - "pkg", - "bpk", - "dump", - "elc", - "deploy" - ], - "application/oda": [ - "oda" - ], - "application/oebps-package+xml": [ - "opf" - ], - "application/ogg": [ - "ogx" - ], - "application/omdoc+xml": [ - "omdoc" - ], - "application/onenote": [ - "onetoc", - "onetoc2", - "onetmp", - "onepkg" - ], - "application/oxps": [ - "oxps" - ], - "application/parityfec": [], - "application/patch-ops-error+xml": [ - "xer" - ], - "application/pdf": [ - "pdf" - ], - "application/pgp-encrypted": [ - "pgp" - ], - "application/pgp-keys": [], - "application/pgp-signature": [ - "asc", - "sig" - ], - "application/pics-rules": [ - "prf" - ], - "application/pidf+xml": [], - "application/pidf-diff+xml": [], - "application/pkcs10": [ - "p10" - ], - "application/pkcs7-mime": [ - "p7m", - "p7c" - ], - "application/pkcs7-signature": [ - "p7s" - ], - "application/pkcs8": [ - "p8" - ], - "application/pkix-attr-cert": [ - "ac" - ], - "application/pkix-cert": [ - "cer" - ], - "application/pkix-crl": [ - "crl" - ], - "application/pkix-pkipath": [ - "pkipath" - ], - "application/pkixcmp": [ - "pki" - ], - "application/pls+xml": [ - "pls" - ], - "application/poc-settings+xml": [], - "application/postscript": [ - "ai", - "eps", - "ps" - ], - "application/prs.alvestrand.titrax-sheet": [], - "application/prs.cww": [ - "cww" - ], - "application/prs.nprend": [], - "application/prs.plucker": [], - "application/prs.rdf-xml-crypt": [], - "application/prs.xsf+xml": [], - "application/pskc+xml": [ - "pskcxml" - ], - "application/qsig": [], - "application/rdf+xml": [ - "rdf" - ], - "application/reginfo+xml": [ - "rif" - ], - "application/relax-ng-compact-syntax": [ - "rnc" - ], - "application/remote-printing": [], - "application/resource-lists+xml": [ - "rl" - ], - "application/resource-lists-diff+xml": [ - "rld" - ], - "application/riscos": [], - "application/rlmi+xml": [], - "application/rls-services+xml": [ - "rs" - ], - "application/rpki-ghostbusters": [ - "gbr" - ], - "application/rpki-manifest": [ - "mft" - ], - "application/rpki-roa": [ - "roa" - ], - "application/rpki-updown": [], - "application/rsd+xml": [ - "rsd" - ], - "application/rss+xml": [ - "rss" - ], - "application/rtf": [ - "rtf" - ], - "application/rtx": [], - "application/samlassertion+xml": [], - "application/samlmetadata+xml": [], - "application/sbml+xml": [ - "sbml" - ], - "application/scvp-cv-request": [ - "scq" - ], - "application/scvp-cv-response": [ - "scs" - ], - "application/scvp-vp-request": [ - "spq" - ], - "application/scvp-vp-response": [ - "spp" - ], - "application/sdp": [ - "sdp" - ], - "application/set-payment": [], - "application/set-payment-initiation": [ - "setpay" - ], - "application/set-registration": [], - "application/set-registration-initiation": [ - "setreg" - ], - "application/sgml": [], - "application/sgml-open-catalog": [], - "application/shf+xml": [ - "shf" - ], - "application/sieve": [], - "application/simple-filter+xml": [], - "application/simple-message-summary": [], - "application/simplesymbolcontainer": [], - "application/slate": [], - "application/smil": [], - "application/smil+xml": [ - "smi", - "smil" - ], - "application/soap+fastinfoset": [], - "application/soap+xml": [], - "application/sparql-query": [ - "rq" - ], - "application/sparql-results+xml": [ - "srx" - ], - "application/spirits-event+xml": [], - "application/srgs": [ - "gram" - ], - "application/srgs+xml": [ - "grxml" - ], - "application/sru+xml": [ - "sru" - ], - "application/ssdl+xml": [ - "ssdl" - ], - "application/ssml+xml": [ - "ssml" - ], - "application/tamp-apex-update": [], - "application/tamp-apex-update-confirm": [], - "application/tamp-community-update": [], - "application/tamp-community-update-confirm": [], - "application/tamp-error": [], - "application/tamp-sequence-adjust": [], - "application/tamp-sequence-adjust-confirm": [], - "application/tamp-status-query": [], - "application/tamp-status-response": [], - "application/tamp-update": [], - "application/tamp-update-confirm": [], - "application/tei+xml": [ - "tei", - "teicorpus" - ], - "application/thraud+xml": [ - "tfi" - ], - "application/timestamp-query": [], - "application/timestamp-reply": [], - "application/timestamped-data": [ - "tsd" - ], - "application/tve-trigger": [], - "application/ulpfec": [], - "application/vcard+xml": [], - "application/vemmi": [], - "application/vividence.scriptfile": [], - "application/vnd.3gpp.bsf+xml": [], - "application/vnd.3gpp.pic-bw-large": [ - "plb" - ], - "application/vnd.3gpp.pic-bw-small": [ - "psb" - ], - "application/vnd.3gpp.pic-bw-var": [ - "pvb" - ], - "application/vnd.3gpp.sms": [], - "application/vnd.3gpp2.bcmcsinfo+xml": [], - "application/vnd.3gpp2.sms": [], - "application/vnd.3gpp2.tcap": [ - "tcap" - ], - "application/vnd.3m.post-it-notes": [ - "pwn" - ], - "application/vnd.accpac.simply.aso": [ - "aso" - ], - "application/vnd.accpac.simply.imp": [ - "imp" - ], - "application/vnd.acucobol": [ - "acu" - ], - "application/vnd.acucorp": [ - "atc", - "acutc" - ], - "application/vnd.adobe.air-application-installer-package+zip": [ - "air" - ], - "application/vnd.adobe.formscentral.fcdt": [ - "fcdt" - ], - "application/vnd.adobe.fxp": [ - "fxp", - "fxpl" - ], - "application/vnd.adobe.partial-upload": [], - "application/vnd.adobe.xdp+xml": [ - "xdp" - ], - "application/vnd.adobe.xfdf": [ - "xfdf" - ], - "application/vnd.aether.imp": [], - "application/vnd.ah-barcode": [], - "application/vnd.ahead.space": [ - "ahead" - ], - "application/vnd.airzip.filesecure.azf": [ - "azf" - ], - "application/vnd.airzip.filesecure.azs": [ - "azs" - ], - "application/vnd.amazon.ebook": [ - "azw" - ], - "application/vnd.americandynamics.acc": [ - "acc" - ], - "application/vnd.amiga.ami": [ - "ami" - ], - "application/vnd.amundsen.maze+xml": [], - "application/vnd.android.package-archive": [ - "apk" - ], - "application/vnd.anser-web-certificate-issue-initiation": [ - "cii" - ], - "application/vnd.anser-web-funds-transfer-initiation": [ - "fti" - ], - "application/vnd.antix.game-component": [ - "atx" - ], - "application/vnd.apple.installer+xml": [ - "mpkg" - ], - "application/vnd.apple.mpegurl": [ - "m3u8" - ], - "application/vnd.arastra.swi": [], - "application/vnd.aristanetworks.swi": [ - "swi" - ], - "application/vnd.astraea-software.iota": [ - "iota" - ], - "application/vnd.audiograph": [ - "aep" - ], - "application/vnd.autopackage": [], - "application/vnd.avistar+xml": [], - "application/vnd.blueice.multipass": [ - "mpm" - ], - "application/vnd.bluetooth.ep.oob": [], - "application/vnd.bmi": [ - "bmi" - ], - "application/vnd.businessobjects": [ - "rep" - ], - "application/vnd.cab-jscript": [], - "application/vnd.canon-cpdl": [], - "application/vnd.canon-lips": [], - "application/vnd.cendio.thinlinc.clientconf": [], - "application/vnd.chemdraw+xml": [ - "cdxml" - ], - "application/vnd.chipnuts.karaoke-mmd": [ - "mmd" - ], - "application/vnd.cinderella": [ - "cdy" - ], - "application/vnd.cirpack.isdn-ext": [], - "application/vnd.claymore": [ - "cla" - ], - "application/vnd.cloanto.rp9": [ - "rp9" - ], - "application/vnd.clonk.c4group": [ - "c4g", - "c4d", - "c4f", - "c4p", - "c4u" - ], - "application/vnd.cluetrust.cartomobile-config": [ - "c11amc" - ], - "application/vnd.cluetrust.cartomobile-config-pkg": [ - "c11amz" - ], - "application/vnd.collection+json": [], - "application/vnd.commerce-battelle": [], - "application/vnd.commonspace": [ - "csp" - ], - "application/vnd.contact.cmsg": [ - "cdbcmsg" - ], - "application/vnd.cosmocaller": [ - "cmc" - ], - "application/vnd.crick.clicker": [ - "clkx" - ], - "application/vnd.crick.clicker.keyboard": [ - "clkk" - ], - "application/vnd.crick.clicker.palette": [ - "clkp" - ], - "application/vnd.crick.clicker.template": [ - "clkt" - ], - "application/vnd.crick.clicker.wordbank": [ - "clkw" - ], - "application/vnd.criticaltools.wbs+xml": [ - "wbs" - ], - "application/vnd.ctc-posml": [ - "pml" - ], - "application/vnd.ctct.ws+xml": [], - "application/vnd.cups-pdf": [], - "application/vnd.cups-postscript": [], - "application/vnd.cups-ppd": [ - "ppd" - ], - "application/vnd.cups-raster": [], - "application/vnd.cups-raw": [], - "application/vnd.curl": [], - "application/vnd.curl.car": [ - "car" - ], - "application/vnd.curl.pcurl": [ - "pcurl" - ], - "application/vnd.cybank": [], - "application/vnd.dart": [ - "dart" - ], - "application/vnd.data-vision.rdz": [ - "rdz" - ], - "application/vnd.dece.data": [ - "uvf", - "uvvf", - "uvd", - "uvvd" - ], - "application/vnd.dece.ttml+xml": [ - "uvt", - "uvvt" - ], - "application/vnd.dece.unspecified": [ - "uvx", - "uvvx" - ], - "application/vnd.dece.zip": [ - "uvz", - "uvvz" - ], - "application/vnd.denovo.fcselayout-link": [ - "fe_launch" - ], - "application/vnd.dir-bi.plate-dl-nosuffix": [], - "application/vnd.dna": [ - "dna" - ], - "application/vnd.dolby.mlp": [ - "mlp" - ], - "application/vnd.dolby.mobile.1": [], - "application/vnd.dolby.mobile.2": [], - "application/vnd.dpgraph": [ - "dpg" - ], - "application/vnd.dreamfactory": [ - "dfac" - ], - "application/vnd.ds-keypoint": [ - "kpxx" - ], - "application/vnd.dvb.ait": [ - "ait" - ], - "application/vnd.dvb.dvbj": [], - "application/vnd.dvb.esgcontainer": [], - "application/vnd.dvb.ipdcdftnotifaccess": [], - "application/vnd.dvb.ipdcesgaccess": [], - "application/vnd.dvb.ipdcesgaccess2": [], - "application/vnd.dvb.ipdcesgpdd": [], - "application/vnd.dvb.ipdcroaming": [], - "application/vnd.dvb.iptv.alfec-base": [], - "application/vnd.dvb.iptv.alfec-enhancement": [], - "application/vnd.dvb.notif-aggregate-root+xml": [], - "application/vnd.dvb.notif-container+xml": [], - "application/vnd.dvb.notif-generic+xml": [], - "application/vnd.dvb.notif-ia-msglist+xml": [], - "application/vnd.dvb.notif-ia-registration-request+xml": [], - "application/vnd.dvb.notif-ia-registration-response+xml": [], - "application/vnd.dvb.notif-init+xml": [], - "application/vnd.dvb.pfr": [], - "application/vnd.dvb.service": [ - "svc" - ], - "application/vnd.dxr": [], - "application/vnd.dynageo": [ - "geo" - ], - "application/vnd.easykaraoke.cdgdownload": [], - "application/vnd.ecdis-update": [], - "application/vnd.ecowin.chart": [ - "mag" - ], - "application/vnd.ecowin.filerequest": [], - "application/vnd.ecowin.fileupdate": [], - "application/vnd.ecowin.series": [], - "application/vnd.ecowin.seriesrequest": [], - "application/vnd.ecowin.seriesupdate": [], - "application/vnd.emclient.accessrequest+xml": [], - "application/vnd.enliven": [ - "nml" - ], - "application/vnd.eprints.data+xml": [], - "application/vnd.epson.esf": [ - "esf" - ], - "application/vnd.epson.msf": [ - "msf" - ], - "application/vnd.epson.quickanime": [ - "qam" - ], - "application/vnd.epson.salt": [ - "slt" - ], - "application/vnd.epson.ssf": [ - "ssf" - ], - "application/vnd.ericsson.quickcall": [], - "application/vnd.eszigno3+xml": [ - "es3", - "et3" - ], - "application/vnd.etsi.aoc+xml": [], - "application/vnd.etsi.cug+xml": [], - "application/vnd.etsi.iptvcommand+xml": [], - "application/vnd.etsi.iptvdiscovery+xml": [], - "application/vnd.etsi.iptvprofile+xml": [], - "application/vnd.etsi.iptvsad-bc+xml": [], - "application/vnd.etsi.iptvsad-cod+xml": [], - "application/vnd.etsi.iptvsad-npvr+xml": [], - "application/vnd.etsi.iptvservice+xml": [], - "application/vnd.etsi.iptvsync+xml": [], - "application/vnd.etsi.iptvueprofile+xml": [], - "application/vnd.etsi.mcid+xml": [], - "application/vnd.etsi.overload-control-policy-dataset+xml": [], - "application/vnd.etsi.sci+xml": [], - "application/vnd.etsi.simservs+xml": [], - "application/vnd.etsi.tsl+xml": [], - "application/vnd.etsi.tsl.der": [], - "application/vnd.eudora.data": [], - "application/vnd.ezpix-album": [ - "ez2" - ], - "application/vnd.ezpix-package": [ - "ez3" - ], - "application/vnd.f-secure.mobile": [], - "application/vnd.fdf": [ - "fdf" - ], - "application/vnd.fdsn.mseed": [ - "mseed" - ], - "application/vnd.fdsn.seed": [ - "seed", - "dataless" - ], - "application/vnd.ffsns": [], - "application/vnd.fints": [], - "application/vnd.flographit": [ - "gph" - ], - "application/vnd.fluxtime.clip": [ - "ftc" - ], - "application/vnd.font-fontforge-sfd": [], - "application/vnd.framemaker": [ - "fm", - "frame", - "maker", - "book" - ], - "application/vnd.frogans.fnc": [ - "fnc" - ], - "application/vnd.frogans.ltf": [ - "ltf" - ], - "application/vnd.fsc.weblaunch": [ - "fsc" - ], - "application/vnd.fujitsu.oasys": [ - "oas" - ], - "application/vnd.fujitsu.oasys2": [ - "oa2" - ], - "application/vnd.fujitsu.oasys3": [ - "oa3" - ], - "application/vnd.fujitsu.oasysgp": [ - "fg5" - ], - "application/vnd.fujitsu.oasysprs": [ - "bh2" - ], - "application/vnd.fujixerox.art-ex": [], - "application/vnd.fujixerox.art4": [], - "application/vnd.fujixerox.hbpl": [], - "application/vnd.fujixerox.ddd": [ - "ddd" - ], - "application/vnd.fujixerox.docuworks": [ - "xdw" - ], - "application/vnd.fujixerox.docuworks.binder": [ - "xbd" - ], - "application/vnd.fut-misnet": [], - "application/vnd.fuzzysheet": [ - "fzs" - ], - "application/vnd.genomatix.tuxedo": [ - "txd" - ], - "application/vnd.geocube+xml": [], - "application/vnd.geogebra.file": [ - "ggb" - ], - "application/vnd.geogebra.tool": [ - "ggt" - ], - "application/vnd.geometry-explorer": [ - "gex", - "gre" - ], - "application/vnd.geonext": [ - "gxt" - ], - "application/vnd.geoplan": [ - "g2w" - ], - "application/vnd.geospace": [ - "g3w" - ], - "application/vnd.globalplatform.card-content-mgt": [], - "application/vnd.globalplatform.card-content-mgt-response": [], - "application/vnd.gmx": [ - "gmx" - ], - "application/vnd.google-earth.kml+xml": [ - "kml" - ], - "application/vnd.google-earth.kmz": [ - "kmz" - ], - "application/vnd.grafeq": [ - "gqf", - "gqs" - ], - "application/vnd.gridmp": [], - "application/vnd.groove-account": [ - "gac" - ], - "application/vnd.groove-help": [ - "ghf" - ], - "application/vnd.groove-identity-message": [ - "gim" - ], - "application/vnd.groove-injector": [ - "grv" - ], - "application/vnd.groove-tool-message": [ - "gtm" - ], - "application/vnd.groove-tool-template": [ - "tpl" - ], - "application/vnd.groove-vcard": [ - "vcg" - ], - "application/vnd.hal+json": [], - "application/vnd.hal+xml": [ - "hal" - ], - "application/vnd.handheld-entertainment+xml": [ - "zmm" - ], - "application/vnd.hbci": [ - "hbci" - ], - "application/vnd.hcl-bireports": [], - "application/vnd.hhe.lesson-player": [ - "les" - ], - "application/vnd.hp-hpgl": [ - "hpgl" - ], - "application/vnd.hp-hpid": [ - "hpid" - ], - "application/vnd.hp-hps": [ - "hps" - ], - "application/vnd.hp-jlyt": [ - "jlt" - ], - "application/vnd.hp-pcl": [ - "pcl" - ], - "application/vnd.hp-pclxl": [ - "pclxl" - ], - "application/vnd.httphone": [], - "application/vnd.hzn-3d-crossword": [], - "application/vnd.ibm.afplinedata": [], - "application/vnd.ibm.electronic-media": [], - "application/vnd.ibm.minipay": [ - "mpy" - ], - "application/vnd.ibm.modcap": [ - "afp", - "listafp", - "list3820" - ], - "application/vnd.ibm.rights-management": [ - "irm" - ], - "application/vnd.ibm.secure-container": [ - "sc" - ], - "application/vnd.iccprofile": [ - "icc", - "icm" - ], - "application/vnd.igloader": [ - "igl" - ], - "application/vnd.immervision-ivp": [ - "ivp" - ], - "application/vnd.immervision-ivu": [ - "ivu" - ], - "application/vnd.informedcontrol.rms+xml": [], - "application/vnd.informix-visionary": [], - "application/vnd.infotech.project": [], - "application/vnd.infotech.project+xml": [], - "application/vnd.innopath.wamp.notification": [], - "application/vnd.insors.igm": [ - "igm" - ], - "application/vnd.intercon.formnet": [ - "xpw", - "xpx" - ], - "application/vnd.intergeo": [ - "i2g" - ], - "application/vnd.intertrust.digibox": [], - "application/vnd.intertrust.nncp": [], - "application/vnd.intu.qbo": [ - "qbo" - ], - "application/vnd.intu.qfx": [ - "qfx" - ], - "application/vnd.iptc.g2.conceptitem+xml": [], - "application/vnd.iptc.g2.knowledgeitem+xml": [], - "application/vnd.iptc.g2.newsitem+xml": [], - "application/vnd.iptc.g2.newsmessage+xml": [], - "application/vnd.iptc.g2.packageitem+xml": [], - "application/vnd.iptc.g2.planningitem+xml": [], - "application/vnd.ipunplugged.rcprofile": [ - "rcprofile" - ], - "application/vnd.irepository.package+xml": [ - "irp" - ], - "application/vnd.is-xpr": [ - "xpr" - ], - "application/vnd.isac.fcs": [ - "fcs" - ], - "application/vnd.jam": [ - "jam" - ], - "application/vnd.japannet-directory-service": [], - "application/vnd.japannet-jpnstore-wakeup": [], - "application/vnd.japannet-payment-wakeup": [], - "application/vnd.japannet-registration": [], - "application/vnd.japannet-registration-wakeup": [], - "application/vnd.japannet-setstore-wakeup": [], - "application/vnd.japannet-verification": [], - "application/vnd.japannet-verification-wakeup": [], - "application/vnd.jcp.javame.midlet-rms": [ - "rms" - ], - "application/vnd.jisp": [ - "jisp" - ], - "application/vnd.joost.joda-archive": [ - "joda" - ], - "application/vnd.kahootz": [ - "ktz", - "ktr" - ], - "application/vnd.kde.karbon": [ - "karbon" - ], - "application/vnd.kde.kchart": [ - "chrt" - ], - "application/vnd.kde.kformula": [ - "kfo" - ], - "application/vnd.kde.kivio": [ - "flw" - ], - "application/vnd.kde.kontour": [ - "kon" - ], - "application/vnd.kde.kpresenter": [ - "kpr", - "kpt" - ], - "application/vnd.kde.kspread": [ - "ksp" - ], - "application/vnd.kde.kword": [ - "kwd", - "kwt" - ], - "application/vnd.kenameaapp": [ - "htke" - ], - "application/vnd.kidspiration": [ - "kia" - ], - "application/vnd.kinar": [ - "kne", - "knp" - ], - "application/vnd.koan": [ - "skp", - "skd", - "skt", - "skm" - ], - "application/vnd.kodak-descriptor": [ - "sse" - ], - "application/vnd.las.las+xml": [ - "lasxml" - ], - "application/vnd.liberty-request+xml": [], - "application/vnd.llamagraphics.life-balance.desktop": [ - "lbd" - ], - "application/vnd.llamagraphics.life-balance.exchange+xml": [ - "lbe" - ], - "application/vnd.lotus-1-2-3": [ - "123" - ], - "application/vnd.lotus-approach": [ - "apr" - ], - "application/vnd.lotus-freelance": [ - "pre" - ], - "application/vnd.lotus-notes": [ - "nsf" - ], - "application/vnd.lotus-organizer": [ - "org" - ], - "application/vnd.lotus-screencam": [ - "scm" - ], - "application/vnd.lotus-wordpro": [ - "lwp" - ], - "application/vnd.macports.portpkg": [ - "portpkg" - ], - "application/vnd.marlin.drm.actiontoken+xml": [], - "application/vnd.marlin.drm.conftoken+xml": [], - "application/vnd.marlin.drm.license+xml": [], - "application/vnd.marlin.drm.mdcf": [], - "application/vnd.mcd": [ - "mcd" - ], - "application/vnd.medcalcdata": [ - "mc1" - ], - "application/vnd.mediastation.cdkey": [ - "cdkey" - ], - "application/vnd.meridian-slingshot": [], - "application/vnd.mfer": [ - "mwf" - ], - "application/vnd.mfmp": [ - "mfm" - ], - "application/vnd.micrografx.flo": [ - "flo" - ], - "application/vnd.micrografx.igx": [ - "igx" - ], - "application/vnd.mif": [ - "mif" - ], - "application/vnd.minisoft-hp3000-save": [], - "application/vnd.mitsubishi.misty-guard.trustweb": [], - "application/vnd.mobius.daf": [ - "daf" - ], - "application/vnd.mobius.dis": [ - "dis" - ], - "application/vnd.mobius.mbk": [ - "mbk" - ], - "application/vnd.mobius.mqy": [ - "mqy" - ], - "application/vnd.mobius.msl": [ - "msl" - ], - "application/vnd.mobius.plc": [ - "plc" - ], - "application/vnd.mobius.txf": [ - "txf" - ], - "application/vnd.mophun.application": [ - "mpn" - ], - "application/vnd.mophun.certificate": [ - "mpc" - ], - "application/vnd.motorola.flexsuite": [], - "application/vnd.motorola.flexsuite.adsi": [], - "application/vnd.motorola.flexsuite.fis": [], - "application/vnd.motorola.flexsuite.gotap": [], - "application/vnd.motorola.flexsuite.kmr": [], - "application/vnd.motorola.flexsuite.ttc": [], - "application/vnd.motorola.flexsuite.wem": [], - "application/vnd.motorola.iprm": [], - "application/vnd.mozilla.xul+xml": [ - "xul" - ], - "application/vnd.ms-artgalry": [ - "cil" - ], - "application/vnd.ms-asf": [], - "application/vnd.ms-cab-compressed": [ - "cab" - ], - "application/vnd.ms-color.iccprofile": [], - "application/vnd.ms-excel": [ - "xls", - "xlm", - "xla", - "xlc", - "xlt", - "xlw" - ], - "application/vnd.ms-excel.addin.macroenabled.12": [ - "xlam" - ], - "application/vnd.ms-excel.sheet.binary.macroenabled.12": [ - "xlsb" - ], - "application/vnd.ms-excel.sheet.macroenabled.12": [ - "xlsm" - ], - "application/vnd.ms-excel.template.macroenabled.12": [ - "xltm" - ], - "application/vnd.ms-fontobject": [ - "eot" - ], - "application/vnd.ms-htmlhelp": [ - "chm" - ], - "application/vnd.ms-ims": [ - "ims" - ], - "application/vnd.ms-lrm": [ - "lrm" - ], - "application/vnd.ms-office.activex+xml": [], - "application/vnd.ms-officetheme": [ - "thmx" - ], - "application/vnd.ms-opentype": [], - "application/vnd.ms-package.obfuscated-opentype": [], - "application/vnd.ms-pki.seccat": [ - "cat" - ], - "application/vnd.ms-pki.stl": [ - "stl" - ], - "application/vnd.ms-playready.initiator+xml": [], - "application/vnd.ms-powerpoint": [ - "ppt", - "pps", - "pot" - ], - "application/vnd.ms-powerpoint.addin.macroenabled.12": [ - "ppam" - ], - "application/vnd.ms-powerpoint.presentation.macroenabled.12": [ - "pptm" - ], - "application/vnd.ms-powerpoint.slide.macroenabled.12": [ - "sldm" - ], - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": [ - "ppsm" - ], - "application/vnd.ms-powerpoint.template.macroenabled.12": [ - "potm" - ], - "application/vnd.ms-printing.printticket+xml": [], - "application/vnd.ms-project": [ - "mpp", - "mpt" - ], - "application/vnd.ms-tnef": [], - "application/vnd.ms-wmdrm.lic-chlg-req": [], - "application/vnd.ms-wmdrm.lic-resp": [], - "application/vnd.ms-wmdrm.meter-chlg-req": [], - "application/vnd.ms-wmdrm.meter-resp": [], - "application/vnd.ms-word.document.macroenabled.12": [ - "docm" - ], - "application/vnd.ms-word.template.macroenabled.12": [ - "dotm" - ], - "application/vnd.ms-works": [ - "wps", - "wks", - "wcm", - "wdb" - ], - "application/vnd.ms-wpl": [ - "wpl" - ], - "application/vnd.ms-xpsdocument": [ - "xps" - ], - "application/vnd.mseq": [ - "mseq" - ], - "application/vnd.msign": [], - "application/vnd.multiad.creator": [], - "application/vnd.multiad.creator.cif": [], - "application/vnd.music-niff": [], - "application/vnd.musician": [ - "mus" - ], - "application/vnd.muvee.style": [ - "msty" - ], - "application/vnd.mynfc": [ - "taglet" - ], - "application/vnd.ncd.control": [], - "application/vnd.ncd.reference": [], - "application/vnd.nervana": [], - "application/vnd.netfpx": [], - "application/vnd.neurolanguage.nlu": [ - "nlu" - ], - "application/vnd.nitf": [ - "ntf", - "nitf" - ], - "application/vnd.noblenet-directory": [ - "nnd" - ], - "application/vnd.noblenet-sealer": [ - "nns" - ], - "application/vnd.noblenet-web": [ - "nnw" - ], - "application/vnd.nokia.catalogs": [], - "application/vnd.nokia.conml+wbxml": [], - "application/vnd.nokia.conml+xml": [], - "application/vnd.nokia.isds-radio-presets": [], - "application/vnd.nokia.iptv.config+xml": [], - "application/vnd.nokia.landmark+wbxml": [], - "application/vnd.nokia.landmark+xml": [], - "application/vnd.nokia.landmarkcollection+xml": [], - "application/vnd.nokia.n-gage.ac+xml": [], - "application/vnd.nokia.n-gage.data": [ - "ngdat" - ], - "application/vnd.nokia.ncd": [], - "application/vnd.nokia.pcd+wbxml": [], - "application/vnd.nokia.pcd+xml": [], - "application/vnd.nokia.radio-preset": [ - "rpst" - ], - "application/vnd.nokia.radio-presets": [ - "rpss" - ], - "application/vnd.novadigm.edm": [ - "edm" - ], - "application/vnd.novadigm.edx": [ - "edx" - ], - "application/vnd.novadigm.ext": [ - "ext" - ], - "application/vnd.ntt-local.file-transfer": [], - "application/vnd.ntt-local.sip-ta_remote": [], - "application/vnd.ntt-local.sip-ta_tcp_stream": [], - "application/vnd.oasis.opendocument.chart": [ - "odc" - ], - "application/vnd.oasis.opendocument.chart-template": [ - "otc" - ], - "application/vnd.oasis.opendocument.database": [ - "odb" - ], - "application/vnd.oasis.opendocument.formula": [ - "odf" - ], - "application/vnd.oasis.opendocument.formula-template": [ - "odft" - ], - "application/vnd.oasis.opendocument.graphics": [ - "odg" - ], - "application/vnd.oasis.opendocument.graphics-template": [ - "otg" - ], - "application/vnd.oasis.opendocument.image": [ - "odi" - ], - "application/vnd.oasis.opendocument.image-template": [ - "oti" - ], - "application/vnd.oasis.opendocument.presentation": [ - "odp" - ], - "application/vnd.oasis.opendocument.presentation-template": [ - "otp" - ], - "application/vnd.oasis.opendocument.spreadsheet": [ - "ods" - ], - "application/vnd.oasis.opendocument.spreadsheet-template": [ - "ots" - ], - "application/vnd.oasis.opendocument.text": [ - "odt" - ], - "application/vnd.oasis.opendocument.text-master": [ - "odm" - ], - "application/vnd.oasis.opendocument.text-template": [ - "ott" - ], - "application/vnd.oasis.opendocument.text-web": [ - "oth" - ], - "application/vnd.obn": [], - "application/vnd.oftn.l10n+json": [], - "application/vnd.oipf.contentaccessdownload+xml": [], - "application/vnd.oipf.contentaccessstreaming+xml": [], - "application/vnd.oipf.cspg-hexbinary": [], - "application/vnd.oipf.dae.svg+xml": [], - "application/vnd.oipf.dae.xhtml+xml": [], - "application/vnd.oipf.mippvcontrolmessage+xml": [], - "application/vnd.oipf.pae.gem": [], - "application/vnd.oipf.spdiscovery+xml": [], - "application/vnd.oipf.spdlist+xml": [], - "application/vnd.oipf.ueprofile+xml": [], - "application/vnd.oipf.userprofile+xml": [], - "application/vnd.olpc-sugar": [ - "xo" - ], - "application/vnd.oma-scws-config": [], - "application/vnd.oma-scws-http-request": [], - "application/vnd.oma-scws-http-response": [], - "application/vnd.oma.bcast.associated-procedure-parameter+xml": [], - "application/vnd.oma.bcast.drm-trigger+xml": [], - "application/vnd.oma.bcast.imd+xml": [], - "application/vnd.oma.bcast.ltkm": [], - "application/vnd.oma.bcast.notification+xml": [], - "application/vnd.oma.bcast.provisioningtrigger": [], - "application/vnd.oma.bcast.sgboot": [], - "application/vnd.oma.bcast.sgdd+xml": [], - "application/vnd.oma.bcast.sgdu": [], - "application/vnd.oma.bcast.simple-symbol-container": [], - "application/vnd.oma.bcast.smartcard-trigger+xml": [], - "application/vnd.oma.bcast.sprov+xml": [], - "application/vnd.oma.bcast.stkm": [], - "application/vnd.oma.cab-address-book+xml": [], - "application/vnd.oma.cab-feature-handler+xml": [], - "application/vnd.oma.cab-pcc+xml": [], - "application/vnd.oma.cab-user-prefs+xml": [], - "application/vnd.oma.dcd": [], - "application/vnd.oma.dcdc": [], - "application/vnd.oma.dd2+xml": [ - "dd2" - ], - "application/vnd.oma.drm.risd+xml": [], - "application/vnd.oma.group-usage-list+xml": [], - "application/vnd.oma.pal+xml": [], - "application/vnd.oma.poc.detailed-progress-report+xml": [], - "application/vnd.oma.poc.final-report+xml": [], - "application/vnd.oma.poc.groups+xml": [], - "application/vnd.oma.poc.invocation-descriptor+xml": [], - "application/vnd.oma.poc.optimized-progress-report+xml": [], - "application/vnd.oma.push": [], - "application/vnd.oma.scidm.messages+xml": [], - "application/vnd.oma.xcap-directory+xml": [], - "application/vnd.omads-email+xml": [], - "application/vnd.omads-file+xml": [], - "application/vnd.omads-folder+xml": [], - "application/vnd.omaloc-supl-init": [], - "application/vnd.openofficeorg.extension": [ - "oxt" - ], - "application/vnd.openxmlformats-officedocument.custom-properties+xml": [], - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": [], - "application/vnd.openxmlformats-officedocument.drawing+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": [], - "application/vnd.openxmlformats-officedocument.extended-properties+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presentation": [ - "pptx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slide": [ - "sldx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [ - "ppsx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.template": [ - "potx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [ - "xlsx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [ - "xltx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": [], - "application/vnd.openxmlformats-officedocument.theme+xml": [], - "application/vnd.openxmlformats-officedocument.themeoverride+xml": [], - "application/vnd.openxmlformats-officedocument.vmldrawing": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [ - "docx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [ - "dotx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": [], - "application/vnd.openxmlformats-package.core-properties+xml": [], - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": [], - "application/vnd.openxmlformats-package.relationships+xml": [], - "application/vnd.quobject-quoxdocument": [], - "application/vnd.osa.netdeploy": [], - "application/vnd.osgeo.mapguide.package": [ - "mgp" - ], - "application/vnd.osgi.bundle": [], - "application/vnd.osgi.dp": [ - "dp" - ], - "application/vnd.osgi.subsystem": [ - "esa" - ], - "application/vnd.otps.ct-kip+xml": [], - "application/vnd.palm": [ - "pdb", - "pqa", - "oprc" - ], - "application/vnd.paos.xml": [], - "application/vnd.pawaafile": [ - "paw" - ], - "application/vnd.pg.format": [ - "str" - ], - "application/vnd.pg.osasli": [ - "ei6" - ], - "application/vnd.piaccess.application-licence": [], - "application/vnd.picsel": [ - "efif" - ], - "application/vnd.pmi.widget": [ - "wg" - ], - "application/vnd.poc.group-advertisement+xml": [], - "application/vnd.pocketlearn": [ - "plf" - ], - "application/vnd.powerbuilder6": [ - "pbd" - ], - "application/vnd.powerbuilder6-s": [], - "application/vnd.powerbuilder7": [], - "application/vnd.powerbuilder7-s": [], - "application/vnd.powerbuilder75": [], - "application/vnd.powerbuilder75-s": [], - "application/vnd.preminet": [], - "application/vnd.previewsystems.box": [ - "box" - ], - "application/vnd.proteus.magazine": [ - "mgz" - ], - "application/vnd.publishare-delta-tree": [ - "qps" - ], - "application/vnd.pvi.ptid1": [ - "ptid" - ], - "application/vnd.pwg-multiplexed": [], - "application/vnd.pwg-xhtml-print+xml": [], - "application/vnd.qualcomm.brew-app-res": [], - "application/vnd.quark.quarkxpress": [ - "qxd", - "qxt", - "qwd", - "qwt", - "qxl", - "qxb" - ], - "application/vnd.radisys.moml+xml": [], - "application/vnd.radisys.msml+xml": [], - "application/vnd.radisys.msml-audit+xml": [], - "application/vnd.radisys.msml-audit-conf+xml": [], - "application/vnd.radisys.msml-audit-conn+xml": [], - "application/vnd.radisys.msml-audit-dialog+xml": [], - "application/vnd.radisys.msml-audit-stream+xml": [], - "application/vnd.radisys.msml-conf+xml": [], - "application/vnd.radisys.msml-dialog+xml": [], - "application/vnd.radisys.msml-dialog-base+xml": [], - "application/vnd.radisys.msml-dialog-fax-detect+xml": [], - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": [], - "application/vnd.radisys.msml-dialog-group+xml": [], - "application/vnd.radisys.msml-dialog-speech+xml": [], - "application/vnd.radisys.msml-dialog-transform+xml": [], - "application/vnd.rainstor.data": [], - "application/vnd.rapid": [], - "application/vnd.realvnc.bed": [ - "bed" - ], - "application/vnd.recordare.musicxml": [ - "mxl" - ], - "application/vnd.recordare.musicxml+xml": [ - "musicxml" - ], - "application/vnd.renlearn.rlprint": [], - "application/vnd.rig.cryptonote": [ - "cryptonote" - ], - "application/vnd.rim.cod": [ - "cod" - ], - "application/vnd.rn-realmedia": [ - "rm" - ], - "application/vnd.rn-realmedia-vbr": [ - "rmvb" - ], - "application/vnd.route66.link66+xml": [ - "link66" - ], - "application/vnd.rs-274x": [], - "application/vnd.ruckus.download": [], - "application/vnd.s3sms": [], - "application/vnd.sailingtracker.track": [ - "st" - ], - "application/vnd.sbm.cid": [], - "application/vnd.sbm.mid2": [], - "application/vnd.scribus": [], - "application/vnd.sealed.3df": [], - "application/vnd.sealed.csf": [], - "application/vnd.sealed.doc": [], - "application/vnd.sealed.eml": [], - "application/vnd.sealed.mht": [], - "application/vnd.sealed.net": [], - "application/vnd.sealed.ppt": [], - "application/vnd.sealed.tiff": [], - "application/vnd.sealed.xls": [], - "application/vnd.sealedmedia.softseal.html": [], - "application/vnd.sealedmedia.softseal.pdf": [], - "application/vnd.seemail": [ - "see" - ], - "application/vnd.sema": [ - "sema" - ], - "application/vnd.semd": [ - "semd" - ], - "application/vnd.semf": [ - "semf" - ], - "application/vnd.shana.informed.formdata": [ - "ifm" - ], - "application/vnd.shana.informed.formtemplate": [ - "itp" - ], - "application/vnd.shana.informed.interchange": [ - "iif" - ], - "application/vnd.shana.informed.package": [ - "ipk" - ], - "application/vnd.simtech-mindmapper": [ - "twd", - "twds" - ], - "application/vnd.smaf": [ - "mmf" - ], - "application/vnd.smart.notebook": [], - "application/vnd.smart.teacher": [ - "teacher" - ], - "application/vnd.software602.filler.form+xml": [], - "application/vnd.software602.filler.form-xml-zip": [], - "application/vnd.solent.sdkm+xml": [ - "sdkm", - "sdkd" - ], - "application/vnd.spotfire.dxp": [ - "dxp" - ], - "application/vnd.spotfire.sfs": [ - "sfs" - ], - "application/vnd.sss-cod": [], - "application/vnd.sss-dtf": [], - "application/vnd.sss-ntf": [], - "application/vnd.stardivision.calc": [ - "sdc" - ], - "application/vnd.stardivision.draw": [ - "sda" - ], - "application/vnd.stardivision.impress": [ - "sdd" - ], - "application/vnd.stardivision.math": [ - "smf" - ], - "application/vnd.stardivision.writer": [ - "sdw", - "vor" - ], - "application/vnd.stardivision.writer-global": [ - "sgl" - ], - "application/vnd.stepmania.package": [ - "smzip" - ], - "application/vnd.stepmania.stepchart": [ - "sm" - ], - "application/vnd.street-stream": [], - "application/vnd.sun.xml.calc": [ - "sxc" - ], - "application/vnd.sun.xml.calc.template": [ - "stc" - ], - "application/vnd.sun.xml.draw": [ - "sxd" - ], - "application/vnd.sun.xml.draw.template": [ - "std" - ], - "application/vnd.sun.xml.impress": [ - "sxi" - ], - "application/vnd.sun.xml.impress.template": [ - "sti" - ], - "application/vnd.sun.xml.math": [ - "sxm" - ], - "application/vnd.sun.xml.writer": [ - "sxw" - ], - "application/vnd.sun.xml.writer.global": [ - "sxg" - ], - "application/vnd.sun.xml.writer.template": [ - "stw" - ], - "application/vnd.sun.wadl+xml": [], - "application/vnd.sus-calendar": [ - "sus", - "susp" - ], - "application/vnd.svd": [ - "svd" - ], - "application/vnd.swiftview-ics": [], - "application/vnd.symbian.install": [ - "sis", - "sisx" - ], - "application/vnd.syncml+xml": [ - "xsm" - ], - "application/vnd.syncml.dm+wbxml": [ - "bdm" - ], - "application/vnd.syncml.dm+xml": [ - "xdm" - ], - "application/vnd.syncml.dm.notification": [], - "application/vnd.syncml.ds.notification": [], - "application/vnd.tao.intent-module-archive": [ - "tao" - ], - "application/vnd.tcpdump.pcap": [ - "pcap", - "cap", - "dmp" - ], - "application/vnd.tmobile-livetv": [ - "tmo" - ], - "application/vnd.trid.tpt": [ - "tpt" - ], - "application/vnd.triscape.mxs": [ - "mxs" - ], - "application/vnd.trueapp": [ - "tra" - ], - "application/vnd.truedoc": [], - "application/vnd.ubisoft.webplayer": [], - "application/vnd.ufdl": [ - "ufd", - "ufdl" - ], - "application/vnd.uiq.theme": [ - "utz" - ], - "application/vnd.umajin": [ - "umj" - ], - "application/vnd.unity": [ - "unityweb" - ], - "application/vnd.uoml+xml": [ - "uoml" - ], - "application/vnd.uplanet.alert": [], - "application/vnd.uplanet.alert-wbxml": [], - "application/vnd.uplanet.bearer-choice": [], - "application/vnd.uplanet.bearer-choice-wbxml": [], - "application/vnd.uplanet.cacheop": [], - "application/vnd.uplanet.cacheop-wbxml": [], - "application/vnd.uplanet.channel": [], - "application/vnd.uplanet.channel-wbxml": [], - "application/vnd.uplanet.list": [], - "application/vnd.uplanet.list-wbxml": [], - "application/vnd.uplanet.listcmd": [], - "application/vnd.uplanet.listcmd-wbxml": [], - "application/vnd.uplanet.signal": [], - "application/vnd.vcx": [ - "vcx" - ], - "application/vnd.vd-study": [], - "application/vnd.vectorworks": [], - "application/vnd.verimatrix.vcas": [], - "application/vnd.vidsoft.vidconference": [], - "application/vnd.visio": [ - "vsd", - "vst", - "vss", - "vsw" - ], - "application/vnd.visionary": [ - "vis" - ], - "application/vnd.vividence.scriptfile": [], - "application/vnd.vsf": [ - "vsf" - ], - "application/vnd.wap.sic": [], - "application/vnd.wap.slc": [], - "application/vnd.wap.wbxml": [ - "wbxml" - ], - "application/vnd.wap.wmlc": [ - "wmlc" - ], - "application/vnd.wap.wmlscriptc": [ - "wmlsc" - ], - "application/vnd.webturbo": [ - "wtb" - ], - "application/vnd.wfa.wsc": [], - "application/vnd.wmc": [], - "application/vnd.wmf.bootstrap": [], - "application/vnd.wolfram.mathematica": [], - "application/vnd.wolfram.mathematica.package": [], - "application/vnd.wolfram.player": [ - "nbp" - ], - "application/vnd.wordperfect": [ - "wpd" - ], - "application/vnd.wqd": [ - "wqd" - ], - "application/vnd.wrq-hp3000-labelled": [], - "application/vnd.wt.stf": [ - "stf" - ], - "application/vnd.wv.csp+wbxml": [], - "application/vnd.wv.csp+xml": [], - "application/vnd.wv.ssp+xml": [], - "application/vnd.xara": [ - "xar" - ], - "application/vnd.xfdl": [ - "xfdl" - ], - "application/vnd.xfdl.webform": [], - "application/vnd.xmi+xml": [], - "application/vnd.xmpie.cpkg": [], - "application/vnd.xmpie.dpkg": [], - "application/vnd.xmpie.plan": [], - "application/vnd.xmpie.ppkg": [], - "application/vnd.xmpie.xlim": [], - "application/vnd.yamaha.hv-dic": [ - "hvd" - ], - "application/vnd.yamaha.hv-script": [ - "hvs" - ], - "application/vnd.yamaha.hv-voice": [ - "hvp" - ], - "application/vnd.yamaha.openscoreformat": [ - "osf" - ], - "application/vnd.yamaha.openscoreformat.osfpvg+xml": [ - "osfpvg" - ], - "application/vnd.yamaha.remote-setup": [], - "application/vnd.yamaha.smaf-audio": [ - "saf" - ], - "application/vnd.yamaha.smaf-phrase": [ - "spf" - ], - "application/vnd.yamaha.through-ngn": [], - "application/vnd.yamaha.tunnel-udpencap": [], - "application/vnd.yellowriver-custom-menu": [ - "cmp" - ], - "application/vnd.zul": [ - "zir", - "zirz" - ], - "application/vnd.zzazz.deck+xml": [ - "zaz" - ], - "application/voicexml+xml": [ - "vxml" - ], - "application/vq-rtcpxr": [], - "application/watcherinfo+xml": [], - "application/whoispp-query": [], - "application/whoispp-response": [], - "application/widget": [ - "wgt" - ], - "application/winhlp": [ - "hlp" - ], - "application/wita": [], - "application/wordperfect5.1": [], - "application/wsdl+xml": [ - "wsdl" - ], - "application/wspolicy+xml": [ - "wspolicy" - ], - "application/x-7z-compressed": [ - "7z" - ], - "application/x-abiword": [ - "abw" - ], - "application/x-ace-compressed": [ - "ace" - ], - "application/x-amf": [], - "application/x-apple-diskimage": [ - "dmg" - ], - "application/x-authorware-bin": [ - "aab", - "x32", - "u32", - "vox" - ], - "application/x-authorware-map": [ - "aam" - ], - "application/x-authorware-seg": [ - "aas" - ], - "application/x-bcpio": [ - "bcpio" - ], - "application/x-bittorrent": [ - "torrent" - ], - "application/x-blorb": [ - "blb", - "blorb" - ], - "application/x-bzip": [ - "bz" - ], - "application/x-bzip2": [ - "bz2", - "boz" - ], - "application/x-cbr": [ - "cbr", - "cba", - "cbt", - "cbz", - "cb7" - ], - "application/x-cdlink": [ - "vcd" - ], - "application/x-cfs-compressed": [ - "cfs" - ], - "application/x-chat": [ - "chat" - ], - "application/x-chess-pgn": [ - "pgn" - ], - "application/x-conference": [ - "nsc" - ], - "application/x-compress": [], - "application/x-cpio": [ - "cpio" - ], - "application/x-csh": [ - "csh" - ], - "application/x-debian-package": [ - "deb", - "udeb" - ], - "application/x-dgc-compressed": [ - "dgc" - ], - "application/x-director": [ - "dir", - "dcr", - "dxr", - "cst", - "cct", - "cxt", - "w3d", - "fgd", - "swa" - ], - "application/x-doom": [ - "wad" - ], - "application/x-dtbncx+xml": [ - "ncx" - ], - "application/x-dtbook+xml": [ - "dtb" - ], - "application/x-dtbresource+xml": [ - "res" - ], - "application/x-dvi": [ - "dvi" - ], - "application/x-envoy": [ - "evy" - ], - "application/x-eva": [ - "eva" - ], - "application/x-font-bdf": [ - "bdf" - ], - "application/x-font-dos": [], - "application/x-font-framemaker": [], - "application/x-font-ghostscript": [ - "gsf" - ], - "application/x-font-libgrx": [], - "application/x-font-linux-psf": [ - "psf" - ], - "application/x-font-otf": [ - "otf" - ], - "application/x-font-pcf": [ - "pcf" - ], - "application/x-font-snf": [ - "snf" - ], - "application/x-font-speedo": [], - "application/x-font-sunos-news": [], - "application/x-font-ttf": [ - "ttf", - "ttc" - ], - "application/x-font-type1": [ - "pfa", - "pfb", - "pfm", - "afm" - ], - "application/font-woff": [ - "woff" - ], - "application/x-font-vfont": [], - "application/x-freearc": [ - "arc" - ], - "application/x-futuresplash": [ - "spl" - ], - "application/x-gca-compressed": [ - "gca" - ], - "application/x-glulx": [ - "ulx" - ], - "application/x-gnumeric": [ - "gnumeric" - ], - "application/x-gramps-xml": [ - "gramps" - ], - "application/x-gtar": [ - "gtar" - ], - "application/x-gzip": [], - "application/x-hdf": [ - "hdf" - ], - "application/x-install-instructions": [ - "install" - ], - "application/x-iso9660-image": [ - "iso" - ], - "application/x-java-jnlp-file": [ - "jnlp" - ], - "application/x-latex": [ - "latex" - ], - "application/x-lzh-compressed": [ - "lzh", - "lha" - ], - "application/x-mie": [ - "mie" - ], - "application/x-mobipocket-ebook": [ - "prc", - "mobi" - ], - "application/x-ms-application": [ - "application" - ], - "application/x-ms-shortcut": [ - "lnk" - ], - "application/x-ms-wmd": [ - "wmd" - ], - "application/x-ms-wmz": [ - "wmz" - ], - "application/x-ms-xbap": [ - "xbap" - ], - "application/x-msaccess": [ - "mdb" - ], - "application/x-msbinder": [ - "obd" - ], - "application/x-mscardfile": [ - "crd" - ], - "application/x-msclip": [ - "clp" - ], - "application/x-msdownload": [ - "exe", - "dll", - "com", - "bat", - "msi" - ], - "application/x-msmediaview": [ - "mvb", - "m13", - "m14" - ], - "application/x-msmetafile": [ - "wmf", - "wmz", - "emf", - "emz" - ], - "application/x-msmoney": [ - "mny" - ], - "application/x-mspublisher": [ - "pub" - ], - "application/x-msschedule": [ - "scd" - ], - "application/x-msterminal": [ - "trm" - ], - "application/x-mswrite": [ - "wri" - ], - "application/x-netcdf": [ - "nc", - "cdf" - ], - "application/x-nzb": [ - "nzb" - ], - "application/x-pkcs12": [ - "p12", - "pfx" - ], - "application/x-pkcs7-certificates": [ - "p7b", - "spc" - ], - "application/x-pkcs7-certreqresp": [ - "p7r" - ], - "application/x-rar-compressed": [ - "rar" - ], - "application/x-research-info-systems": [ - "ris" - ], - "application/x-sh": [ - "sh" - ], - "application/x-shar": [ - "shar" - ], - "application/x-shockwave-flash": [ - "swf" - ], - "application/x-silverlight-app": [ - "xap" - ], - "application/x-sql": [ - "sql" - ], - "application/x-stuffit": [ - "sit" - ], - "application/x-stuffitx": [ - "sitx" - ], - "application/x-subrip": [ - "srt" - ], - "application/x-sv4cpio": [ - "sv4cpio" - ], - "application/x-sv4crc": [ - "sv4crc" - ], - "application/x-t3vm-image": [ - "t3" - ], - "application/x-tads": [ - "gam" - ], - "application/x-tar": [ - "tar" - ], - "application/x-tcl": [ - "tcl" - ], - "application/x-tex": [ - "tex" - ], - "application/x-tex-tfm": [ - "tfm" - ], - "application/x-texinfo": [ - "texinfo", - "texi" - ], - "application/x-tgif": [ - "obj" - ], - "application/x-ustar": [ - "ustar" - ], - "application/x-wais-source": [ - "src" - ], - "application/x-x509-ca-cert": [ - "der", - "crt" - ], - "application/x-xfig": [ - "fig" - ], - "application/x-xliff+xml": [ - "xlf" - ], - "application/x-xpinstall": [ - "xpi" - ], - "application/x-xz": [ - "xz" - ], - "application/x-zmachine": [ - "z1", - "z2", - "z3", - "z4", - "z5", - "z6", - "z7", - "z8" - ], - "application/x400-bp": [], - "application/xaml+xml": [ - "xaml" - ], - "application/xcap-att+xml": [], - "application/xcap-caps+xml": [], - "application/xcap-diff+xml": [ - "xdf" - ], - "application/xcap-el+xml": [], - "application/xcap-error+xml": [], - "application/xcap-ns+xml": [], - "application/xcon-conference-info-diff+xml": [], - "application/xcon-conference-info+xml": [], - "application/xenc+xml": [ - "xenc" - ], - "application/xhtml+xml": [ - "xhtml", - "xht" - ], - "application/xhtml-voice+xml": [], - "application/xml": [ - "xml", - "xsl" - ], - "application/xml-dtd": [ - "dtd" - ], - "application/xml-external-parsed-entity": [], - "application/xmpp+xml": [], - "application/xop+xml": [ - "xop" - ], - "application/xproc+xml": [ - "xpl" - ], - "application/xslt+xml": [ - "xslt" - ], - "application/xspf+xml": [ - "xspf" - ], - "application/xv+xml": [ - "mxml", - "xhvml", - "xvml", - "xvm" - ], - "application/yang": [ - "yang" - ], - "application/yin+xml": [ - "yin" - ], - "application/zip": [ - "zip" - ], - "audio/1d-interleaved-parityfec": [], - "audio/32kadpcm": [], - "audio/3gpp": [], - "audio/3gpp2": [], - "audio/ac3": [], - "audio/adpcm": [ - "adp" - ], - "audio/amr": [], - "audio/amr-wb": [], - "audio/amr-wb+": [], - "audio/asc": [], - "audio/atrac-advanced-lossless": [], - "audio/atrac-x": [], - "audio/atrac3": [], - "audio/basic": [ - "au", - "snd" - ], - "audio/bv16": [], - "audio/bv32": [], - "audio/clearmode": [], - "audio/cn": [], - "audio/dat12": [], - "audio/dls": [], - "audio/dsr-es201108": [], - "audio/dsr-es202050": [], - "audio/dsr-es202211": [], - "audio/dsr-es202212": [], - "audio/dv": [], - "audio/dvi4": [], - "audio/eac3": [], - "audio/evrc": [], - "audio/evrc-qcp": [], - "audio/evrc0": [], - "audio/evrc1": [], - "audio/evrcb": [], - "audio/evrcb0": [], - "audio/evrcb1": [], - "audio/evrcwb": [], - "audio/evrcwb0": [], - "audio/evrcwb1": [], - "audio/example": [], - "audio/fwdred": [], - "audio/g719": [], - "audio/g722": [], - "audio/g7221": [], - "audio/g723": [], - "audio/g726-16": [], - "audio/g726-24": [], - "audio/g726-32": [], - "audio/g726-40": [], - "audio/g728": [], - "audio/g729": [], - "audio/g7291": [], - "audio/g729d": [], - "audio/g729e": [], - "audio/gsm": [], - "audio/gsm-efr": [], - "audio/gsm-hr-08": [], - "audio/ilbc": [], - "audio/ip-mr_v2.5": [], - "audio/isac": [], - "audio/l16": [], - "audio/l20": [], - "audio/l24": [], - "audio/l8": [], - "audio/lpc": [], - "audio/midi": [ - "mid", - "midi", - "kar", - "rmi" - ], - "audio/mobile-xmf": [], - "audio/mp4": [ - "mp4a" - ], - "audio/mp4a-latm": [], - "audio/mpa": [], - "audio/mpa-robust": [], - "audio/mpeg": [ - "mpga", - "mp2", - "mp2a", - "mp3", - "m2a", - "m3a" - ], - "audio/mpeg4-generic": [], - "audio/musepack": [], - "audio/ogg": [ - "oga", - "ogg", - "spx" - ], - "audio/opus": [], - "audio/parityfec": [], - "audio/pcma": [], - "audio/pcma-wb": [], - "audio/pcmu-wb": [], - "audio/pcmu": [], - "audio/prs.sid": [], - "audio/qcelp": [], - "audio/red": [], - "audio/rtp-enc-aescm128": [], - "audio/rtp-midi": [], - "audio/rtx": [], - "audio/s3m": [ - "s3m" - ], - "audio/silk": [ - "sil" - ], - "audio/smv": [], - "audio/smv0": [], - "audio/smv-qcp": [], - "audio/sp-midi": [], - "audio/speex": [], - "audio/t140c": [], - "audio/t38": [], - "audio/telephone-event": [], - "audio/tone": [], - "audio/uemclip": [], - "audio/ulpfec": [], - "audio/vdvi": [], - "audio/vmr-wb": [], - "audio/vnd.3gpp.iufp": [], - "audio/vnd.4sb": [], - "audio/vnd.audiokoz": [], - "audio/vnd.celp": [], - "audio/vnd.cisco.nse": [], - "audio/vnd.cmles.radio-events": [], - "audio/vnd.cns.anp1": [], - "audio/vnd.cns.inf1": [], - "audio/vnd.dece.audio": [ - "uva", - "uvva" - ], - "audio/vnd.digital-winds": [ - "eol" - ], - "audio/vnd.dlna.adts": [], - "audio/vnd.dolby.heaac.1": [], - "audio/vnd.dolby.heaac.2": [], - "audio/vnd.dolby.mlp": [], - "audio/vnd.dolby.mps": [], - "audio/vnd.dolby.pl2": [], - "audio/vnd.dolby.pl2x": [], - "audio/vnd.dolby.pl2z": [], - "audio/vnd.dolby.pulse.1": [], - "audio/vnd.dra": [ - "dra" - ], - "audio/vnd.dts": [ - "dts" - ], - "audio/vnd.dts.hd": [ - "dtshd" - ], - "audio/vnd.dvb.file": [], - "audio/vnd.everad.plj": [], - "audio/vnd.hns.audio": [], - "audio/vnd.lucent.voice": [ - "lvp" - ], - "audio/vnd.ms-playready.media.pya": [ - "pya" - ], - "audio/vnd.nokia.mobile-xmf": [], - "audio/vnd.nortel.vbk": [], - "audio/vnd.nuera.ecelp4800": [ - "ecelp4800" - ], - "audio/vnd.nuera.ecelp7470": [ - "ecelp7470" - ], - "audio/vnd.nuera.ecelp9600": [ - "ecelp9600" - ], - "audio/vnd.octel.sbc": [], - "audio/vnd.qcelp": [], - "audio/vnd.rhetorex.32kadpcm": [], - "audio/vnd.rip": [ - "rip" - ], - "audio/vnd.sealedmedia.softseal.mpeg": [], - "audio/vnd.vmx.cvsd": [], - "audio/vorbis": [], - "audio/vorbis-config": [], - "audio/webm": [ - "weba" - ], - "audio/x-aac": [ - "aac" - ], - "audio/x-aiff": [ - "aif", - "aiff", - "aifc" - ], - "audio/x-caf": [ - "caf" - ], - "audio/x-flac": [ - "flac" - ], - "audio/x-matroska": [ - "mka" - ], - "audio/x-mpegurl": [ - "m3u" - ], - "audio/x-ms-wax": [ - "wax" - ], - "audio/x-ms-wma": [ - "wma" - ], - "audio/x-pn-realaudio": [ - "ram", - "ra" - ], - "audio/x-pn-realaudio-plugin": [ - "rmp" - ], - "audio/x-tta": [], - "audio/x-wav": [ - "wav" - ], - "audio/xm": [ - "xm" - ], - "chemical/x-cdx": [ - "cdx" - ], - "chemical/x-cif": [ - "cif" - ], - "chemical/x-cmdf": [ - "cmdf" - ], - "chemical/x-cml": [ - "cml" - ], - "chemical/x-csml": [ - "csml" - ], - "chemical/x-pdb": [], - "chemical/x-xyz": [ - "xyz" - ], - "image/bmp": [ - "bmp" - ], - "image/cgm": [ - "cgm" - ], - "image/example": [], - "image/fits": [], - "image/g3fax": [ - "g3" - ], - "image/gif": [ - "gif" - ], - "image/ief": [ - "ief" - ], - "image/jp2": [], - "image/jpeg": [ - "jpeg", - "jpg", - "jpe" - ], - "image/jpm": [], - "image/jpx": [], - "image/ktx": [ - "ktx" - ], - "image/naplps": [], - "image/png": [ - "png" - ], - "image/prs.btif": [ - "btif" - ], - "image/prs.pti": [], - "image/sgi": [ - "sgi" - ], - "image/svg+xml": [ - "svg", - "svgz" - ], - "image/t38": [], - "image/tiff": [ - "tiff", - "tif" - ], - "image/tiff-fx": [], - "image/vnd.adobe.photoshop": [ - "psd" - ], - "image/vnd.cns.inf2": [], - "image/vnd.dece.graphic": [ - "uvi", - "uvvi", - "uvg", - "uvvg" - ], - "image/vnd.dvb.subtitle": [ - "sub" - ], - "image/vnd.djvu": [ - "djvu", - "djv" - ], - "image/vnd.dwg": [ - "dwg" - ], - "image/vnd.dxf": [ - "dxf" - ], - "image/vnd.fastbidsheet": [ - "fbs" - ], - "image/vnd.fpx": [ - "fpx" - ], - "image/vnd.fst": [ - "fst" - ], - "image/vnd.fujixerox.edmics-mmr": [ - "mmr" - ], - "image/vnd.fujixerox.edmics-rlc": [ - "rlc" - ], - "image/vnd.globalgraphics.pgb": [], - "image/vnd.microsoft.icon": [], - "image/vnd.mix": [], - "image/vnd.ms-modi": [ - "mdi" - ], - "image/vnd.ms-photo": [ - "wdp" - ], - "image/vnd.net-fpx": [ - "npx" - ], - "image/vnd.radiance": [], - "image/vnd.sealed.png": [], - "image/vnd.sealedmedia.softseal.gif": [], - "image/vnd.sealedmedia.softseal.jpg": [], - "image/vnd.svf": [], - "image/vnd.wap.wbmp": [ - "wbmp" - ], - "image/vnd.xiff": [ - "xif" - ], - "image/webp": [ - "webp" - ], - "image/x-3ds": [ - "3ds" - ], - "image/x-cmu-raster": [ - "ras" - ], - "image/x-cmx": [ - "cmx" - ], - "image/x-freehand": [ - "fh", - "fhc", - "fh4", - "fh5", - "fh7" - ], - "image/x-icon": [ - "ico" - ], - "image/x-mrsid-image": [ - "sid" - ], - "image/x-pcx": [ - "pcx" - ], - "image/x-pict": [ - "pic", - "pct" - ], - "image/x-portable-anymap": [ - "pnm" - ], - "image/x-portable-bitmap": [ - "pbm" - ], - "image/x-portable-graymap": [ - "pgm" - ], - "image/x-portable-pixmap": [ - "ppm" - ], - "image/x-rgb": [ - "rgb" - ], - "image/x-tga": [ - "tga" - ], - "image/x-xbitmap": [ - "xbm" - ], - "image/x-xpixmap": [ - "xpm" - ], - "image/x-xwindowdump": [ - "xwd" - ], - "message/cpim": [], - "message/delivery-status": [], - "message/disposition-notification": [], - "message/example": [], - "message/external-body": [], - "message/feedback-report": [], - "message/global": [], - "message/global-delivery-status": [], - "message/global-disposition-notification": [], - "message/global-headers": [], - "message/http": [], - "message/imdn+xml": [], - "message/news": [], - "message/partial": [], - "message/rfc822": [ - "eml", - "mime" - ], - "message/s-http": [], - "message/sip": [], - "message/sipfrag": [], - "message/tracking-status": [], - "message/vnd.si.simp": [], - "model/example": [], - "model/iges": [ - "igs", - "iges" - ], - "model/mesh": [ - "msh", - "mesh", - "silo" - ], - "model/vnd.collada+xml": [ - "dae" - ], - "model/vnd.dwf": [ - "dwf" - ], - "model/vnd.flatland.3dml": [], - "model/vnd.gdl": [ - "gdl" - ], - "model/vnd.gs-gdl": [], - "model/vnd.gs.gdl": [], - "model/vnd.gtw": [ - "gtw" - ], - "model/vnd.moml+xml": [], - "model/vnd.mts": [ - "mts" - ], - "model/vnd.parasolid.transmit.binary": [], - "model/vnd.parasolid.transmit.text": [], - "model/vnd.vtu": [ - "vtu" - ], - "model/vrml": [ - "wrl", - "vrml" - ], - "model/x3d+binary": [ - "x3db", - "x3dbz" - ], - "model/x3d+vrml": [ - "x3dv", - "x3dvz" - ], - "model/x3d+xml": [ - "x3d", - "x3dz" - ], - "multipart/alternative": [], - "multipart/appledouble": [], - "multipart/byteranges": [], - "multipart/digest": [], - "multipart/encrypted": [], - "multipart/example": [], - "multipart/form-data": [], - "multipart/header-set": [], - "multipart/mixed": [], - "multipart/parallel": [], - "multipart/related": [], - "multipart/report": [], - "multipart/signed": [], - "multipart/voice-message": [], - "text/1d-interleaved-parityfec": [], - "text/cache-manifest": [ - "appcache" - ], - "text/calendar": [ - "ics", - "ifb" - ], - "text/css": [ - "css" - ], - "text/csv": [ - "csv" - ], - "text/directory": [], - "text/dns": [], - "text/ecmascript": [], - "text/enriched": [], - "text/example": [], - "text/fwdred": [], - "text/html": [ - "html", - "htm" - ], - "text/javascript": [], - "text/n3": [ - "n3" - ], - "text/parityfec": [], - "text/plain": [ - "txt", - "text", - "conf", - "def", - "list", - "log", - "in" - ], - "text/prs.fallenstein.rst": [], - "text/prs.lines.tag": [ - "dsc" - ], - "text/vnd.radisys.msml-basic-layout": [], - "text/red": [], - "text/rfc822-headers": [], - "text/richtext": [ - "rtx" - ], - "text/rtf": [], - "text/rtp-enc-aescm128": [], - "text/rtx": [], - "text/sgml": [ - "sgml", - "sgm" - ], - "text/t140": [], - "text/tab-separated-values": [ - "tsv" - ], - "text/troff": [ - "t", - "tr", - "roff", - "man", - "me", - "ms" - ], - "text/turtle": [ - "ttl" - ], - "text/ulpfec": [], - "text/uri-list": [ - "uri", - "uris", - "urls" - ], - "text/vcard": [ - "vcard" - ], - "text/vnd.abc": [], - "text/vnd.curl": [ - "curl" - ], - "text/vnd.curl.dcurl": [ - "dcurl" - ], - "text/vnd.curl.scurl": [ - "scurl" - ], - "text/vnd.curl.mcurl": [ - "mcurl" - ], - "text/vnd.dmclientscript": [], - "text/vnd.dvb.subtitle": [ - "sub" - ], - "text/vnd.esmertec.theme-descriptor": [], - "text/vnd.fly": [ - "fly" - ], - "text/vnd.fmi.flexstor": [ - "flx" - ], - "text/vnd.graphviz": [ - "gv" - ], - "text/vnd.in3d.3dml": [ - "3dml" - ], - "text/vnd.in3d.spot": [ - "spot" - ], - "text/vnd.iptc.newsml": [], - "text/vnd.iptc.nitf": [], - "text/vnd.latex-z": [], - "text/vnd.motorola.reflex": [], - "text/vnd.ms-mediapackage": [], - "text/vnd.net2phone.commcenter.command": [], - "text/vnd.si.uricatalogue": [], - "text/vnd.sun.j2me.app-descriptor": [ - "jad" - ], - "text/vnd.trolltech.linguist": [], - "text/vnd.wap.si": [], - "text/vnd.wap.sl": [], - "text/vnd.wap.wml": [ - "wml" - ], - "text/vnd.wap.wmlscript": [ - "wmls" - ], - "text/x-asm": [ - "s", - "asm" - ], - "text/x-c": [ - "c", - "cc", - "cxx", - "cpp", - "h", - "hh", - "dic" - ], - "text/x-fortran": [ - "f", - "for", - "f77", - "f90" - ], - "text/x-java-source": [ - "java" - ], - "text/x-opml": [ - "opml" - ], - "text/x-pascal": [ - "p", - "pas" - ], - "text/x-nfo": [ - "nfo" - ], - "text/x-setext": [ - "etx" - ], - "text/x-sfv": [ - "sfv" - ], - "text/x-uuencode": [ - "uu" - ], - "text/x-vcalendar": [ - "vcs" - ], - "text/x-vcard": [ - "vcf" - ], - "text/xml": [], - "text/xml-external-parsed-entity": [], - "video/1d-interleaved-parityfec": [], - "video/3gpp": [ - "3gp" - ], - "video/3gpp-tt": [], - "video/3gpp2": [ - "3g2" - ], - "video/bmpeg": [], - "video/bt656": [], - "video/celb": [], - "video/dv": [], - "video/example": [], - "video/h261": [ - "h261" - ], - "video/h263": [ - "h263" - ], - "video/h263-1998": [], - "video/h263-2000": [], - "video/h264": [ - "h264" - ], - "video/h264-rcdo": [], - "video/h264-svc": [], - "video/jpeg": [ - "jpgv" - ], - "video/jpeg2000": [], - "video/jpm": [ - "jpm", - "jpgm" - ], - "video/mj2": [ - "mj2", - "mjp2" - ], - "video/mp1s": [], - "video/mp2p": [], - "video/mp2t": [], - "video/mp4": [ - "mp4", - "mp4v", - "mpg4" - ], - "video/mp4v-es": [], - "video/mpeg": [ - "mpeg", - "mpg", - "mpe", - "m1v", - "m2v" - ], - "video/mpeg4-generic": [], - "video/mpv": [], - "video/nv": [], - "video/ogg": [ - "ogv" - ], - "video/parityfec": [], - "video/pointer": [], - "video/quicktime": [ - "qt", - "mov" - ], - "video/raw": [], - "video/rtp-enc-aescm128": [], - "video/rtx": [], - "video/smpte292m": [], - "video/ulpfec": [], - "video/vc1": [], - "video/vnd.cctv": [], - "video/vnd.dece.hd": [ - "uvh", - "uvvh" - ], - "video/vnd.dece.mobile": [ - "uvm", - "uvvm" - ], - "video/vnd.dece.mp4": [], - "video/vnd.dece.pd": [ - "uvp", - "uvvp" - ], - "video/vnd.dece.sd": [ - "uvs", - "uvvs" - ], - "video/vnd.dece.video": [ - "uvv", - "uvvv" - ], - "video/vnd.directv.mpeg": [], - "video/vnd.directv.mpeg-tts": [], - "video/vnd.dlna.mpeg-tts": [], - "video/vnd.dvb.file": [ - "dvb" - ], - "video/vnd.fvt": [ - "fvt" - ], - "video/vnd.hns.video": [], - "video/vnd.iptvforum.1dparityfec-1010": [], - "video/vnd.iptvforum.1dparityfec-2005": [], - "video/vnd.iptvforum.2dparityfec-1010": [], - "video/vnd.iptvforum.2dparityfec-2005": [], - "video/vnd.iptvforum.ttsavc": [], - "video/vnd.iptvforum.ttsmpeg2": [], - "video/vnd.motorola.video": [], - "video/vnd.motorola.videop": [], - "video/vnd.mpegurl": [ - "mxu", - "m4u" - ], - "video/vnd.ms-playready.media.pyv": [ - "pyv" - ], - "video/vnd.nokia.interleaved-multimedia": [], - "video/vnd.nokia.videovoip": [], - "video/vnd.objectvideo": [], - "video/vnd.sealed.mpeg1": [], - "video/vnd.sealed.mpeg4": [], - "video/vnd.sealed.swf": [], - "video/vnd.sealedmedia.softseal.mov": [], - "video/vnd.uvvu.mp4": [ - "uvu", - "uvvu" - ], - "video/vnd.vivo": [ - "viv" - ], - "video/webm": [ - "webm" - ], - "video/x-f4v": [ - "f4v" - ], - "video/x-fli": [ - "fli" - ], - "video/x-flv": [ - "flv" - ], - "video/x-m4v": [ - "m4v" - ], - "video/x-matroska": [ - "mkv", - "mk3d", - "mks" - ], - "video/x-mng": [ - "mng" - ], - "video/x-ms-asf": [ - "asf", - "asx" - ], - "video/x-ms-vob": [ - "vob" - ], - "video/x-ms-wm": [ - "wm" - ], - "video/x-ms-wmv": [ - "wmv" - ], - "video/x-ms-wmx": [ - "wmx" - ], - "video/x-ms-wvx": [ - "wvx" - ], - "video/x-msvideo": [ - "avi" - ], - "video/x-sgi-movie": [ - "movie" - ], - "video/x-smv": [ - "smv" - ], - "x-conference/x-cooltalk": [ - "ice" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json deleted file mode 100644 index ad50d61..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "text/vtt": [ - "vtt" - ], - "application/x-chrome-extension": [ - "crx" - ], - "text/x-component": [ - "htc" - ], - "text/cache-manifest": [ - "manifest" - ], - "application/octet-stream": [ - "buffer" - ], - "application/mp4": [ - "m4p" - ], - "audio/mp4": [ - "m4a" - ], - "video/MP2T": [ - "ts" - ], - "application/x-web-app-manifest+json": [ - "webapp" - ], - "text/x-lua": [ - "lua" - ], - "application/x-lua-bytecode": [ - "luac" - ], - "text/x-markdown": [ - "markdown", - "md", - "mkd" - ], - "text/plain": [ - "ini" - ], - "application/dash+xml": [ - "mdp" - ], - "font/opentype": [ - "otf" - ], - "application/json": [ - "map" - ], - "application/xml": [ - "xsd" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json deleted file mode 100644 index bd487f6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "1.0.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": "https://searchbeam.jit.su" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/mime-types" - }, - "license": "MIT", - "main": "lib", - "devDependencies": { - "co": "3", - "cogent": "0", - "mocha": "1", - "should": "3" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "make test" - }, - "bugs": { - "url": "https://github.com/expressjs/mime-types/issues" - }, - "homepage": "https://github.com/expressjs/mime-types", - "_id": "mime-types@1.0.1", - "_shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "_from": "mime-types@>=1.0.1-0 <1.1.0-0", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/package.json deleted file mode 100644 index 6cdddee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/type-is/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "type-is", - "description": "Infer the content-type of a request.", - "version": "1.3.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/expressjs/type-is" - }, - "dependencies": { - "media-typer": "0.2.0", - "mime-types": "~1.0.1" - }, - "devDependencies": { - "istanbul": "0.2.11", - "mocha": "*", - "should": "*" - }, - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "test": "mocha --require should --reporter spec --check-leaks --bail test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "d76790909638d4cf1785e09858db5576f91f710f", - "bugs": { - "url": "https://github.com/expressjs/type-is/issues" - }, - "homepage": "https://github.com/expressjs/type-is", - "_id": "type-is@1.3.2", - "_shasum": "4f2a5dc58775ca1630250afc7186f8b36309d1bb", - "_from": "type-is@>=1.3.2-0 <1.4.0-0", - "_npmVersion": "1.4.16", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "4f2a5dc58775ca1630250afc7186f8b36309d1bb", - "tarball": "http://registry.npmjs.org/type-is/-/type-is-1.3.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/type-is/-/type-is-1.3.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/.travis.yml deleted file mode 100644 index af92b02..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: "node_js" -node_js: - - "0.4" - - "0.6" - - "0.8" - - "0.10" diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/LICENSE deleted file mode 100644 index e33bd10..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -(The MIT License) - -Copyright (c) 2013 Jared Hanson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/README.md deleted file mode 100644 index 2f94e9b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# utils-merge - -Merges the properties from a source object into a destination object. - -## Install - - $ npm install utils-merge - -## Usage - -```javascript -var a = { foo: 'bar' } - , b = { bar: 'baz' }; - -merge(a, b); -// => { foo: 'bar', bar: 'baz' } -``` - -## Tests - - $ npm install - $ npm test - -[![Build Status](https://secure.travis-ci.org/jaredhanson/utils-merge.png)](http://travis-ci.org/jaredhanson/utils-merge) - -## Credits - - - [Jared Hanson](http://github.com/jaredhanson) - -## License - -[The MIT License](http://opensource.org/licenses/MIT) - -Copyright (c) 2013 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/index.js deleted file mode 100644 index 4265c69..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/index.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Merge object b with object a. - * - * var a = { foo: 'bar' } - * , b = { bar: 'baz' }; - * - * merge(a, b); - * // => { foo: 'bar', bar: 'baz' } - * - * @param {Object} a - * @param {Object} b - * @return {Object} - * @api public - */ - -exports = module.exports = function(a, b){ - if (a && b) { - for (var key in b) { - a[key] = b[key]; - } - } - return a; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/package.json deleted file mode 100644 index e655383..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/utils-merge/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "utils-merge", - "version": "1.0.0", - "description": "merge() utility function", - "keywords": [ - "util" - ], - "repository": { - "type": "git", - "url": "git://github.com/jaredhanson/utils-merge.git" - }, - "bugs": { - "url": "http://github.com/jaredhanson/utils-merge/issues" - }, - "author": { - "name": "Jared Hanson", - "email": "jaredhanson@gmail.com", - "url": "http://www.jaredhanson.net/" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://www.opensource.org/licenses/MIT" - } - ], - "main": "./index", - "dependencies": {}, - "devDependencies": { - "mocha": "1.x.x", - "chai": "1.x.x" - }, - "scripts": { - "test": "mocha --reporter spec --require test/bootstrap/node test/*.test.js" - }, - "engines": { - "node": ">= 0.4.0" - }, - "readme": "# utils-merge\n\nMerges the properties from a source object into a destination object.\n\n## Install\n\n $ npm install utils-merge\n\n## Usage\n\n```javascript\nvar a = { foo: 'bar' }\n , b = { bar: 'baz' };\n\nmerge(a, b);\n// => { foo: 'bar', bar: 'baz' }\n```\n\n## Tests\n\n $ npm install\n $ npm test\n\n[![Build Status](https://secure.travis-ci.org/jaredhanson/utils-merge.png)](http://travis-ci.org/jaredhanson/utils-merge)\n\n## Credits\n\n - [Jared Hanson](http://github.com/jaredhanson)\n\n## License\n\n[The MIT License](http://opensource.org/licenses/MIT)\n\nCopyright (c) 2013 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)>\n", - "readmeFilename": "README.md", - "_id": "utils-merge@1.0.0", - "dist": { - "shasum": "0294fb922bb9375153541c4f7096231f287c8af8", - "tarball": "http://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" - }, - "_from": "utils-merge@1.0.0", - "_npmVersion": "1.2.25", - "_npmUser": { - "name": "jaredhanson", - "email": "jaredhanson@gmail.com" - }, - "maintainers": [ - { - "name": "jaredhanson", - "email": "jaredhanson@gmail.com" - } - ], - "directories": {}, - "_shasum": "0294fb922bb9375153541c4f7096231f287c8af8", - "_resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "homepage": "https://github.com/jaredhanson/utils-merge" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/History.md deleted file mode 100644 index 10fb1db..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/History.md +++ /dev/null @@ -1,9 +0,0 @@ -0.1.0 / 2014-06-05 -================== - - * Support array of fields to set - -0.0.0 / 2014-06-04 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/README.md deleted file mode 100644 index 6ed2825..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# vary - -[![NPM version](https://badge.fury.io/js/vary.svg)](http://badge.fury.io/js/vary) -[![Build Status](https://travis-ci.org/expressjs/vary.svg?branch=master)](https://travis-ci.org/expressjs/vary) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/vary.svg?branch=master)](https://coveralls.io/r/expressjs/vary) - -Update the Vary header of a response - -## Install - -```sh -$ npm install vary -``` - -## API - -```js -var vary = require('vary') -``` - -### vary(res, field) - -Adds the given header `field` to the `Vary` response header of `res`. -This can be a string of a single field or an array of multiple fields. - -This will append the header if not already listed, otherwise leaves -it listed in the current location. - -```js -vary(res, 'Origin') -vary(res, 'User-Agent') -vary(res, ['Accept', 'Accept-Language', 'Accept-Encoding']) -``` - -## Testing - -```sh -$ npm test -``` - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/index.js deleted file mode 100644 index 6f52730..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/index.js +++ /dev/null @@ -1,79 +0,0 @@ -/*! - * vary - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = vary; - -/** - * Variables. - */ - -var separators = /[\(\)<>@,;:\\"\/\[\]\?=\{\}\u0020\u0009]/; - -/** - * Mark that a request is varied on a header field. - * - * @param {Object} res - * @param {String|Array} field - * @api public - */ - -function vary(res, field) { - if (!res || !res.getHeader || !res.setHeader) { - // quack quack - throw new TypeError('res argument is required'); - } - - if (!field) { - throw new TypeError('field argument is required'); - } - - var fields = !Array.isArray(field) - ? [String(field)] - : field; - - for (var i = 0; i < fields.length; i++) { - if (separators.test(fields[i])) { - throw new TypeError('field argument contains an invalid header'); - } - } - - var val = res.getHeader('Vary') || '' - var headers = Array.isArray(val) - ? val.join(', ') - : String(val); - - // existing unspecified vary - if (headers === '*') { - return; - } - - // enumerate current values - var vals = headers.toLowerCase().split(/ *, */); - - // unspecified vary - if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { - res.setHeader('Vary', '*'); - return; - } - - for (var i = 0; i < fields.length; i++) { - field = fields[i].toLowerCase(); - - // append value (case-preserving) - if (vals.indexOf(field) === -1) { - vals.push(field); - headers = headers - ? headers + ', ' + fields[i] - : fields[i]; - } - } - - res.setHeader('Vary', headers); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/package.json deleted file mode 100644 index c4937fe..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/node_modules/vary/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "vary", - "description": "Update the Vary header of a response", - "version": "0.1.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "http", - "res", - "vary" - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/vary" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.0", - "should": "~4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/vary/issues" - }, - "homepage": "https://github.com/expressjs/vary", - "_id": "vary@0.1.0", - "dist": { - "shasum": "df0945899e93c0cc5bd18cc8321d9d21e74f6176", - "tarball": "http://registry.npmjs.org/vary/-/vary-0.1.0.tgz" - }, - "_from": "vary@0.1.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "df0945899e93c0cc5bd18cc8321d9d21e74f6176", - "_resolved": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/package.json deleted file mode 100644 index 65ea6d1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/package.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "name": "express", - "description": "Fast, unopinionated, minimalist web framework", - "version": "4.7.2", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Aaron Heckmann", - "email": "aaron.heckmann+github@gmail.com" - }, - { - "name": "Ciaran Jessup", - "email": "ciaranj@gmail.com" - }, - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Guillermo Rauch", - "email": "rauchg@gmail.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com" - }, - { - "name": "Roman Shtylman", - "email": "shtylman+expressjs@gmail.com" - }, - { - "name": "Young Jae Sim", - "email": "hanul@hanul.me" - } - ], - "keywords": [ - "express", - "framework", - "sinatra", - "web", - "rest", - "restful", - "router", - "app", - "api" - ], - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/express" - }, - "license": "MIT", - "dependencies": { - "accepts": "~1.0.7", - "buffer-crc32": "0.2.3", - "debug": "1.0.4", - "depd": "0.4.4", - "escape-html": "1.0.1", - "finalhandler": "0.1.0", - "media-typer": "0.2.0", - "methods": "1.1.0", - "parseurl": "~1.2.0", - "path-to-regexp": "0.1.3", - "proxy-addr": "1.0.1", - "range-parser": "1.0.0", - "send": "0.7.2", - "serve-static": "~1.4.2", - "type-is": "~1.3.2", - "vary": "0.1.0", - "cookie": "0.1.2", - "fresh": "0.2.2", - "cookie-signature": "1.0.4", - "merge-descriptors": "0.0.2", - "qs": "0.6.6", - "utils-merge": "1.0.0" - }, - "devDependencies": { - "after": "0.8.1", - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.4", - "supertest": "~0.13.0", - "connect-redis": "~2.0.0", - "ejs": "~1.0.0", - "marked": "0.3.2", - "hjs": "~0.0.6", - "body-parser": "~1.5.2", - "cookie-parser": "~1.3.1", - "express-session": "~1.7.2", - "jade": "~1.5.0", - "method-override": "~2.1.1", - "morgan": "~1.2.2", - "multiparty": "~3.3.1", - "vhost": "2.0.0" - }, - "engines": { - "node": ">= 0.10.0" - }, - "scripts": { - "prepublish": "npm prune", - "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/" - }, - "bugs": { - "url": "https://github.com/visionmedia/express/issues" - }, - "homepage": "https://github.com/visionmedia/express", - "_id": "express@4.7.2", - "dist": { - "shasum": "2cbae61efab6c2db72a547ff3bf380e637c08590", - "tarball": "http://registry.npmjs.org/express/-/express-4.7.2.tgz" - }, - "_from": "express@latest", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "aredridel", - "email": "aredridel@nbtsc.org" - } - ], - "directories": {}, - "_shasum": "2cbae61efab6c2db72a547ff3bf380e637c08590", - "_resolved": "https://registry.npmjs.org/express/-/express-4.7.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/test.js deleted file mode 100644 index cacd7a3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/node_modules/express/test.js +++ /dev/null @@ -1,8 +0,0 @@ -var app = require('./index')() -app.get('/iamaverylongcomponent/in_a_url/you_said_didnt_work', function (req, res) { - res.send('got long url') -}) -app.get('/IamUSINGcaps', function (req, res) { - res.send('got caps matching') -}) -app.listen(3333) \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/public/echo.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/public/echo.js deleted file mode 100644 index df03189..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/public/echo.js +++ /dev/null @@ -1,14 +0,0 @@ -// The client-side "app" which leverages the shared Handlebars "echo" template. -// This will prompt the user for a message, then echo it out by rendering the -// message using the shared template which was exposed by the server. -(function () { - var button = document.getElementById('say'); - - button.addEventListener('click', function (e) { - var message = prompt('Say Something:', 'Yo yo'), - echo = document.createElement('div'); - - echo.innerHTML = Handlebars.templates.echo({message: message}); - document.body.appendChild(echo); - }, false); -}()); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/shared/templates/echo.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/shared/templates/echo.handlebars deleted file mode 100644 index 8e5a71c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/shared/templates/echo.handlebars +++ /dev/null @@ -1 +0,0 @@ -

echo: {{message}}

diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/echo.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/echo.handlebars deleted file mode 100644 index e486a8d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/echo.handlebars +++ /dev/null @@ -1,8 +0,0 @@ -

{{> page/title}}

- -{{> page/nav}} - - -{{> echo}} - - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/home.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/home.handlebars deleted file mode 100644 index 1270893..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/home.handlebars +++ /dev/null @@ -1,3 +0,0 @@ -

{{> page/title}}

- -{{> page/nav}} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/layouts/main.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/layouts/main.handlebars deleted file mode 100644 index 6ea95a5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/layouts/main.handlebars +++ /dev/null @@ -1,12 +0,0 @@ - - - - - {{> page/title}} - - - - {{{body}}} - - - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/layouts/shared-templates.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/layouts/shared-templates.handlebars deleted file mode 100644 index d4396ae..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/layouts/shared-templates.handlebars +++ /dev/null @@ -1,25 +0,0 @@ - - - - - {{> page/title}} - - - - {{{body}}} - - {{! Only needs the Handlebars Runtime, because the exposed templates are precompiled. }} - - - - - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/partials/page/nav.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/partials/page/nav.handlebars deleted file mode 100644 index 545e85e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/partials/page/nav.handlebars +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/partials/page/title.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/partials/page/title.handlebars deleted file mode 100644 index 4c9a4e9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/partials/page/title.handlebars +++ /dev/null @@ -1 +0,0 @@ -Example App: {{title}} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/yell.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/yell.handlebars deleted file mode 100644 index b5272c3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/advanced/views/yell.handlebars +++ /dev/null @@ -1,5 +0,0 @@ -

{{> page/title}}

- -{{> page/nav}} - -

{{yell message}}

diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/app.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/app.js deleted file mode 100644 index f13855c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/app.js +++ /dev/null @@ -1,15 +0,0 @@ -var express = require('express'), - exphbs = require('../../'), // "express3-handlebars" - - app = express(); - -app.engine('handlebars', exphbs({defaultLayout: 'main'})); -app.set('view engine', 'handlebars'); - -app.get('/', function (req, res) { - res.render('home'); -}); - -app.listen(3000); - -console.log('express3-handlebars example server listening on: 3000'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/.npmignore deleted file mode 100644 index 52fcd60..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/.npmignore +++ /dev/null @@ -1,11 +0,0 @@ -.git* -benchmarks/ -coverage/ -docs/ -examples/ -support/ -test/ -testing.js -.DS_Store -.travis.yml -Contributing.md diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/History.md deleted file mode 100644 index ad56b36..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/History.md +++ /dev/null @@ -1,1924 +0,0 @@ -4.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - * deps: serve-static@~1.4.2 - -4.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - * deps: serve-static@~1.4.1 - -4.7.0 / 2014-07-25 -================== - - * fix `req.protocol` for proxy-direct connections - * configurable query parser with `app.set('query parser', parser)` - - `app.set('query parser', 'extended')` parse with "qs" module - - `app.set('query parser', 'simple')` parse with "querystring" core module - - `app.set('query parser', false)` disable query string parsing - - `app.set('query parser', true)` enable simple parsing - * deprecate `res.json(status, obj)` -- use `res.status(status).json(obj)` instead - * deprecate `res.jsonp(status, obj)` -- use `res.status(status).jsonp(obj)` instead - * deprecate `res.send(status, body)` -- use `res.status(status).send(body)` instead - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: finalhandler@0.1.0 - - Respond after request fully read - - deps: debug@1.0.4 - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - * deps: serve-static@~1.4.0 - - deps: parseurl@~1.2.0 - - deps: send@0.7.0 - * perf: prevent multiple `Buffer` creation in `res.send` - -4.6.1 / 2014-07-12 -================== - - * fix `subapp.mountpath` regression for `app.use(subapp)` - -4.6.0 / 2014-07-11 -================== - - * accept multiple callbacks to `app.use()` - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * catch errors in multiple `req.param(name, fn)` handlers - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * support non-string `path` in `app.use(path, fn)` - - supports array of paths - - supports `RegExp` - * router: fix optimization on router exit - * router: refactor location of `try` blocks - * router: speed up standard `app.use(fn)` - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: finalhandler@0.0.3 - - deps: debug@1.0.3 - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - * deps: path-to-regexp@0.1.3 - * deps: send@0.6.0 - - deps: debug@1.0.3 - * deps: serve-static@~1.3.2 - - deps: parseurl@~1.1.3 - - deps: send@0.6.0 - * perf: fix arguments reassign deopt in some `res` methods - -4.5.1 / 2014-07-06 -================== - - * fix routing regression when altering `req.method` - -4.5.0 / 2014-07-04 -================== - - * add deprecation message to non-plural `req.accepts*` - * add deprecation message to `res.send(body, status)` - * add deprecation message to `res.vary()` - * add `headers` option to `res.sendfile` - - use to set headers on successful file transfer - * add `mergeParams` option to `Router` - - merges `req.params` from parent routes - * add `req.hostname` -- correct name for what `req.host` returns - * deprecate things with `depd` module - * deprecate `req.host` -- use `req.hostname` instead - * fix behavior when handling request without routes - * fix handling when `route.all` is only route - * invoke `router.param()` only when route matches - * restore `req.params` after invoking router - * use `finalhandler` for final response handling - * use `media-typer` to alter content-type charset - * deps: accepts@~1.0.7 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - * deps: serve-static@~1.3.0 - - Accept string for `maxAge` (converted by `ms`) - - Add `setHeaders` option - - Include HTML link in redirect response - - deps: send@0.5.0 - * deps: type-is@~1.3.2 - -4.4.5 / 2014-06-26 -================== - - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -4.4.4 / 2014-06-20 -================== - - * fix `res.attachment` Unicode filenames in Safari - * fix "trim prefix" debug message in `express:router` - * deps: accepts@~1.0.5 - * deps: buffer-crc32@0.2.3 - -4.4.3 / 2014-06-11 -================== - - * fix persistence of modified `req.params[name]` from `app.param()` - * deps: accepts@1.0.3 - - deps: negotiator@0.4.6 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - * deps: serve-static@1.2.3 - - Do not throw un-catchable error on file open race condition - - deps: send@0.4.3 - -4.4.2 / 2014-06-09 -================== - - * fix catching errors from top-level handlers - * use `vary` module for `res.vary` - * deps: debug@1.0.1 - * deps: proxy-addr@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - * deps: serve-static@1.2.2 - - fix "event emitter leak" warnings - - deps: send@0.4.2 - * deps: type-is@1.2.1 - -4.4.1 / 2014-06-02 -================== - - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - * deps: serve-static@1.2.1 - - use `escape-html` for escaping - - deps: send@0.4.1 - -4.4.0 / 2014-05-30 -================== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * mark `res.send` ETag as weak and reduce collisions - * update accepts to 1.0.2 - - Fix interpretation when header not in request - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - * update serve-static to 1.2.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: send@0.4.0 - -4.3.2 / 2014-05-28 -================== - - * fix handling of errors from `router.param()` callbacks - -4.3.1 / 2014-05-23 -================== - - * revert "fix behavior of multiple `app.VERB` for the same path" - - this caused a regression in the order of route execution - -4.3.0 / 2014-05-21 -================== - - * add `req.baseUrl` to access the path stripped from `req.url` in routes - * fix behavior of multiple `app.VERB` for the same path - * fix issue routing requests among sub routers - * invoke `router.param()` only when necessary instead of every match - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * set proper `charset` in `Content-Type` for `res.send` - * update type-is to 1.2.0 - - support suffix matching - -4.2.0 / 2014-05-11 -================== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * fix `req.next` when inside router instance - * include `ETag` header in `HEAD` requests - * keep previous `Content-Type` for `res.jsonp` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update debug to 0.8.0 - - add `enable()` method - - change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - -4.1.2 / 2014-05-08 -================== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -4.1.1 / 2014-04-27 -================== - - * fix package.json to reflect supported node version - -4.1.0 / 2014-04-24 -================== - - * pass options from `res.sendfile` to `send` - * preserve casing of headers in `res.header` and `res.set` - * support unicode file names in `res.attachment` and `res.download` - * update accepts to 1.0.1 - - deps: negotiator@0.4.0 - * update cookie to 0.1.2 - - Fix for maxAge == 0 - - made compat with expires field - * update send to 0.3.0 - - Accept API options in options object - - Coerce option types - - Control whether to generate etags - - Default directory access to 403 when index disabled - - Fix sending files with dots without root set - - Include file path in etag - - Make "Can't set headers after they are sent." catchable - - Send full entity-body for multi range requests - - Set etags to "weak" - - Support "If-Range" header - - Support multiple index paths - - deps: mime@1.2.11 - * update serve-static to 1.1.0 - - Accept options directly to `send` module - - Resolve relative paths at middleware setup - - Use parseurl to parse the URL from request - - deps: send@0.3.0 - * update type-is to 1.1.0 - - add non-array values support - - add `multipart` as a shorthand - -4.0.0 / 2014-04-09 -================== - - * remove: - - node 0.8 support - - connect and connect's patches except for charset handling - - express(1) - moved to [express-generator](https://github.com/expressjs/generator) - - `express.createServer()` - it has been deprecated for a long time. Use `express()` - - `app.configure` - use logic in your own app code - - `app.router` - is removed - - `req.auth` - use `basic-auth` instead - - `req.accepted*` - use `req.accepts*()` instead - - `res.location` - relative URL resolution is removed - - `res.charset` - include the charset in the content type when using `res.set()` - - all bundled middleware except `static` - * change: - - `app.route` -> `app.mountpath` when mounting an express app in another express app - - `json spaces` no longer enabled by default in development - - `req.accepts*` -> `req.accepts*s` - i.e. `req.acceptsEncoding` -> `req.acceptsEncodings` - - `req.params` is now an object instead of an array - - `res.locals` is no longer a function. It is a plain js object. Treat it as such. - - `res.headerSent` -> `res.headersSent` to match node.js ServerResponse object - * refactor: - - `req.accepts*` with [accepts](https://github.com/expressjs/accepts) - - `req.is` with [type-is](https://github.com/expressjs/type-is) - - [path-to-regexp](https://github.com/component/path-to-regexp) - * add: - - `app.router()` - returns the app Router instance - - `app.route()` - Proxy to the app's `Router#route()` method to create a new route - - Router & Route - public API - -3.15.2 / 2014-07-27 -=================== - - * deps: connect@2.24.2 - - deps: body-parser@~1.5.2 - - deps: depd@0.4.4 - - deps: express-session@~1.7.2 - - deps: morgan@~1.2.2 - - deps: serve-static@~1.4.2 - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - -3.15.1 / 2014-07-26 -=================== - - * deps: connect@2.24.1 - - deps: body-parser@~1.5.1 - - deps: depd@0.4.3 - - deps: express-session@~1.7.1 - - deps: morgan@~1.2.1 - - deps: serve-index@~1.1.4 - - deps: serve-static@~1.4.1 - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - -3.15.0 / 2014-07-22 -=================== - - * Fix `req.protocol` for proxy-direct connections - * Pass options from `res.sendfile` to `send` - * deps: connect@2.24.0 - - deps: body-parser@~1.5.0 - - deps: compression@~1.0.9 - - deps: connect-timeout@~1.2.1 - - deps: debug@1.0.4 - - deps: depd@0.4.2 - - deps: express-session@~1.7.0 - - deps: finalhandler@0.1.0 - - deps: method-override@~2.1.2 - - deps: morgan@~1.2.0 - - deps: multiparty@3.3.1 - - deps: parseurl@~1.2.0 - - deps: serve-static@~1.4.0 - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -3.14.0 / 2014-07-11 -=================== - - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * deps: basic-auth@1.0.0 - - support empty password - - support empty username - * deps: connect@2.23.0 - - deps: debug@1.0.3 - - deps: express-session@~1.6.4 - - deps: method-override@~2.1.0 - - deps: parseurl@~1.1.3 - - deps: serve-static@~1.3.1 - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -3.13.0 / 2014-07-03 -=================== - - * add deprecation message to `app.configure` - * add deprecation message to `req.auth` - * use `basic-auth` to parse `Authorization` header - * deps: connect@2.22.0 - - deps: csurf@~1.3.0 - - deps: express-session@~1.6.1 - - deps: multiparty@3.3.0 - - deps: serve-static@~1.3.0 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - -3.12.1 / 2014-06-26 -=================== - - * deps: connect@2.21.1 - - deps: cookie-parser@1.3.2 - - deps: cookie-signature@1.0.4 - - deps: express-session@~1.5.2 - - deps: type-is@~1.3.2 - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -3.12.0 / 2014-06-21 -=================== - - * use `media-typer` to alter content-type charset - * deps: connect@2.21.0 - - deprecate `connect(middleware)` -- use `app.use(middleware)` instead - - deprecate `connect.createServer()` -- use `connect()` instead - - fix `res.setHeader()` patch to work with with get -> append -> set pattern - - deps: compression@~1.0.8 - - deps: errorhandler@~1.1.1 - - deps: express-session@~1.5.0 - - deps: serve-index@~1.1.3 - -3.11.0 / 2014-06-19 -=================== - - * deprecate things with `depd` module - * deps: buffer-crc32@0.2.3 - * deps: connect@2.20.2 - - deprecate `verify` option to `json` -- use `body-parser` npm module instead - - deprecate `verify` option to `urlencoded` -- use `body-parser` npm module instead - - deprecate things with `depd` module - - use `finalhandler` for final response handling - - use `media-typer` to parse `content-type` for charset - - deps: body-parser@1.4.3 - - deps: connect-timeout@1.1.1 - - deps: cookie-parser@1.3.1 - - deps: csurf@1.2.2 - - deps: errorhandler@1.1.0 - - deps: express-session@1.4.0 - - deps: multiparty@3.2.9 - - deps: serve-index@1.1.2 - - deps: type-is@1.3.1 - - deps: vhost@2.0.0 - -3.10.5 / 2014-06-11 -=================== - - * deps: connect@2.19.6 - - deps: body-parser@1.3.1 - - deps: compression@1.0.7 - - deps: debug@1.0.2 - - deps: serve-index@1.1.1 - - deps: serve-static@1.2.3 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -3.10.4 / 2014-06-09 -=================== - - * deps: connect@2.19.5 - - fix "event emitter leak" warnings - - deps: csurf@1.2.1 - - deps: debug@1.0.1 - - deps: serve-static@1.2.2 - - deps: type-is@1.2.1 - * deps: debug@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: finished@1.2.1 - - deps: debug@1.0.1 - -3.10.3 / 2014-06-05 -=================== - - * use `vary` module for `res.vary` - * deps: connect@2.19.4 - - deps: errorhandler@1.0.2 - - deps: method-override@2.0.2 - - deps: serve-favicon@2.0.1 - * deps: debug@1.0.0 - -3.10.2 / 2014-06-03 -=================== - - * deps: connect@2.19.3 - - deps: compression@1.0.6 - -3.10.1 / 2014-06-03 -=================== - - * deps: connect@2.19.2 - - deps: compression@1.0.4 - * deps: proxy-addr@1.0.1 - -3.10.0 / 2014-06-02 -=================== - - * deps: connect@2.19.1 - - deprecate `methodOverride()` -- use `method-override` npm module instead - - deps: body-parser@1.3.0 - - deps: method-override@2.0.1 - - deps: multiparty@3.2.8 - - deps: response-time@2.0.0 - - deps: serve-static@1.2.1 - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -3.9.0 / 2014-05-30 -================== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * Include ETag in HEAD requests - * mark `res.send` ETag as weak and reduce collisions - * update connect to 2.18.0 - - deps: compression@1.0.3 - - deps: serve-index@1.1.0 - - deps: serve-static@1.2.0 - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - -3.8.1 / 2014-05-27 -================== - - * update connect to 2.17.3 - - deps: body-parser@1.2.2 - - deps: express-session@1.2.1 - - deps: method-override@1.0.2 - -3.8.0 / 2014-05-21 -================== - - * keep previous `Content-Type` for `res.jsonp` - * set proper `charset` in `Content-Type` for `res.send` - * update connect to 2.17.1 - - fix `res.charset` appending charset when `content-type` has one - - deps: express-session@1.2.0 - - deps: morgan@1.1.1 - - deps: serve-index@1.0.3 - -3.7.0 / 2014-05-18 -================== - - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * update connect to 2.16.2 - - deprecate `res.headerSent` -- use `res.headersSent` - - deprecate `res.on("header")` -- use on-headers module instead - - fix edge-case in `res.appendHeader` that would append in wrong order - - json: use body-parser - - urlencoded: use body-parser - - dep: bytes@1.0.0 - - dep: cookie-parser@1.1.0 - - dep: csurf@1.2.0 - - dep: express-session@1.1.0 - - dep: method-override@1.0.1 - -3.6.0 / 2014-05-09 -================== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update connect to 2.15.0 - * Add `res.appendHeader` - * Call error stack even when response has been sent - * Patch `res.headerSent` to return Boolean - * Patch `res.headersSent` for node.js 0.8 - * Prevent default 404 handler after response sent - * dep: compression@1.0.2 - * dep: connect-timeout@1.1.0 - * dep: debug@^0.8.0 - * dep: errorhandler@1.0.1 - * dep: express-session@1.0.4 - * dep: morgan@1.0.1 - * dep: serve-favicon@2.0.0 - * dep: serve-index@1.0.2 - * update debug to 0.8.0 - * add `enable()` method - * change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - * update mkdirp to 0.5.0 - -3.5.3 / 2014-05-08 -================== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -3.5.2 / 2014-04-24 -================== - - * update connect to 2.14.5 - * update cookie to 0.1.2 - * update mkdirp to 0.4.0 - * update send to 0.3.0 - -3.5.1 / 2014-03-25 -================== - - * pin less-middleware in generated app - -3.5.0 / 2014-03-06 -================== - - * bump deps - -3.4.8 / 2014-01-13 -================== - - * prevent incorrect automatic OPTIONS responses #1868 @dpatti - * update binary and examples for jade 1.0 #1876 @yossi, #1877 @reqshark, #1892 @matheusazzi - * throw 400 in case of malformed paths @rlidwka - -3.4.7 / 2013-12-10 -================== - - * update connect - -3.4.6 / 2013-12-01 -================== - - * update connect (raw-body) - -3.4.5 / 2013-11-27 -================== - - * update connect - * res.location: remove leading ./ #1802 @kapouer - * res.redirect: fix `res.redirect('toString') #1829 @michaelficarra - * res.send: always send ETag when content-length > 0 - * router: add Router.all() method - -3.4.4 / 2013-10-29 -================== - - * update connect - * update supertest - * update methods - * express(1): replace bodyParser() with urlencoded() and json() #1795 @chirag04 - -3.4.3 / 2013-10-23 -================== - - * update connect - -3.4.2 / 2013-10-18 -================== - - * update connect - * downgrade commander - -3.4.1 / 2013-10-15 -================== - - * update connect - * update commander - * jsonp: check if callback is a function - * router: wrap encodeURIComponent in a try/catch #1735 (@lxe) - * res.format: now includes chraset @1747 (@sorribas) - * res.links: allow multiple calls @1746 (@sorribas) - -3.4.0 / 2013-09-07 -================== - - * add res.vary(). Closes #1682 - * update connect - -3.3.8 / 2013-09-02 -================== - - * update connect - -3.3.7 / 2013-08-28 -================== - - * update connect - -3.3.6 / 2013-08-27 -================== - - * Revert "remove charset from json responses. Closes #1631" (causes issues in some clients) - * add: req.accepts take an argument list - -3.3.4 / 2013-07-08 -================== - - * update send and connect - -3.3.3 / 2013-07-04 -================== - - * update connect - -3.3.2 / 2013-07-03 -================== - - * update connect - * update send - * remove .version export - -3.3.1 / 2013-06-27 -================== - - * update connect - -3.3.0 / 2013-06-26 -================== - - * update connect - * add support for multiple X-Forwarded-Proto values. Closes #1646 - * change: remove charset from json responses. Closes #1631 - * change: return actual booleans from req.accept* functions - * fix jsonp callback array throw - -3.2.6 / 2013-06-02 -================== - - * update connect - -3.2.5 / 2013-05-21 -================== - - * update connect - * update node-cookie - * add: throw a meaningful error when there is no default engine - * change generation of ETags with res.send() to GET requests only. Closes #1619 - -3.2.4 / 2013-05-09 -================== - - * fix `req.subdomains` when no Host is present - * fix `req.host` when no Host is present, return undefined - -3.2.3 / 2013-05-07 -================== - - * update connect / qs - -3.2.2 / 2013-05-03 -================== - - * update qs - -3.2.1 / 2013-04-29 -================== - - * add app.VERB() paths array deprecation warning - * update connect - * update qs and remove all ~ semver crap - * fix: accept number as value of Signed Cookie - -3.2.0 / 2013-04-15 -================== - - * add "view" constructor setting to override view behaviour - * add req.acceptsEncoding(name) - * add req.acceptedEncodings - * revert cookie signature change causing session race conditions - * fix sorting of Accept values of the same quality - -3.1.2 / 2013-04-12 -================== - - * add support for custom Accept parameters - * update cookie-signature - -3.1.1 / 2013-04-01 -================== - - * add X-Forwarded-Host support to `req.host` - * fix relative redirects - * update mkdirp - * update buffer-crc32 - * remove legacy app.configure() method from app template. - -3.1.0 / 2013-01-25 -================== - - * add support for leading "." in "view engine" setting - * add array support to `res.set()` - * add node 0.8.x to travis.yml - * add "subdomain offset" setting for tweaking `req.subdomains` - * add `res.location(url)` implementing `res.redirect()`-like setting of Location - * use app.get() for x-powered-by setting for inheritance - * fix colons in passwords for `req.auth` - -3.0.6 / 2013-01-04 -================== - - * add http verb methods to Router - * update connect - * fix mangling of the `res.cookie()` options object - * fix jsonp whitespace escape. Closes #1132 - -3.0.5 / 2012-12-19 -================== - - * add throwing when a non-function is passed to a route - * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses - * revert "add 'etag' option" - -3.0.4 / 2012-12-05 -================== - - * add 'etag' option to disable `res.send()` Etags - * add escaping of urls in text/plain in `res.redirect()` - for old browsers interpreting as html - * change crc32 module for a more liberal license - * update connect - -3.0.3 / 2012-11-13 -================== - - * update connect - * update cookie module - * fix cookie max-age - -3.0.2 / 2012-11-08 -================== - - * add OPTIONS to cors example. Closes #1398 - * fix route chaining regression. Closes #1397 - -3.0.1 / 2012-11-01 -================== - - * update connect - -3.0.0 / 2012-10-23 -================== - - * add `make clean` - * add "Basic" check to req.auth - * add `req.auth` test coverage - * add cb && cb(payload) to `res.jsonp()`. Closes #1374 - * add backwards compat for `res.redirect()` status. Closes #1336 - * add support for `res.json()` to retain previously defined Content-Types. Closes #1349 - * update connect - * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382 - * remove non-primitive string support for `res.send()` - * fix view-locals example. Closes #1370 - * fix route-separation example - -3.0.0rc5 / 2012-09-18 -================== - - * update connect - * add redis search example - * add static-files example - * add "x-powered-by" setting (`app.disable('x-powered-by')`) - * add "application/octet-stream" redirect Accept test case. Closes #1317 - -3.0.0rc4 / 2012-08-30 -================== - - * add `res.jsonp()`. Closes #1307 - * add "verbose errors" option to error-pages example - * add another route example to express(1) so people are not so confused - * add redis online user activity tracking example - * update connect dep - * fix etag quoting. Closes #1310 - * fix error-pages 404 status - * fix jsonp callback char restrictions - * remove old OPTIONS default response - -3.0.0rc3 / 2012-08-13 -================== - - * update connect dep - * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds] - * fix `res.render()` clobbering of "locals" - -3.0.0rc2 / 2012-08-03 -================== - - * add CORS example - * update connect dep - * deprecate `.createServer()` & remove old stale examples - * fix: escape `res.redirect()` link - * fix vhost example - -3.0.0rc1 / 2012-07-24 -================== - - * add more examples to view-locals - * add scheme-relative redirects (`res.redirect("//foo.com")`) support - * update cookie dep - * update connect dep - * update send dep - * fix `express(1)` -h flag, use -H for hogan. Closes #1245 - * fix `res.sendfile()` socket error handling regression - -3.0.0beta7 / 2012-07-16 -================== - - * update connect dep for `send()` root normalization regression - -3.0.0beta6 / 2012-07-13 -================== - - * add `err.view` property for view errors. Closes #1226 - * add "jsonp callback name" setting - * add support for "/foo/:bar*" non-greedy matches - * change `res.sendfile()` to use `send()` module - * change `res.send` to use "response-send" module - * remove `app.locals.use` and `res.locals.use`, use regular middleware - -3.0.0beta5 / 2012-07-03 -================== - - * add "make check" support - * add route-map example - * add `res.json(obj, status)` support back for BC - * add "methods" dep, remove internal methods module - * update connect dep - * update auth example to utilize cores pbkdf2 - * updated tests to use "supertest" - -3.0.0beta4 / 2012-06-25 -================== - - * Added `req.auth` - * Added `req.range(size)` - * Added `res.links(obj)` - * Added `res.send(body, status)` support back for backwards compat - * Added `.default()` support to `res.format()` - * Added 2xx / 304 check to `req.fresh` - * Revert "Added + support to the router" - * Fixed `res.send()` freshness check, respect res.statusCode - -3.0.0beta3 / 2012-06-15 -================== - - * Added hogan `--hjs` to express(1) [nullfirm] - * Added another example to content-negotiation - * Added `fresh` dep - * Changed: `res.send()` always checks freshness - * Fixed: expose connects mime module. Cloases #1165 - -3.0.0beta2 / 2012-06-06 -================== - - * Added `+` support to the router - * Added `req.host` - * Changed `req.param()` to check route first - * Update connect dep - -3.0.0beta1 / 2012-06-01 -================== - - * Added `res.format()` callback to override default 406 behaviour - * Fixed `res.redirect()` 406. Closes #1154 - -3.0.0alpha5 / 2012-05-30 -================== - - * Added `req.ip` - * Added `{ signed: true }` option to `res.cookie()` - * Removed `res.signedCookie()` - * Changed: dont reverse `req.ips` - * Fixed "trust proxy" setting check for `req.ips` - -3.0.0alpha4 / 2012-05-09 -================== - - * Added: allow `[]` in jsonp callback. Closes #1128 - * Added `PORT` env var support in generated template. Closes #1118 [benatkin] - * Updated: connect 2.2.2 - -3.0.0alpha3 / 2012-05-04 -================== - - * Added public `app.routes`. Closes #887 - * Added _view-locals_ example - * Added _mvc_ example - * Added `res.locals.use()`. Closes #1120 - * Added conditional-GET support to `res.send()` - * Added: coerce `res.set()` values to strings - * Changed: moved `static()` in generated apps below router - * Changed: `res.send()` only set ETag when not previously set - * Changed connect 2.2.1 dep - * Changed: `make test` now runs unit / acceptance tests - * Fixed req/res proto inheritance - -3.0.0alpha2 / 2012-04-26 -================== - - * Added `make benchmark` back - * Added `res.send()` support for `String` objects - * Added client-side data exposing example - * Added `res.header()` and `req.header()` aliases for BC - * Added `express.createServer()` for BC - * Perf: memoize parsed urls - * Perf: connect 2.2.0 dep - * Changed: make `expressInit()` middleware self-aware - * Fixed: use app.get() for all core settings - * Fixed redis session example - * Fixed session example. Closes #1105 - * Fixed generated express dep. Closes #1078 - -3.0.0alpha1 / 2012-04-15 -================== - - * Added `app.locals.use(callback)` - * Added `app.locals` object - * Added `app.locals(obj)` - * Added `res.locals` object - * Added `res.locals(obj)` - * Added `res.format()` for content-negotiation - * Added `app.engine()` - * Added `res.cookie()` JSON cookie support - * Added "trust proxy" setting - * Added `req.subdomains` - * Added `req.protocol` - * Added `req.secure` - * Added `req.path` - * Added `req.ips` - * Added `req.fresh` - * Added `req.stale` - * Added comma-delmited / array support for `req.accepts()` - * Added debug instrumentation - * Added `res.set(obj)` - * Added `res.set(field, value)` - * Added `res.get(field)` - * Added `app.get(setting)`. Closes #842 - * Added `req.acceptsLanguage()` - * Added `req.acceptsCharset()` - * Added `req.accepted` - * Added `req.acceptedLanguages` - * Added `req.acceptedCharsets` - * Added "json replacer" setting - * Added "json spaces" setting - * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92 - * Added `--less` support to express(1) - * Added `express.response` prototype - * Added `express.request` prototype - * Added `express.application` prototype - * Added `app.path()` - * Added `app.render()` - * Added `res.type()` to replace `res.contentType()` - * Changed: `res.redirect()` to add relative support - * Changed: enable "jsonp callback" by default - * Changed: renamed "case sensitive routes" to "case sensitive routing" - * Rewrite of all tests with mocha - * Removed "root" setting - * Removed `res.redirect('home')` support - * Removed `req.notify()` - * Removed `app.register()` - * Removed `app.redirect()` - * Removed `app.is()` - * Removed `app.helpers()` - * Removed `app.dynamicHelpers()` - * Fixed `res.sendfile()` with non-GET. Closes #723 - * Fixed express(1) public dir for windows. Closes #866 - -2.5.9/ 2012-04-02 -================== - - * Added support for PURGE request method [pbuyle] - * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki] - -2.5.8 / 2012-02-08 -================== - - * Update mkdirp dep. Closes #991 - -2.5.7 / 2012-02-06 -================== - - * Fixed `app.all` duplicate DELETE requests [mscdex] - -2.5.6 / 2012-01-13 -================== - - * Updated hamljs dev dep. Closes #953 - -2.5.5 / 2012-01-08 -================== - - * Fixed: set `filename` on cached templates [matthewleon] - -2.5.4 / 2012-01-02 -================== - - * Fixed `express(1)` eol on 0.4.x. Closes #947 - -2.5.3 / 2011-12-30 -================== - - * Fixed `req.is()` when a charset is present - -2.5.2 / 2011-12-10 -================== - - * Fixed: express(1) LF -> CRLF for windows - -2.5.1 / 2011-11-17 -================== - - * Changed: updated connect to 1.8.x - * Removed sass.js support from express(1) - -2.5.0 / 2011-10-24 -================== - - * Added ./routes dir for generated app by default - * Added npm install reminder to express(1) app gen - * Added 0.5.x support - * Removed `make test-cov` since it wont work with node 0.5.x - * Fixed express(1) public dir for windows. Closes #866 - -2.4.7 / 2011-10-05 -================== - - * Added mkdirp to express(1). Closes #795 - * Added simple _json-config_ example - * Added shorthand for the parsed request's pathname via `req.path` - * Changed connect dep to 1.7.x to fix npm issue... - * Fixed `res.redirect()` __HEAD__ support. [reported by xerox] - * Fixed `req.flash()`, only escape args - * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie] - -2.4.6 / 2011-08-22 -================== - - * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode] - -2.4.5 / 2011-08-19 -================== - - * Added support for routes to handle errors. Closes #809 - * Added `app.routes.all()`. Closes #803 - * Added "basepath" setting to work in conjunction with reverse proxies etc. - * Refactored `Route` to use a single array of callbacks - * Added support for multiple callbacks for `app.param()`. Closes #801 -Closes #805 - * Changed: removed .call(self) for route callbacks - * Dependency: `qs >= 0.3.1` - * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808 - -2.4.4 / 2011-08-05 -================== - - * Fixed `res.header()` intention of a set, even when `undefined` - * Fixed `*`, value no longer required - * Fixed `res.send(204)` support. Closes #771 - -2.4.3 / 2011-07-14 -================== - - * Added docs for `status` option special-case. Closes #739 - * Fixed `options.filename`, exposing the view path to template engines - -2.4.2. / 2011-07-06 -================== - - * Revert "removed jsonp stripping" for XSS - -2.4.1 / 2011-07-06 -================== - - * Added `res.json()` JSONP support. Closes #737 - * Added _extending-templates_ example. Closes #730 - * Added "strict routing" setting for trailing slashes - * Added support for multiple envs in `app.configure()` calls. Closes #735 - * Changed: `res.send()` using `res.json()` - * Changed: when cookie `path === null` don't default it - * Changed; default cookie path to "home" setting. Closes #731 - * Removed _pids/logs_ creation from express(1) - -2.4.0 / 2011-06-28 -================== - - * Added chainable `res.status(code)` - * Added `res.json()`, an explicit version of `res.send(obj)` - * Added simple web-service example - -2.3.12 / 2011-06-22 -================== - - * \#express is now on freenode! come join! - * Added `req.get(field, param)` - * Added links to Japanese documentation, thanks @hideyukisaito! - * Added; the `express(1)` generated app outputs the env - * Added `content-negotiation` example - * Dependency: connect >= 1.5.1 < 2.0.0 - * Fixed view layout bug. Closes #720 - * Fixed; ignore body on 304. Closes #701 - -2.3.11 / 2011-06-04 -================== - - * Added `npm test` - * Removed generation of dummy test file from `express(1)` - * Fixed; `express(1)` adds express as a dep - * Fixed; prune on `prepublish` - -2.3.10 / 2011-05-27 -================== - - * Added `req.route`, exposing the current route - * Added _package.json_ generation support to `express(1)` - * Fixed call to `app.param()` function for optional params. Closes #682 - -2.3.9 / 2011-05-25 -================== - - * Fixed bug-ish with `../' in `res.partial()` calls - -2.3.8 / 2011-05-24 -================== - - * Fixed `app.options()` - -2.3.7 / 2011-05-23 -================== - - * Added route `Collection`, ex: `app.get('/user/:id').remove();` - * Added support for `app.param(fn)` to define param logic - * Removed `app.param()` support for callback with return value - * Removed module.parent check from express(1) generated app. Closes #670 - * Refactored router. Closes #639 - -2.3.6 / 2011-05-20 -================== - - * Changed; using devDependencies instead of git submodules - * Fixed redis session example - * Fixed markdown example - * Fixed view caching, should not be enabled in development - -2.3.5 / 2011-05-20 -================== - - * Added export `.view` as alias for `.View` - -2.3.4 / 2011-05-08 -================== - - * Added `./examples/say` - * Fixed `res.sendfile()` bug preventing the transfer of files with spaces - -2.3.3 / 2011-05-03 -================== - - * Added "case sensitive routes" option. - * Changed; split methods supported per rfc [slaskis] - * Fixed route-specific middleware when using the same callback function several times - -2.3.2 / 2011-04-27 -================== - - * Fixed view hints - -2.3.1 / 2011-04-26 -================== - - * Added `app.match()` as `app.match.all()` - * Added `app.lookup()` as `app.lookup.all()` - * Added `app.remove()` for `app.remove.all()` - * Added `app.remove.VERB()` - * Fixed template caching collision issue. Closes #644 - * Moved router over from connect and started refactor - -2.3.0 / 2011-04-25 -================== - - * Added options support to `res.clearCookie()` - * Added `res.helpers()` as alias of `res.locals()` - * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0` - * Changed; auto set Content-Type in res.attachement [Aaron Heckmann] - * Renamed "cache views" to "view cache". Closes #628 - * Fixed caching of views when using several apps. Closes #637 - * Fixed gotcha invoking `app.param()` callbacks once per route middleware. -Closes #638 - * Fixed partial lookup precedence. Closes #631 -Shaw] - -2.2.2 / 2011-04-12 -================== - - * Added second callback support for `res.download()` connection errors - * Fixed `filename` option passing to template engine - -2.2.1 / 2011-04-04 -================== - - * Added `layout(path)` helper to change the layout within a view. Closes #610 - * Fixed `partial()` collection object support. - Previously only anything with `.length` would work. - When `.length` is present one must still be aware of holes, - however now `{ collection: {foo: 'bar'}}` is valid, exposes - `keyInCollection` and `keysInCollection`. - - * Performance improved with better view caching - * Removed `request` and `response` locals - * Changed; errorHandler page title is now `Express` instead of `Connect` - -2.2.0 / 2011-03-30 -================== - - * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606 - * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606 - * Added `app.VERB(path)` as alias of `app.lookup.VERB()`. - * Dependency `connect >= 1.2.0` - -2.1.1 / 2011-03-29 -================== - - * Added; expose `err.view` object when failing to locate a view - * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann] - * Fixed; `res.send(undefined)` responds with 204 [aheckmann] - -2.1.0 / 2011-03-24 -================== - - * Added `/_?` partial lookup support. Closes #447 - * Added `request`, `response`, and `app` local variables - * Added `settings` local variable, containing the app's settings - * Added `req.flash()` exception if `req.session` is not available - * Added `res.send(bool)` support (json response) - * Fixed stylus example for latest version - * Fixed; wrap try/catch around `res.render()` - -2.0.0 / 2011-03-17 -================== - - * Fixed up index view path alternative. - * Changed; `res.locals()` without object returns the locals - -2.0.0rc3 / 2011-03-17 -================== - - * Added `res.locals(obj)` to compliment `res.local(key, val)` - * Added `res.partial()` callback support - * Fixed recursive error reporting issue in `res.render()` - -2.0.0rc2 / 2011-03-17 -================== - - * Changed; `partial()` "locals" are now optional - * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01] - * Fixed .filename view engine option [reported by drudge] - * Fixed blog example - * Fixed `{req,res}.app` reference when mounting [Ben Weaver] - -2.0.0rc / 2011-03-14 -================== - - * Fixed; expose `HTTPSServer` constructor - * Fixed express(1) default test charset. Closes #579 [reported by secoif] - * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP] - -2.0.0beta3 / 2011-03-09 -================== - - * Added support for `res.contentType()` literal - The original `res.contentType('.json')`, - `res.contentType('application/json')`, and `res.contentType('json')` - will work now. - * Added `res.render()` status option support back - * Added charset option for `res.render()` - * Added `.charset` support (via connect 1.0.4) - * Added view resolution hints when in development and a lookup fails - * Added layout lookup support relative to the page view. - For example while rendering `./views/user/index.jade` if you create - `./views/user/layout.jade` it will be used in favour of the root layout. - * Fixed `res.redirect()`. RFC states absolute url [reported by unlink] - * Fixed; default `res.send()` string charset to utf8 - * Removed `Partial` constructor (not currently used) - -2.0.0beta2 / 2011-03-07 -================== - - * Added res.render() `.locals` support back to aid in migration process - * Fixed flash example - -2.0.0beta / 2011-03-03 -================== - - * Added HTTPS support - * Added `res.cookie()` maxAge support - * Added `req.header()` _Referrer_ / _Referer_ special-case, either works - * Added mount support for `res.redirect()`, now respects the mount-point - * Added `union()` util, taking place of `merge(clone())` combo - * Added stylus support to express(1) generated app - * Added secret to session middleware used in examples and generated app - * Added `res.local(name, val)` for progressive view locals - * Added default param support to `req.param(name, default)` - * Added `app.disabled()` and `app.enabled()` - * Added `app.register()` support for omitting leading ".", either works - * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539 - * Added `app.param()` to map route params to async/sync logic - * Added; aliased `app.helpers()` as `app.locals()`. Closes #481 - * Added extname with no leading "." support to `res.contentType()` - * Added `cache views` setting, defaulting to enabled in "production" env - * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_. - * Added `req.accepts()` support for extensions - * Changed; `res.download()` and `res.sendfile()` now utilize Connect's - static file server `connect.static.send()`. - * Changed; replaced `connect.utils.mime()` with npm _mime_ module - * Changed; allow `req.query` to be pre-defined (via middleware or other parent - * Changed view partial resolution, now relative to parent view - * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`. - * Fixed `req.param()` bug returning Array.prototype methods. Closes #552 - * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()` - * Fixed; using _qs_ module instead of _querystring_ - * Fixed; strip unsafe chars from jsonp callbacks - * Removed "stream threshold" setting - -1.0.8 / 2011-03-01 -================== - - * Allow `req.query` to be pre-defined (via middleware or other parent app) - * "connect": ">= 0.5.0 < 1.0.0". Closes #547 - * Removed the long deprecated __EXPRESS_ENV__ support - -1.0.7 / 2011-02-07 -================== - - * Fixed `render()` setting inheritance. - Mounted apps would not inherit "view engine" - -1.0.6 / 2011-02-07 -================== - - * Fixed `view engine` setting bug when period is in dirname - -1.0.5 / 2011-02-05 -================== - - * Added secret to generated app `session()` call - -1.0.4 / 2011-02-05 -================== - - * Added `qs` dependency to _package.json_ - * Fixed namespaced `require()`s for latest connect support - -1.0.3 / 2011-01-13 -================== - - * Remove unsafe characters from JSONP callback names [Ryan Grove] - -1.0.2 / 2011-01-10 -================== - - * Removed nested require, using `connect.router` - -1.0.1 / 2010-12-29 -================== - - * Fixed for middleware stacked via `createServer()` - previously the `foo` middleware passed to `createServer(foo)` - would not have access to Express methods such as `res.send()` - or props like `req.query` etc. - -1.0.0 / 2010-11-16 -================== - - * Added; deduce partial object names from the last segment. - For example by default `partial('forum/post', postObject)` will - give you the _post_ object, providing a meaningful default. - * Added http status code string representation to `res.redirect()` body - * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__. - * Added `req.is()` to aid in content negotiation - * Added partial local inheritance [suggested by masylum]. Closes #102 - providing access to parent template locals. - * Added _-s, --session[s]_ flag to express(1) to add session related middleware - * Added _--template_ flag to express(1) to specify the - template engine to use. - * Added _--css_ flag to express(1) to specify the - stylesheet engine to use (or just plain css by default). - * Added `app.all()` support [thanks aheckmann] - * Added partial direct object support. - You may now `partial('user', user)` providing the "user" local, - vs previously `partial('user', { object: user })`. - * Added _route-separation_ example since many people question ways - to do this with CommonJS modules. Also view the _blog_ example for - an alternative. - * Performance; caching view path derived partial object names - * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454 - * Fixed jsonp support; _text/javascript_ as per mailinglist discussion - -1.0.0rc4 / 2010-10-14 -================== - - * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0 - * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware)) - * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass] - * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass] - * Added `partial()` support for array-like collections. Closes #434 - * Added support for swappable querystring parsers - * Added session usage docs. Closes #443 - * Added dynamic helper caching. Closes #439 [suggested by maritz] - * Added authentication example - * Added basic Range support to `res.sendfile()` (and `res.download()` etc) - * Changed; `express(1)` generated app using 2 spaces instead of 4 - * Default env to "development" again [aheckmann] - * Removed _context_ option is no more, use "scope" - * Fixed; exposing _./support_ libs to examples so they can run without installs - * Fixed mvc example - -1.0.0rc3 / 2010-09-20 -================== - - * Added confirmation for `express(1)` app generation. Closes #391 - * Added extending of flash formatters via `app.flashFormatters` - * Added flash formatter support. Closes #411 - * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold" - * Added _stream threshold_ setting for `res.sendfile()` - * Added `res.send()` __HEAD__ support - * Added `res.clearCookie()` - * Added `res.cookie()` - * Added `res.render()` headers option - * Added `res.redirect()` response bodies - * Added `res.render()` status option support. Closes #425 [thanks aheckmann] - * Fixed `res.sendfile()` responding with 403 on malicious path - * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_ - * Fixed; mounted apps settings now inherit from parent app [aheckmann] - * Fixed; stripping Content-Length / Content-Type when 204 - * Fixed `res.send()` 204. Closes #419 - * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402 - * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo] - - -1.0.0rc2 / 2010-08-17 -================== - - * Added `app.register()` for template engine mapping. Closes #390 - * Added `res.render()` callback support as second argument (no options) - * Added callback support to `res.download()` - * Added callback support for `res.sendfile()` - * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()` - * Added "partials" setting to docs - * Added default expresso tests to `express(1)` generated app. Closes #384 - * Fixed `res.sendfile()` error handling, defer via `next()` - * Fixed `res.render()` callback when a layout is used [thanks guillermo] - * Fixed; `make install` creating ~/.node_libraries when not present - * Fixed issue preventing error handlers from being defined anywhere. Closes #387 - -1.0.0rc / 2010-07-28 -================== - - * Added mounted hook. Closes #369 - * Added connect dependency to _package.json_ - - * Removed "reload views" setting and support code - development env never caches, production always caches. - - * Removed _param_ in route callbacks, signature is now - simply (req, res, next), previously (req, res, params, next). - Use _req.params_ for path captures, _req.query_ for GET params. - - * Fixed "home" setting - * Fixed middleware/router precedence issue. Closes #366 - * Fixed; _configure()_ callbacks called immediately. Closes #368 - -1.0.0beta2 / 2010-07-23 -================== - - * Added more examples - * Added; exporting `Server` constructor - * Added `Server#helpers()` for view locals - * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349 - * Added support for absolute view paths - * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363 - * Added Guillermo Rauch to the contributor list - * Added support for "as" for non-collection partials. Closes #341 - * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf] - * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo] - * Fixed instanceof `Array` checks, now `Array.isArray()` - * Fixed express(1) expansion of public dirs. Closes #348 - * Fixed middleware precedence. Closes #345 - * Fixed view watcher, now async [thanks aheckmann] - -1.0.0beta / 2010-07-15 -================== - - * Re-write - - much faster - - much lighter - - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs - -0.14.0 / 2010-06-15 -================== - - * Utilize relative requires - * Added Static bufferSize option [aheckmann] - * Fixed caching of view and partial subdirectories [aheckmann] - * Fixed mime.type() comments now that ".ext" is not supported - * Updated haml submodule - * Updated class submodule - * Removed bin/express - -0.13.0 / 2010-06-01 -================== - - * Added node v0.1.97 compatibility - * Added support for deleting cookies via Request#cookie('key', null) - * Updated haml submodule - * Fixed not-found page, now using using charset utf-8 - * Fixed show-exceptions page, now using using charset utf-8 - * Fixed view support due to fs.readFile Buffers - * Changed; mime.type() no longer accepts ".type" due to node extname() changes - -0.12.0 / 2010-05-22 -================== - - * Added node v0.1.96 compatibility - * Added view `helpers` export which act as additional local variables - * Updated haml submodule - * Changed ETag; removed inode, modified time only - * Fixed LF to CRLF for setting multiple cookies - * Fixed cookie complation; values are now urlencoded - * Fixed cookies parsing; accepts quoted values and url escaped cookies - -0.11.0 / 2010-05-06 -================== - - * Added support for layouts using different engines - - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' }) - - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml' - - this.render('page.html.haml', { layout: false }) // no layout - * Updated ext submodule - * Updated haml submodule - * Fixed EJS partial support by passing along the context. Issue #307 - -0.10.1 / 2010-05-03 -================== - - * Fixed binary uploads. - -0.10.0 / 2010-04-30 -================== - - * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s - encoding is set to 'utf8' or 'utf-8'. - * Added "encoding" option to Request#render(). Closes #299 - * Added "dump exceptions" setting, which is enabled by default. - * Added simple ejs template engine support - * Added error reponse support for text/plain, application/json. Closes #297 - * Added callback function param to Request#error() - * Added Request#sendHead() - * Added Request#stream() - * Added support for Request#respond(304, null) for empty response bodies - * Added ETag support to Request#sendfile() - * Added options to Request#sendfile(), passed to fs.createReadStream() - * Added filename arg to Request#download() - * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request - * Performance enhanced by preventing several calls to toLowerCase() in Router#match() - * Changed; Request#sendfile() now streams - * Changed; Renamed Request#halt() to Request#respond(). Closes #289 - * Changed; Using sys.inspect() instead of JSON.encode() for error output - * Changed; run() returns the http.Server instance. Closes #298 - * Changed; Defaulting Server#host to null (INADDR_ANY) - * Changed; Logger "common" format scale of 0.4f - * Removed Logger "request" format - * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found - * Fixed several issues with http client - * Fixed Logger Content-Length output - * Fixed bug preventing Opera from retaining the generated session id. Closes #292 - -0.9.0 / 2010-04-14 -================== - - * Added DSL level error() route support - * Added DSL level notFound() route support - * Added Request#error() - * Added Request#notFound() - * Added Request#render() callback function. Closes #258 - * Added "max upload size" setting - * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254 - * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js - * Added callback function support to Request#halt() as 3rd/4th arg - * Added preprocessing of route param wildcards using param(). Closes #251 - * Added view partial support (with collections etc) - * Fixed bug preventing falsey params (such as ?page=0). Closes #286 - * Fixed setting of multiple cookies. Closes #199 - * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml) - * Changed; session cookie is now httpOnly - * Changed; Request is no longer global - * Changed; Event is no longer global - * Changed; "sys" module is no longer global - * Changed; moved Request#download to Static plugin where it belongs - * Changed; Request instance created before body parsing. Closes #262 - * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253 - * Changed; Pre-caching view partials in memory when "cache view partials" is enabled - * Updated support to node --version 0.1.90 - * Updated dependencies - * Removed set("session cookie") in favour of use(Session, { cookie: { ... }}) - * Removed utils.mixin(); use Object#mergeDeep() - -0.8.0 / 2010-03-19 -================== - - * Added coffeescript example app. Closes #242 - * Changed; cache api now async friendly. Closes #240 - * Removed deprecated 'express/static' support. Use 'express/plugins/static' - -0.7.6 / 2010-03-19 -================== - - * Added Request#isXHR. Closes #229 - * Added `make install` (for the executable) - * Added `express` executable for setting up simple app templates - * Added "GET /public/*" to Static plugin, defaulting to /public - * Added Static plugin - * Fixed; Request#render() only calls cache.get() once - * Fixed; Namespacing View caches with "view:" - * Fixed; Namespacing Static caches with "static:" - * Fixed; Both example apps now use the Static plugin - * Fixed set("views"). Closes #239 - * Fixed missing space for combined log format - * Deprecated Request#sendfile() and 'express/static' - * Removed Server#running - -0.7.5 / 2010-03-16 -================== - - * Added Request#flash() support without args, now returns all flashes - * Updated ext submodule - -0.7.4 / 2010-03-16 -================== - - * Fixed session reaper - * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft) - -0.7.3 / 2010-03-16 -================== - - * Added package.json - * Fixed requiring of haml / sass due to kiwi removal - -0.7.2 / 2010-03-16 -================== - - * Fixed GIT submodules (HAH!) - -0.7.1 / 2010-03-16 -================== - - * Changed; Express now using submodules again until a PM is adopted - * Changed; chat example using millisecond conversions from ext - -0.7.0 / 2010-03-15 -================== - - * Added Request#pass() support (finds the next matching route, or the given path) - * Added Logger plugin (default "common" format replaces CommonLogger) - * Removed Profiler plugin - * Removed CommonLogger plugin - -0.6.0 / 2010-03-11 -================== - - * Added seed.yml for kiwi package management support - * Added HTTP client query string support when method is GET. Closes #205 - - * Added support for arbitrary view engines. - For example "foo.engine.html" will now require('engine'), - the exports from this module are cached after the first require(). - - * Added async plugin support - - * Removed usage of RESTful route funcs as http client - get() etc, use http.get() and friends - - * Removed custom exceptions - -0.5.0 / 2010-03-10 -================== - - * Added ext dependency (library of js extensions) - * Removed extname() / basename() utils. Use path module - * Removed toArray() util. Use arguments.values - * Removed escapeRegexp() util. Use RegExp.escape() - * Removed process.mixin() dependency. Use utils.mixin() - * Removed Collection - * Removed ElementCollection - * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com) ;) - -0.4.0 / 2010-02-11 -================== - - * Added flash() example to sample upload app - * Added high level restful http client module (express/http) - * Changed; RESTful route functions double as HTTP clients. Closes #69 - * Changed; throwing error when routes are added at runtime - * Changed; defaulting render() context to the current Request. Closes #197 - * Updated haml submodule - -0.3.0 / 2010-02-11 -================== - - * Updated haml / sass submodules. Closes #200 - * Added flash message support. Closes #64 - * Added accepts() now allows multiple args. fixes #117 - * Added support for plugins to halt. Closes #189 - * Added alternate layout support. Closes #119 - * Removed Route#run(). Closes #188 - * Fixed broken specs due to use(Cookie) missing - -0.2.1 / 2010-02-05 -================== - - * Added "plot" format option for Profiler (for gnuplot processing) - * Added request number to Profiler plugin - * Fixed binary encoding for multi-part file uploads, was previously defaulting to UTF8 - * Fixed issue with routes not firing when not files are present. Closes #184 - * Fixed process.Promise -> events.Promise - -0.2.0 / 2010-02-03 -================== - - * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180 - * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174 - * Added expiration support to cache api with reaper. Closes #133 - * Added cache Store.Memory#reap() - * Added Cache; cache api now uses first class Cache instances - * Added abstract session Store. Closes #172 - * Changed; cache Memory.Store#get() utilizing Collection - * Renamed MemoryStore -> Store.Memory - * Fixed use() of the same plugin several time will always use latest options. Closes #176 - -0.1.0 / 2010-02-03 -================== - - * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context - * Updated node support to 0.1.27 Closes #169 - * Updated dirname(__filename) -> __dirname - * Updated libxmljs support to v0.2.0 - * Added session support with memory store / reaping - * Added quick uid() helper - * Added multi-part upload support - * Added Sass.js support / submodule - * Added production env caching view contents and static files - * Added static file caching. Closes #136 - * Added cache plugin with memory stores - * Added support to StaticFile so that it works with non-textual files. - * Removed dirname() helper - * Removed several globals (now their modules must be required) - -0.0.2 / 2010-01-10 -================== - - * Added view benchmarks; currently haml vs ejs - * Added Request#attachment() specs. Closes #116 - * Added use of node's parseQuery() util. Closes #123 - * Added `make init` for submodules - * Updated Haml - * Updated sample chat app to show messages on load - * Updated libxmljs parseString -> parseHtmlString - * Fixed `make init` to work with older versions of git - * Fixed specs can now run independant specs for those who cant build deps. Closes #127 - * Fixed issues introduced by the node url module changes. Closes 126. - * Fixed two assertions failing due to Collection#keys() returning strings - * Fixed faulty Collection#toArray() spec due to keys() returning strings - * Fixed `make test` now builds libxmljs.node before testing - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/LICENSE deleted file mode 100644 index 0f3c767..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2009-2014 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. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/Readme.md deleted file mode 100644 index 8abbcc4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/Readme.md +++ /dev/null @@ -1,128 +0,0 @@ -[![Express Logo](https://i.cloudup.com/zfY6lL7eFa-3000x3000.png)](https://expressjs.com/) - - Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). - - [![NPM Version](https://badge.fury.io/js/express.svg)](https://badge.fury.io/js/express) - [![Build Status](https://travis-ci.org/visionmedia/express.svg?branch=master)](https://travis-ci.org/visionmedia/express) - [![Coverage Status](https://img.shields.io/coveralls/visionmedia/express.svg)](https://coveralls.io/r/visionmedia/express) - [![Gittip](http://img.shields.io/gittip/dougwilson.svg)](https://www.gittip.com/dougwilson/) - -```js -var express = require('express') -var app = express() - -app.get('/', function (req, res) { - res.send('Hello World') -}) - -app.listen(3000) -``` - - **PROTIP** Be sure to read [Migrating from 3.x to 4.x](https://github.com/visionmedia/express/wiki/Migrating-from-3.x-to-4.x) as well as [New features in 4.x](https://github.com/visionmedia/express/wiki/New-features-in-4.x). - -### Installation - -```bash -$ npm install express -``` - -## Quick Start - - The quickest way to get started with express is to utilize the executable [`express(1)`](https://github.com/expressjs/generator) to generate an application as shown below: - - Install the executable. The executable's major version will match Express's: - -```bash -$ npm install -g express-generator@4 -``` - - Create the app: - -```bash -$ express /tmp/foo && cd /tmp/foo -``` - - Install dependencies: - -```bash -$ npm install -``` - - Start the server: - -```bash -$ npm start -``` - -## Features - - * Robust routing - * HTTP helpers (redirection, caching, etc) - * View system supporting 14+ template engines - * Content negotiation - * Focus on high performance - * Executable for generating applications quickly - * High test coverage - -## Philosophy - - The Express philosophy is to provide small, robust tooling for HTTP servers, making - it a great solution for single page applications, web sites, hybrids, or public - HTTP APIs. - - Express does not force you to use any specific ORM or template engine. With support for over - 14 template engines via [Consolidate.js](https://github.com/visionmedia/consolidate.js), - you can quickly craft your perfect framework. - -## More Information - - * [Website and Documentation](http://expressjs.com/) - [[website repo](https://github.com/visionmedia/expressjs.com)] - * [Github Organization](https://github.com/expressjs) for Official Middleware & Modules - * [#express](https://webchat.freenode.net/?channels=express) on freenode IRC - * Visit the [Wiki](https://github.com/visionmedia/express/wiki) - * [Google Group](https://groups.google.com/group/express-js) for discussion - * [Русскоязычная документация](http://jsman.ru/express/) - * [한국어 문서](http://expressjs.kr) - [[website repo](https://github.com/Hanul/expressjs.kr)] - * Run express examples [online](https://runnable.com/express) - -## Viewing Examples - - Clone the Express repo, then install the dev dependencies to install all the example / test suite dependencies: - -```bash -$ git clone git://github.com/visionmedia/express.git --depth 1 -$ cd express -$ npm install -``` - - Then run whichever example you want: - - $ node examples/content-negotiation - - You can also view live examples here: - - - -## Running Tests - - To run the test suite, first invoke the following command within the repo, installing the development dependencies: - -```bash -$ npm install -``` - - Then run the tests: - -```bash -$ npm test -``` - -### Contributors - - * Author: [TJ Holowaychuk](https://github.com/visionmedia) - * Lead Maintainer: [Douglas Christopher Wilson](https://github.com/dougwilson) - * [All Contributors](https://github.com/visionmedia/express/graphs/contributors) - -### License - - [MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/index.js deleted file mode 100644 index 3da3378..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/express'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/application.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/application.js deleted file mode 100644 index b8b69c0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/application.js +++ /dev/null @@ -1,554 +0,0 @@ -/** - * Module dependencies. - */ - -var finalhandler = require('finalhandler'); -var mixin = require('utils-merge'); -var Router = require('./router'); -var methods = require('methods'); -var middleware = require('./middleware/init'); -var query = require('./middleware/query'); -var debug = require('debug')('express:application'); -var View = require('./view'); -var http = require('http'); -var compileETag = require('./utils').compileETag; -var compileQueryParser = require('./utils').compileQueryParser; -var compileTrust = require('./utils').compileTrust; -var deprecate = require('depd')('express'); -var resolve = require('path').resolve; - -/** - * Application prototype. - */ - -var app = exports = module.exports = {}; - -/** - * Initialize the server. - * - * - setup default configuration - * - setup default middleware - * - setup route reflection methods - * - * @api private - */ - -app.init = function(){ - this.cache = {}; - this.settings = {}; - this.engines = {}; - this.defaultConfiguration(); -}; - -/** - * Initialize application configuration. - * - * @api private - */ - -app.defaultConfiguration = function(){ - // default settings - this.enable('x-powered-by'); - this.set('etag', 'weak'); - var env = process.env.NODE_ENV || 'development'; - this.set('env', env); - this.set('query parser', 'extended'); - this.set('subdomain offset', 2); - this.set('trust proxy', false); - - debug('booting in %s mode', env); - - // inherit protos - this.on('mount', function(parent){ - this.request.__proto__ = parent.request; - this.response.__proto__ = parent.response; - this.engines.__proto__ = parent.engines; - this.settings.__proto__ = parent.settings; - }); - - // setup locals - this.locals = Object.create(null); - - // top-most app is mounted at / - this.mountpath = '/'; - - // default locals - this.locals.settings = this.settings; - - // default configuration - this.set('view', View); - this.set('views', resolve('views')); - this.set('jsonp callback name', 'callback'); - - if (env === 'production') { - this.enable('view cache'); - } - - Object.defineProperty(this, 'router', { - get: function() { - throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.'); - } - }); -}; - -/** - * lazily adds the base router if it has not yet been added. - * - * We cannot add the base router in the defaultConfiguration because - * it reads app settings which might be set after that has run. - * - * @api private - */ -app.lazyrouter = function() { - if (!this._router) { - this._router = new Router({ - caseSensitive: this.enabled('case sensitive routing'), - strict: this.enabled('strict routing') - }); - - this._router.use(query(this.get('query parser fn'))); - this._router.use(middleware.init(this)); - } -}; - -/** - * Dispatch a req, res pair into the application. Starts pipeline processing. - * - * If no _done_ callback is provided, then default error handlers will respond - * in the event of an error bubbling through the stack. - * - * @api private - */ - -app.handle = function(req, res, done) { - var router = this._router; - - // final handler - done = done || finalhandler(req, res, { - env: this.get('env'), - onerror: logerror.bind(this) - }); - - // no routes - if (!router) { - debug('no routes defined on app'); - done(); - return; - } - - router.handle(req, res, done); -}; - -/** - * Proxy `Router#use()` to add middleware to the app router. - * See Router#use() documentation for details. - * - * If the _fn_ parameter is an express app, then it will be - * mounted at the _route_ specified. - * - * @api public - */ - -app.use = function use(path, fn) { - var mount_app; - var mount_path; - - // check for .use(path, app) or .use(app) signature - if (arguments.length <= 2) { - mount_path = typeof path === 'string' - ? path - : '/'; - mount_app = typeof path === 'function' - ? path - : fn; - } - - // setup router - this.lazyrouter(); - var router = this._router; - - // express app - if (mount_app && mount_app.handle && mount_app.set) { - debug('.use app under %s', mount_path); - mount_app.mountpath = mount_path; - mount_app.parent = this; - - // restore .app property on req and res - router.use(mount_path, function mounted_app(req, res, next) { - var orig = req.app; - mount_app.handle(req, res, function(err) { - req.__proto__ = orig.request; - res.__proto__ = orig.response; - next(err); - }); - }); - - // mounted an app - mount_app.emit('mount', this); - - return this; - } - - // pass-through use - router.use.apply(router, arguments); - - return this; -}; - -/** - * Proxy to the app `Router#route()` - * Returns a new `Route` instance for the _path_. - * - * Routes are isolated middleware stacks for specific paths. - * See the Route api docs for details. - * - * @api public - */ - -app.route = function(path){ - this.lazyrouter(); - return this._router.route(path); -}; - -/** - * Register the given template engine callback `fn` - * as `ext`. - * - * By default will `require()` the engine based on the - * file extension. For example if you try to render - * a "foo.jade" file Express will invoke the following internally: - * - * app.engine('jade', require('jade').__express); - * - * For engines that do not provide `.__express` out of the box, - * or if you wish to "map" a different extension to the template engine - * you may use this method. For example mapping the EJS template engine to - * ".html" files: - * - * app.engine('html', require('ejs').renderFile); - * - * In this case EJS provides a `.renderFile()` method with - * the same signature that Express expects: `(path, options, callback)`, - * though note that it aliases this method as `ejs.__express` internally - * so if you're using ".ejs" extensions you dont need to do anything. - * - * Some template engines do not follow this convention, the - * [Consolidate.js](https://github.com/visionmedia/consolidate.js) - * library was created to map all of node's popular template - * engines to follow this convention, thus allowing them to - * work seamlessly within Express. - * - * @param {String} ext - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.engine = function(ext, fn){ - if ('function' != typeof fn) throw new Error('callback function required'); - if ('.' != ext[0]) ext = '.' + ext; - this.engines[ext] = fn; - return this; -}; - -/** - * Proxy to `Router#param()` with one added api feature. The _name_ parameter - * can be an array of names. - * - * See the Router#param() docs for more details. - * - * @param {String|Array} name - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.param = function(name, fn){ - var self = this; - self.lazyrouter(); - - if (Array.isArray(name)) { - name.forEach(function(key) { - self.param(key, fn); - }); - return this; - } - - self._router.param(name, fn); - return this; -}; - -/** - * Assign `setting` to `val`, or return `setting`'s value. - * - * app.set('foo', 'bar'); - * app.get('foo'); - * // => "bar" - * - * Mounted servers inherit their parent server's settings. - * - * @param {String} setting - * @param {*} [val] - * @return {Server} for chaining - * @api public - */ - -app.set = function(setting, val){ - if (arguments.length === 1) { - // app.get(setting) - return this.settings[setting]; - } - - // set value - this.settings[setting] = val; - - // trigger matched settings - switch (setting) { - case 'etag': - debug('compile etag %s', val); - this.set('etag fn', compileETag(val)); - break; - case 'query parser': - debug('compile query parser %s', val); - this.set('query parser fn', compileQueryParser(val)); - break; - case 'trust proxy': - debug('compile trust proxy %s', val); - this.set('trust proxy fn', compileTrust(val)); - break; - } - - return this; -}; - -/** - * Return the app's absolute pathname - * based on the parent(s) that have - * mounted it. - * - * For example if the application was - * mounted as "/admin", which itself - * was mounted as "/blog" then the - * return value would be "/blog/admin". - * - * @return {String} - * @api private - */ - -app.path = function(){ - return this.parent - ? this.parent.path() + this.mountpath - : ''; -}; - -/** - * Check if `setting` is enabled (truthy). - * - * app.enabled('foo') - * // => false - * - * app.enable('foo') - * app.enabled('foo') - * // => true - * - * @param {String} setting - * @return {Boolean} - * @api public - */ - -app.enabled = function(setting){ - return !!this.set(setting); -}; - -/** - * Check if `setting` is disabled. - * - * app.disabled('foo') - * // => true - * - * app.enable('foo') - * app.disabled('foo') - * // => false - * - * @param {String} setting - * @return {Boolean} - * @api public - */ - -app.disabled = function(setting){ - return !this.set(setting); -}; - -/** - * Enable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @api public - */ - -app.enable = function(setting){ - return this.set(setting, true); -}; - -/** - * Disable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @api public - */ - -app.disable = function(setting){ - return this.set(setting, false); -}; - -/** - * Delegate `.VERB(...)` calls to `router.VERB(...)`. - */ - -methods.forEach(function(method){ - app[method] = function(path){ - if ('get' == method && 1 == arguments.length) return this.set(path); - - this.lazyrouter(); - - var route = this._router.route(path); - route[method].apply(route, [].slice.call(arguments, 1)); - return this; - }; -}); - -/** - * Special-cased "all" method, applying the given route `path`, - * middleware, and callback to _every_ HTTP method. - * - * @param {String} path - * @param {Function} ... - * @return {app} for chaining - * @api public - */ - -app.all = function(path){ - this.lazyrouter(); - - var route = this._router.route(path); - var args = [].slice.call(arguments, 1); - methods.forEach(function(method){ - route[method].apply(route, args); - }); - - return this; -}; - -// del -> delete alias - -app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead'); - -/** - * Render the given view `name` name with `options` - * and a callback accepting an error and the - * rendered template string. - * - * Example: - * - * app.render('email', { name: 'Tobi' }, function(err, html){ - * // ... - * }) - * - * @param {String} name - * @param {String|Function} options or fn - * @param {Function} fn - * @api public - */ - -app.render = function(name, options, fn){ - var opts = {}; - var cache = this.cache; - var engines = this.engines; - var view; - - // support callback function as second arg - if ('function' == typeof options) { - fn = options, options = {}; - } - - // merge app.locals - mixin(opts, this.locals); - - // merge options._locals - if (options._locals) mixin(opts, options._locals); - - // merge options - mixin(opts, options); - - // set .cache unless explicitly provided - opts.cache = null == opts.cache - ? this.enabled('view cache') - : opts.cache; - - // primed cache - if (opts.cache) view = cache[name]; - - // view - if (!view) { - view = new (this.get('view'))(name, { - defaultEngine: this.get('view engine'), - root: this.get('views'), - engines: engines - }); - - if (!view.path) { - var err = new Error('Failed to lookup view "' + name + '" in views directory "' + view.root + '"'); - err.view = view; - return fn(err); - } - - // prime the cache - if (opts.cache) cache[name] = view; - } - - // render - try { - view.render(opts, fn); - } catch (err) { - fn(err); - } -}; - -/** - * Listen for connections. - * - * A node `http.Server` is returned, with this - * application (which is a `Function`) as its - * callback. If you wish to create both an HTTP - * and HTTPS server you may do so with the "http" - * and "https" modules as shown here: - * - * var http = require('http') - * , https = require('https') - * , express = require('express') - * , app = express(); - * - * http.createServer(app).listen(80); - * https.createServer({ ... }, app).listen(443); - * - * @return {http.Server} - * @api public - */ - -app.listen = function(){ - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; - -/** -* Log error using console.error. -* -* @param {Error} err -* @api public -*/ - -function logerror(err){ - if (this.get('env') !== 'test') console.error(err.stack || err.toString()); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/express.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/express.js deleted file mode 100644 index 7be6832..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/express.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter; -var mixin = require('utils-merge'); -var proto = require('./application'); -var Route = require('./router/route'); -var Router = require('./router'); -var req = require('./request'); -var res = require('./response'); - -/** - * Expose `createApplication()`. - */ - -exports = module.exports = createApplication; - -/** - * Create an express application. - * - * @return {Function} - * @api public - */ - -function createApplication() { - var app = function(req, res, next) { - app.handle(req, res, next); - }; - - mixin(app, proto); - mixin(app, EventEmitter.prototype); - - app.request = { __proto__: req, app: app }; - app.response = { __proto__: res, app: app }; - app.init(); - return app; -} - -/** - * Expose the prototypes. - */ - -exports.application = proto; -exports.request = req; -exports.response = res; - -/** - * Expose constructors. - */ - -exports.Route = Route; -exports.Router = Router; - -/** - * Expose middleware - */ - -exports.query = require('./middleware/query'); -exports.static = require('serve-static'); - -/** - * Replace removed middleware with an appropriate error message. - */ - -[ - 'json', - 'urlencoded', - 'bodyParser', - 'compress', - 'cookieSession', - 'session', - 'logger', - 'cookieParser', - 'favicon', - 'responseTime', - 'errorHandler', - 'timeout', - 'methodOverride', - 'vhost', - 'csrf', - 'directory', - 'limit', - 'multipart', - 'staticCache', -].forEach(function (name) { - Object.defineProperty(exports, name, { - get: function () { - throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.'); - }, - configurable: true - }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/init.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/init.js deleted file mode 100644 index c09cf0c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/init.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Initialization middleware, exposing the - * request and response to eachother, as well - * as defaulting the X-Powered-By header field. - * - * @param {Function} app - * @return {Function} - * @api private - */ - -exports.init = function(app){ - return function expressInit(req, res, next){ - if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); - req.res = res; - res.req = req; - req.next = next; - - req.__proto__ = app.request; - res.__proto__ = app.response; - - res.locals = res.locals || Object.create(null); - - next(); - }; -}; - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/query.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/query.js deleted file mode 100644 index 092bbd9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/middleware/query.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Module dependencies. - */ - -var parseUrl = require('parseurl'); -var qs = require('qs'); - -/** - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function query(options) { - var queryparse = qs.parse; - - if (typeof options === 'function') { - queryparse = options; - options = undefined; - } - - return function query(req, res, next){ - if (!req.query) { - var val = parseUrl(req).query; - req.query = queryparse(val, options); - } - - next(); - }; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/request.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/request.js deleted file mode 100644 index ea5d037..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/request.js +++ /dev/null @@ -1,454 +0,0 @@ -/** - * Module dependencies. - */ - -var accepts = require('accepts'); -var deprecate = require('depd')('express'); -var typeis = require('type-is'); -var http = require('http'); -var fresh = require('fresh'); -var parseRange = require('range-parser'); -var parse = require('parseurl'); -var proxyaddr = require('proxy-addr'); - -/** - * Request prototype. - */ - -var req = exports = module.exports = { - __proto__: http.IncomingMessage.prototype -}; - -/** - * Return request header. - * - * The `Referrer` header field is special-cased, - * both `Referrer` and `Referer` are interchangeable. - * - * Examples: - * - * req.get('Content-Type'); - * // => "text/plain" - * - * req.get('content-type'); - * // => "text/plain" - * - * req.get('Something'); - * // => undefined - * - * Aliased as `req.header()`. - * - * @param {String} name - * @return {String} - * @api public - */ - -req.get = -req.header = function(name){ - switch (name = name.toLowerCase()) { - case 'referer': - case 'referrer': - return this.headers.referrer - || this.headers.referer; - default: - return this.headers[name]; - } -}; - -/** - * To do: update docs. - * - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json", a comma-delimted list such as "json, html, text/plain", - * an argument list such as `"json", "html", "text/plain"`, - * or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * req.accepts('html'); - * // => "html" - * - * // Accept: text/*, application/json - * req.accepts('html'); - * // => "html" - * req.accepts('text/html'); - * // => "text/html" - * req.accepts('json, text'); - * // => "json" - * req.accepts('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * req.accepts('image/png'); - * req.accepts('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * req.accepts(['html', 'json']); - * req.accepts('html', 'json'); - * req.accepts('html, json'); - * // => "json" - * - * @param {String|Array} type(s) - * @return {String} - * @api public - */ - -req.accepts = function(){ - var accept = accepts(this); - return accept.types.apply(accept, arguments); -}; - -/** - * Check if the given `encoding`s are accepted. - * - * @param {String} ...encoding - * @return {Boolean} - * @api public - */ - -req.acceptsEncodings = function(){ - var accept = accepts(this); - return accept.encodings.apply(accept, arguments); -}; - -req.acceptsEncoding = deprecate.function(req.acceptsEncodings, - 'req.acceptsEncoding: Use acceptsEncodings instead'); - -/** - * Check if the given `charset`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...charset - * @return {Boolean} - * @api public - */ - -req.acceptsCharsets = function(){ - var accept = accepts(this); - return accept.charsets.apply(accept, arguments); -}; - -req.acceptsCharset = deprecate.function(req.acceptsCharsets, - 'req.acceptsCharset: Use acceptsCharsets instead'); - -/** - * Check if the given `lang`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...lang - * @return {Boolean} - * @api public - */ - -req.acceptsLanguages = function(){ - var accept = accepts(this); - return accept.languages.apply(accept, arguments); -}; - -req.acceptsLanguage = deprecate.function(req.acceptsLanguages, - 'req.acceptsLanguage: Use acceptsLanguages instead'); - -/** - * Parse Range header field, - * capping to the given `size`. - * - * Unspecified ranges such as "0-" require - * knowledge of your resource length. In - * the case of a byte range this is of course - * the total number of bytes. If the Range - * header field is not given `null` is returned, - * `-1` when unsatisfiable, `-2` when syntactically invalid. - * - * NOTE: remember that ranges are inclusive, so - * for example "Range: users=0-3" should respond - * with 4 users when available, not 3. - * - * @param {Number} size - * @return {Array} - * @api public - */ - -req.range = function(size){ - var range = this.get('Range'); - if (!range) return; - return parseRange(size, range); -}; - -/** - * Return the value of param `name` when present or `defaultValue`. - * - * - Checks route placeholders, ex: _/user/:id_ - * - Checks body params, ex: id=12, {"id":12} - * - Checks query string params, ex: ?id=12 - * - * To utilize request bodies, `req.body` - * should be an object. This can be done by using - * the `bodyParser()` middleware. - * - * @param {String} name - * @param {Mixed} [defaultValue] - * @return {String} - * @api public - */ - -req.param = function(name, defaultValue){ - var params = this.params || {}; - var body = this.body || {}; - var query = this.query || {}; - if (null != params[name] && params.hasOwnProperty(name)) return params[name]; - if (null != body[name]) return body[name]; - if (null != query[name]) return query[name]; - return defaultValue; -}; - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains the give mime `type`. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * req.is('html'); - * req.is('text/html'); - * req.is('text/*'); - * // => true - * - * // When Content-Type is application/json - * req.is('json'); - * req.is('application/json'); - * req.is('application/*'); - * // => true - * - * req.is('html'); - * // => false - * - * @param {String} type - * @return {Boolean} - * @api public - */ - -req.is = function(types){ - if (!Array.isArray(types)) types = [].slice.call(arguments); - return typeis(this, types); -}; - -/** - * Return the protocol string "http" or "https" - * when requested with TLS. When the "trust proxy" - * setting trusts the socket address, the - * "X-Forwarded-Proto" header field will be trusted - * and used if present. - * - * If you're running behind a reverse proxy that - * supplies https for you this may be enabled. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'protocol', function protocol(){ - var proto = this.connection.encrypted - ? 'https' - : 'http'; - var trust = this.app.get('trust proxy fn'); - - if (!trust(this.connection.remoteAddress)) { - return proto; - } - - // Note: X-Forwarded-Proto is normally only ever a - // single value, but this is to be safe. - proto = this.get('X-Forwarded-Proto') || proto; - return proto.split(/\s*,\s*/)[0]; -}); - -/** - * Short-hand for: - * - * req.protocol == 'https' - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'secure', function secure(){ - return 'https' == this.protocol; -}); - -/** - * Return the remote address from the trusted proxy. - * - * The is the remote address on the socket unless - * "trust proxy" is set. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'ip', function ip(){ - var trust = this.app.get('trust proxy fn'); - return proxyaddr(this, trust); -}); - -/** - * When "trust proxy" is set, trusted proxy addresses + client. - * - * For example if the value were "client, proxy1, proxy2" - * you would receive the array `["client", "proxy1", "proxy2"]` - * where "proxy2" is the furthest down-stream and "proxy1" and - * "proxy2" were trusted. - * - * @return {Array} - * @api public - */ - -defineGetter(req, 'ips', function ips() { - var trust = this.app.get('trust proxy fn'); - var addrs = proxyaddr.all(this, trust); - return addrs.slice(1).reverse(); -}); - -/** - * Return subdomains as an array. - * - * Subdomains are the dot-separated parts of the host before the main domain of - * the app. By default, the domain of the app is assumed to be the last two - * parts of the host. This can be changed by setting "subdomain offset". - * - * For example, if the domain is "tobi.ferrets.example.com": - * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. - * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. - * - * @return {Array} - * @api public - */ - -defineGetter(req, 'subdomains', function subdomains() { - var offset = this.app.get('subdomain offset'); - return (this.hostname || '') - .split('.') - .reverse() - .slice(offset); -}); - -/** - * Short-hand for `url.parse(req.url).pathname`. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'path', function path() { - return parse(this).pathname; -}); - -/** - * Parse the "Host" header field to a hostname. - * - * When the "trust proxy" setting trusts the socket - * address, the "X-Forwarded-Host" header field will - * be trusted. - * - * @return {String} - * @api public - */ - -defineGetter(req, 'hostname', function hostname(){ - var trust = this.app.get('trust proxy fn'); - var host = this.get('X-Forwarded-Host'); - - if (!host || !trust(this.connection.remoteAddress)) { - host = this.get('Host'); - } - - if (!host) return; - - // IPv6 literal support - var offset = host[0] === '[' - ? host.indexOf(']') + 1 - : 0; - var index = host.indexOf(':', offset); - - return ~index - ? host.substring(0, index) - : host; -}); - -// TODO: change req.host to return host in next major - -defineGetter(req, 'host', deprecate.function(function host(){ - return this.hostname; -}, 'req.host: Use req.hostname instead')); - -/** - * Check if the request is fresh, aka - * Last-Modified and/or the ETag - * still match. - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'fresh', function(){ - var method = this.method; - var s = this.res.statusCode; - - // GET or HEAD for weak freshness validation only - if ('GET' != method && 'HEAD' != method) return false; - - // 2xx or 304 as per rfc2616 14.26 - if ((s >= 200 && s < 300) || 304 == s) { - return fresh(this.headers, this.res._headers); - } - - return false; -}); - -/** - * Check if the request is stale, aka - * "Last-Modified" and / or the "ETag" for the - * resource has changed. - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'stale', function stale(){ - return !this.fresh; -}); - -/** - * Check if the request was an _XMLHttpRequest_. - * - * @return {Boolean} - * @api public - */ - -defineGetter(req, 'xhr', function xhr(){ - var val = this.get('X-Requested-With') || ''; - return 'xmlhttprequest' == val.toLowerCase(); -}); - -/** - * Helper function for creating a getter on an object. - * - * @param {Object} obj - * @param {String} name - * @param {Function} getter - * @api private - */ -function defineGetter(obj, name, getter) { - Object.defineProperty(obj, name, { - configurable: true, - enumerable: true, - get: getter - }); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/response.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/response.js deleted file mode 100644 index eff48d7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/response.js +++ /dev/null @@ -1,831 +0,0 @@ -/** - * Module dependencies. - */ - -var deprecate = require('depd')('express'); -var escapeHtml = require('escape-html'); -var http = require('http'); -var path = require('path'); -var mixin = require('utils-merge'); -var sign = require('cookie-signature').sign; -var normalizeType = require('./utils').normalizeType; -var normalizeTypes = require('./utils').normalizeTypes; -var setCharset = require('./utils').setCharset; -var contentDisposition = require('./utils').contentDisposition; -var statusCodes = http.STATUS_CODES; -var cookie = require('cookie'); -var send = require('send'); -var basename = path.basename; -var extname = path.extname; -var mime = send.mime; -var vary = require('vary'); - -/** - * Response prototype. - */ - -var res = module.exports = { - __proto__: http.ServerResponse.prototype -}; - -/** - * Set status `code`. - * - * @param {Number} code - * @return {ServerResponse} - * @api public - */ - -res.status = function(code){ - this.statusCode = code; - return this; -}; - -/** - * Set Link header field with the given `links`. - * - * Examples: - * - * res.links({ - * next: 'http://api.example.com/users?page=2', - * last: 'http://api.example.com/users?page=5' - * }); - * - * @param {Object} links - * @return {ServerResponse} - * @api public - */ - -res.links = function(links){ - var link = this.get('Link') || ''; - if (link) link += ', '; - return this.set('Link', link + Object.keys(links).map(function(rel){ - return '<' + links[rel] + '>; rel="' + rel + '"'; - }).join(', ')); -}; - -/** - * Send a response. - * - * Examples: - * - * res.send(new Buffer('wahoo')); - * res.send({ some: 'json' }); - * res.send('

some html

'); - * - * @param {string|number|boolean|object|Buffer} body - * @api public - */ - -res.send = function send(body) { - var chunk = body; - var encoding; - var len; - var req = this.req; - var type; - - // settings - var app = this.app; - - // allow status / body - if (arguments.length === 2) { - // res.send(body, status) backwards compat - if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') { - deprecate('res.send(body, status): Use res.status(status).send(body) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.send(status, body): Use res.status(status).send(body) instead'); - this.statusCode = arguments[0]; - chunk = arguments[1]; - } - } - - // disambiguate res.send(status) and res.send(status, num) - if (typeof chunk === 'number' && arguments.length === 1) { - // res.send(status) will set status message as text string - if (!this.get('Content-Type')) { - this.type('txt'); - } - - deprecate('res.send(status): Use res.status(status).end() instead'); - this.statusCode = chunk; - chunk = http.STATUS_CODES[chunk]; - } - - switch (typeof chunk) { - // string defaulting to html - case 'string': - if (!this.get('Content-Type')) { - this.type('html'); - } - break; - case 'boolean': - case 'number': - case 'object': - if (chunk === null) { - chunk = ''; - } else if (Buffer.isBuffer(chunk)) { - if (!this.get('Content-Type')) { - this.type('bin'); - } - } else { - return this.json(chunk); - } - break; - } - - // write strings in utf-8 - if (typeof chunk === 'string') { - encoding = 'utf8'; - type = this.get('Content-Type'); - - // reflect this in content-type - if (typeof type === 'string') { - this.set('Content-Type', setCharset(type, 'utf-8')); - } - } - - // populate Content-Length - if (chunk !== undefined) { - if (!Buffer.isBuffer(chunk)) { - // convert chunk to Buffer; saves later double conversions - chunk = new Buffer(chunk, encoding); - encoding = undefined; - } - - len = chunk.length; - this.set('Content-Length', len); - } - - // method check - var isHead = req.method === 'HEAD'; - - // ETag support - if (len !== undefined && (isHead || req.method === 'GET')) { - var etag = app.get('etag fn'); - if (etag && !this.get('ETag')) { - etag = etag(chunk, encoding); - etag && this.set('ETag', etag); - } - } - - // freshness - if (req.fresh) this.statusCode = 304; - - // strip irrelevant headers - if (204 == this.statusCode || 304 == this.statusCode) { - this.removeHeader('Content-Type'); - this.removeHeader('Content-Length'); - this.removeHeader('Transfer-Encoding'); - chunk = ''; - } - - // skip body for HEAD - if (isHead) { - this.end(); - } - - // respond - this.end(chunk, encoding); - - return this; -}; - -/** - * Send JSON response. - * - * Examples: - * - * res.json(null); - * res.json({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @api public - */ - -res.json = function json(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.json(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.json(status, obj): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(val, replacer, spaces); - - // content-type - if (!this.get('Content-Type')) { - this.set('Content-Type', 'application/json'); - } - - return this.send(body); -}; - -/** - * Send JSON response with JSONP callback support. - * - * Examples: - * - * res.jsonp(null); - * res.jsonp({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @api public - */ - -res.jsonp = function jsonp(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.jsonp(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(val, replacer, spaces); - var callback = this.req.query[app.get('jsonp callback name')]; - - // content-type - if (!this.get('Content-Type')) { - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'application/json'); - } - - // fixup callback - if (Array.isArray(callback)) { - callback = callback[0]; - } - - // jsonp - if (typeof callback === 'string' && callback.length !== 0) { - this.charset = 'utf-8'; - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'text/javascript'); - - // restrict callback charset - callback = callback.replace(/[^\[\]\w$.]/g, ''); - - // replace chars not allowed in JavaScript that are in JSON - body = body - .replace(/\u2028/g, '\\u2028') - .replace(/\u2029/g, '\\u2029'); - - // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse" - // the typeof check is just to reduce client error noise - body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');'; - } - - return this.send(body); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `fn(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.sentHeader` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 (can be string converted by `ms`) - * - `root` root directory for relative filenames - * - `headers` object of headers to serve with file - * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them - * - * Other options are passed along to `send`. - * - * Examples: - * - * The following example illustrates how `res.sendfile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendfile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendfile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @api public - */ - -res.sendfile = function(path, options, fn){ - options = options || {}; - var self = this; - var req = self.req; - var next = this.req.next; - var done; - - - // support function as second arg - if ('function' == typeof options) { - fn = options; - options = {}; - } - - // socket errors - req.socket.on('error', error); - - // errors - function error(err) { - if (done) return; - done = true; - - // clean up - cleanup(); - - // callback available - if (fn) return fn(err); - - // delegate - next(err); - } - - // streaming - function stream(stream) { - if (done) return; - cleanup(); - if (fn) stream.on('end', fn); - } - - // cleanup - function cleanup() { - req.socket.removeListener('error', error); - } - - // transfer - var file = send(req, path, options); - file.on('error', error); - file.on('directory', next); - file.on('stream', stream); - - if (options.headers) { - // set headers on successful transfer - file.on('headers', function headers(res) { - var obj = options.headers; - var keys = Object.keys(obj); - - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - res.setHeader(k, obj[k]); - } - }); - } - - // pipe - file.pipe(this); - this.on('finish', cleanup); -}; - -/** - * Transfer the file at the given `path` as an attachment. - * - * Optionally providing an alternate attachment `filename`, - * and optional callback `fn(err)`. The callback is invoked - * when the data transfer is complete, or when an error has - * ocurred. Be sure to check `res.headersSent` if you plan to respond. - * - * This method uses `res.sendfile()`. - * - * @api public - */ - -res.download = function(path, filename, fn){ - // support function as second arg - if ('function' == typeof filename) { - fn = filename; - filename = null; - } - - filename = filename || path; - - // set Content-Disposition when file is sent - var headers = { - 'Content-Disposition': contentDisposition(filename) - }; - - return this.sendfile(path, { headers: headers }, fn); -}; - -/** - * Set _Content-Type_ response header with `type` through `mime.lookup()` - * when it does not contain "/", or set the Content-Type to `type` otherwise. - * - * Examples: - * - * res.type('.html'); - * res.type('html'); - * res.type('json'); - * res.type('application/json'); - * res.type('png'); - * - * @param {String} type - * @return {ServerResponse} for chaining - * @api public - */ - -res.contentType = -res.type = function(type){ - return this.set('Content-Type', ~type.indexOf('/') - ? type - : mime.lookup(type)); -}; - -/** - * Respond to the Acceptable formats using an `obj` - * of mime-type callbacks. - * - * This method uses `req.accepted`, an array of - * acceptable types ordered by their quality values. - * When "Accept" is not present the _first_ callback - * is invoked, otherwise the first match is used. When - * no match is performed the server responds with - * 406 "Not Acceptable". - * - * Content-Type is set for you, however if you choose - * you may alter this within the callback using `res.type()` - * or `res.set('Content-Type', ...)`. - * - * res.format({ - * 'text/plain': function(){ - * res.send('hey'); - * }, - * - * 'text/html': function(){ - * res.send('

hey

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

hey

'); - * }, - * - * json: function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * By default Express passes an `Error` - * with a `.status` of 406 to `next(err)` - * if a match is not made. If you provide - * a `.default` callback it will be invoked - * instead. - * - * @param {Object} obj - * @return {ServerResponse} for chaining - * @api public - */ - -res.format = function(obj){ - var req = this.req; - var next = req.next; - - var fn = obj.default; - if (fn) delete obj.default; - var keys = Object.keys(obj); - - var key = req.accepts(keys); - - this.vary("Accept"); - - if (key) { - this.set('Content-Type', normalizeType(key).value); - obj[key](req, this, next); - } else if (fn) { - fn(); - } else { - var err = new Error('Not Acceptable'); - err.status = 406; - err.types = normalizeTypes(keys).map(function(o){ return o.value }); - next(err); - } - - return this; -}; - -/** - * Set _Content-Disposition_ header to _attachment_ with optional `filename`. - * - * @param {String} filename - * @return {ServerResponse} - * @api public - */ - -res.attachment = function(filename){ - if (filename) this.type(extname(filename)); - this.set('Content-Disposition', contentDisposition(filename)); - return this; -}; - -/** - * Set header `field` to `val`, or pass - * an object of header fields. - * - * Examples: - * - * res.set('Foo', ['bar', 'baz']); - * res.set('Accept', 'application/json'); - * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); - * - * Aliased as `res.header()`. - * - * @param {String|Object|Array} field - * @param {String} val - * @return {ServerResponse} for chaining - * @api public - */ - -res.set = -res.header = function header(field, val) { - if (arguments.length === 2) { - if (Array.isArray(val)) val = val.map(String); - else val = String(val); - if ('content-type' == field.toLowerCase() && !/;\s*charset\s*=/.test(val)) { - var charset = mime.charsets.lookup(val.split(';')[0]); - if (charset) val += '; charset=' + charset.toLowerCase(); - } - this.setHeader(field, val); - } else { - for (var key in field) { - this.set(key, field[key]); - } - } - return this; -}; - -/** - * Get value for header `field`. - * - * @param {String} field - * @return {String} - * @api public - */ - -res.get = function(field){ - return this.getHeader(field); -}; - -/** - * Clear cookie `name`. - * - * @param {String} name - * @param {Object} options - * @return {ServerResponse} for chaining - * @api public - */ - -res.clearCookie = function(name, options){ - var opts = { expires: new Date(1), path: '/' }; - return this.cookie(name, '', options - ? mixin(opts, options) - : opts); -}; - -/** - * Set cookie `name` to `val`, with the given `options`. - * - * Options: - * - * - `maxAge` max-age in milliseconds, converted to `expires` - * - `signed` sign the cookie - * - `path` defaults to "/" - * - * Examples: - * - * // "Remember Me" for 15 minutes - * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); - * - * // save as above - * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) - * - * @param {String} name - * @param {String|Object} val - * @param {Options} options - * @return {ServerResponse} for chaining - * @api public - */ - -res.cookie = function(name, val, options){ - options = mixin({}, options); - var secret = this.req.secret; - var signed = options.signed; - if (signed && !secret) throw new Error('cookieParser("secret") required for signed cookies'); - if ('number' == typeof val) val = val.toString(); - if ('object' == typeof val) val = 'j:' + JSON.stringify(val); - if (signed) val = 's:' + sign(val, secret); - if ('maxAge' in options) { - options.expires = new Date(Date.now() + options.maxAge); - options.maxAge /= 1000; - } - if (null == options.path) options.path = '/'; - var headerVal = cookie.serialize(name, String(val), options); - - // supports multiple 'res.cookie' calls by getting previous value - var prev = this.get('Set-Cookie'); - if (prev) { - if (Array.isArray(prev)) { - headerVal = prev.concat(headerVal); - } else { - headerVal = [prev, headerVal]; - } - } - this.set('Set-Cookie', headerVal); - return this; -}; - - -/** - * Set the location header to `url`. - * - * The given `url` can also be "back", which redirects - * to the _Referrer_ or _Referer_ headers or "/". - * - * Examples: - * - * res.location('/foo/bar').; - * res.location('http://example.com'); - * res.location('../login'); - * - * @param {String} url - * @return {ServerResponse} for chaining - * @api public - */ - -res.location = function(url){ - var req = this.req; - - // "back" is an alias for the referrer - if ('back' == url) url = req.get('Referrer') || '/'; - - // Respond - this.set('Location', url); - return this; -}; - -/** - * Redirect to the given `url` with optional response `status` - * defaulting to 302. - * - * The resulting `url` is determined by `res.location()`, so - * it will play nicely with mounted apps, relative paths, - * `"back"` etc. - * - * Examples: - * - * res.redirect('/foo/bar'); - * res.redirect('http://example.com'); - * res.redirect(301, 'http://example.com'); - * res.redirect('../login'); // /blog/post/1 -> /blog/login - * - * @api public - */ - -res.redirect = function redirect(url) { - var address = url; - var body; - var status = 302; - - // allow status / url - if (arguments.length === 2) { - if (typeof arguments[0] === 'number') { - status = arguments[0]; - address = arguments[1]; - } else { - deprecate('res.redirect(ur, status): Use res.redirect(status, url) instead'); - status = arguments[1]; - } - } - - // Set location header - this.location(address); - address = this.get('Location'); - - // Support text/{plain,html} by default - this.format({ - text: function(){ - body = statusCodes[status] + '. Redirecting to ' + encodeURI(url); - }, - - html: function(){ - var u = escapeHtml(url); - body = '

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

'; - }, - - default: function(){ - body = ''; - } - }); - - // Respond - this.statusCode = status; - this.set('Content-Length', Buffer.byteLength(body)); - - if (this.req.method === 'HEAD') { - this.end(); - } - - this.end(body); -}; - -/** - * Add `field` to Vary. If already present in the Vary set, then - * this call is simply ignored. - * - * @param {Array|String} field - * @return {ServerResponse} for chaining - * @api public - */ - -res.vary = function(field){ - // checks for back-compat - if (!field || (Array.isArray(field) && !field.length)) { - deprecate('res.vary(): Provide a field name'); - return this; - } - - vary(this, field); - - return this; -}; - -/** - * Render `view` with the given `options` and optional callback `fn`. - * When a callback function is given a response will _not_ be made - * automatically, otherwise a response of _200_ and _text/html_ is given. - * - * Options: - * - * - `cache` boolean hinting to the engine it should cache - * - `filename` filename of the view being rendered - * - * @api public - */ - -res.render = function(view, options, fn){ - options = options || {}; - var self = this; - var req = this.req; - var app = req.app; - - // support callback function as second arg - if ('function' == typeof options) { - fn = options, options = {}; - } - - // merge res.locals - options._locals = self.locals; - - // default callback to respond - fn = fn || function(err, str){ - if (err) return req.next(err); - self.send(str); - }; - - // render - app.render(view, options, fn); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/index.js deleted file mode 100644 index 4e63eb1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/index.js +++ /dev/null @@ -1,548 +0,0 @@ -/** - * Module dependencies. - */ - -var Route = require('./route'); -var Layer = require('./layer'); -var methods = require('methods'); -var mixin = require('utils-merge'); -var debug = require('debug')('express:router'); -var parseUrl = require('parseurl'); -var slice = Array.prototype.slice; -var toString = Object.prototype.toString; -var utils = require('../utils'); - -/** - * Initialize a new `Router` with the given `options`. - * - * @param {Object} options - * @return {Router} which is an callable function - * @api public - */ - -var proto = module.exports = function(options) { - options = options || {}; - - function router(req, res, next) { - router.handle(req, res, next); - } - - // mixin Router class functions - router.__proto__ = proto; - - router.params = {}; - router._params = []; - router.caseSensitive = options.caseSensitive; - router.mergeParams = options.mergeParams; - router.strict = options.strict; - router.stack = []; - - return router; -}; - -/** - * Map the given param placeholder `name`(s) to the given callback. - * - * Parameter mapping is used to provide pre-conditions to routes - * which use normalized placeholders. For example a _:user_id_ parameter - * could automatically load a user's information from the database without - * any additional code, - * - * The callback uses the same signature as middleware, the only difference - * being that the value of the placeholder is passed, in this case the _id_ - * of the user. Once the `next()` function is invoked, just like middleware - * it will continue on to execute the route, or subsequent parameter functions. - * - * Just like in middleware, you must either respond to the request or call next - * to avoid stalling the request. - * - * app.param('user_id', function(req, res, next, id){ - * User.find(id, function(err, user){ - * if (err) { - * return next(err); - * } else if (!user) { - * return next(new Error('failed to load user')); - * } - * req.user = user; - * next(); - * }); - * }); - * - * @param {String} name - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -proto.param = function(name, fn){ - // param logic - if ('function' == typeof name) { - this._params.push(name); - return; - } - - // apply param functions - var params = this._params; - var len = params.length; - var ret; - - if (name[0] === ':') { - name = name.substr(1); - } - - 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; -}; - -/** - * Dispatch a req, res into the router. - * - * @api private - */ - -proto.handle = function(req, res, done) { - var self = this; - - debug('dispatching %s %s', req.method, req.url); - - var search = 1 + req.url.indexOf('?'); - var pathlength = search ? search - 1 : req.url.length; - var fqdn = 1 + req.url.substr(0, pathlength).indexOf('://'); - var protohost = fqdn ? req.url.substr(0, req.url.indexOf('/', 2 + fqdn)) : ''; - var idx = 0; - var removed = ''; - var slashAdded = false; - var paramcalled = {}; - - // store options for OPTIONS request - // only used if OPTIONS request - var options = []; - - // middleware and routes - var stack = self.stack; - - // manage inter-router variables - var parentParams = req.params; - var parentUrl = req.baseUrl || ''; - done = restore(done, req, 'baseUrl', 'next', 'params'); - - // setup next layer - req.next = next; - - // for options requests, respond with a default if nothing else responds - if (req.method === 'OPTIONS') { - done = wrap(done, function(old, err) { - if (err || options.length === 0) return old(err); - - var body = options.join(','); - return res.set('Allow', body).send(body); - }); - } - - // setup basic req values - req.baseUrl = parentUrl; - req.originalUrl = req.originalUrl || req.url; - - next(); - - function next(err) { - var layerError = err === 'route' - ? null - : err; - - var layer = stack[idx++]; - - if (slashAdded) { - req.url = req.url.substr(1); - slashAdded = false; - } - - if (removed.length !== 0) { - req.baseUrl = parentUrl; - req.url = protohost + removed + req.url.substr(protohost.length); - removed = ''; - } - - if (!layer) { - return done(layerError); - } - - self.match_layer(layer, req, res, function (err, path) { - if (err || path === undefined) { - return next(layerError || err); - } - - // route object and not middleware - var route = layer.route; - - // if final route, then we support options - if (route) { - // we don't run any routes with error first - if (layerError) { - return next(layerError); - } - - var method = req.method; - var has_method = route._handles_method(method); - - // build up automatic options response - if (!has_method && method === 'OPTIONS') { - options.push.apply(options, route._options()); - } - - // don't even bother - if (!has_method && method !== 'HEAD') { - return next(); - } - - // we can now dispatch to the route - req.route = route; - } - - // Capture one-time layer values - req.params = self.mergeParams - ? mergeParams(layer.params, parentParams) - : layer.params; - var layerPath = layer.path; - - // this should be done for the layer - self.process_params(layer, paramcalled, req, res, function (err) { - if (err) { - return next(layerError || err); - } - - if (route) { - return layer.handle_request(req, res, next); - } - - trim_prefix(layer, layerError, layerPath, path); - }); - }); - } - - function trim_prefix(layer, layerError, layerPath, path) { - var c = path[layerPath.length]; - if (c && '/' !== c && '.' !== c) return next(layerError); - - // Trim off the part of the url that matches the route - // middleware (.use stuff) needs to have the path stripped - if (layerPath.length !== 0) { - debug('trim prefix (%s) from url %s', layerPath, req.url); - removed = layerPath; - req.url = protohost + req.url.substr(protohost.length + removed.length); - - // Ensure leading slash - if (!fqdn && req.url[0] !== '/') { - req.url = '/' + req.url; - slashAdded = true; - } - - // Setup base URL (no trailing slash) - req.baseUrl = parentUrl + (removed[removed.length - 1] === '/' - ? removed.substring(0, removed.length - 1) - : removed); - } - - debug('%s %s : %s', layer.name, layerPath, req.originalUrl); - - if (layerError) { - layer.handle_error(layerError, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Match request to a layer. - * - * @api private - */ - -proto.match_layer = function match_layer(layer, req, res, done) { - var error = null; - var path; - - try { - path = parseUrl(req).pathname; - - if (!layer.match(path)) { - path = undefined; - } - } catch (err) { - error = err; - } - - done(error, path); -}; - -/** - * Process any parameters for the layer. - * - * @api private - */ - -proto.process_params = function(layer, called, req, res, done) { - var params = this.params; - - // captured parameters from the layer, keys and values - var keys = layer.keys; - - // fast track - if (!keys || keys.length === 0) { - return done(); - } - - var i = 0; - var name; - var paramIndex = 0; - var key; - var paramVal; - var paramCallbacks; - var paramCalled; - - // process params in order - // param callbacks can be async - function param(err) { - if (err) { - return done(err); - } - - if (i >= keys.length ) { - return done(); - } - - paramIndex = 0; - key = keys[i++]; - - if (!key) { - return done(); - } - - name = key.name; - paramVal = req.params[name]; - paramCallbacks = params[name]; - paramCalled = called[name]; - - if (paramVal === undefined || !paramCallbacks) { - return param(); - } - - // param previously called with same value or error occurred - if (paramCalled && (paramCalled.error || paramCalled.match === paramVal)) { - // restore value - req.params[name] = paramCalled.value; - - // next param - return param(paramCalled.error); - } - - called[name] = paramCalled = { - error: null, - match: paramVal, - value: paramVal - }; - - paramCallback(); - } - - // single param callbacks - function paramCallback(err) { - var fn = paramCallbacks[paramIndex++]; - - // store updated value - paramCalled.value = req.params[key.name]; - - if (err) { - // store error - paramCalled.error = err; - param(err); - return; - } - - if (!fn) return param(); - - try { - fn(req, res, paramCallback, paramVal, key.name); - } catch (e) { - paramCallback(e); - } - } - - param(); -}; - -/** - * Use the given middleware function, with optional path, defaulting to "/". - * - * Use (like `.all`) will run for any http METHOD, but it will not add - * handlers for those methods so OPTIONS requests will not consider `.use` - * functions even if they could respond. - * - * The other difference is that _route_ path is stripped and not visible - * to the handler function. The main effect of this feature is that mounted - * handlers can operate without any code changes regardless of the "prefix" - * pathname. - * - * @api public - */ - -proto.use = function use(fn) { - var offset = 0; - var path = '/'; - var self = this; - - // default path to '/' - if (typeof fn !== 'function') { - offset = 1; - path = fn; - } - - var callbacks = utils.flatten(slice.call(arguments, offset)); - - if (callbacks.length === 0) { - throw new TypeError('Router.use() requires callback function'); - } - - callbacks.forEach(function (fn) { - if (typeof fn !== 'function') { - var type = toString.call(fn); - var msg = 'Router.use() requires callback function but got a ' + type; - throw new TypeError(msg); - } - - // add the middleware - debug('use %s %s', path, fn.name || ''); - - var layer = new Layer(path, { - sensitive: self.caseSensitive, - strict: false, - end: false - }, fn); - - layer.route = undefined; - - self.stack.push(layer); - }); - - return this; -}; - -/** - * Create a new Route for the given path. - * - * Each route contains a separate middleware stack and VERB handlers. - * - * See the Route api documentation for details on adding handlers - * and middleware to routes. - * - * @param {String} path - * @return {Route} - * @api public - */ - -proto.route = function(path){ - var route = new Route(path); - - var layer = new Layer(path, { - sensitive: this.caseSensitive, - strict: this.strict, - end: true - }, route.dispatch.bind(route)); - - layer.route = route; - - this.stack.push(layer); - return route; -}; - -// create Router#VERB functions -methods.concat('all').forEach(function(method){ - proto[method] = function(path){ - var route = this.route(path) - route[method].apply(route, slice.call(arguments, 1)); - return this; - }; -}); - -// merge params with parent params -function mergeParams(params, parent) { - if (typeof parent !== 'object' || !parent) { - return params; - } - - // make copy of parent for base - var obj = mixin({}, parent); - - // simple non-numeric merging - if (!(0 in params) || !(0 in parent)) { - return mixin(obj, params); - } - - var i = 0; - var o = 0; - - // determine numeric gaps - while (i === o || o in parent) { - if (i in params) i++; - if (o in parent) o++; - } - - // offset numeric indices in params before merge - for (i--; i >= 0; i--) { - params[i + o] = params[i]; - - // create holes for the merge when necessary - if (i < o) { - delete params[i]; - } - } - - return mixin(parent, params); -} - -// restore obj props after function -function restore(fn, obj) { - var props = new Array(arguments.length - 2); - var vals = new Array(arguments.length - 2); - - for (var i = 0; i < props.length; i++) { - props[i] = arguments[i + 2]; - vals[i] = obj[props[i]]; - } - - return function(err){ - // restore vals - for (var i = 0; i < props.length; i++) { - obj[props[i]] = vals[i]; - } - - return fn.apply(this, arguments); - }; -} - -// wrap a function -function wrap(old, fn) { - return function proxy() { - var args = new Array(arguments.length + 1); - - args[0] = old; - for (var i = 0, len = arguments.length; i < len; i++) { - args[i + 1] = arguments[i]; - } - - fn.apply(this, args); - }; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/layer.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/layer.js deleted file mode 100644 index e292a13..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/layer.js +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Module dependencies. - */ - -var pathRegexp = require('path-to-regexp'); -var debug = require('debug')('express:router:layer'); - -/** - * Expose `Layer`. - */ - -module.exports = Layer; - -function Layer(path, options, fn) { - if (!(this instanceof Layer)) { - return new Layer(path, options, fn); - } - - debug('new %s', path); - options = options || {}; - - this.handle = fn; - this.name = fn.name || ''; - this.params = undefined; - this.path = undefined; - this.regexp = pathRegexp(path, this.keys = [], options); - - if (path === '/' && options.end === false) { - this.regexp.fast_slash = true; - } -} - -/** - * Handle the error for the layer. - * - * @param {Error} error - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_error = function handle_error(error, req, res, next) { - var fn = this.handle; - - if (fn.length !== 4) { - // not a standard error handler - return next(error); - } - - try { - fn(error, req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Handle the request for the layer. - * - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_request = function handle(req, res, next) { - var fn = this.handle; - - if (fn.length > 3) { - // not a standard request handler - return next(); - } - - try { - fn(req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Check if this route matches `path`, if so - * populate `.params`. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -Layer.prototype.match = function match(path) { - if (this.regexp.fast_slash) { - // fast path non-ending match for / (everything matches) - this.params = {}; - this.path = ''; - return true; - } - - var m = this.regexp.exec(path); - - if (!m) { - this.params = undefined; - this.path = undefined; - return false; - } - - // store values - this.params = {}; - this.path = m[0]; - - var keys = this.keys; - var params = this.params; - var n = 0; - var key; - var val; - - for (var i = 1, len = m.length; i < len; ++i) { - key = keys[i - 1]; - val = decode_param(m[i]); - - if (key) { - params[key.name] = val; - } else { - params[n++] = val; - } - } - - return true; -}; - -/** - * Decode param value. - * - * @param {string} val - * @return {string} - * @api private - */ - -function decode_param(val){ - if (typeof val !== 'string') { - return val; - } - - try { - return decodeURIComponent(val); - } catch (e) { - var err = new TypeError("Failed to decode param '" + val + "'"); - err.status = 400; - throw err; - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/match.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/match.js deleted file mode 100644 index ce308c4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/match.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Module dependencies. - */ - -var pathRegexp = require('path-to-regexp'); - -/** - * Expose `Layer`. - */ - -module.exports = Match; - -function Match(layer, path, params) { - this.layer = layer; - this.params = {}; - this.path = path || ''; - - if (!params) { - return this; - } - - var keys = layer.keys; - var n = 0; - var prop; - var key; - var val; - - for (var i = 0; i < params.length; i++) { - key = keys[i]; - val = decode_param(params[i]); - prop = key - ? key.name - : n++; - - this.params[prop] = val; - } - - return this; -}; - -/** - * Decode param value. - * - * @param {string} val - * @return {string} - * @api private - */ - -function decode_param(val){ - if (typeof val !== 'string') { - return val; - } - - try { - return decodeURIComponent(val); - } catch (e) { - var err = new TypeError("Failed to decode param '" + val + "'"); - err.status = 400; - throw err; - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/route.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/route.js deleted file mode 100644 index 6b39211..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/router/route.js +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Module dependencies. - */ - -var debug = require('debug')('express:router:route'); -var Layer = require('./layer'); -var methods = require('methods'); -var utils = require('../utils'); - -/** - * Expose `Route`. - */ - -module.exports = Route; - -/** - * Initialize `Route` with the given `path`, - * - * @param {String} path - * @api private - */ - -function Route(path) { - debug('new %s', path); - this.path = path; - this.stack = []; - - // route handlers for various http methods - this.methods = {}; -} - -/** - * @api private - */ - -Route.prototype._handles_method = function _handles_method(method) { - if (this.methods._all) { - return true; - } - - method = method.toLowerCase(); - - if (method === 'head' && !this.methods['head']) { - method = 'get'; - } - - return Boolean(this.methods[method]); -}; - -/** - * @return {Array} supported HTTP methods - * @api private - */ - -Route.prototype._options = function(){ - return Object.keys(this.methods).map(function(method) { - return method.toUpperCase(); - }); -}; - -/** - * dispatch req, res into this route - * - * @api private - */ - -Route.prototype.dispatch = function(req, res, done){ - var idx = 0; - var stack = this.stack; - if (stack.length === 0) { - return done(); - } - - var method = req.method.toLowerCase(); - if (method === 'head' && !this.methods['head']) { - method = 'get'; - } - - req.route = this; - - next(); - - function next(err) { - if (err && err === 'route') { - return done(); - } - - var layer = stack[idx++]; - if (!layer) { - return done(err); - } - - if (layer.method && layer.method !== method) { - return next(err); - } - - if (err) { - layer.handle_error(err, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Add a handler for all HTTP verbs to this route. - * - * Behaves just like middleware and can respond or call `next` - * to continue processing. - * - * You can use multiple `.all` call to add multiple handlers. - * - * function check_something(req, res, next){ - * next(); - * }; - * - * function validate_user(req, res, next){ - * next(); - * }; - * - * route - * .all(validate_user) - * .all(check_something) - * .get(function(req, res, next){ - * res.send('hello world'); - * }); - * - * @param {function} handler - * @return {Route} for chaining - * @api public - */ - -Route.prototype.all = function(){ - var self = this; - var callbacks = utils.flatten([].slice.call(arguments)); - callbacks.forEach(function(fn) { - if (typeof fn !== 'function') { - var type = {}.toString.call(fn); - var msg = 'Route.all() requires callback functions but got a ' + type; - throw new Error(msg); - } - - var layer = Layer('/', {}, fn); - layer.method = undefined; - - self.methods._all = true; - self.stack.push(layer); - }); - - return self; -}; - -methods.forEach(function(method){ - Route.prototype[method] = function(){ - var self = this; - var callbacks = utils.flatten([].slice.call(arguments)); - - callbacks.forEach(function(fn) { - if (typeof fn !== 'function') { - var type = {}.toString.call(fn); - var msg = 'Route.' + method + '() requires callback functions but got a ' + type; - throw new Error(msg); - } - - debug('%s %s', method, self.path); - - var layer = Layer('/', {}, fn); - layer.method = method; - - self.methods[method] = true; - self.stack.push(layer); - }); - return self; - }; -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/utils.js deleted file mode 100644 index 9f9fdfd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/utils.js +++ /dev/null @@ -1,302 +0,0 @@ -/** - * Module dependencies. - */ - -var mime = require('send').mime; -var crc32 = require('buffer-crc32'); -var crypto = require('crypto'); -var basename = require('path').basename; -var proxyaddr = require('proxy-addr'); -var qs = require('qs'); -var querystring = require('querystring'); -var typer = require('media-typer'); - -/** - * Return strong ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.etag = function etag(body, encoding){ - if (body.length === 0) { - // fast-path empty body - return '"1B2M2Y8AsgTpgAmY7PhCfg=="' - } - - var hash = crypto - .createHash('md5') - .update(body, encoding) - .digest('base64') - return '"' + hash + '"' -}; - -/** - * Return weak ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.wetag = function wetag(body, encoding){ - if (body.length === 0) { - // fast-path empty body - return 'W/"0-0"' - } - - var buf = Buffer.isBuffer(body) - ? body - : new Buffer(body, encoding) - var len = buf.length - return 'W/"' + len.toString(16) + '-' + crc32.unsigned(buf) + '"' -}; - -/** - * 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; - if ('\\\\' == path.substring(0, 2)) return true; // Microsoft Azure absolute path -}; - -/** - * Flatten the given `arr`. - * - * @param {Array} arr - * @return {Array} - * @api private - */ - -exports.flatten = function(arr, ret){ - ret = ret || []; - var len = arr.length; - for (var i = 0; i < len; ++i) { - if (Array.isArray(arr[i])) { - exports.flatten(arr[i], ret); - } else { - ret.push(arr[i]); - } - } - return ret; -}; - -/** - * Normalize the given `type`, for example "html" becomes "text/html". - * - * @param {String} type - * @return {Object} - * @api private - */ - -exports.normalizeType = function(type){ - return ~type.indexOf('/') - ? acceptParams(type) - : { value: mime.lookup(type), params: {} }; -}; - -/** - * Normalize `types`, for example "html" becomes "text/html". - * - * @param {Array} types - * @return {Array} - * @api private - */ - -exports.normalizeTypes = function(types){ - var ret = []; - - for (var i = 0; i < types.length; ++i) { - ret.push(exports.normalizeType(types[i])); - } - - return ret; -}; - -/** - * Generate Content-Disposition header appropriate for the filename. - * non-ascii filenames are urlencoded and a filename* parameter is added - * - * @param {String} filename - * @return {String} - * @api private - */ - -exports.contentDisposition = function(filename){ - var ret = 'attachment'; - if (filename) { - filename = basename(filename); - // if filename contains non-ascii characters, add a utf-8 version ala RFC 5987 - ret = /[^\040-\176]/.test(filename) - ? 'attachment; filename="' + encodeURI(filename) + '"; filename*=UTF-8\'\'' + encodeURI(filename) - : 'attachment; filename="' + filename + '"'; - } - - return ret; -}; - -/** - * Parse accept params `str` returning an - * object with `.value`, `.quality` and `.params`. - * also includes `.originalIndex` for stable sorting - * - * @param {String} str - * @return {Object} - * @api private - */ - -function acceptParams(str, index) { - var parts = str.split(/ *; */); - var ret = { value: parts[0], quality: 1, params: {}, originalIndex: index }; - - for (var i = 1; i < parts.length; ++i) { - var pms = parts[i].split(/ *= */); - if ('q' == pms[0]) { - ret.quality = parseFloat(pms[1]); - } else { - ret.params[pms[0]] = pms[1]; - } - } - - return ret; -} - -/** - * Compile "etag" value to function. - * - * @param {Boolean|String|Function} val - * @return {Function} - * @api private - */ - -exports.compileETag = function(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = exports.wetag; - break; - case false: - break; - case 'strong': - fn = exports.etag; - break; - case 'weak': - fn = exports.wetag; - break; - default: - throw new TypeError('unknown value for etag function: ' + val); - } - - return fn; -} - -/** - * Compile "query parser" value to function. - * - * @param {String|Function} val - * @return {Function} - * @api private - */ - -exports.compileQueryParser = function compileQueryParser(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = querystring.parse; - break; - case false: - fn = newObject; - break; - case 'extended': - fn = qs.parse; - break; - case 'simple': - fn = querystring.parse; - break; - default: - throw new TypeError('unknown value for query parser function: ' + val); - } - - return fn; -} - -/** - * Compile "proxy trust" value to function. - * - * @param {Boolean|String|Number|Array|Function} val - * @return {Function} - * @api private - */ - -exports.compileTrust = function(val) { - if (typeof val === 'function') return val; - - if (val === true) { - // Support plain true/false - return function(){ return true }; - } - - if (typeof val === 'number') { - // Support trusting hop count - return function(a, i){ return i < val }; - } - - if (typeof val === 'string') { - // Support comma-separated values - val = val.split(/ *, */); - } - - return proxyaddr.compile(val || []); -} - -/** - * Set the charset in a given Content-Type string. - * - * @param {String} type - * @param {String} charset - * @return {String} - * @api private - */ - -exports.setCharset = function(type, charset){ - if (!type || !charset) return type; - - // parse type - var parsed = typer.parse(type); - - // set charset - parsed.parameters.charset = charset; - - // format type - return typer.format(parsed); -}; - -/** - * Return new empty objet. - * - * @return {Object} - * @api private - */ - -function newObject() { - return {}; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/view.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/view.js deleted file mode 100644 index 989e8bb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/lib/view.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Module dependencies. - */ - -var path = require('path'); -var fs = require('fs'); -var utils = require('./utils'); -var dirname = path.dirname; -var basename = path.basename; -var extname = path.extname; -var exists = fs.existsSync || path.existsSync; -var join = path.join; - -/** - * Expose `View`. - */ - -module.exports = View; - -/** - * Initialize a new `View` with the given `name`. - * - * Options: - * - * - `defaultEngine` the default template engine name - * - `engines` template engine require() cache - * - `root` root path for view lookup - * - * @param {String} name - * @param {Object} options - * @api private - */ - -function View(name, options) { - options = options || {}; - this.name = name; - this.root = options.root; - var engines = options.engines; - this.defaultEngine = options.defaultEngine; - var ext = this.ext = extname(name); - if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no extension was provided.'); - if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') + this.defaultEngine); - this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express); - this.path = this.lookup(name); -} - -/** - * Lookup view by the given `path` - * - * @param {String} path - * @return {String} - * @api private - */ - -View.prototype.lookup = function(path){ - var ext = this.ext; - - // . - if (!utils.isAbsolute(path)) path = join(this.root, path); - if (exists(path)) return path; - - // /index. - path = join(dirname(path), basename(path, ext), 'index' + ext); - if (exists(path)) return path; -}; - -/** - * Render with the given `options` and callback `fn(err, str)`. - * - * @param {Object} options - * @param {Function} fn - * @api private - */ - -View.prototype.render = function(options, fn){ - this.engine(this.path, options, fn); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/History.md deleted file mode 100644 index 6403131..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/History.md +++ /dev/null @@ -1,42 +0,0 @@ -1.0.7 / 2014-07-04 -================== - - * Fix wrong type returned from `type` when match after unknown extension - -1.0.6 / 2014-06-24 -================== - - * deps: negotiator@0.4.7 - -1.0.5 / 2014-06-20 -================== - - * fix crash when unknown extension given - -1.0.4 / 2014-06-19 -================== - - * use `mime-types` - -1.0.3 / 2014-06-11 -================== - - * deps: negotiator@0.4.6 - - Order by specificity when quality is the same - -1.0.2 / 2014-05-29 -================== - - * Fix interpretation when header not in request - * deps: pin negotiator@0.4.5 - -1.0.1 / 2014-01-18 -================== - - * Identity encoding isn't always acceptable - * deps: negotiator@~0.4.0 - -1.0.0 / 2013-12-27 -================== - - * Genesis diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/README.md deleted file mode 100644 index f65596a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# Accepts - -[![NPM version](https://badge.fury.io/js/accepts.svg)](http://badge.fury.io/js/accepts) -[![Build Status](https://travis-ci.org/expressjs/accepts.svg?branch=master)](https://travis-ci.org/expressjs/accepts) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/accepts.svg?branch=master)](https://coveralls.io/r/expressjs/accepts) - -Higher level content negotation based on [negotiator](https://github.com/federomero/negotiator). Extracted from [koa](https://github.com/koajs/koa) for general use. - -In addition to negotatior, it allows: - -- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` as well as `('text/html', 'application/json')`. -- Allows type shorthands such as `json`. -- Returns `false` when no types match -- Treats non-existent headers as `*` - -## API - -### var accept = new Accepts(req) - -```js -var accepts = require('accepts') - -http.createServer(function (req, res) { - var accept = accepts(req) -}) -``` - -### accept\[property\]\(\) - -Returns all the explicitly accepted content property as an array in descending priority. - -- `accept.types()` -- `accept.encodings()` -- `accept.charsets()` -- `accept.languages()` - -They are also aliased in singular form such as `accept.type()`. `accept.languages()` is also aliased as `accept.langs()`, etc. - -Note: you should almost never do this in a real app as it defeats the purpose of content negotiation. - -Example: - -```js -// in Google Chrome -var encodings = accept.encodings() // -> ['sdch', 'gzip', 'deflate'] -``` - -Since you probably don't support `sdch`, you should just supply the encodings you support: - -```js -var encoding = accept.encodings('gzip', 'deflate') // -> 'gzip', probably -``` - -### accept\[property\]\(values, ...\) - -You can either have `values` be an array or have an argument list of values. - -If the client does not accept any `values`, `false` will be returned. -If the client accepts any `values`, the preferred `value` will be return. - -For `accept.types()`, shorthand mime types are allowed. - -Example: - -```js -// req.headers.accept = 'application/json' - -accept.types('json') // -> 'json' -accept.types('html', 'json') // -> 'json' -accept.types('html') // -> false - -// req.headers.accept = '' -// which is equivalent to `*` - -accept.types() // -> [], no explicit types -accept.types('text/html', 'text/json') // -> 'text/html', since it was first -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/index.js deleted file mode 100644 index 805e33a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/index.js +++ /dev/null @@ -1,160 +0,0 @@ -var Negotiator = require('negotiator') -var mime = require('mime-types') - -var slice = [].slice - -module.exports = Accepts - -function Accepts(req) { - if (!(this instanceof Accepts)) - return new Accepts(req) - - this.headers = req.headers - this.negotiator = Negotiator(req) -} - -/** - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json" or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * this.types('html'); - * // => "html" - * - * // Accept: text/*, application/json - * this.types('html'); - * // => "html" - * this.types('text/html'); - * // => "text/html" - * this.types('json', 'text'); - * // => "json" - * this.types('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * this.types('image/png'); - * this.types('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * this.types(['html', 'json']); - * this.types('html', 'json'); - * // => "json" - * - * @param {String|Array} type(s)... - * @return {String|Array|Boolean} - * @api public - */ - -Accepts.prototype.type = -Accepts.prototype.types = function (types) { - if (!Array.isArray(types)) types = slice.call(arguments); - var n = this.negotiator; - if (!types.length) return n.mediaTypes(); - if (!this.headers.accept) return types[0]; - var mimes = types.map(extToMime); - var accepts = n.mediaTypes(mimes.filter(validMime)); - var first = accepts[0]; - if (!first) return false; - return types[mimes.indexOf(first)]; -} - -/** - * Return accepted encodings or best fit based on `encodings`. - * - * Given `Accept-Encoding: gzip, deflate` - * an array sorted by quality is returned: - * - * ['gzip', 'deflate'] - * - * @param {String|Array} encoding(s)... - * @return {String|Array} - * @api public - */ - -Accepts.prototype.encoding = -Accepts.prototype.encodings = function (encodings) { - if (!Array.isArray(encodings)) encodings = slice.call(arguments); - var n = this.negotiator; - if (!encodings.length) return n.encodings(); - return n.encodings(encodings)[0] || false; -} - -/** - * Return accepted charsets or best fit based on `charsets`. - * - * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` - * an array sorted by quality is returned: - * - * ['utf-8', 'utf-7', 'iso-8859-1'] - * - * @param {String|Array} charset(s)... - * @return {String|Array} - * @api public - */ - -Accepts.prototype.charset = -Accepts.prototype.charsets = function (charsets) { - if (!Array.isArray(charsets)) charsets = [].slice.call(arguments); - var n = this.negotiator; - if (!charsets.length) return n.charsets(); - if (!this.headers['accept-charset']) return charsets[0]; - return n.charsets(charsets)[0] || false; -} - -/** - * Return accepted languages or best fit based on `langs`. - * - * Given `Accept-Language: en;q=0.8, es, pt` - * an array sorted by quality is returned: - * - * ['es', 'pt', 'en'] - * - * @param {String|Array} lang(s)... - * @return {Array|String} - * @api public - */ - -Accepts.prototype.lang = -Accepts.prototype.langs = -Accepts.prototype.language = -Accepts.prototype.languages = function (langs) { - if (!Array.isArray(langs)) langs = slice.call(arguments); - var n = this.negotiator; - if (!langs.length) return n.languages(); - if (!this.headers['accept-language']) return langs[0]; - return n.languages(langs)[0] || false; -} - -/** - * Convert extnames to mime. - * - * @param {String} type - * @return {String} - * @api private - */ - -function extToMime(type) { - if (~type.indexOf('/')) return type; - return mime.lookup(type); -} - -/** - * Check if mime is valid. - * - * @param {String} type - * @return {String} - * @api private - */ - -function validMime(type) { - return typeof type === 'string'; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore deleted file mode 100644 index 919d51b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -test -build.js - -# OS generated files # -###################### -.DS_Store* -# Icon? -ehthumbs.db -Thumbs.db - -# Node.js # -########### -node_modules -npm-debug.log diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml deleted file mode 100644 index 73c85c6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" - - "0.11" -matrix: - allow_failures: - - node_js: "0.11" - fast_finish: true -before_install: - # remove build script deps before install - - node -pe 'f="./package.json";p=require(f);d=p.devDependencies;for(k in d){if("co"===k.substr(0,2))delete d[k]}require("fs").writeFileSync(f,JSON.stringify(p,null,2))' diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile deleted file mode 100644 index ceaf011..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -build: - node --harmony-generators build.js - -test: - node test/mime.js - mocha --require should --reporter spec test/test.js - -.PHONY: build test diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md deleted file mode 100644 index 8e21ee1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# mime-types -[![NPM version](https://badge.fury.io/js/mime-types.svg)](https://badge.fury.io/js/mime-types) [![Build Status](https://travis-ci.org/expressjs/mime-types.svg?branch=master)](https://travis-ci.org/expressjs/mime-types) - -The ultimate javascript content-type utility. - -### Install - -```sh -$ npm install mime-types -``` - -#### Similar to [node-mime](https://github.com/broofa/node-mime), except: - -- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. -- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. -- Additional mime types are added such as jade and stylus. Feel free to add more! -- Browser support via Browserify and Component by converting lists to JSON files. - -Otherwise, the API is compatible. - -### Adding Types - -If you'd like to add additional types, -simply create a PR adding the type to `custom.json` and -a reference link to the [sources](SOURCES.md). - -Do __NOT__ edit `mime.json` or `node.json`. -Those are pulled using `build.js`. -You should only touch `custom.json`. - -## API - -```js -var mime = require('mime-types') -``` - -All functions return `false` if input is invalid or not found. - -### mime.lookup(path) - -Lookup the content-type associated with a file. - -```js -mime.lookup('json') // 'application/json' -mime.lookup('.md') // 'text/x-markdown' -mime.lookup('file.html') // 'text/html' -mime.lookup('folder/file.js') // 'application/javascript' - -mime.lookup('cats') // false -``` - -### mime.contentType(type) - -Create a full content-type header given a content-type or extension. - -```js -mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' -mime.contentType('file.json') // 'application/json; charset=utf-8' -``` - -### mime.extension(type) - -Get the default extension for a content-type. - -```js -mime.extension('application/octet-stream') // 'bin' -``` - -### mime.charset(type) - -Lookup the implied default charset of a content-type. - -```js -mime.charset('text/x-markdown') // 'UTF-8' -``` - -### mime.types[extension] = type - -A map of content-types by extension. - -### mime.extensions[type] = [extensions] - -A map of extensions by content-type. - -### mime.define(types) - -Globally add definitions. -`types` must be an object of the form: - -```js -{ - "": [extensions...], - "": [extensions...] -} -``` - -See the `.json` files in `lib/` for examples. - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md deleted file mode 100644 index 1d65012..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/SOURCES.md +++ /dev/null @@ -1,17 +0,0 @@ - -### Sources for custom types - -This is a list of sources for any custom mime types. -When adding custom mime types, please link to where you found the mime type, -even if it's from an unofficial source. - -- `text/coffeescript` - http://coffeescript.org/#scripts -- `text/x-handlebars-template` - https://handlebarsjs.com/#getting-started -- `text/x-sass` & `text/x-scss` - https://github.com/janlelis/rubybuntu-mime/blob/master/sass.xml -- `text.jsx` - http://facebook.github.io/react/docs/getting-started.html [[2]](https://github.com/facebook/react/blob/f230e0a03154e6f8a616e0da1fb3d97ffa1a6472/vendor/browser-transforms.js#L210) - -[Sources for node.json types](https://github.com/broofa/node-mime/blob/master/types/node.types) - -### Notes on weird types - -- `font/opentype` - This type is technically invalid according to the spec. No valid types begin with `font/`. No-one uses the official type of `application/vnd.ms-opentype` as the community standardized `application/x-font-otf`. However, chrome logs nonsense warnings unless opentype fonts are served with `font/opentype`. [[1]](http://stackoverflow.com/questions/2871655/proper-mime-type-for-fonts) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json deleted file mode 100644 index fa67a6d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/component.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "0.1.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com", - "twitter": "https://twitter.com/jongleberry" - }, - "repository": "expressjs/mime-types", - "license": "MIT", - "main": "lib/index.js", - "scripts": ["lib/index.js"], - "json": ["mime.json", "node.json", "custom.json"] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json deleted file mode 100644 index 6137da3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/custom.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "text/jade": [ - "jade" - ], - "text/stylus": [ - "stylus", - "styl" - ], - "text/less": [ - "less" - ], - "text/x-sass": [ - "sass" - ], - "text/x-scss": [ - "scss" - ], - "text/coffeescript": [ - "coffee" - ], - "text/x-handlebars-template": [ - "hbs" - ], - "text/jsx": [ - "jsx" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js deleted file mode 100644 index 27559ea..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/index.js +++ /dev/null @@ -1,74 +0,0 @@ - -// types[extension] = type -exports.types = Object.create(null) -// extensions[type] = [extensions] -exports.extensions = Object.create(null) -// define more mime types -exports.define = define - -// store the json files -exports.json = { - mime: require('./mime.json'), - node: require('./node.json'), - custom: require('./custom.json'), -} - -exports.lookup = function (string) { - if (!string || typeof string !== "string") return false - string = string.replace(/.*[\.\/\\]/, '').toLowerCase() - if (!string) return false - return exports.types[string] || false -} - -exports.extension = function (type) { - if (!type || typeof type !== "string") return false - type = type.match(/^\s*([^;\s]*)(?:;|\s|$)/) - if (!type) return false - var exts = exports.extensions[type[1].toLowerCase()] - if (!exts || !exts.length) return false - return exts[0] -} - -// type has to be an exact mime type -exports.charset = function (type) { - // special cases - switch (type) { - case 'application/json': return 'UTF-8' - } - - // default text/* to utf-8 - if (/^text\//.test(type)) return 'UTF-8' - - return false -} - -// backwards compatibility -exports.charsets = { - lookup: exports.charset -} - -exports.contentType = function (type) { - if (!type || typeof type !== "string") return false - if (!~type.indexOf('/')) type = exports.lookup(type) - if (!type) return false - if (!~type.indexOf('charset')) { - var charset = exports.charset(type) - if (charset) type += '; charset=' + charset.toLowerCase() - } - return type -} - -define(exports.json.mime) -define(exports.json.node) -define(exports.json.custom) - -function define(json) { - Object.keys(json).forEach(function (type) { - var exts = json[type] || [] - exports.extensions[type] = exports.extensions[type] || [] - exts.forEach(function (ext) { - if (!~exports.extensions[type].indexOf(ext)) exports.extensions[type].push(ext) - exports.types[ext] = type - }) - }) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json deleted file mode 100644 index f445a86..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/mime.json +++ /dev/null @@ -1,3317 +0,0 @@ -{ - "application/1d-interleaved-parityfec": [], - "application/3gpp-ims+xml": [], - "application/activemessage": [], - "application/andrew-inset": [ - "ez" - ], - "application/applefile": [], - "application/applixware": [ - "aw" - ], - "application/atom+xml": [ - "atom" - ], - "application/atomcat+xml": [ - "atomcat" - ], - "application/atomicmail": [], - "application/atomsvc+xml": [ - "atomsvc" - ], - "application/auth-policy+xml": [], - "application/batch-smtp": [], - "application/beep+xml": [], - "application/calendar+xml": [], - "application/cals-1840": [], - "application/ccmp+xml": [], - "application/ccxml+xml": [ - "ccxml" - ], - "application/cdmi-capability": [ - "cdmia" - ], - "application/cdmi-container": [ - "cdmic" - ], - "application/cdmi-domain": [ - "cdmid" - ], - "application/cdmi-object": [ - "cdmio" - ], - "application/cdmi-queue": [ - "cdmiq" - ], - "application/cea-2018+xml": [], - "application/cellml+xml": [], - "application/cfw": [], - "application/cnrp+xml": [], - "application/commonground": [], - "application/conference-info+xml": [], - "application/cpl+xml": [], - "application/csta+xml": [], - "application/cstadata+xml": [], - "application/cu-seeme": [ - "cu" - ], - "application/cybercash": [], - "application/davmount+xml": [ - "davmount" - ], - "application/dca-rft": [], - "application/dec-dx": [], - "application/dialog-info+xml": [], - "application/dicom": [], - "application/dns": [], - "application/docbook+xml": [ - "dbk" - ], - "application/dskpp+xml": [], - "application/dssc+der": [ - "dssc" - ], - "application/dssc+xml": [ - "xdssc" - ], - "application/dvcs": [], - "application/ecmascript": [ - "ecma" - ], - "application/edi-consent": [], - "application/edi-x12": [], - "application/edifact": [], - "application/emma+xml": [ - "emma" - ], - "application/epp+xml": [], - "application/epub+zip": [ - "epub" - ], - "application/eshop": [], - "application/example": [], - "application/exi": [ - "exi" - ], - "application/fastinfoset": [], - "application/fastsoap": [], - "application/fits": [], - "application/font-tdpfr": [ - "pfr" - ], - "application/framework-attributes+xml": [], - "application/gml+xml": [ - "gml" - ], - "application/gpx+xml": [ - "gpx" - ], - "application/gxf": [ - "gxf" - ], - "application/h224": [], - "application/held+xml": [], - "application/http": [], - "application/hyperstudio": [ - "stk" - ], - "application/ibe-key-request+xml": [], - "application/ibe-pkg-reply+xml": [], - "application/ibe-pp-data": [], - "application/iges": [], - "application/im-iscomposing+xml": [], - "application/index": [], - "application/index.cmd": [], - "application/index.obj": [], - "application/index.response": [], - "application/index.vnd": [], - "application/inkml+xml": [ - "ink", - "inkml" - ], - "application/iotp": [], - "application/ipfix": [ - "ipfix" - ], - "application/ipp": [], - "application/isup": [], - "application/java-archive": [ - "jar" - ], - "application/java-serialized-object": [ - "ser" - ], - "application/java-vm": [ - "class" - ], - "application/javascript": [ - "js" - ], - "application/json": [ - "json" - ], - "application/jsonml+json": [ - "jsonml" - ], - "application/kpml-request+xml": [], - "application/kpml-response+xml": [], - "application/lost+xml": [ - "lostxml" - ], - "application/mac-binhex40": [ - "hqx" - ], - "application/mac-compactpro": [ - "cpt" - ], - "application/macwriteii": [], - "application/mads+xml": [ - "mads" - ], - "application/marc": [ - "mrc" - ], - "application/marcxml+xml": [ - "mrcx" - ], - "application/mathematica": [ - "ma", - "nb", - "mb" - ], - "application/mathml-content+xml": [], - "application/mathml-presentation+xml": [], - "application/mathml+xml": [ - "mathml" - ], - "application/mbms-associated-procedure-description+xml": [], - "application/mbms-deregister+xml": [], - "application/mbms-envelope+xml": [], - "application/mbms-msk+xml": [], - "application/mbms-msk-response+xml": [], - "application/mbms-protection-description+xml": [], - "application/mbms-reception-report+xml": [], - "application/mbms-register+xml": [], - "application/mbms-register-response+xml": [], - "application/mbms-user-service-description+xml": [], - "application/mbox": [ - "mbox" - ], - "application/media_control+xml": [], - "application/mediaservercontrol+xml": [ - "mscml" - ], - "application/metalink+xml": [ - "metalink" - ], - "application/metalink4+xml": [ - "meta4" - ], - "application/mets+xml": [ - "mets" - ], - "application/mikey": [], - "application/mods+xml": [ - "mods" - ], - "application/moss-keys": [], - "application/moss-signature": [], - "application/mosskey-data": [], - "application/mosskey-request": [], - "application/mp21": [ - "m21", - "mp21" - ], - "application/mp4": [ - "mp4s" - ], - "application/mpeg4-generic": [], - "application/mpeg4-iod": [], - "application/mpeg4-iod-xmt": [], - "application/msc-ivr+xml": [], - "application/msc-mixer+xml": [], - "application/msword": [ - "doc", - "dot" - ], - "application/mxf": [ - "mxf" - ], - "application/nasdata": [], - "application/news-checkgroups": [], - "application/news-groupinfo": [], - "application/news-transmission": [], - "application/nss": [], - "application/ocsp-request": [], - "application/ocsp-response": [], - "application/octet-stream": [ - "bin", - "dms", - "lrf", - "mar", - "so", - "dist", - "distz", - "pkg", - "bpk", - "dump", - "elc", - "deploy" - ], - "application/oda": [ - "oda" - ], - "application/oebps-package+xml": [ - "opf" - ], - "application/ogg": [ - "ogx" - ], - "application/omdoc+xml": [ - "omdoc" - ], - "application/onenote": [ - "onetoc", - "onetoc2", - "onetmp", - "onepkg" - ], - "application/oxps": [ - "oxps" - ], - "application/parityfec": [], - "application/patch-ops-error+xml": [ - "xer" - ], - "application/pdf": [ - "pdf" - ], - "application/pgp-encrypted": [ - "pgp" - ], - "application/pgp-keys": [], - "application/pgp-signature": [ - "asc", - "sig" - ], - "application/pics-rules": [ - "prf" - ], - "application/pidf+xml": [], - "application/pidf-diff+xml": [], - "application/pkcs10": [ - "p10" - ], - "application/pkcs7-mime": [ - "p7m", - "p7c" - ], - "application/pkcs7-signature": [ - "p7s" - ], - "application/pkcs8": [ - "p8" - ], - "application/pkix-attr-cert": [ - "ac" - ], - "application/pkix-cert": [ - "cer" - ], - "application/pkix-crl": [ - "crl" - ], - "application/pkix-pkipath": [ - "pkipath" - ], - "application/pkixcmp": [ - "pki" - ], - "application/pls+xml": [ - "pls" - ], - "application/poc-settings+xml": [], - "application/postscript": [ - "ai", - "eps", - "ps" - ], - "application/prs.alvestrand.titrax-sheet": [], - "application/prs.cww": [ - "cww" - ], - "application/prs.nprend": [], - "application/prs.plucker": [], - "application/prs.rdf-xml-crypt": [], - "application/prs.xsf+xml": [], - "application/pskc+xml": [ - "pskcxml" - ], - "application/qsig": [], - "application/rdf+xml": [ - "rdf" - ], - "application/reginfo+xml": [ - "rif" - ], - "application/relax-ng-compact-syntax": [ - "rnc" - ], - "application/remote-printing": [], - "application/resource-lists+xml": [ - "rl" - ], - "application/resource-lists-diff+xml": [ - "rld" - ], - "application/riscos": [], - "application/rlmi+xml": [], - "application/rls-services+xml": [ - "rs" - ], - "application/rpki-ghostbusters": [ - "gbr" - ], - "application/rpki-manifest": [ - "mft" - ], - "application/rpki-roa": [ - "roa" - ], - "application/rpki-updown": [], - "application/rsd+xml": [ - "rsd" - ], - "application/rss+xml": [ - "rss" - ], - "application/rtf": [ - "rtf" - ], - "application/rtx": [], - "application/samlassertion+xml": [], - "application/samlmetadata+xml": [], - "application/sbml+xml": [ - "sbml" - ], - "application/scvp-cv-request": [ - "scq" - ], - "application/scvp-cv-response": [ - "scs" - ], - "application/scvp-vp-request": [ - "spq" - ], - "application/scvp-vp-response": [ - "spp" - ], - "application/sdp": [ - "sdp" - ], - "application/set-payment": [], - "application/set-payment-initiation": [ - "setpay" - ], - "application/set-registration": [], - "application/set-registration-initiation": [ - "setreg" - ], - "application/sgml": [], - "application/sgml-open-catalog": [], - "application/shf+xml": [ - "shf" - ], - "application/sieve": [], - "application/simple-filter+xml": [], - "application/simple-message-summary": [], - "application/simplesymbolcontainer": [], - "application/slate": [], - "application/smil": [], - "application/smil+xml": [ - "smi", - "smil" - ], - "application/soap+fastinfoset": [], - "application/soap+xml": [], - "application/sparql-query": [ - "rq" - ], - "application/sparql-results+xml": [ - "srx" - ], - "application/spirits-event+xml": [], - "application/srgs": [ - "gram" - ], - "application/srgs+xml": [ - "grxml" - ], - "application/sru+xml": [ - "sru" - ], - "application/ssdl+xml": [ - "ssdl" - ], - "application/ssml+xml": [ - "ssml" - ], - "application/tamp-apex-update": [], - "application/tamp-apex-update-confirm": [], - "application/tamp-community-update": [], - "application/tamp-community-update-confirm": [], - "application/tamp-error": [], - "application/tamp-sequence-adjust": [], - "application/tamp-sequence-adjust-confirm": [], - "application/tamp-status-query": [], - "application/tamp-status-response": [], - "application/tamp-update": [], - "application/tamp-update-confirm": [], - "application/tei+xml": [ - "tei", - "teicorpus" - ], - "application/thraud+xml": [ - "tfi" - ], - "application/timestamp-query": [], - "application/timestamp-reply": [], - "application/timestamped-data": [ - "tsd" - ], - "application/tve-trigger": [], - "application/ulpfec": [], - "application/vcard+xml": [], - "application/vemmi": [], - "application/vividence.scriptfile": [], - "application/vnd.3gpp.bsf+xml": [], - "application/vnd.3gpp.pic-bw-large": [ - "plb" - ], - "application/vnd.3gpp.pic-bw-small": [ - "psb" - ], - "application/vnd.3gpp.pic-bw-var": [ - "pvb" - ], - "application/vnd.3gpp.sms": [], - "application/vnd.3gpp2.bcmcsinfo+xml": [], - "application/vnd.3gpp2.sms": [], - "application/vnd.3gpp2.tcap": [ - "tcap" - ], - "application/vnd.3m.post-it-notes": [ - "pwn" - ], - "application/vnd.accpac.simply.aso": [ - "aso" - ], - "application/vnd.accpac.simply.imp": [ - "imp" - ], - "application/vnd.acucobol": [ - "acu" - ], - "application/vnd.acucorp": [ - "atc", - "acutc" - ], - "application/vnd.adobe.air-application-installer-package+zip": [ - "air" - ], - "application/vnd.adobe.formscentral.fcdt": [ - "fcdt" - ], - "application/vnd.adobe.fxp": [ - "fxp", - "fxpl" - ], - "application/vnd.adobe.partial-upload": [], - "application/vnd.adobe.xdp+xml": [ - "xdp" - ], - "application/vnd.adobe.xfdf": [ - "xfdf" - ], - "application/vnd.aether.imp": [], - "application/vnd.ah-barcode": [], - "application/vnd.ahead.space": [ - "ahead" - ], - "application/vnd.airzip.filesecure.azf": [ - "azf" - ], - "application/vnd.airzip.filesecure.azs": [ - "azs" - ], - "application/vnd.amazon.ebook": [ - "azw" - ], - "application/vnd.americandynamics.acc": [ - "acc" - ], - "application/vnd.amiga.ami": [ - "ami" - ], - "application/vnd.amundsen.maze+xml": [], - "application/vnd.android.package-archive": [ - "apk" - ], - "application/vnd.anser-web-certificate-issue-initiation": [ - "cii" - ], - "application/vnd.anser-web-funds-transfer-initiation": [ - "fti" - ], - "application/vnd.antix.game-component": [ - "atx" - ], - "application/vnd.apple.installer+xml": [ - "mpkg" - ], - "application/vnd.apple.mpegurl": [ - "m3u8" - ], - "application/vnd.arastra.swi": [], - "application/vnd.aristanetworks.swi": [ - "swi" - ], - "application/vnd.astraea-software.iota": [ - "iota" - ], - "application/vnd.audiograph": [ - "aep" - ], - "application/vnd.autopackage": [], - "application/vnd.avistar+xml": [], - "application/vnd.blueice.multipass": [ - "mpm" - ], - "application/vnd.bluetooth.ep.oob": [], - "application/vnd.bmi": [ - "bmi" - ], - "application/vnd.businessobjects": [ - "rep" - ], - "application/vnd.cab-jscript": [], - "application/vnd.canon-cpdl": [], - "application/vnd.canon-lips": [], - "application/vnd.cendio.thinlinc.clientconf": [], - "application/vnd.chemdraw+xml": [ - "cdxml" - ], - "application/vnd.chipnuts.karaoke-mmd": [ - "mmd" - ], - "application/vnd.cinderella": [ - "cdy" - ], - "application/vnd.cirpack.isdn-ext": [], - "application/vnd.claymore": [ - "cla" - ], - "application/vnd.cloanto.rp9": [ - "rp9" - ], - "application/vnd.clonk.c4group": [ - "c4g", - "c4d", - "c4f", - "c4p", - "c4u" - ], - "application/vnd.cluetrust.cartomobile-config": [ - "c11amc" - ], - "application/vnd.cluetrust.cartomobile-config-pkg": [ - "c11amz" - ], - "application/vnd.collection+json": [], - "application/vnd.commerce-battelle": [], - "application/vnd.commonspace": [ - "csp" - ], - "application/vnd.contact.cmsg": [ - "cdbcmsg" - ], - "application/vnd.cosmocaller": [ - "cmc" - ], - "application/vnd.crick.clicker": [ - "clkx" - ], - "application/vnd.crick.clicker.keyboard": [ - "clkk" - ], - "application/vnd.crick.clicker.palette": [ - "clkp" - ], - "application/vnd.crick.clicker.template": [ - "clkt" - ], - "application/vnd.crick.clicker.wordbank": [ - "clkw" - ], - "application/vnd.criticaltools.wbs+xml": [ - "wbs" - ], - "application/vnd.ctc-posml": [ - "pml" - ], - "application/vnd.ctct.ws+xml": [], - "application/vnd.cups-pdf": [], - "application/vnd.cups-postscript": [], - "application/vnd.cups-ppd": [ - "ppd" - ], - "application/vnd.cups-raster": [], - "application/vnd.cups-raw": [], - "application/vnd.curl": [], - "application/vnd.curl.car": [ - "car" - ], - "application/vnd.curl.pcurl": [ - "pcurl" - ], - "application/vnd.cybank": [], - "application/vnd.dart": [ - "dart" - ], - "application/vnd.data-vision.rdz": [ - "rdz" - ], - "application/vnd.dece.data": [ - "uvf", - "uvvf", - "uvd", - "uvvd" - ], - "application/vnd.dece.ttml+xml": [ - "uvt", - "uvvt" - ], - "application/vnd.dece.unspecified": [ - "uvx", - "uvvx" - ], - "application/vnd.dece.zip": [ - "uvz", - "uvvz" - ], - "application/vnd.denovo.fcselayout-link": [ - "fe_launch" - ], - "application/vnd.dir-bi.plate-dl-nosuffix": [], - "application/vnd.dna": [ - "dna" - ], - "application/vnd.dolby.mlp": [ - "mlp" - ], - "application/vnd.dolby.mobile.1": [], - "application/vnd.dolby.mobile.2": [], - "application/vnd.dpgraph": [ - "dpg" - ], - "application/vnd.dreamfactory": [ - "dfac" - ], - "application/vnd.ds-keypoint": [ - "kpxx" - ], - "application/vnd.dvb.ait": [ - "ait" - ], - "application/vnd.dvb.dvbj": [], - "application/vnd.dvb.esgcontainer": [], - "application/vnd.dvb.ipdcdftnotifaccess": [], - "application/vnd.dvb.ipdcesgaccess": [], - "application/vnd.dvb.ipdcesgaccess2": [], - "application/vnd.dvb.ipdcesgpdd": [], - "application/vnd.dvb.ipdcroaming": [], - "application/vnd.dvb.iptv.alfec-base": [], - "application/vnd.dvb.iptv.alfec-enhancement": [], - "application/vnd.dvb.notif-aggregate-root+xml": [], - "application/vnd.dvb.notif-container+xml": [], - "application/vnd.dvb.notif-generic+xml": [], - "application/vnd.dvb.notif-ia-msglist+xml": [], - "application/vnd.dvb.notif-ia-registration-request+xml": [], - "application/vnd.dvb.notif-ia-registration-response+xml": [], - "application/vnd.dvb.notif-init+xml": [], - "application/vnd.dvb.pfr": [], - "application/vnd.dvb.service": [ - "svc" - ], - "application/vnd.dxr": [], - "application/vnd.dynageo": [ - "geo" - ], - "application/vnd.easykaraoke.cdgdownload": [], - "application/vnd.ecdis-update": [], - "application/vnd.ecowin.chart": [ - "mag" - ], - "application/vnd.ecowin.filerequest": [], - "application/vnd.ecowin.fileupdate": [], - "application/vnd.ecowin.series": [], - "application/vnd.ecowin.seriesrequest": [], - "application/vnd.ecowin.seriesupdate": [], - "application/vnd.emclient.accessrequest+xml": [], - "application/vnd.enliven": [ - "nml" - ], - "application/vnd.eprints.data+xml": [], - "application/vnd.epson.esf": [ - "esf" - ], - "application/vnd.epson.msf": [ - "msf" - ], - "application/vnd.epson.quickanime": [ - "qam" - ], - "application/vnd.epson.salt": [ - "slt" - ], - "application/vnd.epson.ssf": [ - "ssf" - ], - "application/vnd.ericsson.quickcall": [], - "application/vnd.eszigno3+xml": [ - "es3", - "et3" - ], - "application/vnd.etsi.aoc+xml": [], - "application/vnd.etsi.cug+xml": [], - "application/vnd.etsi.iptvcommand+xml": [], - "application/vnd.etsi.iptvdiscovery+xml": [], - "application/vnd.etsi.iptvprofile+xml": [], - "application/vnd.etsi.iptvsad-bc+xml": [], - "application/vnd.etsi.iptvsad-cod+xml": [], - "application/vnd.etsi.iptvsad-npvr+xml": [], - "application/vnd.etsi.iptvservice+xml": [], - "application/vnd.etsi.iptvsync+xml": [], - "application/vnd.etsi.iptvueprofile+xml": [], - "application/vnd.etsi.mcid+xml": [], - "application/vnd.etsi.overload-control-policy-dataset+xml": [], - "application/vnd.etsi.sci+xml": [], - "application/vnd.etsi.simservs+xml": [], - "application/vnd.etsi.tsl+xml": [], - "application/vnd.etsi.tsl.der": [], - "application/vnd.eudora.data": [], - "application/vnd.ezpix-album": [ - "ez2" - ], - "application/vnd.ezpix-package": [ - "ez3" - ], - "application/vnd.f-secure.mobile": [], - "application/vnd.fdf": [ - "fdf" - ], - "application/vnd.fdsn.mseed": [ - "mseed" - ], - "application/vnd.fdsn.seed": [ - "seed", - "dataless" - ], - "application/vnd.ffsns": [], - "application/vnd.fints": [], - "application/vnd.flographit": [ - "gph" - ], - "application/vnd.fluxtime.clip": [ - "ftc" - ], - "application/vnd.font-fontforge-sfd": [], - "application/vnd.framemaker": [ - "fm", - "frame", - "maker", - "book" - ], - "application/vnd.frogans.fnc": [ - "fnc" - ], - "application/vnd.frogans.ltf": [ - "ltf" - ], - "application/vnd.fsc.weblaunch": [ - "fsc" - ], - "application/vnd.fujitsu.oasys": [ - "oas" - ], - "application/vnd.fujitsu.oasys2": [ - "oa2" - ], - "application/vnd.fujitsu.oasys3": [ - "oa3" - ], - "application/vnd.fujitsu.oasysgp": [ - "fg5" - ], - "application/vnd.fujitsu.oasysprs": [ - "bh2" - ], - "application/vnd.fujixerox.art-ex": [], - "application/vnd.fujixerox.art4": [], - "application/vnd.fujixerox.hbpl": [], - "application/vnd.fujixerox.ddd": [ - "ddd" - ], - "application/vnd.fujixerox.docuworks": [ - "xdw" - ], - "application/vnd.fujixerox.docuworks.binder": [ - "xbd" - ], - "application/vnd.fut-misnet": [], - "application/vnd.fuzzysheet": [ - "fzs" - ], - "application/vnd.genomatix.tuxedo": [ - "txd" - ], - "application/vnd.geocube+xml": [], - "application/vnd.geogebra.file": [ - "ggb" - ], - "application/vnd.geogebra.tool": [ - "ggt" - ], - "application/vnd.geometry-explorer": [ - "gex", - "gre" - ], - "application/vnd.geonext": [ - "gxt" - ], - "application/vnd.geoplan": [ - "g2w" - ], - "application/vnd.geospace": [ - "g3w" - ], - "application/vnd.globalplatform.card-content-mgt": [], - "application/vnd.globalplatform.card-content-mgt-response": [], - "application/vnd.gmx": [ - "gmx" - ], - "application/vnd.google-earth.kml+xml": [ - "kml" - ], - "application/vnd.google-earth.kmz": [ - "kmz" - ], - "application/vnd.grafeq": [ - "gqf", - "gqs" - ], - "application/vnd.gridmp": [], - "application/vnd.groove-account": [ - "gac" - ], - "application/vnd.groove-help": [ - "ghf" - ], - "application/vnd.groove-identity-message": [ - "gim" - ], - "application/vnd.groove-injector": [ - "grv" - ], - "application/vnd.groove-tool-message": [ - "gtm" - ], - "application/vnd.groove-tool-template": [ - "tpl" - ], - "application/vnd.groove-vcard": [ - "vcg" - ], - "application/vnd.hal+json": [], - "application/vnd.hal+xml": [ - "hal" - ], - "application/vnd.handheld-entertainment+xml": [ - "zmm" - ], - "application/vnd.hbci": [ - "hbci" - ], - "application/vnd.hcl-bireports": [], - "application/vnd.hhe.lesson-player": [ - "les" - ], - "application/vnd.hp-hpgl": [ - "hpgl" - ], - "application/vnd.hp-hpid": [ - "hpid" - ], - "application/vnd.hp-hps": [ - "hps" - ], - "application/vnd.hp-jlyt": [ - "jlt" - ], - "application/vnd.hp-pcl": [ - "pcl" - ], - "application/vnd.hp-pclxl": [ - "pclxl" - ], - "application/vnd.httphone": [], - "application/vnd.hzn-3d-crossword": [], - "application/vnd.ibm.afplinedata": [], - "application/vnd.ibm.electronic-media": [], - "application/vnd.ibm.minipay": [ - "mpy" - ], - "application/vnd.ibm.modcap": [ - "afp", - "listafp", - "list3820" - ], - "application/vnd.ibm.rights-management": [ - "irm" - ], - "application/vnd.ibm.secure-container": [ - "sc" - ], - "application/vnd.iccprofile": [ - "icc", - "icm" - ], - "application/vnd.igloader": [ - "igl" - ], - "application/vnd.immervision-ivp": [ - "ivp" - ], - "application/vnd.immervision-ivu": [ - "ivu" - ], - "application/vnd.informedcontrol.rms+xml": [], - "application/vnd.informix-visionary": [], - "application/vnd.infotech.project": [], - "application/vnd.infotech.project+xml": [], - "application/vnd.innopath.wamp.notification": [], - "application/vnd.insors.igm": [ - "igm" - ], - "application/vnd.intercon.formnet": [ - "xpw", - "xpx" - ], - "application/vnd.intergeo": [ - "i2g" - ], - "application/vnd.intertrust.digibox": [], - "application/vnd.intertrust.nncp": [], - "application/vnd.intu.qbo": [ - "qbo" - ], - "application/vnd.intu.qfx": [ - "qfx" - ], - "application/vnd.iptc.g2.conceptitem+xml": [], - "application/vnd.iptc.g2.knowledgeitem+xml": [], - "application/vnd.iptc.g2.newsitem+xml": [], - "application/vnd.iptc.g2.newsmessage+xml": [], - "application/vnd.iptc.g2.packageitem+xml": [], - "application/vnd.iptc.g2.planningitem+xml": [], - "application/vnd.ipunplugged.rcprofile": [ - "rcprofile" - ], - "application/vnd.irepository.package+xml": [ - "irp" - ], - "application/vnd.is-xpr": [ - "xpr" - ], - "application/vnd.isac.fcs": [ - "fcs" - ], - "application/vnd.jam": [ - "jam" - ], - "application/vnd.japannet-directory-service": [], - "application/vnd.japannet-jpnstore-wakeup": [], - "application/vnd.japannet-payment-wakeup": [], - "application/vnd.japannet-registration": [], - "application/vnd.japannet-registration-wakeup": [], - "application/vnd.japannet-setstore-wakeup": [], - "application/vnd.japannet-verification": [], - "application/vnd.japannet-verification-wakeup": [], - "application/vnd.jcp.javame.midlet-rms": [ - "rms" - ], - "application/vnd.jisp": [ - "jisp" - ], - "application/vnd.joost.joda-archive": [ - "joda" - ], - "application/vnd.kahootz": [ - "ktz", - "ktr" - ], - "application/vnd.kde.karbon": [ - "karbon" - ], - "application/vnd.kde.kchart": [ - "chrt" - ], - "application/vnd.kde.kformula": [ - "kfo" - ], - "application/vnd.kde.kivio": [ - "flw" - ], - "application/vnd.kde.kontour": [ - "kon" - ], - "application/vnd.kde.kpresenter": [ - "kpr", - "kpt" - ], - "application/vnd.kde.kspread": [ - "ksp" - ], - "application/vnd.kde.kword": [ - "kwd", - "kwt" - ], - "application/vnd.kenameaapp": [ - "htke" - ], - "application/vnd.kidspiration": [ - "kia" - ], - "application/vnd.kinar": [ - "kne", - "knp" - ], - "application/vnd.koan": [ - "skp", - "skd", - "skt", - "skm" - ], - "application/vnd.kodak-descriptor": [ - "sse" - ], - "application/vnd.las.las+xml": [ - "lasxml" - ], - "application/vnd.liberty-request+xml": [], - "application/vnd.llamagraphics.life-balance.desktop": [ - "lbd" - ], - "application/vnd.llamagraphics.life-balance.exchange+xml": [ - "lbe" - ], - "application/vnd.lotus-1-2-3": [ - "123" - ], - "application/vnd.lotus-approach": [ - "apr" - ], - "application/vnd.lotus-freelance": [ - "pre" - ], - "application/vnd.lotus-notes": [ - "nsf" - ], - "application/vnd.lotus-organizer": [ - "org" - ], - "application/vnd.lotus-screencam": [ - "scm" - ], - "application/vnd.lotus-wordpro": [ - "lwp" - ], - "application/vnd.macports.portpkg": [ - "portpkg" - ], - "application/vnd.marlin.drm.actiontoken+xml": [], - "application/vnd.marlin.drm.conftoken+xml": [], - "application/vnd.marlin.drm.license+xml": [], - "application/vnd.marlin.drm.mdcf": [], - "application/vnd.mcd": [ - "mcd" - ], - "application/vnd.medcalcdata": [ - "mc1" - ], - "application/vnd.mediastation.cdkey": [ - "cdkey" - ], - "application/vnd.meridian-slingshot": [], - "application/vnd.mfer": [ - "mwf" - ], - "application/vnd.mfmp": [ - "mfm" - ], - "application/vnd.micrografx.flo": [ - "flo" - ], - "application/vnd.micrografx.igx": [ - "igx" - ], - "application/vnd.mif": [ - "mif" - ], - "application/vnd.minisoft-hp3000-save": [], - "application/vnd.mitsubishi.misty-guard.trustweb": [], - "application/vnd.mobius.daf": [ - "daf" - ], - "application/vnd.mobius.dis": [ - "dis" - ], - "application/vnd.mobius.mbk": [ - "mbk" - ], - "application/vnd.mobius.mqy": [ - "mqy" - ], - "application/vnd.mobius.msl": [ - "msl" - ], - "application/vnd.mobius.plc": [ - "plc" - ], - "application/vnd.mobius.txf": [ - "txf" - ], - "application/vnd.mophun.application": [ - "mpn" - ], - "application/vnd.mophun.certificate": [ - "mpc" - ], - "application/vnd.motorola.flexsuite": [], - "application/vnd.motorola.flexsuite.adsi": [], - "application/vnd.motorola.flexsuite.fis": [], - "application/vnd.motorola.flexsuite.gotap": [], - "application/vnd.motorola.flexsuite.kmr": [], - "application/vnd.motorola.flexsuite.ttc": [], - "application/vnd.motorola.flexsuite.wem": [], - "application/vnd.motorola.iprm": [], - "application/vnd.mozilla.xul+xml": [ - "xul" - ], - "application/vnd.ms-artgalry": [ - "cil" - ], - "application/vnd.ms-asf": [], - "application/vnd.ms-cab-compressed": [ - "cab" - ], - "application/vnd.ms-color.iccprofile": [], - "application/vnd.ms-excel": [ - "xls", - "xlm", - "xla", - "xlc", - "xlt", - "xlw" - ], - "application/vnd.ms-excel.addin.macroenabled.12": [ - "xlam" - ], - "application/vnd.ms-excel.sheet.binary.macroenabled.12": [ - "xlsb" - ], - "application/vnd.ms-excel.sheet.macroenabled.12": [ - "xlsm" - ], - "application/vnd.ms-excel.template.macroenabled.12": [ - "xltm" - ], - "application/vnd.ms-fontobject": [ - "eot" - ], - "application/vnd.ms-htmlhelp": [ - "chm" - ], - "application/vnd.ms-ims": [ - "ims" - ], - "application/vnd.ms-lrm": [ - "lrm" - ], - "application/vnd.ms-office.activex+xml": [], - "application/vnd.ms-officetheme": [ - "thmx" - ], - "application/vnd.ms-opentype": [], - "application/vnd.ms-package.obfuscated-opentype": [], - "application/vnd.ms-pki.seccat": [ - "cat" - ], - "application/vnd.ms-pki.stl": [ - "stl" - ], - "application/vnd.ms-playready.initiator+xml": [], - "application/vnd.ms-powerpoint": [ - "ppt", - "pps", - "pot" - ], - "application/vnd.ms-powerpoint.addin.macroenabled.12": [ - "ppam" - ], - "application/vnd.ms-powerpoint.presentation.macroenabled.12": [ - "pptm" - ], - "application/vnd.ms-powerpoint.slide.macroenabled.12": [ - "sldm" - ], - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": [ - "ppsm" - ], - "application/vnd.ms-powerpoint.template.macroenabled.12": [ - "potm" - ], - "application/vnd.ms-printing.printticket+xml": [], - "application/vnd.ms-project": [ - "mpp", - "mpt" - ], - "application/vnd.ms-tnef": [], - "application/vnd.ms-wmdrm.lic-chlg-req": [], - "application/vnd.ms-wmdrm.lic-resp": [], - "application/vnd.ms-wmdrm.meter-chlg-req": [], - "application/vnd.ms-wmdrm.meter-resp": [], - "application/vnd.ms-word.document.macroenabled.12": [ - "docm" - ], - "application/vnd.ms-word.template.macroenabled.12": [ - "dotm" - ], - "application/vnd.ms-works": [ - "wps", - "wks", - "wcm", - "wdb" - ], - "application/vnd.ms-wpl": [ - "wpl" - ], - "application/vnd.ms-xpsdocument": [ - "xps" - ], - "application/vnd.mseq": [ - "mseq" - ], - "application/vnd.msign": [], - "application/vnd.multiad.creator": [], - "application/vnd.multiad.creator.cif": [], - "application/vnd.music-niff": [], - "application/vnd.musician": [ - "mus" - ], - "application/vnd.muvee.style": [ - "msty" - ], - "application/vnd.mynfc": [ - "taglet" - ], - "application/vnd.ncd.control": [], - "application/vnd.ncd.reference": [], - "application/vnd.nervana": [], - "application/vnd.netfpx": [], - "application/vnd.neurolanguage.nlu": [ - "nlu" - ], - "application/vnd.nitf": [ - "ntf", - "nitf" - ], - "application/vnd.noblenet-directory": [ - "nnd" - ], - "application/vnd.noblenet-sealer": [ - "nns" - ], - "application/vnd.noblenet-web": [ - "nnw" - ], - "application/vnd.nokia.catalogs": [], - "application/vnd.nokia.conml+wbxml": [], - "application/vnd.nokia.conml+xml": [], - "application/vnd.nokia.isds-radio-presets": [], - "application/vnd.nokia.iptv.config+xml": [], - "application/vnd.nokia.landmark+wbxml": [], - "application/vnd.nokia.landmark+xml": [], - "application/vnd.nokia.landmarkcollection+xml": [], - "application/vnd.nokia.n-gage.ac+xml": [], - "application/vnd.nokia.n-gage.data": [ - "ngdat" - ], - "application/vnd.nokia.ncd": [], - "application/vnd.nokia.pcd+wbxml": [], - "application/vnd.nokia.pcd+xml": [], - "application/vnd.nokia.radio-preset": [ - "rpst" - ], - "application/vnd.nokia.radio-presets": [ - "rpss" - ], - "application/vnd.novadigm.edm": [ - "edm" - ], - "application/vnd.novadigm.edx": [ - "edx" - ], - "application/vnd.novadigm.ext": [ - "ext" - ], - "application/vnd.ntt-local.file-transfer": [], - "application/vnd.ntt-local.sip-ta_remote": [], - "application/vnd.ntt-local.sip-ta_tcp_stream": [], - "application/vnd.oasis.opendocument.chart": [ - "odc" - ], - "application/vnd.oasis.opendocument.chart-template": [ - "otc" - ], - "application/vnd.oasis.opendocument.database": [ - "odb" - ], - "application/vnd.oasis.opendocument.formula": [ - "odf" - ], - "application/vnd.oasis.opendocument.formula-template": [ - "odft" - ], - "application/vnd.oasis.opendocument.graphics": [ - "odg" - ], - "application/vnd.oasis.opendocument.graphics-template": [ - "otg" - ], - "application/vnd.oasis.opendocument.image": [ - "odi" - ], - "application/vnd.oasis.opendocument.image-template": [ - "oti" - ], - "application/vnd.oasis.opendocument.presentation": [ - "odp" - ], - "application/vnd.oasis.opendocument.presentation-template": [ - "otp" - ], - "application/vnd.oasis.opendocument.spreadsheet": [ - "ods" - ], - "application/vnd.oasis.opendocument.spreadsheet-template": [ - "ots" - ], - "application/vnd.oasis.opendocument.text": [ - "odt" - ], - "application/vnd.oasis.opendocument.text-master": [ - "odm" - ], - "application/vnd.oasis.opendocument.text-template": [ - "ott" - ], - "application/vnd.oasis.opendocument.text-web": [ - "oth" - ], - "application/vnd.obn": [], - "application/vnd.oftn.l10n+json": [], - "application/vnd.oipf.contentaccessdownload+xml": [], - "application/vnd.oipf.contentaccessstreaming+xml": [], - "application/vnd.oipf.cspg-hexbinary": [], - "application/vnd.oipf.dae.svg+xml": [], - "application/vnd.oipf.dae.xhtml+xml": [], - "application/vnd.oipf.mippvcontrolmessage+xml": [], - "application/vnd.oipf.pae.gem": [], - "application/vnd.oipf.spdiscovery+xml": [], - "application/vnd.oipf.spdlist+xml": [], - "application/vnd.oipf.ueprofile+xml": [], - "application/vnd.oipf.userprofile+xml": [], - "application/vnd.olpc-sugar": [ - "xo" - ], - "application/vnd.oma-scws-config": [], - "application/vnd.oma-scws-http-request": [], - "application/vnd.oma-scws-http-response": [], - "application/vnd.oma.bcast.associated-procedure-parameter+xml": [], - "application/vnd.oma.bcast.drm-trigger+xml": [], - "application/vnd.oma.bcast.imd+xml": [], - "application/vnd.oma.bcast.ltkm": [], - "application/vnd.oma.bcast.notification+xml": [], - "application/vnd.oma.bcast.provisioningtrigger": [], - "application/vnd.oma.bcast.sgboot": [], - "application/vnd.oma.bcast.sgdd+xml": [], - "application/vnd.oma.bcast.sgdu": [], - "application/vnd.oma.bcast.simple-symbol-container": [], - "application/vnd.oma.bcast.smartcard-trigger+xml": [], - "application/vnd.oma.bcast.sprov+xml": [], - "application/vnd.oma.bcast.stkm": [], - "application/vnd.oma.cab-address-book+xml": [], - "application/vnd.oma.cab-feature-handler+xml": [], - "application/vnd.oma.cab-pcc+xml": [], - "application/vnd.oma.cab-user-prefs+xml": [], - "application/vnd.oma.dcd": [], - "application/vnd.oma.dcdc": [], - "application/vnd.oma.dd2+xml": [ - "dd2" - ], - "application/vnd.oma.drm.risd+xml": [], - "application/vnd.oma.group-usage-list+xml": [], - "application/vnd.oma.pal+xml": [], - "application/vnd.oma.poc.detailed-progress-report+xml": [], - "application/vnd.oma.poc.final-report+xml": [], - "application/vnd.oma.poc.groups+xml": [], - "application/vnd.oma.poc.invocation-descriptor+xml": [], - "application/vnd.oma.poc.optimized-progress-report+xml": [], - "application/vnd.oma.push": [], - "application/vnd.oma.scidm.messages+xml": [], - "application/vnd.oma.xcap-directory+xml": [], - "application/vnd.omads-email+xml": [], - "application/vnd.omads-file+xml": [], - "application/vnd.omads-folder+xml": [], - "application/vnd.omaloc-supl-init": [], - "application/vnd.openofficeorg.extension": [ - "oxt" - ], - "application/vnd.openxmlformats-officedocument.custom-properties+xml": [], - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": [], - "application/vnd.openxmlformats-officedocument.drawing+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": [], - "application/vnd.openxmlformats-officedocument.extended-properties+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presentation": [ - "pptx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slide": [ - "sldx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [ - "ppsx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.template": [ - "potx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [ - "xlsx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [ - "xltx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": [], - "application/vnd.openxmlformats-officedocument.theme+xml": [], - "application/vnd.openxmlformats-officedocument.themeoverride+xml": [], - "application/vnd.openxmlformats-officedocument.vmldrawing": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [ - "docx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [ - "dotx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": [], - "application/vnd.openxmlformats-package.core-properties+xml": [], - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": [], - "application/vnd.openxmlformats-package.relationships+xml": [], - "application/vnd.quobject-quoxdocument": [], - "application/vnd.osa.netdeploy": [], - "application/vnd.osgeo.mapguide.package": [ - "mgp" - ], - "application/vnd.osgi.bundle": [], - "application/vnd.osgi.dp": [ - "dp" - ], - "application/vnd.osgi.subsystem": [ - "esa" - ], - "application/vnd.otps.ct-kip+xml": [], - "application/vnd.palm": [ - "pdb", - "pqa", - "oprc" - ], - "application/vnd.paos.xml": [], - "application/vnd.pawaafile": [ - "paw" - ], - "application/vnd.pg.format": [ - "str" - ], - "application/vnd.pg.osasli": [ - "ei6" - ], - "application/vnd.piaccess.application-licence": [], - "application/vnd.picsel": [ - "efif" - ], - "application/vnd.pmi.widget": [ - "wg" - ], - "application/vnd.poc.group-advertisement+xml": [], - "application/vnd.pocketlearn": [ - "plf" - ], - "application/vnd.powerbuilder6": [ - "pbd" - ], - "application/vnd.powerbuilder6-s": [], - "application/vnd.powerbuilder7": [], - "application/vnd.powerbuilder7-s": [], - "application/vnd.powerbuilder75": [], - "application/vnd.powerbuilder75-s": [], - "application/vnd.preminet": [], - "application/vnd.previewsystems.box": [ - "box" - ], - "application/vnd.proteus.magazine": [ - "mgz" - ], - "application/vnd.publishare-delta-tree": [ - "qps" - ], - "application/vnd.pvi.ptid1": [ - "ptid" - ], - "application/vnd.pwg-multiplexed": [], - "application/vnd.pwg-xhtml-print+xml": [], - "application/vnd.qualcomm.brew-app-res": [], - "application/vnd.quark.quarkxpress": [ - "qxd", - "qxt", - "qwd", - "qwt", - "qxl", - "qxb" - ], - "application/vnd.radisys.moml+xml": [], - "application/vnd.radisys.msml+xml": [], - "application/vnd.radisys.msml-audit+xml": [], - "application/vnd.radisys.msml-audit-conf+xml": [], - "application/vnd.radisys.msml-audit-conn+xml": [], - "application/vnd.radisys.msml-audit-dialog+xml": [], - "application/vnd.radisys.msml-audit-stream+xml": [], - "application/vnd.radisys.msml-conf+xml": [], - "application/vnd.radisys.msml-dialog+xml": [], - "application/vnd.radisys.msml-dialog-base+xml": [], - "application/vnd.radisys.msml-dialog-fax-detect+xml": [], - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": [], - "application/vnd.radisys.msml-dialog-group+xml": [], - "application/vnd.radisys.msml-dialog-speech+xml": [], - "application/vnd.radisys.msml-dialog-transform+xml": [], - "application/vnd.rainstor.data": [], - "application/vnd.rapid": [], - "application/vnd.realvnc.bed": [ - "bed" - ], - "application/vnd.recordare.musicxml": [ - "mxl" - ], - "application/vnd.recordare.musicxml+xml": [ - "musicxml" - ], - "application/vnd.renlearn.rlprint": [], - "application/vnd.rig.cryptonote": [ - "cryptonote" - ], - "application/vnd.rim.cod": [ - "cod" - ], - "application/vnd.rn-realmedia": [ - "rm" - ], - "application/vnd.rn-realmedia-vbr": [ - "rmvb" - ], - "application/vnd.route66.link66+xml": [ - "link66" - ], - "application/vnd.rs-274x": [], - "application/vnd.ruckus.download": [], - "application/vnd.s3sms": [], - "application/vnd.sailingtracker.track": [ - "st" - ], - "application/vnd.sbm.cid": [], - "application/vnd.sbm.mid2": [], - "application/vnd.scribus": [], - "application/vnd.sealed.3df": [], - "application/vnd.sealed.csf": [], - "application/vnd.sealed.doc": [], - "application/vnd.sealed.eml": [], - "application/vnd.sealed.mht": [], - "application/vnd.sealed.net": [], - "application/vnd.sealed.ppt": [], - "application/vnd.sealed.tiff": [], - "application/vnd.sealed.xls": [], - "application/vnd.sealedmedia.softseal.html": [], - "application/vnd.sealedmedia.softseal.pdf": [], - "application/vnd.seemail": [ - "see" - ], - "application/vnd.sema": [ - "sema" - ], - "application/vnd.semd": [ - "semd" - ], - "application/vnd.semf": [ - "semf" - ], - "application/vnd.shana.informed.formdata": [ - "ifm" - ], - "application/vnd.shana.informed.formtemplate": [ - "itp" - ], - "application/vnd.shana.informed.interchange": [ - "iif" - ], - "application/vnd.shana.informed.package": [ - "ipk" - ], - "application/vnd.simtech-mindmapper": [ - "twd", - "twds" - ], - "application/vnd.smaf": [ - "mmf" - ], - "application/vnd.smart.notebook": [], - "application/vnd.smart.teacher": [ - "teacher" - ], - "application/vnd.software602.filler.form+xml": [], - "application/vnd.software602.filler.form-xml-zip": [], - "application/vnd.solent.sdkm+xml": [ - "sdkm", - "sdkd" - ], - "application/vnd.spotfire.dxp": [ - "dxp" - ], - "application/vnd.spotfire.sfs": [ - "sfs" - ], - "application/vnd.sss-cod": [], - "application/vnd.sss-dtf": [], - "application/vnd.sss-ntf": [], - "application/vnd.stardivision.calc": [ - "sdc" - ], - "application/vnd.stardivision.draw": [ - "sda" - ], - "application/vnd.stardivision.impress": [ - "sdd" - ], - "application/vnd.stardivision.math": [ - "smf" - ], - "application/vnd.stardivision.writer": [ - "sdw", - "vor" - ], - "application/vnd.stardivision.writer-global": [ - "sgl" - ], - "application/vnd.stepmania.package": [ - "smzip" - ], - "application/vnd.stepmania.stepchart": [ - "sm" - ], - "application/vnd.street-stream": [], - "application/vnd.sun.xml.calc": [ - "sxc" - ], - "application/vnd.sun.xml.calc.template": [ - "stc" - ], - "application/vnd.sun.xml.draw": [ - "sxd" - ], - "application/vnd.sun.xml.draw.template": [ - "std" - ], - "application/vnd.sun.xml.impress": [ - "sxi" - ], - "application/vnd.sun.xml.impress.template": [ - "sti" - ], - "application/vnd.sun.xml.math": [ - "sxm" - ], - "application/vnd.sun.xml.writer": [ - "sxw" - ], - "application/vnd.sun.xml.writer.global": [ - "sxg" - ], - "application/vnd.sun.xml.writer.template": [ - "stw" - ], - "application/vnd.sun.wadl+xml": [], - "application/vnd.sus-calendar": [ - "sus", - "susp" - ], - "application/vnd.svd": [ - "svd" - ], - "application/vnd.swiftview-ics": [], - "application/vnd.symbian.install": [ - "sis", - "sisx" - ], - "application/vnd.syncml+xml": [ - "xsm" - ], - "application/vnd.syncml.dm+wbxml": [ - "bdm" - ], - "application/vnd.syncml.dm+xml": [ - "xdm" - ], - "application/vnd.syncml.dm.notification": [], - "application/vnd.syncml.ds.notification": [], - "application/vnd.tao.intent-module-archive": [ - "tao" - ], - "application/vnd.tcpdump.pcap": [ - "pcap", - "cap", - "dmp" - ], - "application/vnd.tmobile-livetv": [ - "tmo" - ], - "application/vnd.trid.tpt": [ - "tpt" - ], - "application/vnd.triscape.mxs": [ - "mxs" - ], - "application/vnd.trueapp": [ - "tra" - ], - "application/vnd.truedoc": [], - "application/vnd.ubisoft.webplayer": [], - "application/vnd.ufdl": [ - "ufd", - "ufdl" - ], - "application/vnd.uiq.theme": [ - "utz" - ], - "application/vnd.umajin": [ - "umj" - ], - "application/vnd.unity": [ - "unityweb" - ], - "application/vnd.uoml+xml": [ - "uoml" - ], - "application/vnd.uplanet.alert": [], - "application/vnd.uplanet.alert-wbxml": [], - "application/vnd.uplanet.bearer-choice": [], - "application/vnd.uplanet.bearer-choice-wbxml": [], - "application/vnd.uplanet.cacheop": [], - "application/vnd.uplanet.cacheop-wbxml": [], - "application/vnd.uplanet.channel": [], - "application/vnd.uplanet.channel-wbxml": [], - "application/vnd.uplanet.list": [], - "application/vnd.uplanet.list-wbxml": [], - "application/vnd.uplanet.listcmd": [], - "application/vnd.uplanet.listcmd-wbxml": [], - "application/vnd.uplanet.signal": [], - "application/vnd.vcx": [ - "vcx" - ], - "application/vnd.vd-study": [], - "application/vnd.vectorworks": [], - "application/vnd.verimatrix.vcas": [], - "application/vnd.vidsoft.vidconference": [], - "application/vnd.visio": [ - "vsd", - "vst", - "vss", - "vsw" - ], - "application/vnd.visionary": [ - "vis" - ], - "application/vnd.vividence.scriptfile": [], - "application/vnd.vsf": [ - "vsf" - ], - "application/vnd.wap.sic": [], - "application/vnd.wap.slc": [], - "application/vnd.wap.wbxml": [ - "wbxml" - ], - "application/vnd.wap.wmlc": [ - "wmlc" - ], - "application/vnd.wap.wmlscriptc": [ - "wmlsc" - ], - "application/vnd.webturbo": [ - "wtb" - ], - "application/vnd.wfa.wsc": [], - "application/vnd.wmc": [], - "application/vnd.wmf.bootstrap": [], - "application/vnd.wolfram.mathematica": [], - "application/vnd.wolfram.mathematica.package": [], - "application/vnd.wolfram.player": [ - "nbp" - ], - "application/vnd.wordperfect": [ - "wpd" - ], - "application/vnd.wqd": [ - "wqd" - ], - "application/vnd.wrq-hp3000-labelled": [], - "application/vnd.wt.stf": [ - "stf" - ], - "application/vnd.wv.csp+wbxml": [], - "application/vnd.wv.csp+xml": [], - "application/vnd.wv.ssp+xml": [], - "application/vnd.xara": [ - "xar" - ], - "application/vnd.xfdl": [ - "xfdl" - ], - "application/vnd.xfdl.webform": [], - "application/vnd.xmi+xml": [], - "application/vnd.xmpie.cpkg": [], - "application/vnd.xmpie.dpkg": [], - "application/vnd.xmpie.plan": [], - "application/vnd.xmpie.ppkg": [], - "application/vnd.xmpie.xlim": [], - "application/vnd.yamaha.hv-dic": [ - "hvd" - ], - "application/vnd.yamaha.hv-script": [ - "hvs" - ], - "application/vnd.yamaha.hv-voice": [ - "hvp" - ], - "application/vnd.yamaha.openscoreformat": [ - "osf" - ], - "application/vnd.yamaha.openscoreformat.osfpvg+xml": [ - "osfpvg" - ], - "application/vnd.yamaha.remote-setup": [], - "application/vnd.yamaha.smaf-audio": [ - "saf" - ], - "application/vnd.yamaha.smaf-phrase": [ - "spf" - ], - "application/vnd.yamaha.through-ngn": [], - "application/vnd.yamaha.tunnel-udpencap": [], - "application/vnd.yellowriver-custom-menu": [ - "cmp" - ], - "application/vnd.zul": [ - "zir", - "zirz" - ], - "application/vnd.zzazz.deck+xml": [ - "zaz" - ], - "application/voicexml+xml": [ - "vxml" - ], - "application/vq-rtcpxr": [], - "application/watcherinfo+xml": [], - "application/whoispp-query": [], - "application/whoispp-response": [], - "application/widget": [ - "wgt" - ], - "application/winhlp": [ - "hlp" - ], - "application/wita": [], - "application/wordperfect5.1": [], - "application/wsdl+xml": [ - "wsdl" - ], - "application/wspolicy+xml": [ - "wspolicy" - ], - "application/x-7z-compressed": [ - "7z" - ], - "application/x-abiword": [ - "abw" - ], - "application/x-ace-compressed": [ - "ace" - ], - "application/x-amf": [], - "application/x-apple-diskimage": [ - "dmg" - ], - "application/x-authorware-bin": [ - "aab", - "x32", - "u32", - "vox" - ], - "application/x-authorware-map": [ - "aam" - ], - "application/x-authorware-seg": [ - "aas" - ], - "application/x-bcpio": [ - "bcpio" - ], - "application/x-bittorrent": [ - "torrent" - ], - "application/x-blorb": [ - "blb", - "blorb" - ], - "application/x-bzip": [ - "bz" - ], - "application/x-bzip2": [ - "bz2", - "boz" - ], - "application/x-cbr": [ - "cbr", - "cba", - "cbt", - "cbz", - "cb7" - ], - "application/x-cdlink": [ - "vcd" - ], - "application/x-cfs-compressed": [ - "cfs" - ], - "application/x-chat": [ - "chat" - ], - "application/x-chess-pgn": [ - "pgn" - ], - "application/x-conference": [ - "nsc" - ], - "application/x-compress": [], - "application/x-cpio": [ - "cpio" - ], - "application/x-csh": [ - "csh" - ], - "application/x-debian-package": [ - "deb", - "udeb" - ], - "application/x-dgc-compressed": [ - "dgc" - ], - "application/x-director": [ - "dir", - "dcr", - "dxr", - "cst", - "cct", - "cxt", - "w3d", - "fgd", - "swa" - ], - "application/x-doom": [ - "wad" - ], - "application/x-dtbncx+xml": [ - "ncx" - ], - "application/x-dtbook+xml": [ - "dtb" - ], - "application/x-dtbresource+xml": [ - "res" - ], - "application/x-dvi": [ - "dvi" - ], - "application/x-envoy": [ - "evy" - ], - "application/x-eva": [ - "eva" - ], - "application/x-font-bdf": [ - "bdf" - ], - "application/x-font-dos": [], - "application/x-font-framemaker": [], - "application/x-font-ghostscript": [ - "gsf" - ], - "application/x-font-libgrx": [], - "application/x-font-linux-psf": [ - "psf" - ], - "application/x-font-otf": [ - "otf" - ], - "application/x-font-pcf": [ - "pcf" - ], - "application/x-font-snf": [ - "snf" - ], - "application/x-font-speedo": [], - "application/x-font-sunos-news": [], - "application/x-font-ttf": [ - "ttf", - "ttc" - ], - "application/x-font-type1": [ - "pfa", - "pfb", - "pfm", - "afm" - ], - "application/font-woff": [ - "woff" - ], - "application/x-font-vfont": [], - "application/x-freearc": [ - "arc" - ], - "application/x-futuresplash": [ - "spl" - ], - "application/x-gca-compressed": [ - "gca" - ], - "application/x-glulx": [ - "ulx" - ], - "application/x-gnumeric": [ - "gnumeric" - ], - "application/x-gramps-xml": [ - "gramps" - ], - "application/x-gtar": [ - "gtar" - ], - "application/x-gzip": [], - "application/x-hdf": [ - "hdf" - ], - "application/x-install-instructions": [ - "install" - ], - "application/x-iso9660-image": [ - "iso" - ], - "application/x-java-jnlp-file": [ - "jnlp" - ], - "application/x-latex": [ - "latex" - ], - "application/x-lzh-compressed": [ - "lzh", - "lha" - ], - "application/x-mie": [ - "mie" - ], - "application/x-mobipocket-ebook": [ - "prc", - "mobi" - ], - "application/x-ms-application": [ - "application" - ], - "application/x-ms-shortcut": [ - "lnk" - ], - "application/x-ms-wmd": [ - "wmd" - ], - "application/x-ms-wmz": [ - "wmz" - ], - "application/x-ms-xbap": [ - "xbap" - ], - "application/x-msaccess": [ - "mdb" - ], - "application/x-msbinder": [ - "obd" - ], - "application/x-mscardfile": [ - "crd" - ], - "application/x-msclip": [ - "clp" - ], - "application/x-msdownload": [ - "exe", - "dll", - "com", - "bat", - "msi" - ], - "application/x-msmediaview": [ - "mvb", - "m13", - "m14" - ], - "application/x-msmetafile": [ - "wmf", - "wmz", - "emf", - "emz" - ], - "application/x-msmoney": [ - "mny" - ], - "application/x-mspublisher": [ - "pub" - ], - "application/x-msschedule": [ - "scd" - ], - "application/x-msterminal": [ - "trm" - ], - "application/x-mswrite": [ - "wri" - ], - "application/x-netcdf": [ - "nc", - "cdf" - ], - "application/x-nzb": [ - "nzb" - ], - "application/x-pkcs12": [ - "p12", - "pfx" - ], - "application/x-pkcs7-certificates": [ - "p7b", - "spc" - ], - "application/x-pkcs7-certreqresp": [ - "p7r" - ], - "application/x-rar-compressed": [ - "rar" - ], - "application/x-research-info-systems": [ - "ris" - ], - "application/x-sh": [ - "sh" - ], - "application/x-shar": [ - "shar" - ], - "application/x-shockwave-flash": [ - "swf" - ], - "application/x-silverlight-app": [ - "xap" - ], - "application/x-sql": [ - "sql" - ], - "application/x-stuffit": [ - "sit" - ], - "application/x-stuffitx": [ - "sitx" - ], - "application/x-subrip": [ - "srt" - ], - "application/x-sv4cpio": [ - "sv4cpio" - ], - "application/x-sv4crc": [ - "sv4crc" - ], - "application/x-t3vm-image": [ - "t3" - ], - "application/x-tads": [ - "gam" - ], - "application/x-tar": [ - "tar" - ], - "application/x-tcl": [ - "tcl" - ], - "application/x-tex": [ - "tex" - ], - "application/x-tex-tfm": [ - "tfm" - ], - "application/x-texinfo": [ - "texinfo", - "texi" - ], - "application/x-tgif": [ - "obj" - ], - "application/x-ustar": [ - "ustar" - ], - "application/x-wais-source": [ - "src" - ], - "application/x-x509-ca-cert": [ - "der", - "crt" - ], - "application/x-xfig": [ - "fig" - ], - "application/x-xliff+xml": [ - "xlf" - ], - "application/x-xpinstall": [ - "xpi" - ], - "application/x-xz": [ - "xz" - ], - "application/x-zmachine": [ - "z1", - "z2", - "z3", - "z4", - "z5", - "z6", - "z7", - "z8" - ], - "application/x400-bp": [], - "application/xaml+xml": [ - "xaml" - ], - "application/xcap-att+xml": [], - "application/xcap-caps+xml": [], - "application/xcap-diff+xml": [ - "xdf" - ], - "application/xcap-el+xml": [], - "application/xcap-error+xml": [], - "application/xcap-ns+xml": [], - "application/xcon-conference-info-diff+xml": [], - "application/xcon-conference-info+xml": [], - "application/xenc+xml": [ - "xenc" - ], - "application/xhtml+xml": [ - "xhtml", - "xht" - ], - "application/xhtml-voice+xml": [], - "application/xml": [ - "xml", - "xsl" - ], - "application/xml-dtd": [ - "dtd" - ], - "application/xml-external-parsed-entity": [], - "application/xmpp+xml": [], - "application/xop+xml": [ - "xop" - ], - "application/xproc+xml": [ - "xpl" - ], - "application/xslt+xml": [ - "xslt" - ], - "application/xspf+xml": [ - "xspf" - ], - "application/xv+xml": [ - "mxml", - "xhvml", - "xvml", - "xvm" - ], - "application/yang": [ - "yang" - ], - "application/yin+xml": [ - "yin" - ], - "application/zip": [ - "zip" - ], - "audio/1d-interleaved-parityfec": [], - "audio/32kadpcm": [], - "audio/3gpp": [], - "audio/3gpp2": [], - "audio/ac3": [], - "audio/adpcm": [ - "adp" - ], - "audio/amr": [], - "audio/amr-wb": [], - "audio/amr-wb+": [], - "audio/asc": [], - "audio/atrac-advanced-lossless": [], - "audio/atrac-x": [], - "audio/atrac3": [], - "audio/basic": [ - "au", - "snd" - ], - "audio/bv16": [], - "audio/bv32": [], - "audio/clearmode": [], - "audio/cn": [], - "audio/dat12": [], - "audio/dls": [], - "audio/dsr-es201108": [], - "audio/dsr-es202050": [], - "audio/dsr-es202211": [], - "audio/dsr-es202212": [], - "audio/dv": [], - "audio/dvi4": [], - "audio/eac3": [], - "audio/evrc": [], - "audio/evrc-qcp": [], - "audio/evrc0": [], - "audio/evrc1": [], - "audio/evrcb": [], - "audio/evrcb0": [], - "audio/evrcb1": [], - "audio/evrcwb": [], - "audio/evrcwb0": [], - "audio/evrcwb1": [], - "audio/example": [], - "audio/fwdred": [], - "audio/g719": [], - "audio/g722": [], - "audio/g7221": [], - "audio/g723": [], - "audio/g726-16": [], - "audio/g726-24": [], - "audio/g726-32": [], - "audio/g726-40": [], - "audio/g728": [], - "audio/g729": [], - "audio/g7291": [], - "audio/g729d": [], - "audio/g729e": [], - "audio/gsm": [], - "audio/gsm-efr": [], - "audio/gsm-hr-08": [], - "audio/ilbc": [], - "audio/ip-mr_v2.5": [], - "audio/isac": [], - "audio/l16": [], - "audio/l20": [], - "audio/l24": [], - "audio/l8": [], - "audio/lpc": [], - "audio/midi": [ - "mid", - "midi", - "kar", - "rmi" - ], - "audio/mobile-xmf": [], - "audio/mp4": [ - "mp4a" - ], - "audio/mp4a-latm": [], - "audio/mpa": [], - "audio/mpa-robust": [], - "audio/mpeg": [ - "mpga", - "mp2", - "mp2a", - "mp3", - "m2a", - "m3a" - ], - "audio/mpeg4-generic": [], - "audio/musepack": [], - "audio/ogg": [ - "oga", - "ogg", - "spx" - ], - "audio/opus": [], - "audio/parityfec": [], - "audio/pcma": [], - "audio/pcma-wb": [], - "audio/pcmu-wb": [], - "audio/pcmu": [], - "audio/prs.sid": [], - "audio/qcelp": [], - "audio/red": [], - "audio/rtp-enc-aescm128": [], - "audio/rtp-midi": [], - "audio/rtx": [], - "audio/s3m": [ - "s3m" - ], - "audio/silk": [ - "sil" - ], - "audio/smv": [], - "audio/smv0": [], - "audio/smv-qcp": [], - "audio/sp-midi": [], - "audio/speex": [], - "audio/t140c": [], - "audio/t38": [], - "audio/telephone-event": [], - "audio/tone": [], - "audio/uemclip": [], - "audio/ulpfec": [], - "audio/vdvi": [], - "audio/vmr-wb": [], - "audio/vnd.3gpp.iufp": [], - "audio/vnd.4sb": [], - "audio/vnd.audiokoz": [], - "audio/vnd.celp": [], - "audio/vnd.cisco.nse": [], - "audio/vnd.cmles.radio-events": [], - "audio/vnd.cns.anp1": [], - "audio/vnd.cns.inf1": [], - "audio/vnd.dece.audio": [ - "uva", - "uvva" - ], - "audio/vnd.digital-winds": [ - "eol" - ], - "audio/vnd.dlna.adts": [], - "audio/vnd.dolby.heaac.1": [], - "audio/vnd.dolby.heaac.2": [], - "audio/vnd.dolby.mlp": [], - "audio/vnd.dolby.mps": [], - "audio/vnd.dolby.pl2": [], - "audio/vnd.dolby.pl2x": [], - "audio/vnd.dolby.pl2z": [], - "audio/vnd.dolby.pulse.1": [], - "audio/vnd.dra": [ - "dra" - ], - "audio/vnd.dts": [ - "dts" - ], - "audio/vnd.dts.hd": [ - "dtshd" - ], - "audio/vnd.dvb.file": [], - "audio/vnd.everad.plj": [], - "audio/vnd.hns.audio": [], - "audio/vnd.lucent.voice": [ - "lvp" - ], - "audio/vnd.ms-playready.media.pya": [ - "pya" - ], - "audio/vnd.nokia.mobile-xmf": [], - "audio/vnd.nortel.vbk": [], - "audio/vnd.nuera.ecelp4800": [ - "ecelp4800" - ], - "audio/vnd.nuera.ecelp7470": [ - "ecelp7470" - ], - "audio/vnd.nuera.ecelp9600": [ - "ecelp9600" - ], - "audio/vnd.octel.sbc": [], - "audio/vnd.qcelp": [], - "audio/vnd.rhetorex.32kadpcm": [], - "audio/vnd.rip": [ - "rip" - ], - "audio/vnd.sealedmedia.softseal.mpeg": [], - "audio/vnd.vmx.cvsd": [], - "audio/vorbis": [], - "audio/vorbis-config": [], - "audio/webm": [ - "weba" - ], - "audio/x-aac": [ - "aac" - ], - "audio/x-aiff": [ - "aif", - "aiff", - "aifc" - ], - "audio/x-caf": [ - "caf" - ], - "audio/x-flac": [ - "flac" - ], - "audio/x-matroska": [ - "mka" - ], - "audio/x-mpegurl": [ - "m3u" - ], - "audio/x-ms-wax": [ - "wax" - ], - "audio/x-ms-wma": [ - "wma" - ], - "audio/x-pn-realaudio": [ - "ram", - "ra" - ], - "audio/x-pn-realaudio-plugin": [ - "rmp" - ], - "audio/x-tta": [], - "audio/x-wav": [ - "wav" - ], - "audio/xm": [ - "xm" - ], - "chemical/x-cdx": [ - "cdx" - ], - "chemical/x-cif": [ - "cif" - ], - "chemical/x-cmdf": [ - "cmdf" - ], - "chemical/x-cml": [ - "cml" - ], - "chemical/x-csml": [ - "csml" - ], - "chemical/x-pdb": [], - "chemical/x-xyz": [ - "xyz" - ], - "image/bmp": [ - "bmp" - ], - "image/cgm": [ - "cgm" - ], - "image/example": [], - "image/fits": [], - "image/g3fax": [ - "g3" - ], - "image/gif": [ - "gif" - ], - "image/ief": [ - "ief" - ], - "image/jp2": [], - "image/jpeg": [ - "jpeg", - "jpg", - "jpe" - ], - "image/jpm": [], - "image/jpx": [], - "image/ktx": [ - "ktx" - ], - "image/naplps": [], - "image/png": [ - "png" - ], - "image/prs.btif": [ - "btif" - ], - "image/prs.pti": [], - "image/sgi": [ - "sgi" - ], - "image/svg+xml": [ - "svg", - "svgz" - ], - "image/t38": [], - "image/tiff": [ - "tiff", - "tif" - ], - "image/tiff-fx": [], - "image/vnd.adobe.photoshop": [ - "psd" - ], - "image/vnd.cns.inf2": [], - "image/vnd.dece.graphic": [ - "uvi", - "uvvi", - "uvg", - "uvvg" - ], - "image/vnd.dvb.subtitle": [ - "sub" - ], - "image/vnd.djvu": [ - "djvu", - "djv" - ], - "image/vnd.dwg": [ - "dwg" - ], - "image/vnd.dxf": [ - "dxf" - ], - "image/vnd.fastbidsheet": [ - "fbs" - ], - "image/vnd.fpx": [ - "fpx" - ], - "image/vnd.fst": [ - "fst" - ], - "image/vnd.fujixerox.edmics-mmr": [ - "mmr" - ], - "image/vnd.fujixerox.edmics-rlc": [ - "rlc" - ], - "image/vnd.globalgraphics.pgb": [], - "image/vnd.microsoft.icon": [], - "image/vnd.mix": [], - "image/vnd.ms-modi": [ - "mdi" - ], - "image/vnd.ms-photo": [ - "wdp" - ], - "image/vnd.net-fpx": [ - "npx" - ], - "image/vnd.radiance": [], - "image/vnd.sealed.png": [], - "image/vnd.sealedmedia.softseal.gif": [], - "image/vnd.sealedmedia.softseal.jpg": [], - "image/vnd.svf": [], - "image/vnd.wap.wbmp": [ - "wbmp" - ], - "image/vnd.xiff": [ - "xif" - ], - "image/webp": [ - "webp" - ], - "image/x-3ds": [ - "3ds" - ], - "image/x-cmu-raster": [ - "ras" - ], - "image/x-cmx": [ - "cmx" - ], - "image/x-freehand": [ - "fh", - "fhc", - "fh4", - "fh5", - "fh7" - ], - "image/x-icon": [ - "ico" - ], - "image/x-mrsid-image": [ - "sid" - ], - "image/x-pcx": [ - "pcx" - ], - "image/x-pict": [ - "pic", - "pct" - ], - "image/x-portable-anymap": [ - "pnm" - ], - "image/x-portable-bitmap": [ - "pbm" - ], - "image/x-portable-graymap": [ - "pgm" - ], - "image/x-portable-pixmap": [ - "ppm" - ], - "image/x-rgb": [ - "rgb" - ], - "image/x-tga": [ - "tga" - ], - "image/x-xbitmap": [ - "xbm" - ], - "image/x-xpixmap": [ - "xpm" - ], - "image/x-xwindowdump": [ - "xwd" - ], - "message/cpim": [], - "message/delivery-status": [], - "message/disposition-notification": [], - "message/example": [], - "message/external-body": [], - "message/feedback-report": [], - "message/global": [], - "message/global-delivery-status": [], - "message/global-disposition-notification": [], - "message/global-headers": [], - "message/http": [], - "message/imdn+xml": [], - "message/news": [], - "message/partial": [], - "message/rfc822": [ - "eml", - "mime" - ], - "message/s-http": [], - "message/sip": [], - "message/sipfrag": [], - "message/tracking-status": [], - "message/vnd.si.simp": [], - "model/example": [], - "model/iges": [ - "igs", - "iges" - ], - "model/mesh": [ - "msh", - "mesh", - "silo" - ], - "model/vnd.collada+xml": [ - "dae" - ], - "model/vnd.dwf": [ - "dwf" - ], - "model/vnd.flatland.3dml": [], - "model/vnd.gdl": [ - "gdl" - ], - "model/vnd.gs-gdl": [], - "model/vnd.gs.gdl": [], - "model/vnd.gtw": [ - "gtw" - ], - "model/vnd.moml+xml": [], - "model/vnd.mts": [ - "mts" - ], - "model/vnd.parasolid.transmit.binary": [], - "model/vnd.parasolid.transmit.text": [], - "model/vnd.vtu": [ - "vtu" - ], - "model/vrml": [ - "wrl", - "vrml" - ], - "model/x3d+binary": [ - "x3db", - "x3dbz" - ], - "model/x3d+vrml": [ - "x3dv", - "x3dvz" - ], - "model/x3d+xml": [ - "x3d", - "x3dz" - ], - "multipart/alternative": [], - "multipart/appledouble": [], - "multipart/byteranges": [], - "multipart/digest": [], - "multipart/encrypted": [], - "multipart/example": [], - "multipart/form-data": [], - "multipart/header-set": [], - "multipart/mixed": [], - "multipart/parallel": [], - "multipart/related": [], - "multipart/report": [], - "multipart/signed": [], - "multipart/voice-message": [], - "text/1d-interleaved-parityfec": [], - "text/cache-manifest": [ - "appcache" - ], - "text/calendar": [ - "ics", - "ifb" - ], - "text/css": [ - "css" - ], - "text/csv": [ - "csv" - ], - "text/directory": [], - "text/dns": [], - "text/ecmascript": [], - "text/enriched": [], - "text/example": [], - "text/fwdred": [], - "text/html": [ - "html", - "htm" - ], - "text/javascript": [], - "text/n3": [ - "n3" - ], - "text/parityfec": [], - "text/plain": [ - "txt", - "text", - "conf", - "def", - "list", - "log", - "in" - ], - "text/prs.fallenstein.rst": [], - "text/prs.lines.tag": [ - "dsc" - ], - "text/vnd.radisys.msml-basic-layout": [], - "text/red": [], - "text/rfc822-headers": [], - "text/richtext": [ - "rtx" - ], - "text/rtf": [], - "text/rtp-enc-aescm128": [], - "text/rtx": [], - "text/sgml": [ - "sgml", - "sgm" - ], - "text/t140": [], - "text/tab-separated-values": [ - "tsv" - ], - "text/troff": [ - "t", - "tr", - "roff", - "man", - "me", - "ms" - ], - "text/turtle": [ - "ttl" - ], - "text/ulpfec": [], - "text/uri-list": [ - "uri", - "uris", - "urls" - ], - "text/vcard": [ - "vcard" - ], - "text/vnd.abc": [], - "text/vnd.curl": [ - "curl" - ], - "text/vnd.curl.dcurl": [ - "dcurl" - ], - "text/vnd.curl.scurl": [ - "scurl" - ], - "text/vnd.curl.mcurl": [ - "mcurl" - ], - "text/vnd.dmclientscript": [], - "text/vnd.dvb.subtitle": [ - "sub" - ], - "text/vnd.esmertec.theme-descriptor": [], - "text/vnd.fly": [ - "fly" - ], - "text/vnd.fmi.flexstor": [ - "flx" - ], - "text/vnd.graphviz": [ - "gv" - ], - "text/vnd.in3d.3dml": [ - "3dml" - ], - "text/vnd.in3d.spot": [ - "spot" - ], - "text/vnd.iptc.newsml": [], - "text/vnd.iptc.nitf": [], - "text/vnd.latex-z": [], - "text/vnd.motorola.reflex": [], - "text/vnd.ms-mediapackage": [], - "text/vnd.net2phone.commcenter.command": [], - "text/vnd.si.uricatalogue": [], - "text/vnd.sun.j2me.app-descriptor": [ - "jad" - ], - "text/vnd.trolltech.linguist": [], - "text/vnd.wap.si": [], - "text/vnd.wap.sl": [], - "text/vnd.wap.wml": [ - "wml" - ], - "text/vnd.wap.wmlscript": [ - "wmls" - ], - "text/x-asm": [ - "s", - "asm" - ], - "text/x-c": [ - "c", - "cc", - "cxx", - "cpp", - "h", - "hh", - "dic" - ], - "text/x-fortran": [ - "f", - "for", - "f77", - "f90" - ], - "text/x-java-source": [ - "java" - ], - "text/x-opml": [ - "opml" - ], - "text/x-pascal": [ - "p", - "pas" - ], - "text/x-nfo": [ - "nfo" - ], - "text/x-setext": [ - "etx" - ], - "text/x-sfv": [ - "sfv" - ], - "text/x-uuencode": [ - "uu" - ], - "text/x-vcalendar": [ - "vcs" - ], - "text/x-vcard": [ - "vcf" - ], - "text/xml": [], - "text/xml-external-parsed-entity": [], - "video/1d-interleaved-parityfec": [], - "video/3gpp": [ - "3gp" - ], - "video/3gpp-tt": [], - "video/3gpp2": [ - "3g2" - ], - "video/bmpeg": [], - "video/bt656": [], - "video/celb": [], - "video/dv": [], - "video/example": [], - "video/h261": [ - "h261" - ], - "video/h263": [ - "h263" - ], - "video/h263-1998": [], - "video/h263-2000": [], - "video/h264": [ - "h264" - ], - "video/h264-rcdo": [], - "video/h264-svc": [], - "video/jpeg": [ - "jpgv" - ], - "video/jpeg2000": [], - "video/jpm": [ - "jpm", - "jpgm" - ], - "video/mj2": [ - "mj2", - "mjp2" - ], - "video/mp1s": [], - "video/mp2p": [], - "video/mp2t": [], - "video/mp4": [ - "mp4", - "mp4v", - "mpg4" - ], - "video/mp4v-es": [], - "video/mpeg": [ - "mpeg", - "mpg", - "mpe", - "m1v", - "m2v" - ], - "video/mpeg4-generic": [], - "video/mpv": [], - "video/nv": [], - "video/ogg": [ - "ogv" - ], - "video/parityfec": [], - "video/pointer": [], - "video/quicktime": [ - "qt", - "mov" - ], - "video/raw": [], - "video/rtp-enc-aescm128": [], - "video/rtx": [], - "video/smpte292m": [], - "video/ulpfec": [], - "video/vc1": [], - "video/vnd.cctv": [], - "video/vnd.dece.hd": [ - "uvh", - "uvvh" - ], - "video/vnd.dece.mobile": [ - "uvm", - "uvvm" - ], - "video/vnd.dece.mp4": [], - "video/vnd.dece.pd": [ - "uvp", - "uvvp" - ], - "video/vnd.dece.sd": [ - "uvs", - "uvvs" - ], - "video/vnd.dece.video": [ - "uvv", - "uvvv" - ], - "video/vnd.directv.mpeg": [], - "video/vnd.directv.mpeg-tts": [], - "video/vnd.dlna.mpeg-tts": [], - "video/vnd.dvb.file": [ - "dvb" - ], - "video/vnd.fvt": [ - "fvt" - ], - "video/vnd.hns.video": [], - "video/vnd.iptvforum.1dparityfec-1010": [], - "video/vnd.iptvforum.1dparityfec-2005": [], - "video/vnd.iptvforum.2dparityfec-1010": [], - "video/vnd.iptvforum.2dparityfec-2005": [], - "video/vnd.iptvforum.ttsavc": [], - "video/vnd.iptvforum.ttsmpeg2": [], - "video/vnd.motorola.video": [], - "video/vnd.motorola.videop": [], - "video/vnd.mpegurl": [ - "mxu", - "m4u" - ], - "video/vnd.ms-playready.media.pyv": [ - "pyv" - ], - "video/vnd.nokia.interleaved-multimedia": [], - "video/vnd.nokia.videovoip": [], - "video/vnd.objectvideo": [], - "video/vnd.sealed.mpeg1": [], - "video/vnd.sealed.mpeg4": [], - "video/vnd.sealed.swf": [], - "video/vnd.sealedmedia.softseal.mov": [], - "video/vnd.uvvu.mp4": [ - "uvu", - "uvvu" - ], - "video/vnd.vivo": [ - "viv" - ], - "video/webm": [ - "webm" - ], - "video/x-f4v": [ - "f4v" - ], - "video/x-fli": [ - "fli" - ], - "video/x-flv": [ - "flv" - ], - "video/x-m4v": [ - "m4v" - ], - "video/x-matroska": [ - "mkv", - "mk3d", - "mks" - ], - "video/x-mng": [ - "mng" - ], - "video/x-ms-asf": [ - "asf", - "asx" - ], - "video/x-ms-vob": [ - "vob" - ], - "video/x-ms-wm": [ - "wm" - ], - "video/x-ms-wmv": [ - "wmv" - ], - "video/x-ms-wmx": [ - "wmx" - ], - "video/x-ms-wvx": [ - "wvx" - ], - "video/x-msvideo": [ - "avi" - ], - "video/x-sgi-movie": [ - "movie" - ], - "video/x-smv": [ - "smv" - ], - "x-conference/x-cooltalk": [ - "ice" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json deleted file mode 100644 index ad50d61..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/lib/node.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "text/vtt": [ - "vtt" - ], - "application/x-chrome-extension": [ - "crx" - ], - "text/x-component": [ - "htc" - ], - "text/cache-manifest": [ - "manifest" - ], - "application/octet-stream": [ - "buffer" - ], - "application/mp4": [ - "m4p" - ], - "audio/mp4": [ - "m4a" - ], - "video/MP2T": [ - "ts" - ], - "application/x-web-app-manifest+json": [ - "webapp" - ], - "text/x-lua": [ - "lua" - ], - "application/x-lua-bytecode": [ - "luac" - ], - "text/x-markdown": [ - "markdown", - "md", - "mkd" - ], - "text/plain": [ - "ini" - ], - "application/dash+xml": [ - "mdp" - ], - "font/opentype": [ - "otf" - ], - "application/json": [ - "map" - ], - "application/xml": [ - "xsd" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json deleted file mode 100644 index bd487f6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/mime-types/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "1.0.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": "https://searchbeam.jit.su" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/mime-types" - }, - "license": "MIT", - "main": "lib", - "devDependencies": { - "co": "3", - "cogent": "0", - "mocha": "1", - "should": "3" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "make test" - }, - "bugs": { - "url": "https://github.com/expressjs/mime-types/issues" - }, - "homepage": "https://github.com/expressjs/mime-types", - "_id": "mime-types@1.0.1", - "_shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "_from": "mime-types@>=1.0.1-0 <1.1.0-0", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore deleted file mode 100644 index a6a8d17..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -examples -test -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE deleted file mode 100644 index 42ca2e7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Original "Negotiator" program Copyright Federico Romero -Port to JavaScript Copyright Isaac Z. Schlueter - -All rights reserved. - -MIT 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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js deleted file mode 100644 index d231291..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js +++ /dev/null @@ -1,90 +0,0 @@ -module.exports = preferredCharsets; -preferredCharsets.preferredCharsets = preferredCharsets; - -function parseAcceptCharset(accept) { - return accept.split(',').map(function(e) { - return parseCharset(e.trim()); - }).filter(function(e) { - return e; - }); -} - -function parseCharset(s) { - var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); - if (!match) return null; - - var charset = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - charset: charset, - q: q - }; -} - -function getCharsetPriority(charset, accepted) { - return (accepted.map(function(a) { - return specify(charset, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q:0}); -} - -function specify(charset, spec) { - var s = 0; - if(spec.charset === charset){ - s |= 1; - } else if (spec.charset !== '*' ) { - return null - } - - return { - s: s, - q: spec.q, - } -} - -function preferredCharsets(accept, provided) { - // RFC 2616 sec 14.2: no header = * - accept = parseAcceptCharset(accept === undefined ? '*' : accept || ''); - if (provided) { - return provided.map(function(type) { - return [type, getCharsetPriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type) { - return type.q > 0; - }).map(function(type) { - return type.charset; - }); - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js deleted file mode 100644 index 207291d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js +++ /dev/null @@ -1,120 +0,0 @@ -module.exports = preferredEncodings; -preferredEncodings.preferredEncodings = preferredEncodings; - -function parseAcceptEncoding(accept) { - var acceptableEncodings; - - if (accept) { - acceptableEncodings = accept.split(',').map(function(e) { - return parseEncoding(e.trim()); - }); - } else { - acceptableEncodings = []; - } - - if (!acceptableEncodings.some(function(e) { - return e && specify('identity', e); - })) { - /* - * If identity doesn't explicitly appear in the accept-encoding header, - * it's added to the list of acceptable encoding with the lowest q - * - */ - var lowestQ = 1; - - for(var i = 0; i < acceptableEncodings.length; i++){ - var e = acceptableEncodings[i]; - if(e && e.q < lowestQ){ - lowestQ = e.q; - } - } - acceptableEncodings.push({ - encoding: 'identity', - q: lowestQ / 2, - }); - } - - return acceptableEncodings.filter(function(e) { - return e; - }); -} - -function parseEncoding(s) { - var match = s.match(/^\s*(\S+?)\s*(?:;(.*))?$/); - - if (!match) return null; - - var encoding = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';'); - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - encoding: encoding, - q: q - }; -} - -function getEncodingPriority(encoding, accepted) { - return (accepted.map(function(a) { - return specify(encoding, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q: 0}); -} - -function specify(encoding, spec) { - var s = 0; - if(spec.encoding === encoding){ - s |= 1; - } else if (spec.encoding !== '*' ) { - return null - } - - return { - s: s, - q: spec.q, - } -}; - -function preferredEncodings(accept, provided) { - accept = parseAcceptEncoding(accept || ''); - if (provided) { - return provided.map(function(type) { - return [type, getEncodingPriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type){ - return type.q > 0; - }).map(function(type) { - return type.encoding; - }); - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js deleted file mode 100644 index 63036c7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js +++ /dev/null @@ -1,103 +0,0 @@ -module.exports = preferredLanguages; -preferredLanguages.preferredLanguages = preferredLanguages; - -function parseAcceptLanguage(accept) { - return accept.split(',').map(function(e) { - return parseLanguage(e.trim()); - }).filter(function(e) { - return e; - }); -} - -function parseLanguage(s) { - var match = s.match(/^\s*(\S+?)(?:-(\S+?))?\s*(?:;(.*))?$/); - if (!match) return null; - - var prefix = match[1], - suffix = match[2], - full = prefix; - - if (suffix) full += "-" + suffix; - - var q = 1; - if (match[3]) { - var params = match[3].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].split('='); - if (p[0] === 'q') q = parseFloat(p[1]); - } - } - - return { - prefix: prefix, - suffix: suffix, - q: q, - full: full - }; -} - -function getLanguagePriority(language, accepted) { - return (accepted.map(function(a){ - return specify(language, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q: 0}); -} - -function specify(language, spec) { - var p = parseLanguage(language) - if (!p) return null; - var s = 0; - if(spec.full === p.full){ - s |= 4; - } else if (spec.prefix === p.full) { - s |= 2; - } else if (spec.full === p.prefix) { - s |= 1; - } else if (spec.full !== '*' ) { - return null - } - - return { - s: s, - q: spec.q, - } -}; - -function preferredLanguages(accept, provided) { - // RFC 2616 sec 14.4: no header = * - accept = parseAcceptLanguage(accept === undefined ? '*' : accept || ''); - if (provided) { - - var ret = provided.map(function(type) { - return [type, getLanguagePriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - return ret; - - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type) { - return type.q > 0; - }).map(function(type) { - return type.full; - }); - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js deleted file mode 100644 index f4dc1ca..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js +++ /dev/null @@ -1,125 +0,0 @@ -module.exports = preferredMediaTypes; -preferredMediaTypes.preferredMediaTypes = preferredMediaTypes; - -function parseAccept(accept) { - return accept.split(',').map(function(e) { - return parseMediaType(e.trim()); - }).filter(function(e) { - return e; - }); -}; - -function parseMediaType(s) { - var match = s.match(/\s*(\S+?)\/([^;\s]+)\s*(?:;(.*))?/); - if (!match) return null; - - var type = match[1], - subtype = match[2], - full = "" + type + "/" + subtype, - params = {}, - q = 1; - - if (match[3]) { - params = match[3].split(';').map(function(s) { - return s.trim().split('='); - }).reduce(function (set, p) { - set[p[0]] = p[1]; - return set - }, params); - - if (params.q != null) { - q = parseFloat(params.q); - delete params.q; - } - } - - return { - type: type, - subtype: subtype, - params: params, - q: q, - full: full - }; -} - -function getMediaTypePriority(type, accepted) { - return (accepted.map(function(a) { - return specify(type, a); - }).filter(Boolean).sort(function (a, b) { - if(a.s == b.s) { - return a.q > b.q ? -1 : 1; - } else { - return a.s > b.s ? -1 : 1; - } - })[0] || {s: 0, q: 0}); -} - -function specify(type, spec) { - var p = parseMediaType(type); - var s = 0; - - if (!p) { - return null; - } - - if(spec.type == p.type) { - s |= 4 - } else if(spec.type != '*') { - return null; - } - - if(spec.subtype == p.subtype) { - s |= 2 - } else if(spec.subtype != '*') { - return null; - } - - var keys = Object.keys(spec.params); - if (keys.length > 0) { - if (keys.every(function (k) { - return spec.params[k] == '*' || spec.params[k] == p.params[k]; - })) { - s |= 1 - } else { - return null - } - } - - return { - q: spec.q, - s: s, - } - -} - -function preferredMediaTypes(accept, provided) { - // RFC 2616 sec 14.2: no header = */* - accept = parseAccept(accept === undefined ? '*/*' : accept || ''); - if (provided) { - return provided.map(function(type) { - return [type, getMediaTypePriority(type, accept)]; - }).filter(function(pair) { - return pair[1].q > 0; - }).sort(function(a, b) { - var pa = a[1]; - var pb = b[1]; - if(pa.q == pb.q) { - return pa.s < pb.s ? 1 : -1; - } else { - return pa.q < pb.q ? 1 : -1; - } - }).map(function(pair) { - return pair[0]; - }); - - } else { - return accept.sort(function (a, b) { - // revsort - return a.q < b.q ? 1 : -1; - }).filter(function(type) { - return type.q > 0; - }).map(function(type) { - return type.full; - }); - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js deleted file mode 100644 index ba0c48b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/lib/negotiator.js +++ /dev/null @@ -1,37 +0,0 @@ -module.exports = Negotiator; -Negotiator.Negotiator = Negotiator; - -function Negotiator(request) { - if (!(this instanceof Negotiator)) return new Negotiator(request); - this.request = request; -} - -var set = { charset: 'accept-charset', - encoding: 'accept-encoding', - language: 'accept-language', - mediaType: 'accept' }; - - -function capitalize(string){ - return string.charAt(0).toUpperCase() + string.slice(1); -} - -Object.keys(set).forEach(function (k) { - var header = set[k], - method = require('./'+k+'.js'), - singular = k, - plural = k + 's'; - - Negotiator.prototype[plural] = function (available) { - return method(this.request.headers[header], available); - }; - - Negotiator.prototype[singular] = function(available) { - var set = this[plural](available); - if (set) return set[0]; - }; - - // Keep preferred* methods for legacy compatibility - Negotiator.prototype['preferred'+capitalize(plural)] = Negotiator.prototype[plural]; - Negotiator.prototype['preferred'+capitalize(singular)] = Negotiator.prototype[singular]; -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json deleted file mode 100644 index 0572f18..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "negotiator", - "description": "HTTP content negotiation", - "version": "0.4.7", - "author": { - "name": "Federico Romero", - "email": "federico.romero@outboxlabs.com" - }, - "contributors": [ - { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/federomero/negotiator.git" - }, - "keywords": [ - "http", - "content negotiation", - "accept", - "accept-language", - "accept-encoding", - "accept-charset" - ], - "engine": "node >= 0.6", - "license": "MIT", - "devDependencies": { - "nodeunit": "0.8.x" - }, - "scripts": { - "test": "nodeunit test" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "main": "lib/negotiator.js", - "bugs": { - "url": "https://github.com/federomero/negotiator/issues" - }, - "homepage": "https://github.com/federomero/negotiator", - "dependencies": {}, - "_id": "negotiator@0.4.7", - "dist": { - "shasum": "a4160f7177ec806738631d0d3052325da42abdc8", - "tarball": "http://registry.npmjs.org/negotiator/-/negotiator-0.4.7.tgz" - }, - "_from": "negotiator@0.4.7", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "federomero", - "email": "federomero@gmail.com" - }, - "maintainers": [ - { - "name": "federomero", - "email": "federomero@gmail.com" - } - ], - "directories": {}, - "_shasum": "a4160f7177ec806738631d0d3052325da42abdc8", - "_resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.7.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md deleted file mode 100644 index d982a9c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/node_modules/negotiator/readme.md +++ /dev/null @@ -1,132 +0,0 @@ -# Negotiator [![Build Status](https://travis-ci.org/federomero/negotiator.png)](https://travis-ci.org/federomero/negotiator) - -An HTTP content negotiator for node.js written in javascript. - -# Accept Negotiation - - Negotiator = require('negotiator') - - availableMediaTypes = ['text/html', 'text/plain', 'application/json'] - - // The negotiator constructor receives a request object - negotiator = new Negotiator(request) - - // Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8' - - negotiator.mediaTypes() - // -> ['text/html', 'image/jpeg', 'application/*'] - - negotiator.mediaTypes(availableMediaTypes) - // -> ['text/html', 'application/json'] - - negotiator.mediaType(availableMediaTypes) - // -> 'text/html' - -You can check a working example at `examples/accept.js`. - -## Methods - -`mediaTypes(availableMediaTypes)`: - -Returns an array of preferred media types ordered by priority from a list of available media types. - -`mediaType(availableMediaType)`: - -Returns the top preferred media type from a list of available media types. - -# Accept-Language Negotiation - - Negotiator = require('negotiator') - - negotiator = new Negotiator(request) - - availableLanguages = 'en', 'es', 'fr' - - // Let's say Accept-Language header is 'en;q=0.8, es, pt' - - negotiator.languages() - // -> ['es', 'pt', 'en'] - - negotiator.languages(availableLanguages) - // -> ['es', 'en'] - - language = negotiator.language(availableLanguages) - // -> 'es' - -You can check a working example at `examples/language.js`. - -## Methods - -`languages(availableLanguages)`: - -Returns an array of preferred languages ordered by priority from a list of available languages. - -`language(availableLanguages)`: - -Returns the top preferred language from a list of available languages. - -# Accept-Charset Negotiation - - Negotiator = require('negotiator') - - availableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5'] - - negotiator = new Negotiator(request) - - // Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2' - - negotiator.charsets() - // -> ['utf-8', 'iso-8859-1', 'utf-7'] - - negotiator.charsets(availableCharsets) - // -> ['utf-8', 'iso-8859-1'] - - negotiator.charset(availableCharsets) - // -> 'utf-8' - -You can check a working example at `examples/charset.js`. - -## Methods - -`charsets(availableCharsets)`: - -Returns an array of preferred charsets ordered by priority from a list of available charsets. - -`charset(availableCharsets)`: - -Returns the top preferred charset from a list of available charsets. - -# Accept-Encoding Negotiation - - Negotiator = require('negotiator').Negotiator - - availableEncodings = ['identity', 'gzip'] - - negotiator = new Negotiator(request) - - // Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5' - - negotiator.encodings() - // -> ['gzip', 'identity', 'compress'] - - negotiator.encodings(availableEncodings) - // -> ['gzip', 'identity'] - - negotiator.encoding(availableEncodings) - // -> 'gzip' - -You can check a working example at `examples/encoding.js`. - -## Methods - -`encodings(availableEncodings)`: - -Returns an array of preferred encodings ordered by priority from a list of available encodings. - -`encoding(availableEncodings)`: - -Returns the top preferred encoding from a list of available encodings. - -# License - -MIT diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/package.json deleted file mode 100644 index 0d8c5bb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/accepts/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "accepts", - "description": "Higher-level content negotiation", - "version": "1.0.7", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/accepts" - }, - "dependencies": { - "mime-types": "~1.0.0", - "negotiator": "0.4.7" - }, - "devDependencies": { - "istanbul": "0.2.11", - "mocha": "*", - "should": "*" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --require should --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require should --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require should --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/accepts/issues" - }, - "homepage": "https://github.com/expressjs/accepts", - "_id": "accepts@1.0.7", - "dist": { - "shasum": "5b501fb4f0704309964ccdb048172541208dab1a", - "tarball": "http://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz" - }, - "_from": "accepts@>=1.0.7-0 <1.1.0-0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "federomero", - "email": "federomero@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "5b501fb4f0704309964ccdb048172541208dab1a", - "_resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.npmignore deleted file mode 100644 index b512c09..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.travis.yml deleted file mode 100644 index 7a902e8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 -notifications: - email: - recipients: - - brianloveswords@gmail.com \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/LICENSE deleted file mode 100644 index caeb849..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/LICENSE +++ /dev/null @@ -1,17 +0,0 @@ -Copyright (c) 2013 Brian J. Brennan - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/README.md deleted file mode 100644 index 0d9d8b8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# buffer-crc32 - -[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32) - -crc32 that works with binary data and fancy character sets, outputs -buffer, signed or unsigned data and has tests. - -Derived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix - -# install -``` -npm install buffer-crc32 -``` - -# example -```js -var crc32 = require('buffer-crc32'); -// works with buffers -var buf = Buffer([0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) -crc32(buf) // -> - -// has convenience methods for getting signed or unsigned ints -crc32.signed(buf) // -> -1805997238 -crc32.unsigned(buf) // -> 2488970058 - -// will cast to buffer if given a string, so you can -// directly use foreign characters safely -crc32('自動販売機') // -> - -// and works in append mode too -var partialCrc = crc32('hey'); -var partialCrc = crc32(' ', partialCrc); -var partialCrc = crc32('sup', partialCrc); -var partialCrc = crc32(' ', partialCrc); -var finalCrc = crc32('bros', partialCrc); // -> -``` - -# tests -This was tested against the output of zlib's crc32 method. You can run -the tests with`npm test` (requires tap) - -# see also -https://github.com/alexgorbatchev/node-crc, `crc.buffer.crc32` also -supports buffer inputs and return unsigned ints (thanks @tjholowaychuk). - -# license -MIT/X11 diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/index.js deleted file mode 100644 index 8694c63..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/index.js +++ /dev/null @@ -1,91 +0,0 @@ -var Buffer = require('buffer').Buffer; - -var CRC_TABLE = [ - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, - 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, - 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, - 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, - 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, - 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, - 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, - 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, - 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, - 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, - 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, - 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, - 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, - 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, - 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, - 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, - 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, - 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, - 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, - 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, - 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, - 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, - 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, - 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, - 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, - 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, - 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, - 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, - 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, - 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, - 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, - 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, - 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, - 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, - 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, - 0x2d02ef8d -]; - -if (typeof Int32Array !== 'undefined') - CRC_TABLE = new Int32Array(CRC_TABLE); - -function bufferizeInt(num) { - var tmp = Buffer(4); - tmp.writeInt32BE(num, 0); - return tmp; -} - -function _crc32(buf, previous) { - if (!Buffer.isBuffer(buf)) { - buf = Buffer(buf); - } - if (Buffer.isBuffer(previous)) { - previous = previous.readUInt32BE(0); - } - var crc = ~~previous ^ -1; - for (var n = 0; n < buf.length; n++) { - crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); - } - return (crc ^ -1); -} - -function crc32() { - return bufferizeInt(_crc32.apply(null, arguments)); -} -crc32.signed = function () { - return _crc32.apply(null, arguments); -}; -crc32.unsigned = function () { - return _crc32.apply(null, arguments) >>> 0; -}; - -module.exports = crc32; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/package.json deleted file mode 100644 index e0d6377..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "author": { - "name": "Brian J. Brennan", - "email": "brianloveswords@gmail.com", - "url": "http://bjb.io" - }, - "name": "buffer-crc32", - "description": "A pure javascript CRC32 algorithm that plays nice with binary data", - "version": "0.2.3", - "contributors": [ - { - "name": "Vladimir Kuznetsov" - } - ], - "homepage": "https://github.com/brianloveswords/buffer-crc32", - "repository": { - "type": "git", - "url": "git://github.com/brianloveswords/buffer-crc32.git" - }, - "main": "index.js", - "scripts": { - "test": "tap tests/*.test.js" - }, - "dependencies": {}, - "devDependencies": { - "tap": "~0.2.5" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "gitHead": "f06dc30bccbad685af30666268c6fd2670805998", - "bugs": { - "url": "https://github.com/brianloveswords/buffer-crc32/issues" - }, - "_id": "buffer-crc32@0.2.3", - "_shasum": "bb54519e95d107cbd2400e76d0cab1467336d921", - "_from": "buffer-crc32@0.2.3", - "_npmVersion": "1.4.14", - "_npmUser": { - "name": "brianloveswords", - "email": "brianloveswords@gmail.com" - }, - "maintainers": [ - { - "name": "brianloveswords", - "email": "brian@nyhacker.org" - } - ], - "dist": { - "shasum": "bb54519e95d107cbd2400e76d0cab1467336d921", - "tarball": "http://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js deleted file mode 100644 index bb0f9ef..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js +++ /dev/null @@ -1,89 +0,0 @@ -var crc32 = require('..'); -var test = require('tap').test; - -test('simple crc32 is no problem', function (t) { - var input = Buffer('hey sup bros'); - var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); - t.same(crc32(input), expected); - t.end(); -}); - -test('another simple one', function (t) { - var input = Buffer('IEND'); - var expected = Buffer([0xae, 0x42, 0x60, 0x82]); - t.same(crc32(input), expected); - t.end(); -}); - -test('slightly more complex', function (t) { - var input = Buffer([0x00, 0x00, 0x00]); - var expected = Buffer([0xff, 0x41, 0xd9, 0x12]); - t.same(crc32(input), expected); - t.end(); -}); - -test('complex crc32 gets calculated like a champ', function (t) { - var input = Buffer('शीर्षक'); - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('casts to buffer if necessary', function (t) { - var input = 'शीर्षक'; - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('can do signed', function (t) { - var input = 'ham sandwich'; - var expected = -1891873021; - t.same(crc32.signed(input), expected); - t.end(); -}); - -test('can do unsigned', function (t) { - var input = 'bear sandwich'; - var expected = 3711466352; - t.same(crc32.unsigned(input), expected); - t.end(); -}); - - -test('simple crc32 in append mode', function (t) { - var input = [Buffer('hey'), Buffer(' '), Buffer('sup'), Buffer(' '), Buffer('bros')]; - var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); - for (var crc = 0, i = 0; i < input.length; i++) { - crc = crc32(input[i], crc); - } - t.same(crc, expected); - t.end(); -}); - - -test('can do signed in append mode', function (t) { - var input1 = 'ham'; - var input2 = ' '; - var input3 = 'sandwich'; - var expected = -1891873021; - - var crc = crc32.signed(input1); - crc = crc32.signed(input2, crc); - crc = crc32.signed(input3, crc); - - t.same(crc, expected); - t.end(); -}); - -test('can do unsigned in append mode', function (t) { - var input1 = 'bear san'; - var input2 = 'dwich'; - var expected = 3711466352; - - var crc = crc32.unsigned(input1); - crc = crc32.unsigned(input2, crc); - t.same(crc, expected); - t.end(); -}); - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/History.md deleted file mode 100644 index 2bbc4b3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/History.md +++ /dev/null @@ -1,27 +0,0 @@ -1.0.4 / 2014-06-25 -================== - - * corrected avoidance of timing attacks (thanks @tenbits!) - - -1.0.3 / 2014-01-28 -================== - - * [incorrect] fix for timing attacks - -1.0.2 / 2014-01-28 -================== - - * fix missing repository warning - * fix typo in test - -1.0.1 / 2013-04-15 -================== - - * Revert "Changed underlying HMAC algo. to sha512." - * Revert "Fix for timing attacks on MAC verification." - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Makefile deleted file mode 100644 index 4e9c8d3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --require should \ - --reporter spec - -.PHONY: test \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Readme.md deleted file mode 100644 index 2559e84..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/Readme.md +++ /dev/null @@ -1,42 +0,0 @@ - -# cookie-signature - - Sign and unsign cookies. - -## Example - -```js -var cookie = require('cookie-signature'); - -var val = cookie.sign('hello', 'tobiiscool'); -val.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI'); - -var val = cookie.sign('hello', 'tobiiscool'); -cookie.unsign(val, 'tobiiscool').should.equal('hello'); -cookie.unsign(val, 'luna').should.be.false; -``` - -## License - -(The MIT License) - -Copyright (c) 2012 LearnBoost <tj@learnboost.com> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/index.js deleted file mode 100644 index b63bf84..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/index.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Sign the given `val` with `secret`. - * - * @param {String} val - * @param {String} secret - * @return {String} - * @api private - */ - -exports.sign = function(val, secret){ - if ('string' != typeof val) throw new TypeError('cookie required'); - if ('string' != typeof secret) throw new TypeError('secret required'); - return val + '.' + crypto - .createHmac('sha256', secret) - .update(val) - .digest('base64') - .replace(/\=+$/, ''); -}; - -/** - * Unsign and decode the given `val` with `secret`, - * returning `false` if the signature is invalid. - * - * @param {String} val - * @param {String} secret - * @return {String|Boolean} - * @api private - */ - -exports.unsign = function(val, secret){ - if ('string' != typeof val) throw new TypeError('cookie required'); - if ('string' != typeof secret) throw new TypeError('secret required'); - var str = val.slice(0, val.lastIndexOf('.')) - , mac = exports.sign(str, secret); - - return sha1(mac) == sha1(val) ? str : false; -}; - -/** - * Private - */ - -function sha1(str){ - return crypto.createHash('sha1').update(str).digest('hex'); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/package.json deleted file mode 100644 index c15a32d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie-signature/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "cookie-signature", - "version": "1.0.4", - "description": "Sign and unsign cookies", - "keywords": [ - "cookie", - "sign", - "unsign" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@learnboost.com" - }, - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-cookie-signature.git" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "main": "index", - "bugs": { - "url": "https://github.com/visionmedia/node-cookie-signature/issues" - }, - "homepage": "https://github.com/visionmedia/node-cookie-signature", - "_id": "cookie-signature@1.0.4", - "dist": { - "shasum": "0edd22286e3a111b9a2a70db363e925e867f6aca", - "tarball": "http://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.4.tgz" - }, - "_from": "cookie-signature@1.0.4", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "natevw", - "email": "natevw@yahoo.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "natevw", - "email": "natevw@yahoo.com" - } - ], - "directories": {}, - "_shasum": "0edd22286e3a111b9a2a70db363e925e867f6aca", - "_resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/.npmignore deleted file mode 100644 index efab07f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -test -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/LICENSE deleted file mode 100644 index 249d9de..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -// MIT License - -Copyright (C) Roman Shtylman - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/README.md deleted file mode 100644 index 3170b4b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# cookie [![Build Status](https://secure.travis-ci.org/defunctzombie/node-cookie.png?branch=master)](http://travis-ci.org/defunctzombie/node-cookie) # - -cookie is a basic cookie parser and serializer. It doesn't make assumptions about how you are going to deal with your cookies. It basically just provides a way to read and write the HTTP cookie headers. - -See [RFC6265](http://tools.ietf.org/html/rfc6265) for details about the http header for cookies. - -## how? - -``` -npm install cookie -``` - -```javascript -var cookie = require('cookie'); - -var hdr = cookie.serialize('foo', 'bar'); -// hdr = 'foo=bar'; - -var cookies = cookie.parse('foo=bar; cat=meow; dog=ruff'); -// cookies = { foo: 'bar', cat: 'meow', dog: 'ruff' }; -``` - -## more - -The serialize function takes a third parameter, an object, to set cookie options. See the RFC for valid values. - -### path -> cookie path - -### expires -> absolute expiration date for the cookie (Date object) - -### maxAge -> relative max age of the cookie from when the client receives it (seconds) - -### domain -> domain for the cookie - -### secure -> true or false - -### httpOnly -> true or false - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/index.js deleted file mode 100644 index 00d54a7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/index.js +++ /dev/null @@ -1,75 +0,0 @@ - -/// Serialize the a name value pair into a cookie string suitable for -/// http headers. An optional options object specified cookie parameters -/// -/// serialize('foo', 'bar', { httpOnly: true }) -/// => "foo=bar; httpOnly" -/// -/// @param {String} name -/// @param {String} val -/// @param {Object} options -/// @return {String} -var serialize = function(name, val, opt){ - opt = opt || {}; - var enc = opt.encode || encode; - var pairs = [name + '=' + enc(val)]; - - if (null != opt.maxAge) { - var maxAge = opt.maxAge - 0; - if (isNaN(maxAge)) throw new Error('maxAge should be a Number'); - pairs.push('Max-Age=' + maxAge); - } - - if (opt.domain) pairs.push('Domain=' + opt.domain); - if (opt.path) pairs.push('Path=' + opt.path); - if (opt.expires) pairs.push('Expires=' + opt.expires.toUTCString()); - if (opt.httpOnly) pairs.push('HttpOnly'); - if (opt.secure) pairs.push('Secure'); - - return pairs.join('; '); -}; - -/// Parse the given cookie header string into an object -/// The object has the various cookies as keys(names) => values -/// @param {String} str -/// @return {Object} -var parse = function(str, opt) { - opt = opt || {}; - var obj = {} - var pairs = str.split(/; */); - var dec = opt.decode || decode; - - pairs.forEach(function(pair) { - var eq_idx = pair.indexOf('=') - - // skip things that don't look like key=value - if (eq_idx < 0) { - return; - } - - var key = pair.substr(0, eq_idx).trim() - var val = pair.substr(++eq_idx, pair.length).trim(); - - // quoted values - if ('"' == val[0]) { - val = val.slice(1, -1); - } - - // only assign once - if (undefined == obj[key]) { - try { - obj[key] = dec(val); - } catch (e) { - obj[key] = val; - } - } - }); - - return obj; -}; - -var encode = encodeURIComponent; -var decode = decodeURIComponent; - -module.exports.serialize = serialize; -module.exports.parse = parse; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/package.json deleted file mode 100644 index 7dbb395..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/cookie/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "author": { - "name": "Roman Shtylman", - "email": "shtylman@gmail.com" - }, - "name": "cookie", - "description": "cookie parsing and serialization", - "version": "0.1.2", - "repository": { - "type": "git", - "url": "git://github.com/shtylman/node-cookie.git" - }, - "keywords": [ - "cookie", - "cookies" - ], - "main": "index.js", - "scripts": { - "test": "mocha" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "1.x.x" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "bugs": { - "url": "https://github.com/shtylman/node-cookie/issues" - }, - "homepage": "https://github.com/shtylman/node-cookie", - "_id": "cookie@0.1.2", - "dist": { - "shasum": "72fec3d24e48a3432073d90c12642005061004b1", - "tarball": "http://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz" - }, - "_from": "cookie@0.1.2", - "_npmVersion": "1.4.6", - "_npmUser": { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - "maintainers": [ - { - "name": "shtylman", - "email": "shtylman@gmail.com" - } - ], - "directories": {}, - "_shasum": "72fec3d24e48a3432073d90c12642005061004b1", - "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.jshintrc b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.jshintrc deleted file mode 100644 index 299877f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.jshintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "laxbreak": true -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.npmignore deleted file mode 100644 index 7e6163d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -support -test -examples -example -*.sock -dist diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/History.md deleted file mode 100644 index 3b96560..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/History.md +++ /dev/null @@ -1,144 +0,0 @@ - -1.0.4 / 2014-07-15 -================== - - * dist: recompile - * example: remove `console.info()` log usage - * example: add "Content-Type" UTF-8 header to browser example - * browser: place %c marker after the space character - * browser: reset the "content" color via `color: inherit` - * browser: add colors support for Firefox >= v31 - * debug: prefer an instance `log()` function over the global one (#119) - * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) - -1.0.3 / 2014-07-09 -================== - - * Add support for multiple wildcards in namespaces (#122, @seegno) - * browser: fix lint - -1.0.2 / 2014-06-10 -================== - - * browser: update color palette (#113, @gscottolson) - * common: make console logging function configurable (#108, @timoxley) - * node: fix %o colors on old node <= 0.8.x - * Makefile: find node path using shell/which (#109, @timoxley) - -1.0.1 / 2014-06-06 -================== - - * browser: use `removeItem()` to clear localStorage - * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) - * package: add "contributors" section - * node: fix comment typo - * README: list authors - -1.0.0 / 2014-06-04 -================== - - * make ms diff be global, not be scope - * debug: ignore empty strings in enable() - * node: make DEBUG_COLORS able to disable coloring - * *: export the `colors` array - * npmignore: don't publish the `dist` dir - * Makefile: refactor to use browserify - * package: add "browserify" as a dev dependency - * Readme: add Web Inspector Colors section - * node: reset terminal color for the debug content - * node: map "%o" to `util.inspect()` - * browser: map "%j" to `JSON.stringify()` - * debug: add custom "formatters" - * debug: use "ms" module for humanizing the diff - * Readme: add "bash" syntax highlighting - * browser: add Firebug color support - * browser: add colors for WebKit browsers - * node: apply log to `console` - * rewrite: abstract common logic for Node & browsers - * add .jshintrc file - -0.8.1 / 2014-04-14 -================== - - * package: re-add the "component" section - -0.8.0 / 2014-03-30 -================== - - * add `enable()` method for nodejs. Closes #27 - * change from stderr to stdout - * remove unnecessary index.js file - -0.7.4 / 2013-11-13 -================== - - * remove "browserify" key from package.json (fixes something in browserify) - -0.7.3 / 2013-10-30 -================== - - * fix: catch localStorage security error when cookies are blocked (Chrome) - * add debug(err) support. Closes #46 - * add .browser prop to package.json. Closes #42 - -0.7.2 / 2013-02-06 -================== - - * fix package.json - * fix: Mobile Safari (private mode) is broken with debug - * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript - -0.7.1 / 2013-02-05 -================== - - * add repository URL to package.json - * add DEBUG_COLORED to force colored output - * add browserify support - * fix component. Closes #24 - -0.7.0 / 2012-05-04 -================== - - * Added .component to package.json - * Added debug.component.js build - -0.6.0 / 2012-03-16 -================== - - * Added support for "-" prefix in DEBUG [Vinay Pulim] - * Added `.enabled` flag to the node version [TooTallNate] - -0.5.0 / 2012-02-02 -================== - - * Added: humanize diffs. Closes #8 - * Added `debug.disable()` to the CS variant - * Removed padding. Closes #10 - * Fixed: persist client-side variant again. Closes #9 - -0.4.0 / 2012-02-01 -================== - - * Added browser variant support for older browsers [TooTallNate] - * Added `debug.enable('project:*')` to browser variant [TooTallNate] - * Added padding to diff (moved it to the right) - -0.3.0 / 2012-01-26 -================== - - * Added millisecond diff when isatty, otherwise UTC string - -0.2.0 / 2012-01-22 -================== - - * Added wildcard support - -0.1.0 / 2011-12-02 -================== - - * Added: remove colors unless stderr isatty [TooTallNate] - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Makefile deleted file mode 100644 index b0bde6e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Makefile +++ /dev/null @@ -1,33 +0,0 @@ - -# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 -THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) -THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) - -# BIN directory -BIN := $(THIS_DIR)/node_modules/.bin - -# applications -NODE ?= $(shell which node) -NPM ?= $(NODE) $(shell which npm) -BROWSERIFY ?= $(NODE) $(BIN)/browserify - -all: dist/debug.js - -install: node_modules - -clean: - @rm -rf node_modules dist - -dist: - @mkdir -p $@ - -dist/debug.js: node_modules browser.js debug.js dist - @$(BROWSERIFY) \ - --standalone debug \ - . > $@ - -node_modules: package.json - @NODE_ENV= $(NPM) install - @touch node_modules - -.PHONY: all install clean diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Readme.md deleted file mode 100644 index e59b9ad..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/Readme.md +++ /dev/null @@ -1,156 +0,0 @@ -# debug - - tiny node.js debugging utility modelled after node core's debugging technique. - -## Installation - -```bash -$ npm install debug -``` - -## Usage - - With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility. - -Example _app.js_: - -```js -var debug = require('debug')('http') - , http = require('http') - , name = 'My App'; - -// fake app - -debug('booting %s', name); - -http.createServer(function(req, res){ - debug(req.method + ' ' + req.url); - res.end('hello\n'); -}).listen(3000, function(){ - debug('listening'); -}); - -// fake worker of some kind - -require('./worker'); -``` - -Example _worker.js_: - -```js -var debug = require('debug')('worker'); - -setInterval(function(){ - debug('doing some work'); -}, 1000); -``` - - The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: - - ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) - - ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) - -## Millisecond diff - - When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. - - ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) - - When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: - - ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) - -## Conventions - - If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". - -## Wildcards - - The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect.compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. - - You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:". - -## Browser support - - Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. - -```js -a = debug('worker:a'); -b = debug('worker:b'); - -setInterval(function(){ - a('doing some work'); -}, 1000); - -setInterval(function(){ - b('doing some work'); -}, 1200); -``` - -#### Web Inspector Colors - - Colors are also enabled on "Web Inspectors" that understand the `%c` formatting - option. These are WebKit web inspectors, Firefox ([since version - 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) - and the Firebug plugin for Firefox (any version). - - Colored output looks something like: - - ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) - -### stderr vs stdout - -You can set an alternative logging method per-namespace by overriding the `log` method on a per-namespace or globally: - -Example _stderr.js_: - -```js -var debug = require('../'); -var log = debug('app:log'); - -// by default console.log is used -log('goes to stdout!'); - -var error = debug('app:error'); -// set this namespace to log via console.error -error.log = console.error.bind(console); // don't forget to bind to console! -error('goes to stderr'); -log('still goes to stdout!'); - -// set all output to go via console.warn -// overrides all per-namespace log settings -debug.log = console.warn.bind(console); -log('now goes to stderr via console.warn'); -error('still goes to stderr, but via console.warn now'); -``` - -## Authors - - - TJ Holowaychuk - - Nathan Rajlich - -## License - -(The MIT License) - -Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/browser.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/browser.js deleted file mode 100644 index ce6369f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/browser.js +++ /dev/null @@ -1,147 +0,0 @@ - -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // is webkit? http://stackoverflow.com/a/16459606/376773 - return ('WebkitAppearance' in document.documentElement.style) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (window.console && (console.firebug || (console.exception && console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - return JSON.stringify(v); -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs() { - var args = arguments; - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return args; - - var c = 'color: ' + this.color; - args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1)); - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); - return args; -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // This hackery is required for IE8, - // where the `console.log` function doesn't have 'apply' - return 'object' == typeof console - && 'function' == typeof console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - localStorage.removeItem('debug'); - } else { - localStorage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - var r; - try { - r = localStorage.debug; - } catch(e) {} - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/component.json deleted file mode 100644 index ab5f3ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/component.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "debug", - "repo": "visionmedia/debug", - "description": "small debugging utility", - "version": "1.0.4", - "keywords": [ - "debug", - "log", - "debugger" - ], - "main": "browser.js", - "scripts": [ - "browser.js", - "debug.js" - ], - "dependencies": { - "guille/ms.js": "0.6.1" - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/debug.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/debug.js deleted file mode 100644 index 7571a86..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/debug.js +++ /dev/null @@ -1,197 +0,0 @@ - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = debug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = require('ms'); - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lowercased letter, i.e. "n". - */ - -exports.formatters = {}; - -/** - * Previously assigned color. - */ - -var prevColor = 0; - -/** - * Previous log timestamp. - */ - -var prevTime; - -/** - * Select a color. - * - * @return {Number} - * @api private - */ - -function selectColor() { - return exports.colors[prevColor++ % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function debug(namespace) { - - // define the `disabled` version - function disabled() { - } - disabled.enabled = false; - - // define the `enabled` version - function enabled() { - - var self = enabled; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // add the `color` if not set - if (null == self.useColors) self.useColors = exports.useColors(); - if (null == self.color && self.useColors) self.color = selectColor(); - - var args = Array.prototype.slice.call(arguments); - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %o - args = ['%o'].concat(args); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - if ('function' === typeof exports.formatArgs) { - args = exports.formatArgs.apply(self, args); - } - var logFn = enabled.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - enabled.enabled = true; - - var fn = exports.enabled(namespace) ? enabled : disabled; - - fn.namespace = namespace; - - return fn; -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - var split = (namespaces || '').split(/[\s,]+/); - var len = split.length; - - for (var i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node.js deleted file mode 100644 index c94f7d1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node.js +++ /dev/null @@ -1,129 +0,0 @@ - -/** - * Module dependencies. - */ - -var tty = require('tty'); -var util = require('util'); - -/** - * This is the Node.js implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - var debugColors = (process.env.DEBUG_COLORS || '').trim().toLowerCase(); - if (0 === debugColors.length) { - return tty.isatty(1); - } else { - return '0' !== debugColors - && 'no' !== debugColors - && 'false' !== debugColors - && 'disabled' !== debugColors; - } -} - -/** - * Map %o to `util.inspect()`, since Node doesn't do that out of the box. - */ - -var inspect = (4 === util.inspect.length ? - // node <= 0.8.x - function (v, colors) { - return util.inspect(v, void 0, void 0, colors); - } : - // node > 0.8.x - function (v, colors) { - return util.inspect(v, { colors: colors }); - } -); - -exports.formatters.o = function(v) { - return inspect(v, this.useColors) - .replace(/\s*\n\s*/g, ' '); -}; - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs() { - var args = arguments; - var useColors = this.useColors; - var name = this.namespace; - - if (useColors) { - var c = this.color; - - args[0] = ' \u001b[9' + c + 'm' + name + ' ' - + '\u001b[0m' - + args[0] + '\u001b[3' + c + 'm' - + ' +' + exports.humanize(this.diff) + '\u001b[0m'; - } else { - args[0] = new Date().toUTCString() - + ' ' + name + ' ' + args[0]; - } - return args; -} - -/** - * Invokes `console.log()` with the specified arguments. - */ - -function log() { - return console.log.apply(console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ - -exports.enable(load()); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/README.md deleted file mode 100644 index d4ab12a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours', { long: true })) // "10 hours" -``` - -- Node/Browser compatible. Published as `ms` in NPM. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/index.js deleted file mode 100644 index c5847f8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/package.json deleted file mode 100644 index c4dd654..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/node_modules/ms/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "ms", - "version": "0.6.2", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "readme": "# ms.js: miliseconds conversion utility\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('100') // 100\n```\n\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(ms('10 hours', { long: true })) // \"10 hours\"\n```\n\n- Node/Browser compatible. Published as `ms` in NPM.\n- If a number is supplied to `ms`, a string with a unit is returned.\n- If a string that contains the number is supplied, it returns it as\na number (e.g: it returns `100` for `'100'`).\n- If you pass a string with a number and a valid unit, the number of\nequivalent ms is returned.\n\n## License\n\nMIT", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "_id": "ms@0.6.2", - "dist": { - "shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - }, - "_from": "ms@0.6.2", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "directories": {}, - "_shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "homepage": "https://github.com/guille/ms.js" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/package.json deleted file mode 100644 index 823c26d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/debug/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "debug", - "version": "1.0.4", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/debug.git" - }, - "description": "small debugging utility", - "keywords": [ - "debug", - "log", - "debugger" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Nathan Rajlich", - "email": "nathan@tootallnate.net", - "url": "http://n8.io" - } - ], - "dependencies": { - "ms": "0.6.2" - }, - "devDependencies": { - "browserify": "4.1.6", - "mocha": "*" - }, - "main": "./node.js", - "browser": "./browser.js", - "component": { - "scripts": { - "debug/index.js": "browser.js", - "debug/debug.js": "debug.js" - } - }, - "gitHead": "abc10a5912f79d251752d18350e269fe0b0fbbf9", - "bugs": { - "url": "https://github.com/visionmedia/debug/issues" - }, - "homepage": "https://github.com/visionmedia/debug", - "_id": "debug@1.0.4", - "scripts": {}, - "_shasum": "5b9c256bd54b6ec02283176fa8a0ede6d154cbf8", - "_from": "debug@1.0.4", - "_npmVersion": "1.4.14", - "_npmUser": { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - } - ], - "dist": { - "shasum": "5b9c256bd54b6ec02283176fa8a0ede6d154cbf8", - "tarball": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/.npmignore deleted file mode 100644 index 0c7e391..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -coverage/ -files/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/History.md deleted file mode 100644 index ba1af12..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/History.md +++ /dev/null @@ -1,56 +0,0 @@ -0.4.4 / 2014-07-27 -================== - - * Work-around v8 generating empty stack traces - -0.4.3 / 2014-07-26 -================== - - * Fix exception when global `Error.stackTraceLimit` is too low - -0.4.2 / 2014-07-19 -================== - - * Correct call site for wrapped functions and properties - -0.4.1 / 2014-07-19 -================== - - * Improve automatic message generation for function properties - -0.4.0 / 2014-07-19 -================== - - * Add `TRACE_DEPRECATION` environment variable - * Remove non-standard grey color from color output - * Support `--no-deprecation` argument - * Support `--trace-deprecation` argument - * Support `deprecate.property(fn, prop, message)` - -0.3.0 / 2014-06-16 -================== - - * Add `NO_DEPRECATION` environment variable - -0.2.0 / 2014-06-15 -================== - - * Add `deprecate.property(obj, prop, message)` - * Remove `supports-color` dependency for node.js 0.8 - -0.1.0 / 2014-06-15 -================== - - * Add `deprecate.function(fn, message)` - * Add `process.on('deprecation', fn)` emitter - * Automatically generate message when omitted from `deprecate()` - -0.0.1 / 2014-06-15 -================== - - * Fix warning for dynamic calls at singe call site - -0.0.0 / 2014-06-15 -================== - - * Initial implementation diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/Readme.md deleted file mode 100644 index 47a53a1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/Readme.md +++ /dev/null @@ -1,272 +0,0 @@ -# depd - -[![NPM version](https://badge.fury.io/js/depd.svg)](http://badge.fury.io/js/depd) -[![Build Status](https://travis-ci.org/dougwilson/nodejs-depd.svg?branch=master)](https://travis-ci.org/dougwilson/nodejs-depd) -[![Coverage Status](https://img.shields.io/coveralls/dougwilson/nodejs-depd.svg?branch=master)](https://coveralls.io/r/dougwilson/nodejs-depd) -[![Gittip](http://img.shields.io/gittip/dougwilson.svg)](https://www.gittip.com/dougwilson/) - -Deprecate all the things - -> With great modules comes great responsibility; mark things deprecated! - -## Install - -```sh -$ npm install depd -``` - -## API - -```js -var deprecate = require('depd')('my-module') -``` - -This library allows you to display deprecation messages to your users. -This library goes above and beyond with deprecation warnings by -introspecting the call stack (but only the bits that it is interested -in). - -Instead of just warning on the first invocation of a deprecated -function and never again, this module will warn on the first invocation -of a deprecated function per unique call site, making it ideal to alert -users of all deprecated uses across the code base, rather than just -whatever happens to execute first. - -The deprecation warnings from this module also include the file and line -information for the call into the module that the deprecated function was -in. - -### depd(namespace) - -Create a new deprecate function that uses the given namespace name in the -messages and will display the call site prior to the stack entering the -file this function was called from. It is highly suggested you use the -name of your module as the namespace. - -### deprecate(message) - -Call this function from deprecated code to display a deprecation message. -This message will appear once per unique caller site. Caller site is the -first call site in the stack in a different file from the caller of this -function. - -If the message is omitted, a message is generated for you based on the site -of the `deprecate()` call and will display the name of the function called, -similar to the name displayed in a stack trace. - -### deprecate.function(fn, message) - -Call this function to wrap a given function in a deprecation message on any -call to the function. An optional message can be supplied to provide a custom -message. - -### deprecate.property(obj, prop, message) - -Call this function to wrap a given property on object in a deprecation message -on any accessing or setting of the property. An optional message can be supplied -to provide a custom message. - -The method must be called on the object where the property belongs (not -inherited from the prototype). - -If the property is a data descriptor, it will be converted to an accessor -descriptor in order to display the deprecation message. - -### process.on('deprecation', fn) - -This module will allow easy capturing of deprecation errors by emitting the -errors as the type "deprecation" on the global `process`. If there are no -listeners for this type, the errors are written to STDERR as normal, but if -there are any listeners, nothing will be written to STDERR and instead only -emitted. From there, you can write the errors in a different format or to a -logging source. - -The error represents the deprecation and is emitted only once with the same -rules as writing to STDERR. The error has the following properties: - - - `message` - This is the message given by the library - - `name` - This is always `'DeprecationError'` - - `namespace` - This is the namespace the deprecation came from - - `stack` - This is the stack of the call to the deprecated thing - -Example `error.stack` output: - -``` -DeprecationError: my-cool-module deprecated oldfunction - at Object. ([eval]-wrapper:6:22) - at Module._compile (module.js:456:26) - at evalScript (node.js:532:25) - at startup (node.js:80:7) - at node.js:902:3 -``` - -### process.env.NO_DEPRECATION - -As a user of modules that are deprecated, the environment variable `NO_DEPRECATION` -is provided as a quick solution to silencing deprecation warnings from being -output. The format of this is similar to that of `DEBUG`: - -```sh -$ NO_DEPRECATION=my-module,othermod node app.js -``` - -This will suppress deprecations from being output for "my-module" and "othermod". -The value is a list of comma-separated namespaces. To suppress every warning -across all namespaces, use the value `*` for a namespace. - -Providing the argument `--no-deprecation` to the `node` executable will suppress -all deprecations. - -**NOTE** This will not suppress the deperecations given to any "deprecation" -event listeners, just the output to STDERR. - -### process.env.TRACE_DEPRECATION - -As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION` -is provided as a solution to getting more detailed location information in deprecation -warnings by including the entire stack trace. The format of this is the same as -`NO_DEPRECATION`: - -```sh -$ TRACE_DEPRECATION=my-module,othermod node app.js -``` - -This will include stack traces for deprecations being output for "my-module" and -"othermod". The value is a list of comma-separated namespaces. To trace every -warning across all namespaces, use the value `*` for a namespace. - -Providing the argument `--trace-deprecation` to the `node` executable will trace -all deprecations. - -**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`. - -## Display - -![message](files/message.png) - -When a user calls a function in your library that you mark deprecated, they -will see the following written to STDERR (in the given colors, similar colors -and layout to the `debug` module): - -``` -bright cyan bright yellow -| | reset cyan -| | | | -▼ ▼ ▼ ▼ -my-cool-module deprecated oldfunction [eval]-wrapper:6:22 -▲ ▲ ▲ ▲ -| | | | -namespace | | location of mycoolmod.oldfunction() call - | deprecation message - the word "deprecated" -``` - -If the user redirects their STDERR to a file or somewhere that does not support -colors, they see (similar layout to the `debug` module): - -``` -Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22 -▲ ▲ ▲ ▲ ▲ -| | | | | -timestamp of message namespace | | location of mycoolmod.oldfunction() call - | deprecation message - the word "deprecated" -``` - -## Examples - -### Deprecating all calls to a function - -This will display a deprecated message about "oldfunction" being deprecated -from "my-module" on STDERR. - -```js -var deprecate = require('depd')('my-cool-module') - -// message automatically derived from function name -// Object.oldfunction -exports.oldfunction = deprecate.function(function oldfunction() { - // all calls to function are deprecated -}) - -// specific message -exports.oldfunction = deprecate.function(function () { - // all calls to function are deprecated -}, 'oldfunction') -``` - -### Conditionally deprecating a function call - -This will display a deprecated message about "weirdfunction" being deprecated -from "my-module" on STDERR when called with less than 2 arguments. - -```js -var deprecate = require('depd')('my-cool-module') - -exports.weirdfunction = function () { - if (arguments.length < 2) { - // calls with 0 or 1 args are deprecated - deprecate('weirdfunction args < 2') - } -} -``` - -When calling `deprecate` as a function, the warning is counted per call site -within your own module, so you can display different deprecations depending -on different situations and the users will still get all the warnings: - -```js -var deprecate = require('depd')('my-cool-module') - -exports.weirdfunction = function () { - if (arguments.length < 2) { - // calls with 0 or 1 args are deprecated - deprecate('weirdfunction args < 2') - } else if (typeof arguments[0] !== 'string') { - // calls with non-string first argument are deprecated - deprecate('weirdfunction non-string first arg') - } -} -``` - -### Deprecating property access - -This will display a deprecated message about "oldprop" being deprecated -from "my-module" on STDERR when accessed. A deprecation will be displayed -when setting the value and when getting the value. - -```js -var deprecate = require('depd')('my-cool-module') - -exports.oldprop = 'something' - -// message automatically derives from property name -deprecate.property(exports, 'oldprop') - -// explicit message -deprecate.property(exports, 'oldprop', 'oldprop >= 0.10') -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/index.js deleted file mode 100644 index a6fb372..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/index.js +++ /dev/null @@ -1,520 +0,0 @@ -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter -var relative = require('path').relative - -/** - * Module exports. - */ - -module.exports = depd - -/** - * Get the path to base files on. - */ - -var basePath = process.cwd() - -/** - * Get listener count on event emitter. - */ - -/*istanbul ignore next*/ -var eventListenerCount = EventEmitter.listenerCount - || function (emitter, type) { return emitter.listeners(type).length } - -/** - * Determine if namespace is contained in the string. - */ - -function containsNamespace(str, namespace) { - var val = str.split(/[ ,]+/) - - namespace = String(namespace).toLowerCase() - - for (var i = 0 ; i < val.length; i++) { - if (!(str = val[i])) continue; - - // namespace contained - if (str === '*' || str.toLowerCase() === namespace) { - return true - } - } - - return false -} - -/** - * Convert a data descriptor to accessor descriptor. - */ - -function convertDataDescriptorToAccessor(obj, prop, message) { - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - var value = descriptor.value - - descriptor.get = function getter() { return value } - - if (descriptor.writable) { - descriptor.set = function setter(val) { return value = val } - } - - delete descriptor.value - delete descriptor.writable - - Object.defineProperty(obj, prop, descriptor) - - return descriptor -} - -/** - * Create arguments string to keep arity. - */ - -function createArgumentsString(arity) { - var str = '' - - for (var i = 0; i < arity; i++) { - str += ', arg' + i - } - - return str.substr(2) -} - -/** - * Create stack string from stack. - */ - -function createStackString(stack) { - var str = this.name + ': ' + this.namespace - - if (this.message) { - str += ' deprecated ' + this.message - } - - for (var i = 0; i < stack.length; i++) { - str += '\n at ' + stack[i].toString() - } - - return str -} - -/** - * Create deprecate for namespace in caller. - */ - -function depd(namespace) { - if (!namespace) { - throw new TypeError('argument namespace is required') - } - - var stack = getStack() - var site = callSiteLocation(stack[1]) - var file = site[0] - - function deprecate(message) { - // call to self as log - log.call(deprecate, message) - } - - deprecate._file = file - deprecate._ignored = isignored(namespace) - deprecate._namespace = namespace - deprecate._traced = istraced(namespace) - deprecate._warned = Object.create(null) - - deprecate.function = wrapfunction - deprecate.property = wrapproperty - - return deprecate -} - -/** - * Determine if namespace is ignored. - */ - -function isignored(namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.noDeprecation) { - // --no-deprecation support - return true - } - - var str = process.env.NO_DEPRECATION || '' - - // namespace ignored - return containsNamespace(str, namespace) -} - -/** - * Determine if namespace is traced. - */ - -function istraced(namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.traceDeprecation) { - // --trace-deprecation support - return true - } - - var str = process.env.TRACE_DEPRECATION || '' - - // namespace traced - return containsNamespace(str, namespace) -} - -/** - * Display deprecation message. - */ - -function log(message, site) { - var haslisteners = eventListenerCount(process, 'deprecation') !== 0 - - // abort early if no destination - if (!haslisteners && this._ignored) { - return - } - - var caller - var callFile - var callSite - var i = 0 - var seen = false - var stack = getStack() - var file = this._file - - if (site) { - // provided site - callSite = callSiteLocation(stack[1]) - callSite.name = site.name - file = callSite[0] - } else { - // get call site - i = 2 - site = callSiteLocation(stack[i]) - callSite = site - } - - // get caller of deprecated thing in relation to file - for (; i < stack.length; i++) { - caller = callSiteLocation(stack[i]) - callFile = caller[0] - - if (callFile === file) { - seen = true - } else if (callFile === this._file) { - file = this._file - } else if (seen) { - break - } - } - - var key = caller - ? site.join(':') + '__' + caller.join(':') - : undefined - - if (key !== undefined && key in this._warned) { - // already warned - return - } - - this._warned[key] = true - - // generate automatic message from call site - if (!message) { - message = callSite === site || !callSite.name - ? defaultMessage(site) - : defaultMessage(callSite) - } - - // emit deprecation if listeners exist - if (haslisteners) { - var err = DeprecationError(this._namespace, message, stack.slice(i)) - process.emit('deprecation', err) - return - } - - // format and write message - var format = process.stderr.isTTY - ? formatColor - : formatPlain - var msg = format.call(this, message, caller, stack.slice(i)) - process.stderr.write(msg + '\n', 'utf8') - - return -} - -/** - * Get call site location as array. - */ - -function callSiteLocation(callSite) { - var file = callSite.getFileName() || '' - var line = callSite.getLineNumber() - var colm = callSite.getColumnNumber() - - if (callSite.isEval()) { - file = callSite.getEvalOrigin() + ', ' + file - } - - var site = [file, line, colm] - - site.callSite = callSite - site.name = callSite.getFunctionName() - - return site -} - -/** - * Generate a default message from the site. - */ - -function defaultMessage(site) { - var callSite = site.callSite - var funcName = site.name - var typeName = callSite.getTypeName() - - // make useful anonymous name - if (!funcName) { - funcName = '' - } - - // make useful type name - if (typeName === 'Function') { - typeName = callSite.getThis().name || typeName - } - - return callSite.getMethodName() - ? typeName + '.' + funcName - : funcName -} - -/** - * Format deprecation message without color. - */ - -function formatPlain(msg, caller, stack) { - var timestamp = new Date().toUTCString() - - var formatted = timestamp - + ' ' + this._namespace - + ' deprecated ' + msg - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n at ' + stack[i].toString() - } - - return formatted - } - - if (caller) { - formatted += ' at ' + formatLocation(caller) - } - - return formatted -} - -/** - * Format deprecation message with color. - */ - -function formatColor(msg, caller, stack) { - var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' // bold cyan - + ' \x1b[33;1mdeprecated\x1b[22;39m' // bold yellow - + ' \x1b[0m' + msg + '\x1b[39m' // reset - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n \x1b[36mat ' + stack[i].toString() + '\x1b[39m' // cyan - } - - return formatted - } - - if (caller) { - formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan - } - - return formatted -} - -/** - * Format call site location. - */ - -function formatLocation(callSite) { - return relative(basePath, callSite[0]) - + ':' + callSite[1] - + ':' + callSite[2] -} - -/** - * Get the stack as array of call sites. - */ - -function getStack() { - var limit = Error.stackTraceLimit - var obj = {} - var prep = Error.prepareStackTrace - - Error.prepareStackTrace = prepareObjectStackTrace - Error.stackTraceLimit = Math.max(10, limit) - - // capture the stack - Error.captureStackTrace(obj) - - // slice this function off the top - var stack = obj.stack.slice(1) - - Error.prepareStackTrace = prep - Error.stackTraceLimit = limit - - return stack -} - -/** - * Capture call site stack from v8. - */ - -function prepareObjectStackTrace(obj, stack) { - return stack -} - -/** - * Return a wrapped function in a deprecation message. - */ - -function wrapfunction(fn, message) { - if (typeof fn !== 'function') { - throw new TypeError('argument fn must be a function') - } - - var args = createArgumentsString(fn.length) - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - site.name = fn.name - - var deprecatedfn = eval('(function (' + args + ') {\n' - + 'log.call(deprecate, message, site)\n' - + 'return fn.apply(this, arguments)\n' - + '})') - - return deprecatedfn -} - -/** - * Wrap property in a deprecation message. - */ - -function wrapproperty(obj, prop, message) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - throw new TypeError('argument obj must be object') - } - - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - - if (!descriptor) { - throw new TypeError('must call property on owner object') - } - - if (!descriptor.configurable) { - throw new TypeError('property must be configurable') - } - - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - // set site name - site.name = prop - - // convert data descriptor - if ('value' in descriptor) { - descriptor = convertDataDescriptorToAccessor(obj, prop, message) - } - - var get = descriptor.get - var set = descriptor.set - - // wrap getter - if (typeof get === 'function') { - descriptor.get = function getter() { - log.call(deprecate, message, site) - return get.apply(this, arguments) - } - } - - // wrap setter - if (typeof set === 'function') { - descriptor.set = function setter() { - log.call(deprecate, message, site) - return set.apply(this, arguments) - } - } - - Object.defineProperty(obj, prop, descriptor) -} - -/** - * Create DeprecationError for deprecation - */ - -function DeprecationError(namespace, message, stack) { - var error = new Error() - var stackString - - Object.defineProperty(error, 'constructor', { - value: DeprecationError - }) - - Object.defineProperty(error, 'message', { - configurable: true, - enumerable: false, - value: message, - writable: true - }) - - Object.defineProperty(error, 'name', { - enumerable: false, - configurable: true, - value: 'DeprecationError', - writable: true - }) - - Object.defineProperty(error, 'namespace', { - configurable: true, - enumerable: false, - value: namespace, - writable: true - }) - - Object.defineProperty(error, 'stack', { - configurable: true, - enumerable: false, - get: function () { - if (stackString !== undefined) { - return stackString - } - - // prepare stack trace - return stackString = createStackString.call(this, stack) - }, - set: function setter(val) { - stackString = val - } - }) - - return error -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/package.json deleted file mode 100644 index 6935dc5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/depd/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "depd", - "description": "Deprecate all the things", - "version": "0.4.4", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "deprecate", - "deprecated" - ], - "repository": { - "type": "git", - "url": "git://github.com/dougwilson/nodejs-depd" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.20.1", - "should": "~4.0.4" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec --bail --require should test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --require should test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --require should test/" - }, - "bugs": { - "url": "https://github.com/dougwilson/nodejs-depd/issues" - }, - "homepage": "https://github.com/dougwilson/nodejs-depd", - "_id": "depd@0.4.4", - "dist": { - "shasum": "07091fae75f97828d89b4a02a2d4778f0e7c0662", - "tarball": "http://registry.npmjs.org/depd/-/depd-0.4.4.tgz" - }, - "_from": "depd@0.4.4", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "07091fae75f97828d89b4a02a2d4778f0e7c0662", - "_resolved": "https://registry.npmjs.org/depd/-/depd-0.4.4.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/.npmignore deleted file mode 100644 index 48a2e24..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -components -build diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Makefile deleted file mode 100644 index 3f6119d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Makefile +++ /dev/null @@ -1,11 +0,0 @@ - -build: components index.js - @component build - -components: - @Component install - -clean: - rm -fr build components template.js - -.PHONY: clean diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Readme.md deleted file mode 100644 index 2cfcc99..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/Readme.md +++ /dev/null @@ -1,15 +0,0 @@ - -# escape-html - - Escape HTML entities - -## Example - -```js -var escape = require('escape-html'); -escape(str); -``` - -## License - - MIT \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/component.json deleted file mode 100644 index cb9740f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/component.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "escape-html", - "description": "Escape HTML entities", - "version": "1.0.1", - "keywords": ["escape", "html", "utility"], - "dependencies": {}, - "scripts": [ - "index.js" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/index.js deleted file mode 100644 index 2765211..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/index.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Escape special characters in the given string of html. - * - * @param {String} html - * @return {String} - * @api private - */ - -module.exports = function(html) { - return String(html) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(//g, '>'); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/package.json deleted file mode 100644 index ee240f0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/escape-html/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "escape-html", - "description": "Escape HTML entities", - "version": "1.0.1", - "keywords": [ - "escape", - "html", - "utility" - ], - "dependencies": {}, - "main": "index.js", - "component": { - "scripts": { - "escape-html/index.js": "index.js" - } - }, - "repository": { - "type": "git", - "url": "https://github.com/component/escape-html.git" - }, - "readme": "\n# escape-html\n\n Escape HTML entities\n\n## Example\n\n```js\nvar escape = require('escape-html');\nescape(str);\n```\n\n## License\n\n MIT", - "readmeFilename": "Readme.md", - "bugs": { - "url": "https://github.com/component/escape-html/issues" - }, - "homepage": "https://github.com/component/escape-html", - "_id": "escape-html@1.0.1", - "dist": { - "shasum": "181a286ead397a39a92857cfb1d43052e356bff0", - "tarball": "http://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz" - }, - "_from": "escape-html@1.0.1", - "_npmVersion": "1.3.15", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "181a286ead397a39a92857cfb1d43052e356bff0", - "_resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/HISTORY.md deleted file mode 100644 index 236e95e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/HISTORY.md +++ /dev/null @@ -1,27 +0,0 @@ -0.1.0 / 2014-07-16 -================== - - * Respond after request fully read - - prevents hung responses and socket hang ups - * deps: debug@1.0.4 - -0.0.3 / 2014-07-11 -================== - - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.0.2 / 2014-06-19 -================== - - * Handle invalid status codes - -0.0.1 / 2014-06-05 -================== - - * deps: debug@1.0.2 - -0.0.0 / 2014-06-05 -================== - - * Extracted from connect/express diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/README.md deleted file mode 100644 index c701e3a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/README.md +++ /dev/null @@ -1,140 +0,0 @@ -# finalhandler - -[![NPM version](https://badge.fury.io/js/finalhandler.svg)](https://badge.fury.io/js/finalhandler) -[![Build Status](https://travis-ci.org/expressjs/finalhandler.svg?branch=master)](https://travis-ci.org/expressjs/finalhandler) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/finalhandler.svg?branch=master)](https://coveralls.io/r/expressjs/finalhandler) - -Node.js function to invoke as the final step to respond to HTTP request. - -## Installation - -```sh -$ npm install finalhandler -``` - -## API - -```js -var finalhandler = require('finalhandler') -``` - -### finalhandler(req, res, [options]) - -Returns function to be invoked as the final step for the given `req` and `res`. -This function is to be invoked as `fn(err)`. If `err` is falsy, the handler will -write out a 404 response to the `res`. If it is truthy, an error response will -be written out to the `res`, and `res.statusCode` is set from `err.status`. - -The final handler will also unpipe anything from `req` when it is invoked. - -#### options.env - -By default, the environment is determined by `NODE_ENV` variable, but it can be -overridden by this option. - -#### options.onerror - -Provide a function to be called with the `err` when it exists. Can be used for -writing errors to a central location without excessive function generation. Called -as `onerror(err, req, res)`. - -## Examples - -### always 404 - -```js -var finalhandler = require('finalhandler') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - done() -}) - -server.listen(3000) -``` - -### perform simple action - -```js -var finalhandler = require('finalhandler') -var fs = require('fs') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - - fs.readFile('index.html', function (err, buf) { - if (err) return done(err) - res.setHeader('Content-Type', 'text/html') - res.end(buf) - }) -}) - -server.listen(3000) -``` - -### use with middleware-style functions - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -var serve = serveStatic('public') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res) - serve(req, res, done) -}) - -server.listen(3000) -``` - -### keep log of all errors - -```js -var finalhandler = require('finalhandler') -var fs = require('fs') -var http = require('http') - -var server = http.createServer(function (req, res) { - var done = finalhandler(req, res, {onerror: logerror}) - - fs.readFile('index.html', function (err, buf) { - if (err) return done(err) - res.setHeader('Content-Type', 'text/html') - res.end(buf) - }) -}) - -server.listen(3000) - -function logerror(err) { - console.error(err.stack || err.toString()) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/index.js deleted file mode 100644 index 1ee90c6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/index.js +++ /dev/null @@ -1,158 +0,0 @@ -/*! - * finalhandler - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var debug = require('debug')('finalhandler') -var escapeHtml = require('escape-html') -var http = require('http') - -/** - * Variables. - */ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Module exports. - */ - -module.exports = finalhandler - -/** - * Final handler: - * - * @param {Request} req - * @param {Response} res - * @param {Object} [options] - * @return {Function} - * @api public - */ - -function finalhandler(req, res, options) { - options = options || {} - - // get environment - var env = options.env || process.env.NODE_ENV || 'development' - - // get error callback - var onerror = options.onerror - - return function (err) { - var msg - - // unhandled error - if (err) { - // default status code to 500 - if (!res.statusCode || res.statusCode < 400) { - res.statusCode = 500 - } - - // respect err.status - if (err.status) { - res.statusCode = err.status - } - - // production gets a basic error message - var msg = env === 'production' - ? http.STATUS_CODES[res.statusCode] - : err.stack || err.toString() - msg = escapeHtml(msg) - .replace(/\n/g, '
') - .replace(/ /g, '  ') + '\n' - } else { - res.statusCode = 404 - msg = 'Cannot ' + escapeHtml(req.method) + ' ' + escapeHtml(req.originalUrl || req.url) + '\n' - } - - debug('default %s', res.statusCode) - - // schedule onerror callback - if (err && onerror) { - defer(onerror, err, req, res) - } - - // cannot actually respond - if (res._header) { - return req.socket.destroy() - } - - send(req, res, res.statusCode, msg) - } -} - -/** - * Send response. - * - * @param {IncomingMessage} req - * @param {OutgoingMessage} res - * @param {number} status - * @param {string} body - * @api private - */ - -function send(req, res, status, body) { - function write() { - res.statusCode = status - res.setHeader('Content-Type', 'text/html; charset=utf-8') - res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8')) - - if (req.method === 'HEAD') { - res.end() - return - } - - res.end(body, 'utf8') - } - - if (!req.readable) { - write() - return - } - - // unpipe everything from the request - unpipe(req) - - // flush the request - req.once('end', write) - req.resume() -} - -/** - * Unpipe everything from a stream. - * - * @param {Object} stream - * @api private - */ - -/* istanbul ignore next: implementation differs between versions */ -function unpipe(stream) { - if (typeof stream.unpipe === 'function') { - // new-style - stream.unpipe() - return - } - - // Node.js 0.8 hack - var listener - var listeners = stream.listeners('close') - - for (var i = 0; i < listeners.length; i++) { - listener = listeners[i] - - if (listener.name !== 'cleanup' && listener.name !== 'onclose') { - continue - } - - // invoke the listener - listener.call(stream) - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/package.json deleted file mode 100644 index a690645..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/finalhandler/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "finalhandler", - "description": "Node.js final http responder", - "version": "0.1.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/finalhandler" - }, - "dependencies": { - "debug": "1.0.4", - "escape-html": "1.0.1" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.20.1", - "readable-stream": "~1.0.27", - "should": "~4.0.1", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/finalhandler/issues" - }, - "homepage": "https://github.com/expressjs/finalhandler", - "_id": "finalhandler@0.1.0", - "dist": { - "shasum": "da05bbc4f5f4a30c84ce1d91f3c154007c4e9daa", - "tarball": "http://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz" - }, - "_from": "finalhandler@0.1.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "da05bbc4f5f4a30c84ce1d91f3c154007c4e9daa", - "_resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/History.md deleted file mode 100644 index 12e1b3e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/History.md +++ /dev/null @@ -1,10 +0,0 @@ - -0.2.1 / 2014-01-29 -================== - - * fix: support max-age=0 for end-to-end revalidation - -0.2.0 / 2013-08-11 -================== - - * fix: return false for no-cache diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Readme.md deleted file mode 100644 index 61366c5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/Readme.md +++ /dev/null @@ -1,57 +0,0 @@ - -# node-fresh - - HTTP response freshness testing - -## fresh(req, res) - - Check freshness of `req` and `res` headers. - - When the cache is "fresh" __true__ is returned, - otherwise __false__ is returned to indicate that - the cache is now stale. - -## Example: - -```js -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'luna' }; -fresh(req, res); -// => false - -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'tobi' }; -fresh(req, res); -// => true -``` - -## Installation - -``` -$ npm install fresh -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/index.js deleted file mode 100644 index 9c3f47d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/index.js +++ /dev/null @@ -1,53 +0,0 @@ - -/** - * Expose `fresh()`. - */ - -module.exports = fresh; - -/** - * Check freshness of `req` and `res` headers. - * - * When the cache is "fresh" __true__ is returned, - * otherwise __false__ is returned to indicate that - * the cache is now stale. - * - * @param {Object} req - * @param {Object} res - * @return {Boolean} - * @api public - */ - -function fresh(req, res) { - // defaults - var etagMatches = true; - var notModified = true; - - // fields - var modifiedSince = req['if-modified-since']; - var noneMatch = req['if-none-match']; - var lastModified = res['last-modified']; - var etag = res['etag']; - var cc = req['cache-control']; - - // unconditional request - if (!modifiedSince && !noneMatch) return false; - - // check for no-cache cache request directive - if (cc && cc.indexOf('no-cache') !== -1) return false; - - // parse if-none-match - if (noneMatch) noneMatch = noneMatch.split(/ *, */); - - // if-none-match - if (noneMatch) etagMatches = ~noneMatch.indexOf(etag) || '*' == noneMatch[0]; - - // if-modified-since - if (modifiedSince) { - modifiedSince = new Date(modifiedSince); - lastModified = new Date(lastModified); - notModified = lastModified <= modifiedSince; - } - - return !! (etagMatches && notModified); -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/package.json deleted file mode 100644 index bc9631a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/fresh/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "fresh", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "HTTP response freshness testing", - "version": "0.2.2", - "main": "index.js", - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-fresh.git" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/visionmedia/node-fresh/blob/master/Readme.md#license" - } - ], - "bugs": { - "url": "https://github.com/visionmedia/node-fresh/issues" - }, - "homepage": "https://github.com/visionmedia/node-fresh", - "_id": "fresh@0.2.2", - "dist": { - "shasum": "9731dcf5678c7faeb44fb903c4f72df55187fa77", - "tarball": "http://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz" - }, - "_from": "fresh@0.2.2", - "_npmVersion": "1.3.15", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "9731dcf5678c7faeb44fb903c4f72df55187fa77", - "_resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/HISTORY.md deleted file mode 100644 index 215cc22..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/HISTORY.md +++ /dev/null @@ -1,16 +0,0 @@ -0.2.0 / 2014-06-18 -================== - - * Add `typer.format()` to format media types - -0.1.0 / 2014-06-17 -================== - - * Accept `req` as argument to `parse` - * Accept `res` as argument to `parse` - * Parse media type with extra LWS between type and first parameter - -0.0.0 / 2014-06-13 -================== - - * Initial implementation diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/README.md deleted file mode 100644 index 338b7ce..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# media-typer - -[![NPM version](https://badge.fury.io/js/media-typer.svg)](https://badge.fury.io/js/media-typer) -[![Build Status](https://travis-ci.org/expressjs/media-typer.svg?branch=master)](https://travis-ci.org/expressjs/media-typer) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/media-typer.svg?branch=master)](https://coveralls.io/r/expressjs/media-typer) - -Simple RFC 6838 media type parser - -## Installation - -```sh -$ npm install media-typer -``` - -## API - -```js -var typer = require('media-typer') -``` - -### typer.parse(string) - -```js -var obj = typer.parse('image/svg+xml; charset=utf-8') -``` - -Parse a media type string. This will return an object with the following -properties (examples are shown for the string `'image/svg+xml; charset=utf-8'`): - - - `type`: The type of the media type (always lower case). Example: `'image'` - - - `subtype`: The subtype of the media type (always lower case). Example: `'svg'` - - - `suffix`: The suffix of the media type (always lower case). Example: `'xml'` - - - `parameters`: An object of the parameters in the media type (name of parameter always lower case). Example: `{charset: 'utf-8'}` - -### typer.parse(req) - -```js -var obj = typer.parse(req) -``` - -Parse the `content-type` header from the given `req`. Short-cut for -`typer.parse(req.headers['content-type'])`. - -### typer.parse(res) - -```js -var obj = typer.parse(req) -``` - -Parse the `content-type` header set on the given `res`. Short-cut for -`typer.parse(res.getHeader('content-type'))`. - -### typer.format(obj) - -```js -var obj = typer.format({type: 'image', subtype: 'svg', suffix: 'xml'}) -``` - -Format an object into a media type string. This will return a string of the -mime type for the given object. For the properties of the object, see the -documentation for `typer.parse(string)`. - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/index.js deleted file mode 100644 index cbf2e17..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/index.js +++ /dev/null @@ -1,261 +0,0 @@ -/*! - * media-typer - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * RegExp to match *( ";" parameter ) in RFC 2616 sec 3.7 - * - * parameter = token "=" ( token | quoted-string ) - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) - * qdtext = > - * quoted-pair = "\" CHAR - * CHAR = - * TEXT = - * LWS = [CRLF] 1*( SP | HT ) - * CRLF = CR LF - * CR = - * LF = - * SP = - * SHT = - * CTL = - * OCTET = - */ -var paramRegExp = /; *([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *= *("(?:[ !\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u0020-\u007e])*"|[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) */g; -var textRegExp = /^[\u0020-\u007e\u0080-\u00ff]+$/ -var tokenRegExp = /^[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+$/ - -/** - * RegExp to match quoted-pair in RFC 2616 - * - * quoted-pair = "\" CHAR - * CHAR = - */ -var qescRegExp = /\\([\u0000-\u007f])/g; - -/** - * RegExp to match chars that must be quoted-pair in RFC 2616 - */ -var quoteRegExp = /([\\"])/g; - -/** - * RegExp to match type in RFC 6838 - * - * type-name = restricted-name - * subtype-name = restricted-name - * restricted-name = restricted-name-first *126restricted-name-chars - * restricted-name-first = ALPHA / DIGIT - * restricted-name-chars = ALPHA / DIGIT / "!" / "#" / - * "$" / "&" / "-" / "^" / "_" - * restricted-name-chars =/ "." ; Characters before first dot always - * ; specify a facet name - * restricted-name-chars =/ "+" ; Characters after last plus always - * ; specify a structured syntax suffix - * ALPHA = %x41-5A / %x61-7A ; A-Z / a-z - * DIGIT = %x30-39 ; 0-9 - */ -var subtypeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/ -var typeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/ -var typeRegExp = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/; - -/** - * Module exports. - */ - -exports.format = format -exports.parse = parse - -/** - * Format object to media type. - * - * @param {object} obj - * @return {string} - * @api public - */ - -function format(obj) { - if (!obj || typeof obj !== 'object') { - throw new TypeError('argument obj is required') - } - - var parameters = obj.parameters - var subtype = obj.subtype - var suffix = obj.suffix - var type = obj.type - - if (!type || !typeNameRegExp.test(type)) { - throw new TypeError('invalid type') - } - - if (!subtype || !subtypeNameRegExp.test(subtype)) { - throw new TypeError('invalid subtype') - } - - // format as type/subtype - var string = type + '/' + subtype - - // append +suffix - if (suffix) { - if (!typeNameRegExp.test(suffix)) { - throw new TypeError('invalid suffix') - } - - string += '+' + suffix - } - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - if (!tokenRegExp.test(param)) { - throw new TypeError('invalid parameter name') - } - - string += '; ' + param + '=' + qstring(parameters[param]) - } - } - - return string -} - -/** - * Parse media type to object. - * - * @param {string|object} string - * @return {Object} - * @api public - */ - -function parse(string) { - if (!string) { - throw new TypeError('argument string is required') - } - - // support req/res-like objects as argument - if (typeof string === 'object') { - string = getcontenttype(string) - } - - if (typeof string !== 'string') { - throw new TypeError('argument string is required to be a string') - } - - var index = string.indexOf(';') - var type = index !== -1 - ? string.substr(0, index) - : string - - var key - var match - var obj = splitType(type) - var params = {} - var value - - paramRegExp.lastIndex = index - - while (match = paramRegExp.exec(string)) { - key = match[1].toLowerCase() - value = match[2] - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(qescRegExp, '$1') - } - - params[key] = value - } - - obj.parameters = params - - return obj -} - -/** - * Get content-type from req/res objects. - * - * @param {object} - * @return {Object} - * @api private - */ - -function getcontenttype(obj) { - if (typeof obj.getHeader === 'function') { - // res-like - return obj.getHeader('content-type') - } - - if (typeof obj.headers === 'object') { - // req-like - return obj.headers && obj.headers['content-type'] - } -} - -/** - * Quote a string if necessary. - * - * @param {string} val - * @return {string} - * @api private - */ - -function qstring(val) { - var str = String(val) - - // no need to quote tokens - if (tokenRegExp.test(str)) { - return str - } - - if (str.length > 0 && !textRegExp.test(str)) { - throw new TypeError('invalid parameter value') - } - - return '"' + str.replace(quoteRegExp, '\\$1') + '"' -} - -/** - * Simply "type/subtype+siffx" into parts. - * - * @param {string} string - * @return {Object} - * @api private - */ - -function splitType(string) { - var match = typeRegExp.exec(string.toLowerCase()) - - if (!match) { - throw new TypeError('invalid media type') - } - - var type = match[1] - var subtype = match[2] - var suffix - - // suffix after last + - var index = subtype.lastIndexOf('+') - if (index !== -1) { - suffix = subtype.substr(index + 1) - subtype = subtype.substr(0, index) - } - - var obj = { - type: type, - subtype: subtype, - suffix: suffix - } - - return obj -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/package.json deleted file mode 100644 index 7ba61f9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/media-typer/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "media-typer", - "description": "Simple RFC 6838 media type parser and formatter", - "version": "0.2.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/media-typer" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.1", - "should": "~4.0.4" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/media-typer/issues" - }, - "homepage": "https://github.com/expressjs/media-typer", - "_id": "media-typer@0.2.0", - "dist": { - "shasum": "d8a065213adfeaa2e76321a2b6dda36ff6335984", - "tarball": "http://registry.npmjs.org/media-typer/-/media-typer-0.2.0.tgz" - }, - "_from": "media-typer@0.2.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "d8a065213adfeaa2e76321a2b6dda36ff6335984", - "_resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/.npmignore deleted file mode 100644 index f62e605..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/.npmignore +++ /dev/null @@ -1,59 +0,0 @@ -# Compiled source # -################### -*.com -*.class -*.dll -*.exe -*.o -*.so - -# Packages # -############ -# it's better to unpack these files and commit the raw source -# git has its own built in compression methods -*.7z -*.dmg -*.gz -*.iso -*.jar -*.rar -*.tar -*.zip - -# Logs and databases # -###################### -*.log -*.sql -*.sqlite - -# OS generated files # -###################### -.DS_Store* -ehthumbs.db -Icon? -Thumbs.db - -# Node.js # -########### -lib-cov -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.gz - -pids -logs -results - -node_modules -npm-debug.log - -# Components # -############## - -/build -/components -/vendors \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/README.md deleted file mode 100644 index 50cf50c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Merge Descriptors [![Build Status](https://travis-ci.org/component/merge-descriptors.png)](https://travis-ci.org/component/merge-descriptors) - -Merge objects using descriptors. - -```js -var thing = { - get name() { - return 'jon' - } -} - -var animal = { - -} - -merge(animal, thing) - -animal.name === 'jon' -``` - -## API - -### merge(destination, source) - -Overwrites `destination`'s descriptors with `source`'s. - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/component.json deleted file mode 100644 index 7653906..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/component.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "merge-descriptors", - "description": "Merge objects using descriptors", - "version": "0.0.2", - "scripts": [ - "index.js" - ], - "repo": "component/merge-descriptors", - "license": "MIT" -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/index.js deleted file mode 100644 index e4e2379..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/index.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = function (dest, src) { - Object.getOwnPropertyNames(src).forEach(function (name) { - var descriptor = Object.getOwnPropertyDescriptor(src, name) - Object.defineProperty(dest, name, descriptor) - }) - - return dest -} \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/package.json deleted file mode 100644 index b1b83d4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/merge-descriptors/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "merge-descriptors", - "description": "Merge objects using descriptors", - "version": "0.0.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/component/merge-descriptors.git" - }, - "bugs": { - "url": "https://github.com/component/merge-descriptors/issues" - }, - "scripts": { - "test": "make test;" - }, - "homepage": "https://github.com/component/merge-descriptors", - "_id": "merge-descriptors@0.0.2", - "dist": { - "shasum": "c36a52a781437513c57275f39dd9d317514ac8c7", - "tarball": "http://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz" - }, - "_from": "merge-descriptors@0.0.2", - "_npmVersion": "1.3.17", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "directories": {}, - "_shasum": "c36a52a781437513c57275f39dd9d317514ac8c7", - "_resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/.npmignore deleted file mode 100644 index c2658d7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/History.md deleted file mode 100644 index d3996c2..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/History.md +++ /dev/null @@ -1,20 +0,0 @@ - -1.1.0 / 2014-07-05 -================== - - * add CONNECT - -1.0.1 / 2014-06-02 -================== - - * fix index.js to work with harmony transform - -1.0.0 / 2014-05-08 -================== - - * add PURGE. Closes #9 - -0.1.0 / 2013-10-28 -================== - - * add http.METHODS support diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/LICENSE deleted file mode 100644 index 8bce401..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -(The MIT License) - -Copyright (c) 2013-2014 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. - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/Readme.md deleted file mode 100644 index ac0658e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/Readme.md +++ /dev/null @@ -1,4 +0,0 @@ - -# Methods - - HTTP verbs that node core's parser supports. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/index.js deleted file mode 100644 index f7e3c48..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/index.js +++ /dev/null @@ -1,41 +0,0 @@ - -var http = require('http'); - -if (http.METHODS) { - - module.exports = http.METHODS.map(function(method){ - return method.toLowerCase(); - }); - -} else { - - module.exports = [ - 'get', - 'post', - 'put', - 'head', - 'delete', - 'options', - 'trace', - 'copy', - 'lock', - 'mkcol', - 'move', - 'purge', - 'propfind', - 'proppatch', - 'unlock', - 'report', - 'mkactivity', - 'checkout', - 'merge', - 'm-search', - 'notify', - 'subscribe', - 'unsubscribe', - 'patch', - 'search', - 'connect' - ]; - -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/package.json deleted file mode 100644 index 8d1c198..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "methods", - "version": "1.1.0", - "description": "HTTP methods that node supports", - "main": "index.js", - "scripts": { - "test": "./node_modules/mocha/bin/mocha" - }, - "keywords": [ - "http", - "methods" - ], - "author": { - "name": "TJ Holowaychuk" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/node-methods.git" - }, - "devDependencies": { - "mocha": "1.17.x" - }, - "gitHead": "2a4dd325d18436c33356e6be19e32e08a7c877ab", - "bugs": { - "url": "https://github.com/visionmedia/node-methods/issues" - }, - "homepage": "https://github.com/visionmedia/node-methods", - "_id": "methods@1.1.0", - "_shasum": "5dca4ee12df52ff3b056145986a8f01cbc86436f", - "_from": "methods@1.1.0", - "_npmVersion": "1.4.16", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - } - ], - "dist": { - "shasum": "5dca4ee12df52ff3b056145986a8f01cbc86436f", - "tarball": "http://registry.npmjs.org/methods/-/methods-1.1.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/test/methods.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/test/methods.js deleted file mode 100644 index 527beab..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/methods/test/methods.js +++ /dev/null @@ -1,33 +0,0 @@ -var http = require('http'); -var assert = require('assert'); -var methods = require('..'); - -describe('methods', function() { - - if (http.METHODS) { - - it('is a lowercased http.METHODS', function() { - var lowercased = http.METHODS.map(function(method) { - return method.toLowerCase(); - }); - assert.deepEqual(lowercased, methods); - }); - - } else { - - it('contains GET, POST, PUT, and DELETE', function() { - assert.notEqual(methods.indexOf('get'), -1); - assert.notEqual(methods.indexOf('post'), -1); - assert.notEqual(methods.indexOf('put'), -1); - assert.notEqual(methods.indexOf('delete'), -1); - }); - - it('is all lowercase', function() { - for (var i = 0; i < methods.length; i ++) { - assert(methods[i], methods[i].toLowerCase(), methods[i] + " isn't all lowercase"); - } - }); - - } - -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/.npmignore deleted file mode 100644 index 85c82a5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -benchmark/ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/HISTORY.md deleted file mode 100644 index cf36864..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/HISTORY.md +++ /dev/null @@ -1,36 +0,0 @@ -1.2.0 / 2014-07-21 -================== - - * Cache URLs based on original value - * Remove no-longer-needed URL mis-parse work-around - * Simplify the "fast-path" `RegExp` - -1.1.3 / 2014-07-08 -================== - - * Fix typo - -1.1.2 / 2014-07-08 -================== - - * Seriously fix Node.js 0.8 compatibility - -1.1.1 / 2014-07-08 -================== - - * Fix Node.js 0.8 compatibility - -1.1.0 / 2014-07-08 -================== - - * Incorporate URL href-only parse fast-path - -1.0.1 / 2014-03-08 -================== - - * Add missing `require` - -1.0.0 / 2014-03-08 -================== - - * Genesis from `connect` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/LICENSE deleted file mode 100644 index 991dc7d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ - -(The MIT License) - -Copyright (c) 2014 Jonathan Ong - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/README.md deleted file mode 100644 index 91a70db..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/README.md +++ /dev/null @@ -1,99 +0,0 @@ -# parseurl - -[![NPM version](https://badge.fury.io/js/parseurl.svg)](http://badge.fury.io/js/parseurl) -[![Build Status](https://travis-ci.org/expressjs/parseurl.svg?branch=master)](https://travis-ci.org/expressjs/parseurl) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/parseurl.svg?branch=master)](https://coveralls.io/r/expressjs/parseurl) - -Parse a URL with memoization. - -## Install - -```bash -$ npm install parseurl -``` - -## API - -```js -var parseurl = require('parseurl') -``` - -### parseurl(req) - -Parse the URL of the given request object (looks at the `req.url` property) -and return the result. The result is the same as `url.parse` in Node.js core. -Calling this function multiple times on the same `req` where `req.url` does -not change will return a cached parsed object, rather than parsing again. - -## Benchmark - -```bash -$ npm run-script bench - -> parseurl@1.2.0 bench nodejs-parseurl -> node benchmark/index.js - -> node benchmark/fullurl.js - - Parsing URL "http://localhost:8888/foo/bar?user=tj&pet=fluffy" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 1,290,780 ops/sec ±0.46% (195 runs sampled) - nativeurl x 56,401 ops/sec ±0.22% (196 runs sampled) - parseurl x 55,231 ops/sec ±0.22% (194 runs sampled) - -> node benchmark/pathquery.js - - Parsing URL "/foo/bar?user=tj&pet=fluffy" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 1,986,668 ops/sec ±0.27% (190 runs sampled) - nativeurl x 98,740 ops/sec ±0.21% (195 runs sampled) - parseurl x 2,628,171 ops/sec ±0.36% (195 runs sampled) - -> node benchmark/samerequest.js - - Parsing URL "/foo/bar?user=tj&pet=fluffy" on same request object - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 2,184,468 ops/sec ±0.40% (194 runs sampled) - nativeurl x 99,437 ops/sec ±0.71% (194 runs sampled) - parseurl x 10,498,005 ops/sec ±0.61% (186 runs sampled) - -> node benchmark/simplepath.js - - Parsing URL "/foo/bar" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 4,535,825 ops/sec ±0.27% (191 runs sampled) - nativeurl x 98,769 ops/sec ±0.54% (191 runs sampled) - parseurl x 4,164,865 ops/sec ±0.34% (192 runs sampled) - -> node benchmark/slash.js - - Parsing URL "/" - - 1 test completed. - 2 tests completed. - 3 tests completed. - - fasturl x 4,908,405 ops/sec ±0.42% (191 runs sampled) - nativeurl x 100,945 ops/sec ±0.59% (188 runs sampled) - parseurl x 4,333,208 ops/sec ±0.27% (194 runs sampled) -``` - -## License - - [MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/index.js deleted file mode 100644 index 41e6d00..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/index.js +++ /dev/null @@ -1,87 +0,0 @@ - -/** - * Module dependencies. - */ - -var url = require('url') -var parse = url.parse -var Url = url.Url - -/** - * Pattern for a simple path case. - * See: https://github.com/joyent/node/pull/7878 - */ - -var simplePathRegExp = /^(\/\/?(?!\/)[^\?#\s]*)(\?[^#\s]*)?$/ - -/** - * Parse the `req` url with memoization. - * - * @param {ServerRequest} req - * @return {Object} - * @api public - */ - -module.exports = function parseUrl(req){ - var parsed = req._parsedUrl - var url = req.url - - if (fresh(url, parsed)) { - // Return cached URL parse - return parsed - } - - // Parse the URL - parsed = fastparse(url) - parsed._raw = url - - return req._parsedUrl = parsed -}; - -/** - * Parse the `str` url with fast-path short-cut. - * - * @param {string} str - * @return {Object} - * @api private - */ - -function fastparse(str) { - // Try fast path regexp - // See: https://github.com/joyent/node/pull/7878 - var simplePath = typeof str === 'string' && simplePathRegExp.exec(str) - - // Construct simple URL - if (simplePath) { - var pathname = simplePath[1] - var search = simplePath[2] || null - var url = Url !== undefined - ? new Url() - : {} - url.path = str - url.href = str - url.pathname = pathname - url.search = search - url.query = search && search.substr(1) - - return url - } - - return parse(str) -} - -/** - * Determine if parsed is still fresh for url. - * - * @param {string} url - * @param {object} parsedUrl - * @return {boolean} - * @api private - */ - -function fresh(url, parsedUrl) { - return typeof parsedUrl === 'object' - && parsedUrl !== null - && (Url === undefined || parsedUrl instanceof Url) - && parsedUrl._raw === url -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/package.json deleted file mode 100644 index 5c8e842..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/parseurl/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "parseurl", - "description": "parse a url with memoization", - "version": "1.2.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/parseurl" - }, - "license": "MIT", - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "fast-url-parser": "~1.0.0", - "istanbul": "0.3.0", - "mocha": "~1.20.0" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --check-leaks --bail --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/parseurl/issues" - }, - "homepage": "https://github.com/expressjs/parseurl", - "_id": "parseurl@1.2.0", - "dist": { - "shasum": "be7df2d698eb49ffb10ea62939693e152991c008", - "tarball": "http://registry.npmjs.org/parseurl/-/parseurl-1.2.0.tgz" - }, - "_from": "parseurl@>=1.2.0-0 <1.3.0-0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "be7df2d698eb49ffb10ea62939693e152991c008", - "_resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/.npmignore deleted file mode 100644 index ba2a97b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -coverage diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/History.md deleted file mode 100644 index f962cfa..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/History.md +++ /dev/null @@ -1,16 +0,0 @@ -0.1.3 / 2014-07-06 -================== - - * Better array support - * Improved support for trailing slash in non-ending mode - -0.1.0 / 2014-03-06 -================== - - * add options.end - -0.0.2 / 2013-02-10 -================== - - * Update to match current express - * add .license property to component.json diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/Readme.md deleted file mode 100644 index 9199e38..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/Readme.md +++ /dev/null @@ -1,33 +0,0 @@ - -# Path-to-RegExp - - Turn an Express-style path string such as `/user/:name` into a regular expression. - -## Usage - -```javascript -var pathToRegexp = require('path-to-regexp'); -``` -### pathToRegexp(path, keys, options) - - - **path** A string in the express format, an array of such strings, or a regular expression - - **keys** An array to be populated with the keys present in the url. Once the function completes, this will be an array of strings. - - **options** - - **options.sensitive** Defaults to false, set this to true to make routes case sensitive - - **options.strict** Defaults to false, set this to true to make the trailing slash matter. - - **options.end** Defaults to true, set this to false to only match the prefix of the URL. - -```javascript -var keys = []; -var exp = pathToRegexp('/foo/:bar', keys); -//keys = ['bar'] -//exp = /^\/foo\/(?:([^\/]+?))\/?$/i -``` - -## Live Demo - -You can see a live demo of this library in use at [express-route-tester](http://forbeslindesay.github.com/express-route-tester/). - -## License - - MIT \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/component.json deleted file mode 100644 index 6ab37d3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/component.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "path-to-regexp", - "description": "Express style path to RegExp utility", - "version": "0.1.3", - "keywords": [ - "express", - "regexp", - "route", - "routing" - ], - "scripts": [ - "index.js" - ], - "license": "MIT" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/index.js deleted file mode 100644 index 2801f91..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/index.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Expose `pathtoRegexp`. - */ - -module.exports = pathtoRegexp; - -/** - * Normalize the given path string, - * returning a regular expression. - * - * An empty array should be passed, - * which will contain the placeholder - * key names. For example "/user/:id" will - * then contain ["id"]. - * - * @param {String|RegExp|Array} path - * @param {Array} keys - * @param {Object} options - * @return {RegExp} - * @api private - */ - -function pathtoRegexp(path, keys, options) { - options = options || {}; - var strict = options.strict; - var end = options.end !== false; - var flags = options.sensitive ? '' : 'i'; - keys = keys || []; - - if (path instanceof RegExp) { - return path; - } - - if (Array.isArray(path)) { - // Map array parts into regexps and return their source. We also pass - // the same keys and options instance into every generation to get - // consistent matching groups before we join the sources together. - path = path.map(function (value) { - return pathtoRegexp(value, keys, options).source; - }); - - return new RegExp('(?:' + path.join('|') + ')', flags); - } - - path = ('^' + path + (strict ? '' : path[path.length - 1] === '/' ? '?' : '/?')) - .replace(/\/\(/g, '/(?:') - .replace(/([\/\.])/g, '\\$1') - .replace(/(\\\/)?(\\\.)?:(\w+)(\(.*?\))?(\*)?(\?)?/g, function (match, slash, format, key, capture, star, optional) { - slash = slash || ''; - format = format || ''; - capture = capture || '([^\\/' + format + ']+?)'; - optional = optional || ''; - - keys.push({ name: key, optional: !!optional }); - - return '' - + (optional ? '' : slash) - + '(?:' - + format + (optional ? slash : '') + capture - + (star ? '((?:[\\/' + format + '].+?)?)' : '') - + ')' - + optional; - }) - .replace(/\*/g, '(.*)'); - - // If the path is non-ending, match until the end or a slash. - path += (end ? '$' : (path[path.length - 1] === '/' ? '' : '(?=\\/|$)')); - - return new RegExp(path, flags); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/package.json deleted file mode 100644 index bccfe25..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/package.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "name": "path-to-regexp", - "description": "Express style path to RegExp utility", - "version": "0.1.3", - "scripts": { - "test": "istanbul cover _mocha -- -R spec" - }, - "keywords": [ - "express", - "regexp" - ], - "component": { - "scripts": { - "path-to-regexp": "index.js" - } - }, - "repository": { - "type": "git", - "url": "https://github.com/component/path-to-regexp.git" - }, - "devDependencies": { - "mocha": "^1.17.1", - "istanbul": "^0.2.6" - }, - "bugs": { - "url": "https://github.com/component/path-to-regexp/issues" - }, - "homepage": "https://github.com/component/path-to-regexp", - "_id": "path-to-regexp@0.1.3", - "_shasum": "21b9ab82274279de25b156ea08fd12ca51b8aecb", - "_from": "path-to-regexp@0.1.3", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dominicbarnes", - "email": "dominic@dbarnes.info" - }, - { - "name": "tootallnate", - "email": "nathan@tootallnate.net" - }, - { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - { - "name": "retrofox", - "email": "rdsuarez@gmail.com" - }, - { - "name": "coreh", - "email": "thecoreh@gmail.com" - }, - { - "name": "forbeslindesay", - "email": "forbes@lindesay.co.uk" - }, - { - "name": "kelonye", - "email": "kelonyemitchel@gmail.com" - }, - { - "name": "mattmueller", - "email": "mattmuelle@gmail.com" - }, - { - "name": "yields", - "email": "yields@icloud.com" - }, - { - "name": "anthonyshort", - "email": "antshort@gmail.com" - }, - { - "name": "ianstormtaylor", - "email": "ian@ianstormtaylor.com" - }, - { - "name": "cristiandouce", - "email": "cristian@gravityonmars.com" - }, - { - "name": "swatinem", - "email": "arpad.borsos@googlemail.com" - }, - { - "name": "stagas", - "email": "gstagas@gmail.com" - }, - { - "name": "amasad", - "email": "amjad.masad@gmail.com" - }, - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "calvinfo", - "email": "calvin@calv.info" - }, - { - "name": "blakeembrey", - "email": "hello@blakeembrey.com" - }, - { - "name": "timoxley", - "email": "secoif@gmail.com" - }, - { - "name": "jonathanong", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "queckezz", - "email": "fabian.eichenberger@gmail.com" - }, - { - "name": "nami-doc", - "email": "vendethiel@hotmail.fr" - }, - { - "name": "clintwood", - "email": "clint@anotherway.co.za" - }, - { - "name": "thehydroimpulse", - "email": "dnfagnan@gmail.com" - }, - { - "name": "stephenmathieson", - "email": "me@stephenmathieson.com" - }, - { - "name": "trevorgerhardt", - "email": "trevorgerhardt@gmail.com" - } - ], - "dist": { - "shasum": "21b9ab82274279de25b156ea08fd12ca51b8aecb", - "tarball": "http://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/test.js deleted file mode 100644 index 4a0c270..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/path-to-regexp/test.js +++ /dev/null @@ -1,616 +0,0 @@ -var pathToRegExp = require('./'); -var assert = require('assert'); - -describe('path-to-regexp', function () { - describe('strings', function () { - it('should match simple paths', function () { - var params = []; - var m = pathToRegExp('/test', params).exec('/test'); - - assert.equal(params.length, 0); - - assert.equal(m.length, 1); - assert.equal(m[0], '/test'); - }); - - it('should match express format params', function () { - var params = []; - var m = pathToRegExp('/:test', params).exec('/pathname'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/pathname'); - assert.equal(m[1], 'pathname'); - }); - - it('should do strict matches', function () { - var params = []; - var re = pathToRegExp('/:test', params, { strict: true }); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/route'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - - m = re.exec('/route/'); - - assert.ok(!m); - }); - - it('should do strict matches with trailing slashes', function () { - var params = []; - var re = pathToRegExp('/:test/', params, { strict: true }); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/route'); - - assert.ok(!m); - - m = re.exec('/route/'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route/'); - assert.equal(m[1], 'route'); - - m = re.exec('/route//'); - - assert.ok(!m); - }); - - it('should allow optional express format params', function () { - var params = []; - var re = pathToRegExp('/:test?', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, true); - - m = re.exec('/route'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - - m = re.exec('/'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/'); - assert.equal(m[1], undefined); - }); - - it('should allow express format param regexps', function () { - var params = []; - var m = pathToRegExp('/:page(\\d+)', params).exec('/56'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'page'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/56'); - assert.equal(m[1], '56'); - }); - - it('should match without a prefixed slash', function () { - var params = []; - var m = pathToRegExp(':test', params).exec('string'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], 'string'); - assert.equal(m[1], 'string'); - }); - - it('should not match format parts', function () { - var params = []; - var m = pathToRegExp('/:test.json', params).exec('/route.json'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - }); - - it('should match format parts', function () { - var params = []; - var re = pathToRegExp('/:test.:format', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, false); - - m = re.exec('/route.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - assert.equal(m[2], 'json'); - - m = re.exec('/route'); - - assert.ok(!m); - }); - - it('should match route parts with a trailing format', function () { - var params = []; - var m = pathToRegExp('/:test.json', params).exec('/route.json'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - }); - - it('should match optional trailing routes', function () { - var params = []; - var m = pathToRegExp('/test*', params).exec('/test/route'); - - assert.equal(params.length, 0); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test/route'); - assert.equal(m[1], '/route'); - }); - - it('should match optional trailing routes after a param', function () { - var params = []; - var re = pathToRegExp('/:test*', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/test/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/route'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - - m = re.exec('/testing'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/testing'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - }); - - it('should match optional trailing routes before a format', function () { - var params = []; - var re = pathToRegExp('/test*.json', params); - var m; - - assert.equal(params.length, 0); - - m = re.exec('/test.json'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test.json'); - assert.equal(m[1], ''); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'ing'); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], '/route'); - }); - - it('should match optional trailing routes after a param and before a format', function () { - var params = []; - var re = pathToRegExp('/:test*.json', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - - m = re.exec('.json'); - - assert.ok(!m); - }); - - it('should match optional trailing routes between a normal param and a format param', function () { - var params = []; - var re = pathToRegExp('/:test*.:format', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, false); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - assert.equal(m[3], 'json'); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - assert.equal(m[3], 'json'); - - m = re.exec('/test'); - - assert.ok(!m); - - m = re.exec('.json'); - - assert.ok(!m); - }); - - it('should match optional trailing routes after a param and before an optional format param', function () { - var params = []; - var re = pathToRegExp('/:test*.:format?', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, true); - - m = re.exec('/testing.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/testing.json'); - assert.equal(m[1], 'testing'); - assert.equal(m[2], ''); - assert.equal(m[3], 'json'); - - m = re.exec('/test/route.json'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/test/route.json'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - assert.equal(m[3], 'json'); - - m = re.exec('/test'); - - assert.equal(m.length, 4); - assert.equal(m[0], '/test'); - assert.equal(m[1], 'test'); - assert.equal(m[2], ''); - assert.equal(m[3], undefined); - - m = re.exec('.json'); - - assert.ok(!m); - }); - - it('should match optional trailing routes inside optional express param', function () { - var params = []; - var re = pathToRegExp('/:test*?', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, true); - - m = re.exec('/test/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/route'); - assert.equal(m[1], 'test'); - assert.equal(m[2], '/route'); - - m = re.exec('/test'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test'); - assert.equal(m[1], 'test'); - assert.equal(m[2], ''); - - m = re.exec('/'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/'); - assert.equal(m[1], undefined); - assert.equal(m[2], undefined); - }); - - it('should do case insensitive matches', function () { - var m = pathToRegExp('/test').exec('/TEST'); - - assert.equal(m[0], '/TEST'); - }); - - it('should do case sensitive matches', function () { - var re = pathToRegExp('/test', null, { sensitive: true }); - var m; - - m = re.exec('/test'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/test'); - - m = re.exec('/TEST'); - - assert.ok(!m); - }); - - it('should do non-ending matches', function () { - var params = []; - var m = pathToRegExp('/:test', params, { end: false }).exec('/test/route'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test'); - assert.equal(m[1], 'test'); - }); - - it('should match trailing slashes in non-ending non-strict mode', function () { - var params = []; - var re = pathToRegExp('/:test', params, { end: false }); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/test/'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test/'); - assert.equal(m[1], 'test'); - }); - - it('should match trailing slashes in non-ending non-strict mode', function () { - var params = []; - var re = pathToRegExp('/route/', params, { end: false }); - var m; - - assert.equal(params.length, 0); - - m = re.exec('/route/'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - - m = re.exec('/route/test'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route'); - - m = re.exec('/route'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route'); - - m = re.exec('/route//'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - }); - - it('should match trailing slashing in non-ending strict mode', function () { - var params = []; - var re = pathToRegExp('/route/', params, { end: false, strict: true }); - - assert.equal(params.length, 0); - - m = re.exec('/route/'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - - m = re.exec('/route/test'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - - m = re.exec('/route'); - - assert.ok(!m); - - m = re.exec('/route//'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route/'); - }); - - it('should not match trailing slashes in non-ending strict mode', function () { - var params = []; - var re = pathToRegExp('/route', params, { end: false, strict: true }); - - assert.equal(params.length, 0); - - m = re.exec('/route'); - - assert.equal(m.length, 1); - assert.equal(m[0], '/route'); - - m = re.exec('/route/'); - - assert.ok(m.length, 1); - assert.equal(m[0], '/route'); - }); - - it('should match text after an express param', function () { - var params = []; - var re = pathToRegExp('/(:test)route', params); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - m = re.exec('/route'); - - assert.ok(!m); - - m = re.exec('/testroute'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/testroute'); - assert.equal(m[1], 'test'); - - m = re.exec('testroute'); - - assert.ok(!m); - }); - - it('should match text after an optional express param', function () { - var params = []; - var re = pathToRegExp('/(:test?)route', params); - var m; - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, true); - - m = re.exec('/route'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/route'); - assert.equal(m[1], undefined); - - m = re.exec('/testroute'); - - assert.equal(m.length, 2); - assert.equal(m[0], '/testroute'); - assert.equal(m[1], 'test'); - - m = re.exec('route'); - - assert.ok(!m); - }); - - it('should match optional formats', function () { - var params = []; - var re = pathToRegExp('/:test.:format?', params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'format'); - assert.equal(params[1].optional, true); - - m = re.exec('/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - assert.equal(m[2], undefined); - - m = re.exec('/route.json'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route.json'); - assert.equal(m[1], 'route'); - assert.equal(m[2], 'json'); - }); - - it('should match full paths with format by default', function () { - var params = []; - var m = pathToRegExp('/:test', params).exec('/test.json'); - - assert.equal(params.length, 1); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - - assert.equal(m.length, 2); - assert.equal(m[0], '/test.json'); - assert.equal(m[1], 'test.json'); - }); - }); - - describe('regexps', function () { - it('should return the regexp', function () { - assert.deepEqual(pathToRegExp(/.*/), /.*/); - }); - }); - - describe('arrays', function () { - it('should join arrays parts', function () { - var re = pathToRegExp(['/test', '/route']); - - assert.ok(re.test('/test')); - assert.ok(re.test('/route')); - assert.ok(!re.test('/else')); - }); - - it('should match parts properly', function () { - var params = []; - var re = pathToRegExp(['/:test', '/test/:route'], params); - var m; - - assert.equal(params.length, 2); - assert.equal(params[0].name, 'test'); - assert.equal(params[0].optional, false); - assert.equal(params[1].name, 'route'); - assert.equal(params[1].optional, false); - - m = re.exec('/route'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/route'); - assert.equal(m[1], 'route'); - assert.equal(m[2], undefined); - - m = re.exec('/test/path'); - - assert.equal(m.length, 3); - assert.equal(m[0], '/test/path'); - assert.equal(m[1], undefined); - assert.equal(m[2], 'path'); - }); - }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/.npmignore deleted file mode 100644 index 85c82a5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -benchmark/ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/History.md deleted file mode 100644 index 61a0d50..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/History.md +++ /dev/null @@ -1,27 +0,0 @@ -1.0.1 / 2014-06-03 -================== - - * Fix links in npm package - -1.0.0 / 2014-05-08 -================== - - * Add `trust` argument to determine proxy trust on - * Accepts custom function - * Accepts IPv4/IPv6 address(es) - * Accepts subnets - * Accepts pre-defined names - * Add optional `trust` argument to `proxyaddr.all` to - stop at first untrusted - * Add `proxyaddr.compile` to pre-compile `trust` function - to make subsequent calls faster - -0.0.1 / 2014-05-04 -================== - - * Fix bad npm publish - -0.0.0 / 2014-05-04 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/README.md deleted file mode 100644 index 4fe57d3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# proxy-addr - -[![NPM version](https://badge.fury.io/js/proxy-addr.svg)](http://badge.fury.io/js/proxy-addr) -[![Build Status](https://travis-ci.org/expressjs/proxy-addr.svg?branch=master)](https://travis-ci.org/expressjs/proxy-addr) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/proxy-addr.svg?branch=master)](https://coveralls.io/r/expressjs/proxy-addr) - -Determine address of proxied request - -## Install - -```sh -$ npm install proxy-addr -``` - -## API - -```js -var proxyaddr = require('proxy-addr') -``` - -### proxyaddr(req, trust) - -Return the address of the request, using the given `trust` parameter. - -The `trust` argument is a function that returns `true` if you trust -the address, `false` if you don't. The closest untrusted address is -returned. - -```js -proxyaddr(req, function(addr){ return addr === '127.0.0.1' }) -proxyaddr(req, function(addr, i){ return i < 1 }) -``` - -The `trust` arugment may also be a single IP address string or an -array of trusted addresses, as plain IP addresses, CIDR-formatted -strings, or IP/netmask strings. - -```js -proxyaddr(req, '127.0.0.1') -proxyaddr(req, ['127.0.0.0/8', '10.0.0.0/8']) -proxyaddr(req, ['127.0.0.0/255.0.0.0', '192.168.0.0/255.255.0.0']) -``` - -This module also supports IPv6. Your IPv6 addresses will be normalized -automatically (i.e. `fe80::00ed:1` equals `fe80:0:0:0:0:0:ed:1`). - -```js -proxyaddr(req, '::1') -proxyaddr(req, ['::1/128', 'fe80::/10']) -proxyaddr(req, ['fe80::/ffc0::']) -``` - -This module will automatically work with IPv4-mapped IPv6 addresses -as well to support node.js in IPv6-only mode. This means that you do -not have to specify both `::ffff:a00:1` and `10.0.0.1`. - -As a convenience, this module also takes certain pre-defined names -in addition to IP addresses, which expand into IP addresses: - -```js -proxyaddr(req, 'loopback') -proxyaddr(req, ['loopback', 'fc00:ac:1ab5:fff::1/64']) -``` - - * `loopback`: IPv4 and IPv6 loopback addresses (like `::1` and - `127.0.0.1`). - * `linklocal`: IPv4 and IPv6 link-local addresses (like - `fe80::1:1:1:1` and `169.254.0.1`). - * `uniquelocal`: IPv4 private addresses and IPv6 unique-local - addresses (like `fc00:ac:1ab5:fff::1` and `192.168.0.1`). - -When `trust` is specified as a function, it will be called for each -address to determine if it is a trusted address. The function is -given two arguments: `addr` and `i`, where `addr` is a string of -the address to check and `i` is a number that represents the distance -from the socket address. - -### proxyaddr.all(req, [trust]) - -Return all the addresses of the request, optionally stopping at the -first untrusted. This array is ordered from closest to furthest -(i.e. `arr[0] === req.connection.remoteAddress`). - -```js -proxyaddr.all(req) -``` - -The optional `trust` argument takes the same arguments as `trust` -does in `proxyaddr(req, trust)`. - -```js -proxyaddr.all(req, 'loopback') -``` - -### proxyaddr.compile(val) - -Compiles argument `val` into a `trust` function. This function takes -the same arguments as `trust` does in `proxyaddr(req, trust)` and -returns a function suitable for `proxyaddr(req, trust)`. - -```js -var trust = proxyaddr.compile('localhost') -var addr = proxyaddr(req, trust) -``` - -This function is meant to be optimized for use against every request. -It is recommend to compile a trust function up-front for the trusted -configuration and pass that to `proxyaddr(req, trust)` for each request. - -## Testing - -```sh -$ npm test -``` - -## Benchmarks - -```sh -$ npm run-script bench -``` - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/index.js deleted file mode 100644 index 75ee432..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/index.js +++ /dev/null @@ -1,353 +0,0 @@ -/*! - * proxy-addr - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = proxyaddr; -module.exports.all = alladdrs; -module.exports.compile = compile; - -/** - * Module dependencies. - */ - -var ipaddr = require('ipaddr.js'); - -/** - * Variables. - */ - -var digitre = /^[0-9]+$/; -var isip = ipaddr.isValid; -var parseip = ipaddr.parse; - -/** - * Pre-defined IP ranges. - */ - -var ipranges = { - linklocal: ['169.254.0.0/16', 'fe80::/10'], - loopback: ['127.0.0.1/8', '::1/128'], - uniquelocal: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fc00::/7'] -}; - -/** - * Get all addresses in the request, optionally stopping - * at the first untrusted. - * - * @param {Object} request - * @param {Function|Array|String} [trust] - * @api public - */ - -function alladdrs(req, trust) { - if (!req) { - throw new TypeError('req argument is required'); - } - - var proxyAddrs = (req.headers['x-forwarded-for'] || '') - .split(/ *, */) - .filter(Boolean) - .reverse(); - var socketAddr = req.connection.remoteAddress; - var addrs = [socketAddr].concat(proxyAddrs); - - if (!trust) { - // Return all addresses - return addrs; - } - - if (typeof trust !== 'function') { - trust = compile(trust); - } - - for (var i = 0; i < addrs.length - 1; i++) { - if (trust(addrs[i], i)) continue; - - addrs.length = i + 1; - } - - return addrs; -} - -/** - * Compile argument into trust function. - * - * @param {Array|String} val - * @api private - */ - -function compile(val) { - if (!val) { - throw new TypeError('argument is required'); - } - - var trust = typeof val === 'string' - ? [val] - : val; - - if (!Array.isArray(trust)) { - throw new TypeError('unsupported trust argument'); - } - - for (var i = 0; i < trust.length; i++) { - val = trust[i]; - - if (!ipranges.hasOwnProperty(val)) { - continue; - } - - // Splice in pre-defined range - val = ipranges[val]; - trust.splice.apply(trust, [i, 1].concat(val)); - i += val.length - 1; - } - - return compileTrust(compileRangeSubnets(trust)); -} - -/** - * Compile `arr` elements into range subnets. - * - * @param {Array} arr - * @api private - */ - -function compileRangeSubnets(arr) { - var rangeSubnets = new Array(arr.length); - - for (var i = 0; i < arr.length; i++) { - rangeSubnets[i] = parseipNotation(arr[i]); - } - - return rangeSubnets; -} - -/** - * Compile range subnet array into trust function. - * - * @param {Array} rangeSubnets - * @api private - */ - -function compileTrust(rangeSubnets) { - // Return optimized function based on length - var len = rangeSubnets.length; - return len === 0 - ? trustNone - : len === 1 - ? trustSingle(rangeSubnets[0]) - : trustMulti(rangeSubnets); -} - -/** - * Parse IP notation string into range subnet. - * - * @param {String} note - * @api private - */ - -function parseipNotation(note) { - var ip; - var kind; - var max; - var pos = note.lastIndexOf('/'); - var range; - - ip = pos !== -1 - ? note.substring(0, pos) - : note; - - if (!isip(ip)) { - throw new TypeError('invalid IP address: ' + ip); - } - - ip = parseip(ip); - - kind = ip.kind(); - max = kind === 'ipv4' ? 32 - : kind === 'ipv6' ? 128 - : 0; - - range = pos !== -1 - ? note.substring(pos + 1, note.length) - : max; - - if (typeof range !== 'number') { - range = digitre.test(range) - ? parseInt(range, 10) - : isip(range) - ? parseNetmask(range) - : 0; - } - - if (ip.kind() === 'ipv6' && ip.isIPv4MappedAddress()) { - // Store as IPv4 - ip = ip.toIPv4Address(); - range = range <= max - ? range - 96 - : range; - } - - if (range <= 0 || range > max) { - throw new TypeError('invalid range on address: ' + note); - } - - return [ip, range]; -} - -/** - * Parse netmask string into CIDR range. - * - * @param {String} note - * @api private - */ - -function parseNetmask(netmask) { - var ip = parseip(netmask); - var parts; - var size; - - switch (ip.kind()) { - case 'ipv4': - parts = ip.octets; - size = 8; - break; - case 'ipv6': - parts = ip.parts; - size = 16; - break; - default: - throw new TypeError('unknown netmask'); - } - - var max = Math.pow(2, size) - 1; - var part; - var range = 0; - - for (var i = 0; i < parts.length; i++) { - part = parts[i] & max; - - if (part === max) { - range += size; - continue; - } - - while (part) { - part = (part << 1) & max; - range += 1; - } - - break; - } - - return range; -} - -/** - * Determine address of proxied request. - * - * @param {Object} request - * @param {Function|Array|String} trust - * @api public - */ - -function proxyaddr(req, trust) { - if (!req) { - throw new TypeError('req argument is required'); - } - - if (!trust) { - throw new TypeError('trust argument is required'); - } - - var addrs = alladdrs(req, trust); - var addr = addrs[addrs.length - 1]; - - return addr; -} - -/** - * Static trust function to trust nothing. - * - * @api private - */ - -function trustNone() { - return false; -} - -/** - * Compile trust function for multiple subnets. - * - * @param {Array} subnets - * @api private - */ - -function trustMulti(subnets) { - return function trust(addr) { - if (!isip(addr)) return false; - - var ip = parseip(addr); - var ipv4; - var kind = ip.kind(); - var subnet; - var subnetip; - var subnetkind; - var trusted; - - for (var i = 0; i < subnets.length; i++) { - subnet = subnets[i]; - subnetip = subnet[0]; - subnetkind = subnetip.kind(); - subnetrange = subnet[1]; - trusted = ip; - - if (kind !== subnetkind) { - if (kind !== 'ipv6' || subnetkind !== 'ipv4' || !ip.isIPv4MappedAddress()) { - continue; - } - - // Store addr as IPv4 - ipv4 = ipv4 || ip.toIPv4Address(); - trusted = ipv4; - } - - if (trusted.match(subnetip, subnetrange)) return true; - } - - return false; - }; -} - -/** - * Compile trust function for single subnet. - * - * @param {Object} subnet - * @api private - */ - -function trustSingle(subnet) { - var subnetip = subnet[0]; - var subnetkind = subnetip.kind(); - var subnetisipv4 = subnetkind === 'ipv4'; - var subnetrange = subnet[1]; - - return function trust(addr) { - if (!isip(addr)) return false; - - var ip = parseip(addr); - var kind = ip.kind(); - - return kind === subnetkind - ? ip.match(subnetip, subnetrange) - : subnetisipv4 && kind === 'ipv6' && ip.isIPv4MappedAddress() - ? ip.toIPv4Address().match(subnetip, subnetrange) - : false; - }; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore deleted file mode 100644 index 7a1537b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.idea -node_modules diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile deleted file mode 100644 index 7fd355a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile +++ /dev/null @@ -1,18 +0,0 @@ -fs = require 'fs' -CoffeeScript = require 'coffee-script' -nodeunit = require 'nodeunit' -UglifyJS = require 'uglify-js' - -task 'build', 'build the JavaScript files from CoffeeScript source', build = (cb) -> - source = fs.readFileSync 'src/ipaddr.coffee' - fs.writeFileSync 'lib/ipaddr.js', CoffeeScript.compile source.toString() - - invoke 'test' - invoke 'compress' - -task 'test', 'run the bundled tests', (cb) -> - nodeunit.reporters.default.run ['test'] - -task 'compress', 'uglify the resulting javascript', (cb) -> - result = UglifyJS.minify('lib/ipaddr.js') - fs.writeFileSync('ipaddr.min.js', result.code) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE deleted file mode 100644 index 3493f0d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2011 Peter Zotov - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md deleted file mode 100644 index a816672..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md +++ /dev/null @@ -1,149 +0,0 @@ -# ipaddr.js — an IPv6 and IPv4 address manipulation library - -ipaddr.js is a small (1.9K minified and gzipped) library for manipulating -IP addresses in JavaScript environments. It runs on both CommonJS runtimes -(e.g. [nodejs]) and in a web browser. - -ipaddr.js allows you to verify and parse string representation of an IP -address, match it against a CIDR range or range list, determine if it falls -into some reserved ranges (examples include loopback and private ranges), -and convert between IPv4 and IPv4-mapped IPv6 addresses. - -[nodejs]: http://nodejs.org - -## Installation - -`npm install ipaddr.js` - -## API - -ipaddr.js defines one object in the global scope: `ipaddr`. In CommonJS, -it is exported from the module: - -```js -var ipaddr = require('ipaddr.js'); -``` - -The API consists of several global methods and two classes: ipaddr.IPv6 and ipaddr.IPv4. - -### Global methods - -There are three global methods defined: `ipaddr.isValid`, `ipaddr.parse` and -`ipaddr.process`. All of them receive a string as a single parameter. - -The `ipaddr.isValid` method returns `true` if the address is a valid IPv4 or -IPv6 address, and `false` otherwise. It does not throw any exceptions. - -The `ipaddr.parse` method returns an object representing the IP address, -or throws an `Error` if the passed string is not a valid representation of an -IP address. - -The `ipaddr.process` method works just like the `ipaddr.parse` one, but it -automatically converts IPv4-mapped IPv6 addresses to their IPv4 couterparts -before returning. It is useful when you have a Node.js instance listening -on an IPv6 socket, and the `net.ivp6.bindv6only` sysctl parameter (or its -equivalent on non-Linux OS) is set to 0. In this case, you can accept IPv4 -connections on your IPv6-only socket, but the remote address will be mangled. -Use `ipaddr.process` method to automatically demangle it. - -### Object representation - -Parsing methods return an object which descends from `ipaddr.IPv6` or -`ipaddr.IPv4`. These objects share some properties, but most of them differ. - -#### Shared properties - -One can determine the type of address by calling `addr.kind()`. It will return -either `"ipv6"` or `"ipv4"`. - -An address can be converted back to its string representation with `addr.toString()`. -Note that this method: - * does not return the original string used to create the object (in fact, there is - no way of getting that string) - * returns a compact representation (when it is applicable) - -A `match(range, bits)` method can be used to check if the address falls into a -certain CIDR range. -Note that an address can be (obviously) matched only against an address of the same type. - -For example: - -```js -var addr = ipaddr.parse("2001:db8:1234::1"); -var range = ipaddr.parse("2001:db8::"); - -addr.match(range, 32); // => true -``` - -A `range()` method returns one of predefined names for several special ranges defined -by IP protocols. The exact names (and their respective CIDR ranges) can be looked up -in the source: [IPv6 ranges] and [IPv4 ranges]. Some common ones include `"unicast"` -(the default one) and `"reserved"`. - -You can match against your own range list by using -`ipaddr.subnetMatch(address, rangeList, defaultName)` method. It can work with both -IPv6 and IPv4 addresses, and accepts a name-to-subnet map as the range list. For example: - -```js -var rangeList = { - documentationOnly: [ ipaddr.parse('2001:db8::'), 32 ], - tunnelProviders: [ - [ ipaddr.parse('2001:470::'), 32 ], // he.net - [ ipaddr.parse('2001:5c0::'), 32 ] // freenet6 - ] -}; -ipaddr.subnetMatch(ipaddr.parse('2001:470:8:66::1'), rangeList, 'unknown'); // => "he.net" -``` - -The addresses can be converted to their byte representation with `toByteArray()`. -(Actually, JavaScript mostly does not know about byte buffers. They are emulated with -arrays of numbers, each in range of 0..255.) - -```js -var bytes = ipaddr.parse('2a00:1450:8007::68').toByteArray(); // ipv6.google.com -bytes // => [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, , 0x00, 0x68 ] -``` - -The `ipaddr.IPv4` and `ipaddr.IPv6` objects have some methods defined, too. All of them -have the same interface for both protocols, and are similar to global methods. - -`ipaddr.IPvX.isValid(string)` can be used to check if the string is a valid address -for particular protocol, and `ipaddr.IPvX.parse(string)` is the error-throwing parser. - -[IPv6 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L186 -[IPv4 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L71 - -#### IPv6 properties - -Sometimes you will want to convert IPv6 not to a compact string representation (with -the `::` substitution); the `toNormalizedString()` method will return an address where -all zeroes are explicit. - -For example: - -```js -var addr = ipaddr.parse("2001:0db8::0001"); -addr.toString(); // => "2001:db8::1" -addr.toNormalizedString(); // => "2001:db8:0:0:0:0:0:1" -``` - -The `isIPv4MappedAddress()` method will return `true` if this address is an IPv4-mapped -one, and `toIPv4Address()` will return an IPv4 object address. - -To access the underlying binary representation of the address, use `addr.parts`. - -```js -var addr = ipaddr.parse("2001:db8:10::1234:DEAD"); -addr.parts // => [0x2001, 0xdb8, 0x10, 0, 0, 0, 0x1234, 0xdead] -``` - -#### IPv4 properties - -`toIPv4MappedAddress()` will return a corresponding IPv4-mapped IPv6 address. - -To access the underlying representation of the address, use `addr.octets`. - -```js -var addr = ipaddr.parse("192.168.1.1"); -addr.octets // => [192, 168, 1, 1] -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js deleted file mode 100644 index 528d48b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var t,r,n,e,i,o,a,s;r={},s=this,"undefined"!=typeof module&&null!==module&&module.exports?module.exports=r:s.ipaddr=r,a=function(t,r,n,e){var i,o;if(t.length!==r.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;e>0;){if(o=n-e,0>o&&(o=0),t[i]>>o!==r[i]>>o)return!1;e-=n,i+=1}return!0},r.subnetMatch=function(t,r,n){var e,i,o,a,s;null==n&&(n="unicast");for(e in r)for(i=r[e],"[object Array]"!==toString.call(i[0])&&(i=[i]),a=0,s=i.length;s>a;a++)if(o=i[a],t.match.apply(t,o))return e;return n},r.IPv4=function(){function t(t){var r,n,e;if(4!==t.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(n=0,e=t.length;e>n;n++)if(r=t[n],!(r>=0&&255>=r))throw new Error("ipaddr: ipv4 octet is a byte");this.octets=t}return t.prototype.kind=function(){return"ipv4"},t.prototype.toString=function(){return this.octets.join(".")},t.prototype.toByteArray=function(){return this.octets.slice(0)},t.prototype.match=function(t,r){if("ipv4"!==t.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return a(this.octets,t.octets,8,r)},t.prototype.SpecialRanges={broadcast:[[new t([255,255,255,255]),32]],multicast:[[new t([224,0,0,0]),4]],linkLocal:[[new t([169,254,0,0]),16]],loopback:[[new t([127,0,0,0]),8]],"private":[[new t([10,0,0,0]),8],[new t([172,16,0,0]),12],[new t([192,168,0,0]),16]],reserved:[[new t([192,0,0,0]),24],[new t([192,0,2,0]),24],[new t([192,88,99,0]),24],[new t([198,51,100,0]),24],[new t([203,0,113,0]),24],[new t([240,0,0,0]),4]]},t.prototype.range=function(){return r.subnetMatch(this,this.SpecialRanges)},t.prototype.toIPv4MappedAddress=function(){return r.IPv6.parse("::ffff:"+this.toString())},t}(),n="(0?\\d+|0x[a-f0-9]+)",e={fourOctet:new RegExp("^"+n+"\\."+n+"\\."+n+"\\."+n+"$","i"),longValue:new RegExp("^"+n+"$","i")},r.IPv4.parser=function(t){var r,n,i,o,a;return n=function(t){return"0"===t[0]&&"x"!==t[1]?parseInt(t,8):parseInt(t)},(r=t.match(e.fourOctet))?function(){var t,e,o,a;for(o=r.slice(1,6),a=[],t=0,e=o.length;e>t;t++)i=o[t],a.push(n(i));return a}():(r=t.match(e.longValue))?(a=n(r[1]),function(){var t,r;for(r=[],o=t=0;24>=t;o=t+=8)r.push(a>>o&255);return r}().reverse()):null},r.IPv6=function(){function t(t){var r,n,e;if(8!==t.length)throw new Error("ipaddr: ipv6 part count should be 8");for(n=0,e=t.length;e>n;n++)if(r=t[n],!(r>=0&&65535>=r))throw new Error("ipaddr: ipv6 part should fit to two octets");this.parts=t}return t.prototype.kind=function(){return"ipv6"},t.prototype.toString=function(){var t,r,n,e,i,o,a;for(i=function(){var t,n,e,i;for(e=this.parts,i=[],t=0,n=e.length;n>t;t++)r=e[t],i.push(r.toString(16));return i}.call(this),t=[],n=function(r){return t.push(r)},e=0,o=0,a=i.length;a>o;o++)switch(r=i[o],e){case 0:"0"===r?n(""):n(r),e=1;break;case 1:"0"===r?e=2:n(r);break;case 2:"0"!==r&&(n(""),n(r),e=3);break;case 3:n(r)}return 2===e&&(n(""),n("")),t.join(":")},t.prototype.toByteArray=function(){var t,r,n,e,i;for(t=[],i=this.parts,n=0,e=i.length;e>n;n++)r=i[n],t.push(r>>8),t.push(255&r);return t},t.prototype.toNormalizedString=function(){var t;return function(){var r,n,e,i;for(e=this.parts,i=[],r=0,n=e.length;n>r;r++)t=e[r],i.push(t.toString(16));return i}.call(this).join(":")},t.prototype.match=function(t,r){if("ipv6"!==t.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return a(this.parts,t.parts,16,r)},t.prototype.SpecialRanges={unspecified:[new t([0,0,0,0,0,0,0,0]),128],linkLocal:[new t([65152,0,0,0,0,0,0,0]),10],multicast:[new t([65280,0,0,0,0,0,0,0]),8],loopback:[new t([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new t([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new t([0,0,0,0,0,65535,0,0]),96],rfc6145:[new t([0,0,0,0,65535,0,0,0]),96],rfc6052:[new t([100,65435,0,0,0,0,0,0]),96],"6to4":[new t([8194,0,0,0,0,0,0,0]),16],teredo:[new t([8193,0,0,0,0,0,0,0]),32],reserved:[[new t([8193,3512,0,0,0,0,0,0]),32]]},t.prototype.range=function(){return r.subnetMatch(this,this.SpecialRanges)},t.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},t.prototype.toIPv4Address=function(){var t,n,e;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return e=this.parts.slice(-2),t=e[0],n=e[1],new r.IPv4([t>>8,255&t,n>>8,255&n])},t}(),i="(?:[0-9a-f]+::?)+",o={"native":new RegExp("^(::)?("+i+")?([0-9a-f]+)?(::)?$","i"),transitional:new RegExp("^((?:"+i+")|(?:::)(?:"+i+")?)"+(""+n+"\\."+n+"\\."+n+"\\."+n+"$"),"i")},t=function(t,r){var n,e,i,o,a;if(t.indexOf("::")!==t.lastIndexOf("::"))return null;for(n=0,e=-1;(e=t.indexOf(":",e+1))>=0;)n++;for(":"===t[0]&&n--,":"===t[t.length-1]&&n--,a=r-n,o=":";a--;)o+="0:";return t=t.replace("::",o),":"===t[0]&&(t=t.slice(1)),":"===t[t.length-1]&&(t=t.slice(0,-1)),function(){var r,n,e,o;for(e=t.split(":"),o=[],r=0,n=e.length;n>r;r++)i=e[r],o.push(parseInt(i,16));return o}()},r.IPv6.parser=function(r){var n,e;return r.match(o["native"])?t(r,8):(n=r.match(o.transitional))&&(e=t(n[1].slice(0,-1),6))?(e.push(parseInt(n[2])<<8|parseInt(n[3])),e.push(parseInt(n[4])<<8|parseInt(n[5])),e):null},r.IPv4.isIPv4=r.IPv6.isIPv6=function(t){return null!==this.parser(t)},r.IPv4.isValid=r.IPv6.isValid=function(t){var r;try{return new this(this.parser(t)),!0}catch(n){return r=n,!1}},r.IPv4.parse=r.IPv6.parse=function(t){var r;if(r=this.parser(t),null===r)throw new Error("ipaddr: string is not formatted like ip address");return new this(r)},r.isValid=function(t){return r.IPv6.isValid(t)||r.IPv4.isValid(t)},r.parse=function(t){if(r.IPv6.isIPv6(t))return r.IPv6.parse(t);if(r.IPv4.isIPv4(t))return r.IPv4.parse(t);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},r.process=function(t){var r;return r=this.parse(t),"ipv6"===r.kind()&&r.isIPv4MappedAddress()?r.toIPv4Address():r}}).call(this); \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js deleted file mode 100644 index 2319737..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js +++ /dev/null @@ -1,401 +0,0 @@ -(function() { - var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root; - - ipaddr = {}; - - root = this; - - if ((typeof module !== "undefined" && module !== null) && module.exports) { - module.exports = ipaddr; - } else { - root['ipaddr'] = ipaddr; - } - - matchCIDR = function(first, second, partSize, cidrBits) { - var part, shift; - if (first.length !== second.length) { - throw new Error("ipaddr: cannot match CIDR for objects with different lengths"); - } - part = 0; - while (cidrBits > 0) { - shift = partSize - cidrBits; - if (shift < 0) { - shift = 0; - } - if (first[part] >> shift !== second[part] >> shift) { - return false; - } - cidrBits -= partSize; - part += 1; - } - return true; - }; - - ipaddr.subnetMatch = function(address, rangeList, defaultName) { - var rangeName, rangeSubnets, subnet, _i, _len; - if (defaultName == null) { - defaultName = 'unicast'; - } - for (rangeName in rangeList) { - rangeSubnets = rangeList[rangeName]; - if (toString.call(rangeSubnets[0]) !== '[object Array]') { - rangeSubnets = [rangeSubnets]; - } - for (_i = 0, _len = rangeSubnets.length; _i < _len; _i++) { - subnet = rangeSubnets[_i]; - if (address.match.apply(address, subnet)) { - return rangeName; - } - } - } - return defaultName; - }; - - ipaddr.IPv4 = (function() { - function IPv4(octets) { - var octet, _i, _len; - if (octets.length !== 4) { - throw new Error("ipaddr: ipv4 octet count should be 4"); - } - for (_i = 0, _len = octets.length; _i < _len; _i++) { - octet = octets[_i]; - if (!((0 <= octet && octet <= 255))) { - throw new Error("ipaddr: ipv4 octet is a byte"); - } - } - this.octets = octets; - } - - IPv4.prototype.kind = function() { - return 'ipv4'; - }; - - IPv4.prototype.toString = function() { - return this.octets.join("."); - }; - - IPv4.prototype.toByteArray = function() { - return this.octets.slice(0); - }; - - IPv4.prototype.match = function(other, cidrRange) { - if (other.kind() !== 'ipv4') { - throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one"); - } - return matchCIDR(this.octets, other.octets, 8, cidrRange); - }; - - IPv4.prototype.SpecialRanges = { - broadcast: [[new IPv4([255, 255, 255, 255]), 32]], - multicast: [[new IPv4([224, 0, 0, 0]), 4]], - linkLocal: [[new IPv4([169, 254, 0, 0]), 16]], - loopback: [[new IPv4([127, 0, 0, 0]), 8]], - "private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]], - reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]] - }; - - IPv4.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv4.prototype.toIPv4MappedAddress = function() { - return ipaddr.IPv6.parse("::ffff:" + (this.toString())); - }; - - return IPv4; - - })(); - - ipv4Part = "(0?\\d+|0x[a-f0-9]+)"; - - ipv4Regexes = { - fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'), - longValue: new RegExp("^" + ipv4Part + "$", 'i') - }; - - ipaddr.IPv4.parser = function(string) { - var match, parseIntAuto, part, shift, value; - parseIntAuto = function(string) { - if (string[0] === "0" && string[1] !== "x") { - return parseInt(string, 8); - } else { - return parseInt(string); - } - }; - if (match = string.match(ipv4Regexes.fourOctet)) { - return (function() { - var _i, _len, _ref, _results; - _ref = match.slice(1, 6); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(parseIntAuto(part)); - } - return _results; - })(); - } else if (match = string.match(ipv4Regexes.longValue)) { - value = parseIntAuto(match[1]); - return ((function() { - var _i, _results; - _results = []; - for (shift = _i = 0; _i <= 24; shift = _i += 8) { - _results.push((value >> shift) & 0xff); - } - return _results; - })()).reverse(); - } else { - return null; - } - }; - - ipaddr.IPv6 = (function() { - function IPv6(parts) { - var part, _i, _len; - if (parts.length !== 8) { - throw new Error("ipaddr: ipv6 part count should be 8"); - } - for (_i = 0, _len = parts.length; _i < _len; _i++) { - part = parts[_i]; - if (!((0 <= part && part <= 0xffff))) { - throw new Error("ipaddr: ipv6 part should fit to two octets"); - } - } - this.parts = parts; - } - - IPv6.prototype.kind = function() { - return 'ipv6'; - }; - - IPv6.prototype.toString = function() { - var compactStringParts, part, pushPart, state, stringParts, _i, _len; - stringParts = (function() { - var _i, _len, _ref, _results; - _ref = this.parts; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(part.toString(16)); - } - return _results; - }).call(this); - compactStringParts = []; - pushPart = function(part) { - return compactStringParts.push(part); - }; - state = 0; - for (_i = 0, _len = stringParts.length; _i < _len; _i++) { - part = stringParts[_i]; - switch (state) { - case 0: - if (part === '0') { - pushPart(''); - } else { - pushPart(part); - } - state = 1; - break; - case 1: - if (part === '0') { - state = 2; - } else { - pushPart(part); - } - break; - case 2: - if (part !== '0') { - pushPart(''); - pushPart(part); - state = 3; - } - break; - case 3: - pushPart(part); - } - } - if (state === 2) { - pushPart(''); - pushPart(''); - } - return compactStringParts.join(":"); - }; - - IPv6.prototype.toByteArray = function() { - var bytes, part, _i, _len, _ref; - bytes = []; - _ref = this.parts; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - bytes.push(part >> 8); - bytes.push(part & 0xff); - } - return bytes; - }; - - IPv6.prototype.toNormalizedString = function() { - var part; - return ((function() { - var _i, _len, _ref, _results; - _ref = this.parts; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(part.toString(16)); - } - return _results; - }).call(this)).join(":"); - }; - - IPv6.prototype.match = function(other, cidrRange) { - if (other.kind() !== 'ipv6') { - throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one"); - } - return matchCIDR(this.parts, other.parts, 16, cidrRange); - }; - - IPv6.prototype.SpecialRanges = { - unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128], - linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10], - multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8], - loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128], - uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7], - ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96], - rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96], - rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96], - '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16], - teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32], - reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]] - }; - - IPv6.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv6.prototype.isIPv4MappedAddress = function() { - return this.range() === 'ipv4Mapped'; - }; - - IPv6.prototype.toIPv4Address = function() { - var high, low, _ref; - if (!this.isIPv4MappedAddress()) { - throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4"); - } - _ref = this.parts.slice(-2), high = _ref[0], low = _ref[1]; - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]); - }; - - return IPv6; - - })(); - - ipv6Part = "(?:[0-9a-f]+::?)+"; - - ipv6Regexes = { - "native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?$", 'i'), - transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + ("" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$"), 'i') - }; - - expandIPv6 = function(string, parts) { - var colonCount, lastColon, part, replacement, replacementCount; - if (string.indexOf('::') !== string.lastIndexOf('::')) { - return null; - } - colonCount = 0; - lastColon = -1; - while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) { - colonCount++; - } - if (string[0] === ':') { - colonCount--; - } - if (string[string.length - 1] === ':') { - colonCount--; - } - replacementCount = parts - colonCount; - replacement = ':'; - while (replacementCount--) { - replacement += '0:'; - } - string = string.replace('::', replacement); - if (string[0] === ':') { - string = string.slice(1); - } - if (string[string.length - 1] === ':') { - string = string.slice(0, -1); - } - return (function() { - var _i, _len, _ref, _results; - _ref = string.split(":"); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - part = _ref[_i]; - _results.push(parseInt(part, 16)); - } - return _results; - })(); - }; - - ipaddr.IPv6.parser = function(string) { - var match, parts; - if (string.match(ipv6Regexes['native'])) { - return expandIPv6(string, 8); - } else if (match = string.match(ipv6Regexes['transitional'])) { - parts = expandIPv6(match[1].slice(0, -1), 6); - if (parts) { - parts.push(parseInt(match[2]) << 8 | parseInt(match[3])); - parts.push(parseInt(match[4]) << 8 | parseInt(match[5])); - return parts; - } - } - return null; - }; - - ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) { - return this.parser(string) !== null; - }; - - ipaddr.IPv4.isValid = ipaddr.IPv6.isValid = function(string) { - var e; - try { - new this(this.parser(string)); - return true; - } catch (_error) { - e = _error; - return false; - } - }; - - ipaddr.IPv4.parse = ipaddr.IPv6.parse = function(string) { - var parts; - parts = this.parser(string); - if (parts === null) { - throw new Error("ipaddr: string is not formatted like ip address"); - } - return new this(parts); - }; - - ipaddr.isValid = function(string) { - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string); - }; - - ipaddr.parse = function(string) { - if (ipaddr.IPv6.isIPv6(string)) { - return ipaddr.IPv6.parse(string); - } else if (ipaddr.IPv4.isIPv4(string)) { - return ipaddr.IPv4.parse(string); - } else { - throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format"); - } - }; - - ipaddr.process = function(string) { - var addr; - addr = this.parse(string); - if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) { - return addr.toIPv4Address(); - } else { - return addr; - } - }; - -}).call(this); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json deleted file mode 100644 index f375304..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "ipaddr.js", - "description": "A library for manipulating IPv4 and IPv6 addresses in JavaScript.", - "version": "0.1.2", - "author": { - "name": "Peter Zotov", - "email": "whitequark@whitequark.org" - }, - "directories": { - "lib": "./lib" - }, - "dependencies": {}, - "devDependencies": { - "coffee-script": "~1.6", - "nodeunit": "~0.5.3", - "uglify-js": "latest" - }, - "scripts": { - "test": "cake build test" - }, - "keywords": [ - "ip", - "ipv4", - "ipv6" - ], - "repository": { - "type": "git", - "url": "git://github.com/whitequark/ipaddr.js" - }, - "main": "./lib/ipaddr", - "engines": { - "node": ">= 0.2.5" - }, - "bugs": { - "url": "https://github.com/whitequark/ipaddr.js/issues" - }, - "_id": "ipaddr.js@0.1.2", - "dist": { - "shasum": "6a1fd3d854f5002965c34d7bbcd9b4a8d4b0467e", - "tarball": "http://registry.npmjs.org/ipaddr.js/-/ipaddr.js-0.1.2.tgz" - }, - "_from": "ipaddr.js@0.1.2", - "_npmVersion": "1.3.10", - "_npmUser": { - "name": "whitequark", - "email": "whitequark@whitequark.org" - }, - "maintainers": [ - { - "name": "whitequark", - "email": "whitequark@whitequark.org" - } - ], - "_shasum": "6a1fd3d854f5002965c34d7bbcd9b4a8d4b0467e", - "_resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-0.1.2.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/whitequark/ipaddr.js" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee deleted file mode 100644 index 4c89ded..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee +++ /dev/null @@ -1,344 +0,0 @@ -# Define the main object -ipaddr = {} - -root = this - -# Export for both the CommonJS and browser-like environment -if module? && module.exports - module.exports = ipaddr -else - root['ipaddr'] = ipaddr - -# A generic CIDR (Classless Inter-Domain Routing) RFC1518 range matcher. -matchCIDR = (first, second, partSize, cidrBits) -> - if first.length != second.length - throw new Error "ipaddr: cannot match CIDR for objects with different lengths" - - part = 0 - while cidrBits > 0 - shift = partSize - cidrBits - shift = 0 if shift < 0 - - if first[part] >> shift != second[part] >> shift - return false - - cidrBits -= partSize - part += 1 - - return true - -# An utility function to ease named range matching. See examples below. -ipaddr.subnetMatch = (address, rangeList, defaultName='unicast') -> - for rangeName, rangeSubnets of rangeList - # ECMA5 Array.isArray isn't available everywhere - if toString.call(rangeSubnets[0]) != '[object Array]' - rangeSubnets = [ rangeSubnets ] - - for subnet in rangeSubnets - return rangeName if address.match.apply(address, subnet) - - return defaultName - -# An IPv4 address (RFC791). -class ipaddr.IPv4 - # Constructs a new IPv4 address from an array of four octets. - # Verifies the input. - constructor: (octets) -> - if octets.length != 4 - throw new Error "ipaddr: ipv4 octet count should be 4" - - for octet in octets - if !(0 <= octet <= 255) - throw new Error "ipaddr: ipv4 octet is a byte" - - @octets = octets - - # The 'kind' method exists on both IPv4 and IPv6 classes. - kind: -> - return 'ipv4' - - # Returns the address in convenient, decimal-dotted format. - toString: -> - return @octets.join "." - - # Returns an array of byte-sized values in network order - toByteArray: -> - return @octets.slice(0) # octets.clone - - # Checks if this address matches other one within given CIDR range. - match: (other, cidrRange) -> - if other.kind() != 'ipv4' - throw new Error "ipaddr: cannot match ipv4 address with non-ipv4 one" - - return matchCIDR(this.octets, other.octets, 8, cidrRange) - - # Special IPv4 address ranges. - SpecialRanges: - broadcast: [ - [ new IPv4([255, 255, 255, 255]), 32 ] - ] - multicast: [ # RFC3171 - [ new IPv4([224, 0, 0, 0]), 4 ] - ] - linkLocal: [ # RFC3927 - [ new IPv4([169, 254, 0, 0]), 16 ] - ] - loopback: [ # RFC5735 - [ new IPv4([127, 0, 0, 0]), 8 ] - ] - private: [ # RFC1918 - [ new IPv4([10, 0, 0, 0]), 8 ] - [ new IPv4([172, 16, 0, 0]), 12 ] - [ new IPv4([192, 168, 0, 0]), 16 ] - ] - reserved: [ # Reserved and testing-only ranges; RFCs 5735, 5737, 2544, 1700 - [ new IPv4([192, 0, 0, 0]), 24 ] - [ new IPv4([192, 0, 2, 0]), 24 ] - [ new IPv4([192, 88, 99, 0]), 24 ] - [ new IPv4([198, 51, 100, 0]), 24 ] - [ new IPv4([203, 0, 113, 0]), 24 ] - [ new IPv4([240, 0, 0, 0]), 4 ] - ] - - # Checks if the address corresponds to one of the special ranges. - range: -> - return ipaddr.subnetMatch(this, @SpecialRanges) - - # Convrets this IPv4 address to an IPv4-mapped IPv6 address. - toIPv4MappedAddress: -> - return ipaddr.IPv6.parse "::ffff:#{@toString()}" - -# A list of regular expressions that match arbitrary IPv4 addresses, -# for which a number of weird notations exist. -# Note that an address like 0010.0xa5.1.1 is considered legal. -ipv4Part = "(0?\\d+|0x[a-f0-9]+)" -ipv4Regexes = - fourOctet: new RegExp "^#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}$", 'i' - longValue: new RegExp "^#{ipv4Part}$", 'i' - -# Classful variants (like a.b, where a is an octet, and b is a 24-bit -# value representing last three octets; this corresponds to a class C -# address) are omitted due to classless nature of modern Internet. -ipaddr.IPv4.parser = (string) -> - parseIntAuto = (string) -> - if string[0] == "0" && string[1] != "x" - parseInt(string, 8) - else - parseInt(string) - - # parseInt recognizes all that octal & hexadecimal weirdness for us - if match = string.match(ipv4Regexes.fourOctet) - return (parseIntAuto(part) for part in match[1..5]) - else if match = string.match(ipv4Regexes.longValue) - value = parseIntAuto(match[1]) - return ((value >> shift) & 0xff for shift in [0..24] by 8).reverse() - else - return null - -# An IPv6 address (RFC2460) -class ipaddr.IPv6 - # Constructs an IPv6 address from an array of eight 16-bit parts. - # Throws an error if the input is invalid. - constructor: (parts) -> - if parts.length != 8 - throw new Error "ipaddr: ipv6 part count should be 8" - - for part in parts - if !(0 <= part <= 0xffff) - throw new Error "ipaddr: ipv6 part should fit to two octets" - - @parts = parts - - # The 'kind' method exists on both IPv4 and IPv6 classes. - kind: -> - return 'ipv6' - - # Returns the address in compact, human-readable format like - # 2001:db8:8:66::1 - toString: -> - stringParts = (part.toString(16) for part in @parts) - - compactStringParts = [] - pushPart = (part) -> compactStringParts.push part - - state = 0 - for part in stringParts - switch state - when 0 - if part == '0' - pushPart('') - else - pushPart(part) - - state = 1 - when 1 - if part == '0' - state = 2 - else - pushPart(part) - when 2 - unless part == '0' - pushPart('') - pushPart(part) - state = 3 - when 3 - pushPart(part) - - if state == 2 - pushPart('') - pushPart('') - - return compactStringParts.join ":" - - # Returns an array of byte-sized values in network order - toByteArray: -> - bytes = [] - for part in @parts - bytes.push(part >> 8) - bytes.push(part & 0xff) - - return bytes - - # Returns the address in expanded format with all zeroes included, like - # 2001:db8:8:66:0:0:0:1 - toNormalizedString: -> - return (part.toString(16) for part in @parts).join ":" - - # Checks if this address matches other one within given CIDR range. - match: (other, cidrRange) -> - if other.kind() != 'ipv6' - throw new Error "ipaddr: cannot match ipv6 address with non-ipv6 one" - - return matchCIDR(this.parts, other.parts, 16, cidrRange) - - # Special IPv6 ranges - SpecialRanges: - unspecified: [ new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128 ] # RFC4291, here and after - linkLocal: [ new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10 ] - multicast: [ new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8 ] - loopback: [ new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128 ] - uniqueLocal: [ new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7 ] - ipv4Mapped: [ new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96 ] - rfc6145: [ new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96 ] # RFC6145 - rfc6052: [ new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96 ] # RFC6052 - '6to4': [ new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16 ] # RFC3056 - teredo: [ new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32 ] # RFC6052, RFC6146 - reserved: [ - [ new IPv6([ 0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32 ] # RFC4291 - ] - - # Checks if the address corresponds to one of the special ranges. - range: -> - return ipaddr.subnetMatch(this, @SpecialRanges) - - # Checks if this address is an IPv4-mapped IPv6 address. - isIPv4MappedAddress: -> - return @range() == 'ipv4Mapped' - - # Converts this address to IPv4 address if it is an IPv4-mapped IPv6 address. - # Throws an error otherwise. - toIPv4Address: -> - unless @isIPv4MappedAddress() - throw new Error "ipaddr: trying to convert a generic ipv6 address to ipv4" - - [high, low] = @parts[-2..-1] - - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]) - -# IPv6-matching regular expressions. -# For IPv6, the task is simpler: it is enough to match the colon-delimited -# hexadecimal IPv6 and a transitional variant with dotted-decimal IPv4 at -# the end. -ipv6Part = "(?:[0-9a-f]+::?)+" -ipv6Regexes = - native: new RegExp "^(::)?(#{ipv6Part})?([0-9a-f]+)?(::)?$", 'i' - transitional: new RegExp "^((?:#{ipv6Part})|(?:::)(?:#{ipv6Part})?)" + - "#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}\\.#{ipv4Part}$", 'i' - -# Expand :: in an IPv6 address or address part consisting of `parts` groups. -expandIPv6 = (string, parts) -> - # More than one '::' means invalid adddress - if string.indexOf('::') != string.lastIndexOf('::') - return null - - # How many parts do we already have? - colonCount = 0 - lastColon = -1 - while (lastColon = string.indexOf(':', lastColon + 1)) >= 0 - colonCount++ - - # 0::0 is two parts more than :: - colonCount-- if string[0] == ':' - colonCount-- if string[string.length-1] == ':' - - # replacement = ':' + '0:' * (parts - colonCount) - replacementCount = parts - colonCount - replacement = ':' - while replacementCount-- - replacement += '0:' - - # Insert the missing zeroes - string = string.replace('::', replacement) - - # Trim any garbage which may be hanging around if :: was at the edge in - # the source string - string = string[1..-1] if string[0] == ':' - string = string[0..-2] if string[string.length-1] == ':' - - return (parseInt(part, 16) for part in string.split(":")) - -# Parse an IPv6 address. -ipaddr.IPv6.parser = (string) -> - if string.match(ipv6Regexes['native']) - return expandIPv6(string, 8) - - else if match = string.match(ipv6Regexes['transitional']) - parts = expandIPv6(match[1][0..-2], 6) - if parts - parts.push(parseInt(match[2]) << 8 | parseInt(match[3])) - parts.push(parseInt(match[4]) << 8 | parseInt(match[5])) - return parts - - return null - -# Checks if a given string is formatted like IPv4/IPv6 address. -ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = (string) -> - return @parser(string) != null - -# Checks if a given string is a valid IPv4/IPv6 address. -ipaddr.IPv4.isValid = ipaddr.IPv6.isValid = (string) -> - try - new this(@parser(string)) - return true - catch e - return false - -# Tries to parse and validate a string with IPv4/IPv6 address. -# Throws an error if it fails. -ipaddr.IPv4.parse = ipaddr.IPv6.parse = (string) -> - parts = @parser(string) - if parts == null - throw new Error "ipaddr: string is not formatted like ip address" - - return new this(parts) - -# Checks if the address is valid IP address -ipaddr.isValid = (string) -> - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string) - -# Try to parse an address and throw an error if it is impossible -ipaddr.parse = (string) -> - if ipaddr.IPv6.isIPv6(string) - return ipaddr.IPv6.parse(string) - else if ipaddr.IPv4.isIPv4(string) - return ipaddr.IPv4.parse(string) - else - throw new Error "ipaddr: the address has neither IPv6 nor IPv4 format" - -# Parse an address and return plain IPv4 address if it is an IPv4-mapped address -ipaddr.process = (string) -> - addr = @parse(string) - if addr.kind() == 'ipv6' && addr.isIPv4MappedAddress() - return addr.toIPv4Address() - else - return addr diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee deleted file mode 100644 index 56751da..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee +++ /dev/null @@ -1,209 +0,0 @@ -ipaddr = require '../lib/ipaddr' - -module.exports = - 'should define main classes': (test) -> - test.ok(ipaddr.IPv4?, 'defines IPv4 class') - test.ok(ipaddr.IPv6?, 'defines IPv6 class') - test.done() - - 'can construct IPv4 from octets': (test) -> - test.doesNotThrow -> - new ipaddr.IPv4([192, 168, 1, 2]) - test.done() - - 'refuses to construct invalid IPv4': (test) -> - test.throws -> - new ipaddr.IPv4([300, 1, 2, 3]) - test.throws -> - new ipaddr.IPv4([8, 8, 8]) - test.done() - - 'converts IPv4 to string correctly': (test) -> - addr = new ipaddr.IPv4([192, 168, 1, 1]) - test.equal(addr.toString(), '192.168.1.1') - test.done() - - 'returns correct kind for IPv4': (test) -> - addr = new ipaddr.IPv4([1, 2, 3, 4]) - test.equal(addr.kind(), 'ipv4') - test.done() - - 'allows to access IPv4 octets': (test) -> - addr = new ipaddr.IPv4([42, 0, 0, 0]) - test.equal(addr.octets[0], 42) - test.done() - - 'checks IPv4 address format': (test) -> - test.equal(ipaddr.IPv4.isIPv4('192.168.007.0xa'), true) - test.equal(ipaddr.IPv4.isIPv4('1024.0.0.1'), true) - test.equal(ipaddr.IPv4.isIPv4('8.0xa.wtf.6'), false) - test.done() - - 'validates IPv4 addresses': (test) -> - test.equal(ipaddr.IPv4.isValid('192.168.007.0xa'), true) - test.equal(ipaddr.IPv4.isValid('1024.0.0.1'), false) - test.equal(ipaddr.IPv4.isValid('8.0xa.wtf.6'), false) - test.done() - - 'parses IPv4 in several weird formats': (test) -> - test.deepEqual(ipaddr.IPv4.parse('192.168.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('0xc0.168.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('192.0250.1.1').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('0xc0a80101').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('030052000401').octets, [192, 168, 1, 1]) - test.deepEqual(ipaddr.IPv4.parse('3232235777').octets, [192, 168, 1, 1]) - test.done() - - 'barfs at invalid IPv4': (test) -> - test.throws -> - ipaddr.IPv4.parse('10.0.0.wtf') - test.done() - - 'matches IPv4 CIDR correctly': (test) -> - addr = new ipaddr.IPv4([10, 5, 0, 1]) - test.equal(addr.match(ipaddr.IPv4.parse('0.0.0.0'), 0), true) - test.equal(addr.match(ipaddr.IPv4.parse('11.0.0.0'), 8), false) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.0'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.1'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.10'), 8), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.5.5.0'), 16), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 16), false) - test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 15), true) - test.equal(addr.match(ipaddr.IPv4.parse('10.5.0.2'), 32), false) - test.equal(addr.match(addr, 32), true) - test.done() - - 'detects reserved IPv4 networks': (test) -> - test.equal(ipaddr.IPv4.parse('10.1.0.1').range(), 'private') - test.equal(ipaddr.IPv4.parse('192.168.2.1').range(), 'private') - test.equal(ipaddr.IPv4.parse('224.100.0.1').range(), 'multicast') - test.equal(ipaddr.IPv4.parse('169.254.15.0').range(), 'linkLocal') - test.equal(ipaddr.IPv4.parse('127.1.1.1').range(), 'loopback') - test.equal(ipaddr.IPv4.parse('255.255.255.255').range(), 'broadcast') - test.equal(ipaddr.IPv4.parse('240.1.2.3').range(), 'reserved') - test.equal(ipaddr.IPv4.parse('8.8.8.8').range(), 'unicast') - test.done() - - 'can construct IPv6 from parts': (test) -> - test.doesNotThrow -> - new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.done() - - 'refuses to construct invalid IPv6': (test) -> - test.throws -> - new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 0, 1]) - test.throws -> - new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 1]) - test.done() - - 'converts IPv6 to string correctly': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.equal(addr.toNormalizedString(), '2001:db8:f53a:0:0:0:0:1') - test.equal(addr.toString(), '2001:db8:f53a::1') - test.equal(new ipaddr.IPv6([0, 0, 0, 0, 0, 0, 0, 1]).toString(), '::1') - test.equal(new ipaddr.IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]).toString(), '2001:db8::') - test.done() - - 'returns correct kind for IPv6': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.equal(addr.kind(), 'ipv6') - test.done() - - 'allows to access IPv6 address parts': (test) -> - addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 42, 0, 1]) - test.equal(addr.parts[5], 42) - test.done() - - 'checks IPv6 address format': (test) -> - test.equal(ipaddr.IPv6.isIPv6('2001:db8:F53A::1'), true) - test.equal(ipaddr.IPv6.isIPv6('200001::1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:192.168.1.1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1'), true) - test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1:0'), false) - test.equal(ipaddr.IPv6.isIPv6('fe80::wtf'), false) - test.done() - - 'validates IPv6 addresses': (test) -> - test.equal(ipaddr.IPv6.isValid('2001:db8:F53A::1'), true) - test.equal(ipaddr.IPv6.isValid('200001::1'), false) - test.equal(ipaddr.IPv6.isValid('::ffff:192.168.1.1'), true) - test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1'), false) - test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1:0'), false) - test.equal(ipaddr.IPv6.isValid('2001:db8::F53A::1'), false) - test.equal(ipaddr.IPv6.isValid('fe80::wtf'), false) - test.done() - - 'parses IPv6 in different formats': (test) -> - test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A:0:0:0:0:1').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]) - test.deepEqual(ipaddr.IPv6.parse('fe80::10').parts, [0xfe80, 0, 0, 0, 0, 0, 0, 0x10]) - test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A::').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 0]) - test.deepEqual(ipaddr.IPv6.parse('::1').parts, [0, 0, 0, 0, 0, 0, 0, 1]) - test.deepEqual(ipaddr.IPv6.parse('::').parts, [0, 0, 0, 0, 0, 0, 0, 0]) - test.done() - - 'barfs at invalid IPv6': (test) -> - test.throws -> - ipaddr.IPv6.parse('fe80::0::1') - test.done() - - 'matches IPv6 CIDR correctly': (test) -> - addr = ipaddr.IPv6.parse('2001:db8:f53a::1') - test.equal(addr.match(ipaddr.IPv6.parse('::'), 0), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53a::1:1'), 64), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53b::1:1'), 48), false) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f531::1:1'), 44), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f500::1'), 40), true) - test.equal(addr.match(ipaddr.IPv6.parse('2001:db9:f500::1'), 40), false) - test.equal(addr.match(addr, 128), true) - test.done() - - 'converts between IPv4-mapped IPv6 addresses and IPv4 addresses': (test) -> - addr = ipaddr.IPv4.parse('77.88.21.11') - mapped = addr.toIPv4MappedAddress() - test.deepEqual(mapped.parts, [0, 0, 0, 0, 0, 0xffff, 0x4d58, 0x150b]) - test.deepEqual(mapped.toIPv4Address().octets, addr.octets) - test.done() - - 'refuses to convert non-IPv4-mapped IPv6 address to IPv4 address': (test) -> - test.throws -> - ipaddr.IPv6.parse('2001:db8::1').toIPv4Address() - test.done() - - 'detects reserved IPv6 networks': (test) -> - test.equal(ipaddr.IPv6.parse('::').range(), 'unspecified') - test.equal(ipaddr.IPv6.parse('fe80::1234:5678:abcd:0123').range(), 'linkLocal') - test.equal(ipaddr.IPv6.parse('ff00::1234').range(), 'multicast') - test.equal(ipaddr.IPv6.parse('::1').range(), 'loopback') - test.equal(ipaddr.IPv6.parse('fc00::').range(), 'uniqueLocal') - test.equal(ipaddr.IPv6.parse('::ffff:192.168.1.10').range(), 'ipv4Mapped') - test.equal(ipaddr.IPv6.parse('::ffff:0:192.168.1.10').range(), 'rfc6145') - test.equal(ipaddr.IPv6.parse('64:ff9b::1234').range(), 'rfc6052') - test.equal(ipaddr.IPv6.parse('2002:1f63:45e8::1').range(), '6to4') - test.equal(ipaddr.IPv6.parse('2001::4242').range(), 'teredo') - test.equal(ipaddr.IPv6.parse('2001:db8::3210').range(), 'reserved') - test.equal(ipaddr.IPv6.parse('2001:470:8:66::1').range(), 'unicast') - test.done() - - 'is able to determine IP address type': (test) -> - test.equal(ipaddr.parse('8.8.8.8').kind(), 'ipv4') - test.equal(ipaddr.parse('2001:db8:3312::1').kind(), 'ipv6') - test.done() - - 'throws an error if tried to parse an invalid address': (test) -> - test.throws -> - ipaddr.parse('::some.nonsense') - test.done() - - 'correctly processes IPv4-mapped addresses': (test) -> - test.equal(ipaddr.process('8.8.8.8').kind(), 'ipv4') - test.equal(ipaddr.process('2001:db8:3312::1').kind(), 'ipv6') - test.equal(ipaddr.process('::ffff:192.168.1.1').kind(), 'ipv4') - test.done() - - 'correctly converts IPv6 and IPv4 addresses to byte arrays': (test) -> - test.deepEqual(ipaddr.parse('1.2.3.4').toByteArray(), - [0x1, 0x2, 0x3, 0x4]); - # Fuck yeah. The first byte of Google's IPv6 address is 42. 42! - test.deepEqual(ipaddr.parse('2a00:1450:8007::68').toByteArray(), - [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68 ]) - test.done() diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/package.json deleted file mode 100644 index e5dfcb6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/proxy-addr/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "proxy-addr", - "description": "Determine address of proxied request", - "version": "1.0.1", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "ip", - "proxy", - "x-forwarded-for" - ], - "repository": { - "type": "git", - "url": "https://github.com/expressjs/proxy-addr.git" - }, - "bugs": { - "url": "https://github.com/expressjs/proxy-addr/issues" - }, - "dependencies": { - "ipaddr.js": "0.1.2" - }, - "devDependencies": { - "benchmark": "1.0.0", - "beautify-benchmark": "0.2.4", - "istanbul": "0.2.10", - "mocha": "~1.20.0", - "should": "~4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "bench": "node benchmark/index.js", - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "homepage": "https://github.com/expressjs/proxy-addr", - "_id": "proxy-addr@1.0.1", - "dist": { - "shasum": "c7c566d5eb4e3fad67eeb9c77c5558ccc39b88a8", - "tarball": "http://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.1.tgz" - }, - "_from": "proxy-addr@1.0.1", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "c7c566d5eb4e3fad67eeb9c77c5558ccc39b88a8", - "_resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.gitmodules b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.gitmodules deleted file mode 100644 index 49e31da..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "support/expresso"] - path = support/expresso - url = git://github.com/visionmedia/expresso.git -[submodule "support/should"] - path = support/should - url = git://github.com/visionmedia/should.js.git diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.npmignore deleted file mode 100644 index e85ce2a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -test -.travis.yml -benchmark.js -component.json -examples.js -History.md -Makefile diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/Readme.md deleted file mode 100644 index 27e54a4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/Readme.md +++ /dev/null @@ -1,58 +0,0 @@ -# node-querystring - - query string parser for node and the browser supporting nesting, as it was removed from `0.3.x`, so this library provides the previous and commonly desired behaviour (and twice as fast). Used by [express](http://expressjs.com), [connect](http://senchalabs.github.com/connect) and others. - -## Installation - - $ npm install qs - -## Examples - -```js -var qs = require('qs'); - -qs.parse('user[name][first]=Tobi&user[email]=tobi@learnboost.com'); -// => { user: { name: { first: 'Tobi' }, email: 'tobi@learnboost.com' } } - -qs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }}) -// => user[name]=Tobi&user[email]=tobi%40learnboost.com -``` - -## Testing - -Install dev dependencies: - - $ npm install -d - -and execute: - - $ make test - -browser: - - $ open test/browser/index.html - -## License - -(The MIT License) - -Copyright (c) 2010 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/index.js deleted file mode 100644 index b05938a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/index.js +++ /dev/null @@ -1,366 +0,0 @@ -/** - * Object#toString() ref for stringify(). - */ - -var toString = Object.prototype.toString; - -/** - * Object#hasOwnProperty ref - */ - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -/** - * Array#indexOf shim. - */ - -var indexOf = typeof Array.prototype.indexOf === 'function' - ? function(arr, el) { return arr.indexOf(el); } - : function(arr, el) { - for (var i = 0; i < arr.length; i++) { - if (arr[i] === el) return i; - } - return -1; - }; - -/** - * Array.isArray shim. - */ - -var isArray = Array.isArray || function(arr) { - return toString.call(arr) == '[object Array]'; -}; - -/** - * Object.keys shim. - */ - -var objectKeys = Object.keys || function(obj) { - var ret = []; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - ret.push(key); - } - } - return ret; -}; - -/** - * Array#forEach shim. - */ - -var forEach = typeof Array.prototype.forEach === 'function' - ? function(arr, fn) { return arr.forEach(fn); } - : function(arr, fn) { - for (var i = 0; i < arr.length; i++) fn(arr[i]); - }; - -/** - * Array#reduce shim. - */ - -var reduce = function(arr, fn, initial) { - if (typeof arr.reduce === 'function') return arr.reduce(fn, initial); - var res = initial; - for (var i = 0; i < arr.length; i++) res = fn(res, arr[i]); - return res; -}; - -/** - * 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]) { - if (hasOwnProperty.call(parent[key], i)) { - t[i] = parent[key][i]; - } - } - parent[key] = t; - return t; -} - -function parse(parts, parent, key, val) { - var part = parts.shift(); - - // illegal - if (Object.getOwnPropertyDescriptor(Object.prototype, key)) return; - - // end - if (!part) { - if (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 (isArray(obj)) { - if ('' != val) obj.push(val); - } else if ('object' == typeof obj) { - obj[objectKeys(obj).length] = val; - } else { - obj = parent[key] = [parent[key], val]; - } - // prop - } else if (~indexOf(part, ']')) { - part = part.substr(0, part.length - 1); - if (!isint.test(part) && isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - // key - } else { - if (!isint.test(part) && isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - } - } -} - -/** - * Merge parent key/val pair. - */ - -function merge(parent, key, val){ - if (~indexOf(key, ']')) { - var parts = key.split('[') - , len = parts.length - , last = len - 1; - parse(parts, parent, 'base', val); - // optimize - } else { - if (!isint.test(key) && 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; -} - -/** - * Compact sparse arrays. - */ - -function compact(obj) { - if ('object' != typeof obj) return obj; - - if (isArray(obj)) { - var ret = []; - - for (var i in obj) { - if (hasOwnProperty.call(obj, i)) { - ret.push(obj[i]); - } - } - - return ret; - } - - for (var key in obj) { - obj[key] = compact(obj[key]); - } - - return obj; -} - -/** - * Parse the given obj. - */ - -function parseObject(obj){ - var ret = { base: {} }; - - forEach(objectKeys(obj), function(name){ - merge(ret, name, obj[name]); - }); - - return compact(ret.base); -} - -/** - * Parse the given str. - */ - -function parseString(str){ - var ret = reduce(String(str).split('&'), function(ret, pair){ - var eql = indexOf(pair, '=') - , brace = lastBraceInKey(pair) - , key = pair.substr(0, brace || eql) - , val = pair.substr(brace || eql, pair.length) - , val = val.substr(indexOf(val, '=') + 1, val.length); - - // ?foo - if ('' == key) key = pair, val = ''; - if ('' == key) return ret; - - return merge(ret, decode(key), decode(val)); - }, { base: {} }).base; - - return compact(ret); -} - -/** - * 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 (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 + '=' + encodeURIComponent(String(obj)); - } -}; - -/** - * Stringify the given `str`. - * - * @param {String} str - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyString(str, prefix) { - if (!prefix) throw new TypeError('stringify expects an object'); - return prefix + '=' + encodeURIComponent(str); -} - -/** - * Stringify the given `arr`. - * - * @param {Array} arr - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyArray(arr, prefix) { - var ret = []; - if (!prefix) throw new TypeError('stringify expects an object'); - for (var i = 0; i < arr.length; i++) { - ret.push(stringify(arr[i], prefix + '[' + i + ']')); - } - return ret.join('&'); -} - -/** - * Stringify the given `obj`. - * - * @param {Object} obj - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyObject(obj, prefix) { - var ret = [] - , keys = objectKeys(obj) - , key; - - for (var i = 0, len = keys.length; i < len; ++i) { - key = keys[i]; - if ('' == key) continue; - if (null == obj[key]) { - ret.push(encodeURIComponent(key) + '='); - } else { - 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 (Object.getOwnPropertyDescriptor(Object.prototype, key)) return; - if (undefined === v) { - obj[key] = val; - } else if (isArray(v)) { - v.push(val); - } else { - obj[key] = [v, val]; - } -} - -/** - * Locate last brace in `str` within the key. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function lastBraceInKey(str) { - var len = str.length - , brace - , c; - for (var i = 0; i < len; ++i) { - c = str[i]; - if (']' == c) brace = false; - if ('[' == c) brace = true; - if ('=' == c && !brace) return i; - } -} - -/** - * Decode `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -function decode(str) { - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (err) { - return str; - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/package.json deleted file mode 100644 index 3568353..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/qs/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "qs", - "description": "querystring parser", - "version": "0.6.6", - "keywords": [ - "query string", - "parser", - "component" - ], - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/node-querystring.git" - }, - "devDependencies": { - "mocha": "*", - "expect.js": "*" - }, - "scripts": { - "test": "make test" - }, - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "main": "index", - "engines": { - "node": "*" - }, - "bugs": { - "url": "https://github.com/visionmedia/node-querystring/issues" - }, - "_id": "qs@0.6.6", - "dist": { - "shasum": "6e015098ff51968b8a3c819001d5f2c89bc4b107", - "tarball": "http://registry.npmjs.org/qs/-/qs-0.6.6.tgz" - }, - "_from": "qs@0.6.6", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "6e015098ff51968b8a3c819001d5f2c89bc4b107", - "_resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/visionmedia/node-querystring" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/History.md deleted file mode 100644 index b35ba51..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/History.md +++ /dev/null @@ -1,21 +0,0 @@ - -1.0.0 / 2013-12-11 -================== - - * add repository to package.json - * add MIT license - -0.0.4 / 2012-06-17 -================== - - * changed: ret -1 for unsatisfiable and -2 when invalid - -0.0.3 / 2012-06-17 -================== - - * fix last-byte-pos default to len - 1 - -0.0.2 / 2012-06-14 -================== - - * add `.type` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Readme.md deleted file mode 100644 index cb30a5a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/Readme.md +++ /dev/null @@ -1,53 +0,0 @@ - -# node-range-parser - - Range header field parser. - -## Example: - -```js -assert(-1 == parse(200, 'bytes=500-20')); -assert(-2 == parse(200, 'bytes=malformed')); -parse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }])); -parse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }])); -parse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }])); -parse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }])); -parse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }])); -parse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }])); -parse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }])); -parse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }])); -parse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }])); -``` - -## Installation - -``` -$ npm install range-parser -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/index.js deleted file mode 100644 index 9b0f7a8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/index.js +++ /dev/null @@ -1,49 +0,0 @@ - -/** - * Parse "Range" header `str` relative to the given file `size`. - * - * @param {Number} size - * @param {String} str - * @return {Array} - * @api public - */ - -module.exports = function(size, str){ - var valid = true; - var i = str.indexOf('='); - - if (-1 == i) return -2; - - var arr = str.slice(i + 1).split(',').map(function(range){ - var range = range.split('-') - , start = parseInt(range[0], 10) - , end = parseInt(range[1], 10); - - // -nnn - if (isNaN(start)) { - start = size - end; - end = size - 1; - // nnn- - } else if (isNaN(end)) { - end = size - 1; - } - - // limit last-byte-pos to current length - if (end > size - 1) end = size - 1; - - // invalid - if (isNaN(start) - || isNaN(end) - || start > end - || start < 0) valid = false; - - return { - start: start, - end: end - }; - }); - - arr.type = str.slice(0, i); - - return valid ? arr : -1; -}; \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/package.json deleted file mode 100644 index 568c0f1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/range-parser/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "range-parser", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "Range header field string parser", - "version": "1.0.0", - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/node-range-parser.git" - }, - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/visionmedia/node-range-parser#license" - } - ], - "bugs": { - "url": "https://github.com/visionmedia/node-range-parser/issues" - }, - "_id": "range-parser@1.0.0", - "dist": { - "shasum": "a4b264cfe0be5ce36abe3765ac9c2a248746dbc0", - "tarball": "http://registry.npmjs.org/range-parser/-/range-parser-1.0.0.tgz" - }, - "_from": "range-parser@1.0.0", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "a4b264cfe0be5ce36abe3765ac9c2a248746dbc0", - "_resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.0.tgz", - "readme": "ERROR: No README data found!", - "homepage": "https://github.com/visionmedia/node-range-parser" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/.npmignore deleted file mode 100644 index 223570e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -coverage -test -examples -.travis.yml -*.sock diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/History.md deleted file mode 100644 index 9cf4069..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/History.md +++ /dev/null @@ -1,137 +0,0 @@ -0.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -0.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -0.7.0 / 2014-07-20 -================== - - * Deprecate `hidden` option; use `dotfiles` option - * Add `dotfiles` option - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - -0.6.0 / 2014-07-11 -================== - - * Deprecate `from` option; use `root` option - * Deprecate `send.etag()` -- use `etag` in `options` - * Deprecate `send.hidden()` -- use `hidden` in `options` - * Deprecate `send.index()` -- use `index` in `options` - * Deprecate `send.maxage()` -- use `maxAge` in `options` - * Deprecate `send.root()` -- use `root` in `options` - * Cap `maxAge` value to 1 year - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.5.0 / 2014-06-28 -================== - - * Accept string for `maxAge` (converted by `ms`) - * Add `headers` event - * Include link in default redirect response - * Use `EventEmitter.listenerCount` to count listeners - -0.4.3 / 2014-06-11 -================== - - * Do not throw un-catchable error on file open race condition - * Use `escape-html` for HTML escaping - * deps: debug@1.0.2 - - fix some debugging output colors on node.js 0.8 - * deps: finished@1.2.2 - * deps: fresh@0.2.2 - -0.4.2 / 2014-06-09 -================== - - * fix "event emitter leak" warnings - * deps: debug@1.0.1 - * deps: finished@1.2.1 - -0.4.1 / 2014-06-02 -================== - - * Send `max-age` in `Cache-Control` in correct format - -0.4.0 / 2014-05-27 -================== - - * Calculate ETag with md5 for reduced collisions - * Fix wrong behavior when index file matches directory - * Ignore stream errors after request ends - - Goodbye `EBADF, read` - * Skip directories in index file search - * deps: debug@0.8.1 - -0.3.0 / 2014-04-24 -================== - - * Fix sending files with dots without root set - * Coerce option types - * Accept API options in options object - * Set etags to "weak" - * Include file path in etag - * Make "Can't set headers after they are sent." catchable - * Send full entity-body for multi range requests - * Default directory access to 403 when index disabled - * Support multiple index paths - * Support "If-Range" header - * Control whether to generate etags - * deps: mime@1.2.11 - -0.2.0 / 2014-01-29 -================== - - * update range-parser and fresh - -0.1.4 / 2013-08-11 -================== - - * update fresh - -0.1.3 / 2013-07-08 -================== - - * Revert "Fix fd leak" - -0.1.2 / 2013-07-03 -================== - - * Fix fd leak - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/Readme.md deleted file mode 100644 index 5eceeef..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/Readme.md +++ /dev/null @@ -1,159 +0,0 @@ -# send - -[![NPM version](https://badge.fury.io/js/send.svg)](https://badge.fury.io/js/send) -[![Build Status](https://travis-ci.org/visionmedia/send.svg?branch=master)](https://travis-ci.org/visionmedia/send) -[![Coverage Status](https://img.shields.io/coveralls/visionmedia/send.svg?branch=master)](https://coveralls.io/r/visionmedia/send) - - Send is Connect's `static()` extracted for generalized use, a streaming static file - server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework. - -## Installation - - $ npm install send - -## Examples - - Small: - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - send(req, req.url).pipe(res); -}).listen(3000); -``` - - Serving from a root directory with custom error-handling: - -```js -var http = require('http'); -var send = require('send'); -var url = require('url'); - -var app = http.createServer(function(req, res){ - // your custom error-handling logic: - function error(err) { - res.statusCode = err.status || 500; - res.end(err.message); - } - - // your custom headers - function headers(res, path, stat) { - // serve all files for download - res.setHeader('Content-Disposition', 'attachment'); - } - - // your custom directory handling logic: - function redirect() { - res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, url.parse(req.url).pathname, {root: '/www/example.com/public'}) - .on('error', error) - .on('directory', redirect) - .on('headers', headers) - .pipe(res); -}).listen(3000); -``` - -## API - -### Options - -#### etag - - Enable or disable etag generation, defaults to true. - -#### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file - or directory that begins with a dot ("."). Note this check is done on - the path itself without checking if the path actually exists on the - disk. If `root` is specified, only the dotfiles above the root are - checked (i.e. the root itself can be within a dotfile when when set - to "deny"). - - The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and 404. - -#### index - - By default send supports "index.html" files, to disable this - set `false` or to supply a new index pass a string or an array - in preferred order. - -#### maxAge - - Provide a max-age in milliseconds for http caching, defaults to 0. - This can also be a string accepted by the - [ms](https://www.npmjs.org/package/ms#readme) module. - -#### root - - Serve files relative to `path`. - -### Events - - - `error` an error occurred `(err)` - - `directory` a directory was requested - - `file` a file was requested `(path, stat)` - - `headers` the headers are about to be set on a file `(res, path, stat)` - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -## Error-handling - - By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc. - -## Caching - - It does _not_ perform internal caching, you should use a reverse proxy cache such - as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;). - -## Debugging - - To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ npm test -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/index.js deleted file mode 100644 index 51b2b57..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/send'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/send.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/send.js deleted file mode 100644 index 1e71b58..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/send.js +++ /dev/null @@ -1,711 +0,0 @@ - -/** - * Module dependencies. - */ - -var debug = require('debug')('send') -var deprecate = require('depd')('send') -var escapeHtml = require('escape-html') - , parseRange = require('range-parser') - , Stream = require('stream') - , mime = require('mime') - , fresh = require('fresh') - , path = require('path') - , http = require('http') - , onFinished = require('finished') - , fs = require('fs') - , normalize = path.normalize - , join = path.join - , utils = require('./utils'); -var EventEmitter = require('events').EventEmitter; -var ms = require('ms'); - -/** - * Variables. - */ -var maxMaxAge = 60 * 60 * 24 * 365 * 1000; // 1 year -var resolve = path.resolve -var sep = path.sep -var upPathRegexp = /(?:^|[\\\/])\.\.(?:[\\\/]|$)/ - -/** - * Expose `send`. - */ - -exports = module.exports = send; - -/** - * Expose mime module. - */ - -exports.mime = mime; - -/** - * Shim EventEmitter.listenerCount for node.js < 0.10 - */ - -/* istanbul ignore next */ -var listenerCount = EventEmitter.listenerCount - || function(emitter, type){ return emitter.listeners(type).length; }; - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @return {SendStream} - * @api public - */ - -function send(req, path, options) { - return new SendStream(req, path, options); -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @api private - */ - -function SendStream(req, path, options) { - var self = this; - options = options || {}; - this.req = req; - this.path = path; - this.options = options; - - this._etag = options.etag !== undefined - ? Boolean(options.etag) - : true - - this._dotfiles = options.dotfiles !== undefined - ? options.dotfiles - : 'ignore' - - if (['allow', 'deny', 'ignore'].indexOf(this._dotfiles) === -1) { - throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') - } - - this._hidden = Boolean(options.hidden) - - if ('hidden' in options) { - deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') - } - - // legacy support - if (!('dotfiles' in options)) { - this._dotfiles = undefined - } - - this._index = options.index !== undefined - ? normalizeIndex(options.index) - : ['index.html'] - - this._maxage = options.maxAge || options.maxage - this._maxage = typeof this._maxage === 'string' - ? ms(this._maxage) - : Number(this._maxage) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), maxMaxAge) - : 0 - - this._root = options.root - ? resolve(options.root) - : null - - if (!this._root && options.from) { - this.from(options.from); - } -} - -/** - * Inherits from `Stream.prototype`. - */ - -SendStream.prototype.__proto__ = Stream.prototype; - -/** - * Enable or disable etag generation. - * - * @param {Boolean} val - * @return {SendStream} - * @api public - */ - -SendStream.prototype.etag = deprecate.function(function etag(val) { - val = Boolean(val); - debug('etag %s', val); - this._etag = val; - return this; -}, 'send.etag: pass etag as option'); - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = deprecate.function(function hidden(val) { - val = Boolean(val); - debug('hidden %s', val); - this._hidden = val; - this._dotfiles = undefined - return this; -}, 'send.hidden: use dotfiles option'); - -/** - * Set index `paths`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean|Array} paths - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = deprecate.function(function index(paths) { - var index = !paths ? [] : normalizeIndex(paths); - debug('index %o', paths); - this._index = index; - return this; -}, 'send.index: pass index as option'); - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = function(path){ - path = String(path); - this._root = resolve(path) - return this; -}; - -SendStream.prototype.from = deprecate.function(SendStream.prototype.root, - 'send.from: pass root as option'); - -SendStream.prototype.root = deprecate.function(SendStream.prototype.root, - 'send.root: pass root as option'); - -/** - * Set max-age to `maxAge`. - * - * @param {Number} maxAge - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = deprecate.function(function maxage(maxAge) { - maxAge = typeof maxAge === 'string' - ? ms(maxAge) - : Number(maxAge); - if (isNaN(maxAge)) maxAge = 0; - if (Infinity == maxAge) maxAge = 60 * 60 * 24 * 365 * 1000; - debug('max-age %d', maxAge); - this._maxage = maxAge; - return this; -}, 'send.maxage: pass maxAge as option'); - -/** - * Emit error with `status`. - * - * @param {Number} status - * @api private - */ - -SendStream.prototype.error = function(status, err){ - var res = this.res; - var msg = http.STATUS_CODES[status]; - - err = err || new Error(msg); - err.status = status; - - // emit if listeners instead of responding - if (listenerCount(this, 'error') !== 0) { - return this.emit('error', err); - } - - // wipe all existing headers - res._headers = undefined; - - res.statusCode = err.status; - res.end(msg); -}; - -/** - * Check if the pathname ends with "/". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasTrailingSlash = function(){ - return '/' == this.path[this.path.length - 1]; -}; - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function(){ - return this.req.headers['if-none-match'] - || this.req.headers['if-modified-since']; -}; - -/** - * Strip content-* header fields. - * - * @api private - */ - -SendStream.prototype.removeContentHeaderFields = function(){ - var res = this.res; - Object.keys(res._headers).forEach(function(field){ - if (0 == field.indexOf('content')) { - res.removeHeader(field); - } - }); -}; - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function(){ - var res = this.res; - debug('not modified'); - this.removeContentHeaderFields(); - res.statusCode = 304; - res.end(); -}; - -/** - * Raise error that headers already sent. - * - * @api private - */ - -SendStream.prototype.headersAlreadySent = function headersAlreadySent(){ - var err = new Error('Can\'t set headers after they are sent.'); - debug('headers already sent'); - this.error(500, err); -}; - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function(){ - var res = this.res; - return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; -}; - -/** - * Handle stat() error. - * - * @param {Error} err - * @api private - */ - -SendStream.prototype.onStatError = function(err){ - var notfound = ['ENOENT', 'ENAMETOOLONG', 'ENOTDIR']; - if (~notfound.indexOf(err.code)) return this.error(404, err); - this.error(500, err); -}; - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function(){ - return fresh(this.req.headers, this.res._headers); -}; - -/** - * Check if the range is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isRangeFresh = function isRangeFresh(){ - var ifRange = this.req.headers['if-range']; - - if (!ifRange) return true; - - return ~ifRange.indexOf('"') - ? ~ifRange.indexOf(this.res._headers['etag']) - : Date.parse(this.res._headers['last-modified']) <= Date.parse(ifRange); -}; - -/** - * Redirect to `path`. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.redirect = function(path){ - if (listenerCount(this, 'directory') !== 0) { - return this.emit('directory'); - } - - if (this.hasTrailingSlash()) return this.error(403); - var res = this.res; - path += '/'; - res.statusCode = 301; - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.setHeader('Location', path); - res.end('Redirecting to ' + escapeHtml(path) + '\n'); -}; - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function(res){ - var self = this - , args = arguments - , root = this._root; - - // references - this.res = res; - - // decode the path - var path = utils.decode(this.path) - if (path === -1) return this.error(400) - - // null byte(s) - if (~path.indexOf('\0')) return this.error(400); - - var parts - if (root !== null) { - // join / normalize from optional root dir - path = normalize(join(root, path)) - - // malicious path - if (path.substr(0, root.length) !== root) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = path.substr(root.length + 1).split(sep) - } else { - // ".." is malicious without "root" - if (upPathRegexp.test(path)) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = normalize(path).split(sep) - - // resolve the path - path = resolve(path) - } - - // dotfile handling - if (containsDotFile(parts)) { - var access = this._dotfiles - - // legacy support - if (access === undefined) { - access = parts[parts.length - 1][0] === '.' - ? (this._hidden ? 'allow' : 'ignore') - : 'allow' - } - - debug('%s dotfile "%s"', access, path) - switch (access) { - case 'allow': - break - case 'deny': - return this.error(403) - case 'ignore': - default: - return this.error(404) - } - } - - // index file support - if (this._index.length && this.hasTrailingSlash()) { - this.sendIndex(path); - return res; - } - - debug('stat "%s"', path); - fs.stat(path, function(err, stat){ - if (err) return self.onStatError(err); - if (stat.isDirectory()) return self.redirect(self.path); - self.emit('file', path, stat); - self.send(path, stat); - }); - - return res; -}; - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function(path, stat){ - var options = this.options; - var len = stat.size; - var res = this.res; - var req = this.req; - var ranges = req.headers.range; - var offset = options.start || 0; - - if (res._header) { - // impossible to send now - return this.headersAlreadySent(); - } - - debug('pipe "%s"', path) - - // set header fields - this.setHeader(path, stat); - - // set content-type - this.type(path); - - // conditional GET support - if (this.isConditionalGET() - && this.isCachable() - && this.isFresh()) { - return this.notModified(); - } - - // adjust len to start/end options - len = Math.max(0, len - offset); - if (options.end !== undefined) { - var bytes = options.end - offset + 1; - if (len > bytes) len = bytes; - } - - // Range support - if (ranges) { - ranges = parseRange(len, ranges); - - // If-Range support - if (!this.isRangeFresh()) { - debug('range stale'); - ranges = -2; - } - - // unsatisfiable - if (-1 == ranges) { - debug('range unsatisfiable'); - res.setHeader('Content-Range', 'bytes */' + stat.size); - return this.error(416); - } - - // valid (syntactically invalid/multiple ranges are treated as a regular response) - if (-2 != ranges && ranges.length === 1) { - debug('range %j', ranges); - - options.start = offset + ranges[0].start; - options.end = offset + ranges[0].end; - - // Content-Range - res.statusCode = 206; - res.setHeader('Content-Range', 'bytes ' - + ranges[0].start - + '-' - + ranges[0].end - + '/' - + len); - len = options.end - options.start + 1; - } - } - - // content-length - res.setHeader('Content-Length', len); - - // HEAD support - if ('HEAD' == req.method) return res.end(); - - this.stream(path, options); -}; - -/** - * Transfer index for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendIndex = function sendIndex(path){ - var i = -1; - var self = this; - - function next(err){ - if (++i >= self._index.length) { - if (err) return self.onStatError(err); - return self.error(404); - } - - var p = path + self._index[i]; - - debug('stat "%s"', p); - fs.stat(p, function(err, stat){ - if (err) return next(err); - if (stat.isDirectory()) return next(); - self.emit('file', p, stat); - self.send(p, stat); - }); - } - - if (!this.hasTrailingSlash()) path += '/'; - - next(); -}; - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function(path, options){ - // TODO: this is all lame, refactor meeee - var finished = false; - var self = this; - var res = this.res; - var req = this.req; - - // pipe - var stream = fs.createReadStream(path, options); - this.emit('stream', stream); - stream.pipe(res); - - // response finished, done with the fd - onFinished(res, function onfinished(){ - finished = true; - stream.destroy(); - }); - - // error handling code-smell - stream.on('error', function onerror(err){ - // request already finished - if (finished) return; - - // clean up stream - finished = true; - stream.destroy(); - - // no hope in responding - if (res._header) { - console.error(err.stack); - req.destroy(); - return; - } - - // error - self.onStatError(err); - }); - - // end - stream.on('end', function onend(){ - self.emit('end'); - }); -}; - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function(path){ - var res = this.res; - if (res.getHeader('Content-Type')) return; - var type = mime.lookup(path); - var charset = mime.charsets.lookup(type); - debug('content-type %s', type); - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); -}; - -/** - * Set response header fields, most - * fields may be pre-defined. - * - * @param {String} path - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function setHeader(path, stat){ - var res = this.res; - - this.emit('headers', res, path, stat); - - if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); - if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString()); - if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + Math.floor(this._maxage / 1000)); - if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString()); - - if (this._etag && !res.getHeader('ETag')) { - var etag = utils.etag(path, stat); - debug('etag %s', etag); - res.setHeader('ETag', etag); - } -}; - -/** - * Determine if path parts contain a dotfile. - * - * @api private - */ - -function containsDotFile(parts) { - for (var i = 0; i < parts.length; i++) { - if (parts[i][0] === '.') { - return true - } - } - - return false -} - -/** - * Normalize the index option into an array. - * - * @param {boolean|string|array} val - * @api private - */ - -function normalizeIndex(val){ - return [].concat(val || []) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/utils.js deleted file mode 100644 index 3a88bf9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/lib/utils.js +++ /dev/null @@ -1,42 +0,0 @@ - -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Return a weak ETag from the given `path` and `stat`. - * - * @param {String} path - * @param {Object} stat - * @return {String} - * @api private - */ - -exports.etag = function etag(path, stat) { - var tag = String(stat.mtime.getTime()) + ':' + String(stat.size) + ':' + path; - var str = crypto - .createHash('md5') - .update(tag, 'utf8') - .digest('base64'); - return 'W/"' + str + '"'; -}; - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -exports.decode = function(path){ - try { - return decodeURIComponent(path); - } catch (err) { - return -1; - } -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md deleted file mode 100644 index 8937250..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/HISTORY.md +++ /dev/null @@ -1,50 +0,0 @@ -1.2.2 / 2014-06-10 -========== - - * reduce listeners added to emitters - - avoids "event emitter leak" warnings when used multiple times on same request - -1.2.1 / 2014-06-08 -================== - - * fix returned value when already finished - -1.2.0 / 2014-06-05 -================== - - * call callback when called on already-finished socket - -1.1.4 / 2014-05-27 -================== - - * support node.js 0.8 - -1.1.3 / 2014-04-30 -================== - - * make sure errors passed as instanceof `Error` - -1.1.2 / 2014-04-18 -================== - - * default the `socket` to passed-in object - -1.1.1 / 2014-01-16 -================== - - * rename module to `finished` - -1.1.0 / 2013-12-25 -================== - - * call callback when called on already-errored socket - -1.0.1 / 2013-12-20 -================== - - * actually pass the error to the callback - -1.0.0 / 2013-12-20 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/README.md deleted file mode 100644 index 79facd5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# finished - -[![NPM Version](https://badge.fury.io/js/finished.svg)](http://badge.fury.io/js/finished) -[![Build Status](https://travis-ci.org/expressjs/finished.svg?branch=master)](https://travis-ci.org/expressjs/finished) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/finished.svg?branch=master)](https://coveralls.io/r/expressjs/finished) - -Execute a callback when a request closes, finishes, or errors. - -#### Install - -```sh -$ npm install finished -``` - -#### Uses - -This is useful for cleaning up streams. For example, you want to destroy any file streams you create on socket errors otherwise you will leak file descriptors. - -This is required to fix what many perceive as issues with node's streams. Relevant: - -- [node#6041](https://github.com/joyent/node/issues/6041) -- [koa#184](https://github.com/koajs/koa/issues/184) -- [koa#165](https://github.com/koajs/koa/issues/165) - -## API - -### finished(response, callback) - -```js -var onFinished = require('finished') - -onFinished(res, function (err) { - // do something maybe -}) -``` - -### Examples - -The following code ensures that file descriptors are always closed once the response finishes. - -#### Node / Connect / Express - -```js -var onFinished = require('finished') - -function (req, res, next) { - var stream = fs.createReadStream('thingie.json') - stream.pipe(res) - onFinished(res, function (err) { - stream.destroy() - }) -} -``` - -#### Koa - -```js -function* () { - var stream = this.body = fs.createReadStream('thingie.json') - onFinished(this, function (err) { - stream.destroy() - }) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/index.js deleted file mode 100644 index 90709d4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/index.js +++ /dev/null @@ -1,62 +0,0 @@ -/*! - * finished - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** -* Module dependencies. -*/ - -var first = require('ee-first') - -/** -* Variables. -*/ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Invoke callback when the response has finished, useful for - * cleaning up resources afterwards. - * - * @param {object} thingie - * @param {function} callback - * @return {object} - * @api public - */ - -module.exports = function finished(thingie, callback) { - var socket = thingie.socket || thingie - var res = thingie.res || thingie - - if (res.finished || !socket.writable) { - defer(callback) - return thingie - } - - var listener = res.__onFinished - - // create a private single listener with queue - if (!listener || !listener.queue) { - listener = res.__onFinished = function onFinished(err) { - if (res.__onFinished === listener) res.__onFinished = null - var queue = listener.queue || [] - while (queue.length) queue.shift()(err) - } - listener.queue = [] - - // finished on first event - first([ - [socket, 'error', 'close'], - [res, 'finish'], - ], listener) - } - - listener.queue.push(callback) - - return thingie -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore deleted file mode 100644 index 72921ab..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.DS_Store* -node_modules diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md deleted file mode 100644 index 7eae173..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -# EE First - -Get the first event in a set of event emitters and event pairs, -then clean up after itself. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js deleted file mode 100644 index d0c48c9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/index.js +++ /dev/null @@ -1,60 +0,0 @@ - -module.exports = function first(stuff, done) { - if (!Array.isArray(stuff)) - throw new TypeError('arg must be an array of [ee, events...] arrays') - - var cleanups = [] - - for (var i = 0; i < stuff.length; i++) { - var arr = stuff[i] - - if (!Array.isArray(arr) || arr.length < 2) - throw new TypeError('each array member must be [ee, events...]') - - var ee = arr[0] - - for (var j = 1; j < arr.length; j++) { - var event = arr[j] - var fn = listener(event, cleanup) - - // listen to the event - ee.on(event, fn) - // push this listener to the list of cleanups - cleanups.push({ - ee: ee, - event: event, - fn: fn, - }) - } - } - - return function (fn) { - done = fn - } - - function cleanup() { - var x - for (var i = 0; i < cleanups.length; i++) { - x = cleanups[i] - x.ee.removeListener(x.event, x.fn) - } - done.apply(null, arguments) - } -} - -function listener(event, done) { - return function onevent(arg1) { - var args = new Array(arguments.length) - var ee = this - var err = event === 'error' - ? arg1 - : null - - // copy args to prevent arguments escaping scope - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - done(err, ee, event, args) - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json deleted file mode 100644 index 1f82e3e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "ee-first", - "description": "return the first event in a set of ee/event pairs", - "version": "1.0.3", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/jonathanong/ee-first" - }, - "devDependencies": { - "mocha": "1" - }, - "scripts": { - "test": "mocha --reporter spec" - }, - "bugs": { - "url": "https://github.com/jonathanong/ee-first/issues" - }, - "homepage": "https://github.com/jonathanong/ee-first", - "_id": "ee-first@1.0.3", - "_shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "_from": "ee-first@1.0.3", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "tarball": "http://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js deleted file mode 100644 index adff984..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/node_modules/ee-first/test.js +++ /dev/null @@ -1,60 +0,0 @@ - -var EventEmitter = require('events').EventEmitter -var assert = require('assert') - -var first = require('./') - -describe('first', function () { - var ee1 = new EventEmitter() - var ee2 = new EventEmitter() - var ee3 = new EventEmitter() - - it('should emit the first event', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - assert.equal(ee, ee2) - assert.equal(event, 'b') - assert.deepEqual(args, [1, 2, 3]) - done() - }) - - ee2.emit('b', 1, 2, 3) - }) - - it('it should return an error if event === error', function (done) { - first([ - [ee1, 'error', 'b', 'c'], - [ee2, 'error', 'b', 'c'], - [ee3, 'error', 'b', 'c'], - ], function (err, ee, event, args) { - assert.equal(err.message, 'boom') - assert.equal(ee, ee3) - assert.equal(event, 'error') - done() - }) - - ee3.emit('error', new Error('boom')) - }) - - it('should cleanup after itself', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - ;[ee1, ee2, ee3].forEach(function (ee) { - ['a', 'b', 'c'].forEach(function (event) { - assert(!ee.listeners(event).length) - }) - }) - done() - }) - - ee1.emit('a') - }) -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/package.json deleted file mode 100644 index b645a74..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/finished/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "finished", - "description": "Execute a callback when a request closes, finishes, or errors", - "version": "1.2.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/finished" - }, - "dependencies": { - "ee-first": "1.0.3" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.1", - "should": "~4.0.1" - }, - "engine": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/finished/issues" - }, - "homepage": "https://github.com/expressjs/finished", - "_id": "finished@1.2.2", - "_shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "_from": "finished@1.2.2", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "tarball": "http://registry.npmjs.org/finished/-/finished-1.2.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/README.md deleted file mode 100644 index 6ca19bd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.default_type -Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/mime.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/mime.js deleted file mode 100644 index 48be0c5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/mime.js +++ /dev/null @@ -1,114 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - if (process.env.DEBUG_MIME && this.types[exts]) { - console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + - this.types[exts] + ' to ' + type); - } - - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - - this._loading = file; - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); - - this._loading = null; -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); - return this.extensions[type]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -}; - -module.exports = mime; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/package.json deleted file mode 100644 index 917e6af..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.2.11", - "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g.\n\n var mime = require('mime');\n\n mime.lookup('/path/to/file.txt'); // => 'text/plain'\n mime.lookup('file.txt'); // => 'text/plain'\n mime.lookup('.TXT'); // => 'text/plain'\n mime.lookup('htm'); // => 'text/html'\n\n### mime.default_type\nSets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)\n\n### mime.extension(type)\nGet the default extension for `type`\n\n mime.extension('text/html'); // => 'html'\n mime.extension('application/octet-stream'); // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n mime.charsets.lookup('text/plain'); // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n mime.define({\n 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n 'application/x-my-type': ['x-mt', 'x-mtt'],\n // etc ...\n });\n\n mime.lookup('x-sft'); // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n mime.load('./my_project.types');\n\nThe .types file format is simple - See the `types` dir for examples.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/broofa/node-mime/issues" - }, - "_id": "mime@1.2.11", - "dist": { - "shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "tarball": "http://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - }, - "_from": "mime@1.2.11", - "_npmVersion": "1.3.6", - "_npmUser": { - "name": "broofa", - "email": "robert@broofa.com" - }, - "maintainers": [ - { - "name": "broofa", - "email": "robert@broofa.com" - }, - { - "name": "bentomas", - "email": "benjamin@benjaminthomas.org" - } - ], - "directories": {}, - "_shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "_resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "homepage": "https://github.com/broofa/node-mime" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/test.js deleted file mode 100644 index 2cda1c7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/test.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); -var path = require('path'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); // normal file -eq('text/plain', mime.lookup('TEXT.TXT')); // uppercase -eq('text/plain', mime.lookup('dir/text.txt')); // dir + file -eq('text/plain', mime.lookup('.text.txt')); // hidden file -eq('text/plain', mime.lookup('.txt')); // nameless -eq('text/plain', mime.lookup('txt')); // extension-only -eq('text/plain', mime.lookup('/txt')); // extension-less () -eq('text/plain', mime.lookup('\\txt')); // Windows, extension-less -eq('application/octet-stream', mime.lookup('text.nope')); // unrecognized -eq('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq('bin', mime.extension('application/octet-stream ')); -eq('html', mime.extension(' text/html; charset=UTF-8')); -eq('html', mime.extension('text/html; charset=UTF-8 ')); -eq('html', mime.extension('text/html; charset=UTF-8')); -eq('html', mime.extension('text/html ; charset=UTF-8')); -eq('html', mime.extension('text/html;charset=UTF-8')); -eq('html', mime.extension('text/Html;charset=UTF-8')); -eq(undefined, mime.extension('unrecognized')); - -// -// Test node.types lookups -// - -eq('application/font-woff', mime.lookup('file.woff')); -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); -eq('font/opentype', mime.lookup('file.otf')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -// -// Test for overlaps between mime.types and node.types -// - -var apacheTypes = new mime.Mime(), nodeTypes = new mime.Mime(); -apacheTypes.load(path.join(__dirname, 'types/mime.types')); -nodeTypes.load(path.join(__dirname, 'types/node.types')); - -var keys = [].concat(Object.keys(apacheTypes.types)) - .concat(Object.keys(nodeTypes.types)); -keys.sort(); -for (var i = 1; i < keys.length; i++) { - if (keys[i] == keys[i-1]) { - console.warn('Warning: ' + - 'node.types defines ' + keys[i] + '->' + nodeTypes.types[keys[i]] + - ', mime.types defines ' + keys[i] + '->' + apacheTypes.types[keys[i]]); - } -} - -console.log('\nOK'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/mime.types b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/mime.types deleted file mode 100644 index da8cd69..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/node.types b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/node.types deleted file mode 100644 index 55b2cf7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/mime/types/node.types +++ /dev/null @@ -1,77 +0,0 @@ -# What: WebVTT -# Why: To allow formats intended for marking up external text track resources. -# http://dev.w3.org/html5/webvtt/ -# Added by: niftylettuce -text/vtt vtt - -# 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: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifes ('.manifest' extension) -# 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 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: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp - -# What: Lua file types -# Why: Googling around shows de-facto consensus on these -# Added by: creationix (Issue #45) -text/x-lua lua -application/x-lua-bytecode luac - -# What: Markdown files, as per http://daringfireball.net/projects/markdown/syntax -# Why: http://stackoverflow.com/questions/10701983/what-is-the-mime-type-for-markdown -# Added by: avoidwork -text/x-markdown markdown md mkd - -# What: ini files -# Why: because they're just text files -# Added by: Matthew Kastor -text/plain ini - -# What: DASH Adaptive Streaming manifest -# Why: https://developer.mozilla.org/en-US/docs/DASH_Adaptive_Streaming_for_HTML_5_Video -# Added by: eelcocramer -application/dash+xml mdp - -# What: OpenType font files - http://www.microsoft.com/typography/otspec/ -# Why: Browsers usually ignore the font MIME types and sniff the content, -# but Chrome, shows a warning if OpenType fonts aren't served with -# the `font/opentype` MIME type: http://i.imgur.com/8c5RN8M.png. -# Added by: alrra -font/opentype otf diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/README.md deleted file mode 100644 index d4ab12a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours', { long: true })) // "10 hours" -``` - -- Node/Browser compatible. Published as `ms` in NPM. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/index.js deleted file mode 100644 index c5847f8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/package.json deleted file mode 100644 index 654cde8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/node_modules/ms/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "ms", - "version": "0.6.2", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "readme": "# ms.js: miliseconds conversion utility\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('100') // 100\n```\n\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(ms('10 hours', { long: true })) // \"10 hours\"\n```\n\n- Node/Browser compatible. Published as `ms` in NPM.\n- If a number is supplied to `ms`, a string with a unit is returned.\n- If a string that contains the number is supplied, it returns it as\na number (e.g: it returns `100` for `'100'`).\n- If you pass a string with a number and a valid unit, the number of\nequivalent ms is returned.\n\n## License\n\nMIT", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "_id": "ms@0.6.2", - "dist": { - "shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - }, - "_from": "ms@0.6.2", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "directories": {}, - "_shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "homepage": "https://github.com/guille/ms.js", - "scripts": {} -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/package.json deleted file mode 100644 index bb1dd7a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/send/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "send", - "description": "Better streaming static file server with Range and conditional-GET support", - "version": "0.7.2", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/send" - }, - "keywords": [ - "static", - "file", - "server" - ], - "dependencies": { - "debug": "1.0.4", - "depd": "0.4.4", - "escape-html": "1.0.1", - "finished": "1.2.2", - "fresh": "0.2.2", - "mime": "1.2.11", - "ms": "0.6.2", - "range-parser": "~1.0.0" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.0", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --check-leaks --reporter spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec" - }, - "bugs": { - "url": "https://github.com/visionmedia/send/issues" - }, - "homepage": "https://github.com/visionmedia/send", - "_id": "send@0.7.2", - "dist": { - "shasum": "3b5f696f701d56fe115b860cc6b3f0cdbfbf7804", - "tarball": "http://registry.npmjs.org/send/-/send-0.7.2.tgz" - }, - "_from": "send@0.7.2", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "3b5f696f701d56fe115b860cc6b3f0cdbfbf7804", - "_resolved": "https://registry.npmjs.org/send/-/send-0.7.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/History.md deleted file mode 100644 index 36f430d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/History.md +++ /dev/null @@ -1,117 +0,0 @@ -1.4.3 / 2014-07-29 -================== - - * deps: send@0.7.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - -1.4.2 / 2014-07-27 -================== - - * deps: send@0.7.2 - - deps: depd@0.4.4 - -1.4.1 / 2014-07-26 -================== - - * deps: send@0.7.1 - - deps: depd@0.4.3 - -1.4.0 / 2014-07-21 -================== - - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -1.3.2 / 2014-07-11 -================== - - * deps: send@0.6.0 - - Cap `maxAge` value to 1 year - - deps: debug@1.0.3 - -1.3.1 / 2014-07-09 -================== - - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -1.3.0 / 2014-06-28 -================== - - * Add `setHeaders` option - * Include HTML link in redirect response - * deps: send@0.5.0 - - Accept string for `maxAge` (converted by `ms`) - -1.2.3 / 2014-06-11 -================== - - * deps: send@0.4.3 - - Do not throw un-catchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -1.2.2 / 2014-06-09 -================== - - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - -1.2.1 / 2014-06-02 -================== - - * use `escape-html` for escaping - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -1.2.0 / 2014-05-29 -================== - - * deps: send@0.4.0 - - Calculate ETag with md5 for reduced collisions - - Fix wrong behavior when index file matches directory - - Ignore stream errors after request ends - - Skip directories in index file search - - deps: debug@0.8.1 - -1.1.0 / 2014-04-24 -================== - - * Accept options directly to `send` module - * deps: send@0.3.0 - -1.0.4 / 2014-04-07 -================== - - * Resolve relative paths at middleware setup - * Use parseurl to parse the URL from request - -1.0.3 / 2014-03-20 -================== - - * Do not rely on connect-like environments - -1.0.2 / 2014-03-06 -================== - - * deps: send@0.2.0 - -1.0.1 / 2014-03-05 -================== - - * Add mime export for back-compat - -1.0.0 / 2014-03-05 -================== - - * Genesis from `connect` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/LICENSE deleted file mode 100644 index b7bc085..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -(The MIT License) - -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 LearnBoost -Copyright (c) 2011 TJ Holowaychuk -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/Readme.md deleted file mode 100644 index 11dbc01..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/Readme.md +++ /dev/null @@ -1,144 +0,0 @@ -# serve-static - -[![NPM version](https://badge.fury.io/js/serve-static.svg)](http://badge.fury.io/js/serve-static) -[![Build Status](https://travis-ci.org/expressjs/serve-static.svg?branch=master)](https://travis-ci.org/expressjs/serve-static) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/serve-static.svg?branch=master)](https://coveralls.io/r/expressjs/serve-static) -[![Gittip](http://img.shields.io/gittip/dougwilson.svg)](https://www.gittip.com/dougwilson/) - -## Install - -```sh -$ npm install serve-static -``` - -## API - -```js -var serveStatic = require('serve-static') -``` - -### serveStatic(root, options) - -Create a new middleware function to serve files from within a given root -directory. The file to serve will be determined by combining `req.url` -with the provided root directory. When a file is not found, instead of -sending a 404 response, this module will instead call `next()` to move on -to the next middleware, allowing for stacking and fall-backs. - -#### Options - -##### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file -or directory that begins with a dot ("."). Note this check is done on -the path itself without checking if the path actually exists on the -disk. If `root` is specified, only the dotfiles above the root are -checked (i.e. the root itself can be within a dotfile when when set -to "deny"). - -The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and call `next()`. - -##### etag - -Enable or disable etag generation, defaults to true. - -##### index - -By default this module will send "index.html" files in response to a request -on a directory. To disable this set `false` or to supply a new index pass a -string or an array in preferred order. - -##### maxAge - -Provide a max-age in milliseconds for http caching, defaults to 0. This -can also be a string accepted by the [ms](https://www.npmjs.org/package/ms#readme) -module. - -##### redirect - -Redirect to trailing "/" when the pathname is a dir. Defaults to `true`. - -##### setHeaders - -Function to set custom headers on response. - -## Examples - -### Serve files with vanilla node.js http server - -```js -var finalhandler = require('finalhandler') -var http = require('http') -var serveStatic = require('serve-static') - -// Serve up public/ftp folder -var serve = serveStatic('public/ftp', {'index': ['index.html', 'index.htm']}) - -// Create server -var server = http.createServer(function(req, res){ - var done = finalhandler(req, res) - serve(req, res, done) -}) - -// Listen -server.listen(3000) -``` - -### Serve all files from ftp folder - -```js -var connect = require('connect') -var serveStatic = require('serve-static') - -var app = connect() - -app.use(serveStatic('public/ftp', {'index': ['default.html', 'default.htm']})) -app.listen(3000) -``` - -### Serve all files as downloads - -```js -var express = require('express') -var serveStatic = require('serve-static') - -var app = express() - -app.use(serveStatic('public/ftp', { - 'index': false, - 'setHeaders': setHeaders -})) -app.listen(3000) - -function setHeaders(res, path) { - res.attachment(path) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/index.js deleted file mode 100644 index caa3acb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/index.js +++ /dev/null @@ -1,122 +0,0 @@ -/*! - * serve-static - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var escapeHtml = require('escape-html'); -var parseurl = require('parseurl'); -var resolve = require('path').resolve; -var send = require('send'); -var url = require('url'); - -/** - * @param {String} root - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function(root, options){ - options = extend({}, options); - - // root required - if (!root) throw new TypeError('root path required'); - - // resolve root to absolute - root = resolve(root); - - // default redirect - var redirect = false !== options.redirect; - - // headers listener - var setHeaders = options.setHeaders - delete options.setHeaders - - if (setHeaders && typeof setHeaders !== 'function') { - throw new TypeError('option setHeaders must be function') - } - - // setup options for send - options.maxage = options.maxage || options.maxAge || 0; - options.root = root; - - return function staticMiddleware(req, res, next) { - if ('GET' != req.method && 'HEAD' != req.method) return next(); - var opts = extend({}, options); - var originalUrl = url.parse(req.originalUrl || req.url); - var path = parseurl(req).pathname; - - if (path === '/' && originalUrl.pathname[originalUrl.pathname.length - 1] !== '/') { - // make sure redirect occurs at mount - path = '' - } - - // create send stream - var stream = send(req, path, opts) - - if (redirect) { - // redirect relative to originalUrl - stream.on('directory', function redirect() { - originalUrl.pathname += '/' - - var target = url.format(originalUrl) - - res.statusCode = 303 - res.setHeader('Content-Type', 'text/html; charset=utf-8') - res.setHeader('Location', target) - res.end('Redirecting to ' + escapeHtml(target) + '\n') - }) - } else { - // forward to next middleware on directory - stream.on('directory', next) - } - - // add headers listener - if (setHeaders) { - stream.on('headers', setHeaders) - } - - // forward non-404 errors - stream.on('error', function error(err) { - next(err.status === 404 ? null : err) - }) - - // pipe - stream.pipe(res) - }; -}; - -/** - * Expose mime module. - * - * If you wish to extend the mime table use this - * reference to the "mime" module in the npm registry. - */ - -exports.mime = send.mime; - -/** - * Shallow clone a single object. - * - * @param {Object} obj - * @param {Object} source - * @return {Object} - * @api private - */ - -function extend(obj, source) { - if (!source) return obj; - - for (var prop in source) { - obj[prop] = source[prop]; - } - - return obj; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore deleted file mode 100644 index 223570e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -coverage -test -examples -.travis.yml -*.sock diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/History.md deleted file mode 100644 index 2b3de42..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/History.md +++ /dev/null @@ -1,142 +0,0 @@ -0.7.3 / 2014-07-29 -================== - - * Fix incorrect 403 on Windows and Node.js 0.11 - -0.7.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -0.7.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -0.7.0 / 2014-07-20 -================== - - * Deprecate `hidden` option; use `dotfiles` option - * Add `dotfiles` option - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - -0.6.0 / 2014-07-11 -================== - - * Deprecate `from` option; use `root` option - * Deprecate `send.etag()` -- use `etag` in `options` - * Deprecate `send.hidden()` -- use `hidden` in `options` - * Deprecate `send.index()` -- use `index` in `options` - * Deprecate `send.maxage()` -- use `maxAge` in `options` - * Deprecate `send.root()` -- use `root` in `options` - * Cap `maxAge` value to 1 year - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - -0.5.0 / 2014-06-28 -================== - - * Accept string for `maxAge` (converted by `ms`) - * Add `headers` event - * Include link in default redirect response - * Use `EventEmitter.listenerCount` to count listeners - -0.4.3 / 2014-06-11 -================== - - * Do not throw un-catchable error on file open race condition - * Use `escape-html` for HTML escaping - * deps: debug@1.0.2 - - fix some debugging output colors on node.js 0.8 - * deps: finished@1.2.2 - * deps: fresh@0.2.2 - -0.4.2 / 2014-06-09 -================== - - * fix "event emitter leak" warnings - * deps: debug@1.0.1 - * deps: finished@1.2.1 - -0.4.1 / 2014-06-02 -================== - - * Send `max-age` in `Cache-Control` in correct format - -0.4.0 / 2014-05-27 -================== - - * Calculate ETag with md5 for reduced collisions - * Fix wrong behavior when index file matches directory - * Ignore stream errors after request ends - - Goodbye `EBADF, read` - * Skip directories in index file search - * deps: debug@0.8.1 - -0.3.0 / 2014-04-24 -================== - - * Fix sending files with dots without root set - * Coerce option types - * Accept API options in options object - * Set etags to "weak" - * Include file path in etag - * Make "Can't set headers after they are sent." catchable - * Send full entity-body for multi range requests - * Default directory access to 403 when index disabled - * Support multiple index paths - * Support "If-Range" header - * Control whether to generate etags - * deps: mime@1.2.11 - -0.2.0 / 2014-01-29 -================== - - * update range-parser and fresh - -0.1.4 / 2013-08-11 -================== - - * update fresh - -0.1.3 / 2013-07-08 -================== - - * Revert "Fix fd leak" - -0.1.2 / 2013-07-03 -================== - - * Fix fd leak - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md deleted file mode 100644 index 5eceeef..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/Readme.md +++ /dev/null @@ -1,159 +0,0 @@ -# send - -[![NPM version](https://badge.fury.io/js/send.svg)](https://badge.fury.io/js/send) -[![Build Status](https://travis-ci.org/visionmedia/send.svg?branch=master)](https://travis-ci.org/visionmedia/send) -[![Coverage Status](https://img.shields.io/coveralls/visionmedia/send.svg?branch=master)](https://coveralls.io/r/visionmedia/send) - - Send is Connect's `static()` extracted for generalized use, a streaming static file - server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework. - -## Installation - - $ npm install send - -## Examples - - Small: - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - send(req, req.url).pipe(res); -}).listen(3000); -``` - - Serving from a root directory with custom error-handling: - -```js -var http = require('http'); -var send = require('send'); -var url = require('url'); - -var app = http.createServer(function(req, res){ - // your custom error-handling logic: - function error(err) { - res.statusCode = err.status || 500; - res.end(err.message); - } - - // your custom headers - function headers(res, path, stat) { - // serve all files for download - res.setHeader('Content-Disposition', 'attachment'); - } - - // your custom directory handling logic: - function redirect() { - res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, url.parse(req.url).pathname, {root: '/www/example.com/public'}) - .on('error', error) - .on('directory', redirect) - .on('headers', headers) - .pipe(res); -}).listen(3000); -``` - -## API - -### Options - -#### etag - - Enable or disable etag generation, defaults to true. - -#### dotfiles - - Set how "dotfiles" are treated when encountered. A dotfile is a file - or directory that begins with a dot ("."). Note this check is done on - the path itself without checking if the path actually exists on the - disk. If `root` is specified, only the dotfiles above the root are - checked (i.e. the root itself can be within a dotfile when when set - to "deny"). - - The default value is `'ignore'`. - - - `'allow'` No special treatment for dotfiles. - - `'deny'` Send a 403 for any request for a dotfile. - - `'ignore'` Pretend like the dotfile does not exist and 404. - -#### index - - By default send supports "index.html" files, to disable this - set `false` or to supply a new index pass a string or an array - in preferred order. - -#### maxAge - - Provide a max-age in milliseconds for http caching, defaults to 0. - This can also be a string accepted by the - [ms](https://www.npmjs.org/package/ms#readme) module. - -#### root - - Serve files relative to `path`. - -### Events - - - `error` an error occurred `(err)` - - `directory` a directory was requested - - `file` a file was requested `(path, stat)` - - `headers` the headers are about to be set on a file `(res, path, stat)` - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -## Error-handling - - By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc. - -## Caching - - It does _not_ perform internal caching, you should use a reverse proxy cache such - as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;). - -## Debugging - - To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ npm test -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/index.js deleted file mode 100644 index 51b2b57..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/send'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js deleted file mode 100644 index 4bdd001..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/send.js +++ /dev/null @@ -1,712 +0,0 @@ - -/** - * Module dependencies. - */ - -var debug = require('debug')('send') -var deprecate = require('depd')('send') -var escapeHtml = require('escape-html') - , parseRange = require('range-parser') - , Stream = require('stream') - , mime = require('mime') - , fresh = require('fresh') - , path = require('path') - , http = require('http') - , onFinished = require('finished') - , fs = require('fs') - , normalize = path.normalize - , join = path.join - , utils = require('./utils'); -var EventEmitter = require('events').EventEmitter; -var ms = require('ms'); - -/** - * Variables. - */ -var maxMaxAge = 60 * 60 * 24 * 365 * 1000; // 1 year -var resolve = path.resolve -var sep = path.sep -var upPathRegexp = /(?:^|[\\\/])\.\.(?:[\\\/]|$)/ - -/** - * Expose `send`. - */ - -exports = module.exports = send; - -/** - * Expose mime module. - */ - -exports.mime = mime; - -/** - * Shim EventEmitter.listenerCount for node.js < 0.10 - */ - -/* istanbul ignore next */ -var listenerCount = EventEmitter.listenerCount - || function(emitter, type){ return emitter.listeners(type).length; }; - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @return {SendStream} - * @api public - */ - -function send(req, path, options) { - return new SendStream(req, path, options); -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @api private - */ - -function SendStream(req, path, options) { - var self = this; - options = options || {}; - this.req = req; - this.path = path; - this.options = options; - - this._etag = options.etag !== undefined - ? Boolean(options.etag) - : true - - this._dotfiles = options.dotfiles !== undefined - ? options.dotfiles - : 'ignore' - - if (['allow', 'deny', 'ignore'].indexOf(this._dotfiles) === -1) { - throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') - } - - this._hidden = Boolean(options.hidden) - - if ('hidden' in options) { - deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') - } - - // legacy support - if (!('dotfiles' in options)) { - this._dotfiles = undefined - } - - this._index = options.index !== undefined - ? normalizeIndex(options.index) - : ['index.html'] - - this._maxage = options.maxAge || options.maxage - this._maxage = typeof this._maxage === 'string' - ? ms(this._maxage) - : Number(this._maxage) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), maxMaxAge) - : 0 - - this._root = options.root - ? resolve(options.root) - : null - - if (!this._root && options.from) { - this.from(options.from); - } -} - -/** - * Inherits from `Stream.prototype`. - */ - -SendStream.prototype.__proto__ = Stream.prototype; - -/** - * Enable or disable etag generation. - * - * @param {Boolean} val - * @return {SendStream} - * @api public - */ - -SendStream.prototype.etag = deprecate.function(function etag(val) { - val = Boolean(val); - debug('etag %s', val); - this._etag = val; - return this; -}, 'send.etag: pass etag as option'); - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = deprecate.function(function hidden(val) { - val = Boolean(val); - debug('hidden %s', val); - this._hidden = val; - this._dotfiles = undefined - return this; -}, 'send.hidden: use dotfiles option'); - -/** - * Set index `paths`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean|Array} paths - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = deprecate.function(function index(paths) { - var index = !paths ? [] : normalizeIndex(paths); - debug('index %o', paths); - this._index = index; - return this; -}, 'send.index: pass index as option'); - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = function(path){ - path = String(path); - this._root = resolve(path) - return this; -}; - -SendStream.prototype.from = deprecate.function(SendStream.prototype.root, - 'send.from: pass root as option'); - -SendStream.prototype.root = deprecate.function(SendStream.prototype.root, - 'send.root: pass root as option'); - -/** - * Set max-age to `maxAge`. - * - * @param {Number} maxAge - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = deprecate.function(function maxage(maxAge) { - maxAge = typeof maxAge === 'string' - ? ms(maxAge) - : Number(maxAge); - if (isNaN(maxAge)) maxAge = 0; - if (Infinity == maxAge) maxAge = 60 * 60 * 24 * 365 * 1000; - debug('max-age %d', maxAge); - this._maxage = maxAge; - return this; -}, 'send.maxage: pass maxAge as option'); - -/** - * Emit error with `status`. - * - * @param {Number} status - * @api private - */ - -SendStream.prototype.error = function(status, err){ - var res = this.res; - var msg = http.STATUS_CODES[status]; - - err = err || new Error(msg); - err.status = status; - - // emit if listeners instead of responding - if (listenerCount(this, 'error') !== 0) { - return this.emit('error', err); - } - - // wipe all existing headers - res._headers = undefined; - - res.statusCode = err.status; - res.end(msg); -}; - -/** - * Check if the pathname ends with "/". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasTrailingSlash = function(){ - return '/' == this.path[this.path.length - 1]; -}; - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function(){ - return this.req.headers['if-none-match'] - || this.req.headers['if-modified-since']; -}; - -/** - * Strip content-* header fields. - * - * @api private - */ - -SendStream.prototype.removeContentHeaderFields = function(){ - var res = this.res; - Object.keys(res._headers).forEach(function(field){ - if (0 == field.indexOf('content')) { - res.removeHeader(field); - } - }); -}; - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function(){ - var res = this.res; - debug('not modified'); - this.removeContentHeaderFields(); - res.statusCode = 304; - res.end(); -}; - -/** - * Raise error that headers already sent. - * - * @api private - */ - -SendStream.prototype.headersAlreadySent = function headersAlreadySent(){ - var err = new Error('Can\'t set headers after they are sent.'); - debug('headers already sent'); - this.error(500, err); -}; - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function(){ - var res = this.res; - return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; -}; - -/** - * Handle stat() error. - * - * @param {Error} err - * @api private - */ - -SendStream.prototype.onStatError = function(err){ - var notfound = ['ENOENT', 'ENAMETOOLONG', 'ENOTDIR']; - if (~notfound.indexOf(err.code)) return this.error(404, err); - this.error(500, err); -}; - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function(){ - return fresh(this.req.headers, this.res._headers); -}; - -/** - * Check if the range is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isRangeFresh = function isRangeFresh(){ - var ifRange = this.req.headers['if-range']; - - if (!ifRange) return true; - - return ~ifRange.indexOf('"') - ? ~ifRange.indexOf(this.res._headers['etag']) - : Date.parse(this.res._headers['last-modified']) <= Date.parse(ifRange); -}; - -/** - * Redirect to `path`. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.redirect = function(path){ - if (listenerCount(this, 'directory') !== 0) { - return this.emit('directory'); - } - - if (this.hasTrailingSlash()) return this.error(403); - var res = this.res; - path += '/'; - res.statusCode = 301; - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.setHeader('Location', path); - res.end('Redirecting to ' + escapeHtml(path) + '\n'); -}; - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function(res){ - var self = this - , args = arguments - , root = this._root; - - // references - this.res = res; - - // decode the path - var path = utils.decode(this.path) - if (path === -1) return this.error(400) - - // null byte(s) - if (~path.indexOf('\0')) return this.error(400); - - var parts - if (root !== null) { - // join / normalize from optional root dir - path = normalize(join(root, path)) - root = normalize(root) - - // malicious path - if (path.substr(0, root.length) !== root) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = path.substr(root.length + 1).split(sep) - } else { - // ".." is malicious without "root" - if (upPathRegexp.test(path)) { - debug('malicious path "%s"', path) - return this.error(403) - } - - // explode path parts - parts = normalize(path).split(sep) - - // resolve the path - path = resolve(path) - } - - // dotfile handling - if (containsDotFile(parts)) { - var access = this._dotfiles - - // legacy support - if (access === undefined) { - access = parts[parts.length - 1][0] === '.' - ? (this._hidden ? 'allow' : 'ignore') - : 'allow' - } - - debug('%s dotfile "%s"', access, path) - switch (access) { - case 'allow': - break - case 'deny': - return this.error(403) - case 'ignore': - default: - return this.error(404) - } - } - - // index file support - if (this._index.length && this.hasTrailingSlash()) { - this.sendIndex(path); - return res; - } - - debug('stat "%s"', path); - fs.stat(path, function(err, stat){ - if (err) return self.onStatError(err); - if (stat.isDirectory()) return self.redirect(self.path); - self.emit('file', path, stat); - self.send(path, stat); - }); - - return res; -}; - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function(path, stat){ - var options = this.options; - var len = stat.size; - var res = this.res; - var req = this.req; - var ranges = req.headers.range; - var offset = options.start || 0; - - if (res._header) { - // impossible to send now - return this.headersAlreadySent(); - } - - debug('pipe "%s"', path) - - // set header fields - this.setHeader(path, stat); - - // set content-type - this.type(path); - - // conditional GET support - if (this.isConditionalGET() - && this.isCachable() - && this.isFresh()) { - return this.notModified(); - } - - // adjust len to start/end options - len = Math.max(0, len - offset); - if (options.end !== undefined) { - var bytes = options.end - offset + 1; - if (len > bytes) len = bytes; - } - - // Range support - if (ranges) { - ranges = parseRange(len, ranges); - - // If-Range support - if (!this.isRangeFresh()) { - debug('range stale'); - ranges = -2; - } - - // unsatisfiable - if (-1 == ranges) { - debug('range unsatisfiable'); - res.setHeader('Content-Range', 'bytes */' + stat.size); - return this.error(416); - } - - // valid (syntactically invalid/multiple ranges are treated as a regular response) - if (-2 != ranges && ranges.length === 1) { - debug('range %j', ranges); - - options.start = offset + ranges[0].start; - options.end = offset + ranges[0].end; - - // Content-Range - res.statusCode = 206; - res.setHeader('Content-Range', 'bytes ' - + ranges[0].start - + '-' - + ranges[0].end - + '/' - + len); - len = options.end - options.start + 1; - } - } - - // content-length - res.setHeader('Content-Length', len); - - // HEAD support - if ('HEAD' == req.method) return res.end(); - - this.stream(path, options); -}; - -/** - * Transfer index for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendIndex = function sendIndex(path){ - var i = -1; - var self = this; - - function next(err){ - if (++i >= self._index.length) { - if (err) return self.onStatError(err); - return self.error(404); - } - - var p = path + self._index[i]; - - debug('stat "%s"', p); - fs.stat(p, function(err, stat){ - if (err) return next(err); - if (stat.isDirectory()) return next(); - self.emit('file', p, stat); - self.send(p, stat); - }); - } - - if (!this.hasTrailingSlash()) path += '/'; - - next(); -}; - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function(path, options){ - // TODO: this is all lame, refactor meeee - var finished = false; - var self = this; - var res = this.res; - var req = this.req; - - // pipe - var stream = fs.createReadStream(path, options); - this.emit('stream', stream); - stream.pipe(res); - - // response finished, done with the fd - onFinished(res, function onfinished(){ - finished = true; - stream.destroy(); - }); - - // error handling code-smell - stream.on('error', function onerror(err){ - // request already finished - if (finished) return; - - // clean up stream - finished = true; - stream.destroy(); - - // no hope in responding - if (res._header) { - console.error(err.stack); - req.destroy(); - return; - } - - // error - self.onStatError(err); - }); - - // end - stream.on('end', function onend(){ - self.emit('end'); - }); -}; - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function(path){ - var res = this.res; - if (res.getHeader('Content-Type')) return; - var type = mime.lookup(path); - var charset = mime.charsets.lookup(type); - debug('content-type %s', type); - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); -}; - -/** - * Set response header fields, most - * fields may be pre-defined. - * - * @param {String} path - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function setHeader(path, stat){ - var res = this.res; - - this.emit('headers', res, path, stat); - - if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); - if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString()); - if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + Math.floor(this._maxage / 1000)); - if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString()); - - if (this._etag && !res.getHeader('ETag')) { - var etag = utils.etag(path, stat); - debug('etag %s', etag); - res.setHeader('ETag', etag); - } -}; - -/** - * Determine if path parts contain a dotfile. - * - * @api private - */ - -function containsDotFile(parts) { - for (var i = 0; i < parts.length; i++) { - if (parts[i][0] === '.') { - return true - } - } - - return false -} - -/** - * Normalize the index option into an array. - * - * @param {boolean|string|array} val - * @api private - */ - -function normalizeIndex(val){ - return [].concat(val || []) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js deleted file mode 100644 index 3a88bf9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/lib/utils.js +++ /dev/null @@ -1,42 +0,0 @@ - -/** - * Module dependencies. - */ - -var crypto = require('crypto'); - -/** - * Return a weak ETag from the given `path` and `stat`. - * - * @param {String} path - * @param {Object} stat - * @return {String} - * @api private - */ - -exports.etag = function etag(path, stat) { - var tag = String(stat.mtime.getTime()) + ':' + String(stat.size) + ':' + path; - var str = crypto - .createHash('md5') - .update(tag, 'utf8') - .digest('base64'); - return 'W/"' + str + '"'; -}; - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -exports.decode = function(path){ - try { - return decodeURIComponent(path); - } catch (err) { - return -1; - } -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md deleted file mode 100644 index 8937250..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/HISTORY.md +++ /dev/null @@ -1,50 +0,0 @@ -1.2.2 / 2014-06-10 -========== - - * reduce listeners added to emitters - - avoids "event emitter leak" warnings when used multiple times on same request - -1.2.1 / 2014-06-08 -================== - - * fix returned value when already finished - -1.2.0 / 2014-06-05 -================== - - * call callback when called on already-finished socket - -1.1.4 / 2014-05-27 -================== - - * support node.js 0.8 - -1.1.3 / 2014-04-30 -================== - - * make sure errors passed as instanceof `Error` - -1.1.2 / 2014-04-18 -================== - - * default the `socket` to passed-in object - -1.1.1 / 2014-01-16 -================== - - * rename module to `finished` - -1.1.0 / 2013-12-25 -================== - - * call callback when called on already-errored socket - -1.0.1 / 2013-12-20 -================== - - * actually pass the error to the callback - -1.0.0 / 2013-12-20 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md deleted file mode 100644 index 79facd5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# finished - -[![NPM Version](https://badge.fury.io/js/finished.svg)](http://badge.fury.io/js/finished) -[![Build Status](https://travis-ci.org/expressjs/finished.svg?branch=master)](https://travis-ci.org/expressjs/finished) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/finished.svg?branch=master)](https://coveralls.io/r/expressjs/finished) - -Execute a callback when a request closes, finishes, or errors. - -#### Install - -```sh -$ npm install finished -``` - -#### Uses - -This is useful for cleaning up streams. For example, you want to destroy any file streams you create on socket errors otherwise you will leak file descriptors. - -This is required to fix what many perceive as issues with node's streams. Relevant: - -- [node#6041](https://github.com/joyent/node/issues/6041) -- [koa#184](https://github.com/koajs/koa/issues/184) -- [koa#165](https://github.com/koajs/koa/issues/165) - -## API - -### finished(response, callback) - -```js -var onFinished = require('finished') - -onFinished(res, function (err) { - // do something maybe -}) -``` - -### Examples - -The following code ensures that file descriptors are always closed once the response finishes. - -#### Node / Connect / Express - -```js -var onFinished = require('finished') - -function (req, res, next) { - var stream = fs.createReadStream('thingie.json') - stream.pipe(res) - onFinished(res, function (err) { - stream.destroy() - }) -} -``` - -#### Koa - -```js -function* () { - var stream = this.body = fs.createReadStream('thingie.json') - onFinished(this, function (err) { - stream.destroy() - }) -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js deleted file mode 100644 index 90709d4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/index.js +++ /dev/null @@ -1,62 +0,0 @@ -/*! - * finished - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** -* Module dependencies. -*/ - -var first = require('ee-first') - -/** -* Variables. -*/ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Invoke callback when the response has finished, useful for - * cleaning up resources afterwards. - * - * @param {object} thingie - * @param {function} callback - * @return {object} - * @api public - */ - -module.exports = function finished(thingie, callback) { - var socket = thingie.socket || thingie - var res = thingie.res || thingie - - if (res.finished || !socket.writable) { - defer(callback) - return thingie - } - - var listener = res.__onFinished - - // create a private single listener with queue - if (!listener || !listener.queue) { - listener = res.__onFinished = function onFinished(err) { - if (res.__onFinished === listener) res.__onFinished = null - var queue = listener.queue || [] - while (queue.length) queue.shift()(err) - } - listener.queue = [] - - // finished on first event - first([ - [socket, 'error', 'close'], - [res, 'finish'], - ], listener) - } - - listener.queue.push(callback) - - return thingie -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore deleted file mode 100644 index 72921ab..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.DS_Store* -node_modules diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md deleted file mode 100644 index 7eae173..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -# EE First - -Get the first event in a set of event emitters and event pairs, -then clean up after itself. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js deleted file mode 100644 index d0c48c9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/index.js +++ /dev/null @@ -1,60 +0,0 @@ - -module.exports = function first(stuff, done) { - if (!Array.isArray(stuff)) - throw new TypeError('arg must be an array of [ee, events...] arrays') - - var cleanups = [] - - for (var i = 0; i < stuff.length; i++) { - var arr = stuff[i] - - if (!Array.isArray(arr) || arr.length < 2) - throw new TypeError('each array member must be [ee, events...]') - - var ee = arr[0] - - for (var j = 1; j < arr.length; j++) { - var event = arr[j] - var fn = listener(event, cleanup) - - // listen to the event - ee.on(event, fn) - // push this listener to the list of cleanups - cleanups.push({ - ee: ee, - event: event, - fn: fn, - }) - } - } - - return function (fn) { - done = fn - } - - function cleanup() { - var x - for (var i = 0; i < cleanups.length; i++) { - x = cleanups[i] - x.ee.removeListener(x.event, x.fn) - } - done.apply(null, arguments) - } -} - -function listener(event, done) { - return function onevent(arg1) { - var args = new Array(arguments.length) - var ee = this - var err = event === 'error' - ? arg1 - : null - - // copy args to prevent arguments escaping scope - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - done(err, ee, event, args) - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json deleted file mode 100644 index 1f82e3e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "ee-first", - "description": "return the first event in a set of ee/event pairs", - "version": "1.0.3", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/jonathanong/ee-first" - }, - "devDependencies": { - "mocha": "1" - }, - "scripts": { - "test": "mocha --reporter spec" - }, - "bugs": { - "url": "https://github.com/jonathanong/ee-first/issues" - }, - "homepage": "https://github.com/jonathanong/ee-first", - "_id": "ee-first@1.0.3", - "_shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "_from": "ee-first@1.0.3", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "6c98c4089abecb5a7b85c1ac449aa603d3b3dabe", - "tarball": "http://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js deleted file mode 100644 index adff984..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/node_modules/ee-first/test.js +++ /dev/null @@ -1,60 +0,0 @@ - -var EventEmitter = require('events').EventEmitter -var assert = require('assert') - -var first = require('./') - -describe('first', function () { - var ee1 = new EventEmitter() - var ee2 = new EventEmitter() - var ee3 = new EventEmitter() - - it('should emit the first event', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - assert.equal(ee, ee2) - assert.equal(event, 'b') - assert.deepEqual(args, [1, 2, 3]) - done() - }) - - ee2.emit('b', 1, 2, 3) - }) - - it('it should return an error if event === error', function (done) { - first([ - [ee1, 'error', 'b', 'c'], - [ee2, 'error', 'b', 'c'], - [ee3, 'error', 'b', 'c'], - ], function (err, ee, event, args) { - assert.equal(err.message, 'boom') - assert.equal(ee, ee3) - assert.equal(event, 'error') - done() - }) - - ee3.emit('error', new Error('boom')) - }) - - it('should cleanup after itself', function (done) { - first([ - [ee1, 'a', 'b', 'c'], - [ee2, 'a', 'b', 'c'], - [ee3, 'a', 'b', 'c'], - ], function (err, ee, event, args) { - assert.ifError(err) - ;[ee1, ee2, ee3].forEach(function (ee) { - ['a', 'b', 'c'].forEach(function (event) { - assert(!ee.listeners(event).length) - }) - }) - done() - }) - - ee1.emit('a') - }) -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json deleted file mode 100644 index b645a74..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/finished/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "finished", - "description": "Execute a callback when a request closes, finishes, or errors", - "version": "1.2.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/finished" - }, - "dependencies": { - "ee-first": "1.0.3" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.1", - "should": "~4.0.1" - }, - "engine": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/finished/issues" - }, - "homepage": "https://github.com/expressjs/finished", - "_id": "finished@1.2.2", - "_shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "_from": "finished@1.2.2", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "41608eafadfd65683b46a1220bc4b1ec3daedcd8", - "tarball": "http://registry.npmjs.org/finished/-/finished-1.2.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md deleted file mode 100644 index 6ca19bd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.default_type -Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.) - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js deleted file mode 100644 index 48be0c5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/mime.js +++ /dev/null @@ -1,114 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - if (process.env.DEBUG_MIME && this.types[exts]) { - console.warn(this._loading.replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + - this.types[exts] + ' to ' + type); - } - - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - - this._loading = file; - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); - - this._loading = null; -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/\\]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); - return this.extensions[type]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -}; - -module.exports = mime; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json deleted file mode 100644 index 917e6af..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.2.11", - "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g.\n\n var mime = require('mime');\n\n mime.lookup('/path/to/file.txt'); // => 'text/plain'\n mime.lookup('file.txt'); // => 'text/plain'\n mime.lookup('.TXT'); // => 'text/plain'\n mime.lookup('htm'); // => 'text/html'\n\n### mime.default_type\nSets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)\n\n### mime.extension(type)\nGet the default extension for `type`\n\n mime.extension('text/html'); // => 'html'\n mime.extension('application/octet-stream'); // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n mime.charsets.lookup('text/plain'); // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n mime.define({\n 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n 'application/x-my-type': ['x-mt', 'x-mtt'],\n // etc ...\n });\n\n mime.lookup('x-sft'); // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n mime.load('./my_project.types');\n\nThe .types file format is simple - See the `types` dir for examples.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/broofa/node-mime/issues" - }, - "_id": "mime@1.2.11", - "dist": { - "shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "tarball": "http://registry.npmjs.org/mime/-/mime-1.2.11.tgz" - }, - "_from": "mime@1.2.11", - "_npmVersion": "1.3.6", - "_npmUser": { - "name": "broofa", - "email": "robert@broofa.com" - }, - "maintainers": [ - { - "name": "broofa", - "email": "robert@broofa.com" - }, - { - "name": "bentomas", - "email": "benjamin@benjaminthomas.org" - } - ], - "directories": {}, - "_shasum": "58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10", - "_resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "homepage": "https://github.com/broofa/node-mime" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js deleted file mode 100644 index 2cda1c7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/test.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); -var path = require('path'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); // normal file -eq('text/plain', mime.lookup('TEXT.TXT')); // uppercase -eq('text/plain', mime.lookup('dir/text.txt')); // dir + file -eq('text/plain', mime.lookup('.text.txt')); // hidden file -eq('text/plain', mime.lookup('.txt')); // nameless -eq('text/plain', mime.lookup('txt')); // extension-only -eq('text/plain', mime.lookup('/txt')); // extension-less () -eq('text/plain', mime.lookup('\\txt')); // Windows, extension-less -eq('application/octet-stream', mime.lookup('text.nope')); // unrecognized -eq('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq('bin', mime.extension('application/octet-stream ')); -eq('html', mime.extension(' text/html; charset=UTF-8')); -eq('html', mime.extension('text/html; charset=UTF-8 ')); -eq('html', mime.extension('text/html; charset=UTF-8')); -eq('html', mime.extension('text/html ; charset=UTF-8')); -eq('html', mime.extension('text/html;charset=UTF-8')); -eq('html', mime.extension('text/Html;charset=UTF-8')); -eq(undefined, mime.extension('unrecognized')); - -// -// Test node.types lookups -// - -eq('application/font-woff', mime.lookup('file.woff')); -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); -eq('font/opentype', mime.lookup('file.otf')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -// -// Test for overlaps between mime.types and node.types -// - -var apacheTypes = new mime.Mime(), nodeTypes = new mime.Mime(); -apacheTypes.load(path.join(__dirname, 'types/mime.types')); -nodeTypes.load(path.join(__dirname, 'types/node.types')); - -var keys = [].concat(Object.keys(apacheTypes.types)) - .concat(Object.keys(nodeTypes.types)); -keys.sort(); -for (var i = 1; i < keys.length; i++) { - if (keys[i] == keys[i-1]) { - console.warn('Warning: ' + - 'node.types defines ' + keys[i] + '->' + nodeTypes.types[keys[i]] + - ', mime.types defines ' + keys[i] + '->' + apacheTypes.types[keys[i]]); - } -} - -console.log('\nOK'); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types deleted file mode 100644 index da8cd69..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types deleted file mode 100644 index 55b2cf7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/mime/types/node.types +++ /dev/null @@ -1,77 +0,0 @@ -# What: WebVTT -# Why: To allow formats intended for marking up external text track resources. -# http://dev.w3.org/html5/webvtt/ -# Added by: niftylettuce -text/vtt vtt - -# 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: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifes ('.manifest' extension) -# 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 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: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp - -# What: Lua file types -# Why: Googling around shows de-facto consensus on these -# Added by: creationix (Issue #45) -text/x-lua lua -application/x-lua-bytecode luac - -# What: Markdown files, as per http://daringfireball.net/projects/markdown/syntax -# Why: http://stackoverflow.com/questions/10701983/what-is-the-mime-type-for-markdown -# Added by: avoidwork -text/x-markdown markdown md mkd - -# What: ini files -# Why: because they're just text files -# Added by: Matthew Kastor -text/plain ini - -# What: DASH Adaptive Streaming manifest -# Why: https://developer.mozilla.org/en-US/docs/DASH_Adaptive_Streaming_for_HTML_5_Video -# Added by: eelcocramer -application/dash+xml mdp - -# What: OpenType font files - http://www.microsoft.com/typography/otspec/ -# Why: Browsers usually ignore the font MIME types and sniff the content, -# but Chrome, shows a warning if OpenType fonts aren't served with -# the `font/opentype` MIME type: http://i.imgur.com/8c5RN8M.png. -# Added by: alrra -font/opentype otf diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore deleted file mode 100644 index d1aa0ce..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -test -History.md -Makefile -component.json diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md deleted file mode 100644 index d4ab12a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# ms.js: miliseconds conversion utility - -```js -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('100') // 100 -``` - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours', { long: true })) // "10 hours" -``` - -- Node/Browser compatible. Published as `ms` in NPM. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as -a number (e.g: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of -equivalent ms is returned. - -## License - -MIT \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js deleted file mode 100644 index c5847f8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/index.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var match = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!match) return; - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(ms) { - if (ms >= d) return Math.round(ms / d) + 'd'; - if (ms >= h) return Math.round(ms / h) + 'h'; - if (ms >= m) return Math.round(ms / m) + 'm'; - if (ms >= s) return Math.round(ms / s) + 's'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) return; - if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name; - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json deleted file mode 100644 index 654cde8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/node_modules/ms/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "ms", - "version": "0.6.2", - "description": "Tiny ms conversion utility", - "repository": { - "type": "git", - "url": "git://github.com/guille/ms.js.git" - }, - "main": "./index", - "devDependencies": { - "mocha": "*", - "expect.js": "*", - "serve": "*" - }, - "component": { - "scripts": { - "ms/index.js": "index.js" - } - }, - "readme": "# ms.js: miliseconds conversion utility\n\n```js\nms('1d') // 86400000\nms('10h') // 36000000\nms('2h') // 7200000\nms('1m') // 60000\nms('5s') // 5000\nms('100') // 100\n```\n\n```js\nms(60000) // \"1m\"\nms(2 * 60000) // \"2m\"\nms(ms('10 hours')) // \"10h\"\n```\n\n```js\nms(60000, { long: true }) // \"1 minute\"\nms(2 * 60000, { long: true }) // \"2 minutes\"\nms(ms('10 hours', { long: true })) // \"10 hours\"\n```\n\n- Node/Browser compatible. Published as `ms` in NPM.\n- If a number is supplied to `ms`, a string with a unit is returned.\n- If a string that contains the number is supplied, it returns it as\na number (e.g: it returns `100` for `'100'`).\n- If you pass a string with a number and a valid unit, the number of\nequivalent ms is returned.\n\n## License\n\nMIT", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/guille/ms.js/issues" - }, - "_id": "ms@0.6.2", - "dist": { - "shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "tarball": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - }, - "_from": "ms@0.6.2", - "_npmVersion": "1.2.30", - "_npmUser": { - "name": "rauchg", - "email": "rauchg@gmail.com" - }, - "maintainers": [ - { - "name": "rauchg", - "email": "rauchg@gmail.com" - } - ], - "directories": {}, - "_shasum": "d89c2124c6fdc1353d65a8b77bf1aac4b193708c", - "_resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "homepage": "https://github.com/guille/ms.js", - "scripts": {} -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/package.json deleted file mode 100644 index bb5e8b4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/node_modules/send/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "send", - "description": "Better streaming static file server with Range and conditional-GET support", - "version": "0.7.3", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/send" - }, - "keywords": [ - "static", - "file", - "server" - ], - "dependencies": { - "debug": "1.0.4", - "depd": "0.4.4", - "escape-html": "1.0.1", - "finished": "1.2.2", - "fresh": "0.2.2", - "mime": "1.2.11", - "ms": "0.6.2", - "range-parser": "~1.0.0" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.0", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --check-leaks --reporter spec --bail", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec" - }, - "bugs": { - "url": "https://github.com/visionmedia/send/issues" - }, - "homepage": "https://github.com/visionmedia/send", - "_id": "send@0.7.3", - "dist": { - "shasum": "2caa2e2627d2f9c2d109d3f5c2942935480aa993", - "tarball": "http://registry.npmjs.org/send/-/send-0.7.3.tgz" - }, - "_from": "send@0.7.3", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "directories": {}, - "_shasum": "2caa2e2627d2f9c2d109d3f5c2942935480aa993", - "_resolved": "https://registry.npmjs.org/send/-/send-0.7.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/package.json deleted file mode 100644 index 7345a3c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/serve-static/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "serve-static", - "description": "Serve static files", - "version": "1.4.3", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/expressjs/serve-static" - }, - "dependencies": { - "escape-html": "1.0.1", - "parseurl": "~1.2.0", - "send": "0.7.3" - }, - "devDependencies": { - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.0", - "supertest": "~0.13.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter spec --bail --check-leaks --require should test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks --require should test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks --require should test/" - }, - "bugs": { - "url": "https://github.com/expressjs/serve-static/issues" - }, - "homepage": "https://github.com/expressjs/serve-static", - "_id": "serve-static@1.4.3", - "dist": { - "shasum": "9f08c7dea1b15e2eb1382ae0e12b8a0de295de52", - "tarball": "http://registry.npmjs.org/serve-static/-/serve-static-1.4.3.tgz" - }, - "_from": "serve-static@>=1.4.2-0 <1.5.0-0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "directories": {}, - "_shasum": "9f08c7dea1b15e2eb1382ae0e12b8a0de295de52", - "_resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.4.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/HISTORY.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/HISTORY.md deleted file mode 100644 index b4c94be..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/HISTORY.md +++ /dev/null @@ -1,54 +0,0 @@ - -1.3.2 / 2014-06-24 -================== - - * use `~` range on mime-types - -1.3.1 / 2014-06-19 -================== - - * fix global variable leak - -1.3.0 / 2014-06-19 -================== - - * improve type parsing - - - invalid media type never matches - - media type not case-sensitive - - extra LWS does not affect results - -1.2.2 / 2014-06-19 -================== - - * fix behavior on unknown type argument - -1.2.1 / 2014-06-03 -================== - - * switch dependency from `mime` to `mime-types@1.0.0` - -1.2.0 / 2014-05-11 -================== - - * support suffix matching: - - - `+json` matches `application/vnd+json` - - `*/vnd+json` matches `application/vnd+json` - - `application/*+json` matches `application/vnd+json` - -1.1.0 / 2014-04-12 -================== - - * add non-array values support - * expose internal utilities: - - - `.is()` - - `.hasBody()` - - `.normalize()` - - `.match()` - -1.0.1 / 2014-03-30 -================== - - * add `multipart` as a shorthand diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/README.md deleted file mode 100644 index 5d8b166..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# type-is - -[![NPM version](https://badge.fury.io/js/type-is.svg)](https://badge.fury.io/js/type-is) -[![Build Status](https://travis-ci.org/expressjs/type-is.svg?branch=master)](https://travis-ci.org/expressjs/type-is) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/type-is.svg?branch=master)](https://coveralls.io/r/expressjs/type-is) - -Infer the content-type of a request. - -### Install - -```sh -$ npm install type-is -``` - -## API - -```js -var http = require('http') -var is = require('type-is') - -http.createServer(function (req, res) { - var istext = is(req, ['text/*']) - res.end('you ' + (istext ? 'sent' : 'did not send') + ' me text') -}) -``` - -### type = is(request, types) - -`request` is the node HTTP request. `types` is an array of types. - -```js -// req.headers.content-type = 'application/json' - -is(req, ['json']) // 'json' -is(req, ['html', 'json']) // 'json' -is(req, ['application/*']) // 'application/json' -is(req, ['application/json']) // 'application/json' - -is(req, ['html']) // false -``` - -#### Each type can be: - -- An extension name such as `json`. This name will be returned if matched. -- A mime type such as `application/json`. -- A mime type with a wildcard such as `*/json` or `application/*`. The full mime type will be returned if matched -- A suffix such as `+json`. This can be combined with a wildcard such as `*/vnd+json` or `application/*+json`. The full mime type will be returned if matched. - -`false` will be returned if no type matches. - -## Examples - -#### Example body parser - -```js -var is = require('type-is'); -var parse = require('body'); -var busboy = require('busboy'); - -function bodyParser(req, res, next) { - if (!is.hasBody(req)) return next(); - - switch (is(req, ['urlencoded', 'json', 'multipart'])) { - case 'urlencoded': - // parse urlencoded body - break - case 'json': - // parse json body - break - case 'multipart': - // parse multipart body - break - default: - // 415 error code - } -} -``` - -## License - -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/index.js deleted file mode 100644 index 315907a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/index.js +++ /dev/null @@ -1,230 +0,0 @@ - -var typer = require('media-typer') -var mime = require('mime-types') - -module.exports = typeofrequest; -typeofrequest.is = typeis; -typeofrequest.hasBody = hasbody; -typeofrequest.normalize = normalize; -typeofrequest.match = mimeMatch; - -/** - * Compare a `value` content-type with `types`. - * Each `type` can be an extension like `html`, - * a special shortcut like `multipart` or `urlencoded`, - * or a mime type. - * - * If no types match, `false` is returned. - * Otherwise, the first `type` that matches is returned. - * - * @param {String} value - * @param {Array} types - * @return String - */ - -function typeis(value, types_) { - var i - var types = types_ - - // remove parameters and normalize - value = typenormalize(value) - - // no type or invalid - if (!value) { - return false - } - - // support flattened arguments - if (types && !Array.isArray(types)) { - types = new Array(arguments.length - 1) - for (i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // no types, return the content type - if (!types || !types.length) return value; - - var type - for (i = 0; i < types.length; i++) { - if (mimeMatch(normalize(type = types[i]), value)) { - return type[0] === '+' || ~type.indexOf('*') - ? value - : type - } - } - - // no matches - return false; -} - -/** - * Check if a request has a request body. - * A request with a body __must__ either have `transfer-encoding` - * or `content-length` headers set. - * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 - * - * @param {Object} request - * @return {Boolean} - * @api public - */ - -function hasbody(req) { - var headers = req.headers; - if ('transfer-encoding' in headers) return true; - var length = headers['content-length']; - if (!length) return false; - // no idea when this would happen, but `isNaN(null) === false` - if (isNaN(length)) return false; - return !!parseInt(length, 10); -} - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains any of the give mime `type`s. - * If there is no request body, `null` is returned. - * If there is no content type, `false` is returned. - * Otherwise, it returns the first `type` that matches. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * this.is('html'); // => 'html' - * this.is('text/html'); // => 'text/html' - * this.is('text/*', 'application/json'); // => 'text/html' - * - * // When Content-Type is application/json - * this.is('json', 'urlencoded'); // => 'json' - * this.is('application/json'); // => 'application/json' - * this.is('html', 'application/*'); // => 'application/json' - * - * this.is('html'); // => false - * - * @param {String|Array} types... - * @return {String|false|null} - * @api public - */ - -function typeofrequest(req, types_) { - var types = types_ - - // no body - if (!hasbody(req)) { - return null - } - - // support flattened arguments - if (arguments.length > 2) { - types = new Array(arguments.length - 1) - for (var i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // request content type - var value = req.headers['content-type'] - - return typeis(value, types); -} - -/** - * Normalize a mime type. - * If it's a shorthand, expand it to a valid mime type. - * - * In general, you probably want: - * - * var type = is(req, ['urlencoded', 'json', 'multipart']); - * - * Then use the appropriate body parsers. - * These three are the most common request body types - * and are thus ensured to work. - * - * @param {String} type - * @api private - */ - -function normalize(type) { - switch (type) { - case 'urlencoded': return 'application/x-www-form-urlencoded'; - case 'multipart': - type = 'multipart/*'; - break; - } - - return type[0] === '+' || ~type.indexOf('/') - ? type - : mime.lookup(type) -} - -/** - * Check if `exected` mime type - * matches `actual` mime type with - * wildcard and +suffix support. - * - * @param {String} expected - * @param {String} actual - * @return {Boolean} - * @api private - */ - -function mimeMatch(expected, actual) { - // invalid type - if (expected === false) { - return false - } - - // exact match - if (expected === actual) { - return true - } - - actual = actual.split('/'); - - if (expected[0] === '+') { - // support +suffix - return Boolean(actual[1]) - && expected.length <= actual[1].length - && expected === actual[1].substr(0 - expected.length) - } - - if (!~expected.indexOf('*')) return false; - - expected = expected.split('/'); - - if (expected[0] === '*') { - // support */yyy - return expected[1] === actual[1] - } - - if (expected[1] === '*') { - // support xxx/* - return expected[0] === actual[0] - } - - if (expected[1][0] === '*' && expected[1][1] === '+') { - // support xxx/*+zzz - return expected[0] === actual[0] - && expected[1].length <= actual[1].length + 1 - && expected[1].substr(1) === actual[1].substr(1 - expected[1].length) - } - - return false -} - -/** - * Normalize a type and remove parameters. - * - * @param {string} value - * @return {string} - * @api private - */ - -function typenormalize(value) { - try { - var type = typer.parse(value) - delete type.parameters - return typer.format(type) - } catch (err) { - return null - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore deleted file mode 100644 index 919d51b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -test -build.js - -# OS generated files # -###################### -.DS_Store* -# Icon? -ehthumbs.db -Thumbs.db - -# Node.js # -########### -node_modules -npm-debug.log diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml deleted file mode 100644 index 73c85c6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" - - "0.11" -matrix: - allow_failures: - - node_js: "0.11" - fast_finish: true -before_install: - # remove build script deps before install - - node -pe 'f="./package.json";p=require(f);d=p.devDependencies;for(k in d){if("co"===k.substr(0,2))delete d[k]}require("fs").writeFileSync(f,JSON.stringify(p,null,2))' diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE deleted file mode 100644 index a7ae8ee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile deleted file mode 100644 index ceaf011..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/Makefile +++ /dev/null @@ -1,9 +0,0 @@ - -build: - node --harmony-generators build.js - -test: - node test/mime.js - mocha --require should --reporter spec test/test.js - -.PHONY: build test diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md deleted file mode 100644 index 8e21ee1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# mime-types -[![NPM version](https://badge.fury.io/js/mime-types.svg)](https://badge.fury.io/js/mime-types) [![Build Status](https://travis-ci.org/expressjs/mime-types.svg?branch=master)](https://travis-ci.org/expressjs/mime-types) - -The ultimate javascript content-type utility. - -### Install - -```sh -$ npm install mime-types -``` - -#### Similar to [node-mime](https://github.com/broofa/node-mime), except: - -- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`, so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`. -- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`. -- Additional mime types are added such as jade and stylus. Feel free to add more! -- Browser support via Browserify and Component by converting lists to JSON files. - -Otherwise, the API is compatible. - -### Adding Types - -If you'd like to add additional types, -simply create a PR adding the type to `custom.json` and -a reference link to the [sources](SOURCES.md). - -Do __NOT__ edit `mime.json` or `node.json`. -Those are pulled using `build.js`. -You should only touch `custom.json`. - -## API - -```js -var mime = require('mime-types') -``` - -All functions return `false` if input is invalid or not found. - -### mime.lookup(path) - -Lookup the content-type associated with a file. - -```js -mime.lookup('json') // 'application/json' -mime.lookup('.md') // 'text/x-markdown' -mime.lookup('file.html') // 'text/html' -mime.lookup('folder/file.js') // 'application/javascript' - -mime.lookup('cats') // false -``` - -### mime.contentType(type) - -Create a full content-type header given a content-type or extension. - -```js -mime.contentType('markdown') // 'text/x-markdown; charset=utf-8' -mime.contentType('file.json') // 'application/json; charset=utf-8' -``` - -### mime.extension(type) - -Get the default extension for a content-type. - -```js -mime.extension('application/octet-stream') // 'bin' -``` - -### mime.charset(type) - -Lookup the implied default charset of a content-type. - -```js -mime.charset('text/x-markdown') // 'UTF-8' -``` - -### mime.types[extension] = type - -A map of content-types by extension. - -### mime.extensions[type] = [extensions] - -A map of extensions by content-type. - -### mime.define(types) - -Globally add definitions. -`types` must be an object of the form: - -```js -{ - "": [extensions...], - "": [extensions...] -} -``` - -See the `.json` files in `lib/` for examples. - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md deleted file mode 100644 index 1d65012..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/SOURCES.md +++ /dev/null @@ -1,17 +0,0 @@ - -### Sources for custom types - -This is a list of sources for any custom mime types. -When adding custom mime types, please link to where you found the mime type, -even if it's from an unofficial source. - -- `text/coffeescript` - http://coffeescript.org/#scripts -- `text/x-handlebars-template` - https://handlebarsjs.com/#getting-started -- `text/x-sass` & `text/x-scss` - https://github.com/janlelis/rubybuntu-mime/blob/master/sass.xml -- `text.jsx` - http://facebook.github.io/react/docs/getting-started.html [[2]](https://github.com/facebook/react/blob/f230e0a03154e6f8a616e0da1fb3d97ffa1a6472/vendor/browser-transforms.js#L210) - -[Sources for node.json types](https://github.com/broofa/node-mime/blob/master/types/node.types) - -### Notes on weird types - -- `font/opentype` - This type is technically invalid according to the spec. No valid types begin with `font/`. No-one uses the official type of `application/vnd.ms-opentype` as the community standardized `application/x-font-otf`. However, chrome logs nonsense warnings unless opentype fonts are served with `font/opentype`. [[1]](http://stackoverflow.com/questions/2871655/proper-mime-type-for-fonts) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json deleted file mode 100644 index fa67a6d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/component.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "0.1.0", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com", - "twitter": "https://twitter.com/jongleberry" - }, - "repository": "expressjs/mime-types", - "license": "MIT", - "main": "lib/index.js", - "scripts": ["lib/index.js"], - "json": ["mime.json", "node.json", "custom.json"] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json deleted file mode 100644 index 6137da3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/custom.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "text/jade": [ - "jade" - ], - "text/stylus": [ - "stylus", - "styl" - ], - "text/less": [ - "less" - ], - "text/x-sass": [ - "sass" - ], - "text/x-scss": [ - "scss" - ], - "text/coffeescript": [ - "coffee" - ], - "text/x-handlebars-template": [ - "hbs" - ], - "text/jsx": [ - "jsx" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js deleted file mode 100644 index 27559ea..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/index.js +++ /dev/null @@ -1,74 +0,0 @@ - -// types[extension] = type -exports.types = Object.create(null) -// extensions[type] = [extensions] -exports.extensions = Object.create(null) -// define more mime types -exports.define = define - -// store the json files -exports.json = { - mime: require('./mime.json'), - node: require('./node.json'), - custom: require('./custom.json'), -} - -exports.lookup = function (string) { - if (!string || typeof string !== "string") return false - string = string.replace(/.*[\.\/\\]/, '').toLowerCase() - if (!string) return false - return exports.types[string] || false -} - -exports.extension = function (type) { - if (!type || typeof type !== "string") return false - type = type.match(/^\s*([^;\s]*)(?:;|\s|$)/) - if (!type) return false - var exts = exports.extensions[type[1].toLowerCase()] - if (!exts || !exts.length) return false - return exts[0] -} - -// type has to be an exact mime type -exports.charset = function (type) { - // special cases - switch (type) { - case 'application/json': return 'UTF-8' - } - - // default text/* to utf-8 - if (/^text\//.test(type)) return 'UTF-8' - - return false -} - -// backwards compatibility -exports.charsets = { - lookup: exports.charset -} - -exports.contentType = function (type) { - if (!type || typeof type !== "string") return false - if (!~type.indexOf('/')) type = exports.lookup(type) - if (!type) return false - if (!~type.indexOf('charset')) { - var charset = exports.charset(type) - if (charset) type += '; charset=' + charset.toLowerCase() - } - return type -} - -define(exports.json.mime) -define(exports.json.node) -define(exports.json.custom) - -function define(json) { - Object.keys(json).forEach(function (type) { - var exts = json[type] || [] - exports.extensions[type] = exports.extensions[type] || [] - exts.forEach(function (ext) { - if (!~exports.extensions[type].indexOf(ext)) exports.extensions[type].push(ext) - exports.types[ext] = type - }) - }) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json deleted file mode 100644 index f445a86..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/mime.json +++ /dev/null @@ -1,3317 +0,0 @@ -{ - "application/1d-interleaved-parityfec": [], - "application/3gpp-ims+xml": [], - "application/activemessage": [], - "application/andrew-inset": [ - "ez" - ], - "application/applefile": [], - "application/applixware": [ - "aw" - ], - "application/atom+xml": [ - "atom" - ], - "application/atomcat+xml": [ - "atomcat" - ], - "application/atomicmail": [], - "application/atomsvc+xml": [ - "atomsvc" - ], - "application/auth-policy+xml": [], - "application/batch-smtp": [], - "application/beep+xml": [], - "application/calendar+xml": [], - "application/cals-1840": [], - "application/ccmp+xml": [], - "application/ccxml+xml": [ - "ccxml" - ], - "application/cdmi-capability": [ - "cdmia" - ], - "application/cdmi-container": [ - "cdmic" - ], - "application/cdmi-domain": [ - "cdmid" - ], - "application/cdmi-object": [ - "cdmio" - ], - "application/cdmi-queue": [ - "cdmiq" - ], - "application/cea-2018+xml": [], - "application/cellml+xml": [], - "application/cfw": [], - "application/cnrp+xml": [], - "application/commonground": [], - "application/conference-info+xml": [], - "application/cpl+xml": [], - "application/csta+xml": [], - "application/cstadata+xml": [], - "application/cu-seeme": [ - "cu" - ], - "application/cybercash": [], - "application/davmount+xml": [ - "davmount" - ], - "application/dca-rft": [], - "application/dec-dx": [], - "application/dialog-info+xml": [], - "application/dicom": [], - "application/dns": [], - "application/docbook+xml": [ - "dbk" - ], - "application/dskpp+xml": [], - "application/dssc+der": [ - "dssc" - ], - "application/dssc+xml": [ - "xdssc" - ], - "application/dvcs": [], - "application/ecmascript": [ - "ecma" - ], - "application/edi-consent": [], - "application/edi-x12": [], - "application/edifact": [], - "application/emma+xml": [ - "emma" - ], - "application/epp+xml": [], - "application/epub+zip": [ - "epub" - ], - "application/eshop": [], - "application/example": [], - "application/exi": [ - "exi" - ], - "application/fastinfoset": [], - "application/fastsoap": [], - "application/fits": [], - "application/font-tdpfr": [ - "pfr" - ], - "application/framework-attributes+xml": [], - "application/gml+xml": [ - "gml" - ], - "application/gpx+xml": [ - "gpx" - ], - "application/gxf": [ - "gxf" - ], - "application/h224": [], - "application/held+xml": [], - "application/http": [], - "application/hyperstudio": [ - "stk" - ], - "application/ibe-key-request+xml": [], - "application/ibe-pkg-reply+xml": [], - "application/ibe-pp-data": [], - "application/iges": [], - "application/im-iscomposing+xml": [], - "application/index": [], - "application/index.cmd": [], - "application/index.obj": [], - "application/index.response": [], - "application/index.vnd": [], - "application/inkml+xml": [ - "ink", - "inkml" - ], - "application/iotp": [], - "application/ipfix": [ - "ipfix" - ], - "application/ipp": [], - "application/isup": [], - "application/java-archive": [ - "jar" - ], - "application/java-serialized-object": [ - "ser" - ], - "application/java-vm": [ - "class" - ], - "application/javascript": [ - "js" - ], - "application/json": [ - "json" - ], - "application/jsonml+json": [ - "jsonml" - ], - "application/kpml-request+xml": [], - "application/kpml-response+xml": [], - "application/lost+xml": [ - "lostxml" - ], - "application/mac-binhex40": [ - "hqx" - ], - "application/mac-compactpro": [ - "cpt" - ], - "application/macwriteii": [], - "application/mads+xml": [ - "mads" - ], - "application/marc": [ - "mrc" - ], - "application/marcxml+xml": [ - "mrcx" - ], - "application/mathematica": [ - "ma", - "nb", - "mb" - ], - "application/mathml-content+xml": [], - "application/mathml-presentation+xml": [], - "application/mathml+xml": [ - "mathml" - ], - "application/mbms-associated-procedure-description+xml": [], - "application/mbms-deregister+xml": [], - "application/mbms-envelope+xml": [], - "application/mbms-msk+xml": [], - "application/mbms-msk-response+xml": [], - "application/mbms-protection-description+xml": [], - "application/mbms-reception-report+xml": [], - "application/mbms-register+xml": [], - "application/mbms-register-response+xml": [], - "application/mbms-user-service-description+xml": [], - "application/mbox": [ - "mbox" - ], - "application/media_control+xml": [], - "application/mediaservercontrol+xml": [ - "mscml" - ], - "application/metalink+xml": [ - "metalink" - ], - "application/metalink4+xml": [ - "meta4" - ], - "application/mets+xml": [ - "mets" - ], - "application/mikey": [], - "application/mods+xml": [ - "mods" - ], - "application/moss-keys": [], - "application/moss-signature": [], - "application/mosskey-data": [], - "application/mosskey-request": [], - "application/mp21": [ - "m21", - "mp21" - ], - "application/mp4": [ - "mp4s" - ], - "application/mpeg4-generic": [], - "application/mpeg4-iod": [], - "application/mpeg4-iod-xmt": [], - "application/msc-ivr+xml": [], - "application/msc-mixer+xml": [], - "application/msword": [ - "doc", - "dot" - ], - "application/mxf": [ - "mxf" - ], - "application/nasdata": [], - "application/news-checkgroups": [], - "application/news-groupinfo": [], - "application/news-transmission": [], - "application/nss": [], - "application/ocsp-request": [], - "application/ocsp-response": [], - "application/octet-stream": [ - "bin", - "dms", - "lrf", - "mar", - "so", - "dist", - "distz", - "pkg", - "bpk", - "dump", - "elc", - "deploy" - ], - "application/oda": [ - "oda" - ], - "application/oebps-package+xml": [ - "opf" - ], - "application/ogg": [ - "ogx" - ], - "application/omdoc+xml": [ - "omdoc" - ], - "application/onenote": [ - "onetoc", - "onetoc2", - "onetmp", - "onepkg" - ], - "application/oxps": [ - "oxps" - ], - "application/parityfec": [], - "application/patch-ops-error+xml": [ - "xer" - ], - "application/pdf": [ - "pdf" - ], - "application/pgp-encrypted": [ - "pgp" - ], - "application/pgp-keys": [], - "application/pgp-signature": [ - "asc", - "sig" - ], - "application/pics-rules": [ - "prf" - ], - "application/pidf+xml": [], - "application/pidf-diff+xml": [], - "application/pkcs10": [ - "p10" - ], - "application/pkcs7-mime": [ - "p7m", - "p7c" - ], - "application/pkcs7-signature": [ - "p7s" - ], - "application/pkcs8": [ - "p8" - ], - "application/pkix-attr-cert": [ - "ac" - ], - "application/pkix-cert": [ - "cer" - ], - "application/pkix-crl": [ - "crl" - ], - "application/pkix-pkipath": [ - "pkipath" - ], - "application/pkixcmp": [ - "pki" - ], - "application/pls+xml": [ - "pls" - ], - "application/poc-settings+xml": [], - "application/postscript": [ - "ai", - "eps", - "ps" - ], - "application/prs.alvestrand.titrax-sheet": [], - "application/prs.cww": [ - "cww" - ], - "application/prs.nprend": [], - "application/prs.plucker": [], - "application/prs.rdf-xml-crypt": [], - "application/prs.xsf+xml": [], - "application/pskc+xml": [ - "pskcxml" - ], - "application/qsig": [], - "application/rdf+xml": [ - "rdf" - ], - "application/reginfo+xml": [ - "rif" - ], - "application/relax-ng-compact-syntax": [ - "rnc" - ], - "application/remote-printing": [], - "application/resource-lists+xml": [ - "rl" - ], - "application/resource-lists-diff+xml": [ - "rld" - ], - "application/riscos": [], - "application/rlmi+xml": [], - "application/rls-services+xml": [ - "rs" - ], - "application/rpki-ghostbusters": [ - "gbr" - ], - "application/rpki-manifest": [ - "mft" - ], - "application/rpki-roa": [ - "roa" - ], - "application/rpki-updown": [], - "application/rsd+xml": [ - "rsd" - ], - "application/rss+xml": [ - "rss" - ], - "application/rtf": [ - "rtf" - ], - "application/rtx": [], - "application/samlassertion+xml": [], - "application/samlmetadata+xml": [], - "application/sbml+xml": [ - "sbml" - ], - "application/scvp-cv-request": [ - "scq" - ], - "application/scvp-cv-response": [ - "scs" - ], - "application/scvp-vp-request": [ - "spq" - ], - "application/scvp-vp-response": [ - "spp" - ], - "application/sdp": [ - "sdp" - ], - "application/set-payment": [], - "application/set-payment-initiation": [ - "setpay" - ], - "application/set-registration": [], - "application/set-registration-initiation": [ - "setreg" - ], - "application/sgml": [], - "application/sgml-open-catalog": [], - "application/shf+xml": [ - "shf" - ], - "application/sieve": [], - "application/simple-filter+xml": [], - "application/simple-message-summary": [], - "application/simplesymbolcontainer": [], - "application/slate": [], - "application/smil": [], - "application/smil+xml": [ - "smi", - "smil" - ], - "application/soap+fastinfoset": [], - "application/soap+xml": [], - "application/sparql-query": [ - "rq" - ], - "application/sparql-results+xml": [ - "srx" - ], - "application/spirits-event+xml": [], - "application/srgs": [ - "gram" - ], - "application/srgs+xml": [ - "grxml" - ], - "application/sru+xml": [ - "sru" - ], - "application/ssdl+xml": [ - "ssdl" - ], - "application/ssml+xml": [ - "ssml" - ], - "application/tamp-apex-update": [], - "application/tamp-apex-update-confirm": [], - "application/tamp-community-update": [], - "application/tamp-community-update-confirm": [], - "application/tamp-error": [], - "application/tamp-sequence-adjust": [], - "application/tamp-sequence-adjust-confirm": [], - "application/tamp-status-query": [], - "application/tamp-status-response": [], - "application/tamp-update": [], - "application/tamp-update-confirm": [], - "application/tei+xml": [ - "tei", - "teicorpus" - ], - "application/thraud+xml": [ - "tfi" - ], - "application/timestamp-query": [], - "application/timestamp-reply": [], - "application/timestamped-data": [ - "tsd" - ], - "application/tve-trigger": [], - "application/ulpfec": [], - "application/vcard+xml": [], - "application/vemmi": [], - "application/vividence.scriptfile": [], - "application/vnd.3gpp.bsf+xml": [], - "application/vnd.3gpp.pic-bw-large": [ - "plb" - ], - "application/vnd.3gpp.pic-bw-small": [ - "psb" - ], - "application/vnd.3gpp.pic-bw-var": [ - "pvb" - ], - "application/vnd.3gpp.sms": [], - "application/vnd.3gpp2.bcmcsinfo+xml": [], - "application/vnd.3gpp2.sms": [], - "application/vnd.3gpp2.tcap": [ - "tcap" - ], - "application/vnd.3m.post-it-notes": [ - "pwn" - ], - "application/vnd.accpac.simply.aso": [ - "aso" - ], - "application/vnd.accpac.simply.imp": [ - "imp" - ], - "application/vnd.acucobol": [ - "acu" - ], - "application/vnd.acucorp": [ - "atc", - "acutc" - ], - "application/vnd.adobe.air-application-installer-package+zip": [ - "air" - ], - "application/vnd.adobe.formscentral.fcdt": [ - "fcdt" - ], - "application/vnd.adobe.fxp": [ - "fxp", - "fxpl" - ], - "application/vnd.adobe.partial-upload": [], - "application/vnd.adobe.xdp+xml": [ - "xdp" - ], - "application/vnd.adobe.xfdf": [ - "xfdf" - ], - "application/vnd.aether.imp": [], - "application/vnd.ah-barcode": [], - "application/vnd.ahead.space": [ - "ahead" - ], - "application/vnd.airzip.filesecure.azf": [ - "azf" - ], - "application/vnd.airzip.filesecure.azs": [ - "azs" - ], - "application/vnd.amazon.ebook": [ - "azw" - ], - "application/vnd.americandynamics.acc": [ - "acc" - ], - "application/vnd.amiga.ami": [ - "ami" - ], - "application/vnd.amundsen.maze+xml": [], - "application/vnd.android.package-archive": [ - "apk" - ], - "application/vnd.anser-web-certificate-issue-initiation": [ - "cii" - ], - "application/vnd.anser-web-funds-transfer-initiation": [ - "fti" - ], - "application/vnd.antix.game-component": [ - "atx" - ], - "application/vnd.apple.installer+xml": [ - "mpkg" - ], - "application/vnd.apple.mpegurl": [ - "m3u8" - ], - "application/vnd.arastra.swi": [], - "application/vnd.aristanetworks.swi": [ - "swi" - ], - "application/vnd.astraea-software.iota": [ - "iota" - ], - "application/vnd.audiograph": [ - "aep" - ], - "application/vnd.autopackage": [], - "application/vnd.avistar+xml": [], - "application/vnd.blueice.multipass": [ - "mpm" - ], - "application/vnd.bluetooth.ep.oob": [], - "application/vnd.bmi": [ - "bmi" - ], - "application/vnd.businessobjects": [ - "rep" - ], - "application/vnd.cab-jscript": [], - "application/vnd.canon-cpdl": [], - "application/vnd.canon-lips": [], - "application/vnd.cendio.thinlinc.clientconf": [], - "application/vnd.chemdraw+xml": [ - "cdxml" - ], - "application/vnd.chipnuts.karaoke-mmd": [ - "mmd" - ], - "application/vnd.cinderella": [ - "cdy" - ], - "application/vnd.cirpack.isdn-ext": [], - "application/vnd.claymore": [ - "cla" - ], - "application/vnd.cloanto.rp9": [ - "rp9" - ], - "application/vnd.clonk.c4group": [ - "c4g", - "c4d", - "c4f", - "c4p", - "c4u" - ], - "application/vnd.cluetrust.cartomobile-config": [ - "c11amc" - ], - "application/vnd.cluetrust.cartomobile-config-pkg": [ - "c11amz" - ], - "application/vnd.collection+json": [], - "application/vnd.commerce-battelle": [], - "application/vnd.commonspace": [ - "csp" - ], - "application/vnd.contact.cmsg": [ - "cdbcmsg" - ], - "application/vnd.cosmocaller": [ - "cmc" - ], - "application/vnd.crick.clicker": [ - "clkx" - ], - "application/vnd.crick.clicker.keyboard": [ - "clkk" - ], - "application/vnd.crick.clicker.palette": [ - "clkp" - ], - "application/vnd.crick.clicker.template": [ - "clkt" - ], - "application/vnd.crick.clicker.wordbank": [ - "clkw" - ], - "application/vnd.criticaltools.wbs+xml": [ - "wbs" - ], - "application/vnd.ctc-posml": [ - "pml" - ], - "application/vnd.ctct.ws+xml": [], - "application/vnd.cups-pdf": [], - "application/vnd.cups-postscript": [], - "application/vnd.cups-ppd": [ - "ppd" - ], - "application/vnd.cups-raster": [], - "application/vnd.cups-raw": [], - "application/vnd.curl": [], - "application/vnd.curl.car": [ - "car" - ], - "application/vnd.curl.pcurl": [ - "pcurl" - ], - "application/vnd.cybank": [], - "application/vnd.dart": [ - "dart" - ], - "application/vnd.data-vision.rdz": [ - "rdz" - ], - "application/vnd.dece.data": [ - "uvf", - "uvvf", - "uvd", - "uvvd" - ], - "application/vnd.dece.ttml+xml": [ - "uvt", - "uvvt" - ], - "application/vnd.dece.unspecified": [ - "uvx", - "uvvx" - ], - "application/vnd.dece.zip": [ - "uvz", - "uvvz" - ], - "application/vnd.denovo.fcselayout-link": [ - "fe_launch" - ], - "application/vnd.dir-bi.plate-dl-nosuffix": [], - "application/vnd.dna": [ - "dna" - ], - "application/vnd.dolby.mlp": [ - "mlp" - ], - "application/vnd.dolby.mobile.1": [], - "application/vnd.dolby.mobile.2": [], - "application/vnd.dpgraph": [ - "dpg" - ], - "application/vnd.dreamfactory": [ - "dfac" - ], - "application/vnd.ds-keypoint": [ - "kpxx" - ], - "application/vnd.dvb.ait": [ - "ait" - ], - "application/vnd.dvb.dvbj": [], - "application/vnd.dvb.esgcontainer": [], - "application/vnd.dvb.ipdcdftnotifaccess": [], - "application/vnd.dvb.ipdcesgaccess": [], - "application/vnd.dvb.ipdcesgaccess2": [], - "application/vnd.dvb.ipdcesgpdd": [], - "application/vnd.dvb.ipdcroaming": [], - "application/vnd.dvb.iptv.alfec-base": [], - "application/vnd.dvb.iptv.alfec-enhancement": [], - "application/vnd.dvb.notif-aggregate-root+xml": [], - "application/vnd.dvb.notif-container+xml": [], - "application/vnd.dvb.notif-generic+xml": [], - "application/vnd.dvb.notif-ia-msglist+xml": [], - "application/vnd.dvb.notif-ia-registration-request+xml": [], - "application/vnd.dvb.notif-ia-registration-response+xml": [], - "application/vnd.dvb.notif-init+xml": [], - "application/vnd.dvb.pfr": [], - "application/vnd.dvb.service": [ - "svc" - ], - "application/vnd.dxr": [], - "application/vnd.dynageo": [ - "geo" - ], - "application/vnd.easykaraoke.cdgdownload": [], - "application/vnd.ecdis-update": [], - "application/vnd.ecowin.chart": [ - "mag" - ], - "application/vnd.ecowin.filerequest": [], - "application/vnd.ecowin.fileupdate": [], - "application/vnd.ecowin.series": [], - "application/vnd.ecowin.seriesrequest": [], - "application/vnd.ecowin.seriesupdate": [], - "application/vnd.emclient.accessrequest+xml": [], - "application/vnd.enliven": [ - "nml" - ], - "application/vnd.eprints.data+xml": [], - "application/vnd.epson.esf": [ - "esf" - ], - "application/vnd.epson.msf": [ - "msf" - ], - "application/vnd.epson.quickanime": [ - "qam" - ], - "application/vnd.epson.salt": [ - "slt" - ], - "application/vnd.epson.ssf": [ - "ssf" - ], - "application/vnd.ericsson.quickcall": [], - "application/vnd.eszigno3+xml": [ - "es3", - "et3" - ], - "application/vnd.etsi.aoc+xml": [], - "application/vnd.etsi.cug+xml": [], - "application/vnd.etsi.iptvcommand+xml": [], - "application/vnd.etsi.iptvdiscovery+xml": [], - "application/vnd.etsi.iptvprofile+xml": [], - "application/vnd.etsi.iptvsad-bc+xml": [], - "application/vnd.etsi.iptvsad-cod+xml": [], - "application/vnd.etsi.iptvsad-npvr+xml": [], - "application/vnd.etsi.iptvservice+xml": [], - "application/vnd.etsi.iptvsync+xml": [], - "application/vnd.etsi.iptvueprofile+xml": [], - "application/vnd.etsi.mcid+xml": [], - "application/vnd.etsi.overload-control-policy-dataset+xml": [], - "application/vnd.etsi.sci+xml": [], - "application/vnd.etsi.simservs+xml": [], - "application/vnd.etsi.tsl+xml": [], - "application/vnd.etsi.tsl.der": [], - "application/vnd.eudora.data": [], - "application/vnd.ezpix-album": [ - "ez2" - ], - "application/vnd.ezpix-package": [ - "ez3" - ], - "application/vnd.f-secure.mobile": [], - "application/vnd.fdf": [ - "fdf" - ], - "application/vnd.fdsn.mseed": [ - "mseed" - ], - "application/vnd.fdsn.seed": [ - "seed", - "dataless" - ], - "application/vnd.ffsns": [], - "application/vnd.fints": [], - "application/vnd.flographit": [ - "gph" - ], - "application/vnd.fluxtime.clip": [ - "ftc" - ], - "application/vnd.font-fontforge-sfd": [], - "application/vnd.framemaker": [ - "fm", - "frame", - "maker", - "book" - ], - "application/vnd.frogans.fnc": [ - "fnc" - ], - "application/vnd.frogans.ltf": [ - "ltf" - ], - "application/vnd.fsc.weblaunch": [ - "fsc" - ], - "application/vnd.fujitsu.oasys": [ - "oas" - ], - "application/vnd.fujitsu.oasys2": [ - "oa2" - ], - "application/vnd.fujitsu.oasys3": [ - "oa3" - ], - "application/vnd.fujitsu.oasysgp": [ - "fg5" - ], - "application/vnd.fujitsu.oasysprs": [ - "bh2" - ], - "application/vnd.fujixerox.art-ex": [], - "application/vnd.fujixerox.art4": [], - "application/vnd.fujixerox.hbpl": [], - "application/vnd.fujixerox.ddd": [ - "ddd" - ], - "application/vnd.fujixerox.docuworks": [ - "xdw" - ], - "application/vnd.fujixerox.docuworks.binder": [ - "xbd" - ], - "application/vnd.fut-misnet": [], - "application/vnd.fuzzysheet": [ - "fzs" - ], - "application/vnd.genomatix.tuxedo": [ - "txd" - ], - "application/vnd.geocube+xml": [], - "application/vnd.geogebra.file": [ - "ggb" - ], - "application/vnd.geogebra.tool": [ - "ggt" - ], - "application/vnd.geometry-explorer": [ - "gex", - "gre" - ], - "application/vnd.geonext": [ - "gxt" - ], - "application/vnd.geoplan": [ - "g2w" - ], - "application/vnd.geospace": [ - "g3w" - ], - "application/vnd.globalplatform.card-content-mgt": [], - "application/vnd.globalplatform.card-content-mgt-response": [], - "application/vnd.gmx": [ - "gmx" - ], - "application/vnd.google-earth.kml+xml": [ - "kml" - ], - "application/vnd.google-earth.kmz": [ - "kmz" - ], - "application/vnd.grafeq": [ - "gqf", - "gqs" - ], - "application/vnd.gridmp": [], - "application/vnd.groove-account": [ - "gac" - ], - "application/vnd.groove-help": [ - "ghf" - ], - "application/vnd.groove-identity-message": [ - "gim" - ], - "application/vnd.groove-injector": [ - "grv" - ], - "application/vnd.groove-tool-message": [ - "gtm" - ], - "application/vnd.groove-tool-template": [ - "tpl" - ], - "application/vnd.groove-vcard": [ - "vcg" - ], - "application/vnd.hal+json": [], - "application/vnd.hal+xml": [ - "hal" - ], - "application/vnd.handheld-entertainment+xml": [ - "zmm" - ], - "application/vnd.hbci": [ - "hbci" - ], - "application/vnd.hcl-bireports": [], - "application/vnd.hhe.lesson-player": [ - "les" - ], - "application/vnd.hp-hpgl": [ - "hpgl" - ], - "application/vnd.hp-hpid": [ - "hpid" - ], - "application/vnd.hp-hps": [ - "hps" - ], - "application/vnd.hp-jlyt": [ - "jlt" - ], - "application/vnd.hp-pcl": [ - "pcl" - ], - "application/vnd.hp-pclxl": [ - "pclxl" - ], - "application/vnd.httphone": [], - "application/vnd.hzn-3d-crossword": [], - "application/vnd.ibm.afplinedata": [], - "application/vnd.ibm.electronic-media": [], - "application/vnd.ibm.minipay": [ - "mpy" - ], - "application/vnd.ibm.modcap": [ - "afp", - "listafp", - "list3820" - ], - "application/vnd.ibm.rights-management": [ - "irm" - ], - "application/vnd.ibm.secure-container": [ - "sc" - ], - "application/vnd.iccprofile": [ - "icc", - "icm" - ], - "application/vnd.igloader": [ - "igl" - ], - "application/vnd.immervision-ivp": [ - "ivp" - ], - "application/vnd.immervision-ivu": [ - "ivu" - ], - "application/vnd.informedcontrol.rms+xml": [], - "application/vnd.informix-visionary": [], - "application/vnd.infotech.project": [], - "application/vnd.infotech.project+xml": [], - "application/vnd.innopath.wamp.notification": [], - "application/vnd.insors.igm": [ - "igm" - ], - "application/vnd.intercon.formnet": [ - "xpw", - "xpx" - ], - "application/vnd.intergeo": [ - "i2g" - ], - "application/vnd.intertrust.digibox": [], - "application/vnd.intertrust.nncp": [], - "application/vnd.intu.qbo": [ - "qbo" - ], - "application/vnd.intu.qfx": [ - "qfx" - ], - "application/vnd.iptc.g2.conceptitem+xml": [], - "application/vnd.iptc.g2.knowledgeitem+xml": [], - "application/vnd.iptc.g2.newsitem+xml": [], - "application/vnd.iptc.g2.newsmessage+xml": [], - "application/vnd.iptc.g2.packageitem+xml": [], - "application/vnd.iptc.g2.planningitem+xml": [], - "application/vnd.ipunplugged.rcprofile": [ - "rcprofile" - ], - "application/vnd.irepository.package+xml": [ - "irp" - ], - "application/vnd.is-xpr": [ - "xpr" - ], - "application/vnd.isac.fcs": [ - "fcs" - ], - "application/vnd.jam": [ - "jam" - ], - "application/vnd.japannet-directory-service": [], - "application/vnd.japannet-jpnstore-wakeup": [], - "application/vnd.japannet-payment-wakeup": [], - "application/vnd.japannet-registration": [], - "application/vnd.japannet-registration-wakeup": [], - "application/vnd.japannet-setstore-wakeup": [], - "application/vnd.japannet-verification": [], - "application/vnd.japannet-verification-wakeup": [], - "application/vnd.jcp.javame.midlet-rms": [ - "rms" - ], - "application/vnd.jisp": [ - "jisp" - ], - "application/vnd.joost.joda-archive": [ - "joda" - ], - "application/vnd.kahootz": [ - "ktz", - "ktr" - ], - "application/vnd.kde.karbon": [ - "karbon" - ], - "application/vnd.kde.kchart": [ - "chrt" - ], - "application/vnd.kde.kformula": [ - "kfo" - ], - "application/vnd.kde.kivio": [ - "flw" - ], - "application/vnd.kde.kontour": [ - "kon" - ], - "application/vnd.kde.kpresenter": [ - "kpr", - "kpt" - ], - "application/vnd.kde.kspread": [ - "ksp" - ], - "application/vnd.kde.kword": [ - "kwd", - "kwt" - ], - "application/vnd.kenameaapp": [ - "htke" - ], - "application/vnd.kidspiration": [ - "kia" - ], - "application/vnd.kinar": [ - "kne", - "knp" - ], - "application/vnd.koan": [ - "skp", - "skd", - "skt", - "skm" - ], - "application/vnd.kodak-descriptor": [ - "sse" - ], - "application/vnd.las.las+xml": [ - "lasxml" - ], - "application/vnd.liberty-request+xml": [], - "application/vnd.llamagraphics.life-balance.desktop": [ - "lbd" - ], - "application/vnd.llamagraphics.life-balance.exchange+xml": [ - "lbe" - ], - "application/vnd.lotus-1-2-3": [ - "123" - ], - "application/vnd.lotus-approach": [ - "apr" - ], - "application/vnd.lotus-freelance": [ - "pre" - ], - "application/vnd.lotus-notes": [ - "nsf" - ], - "application/vnd.lotus-organizer": [ - "org" - ], - "application/vnd.lotus-screencam": [ - "scm" - ], - "application/vnd.lotus-wordpro": [ - "lwp" - ], - "application/vnd.macports.portpkg": [ - "portpkg" - ], - "application/vnd.marlin.drm.actiontoken+xml": [], - "application/vnd.marlin.drm.conftoken+xml": [], - "application/vnd.marlin.drm.license+xml": [], - "application/vnd.marlin.drm.mdcf": [], - "application/vnd.mcd": [ - "mcd" - ], - "application/vnd.medcalcdata": [ - "mc1" - ], - "application/vnd.mediastation.cdkey": [ - "cdkey" - ], - "application/vnd.meridian-slingshot": [], - "application/vnd.mfer": [ - "mwf" - ], - "application/vnd.mfmp": [ - "mfm" - ], - "application/vnd.micrografx.flo": [ - "flo" - ], - "application/vnd.micrografx.igx": [ - "igx" - ], - "application/vnd.mif": [ - "mif" - ], - "application/vnd.minisoft-hp3000-save": [], - "application/vnd.mitsubishi.misty-guard.trustweb": [], - "application/vnd.mobius.daf": [ - "daf" - ], - "application/vnd.mobius.dis": [ - "dis" - ], - "application/vnd.mobius.mbk": [ - "mbk" - ], - "application/vnd.mobius.mqy": [ - "mqy" - ], - "application/vnd.mobius.msl": [ - "msl" - ], - "application/vnd.mobius.plc": [ - "plc" - ], - "application/vnd.mobius.txf": [ - "txf" - ], - "application/vnd.mophun.application": [ - "mpn" - ], - "application/vnd.mophun.certificate": [ - "mpc" - ], - "application/vnd.motorola.flexsuite": [], - "application/vnd.motorola.flexsuite.adsi": [], - "application/vnd.motorola.flexsuite.fis": [], - "application/vnd.motorola.flexsuite.gotap": [], - "application/vnd.motorola.flexsuite.kmr": [], - "application/vnd.motorola.flexsuite.ttc": [], - "application/vnd.motorola.flexsuite.wem": [], - "application/vnd.motorola.iprm": [], - "application/vnd.mozilla.xul+xml": [ - "xul" - ], - "application/vnd.ms-artgalry": [ - "cil" - ], - "application/vnd.ms-asf": [], - "application/vnd.ms-cab-compressed": [ - "cab" - ], - "application/vnd.ms-color.iccprofile": [], - "application/vnd.ms-excel": [ - "xls", - "xlm", - "xla", - "xlc", - "xlt", - "xlw" - ], - "application/vnd.ms-excel.addin.macroenabled.12": [ - "xlam" - ], - "application/vnd.ms-excel.sheet.binary.macroenabled.12": [ - "xlsb" - ], - "application/vnd.ms-excel.sheet.macroenabled.12": [ - "xlsm" - ], - "application/vnd.ms-excel.template.macroenabled.12": [ - "xltm" - ], - "application/vnd.ms-fontobject": [ - "eot" - ], - "application/vnd.ms-htmlhelp": [ - "chm" - ], - "application/vnd.ms-ims": [ - "ims" - ], - "application/vnd.ms-lrm": [ - "lrm" - ], - "application/vnd.ms-office.activex+xml": [], - "application/vnd.ms-officetheme": [ - "thmx" - ], - "application/vnd.ms-opentype": [], - "application/vnd.ms-package.obfuscated-opentype": [], - "application/vnd.ms-pki.seccat": [ - "cat" - ], - "application/vnd.ms-pki.stl": [ - "stl" - ], - "application/vnd.ms-playready.initiator+xml": [], - "application/vnd.ms-powerpoint": [ - "ppt", - "pps", - "pot" - ], - "application/vnd.ms-powerpoint.addin.macroenabled.12": [ - "ppam" - ], - "application/vnd.ms-powerpoint.presentation.macroenabled.12": [ - "pptm" - ], - "application/vnd.ms-powerpoint.slide.macroenabled.12": [ - "sldm" - ], - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": [ - "ppsm" - ], - "application/vnd.ms-powerpoint.template.macroenabled.12": [ - "potm" - ], - "application/vnd.ms-printing.printticket+xml": [], - "application/vnd.ms-project": [ - "mpp", - "mpt" - ], - "application/vnd.ms-tnef": [], - "application/vnd.ms-wmdrm.lic-chlg-req": [], - "application/vnd.ms-wmdrm.lic-resp": [], - "application/vnd.ms-wmdrm.meter-chlg-req": [], - "application/vnd.ms-wmdrm.meter-resp": [], - "application/vnd.ms-word.document.macroenabled.12": [ - "docm" - ], - "application/vnd.ms-word.template.macroenabled.12": [ - "dotm" - ], - "application/vnd.ms-works": [ - "wps", - "wks", - "wcm", - "wdb" - ], - "application/vnd.ms-wpl": [ - "wpl" - ], - "application/vnd.ms-xpsdocument": [ - "xps" - ], - "application/vnd.mseq": [ - "mseq" - ], - "application/vnd.msign": [], - "application/vnd.multiad.creator": [], - "application/vnd.multiad.creator.cif": [], - "application/vnd.music-niff": [], - "application/vnd.musician": [ - "mus" - ], - "application/vnd.muvee.style": [ - "msty" - ], - "application/vnd.mynfc": [ - "taglet" - ], - "application/vnd.ncd.control": [], - "application/vnd.ncd.reference": [], - "application/vnd.nervana": [], - "application/vnd.netfpx": [], - "application/vnd.neurolanguage.nlu": [ - "nlu" - ], - "application/vnd.nitf": [ - "ntf", - "nitf" - ], - "application/vnd.noblenet-directory": [ - "nnd" - ], - "application/vnd.noblenet-sealer": [ - "nns" - ], - "application/vnd.noblenet-web": [ - "nnw" - ], - "application/vnd.nokia.catalogs": [], - "application/vnd.nokia.conml+wbxml": [], - "application/vnd.nokia.conml+xml": [], - "application/vnd.nokia.isds-radio-presets": [], - "application/vnd.nokia.iptv.config+xml": [], - "application/vnd.nokia.landmark+wbxml": [], - "application/vnd.nokia.landmark+xml": [], - "application/vnd.nokia.landmarkcollection+xml": [], - "application/vnd.nokia.n-gage.ac+xml": [], - "application/vnd.nokia.n-gage.data": [ - "ngdat" - ], - "application/vnd.nokia.ncd": [], - "application/vnd.nokia.pcd+wbxml": [], - "application/vnd.nokia.pcd+xml": [], - "application/vnd.nokia.radio-preset": [ - "rpst" - ], - "application/vnd.nokia.radio-presets": [ - "rpss" - ], - "application/vnd.novadigm.edm": [ - "edm" - ], - "application/vnd.novadigm.edx": [ - "edx" - ], - "application/vnd.novadigm.ext": [ - "ext" - ], - "application/vnd.ntt-local.file-transfer": [], - "application/vnd.ntt-local.sip-ta_remote": [], - "application/vnd.ntt-local.sip-ta_tcp_stream": [], - "application/vnd.oasis.opendocument.chart": [ - "odc" - ], - "application/vnd.oasis.opendocument.chart-template": [ - "otc" - ], - "application/vnd.oasis.opendocument.database": [ - "odb" - ], - "application/vnd.oasis.opendocument.formula": [ - "odf" - ], - "application/vnd.oasis.opendocument.formula-template": [ - "odft" - ], - "application/vnd.oasis.opendocument.graphics": [ - "odg" - ], - "application/vnd.oasis.opendocument.graphics-template": [ - "otg" - ], - "application/vnd.oasis.opendocument.image": [ - "odi" - ], - "application/vnd.oasis.opendocument.image-template": [ - "oti" - ], - "application/vnd.oasis.opendocument.presentation": [ - "odp" - ], - "application/vnd.oasis.opendocument.presentation-template": [ - "otp" - ], - "application/vnd.oasis.opendocument.spreadsheet": [ - "ods" - ], - "application/vnd.oasis.opendocument.spreadsheet-template": [ - "ots" - ], - "application/vnd.oasis.opendocument.text": [ - "odt" - ], - "application/vnd.oasis.opendocument.text-master": [ - "odm" - ], - "application/vnd.oasis.opendocument.text-template": [ - "ott" - ], - "application/vnd.oasis.opendocument.text-web": [ - "oth" - ], - "application/vnd.obn": [], - "application/vnd.oftn.l10n+json": [], - "application/vnd.oipf.contentaccessdownload+xml": [], - "application/vnd.oipf.contentaccessstreaming+xml": [], - "application/vnd.oipf.cspg-hexbinary": [], - "application/vnd.oipf.dae.svg+xml": [], - "application/vnd.oipf.dae.xhtml+xml": [], - "application/vnd.oipf.mippvcontrolmessage+xml": [], - "application/vnd.oipf.pae.gem": [], - "application/vnd.oipf.spdiscovery+xml": [], - "application/vnd.oipf.spdlist+xml": [], - "application/vnd.oipf.ueprofile+xml": [], - "application/vnd.oipf.userprofile+xml": [], - "application/vnd.olpc-sugar": [ - "xo" - ], - "application/vnd.oma-scws-config": [], - "application/vnd.oma-scws-http-request": [], - "application/vnd.oma-scws-http-response": [], - "application/vnd.oma.bcast.associated-procedure-parameter+xml": [], - "application/vnd.oma.bcast.drm-trigger+xml": [], - "application/vnd.oma.bcast.imd+xml": [], - "application/vnd.oma.bcast.ltkm": [], - "application/vnd.oma.bcast.notification+xml": [], - "application/vnd.oma.bcast.provisioningtrigger": [], - "application/vnd.oma.bcast.sgboot": [], - "application/vnd.oma.bcast.sgdd+xml": [], - "application/vnd.oma.bcast.sgdu": [], - "application/vnd.oma.bcast.simple-symbol-container": [], - "application/vnd.oma.bcast.smartcard-trigger+xml": [], - "application/vnd.oma.bcast.sprov+xml": [], - "application/vnd.oma.bcast.stkm": [], - "application/vnd.oma.cab-address-book+xml": [], - "application/vnd.oma.cab-feature-handler+xml": [], - "application/vnd.oma.cab-pcc+xml": [], - "application/vnd.oma.cab-user-prefs+xml": [], - "application/vnd.oma.dcd": [], - "application/vnd.oma.dcdc": [], - "application/vnd.oma.dd2+xml": [ - "dd2" - ], - "application/vnd.oma.drm.risd+xml": [], - "application/vnd.oma.group-usage-list+xml": [], - "application/vnd.oma.pal+xml": [], - "application/vnd.oma.poc.detailed-progress-report+xml": [], - "application/vnd.oma.poc.final-report+xml": [], - "application/vnd.oma.poc.groups+xml": [], - "application/vnd.oma.poc.invocation-descriptor+xml": [], - "application/vnd.oma.poc.optimized-progress-report+xml": [], - "application/vnd.oma.push": [], - "application/vnd.oma.scidm.messages+xml": [], - "application/vnd.oma.xcap-directory+xml": [], - "application/vnd.omads-email+xml": [], - "application/vnd.omads-file+xml": [], - "application/vnd.omads-folder+xml": [], - "application/vnd.omaloc-supl-init": [], - "application/vnd.openofficeorg.extension": [ - "oxt" - ], - "application/vnd.openxmlformats-officedocument.custom-properties+xml": [], - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": [], - "application/vnd.openxmlformats-officedocument.drawing+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": [], - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": [], - "application/vnd.openxmlformats-officedocument.extended-properties+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presentation": [ - "pptx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slide": [ - "sldx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [ - "ppsx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.template": [ - "potx" - ], - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [ - "xlsx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [ - "xltx" - ], - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": [], - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": [], - "application/vnd.openxmlformats-officedocument.theme+xml": [], - "application/vnd.openxmlformats-officedocument.themeoverride+xml": [], - "application/vnd.openxmlformats-officedocument.vmldrawing": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [ - "docx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [ - "dotx" - ], - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": [], - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": [], - "application/vnd.openxmlformats-package.core-properties+xml": [], - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": [], - "application/vnd.openxmlformats-package.relationships+xml": [], - "application/vnd.quobject-quoxdocument": [], - "application/vnd.osa.netdeploy": [], - "application/vnd.osgeo.mapguide.package": [ - "mgp" - ], - "application/vnd.osgi.bundle": [], - "application/vnd.osgi.dp": [ - "dp" - ], - "application/vnd.osgi.subsystem": [ - "esa" - ], - "application/vnd.otps.ct-kip+xml": [], - "application/vnd.palm": [ - "pdb", - "pqa", - "oprc" - ], - "application/vnd.paos.xml": [], - "application/vnd.pawaafile": [ - "paw" - ], - "application/vnd.pg.format": [ - "str" - ], - "application/vnd.pg.osasli": [ - "ei6" - ], - "application/vnd.piaccess.application-licence": [], - "application/vnd.picsel": [ - "efif" - ], - "application/vnd.pmi.widget": [ - "wg" - ], - "application/vnd.poc.group-advertisement+xml": [], - "application/vnd.pocketlearn": [ - "plf" - ], - "application/vnd.powerbuilder6": [ - "pbd" - ], - "application/vnd.powerbuilder6-s": [], - "application/vnd.powerbuilder7": [], - "application/vnd.powerbuilder7-s": [], - "application/vnd.powerbuilder75": [], - "application/vnd.powerbuilder75-s": [], - "application/vnd.preminet": [], - "application/vnd.previewsystems.box": [ - "box" - ], - "application/vnd.proteus.magazine": [ - "mgz" - ], - "application/vnd.publishare-delta-tree": [ - "qps" - ], - "application/vnd.pvi.ptid1": [ - "ptid" - ], - "application/vnd.pwg-multiplexed": [], - "application/vnd.pwg-xhtml-print+xml": [], - "application/vnd.qualcomm.brew-app-res": [], - "application/vnd.quark.quarkxpress": [ - "qxd", - "qxt", - "qwd", - "qwt", - "qxl", - "qxb" - ], - "application/vnd.radisys.moml+xml": [], - "application/vnd.radisys.msml+xml": [], - "application/vnd.radisys.msml-audit+xml": [], - "application/vnd.radisys.msml-audit-conf+xml": [], - "application/vnd.radisys.msml-audit-conn+xml": [], - "application/vnd.radisys.msml-audit-dialog+xml": [], - "application/vnd.radisys.msml-audit-stream+xml": [], - "application/vnd.radisys.msml-conf+xml": [], - "application/vnd.radisys.msml-dialog+xml": [], - "application/vnd.radisys.msml-dialog-base+xml": [], - "application/vnd.radisys.msml-dialog-fax-detect+xml": [], - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": [], - "application/vnd.radisys.msml-dialog-group+xml": [], - "application/vnd.radisys.msml-dialog-speech+xml": [], - "application/vnd.radisys.msml-dialog-transform+xml": [], - "application/vnd.rainstor.data": [], - "application/vnd.rapid": [], - "application/vnd.realvnc.bed": [ - "bed" - ], - "application/vnd.recordare.musicxml": [ - "mxl" - ], - "application/vnd.recordare.musicxml+xml": [ - "musicxml" - ], - "application/vnd.renlearn.rlprint": [], - "application/vnd.rig.cryptonote": [ - "cryptonote" - ], - "application/vnd.rim.cod": [ - "cod" - ], - "application/vnd.rn-realmedia": [ - "rm" - ], - "application/vnd.rn-realmedia-vbr": [ - "rmvb" - ], - "application/vnd.route66.link66+xml": [ - "link66" - ], - "application/vnd.rs-274x": [], - "application/vnd.ruckus.download": [], - "application/vnd.s3sms": [], - "application/vnd.sailingtracker.track": [ - "st" - ], - "application/vnd.sbm.cid": [], - "application/vnd.sbm.mid2": [], - "application/vnd.scribus": [], - "application/vnd.sealed.3df": [], - "application/vnd.sealed.csf": [], - "application/vnd.sealed.doc": [], - "application/vnd.sealed.eml": [], - "application/vnd.sealed.mht": [], - "application/vnd.sealed.net": [], - "application/vnd.sealed.ppt": [], - "application/vnd.sealed.tiff": [], - "application/vnd.sealed.xls": [], - "application/vnd.sealedmedia.softseal.html": [], - "application/vnd.sealedmedia.softseal.pdf": [], - "application/vnd.seemail": [ - "see" - ], - "application/vnd.sema": [ - "sema" - ], - "application/vnd.semd": [ - "semd" - ], - "application/vnd.semf": [ - "semf" - ], - "application/vnd.shana.informed.formdata": [ - "ifm" - ], - "application/vnd.shana.informed.formtemplate": [ - "itp" - ], - "application/vnd.shana.informed.interchange": [ - "iif" - ], - "application/vnd.shana.informed.package": [ - "ipk" - ], - "application/vnd.simtech-mindmapper": [ - "twd", - "twds" - ], - "application/vnd.smaf": [ - "mmf" - ], - "application/vnd.smart.notebook": [], - "application/vnd.smart.teacher": [ - "teacher" - ], - "application/vnd.software602.filler.form+xml": [], - "application/vnd.software602.filler.form-xml-zip": [], - "application/vnd.solent.sdkm+xml": [ - "sdkm", - "sdkd" - ], - "application/vnd.spotfire.dxp": [ - "dxp" - ], - "application/vnd.spotfire.sfs": [ - "sfs" - ], - "application/vnd.sss-cod": [], - "application/vnd.sss-dtf": [], - "application/vnd.sss-ntf": [], - "application/vnd.stardivision.calc": [ - "sdc" - ], - "application/vnd.stardivision.draw": [ - "sda" - ], - "application/vnd.stardivision.impress": [ - "sdd" - ], - "application/vnd.stardivision.math": [ - "smf" - ], - "application/vnd.stardivision.writer": [ - "sdw", - "vor" - ], - "application/vnd.stardivision.writer-global": [ - "sgl" - ], - "application/vnd.stepmania.package": [ - "smzip" - ], - "application/vnd.stepmania.stepchart": [ - "sm" - ], - "application/vnd.street-stream": [], - "application/vnd.sun.xml.calc": [ - "sxc" - ], - "application/vnd.sun.xml.calc.template": [ - "stc" - ], - "application/vnd.sun.xml.draw": [ - "sxd" - ], - "application/vnd.sun.xml.draw.template": [ - "std" - ], - "application/vnd.sun.xml.impress": [ - "sxi" - ], - "application/vnd.sun.xml.impress.template": [ - "sti" - ], - "application/vnd.sun.xml.math": [ - "sxm" - ], - "application/vnd.sun.xml.writer": [ - "sxw" - ], - "application/vnd.sun.xml.writer.global": [ - "sxg" - ], - "application/vnd.sun.xml.writer.template": [ - "stw" - ], - "application/vnd.sun.wadl+xml": [], - "application/vnd.sus-calendar": [ - "sus", - "susp" - ], - "application/vnd.svd": [ - "svd" - ], - "application/vnd.swiftview-ics": [], - "application/vnd.symbian.install": [ - "sis", - "sisx" - ], - "application/vnd.syncml+xml": [ - "xsm" - ], - "application/vnd.syncml.dm+wbxml": [ - "bdm" - ], - "application/vnd.syncml.dm+xml": [ - "xdm" - ], - "application/vnd.syncml.dm.notification": [], - "application/vnd.syncml.ds.notification": [], - "application/vnd.tao.intent-module-archive": [ - "tao" - ], - "application/vnd.tcpdump.pcap": [ - "pcap", - "cap", - "dmp" - ], - "application/vnd.tmobile-livetv": [ - "tmo" - ], - "application/vnd.trid.tpt": [ - "tpt" - ], - "application/vnd.triscape.mxs": [ - "mxs" - ], - "application/vnd.trueapp": [ - "tra" - ], - "application/vnd.truedoc": [], - "application/vnd.ubisoft.webplayer": [], - "application/vnd.ufdl": [ - "ufd", - "ufdl" - ], - "application/vnd.uiq.theme": [ - "utz" - ], - "application/vnd.umajin": [ - "umj" - ], - "application/vnd.unity": [ - "unityweb" - ], - "application/vnd.uoml+xml": [ - "uoml" - ], - "application/vnd.uplanet.alert": [], - "application/vnd.uplanet.alert-wbxml": [], - "application/vnd.uplanet.bearer-choice": [], - "application/vnd.uplanet.bearer-choice-wbxml": [], - "application/vnd.uplanet.cacheop": [], - "application/vnd.uplanet.cacheop-wbxml": [], - "application/vnd.uplanet.channel": [], - "application/vnd.uplanet.channel-wbxml": [], - "application/vnd.uplanet.list": [], - "application/vnd.uplanet.list-wbxml": [], - "application/vnd.uplanet.listcmd": [], - "application/vnd.uplanet.listcmd-wbxml": [], - "application/vnd.uplanet.signal": [], - "application/vnd.vcx": [ - "vcx" - ], - "application/vnd.vd-study": [], - "application/vnd.vectorworks": [], - "application/vnd.verimatrix.vcas": [], - "application/vnd.vidsoft.vidconference": [], - "application/vnd.visio": [ - "vsd", - "vst", - "vss", - "vsw" - ], - "application/vnd.visionary": [ - "vis" - ], - "application/vnd.vividence.scriptfile": [], - "application/vnd.vsf": [ - "vsf" - ], - "application/vnd.wap.sic": [], - "application/vnd.wap.slc": [], - "application/vnd.wap.wbxml": [ - "wbxml" - ], - "application/vnd.wap.wmlc": [ - "wmlc" - ], - "application/vnd.wap.wmlscriptc": [ - "wmlsc" - ], - "application/vnd.webturbo": [ - "wtb" - ], - "application/vnd.wfa.wsc": [], - "application/vnd.wmc": [], - "application/vnd.wmf.bootstrap": [], - "application/vnd.wolfram.mathematica": [], - "application/vnd.wolfram.mathematica.package": [], - "application/vnd.wolfram.player": [ - "nbp" - ], - "application/vnd.wordperfect": [ - "wpd" - ], - "application/vnd.wqd": [ - "wqd" - ], - "application/vnd.wrq-hp3000-labelled": [], - "application/vnd.wt.stf": [ - "stf" - ], - "application/vnd.wv.csp+wbxml": [], - "application/vnd.wv.csp+xml": [], - "application/vnd.wv.ssp+xml": [], - "application/vnd.xara": [ - "xar" - ], - "application/vnd.xfdl": [ - "xfdl" - ], - "application/vnd.xfdl.webform": [], - "application/vnd.xmi+xml": [], - "application/vnd.xmpie.cpkg": [], - "application/vnd.xmpie.dpkg": [], - "application/vnd.xmpie.plan": [], - "application/vnd.xmpie.ppkg": [], - "application/vnd.xmpie.xlim": [], - "application/vnd.yamaha.hv-dic": [ - "hvd" - ], - "application/vnd.yamaha.hv-script": [ - "hvs" - ], - "application/vnd.yamaha.hv-voice": [ - "hvp" - ], - "application/vnd.yamaha.openscoreformat": [ - "osf" - ], - "application/vnd.yamaha.openscoreformat.osfpvg+xml": [ - "osfpvg" - ], - "application/vnd.yamaha.remote-setup": [], - "application/vnd.yamaha.smaf-audio": [ - "saf" - ], - "application/vnd.yamaha.smaf-phrase": [ - "spf" - ], - "application/vnd.yamaha.through-ngn": [], - "application/vnd.yamaha.tunnel-udpencap": [], - "application/vnd.yellowriver-custom-menu": [ - "cmp" - ], - "application/vnd.zul": [ - "zir", - "zirz" - ], - "application/vnd.zzazz.deck+xml": [ - "zaz" - ], - "application/voicexml+xml": [ - "vxml" - ], - "application/vq-rtcpxr": [], - "application/watcherinfo+xml": [], - "application/whoispp-query": [], - "application/whoispp-response": [], - "application/widget": [ - "wgt" - ], - "application/winhlp": [ - "hlp" - ], - "application/wita": [], - "application/wordperfect5.1": [], - "application/wsdl+xml": [ - "wsdl" - ], - "application/wspolicy+xml": [ - "wspolicy" - ], - "application/x-7z-compressed": [ - "7z" - ], - "application/x-abiword": [ - "abw" - ], - "application/x-ace-compressed": [ - "ace" - ], - "application/x-amf": [], - "application/x-apple-diskimage": [ - "dmg" - ], - "application/x-authorware-bin": [ - "aab", - "x32", - "u32", - "vox" - ], - "application/x-authorware-map": [ - "aam" - ], - "application/x-authorware-seg": [ - "aas" - ], - "application/x-bcpio": [ - "bcpio" - ], - "application/x-bittorrent": [ - "torrent" - ], - "application/x-blorb": [ - "blb", - "blorb" - ], - "application/x-bzip": [ - "bz" - ], - "application/x-bzip2": [ - "bz2", - "boz" - ], - "application/x-cbr": [ - "cbr", - "cba", - "cbt", - "cbz", - "cb7" - ], - "application/x-cdlink": [ - "vcd" - ], - "application/x-cfs-compressed": [ - "cfs" - ], - "application/x-chat": [ - "chat" - ], - "application/x-chess-pgn": [ - "pgn" - ], - "application/x-conference": [ - "nsc" - ], - "application/x-compress": [], - "application/x-cpio": [ - "cpio" - ], - "application/x-csh": [ - "csh" - ], - "application/x-debian-package": [ - "deb", - "udeb" - ], - "application/x-dgc-compressed": [ - "dgc" - ], - "application/x-director": [ - "dir", - "dcr", - "dxr", - "cst", - "cct", - "cxt", - "w3d", - "fgd", - "swa" - ], - "application/x-doom": [ - "wad" - ], - "application/x-dtbncx+xml": [ - "ncx" - ], - "application/x-dtbook+xml": [ - "dtb" - ], - "application/x-dtbresource+xml": [ - "res" - ], - "application/x-dvi": [ - "dvi" - ], - "application/x-envoy": [ - "evy" - ], - "application/x-eva": [ - "eva" - ], - "application/x-font-bdf": [ - "bdf" - ], - "application/x-font-dos": [], - "application/x-font-framemaker": [], - "application/x-font-ghostscript": [ - "gsf" - ], - "application/x-font-libgrx": [], - "application/x-font-linux-psf": [ - "psf" - ], - "application/x-font-otf": [ - "otf" - ], - "application/x-font-pcf": [ - "pcf" - ], - "application/x-font-snf": [ - "snf" - ], - "application/x-font-speedo": [], - "application/x-font-sunos-news": [], - "application/x-font-ttf": [ - "ttf", - "ttc" - ], - "application/x-font-type1": [ - "pfa", - "pfb", - "pfm", - "afm" - ], - "application/font-woff": [ - "woff" - ], - "application/x-font-vfont": [], - "application/x-freearc": [ - "arc" - ], - "application/x-futuresplash": [ - "spl" - ], - "application/x-gca-compressed": [ - "gca" - ], - "application/x-glulx": [ - "ulx" - ], - "application/x-gnumeric": [ - "gnumeric" - ], - "application/x-gramps-xml": [ - "gramps" - ], - "application/x-gtar": [ - "gtar" - ], - "application/x-gzip": [], - "application/x-hdf": [ - "hdf" - ], - "application/x-install-instructions": [ - "install" - ], - "application/x-iso9660-image": [ - "iso" - ], - "application/x-java-jnlp-file": [ - "jnlp" - ], - "application/x-latex": [ - "latex" - ], - "application/x-lzh-compressed": [ - "lzh", - "lha" - ], - "application/x-mie": [ - "mie" - ], - "application/x-mobipocket-ebook": [ - "prc", - "mobi" - ], - "application/x-ms-application": [ - "application" - ], - "application/x-ms-shortcut": [ - "lnk" - ], - "application/x-ms-wmd": [ - "wmd" - ], - "application/x-ms-wmz": [ - "wmz" - ], - "application/x-ms-xbap": [ - "xbap" - ], - "application/x-msaccess": [ - "mdb" - ], - "application/x-msbinder": [ - "obd" - ], - "application/x-mscardfile": [ - "crd" - ], - "application/x-msclip": [ - "clp" - ], - "application/x-msdownload": [ - "exe", - "dll", - "com", - "bat", - "msi" - ], - "application/x-msmediaview": [ - "mvb", - "m13", - "m14" - ], - "application/x-msmetafile": [ - "wmf", - "wmz", - "emf", - "emz" - ], - "application/x-msmoney": [ - "mny" - ], - "application/x-mspublisher": [ - "pub" - ], - "application/x-msschedule": [ - "scd" - ], - "application/x-msterminal": [ - "trm" - ], - "application/x-mswrite": [ - "wri" - ], - "application/x-netcdf": [ - "nc", - "cdf" - ], - "application/x-nzb": [ - "nzb" - ], - "application/x-pkcs12": [ - "p12", - "pfx" - ], - "application/x-pkcs7-certificates": [ - "p7b", - "spc" - ], - "application/x-pkcs7-certreqresp": [ - "p7r" - ], - "application/x-rar-compressed": [ - "rar" - ], - "application/x-research-info-systems": [ - "ris" - ], - "application/x-sh": [ - "sh" - ], - "application/x-shar": [ - "shar" - ], - "application/x-shockwave-flash": [ - "swf" - ], - "application/x-silverlight-app": [ - "xap" - ], - "application/x-sql": [ - "sql" - ], - "application/x-stuffit": [ - "sit" - ], - "application/x-stuffitx": [ - "sitx" - ], - "application/x-subrip": [ - "srt" - ], - "application/x-sv4cpio": [ - "sv4cpio" - ], - "application/x-sv4crc": [ - "sv4crc" - ], - "application/x-t3vm-image": [ - "t3" - ], - "application/x-tads": [ - "gam" - ], - "application/x-tar": [ - "tar" - ], - "application/x-tcl": [ - "tcl" - ], - "application/x-tex": [ - "tex" - ], - "application/x-tex-tfm": [ - "tfm" - ], - "application/x-texinfo": [ - "texinfo", - "texi" - ], - "application/x-tgif": [ - "obj" - ], - "application/x-ustar": [ - "ustar" - ], - "application/x-wais-source": [ - "src" - ], - "application/x-x509-ca-cert": [ - "der", - "crt" - ], - "application/x-xfig": [ - "fig" - ], - "application/x-xliff+xml": [ - "xlf" - ], - "application/x-xpinstall": [ - "xpi" - ], - "application/x-xz": [ - "xz" - ], - "application/x-zmachine": [ - "z1", - "z2", - "z3", - "z4", - "z5", - "z6", - "z7", - "z8" - ], - "application/x400-bp": [], - "application/xaml+xml": [ - "xaml" - ], - "application/xcap-att+xml": [], - "application/xcap-caps+xml": [], - "application/xcap-diff+xml": [ - "xdf" - ], - "application/xcap-el+xml": [], - "application/xcap-error+xml": [], - "application/xcap-ns+xml": [], - "application/xcon-conference-info-diff+xml": [], - "application/xcon-conference-info+xml": [], - "application/xenc+xml": [ - "xenc" - ], - "application/xhtml+xml": [ - "xhtml", - "xht" - ], - "application/xhtml-voice+xml": [], - "application/xml": [ - "xml", - "xsl" - ], - "application/xml-dtd": [ - "dtd" - ], - "application/xml-external-parsed-entity": [], - "application/xmpp+xml": [], - "application/xop+xml": [ - "xop" - ], - "application/xproc+xml": [ - "xpl" - ], - "application/xslt+xml": [ - "xslt" - ], - "application/xspf+xml": [ - "xspf" - ], - "application/xv+xml": [ - "mxml", - "xhvml", - "xvml", - "xvm" - ], - "application/yang": [ - "yang" - ], - "application/yin+xml": [ - "yin" - ], - "application/zip": [ - "zip" - ], - "audio/1d-interleaved-parityfec": [], - "audio/32kadpcm": [], - "audio/3gpp": [], - "audio/3gpp2": [], - "audio/ac3": [], - "audio/adpcm": [ - "adp" - ], - "audio/amr": [], - "audio/amr-wb": [], - "audio/amr-wb+": [], - "audio/asc": [], - "audio/atrac-advanced-lossless": [], - "audio/atrac-x": [], - "audio/atrac3": [], - "audio/basic": [ - "au", - "snd" - ], - "audio/bv16": [], - "audio/bv32": [], - "audio/clearmode": [], - "audio/cn": [], - "audio/dat12": [], - "audio/dls": [], - "audio/dsr-es201108": [], - "audio/dsr-es202050": [], - "audio/dsr-es202211": [], - "audio/dsr-es202212": [], - "audio/dv": [], - "audio/dvi4": [], - "audio/eac3": [], - "audio/evrc": [], - "audio/evrc-qcp": [], - "audio/evrc0": [], - "audio/evrc1": [], - "audio/evrcb": [], - "audio/evrcb0": [], - "audio/evrcb1": [], - "audio/evrcwb": [], - "audio/evrcwb0": [], - "audio/evrcwb1": [], - "audio/example": [], - "audio/fwdred": [], - "audio/g719": [], - "audio/g722": [], - "audio/g7221": [], - "audio/g723": [], - "audio/g726-16": [], - "audio/g726-24": [], - "audio/g726-32": [], - "audio/g726-40": [], - "audio/g728": [], - "audio/g729": [], - "audio/g7291": [], - "audio/g729d": [], - "audio/g729e": [], - "audio/gsm": [], - "audio/gsm-efr": [], - "audio/gsm-hr-08": [], - "audio/ilbc": [], - "audio/ip-mr_v2.5": [], - "audio/isac": [], - "audio/l16": [], - "audio/l20": [], - "audio/l24": [], - "audio/l8": [], - "audio/lpc": [], - "audio/midi": [ - "mid", - "midi", - "kar", - "rmi" - ], - "audio/mobile-xmf": [], - "audio/mp4": [ - "mp4a" - ], - "audio/mp4a-latm": [], - "audio/mpa": [], - "audio/mpa-robust": [], - "audio/mpeg": [ - "mpga", - "mp2", - "mp2a", - "mp3", - "m2a", - "m3a" - ], - "audio/mpeg4-generic": [], - "audio/musepack": [], - "audio/ogg": [ - "oga", - "ogg", - "spx" - ], - "audio/opus": [], - "audio/parityfec": [], - "audio/pcma": [], - "audio/pcma-wb": [], - "audio/pcmu-wb": [], - "audio/pcmu": [], - "audio/prs.sid": [], - "audio/qcelp": [], - "audio/red": [], - "audio/rtp-enc-aescm128": [], - "audio/rtp-midi": [], - "audio/rtx": [], - "audio/s3m": [ - "s3m" - ], - "audio/silk": [ - "sil" - ], - "audio/smv": [], - "audio/smv0": [], - "audio/smv-qcp": [], - "audio/sp-midi": [], - "audio/speex": [], - "audio/t140c": [], - "audio/t38": [], - "audio/telephone-event": [], - "audio/tone": [], - "audio/uemclip": [], - "audio/ulpfec": [], - "audio/vdvi": [], - "audio/vmr-wb": [], - "audio/vnd.3gpp.iufp": [], - "audio/vnd.4sb": [], - "audio/vnd.audiokoz": [], - "audio/vnd.celp": [], - "audio/vnd.cisco.nse": [], - "audio/vnd.cmles.radio-events": [], - "audio/vnd.cns.anp1": [], - "audio/vnd.cns.inf1": [], - "audio/vnd.dece.audio": [ - "uva", - "uvva" - ], - "audio/vnd.digital-winds": [ - "eol" - ], - "audio/vnd.dlna.adts": [], - "audio/vnd.dolby.heaac.1": [], - "audio/vnd.dolby.heaac.2": [], - "audio/vnd.dolby.mlp": [], - "audio/vnd.dolby.mps": [], - "audio/vnd.dolby.pl2": [], - "audio/vnd.dolby.pl2x": [], - "audio/vnd.dolby.pl2z": [], - "audio/vnd.dolby.pulse.1": [], - "audio/vnd.dra": [ - "dra" - ], - "audio/vnd.dts": [ - "dts" - ], - "audio/vnd.dts.hd": [ - "dtshd" - ], - "audio/vnd.dvb.file": [], - "audio/vnd.everad.plj": [], - "audio/vnd.hns.audio": [], - "audio/vnd.lucent.voice": [ - "lvp" - ], - "audio/vnd.ms-playready.media.pya": [ - "pya" - ], - "audio/vnd.nokia.mobile-xmf": [], - "audio/vnd.nortel.vbk": [], - "audio/vnd.nuera.ecelp4800": [ - "ecelp4800" - ], - "audio/vnd.nuera.ecelp7470": [ - "ecelp7470" - ], - "audio/vnd.nuera.ecelp9600": [ - "ecelp9600" - ], - "audio/vnd.octel.sbc": [], - "audio/vnd.qcelp": [], - "audio/vnd.rhetorex.32kadpcm": [], - "audio/vnd.rip": [ - "rip" - ], - "audio/vnd.sealedmedia.softseal.mpeg": [], - "audio/vnd.vmx.cvsd": [], - "audio/vorbis": [], - "audio/vorbis-config": [], - "audio/webm": [ - "weba" - ], - "audio/x-aac": [ - "aac" - ], - "audio/x-aiff": [ - "aif", - "aiff", - "aifc" - ], - "audio/x-caf": [ - "caf" - ], - "audio/x-flac": [ - "flac" - ], - "audio/x-matroska": [ - "mka" - ], - "audio/x-mpegurl": [ - "m3u" - ], - "audio/x-ms-wax": [ - "wax" - ], - "audio/x-ms-wma": [ - "wma" - ], - "audio/x-pn-realaudio": [ - "ram", - "ra" - ], - "audio/x-pn-realaudio-plugin": [ - "rmp" - ], - "audio/x-tta": [], - "audio/x-wav": [ - "wav" - ], - "audio/xm": [ - "xm" - ], - "chemical/x-cdx": [ - "cdx" - ], - "chemical/x-cif": [ - "cif" - ], - "chemical/x-cmdf": [ - "cmdf" - ], - "chemical/x-cml": [ - "cml" - ], - "chemical/x-csml": [ - "csml" - ], - "chemical/x-pdb": [], - "chemical/x-xyz": [ - "xyz" - ], - "image/bmp": [ - "bmp" - ], - "image/cgm": [ - "cgm" - ], - "image/example": [], - "image/fits": [], - "image/g3fax": [ - "g3" - ], - "image/gif": [ - "gif" - ], - "image/ief": [ - "ief" - ], - "image/jp2": [], - "image/jpeg": [ - "jpeg", - "jpg", - "jpe" - ], - "image/jpm": [], - "image/jpx": [], - "image/ktx": [ - "ktx" - ], - "image/naplps": [], - "image/png": [ - "png" - ], - "image/prs.btif": [ - "btif" - ], - "image/prs.pti": [], - "image/sgi": [ - "sgi" - ], - "image/svg+xml": [ - "svg", - "svgz" - ], - "image/t38": [], - "image/tiff": [ - "tiff", - "tif" - ], - "image/tiff-fx": [], - "image/vnd.adobe.photoshop": [ - "psd" - ], - "image/vnd.cns.inf2": [], - "image/vnd.dece.graphic": [ - "uvi", - "uvvi", - "uvg", - "uvvg" - ], - "image/vnd.dvb.subtitle": [ - "sub" - ], - "image/vnd.djvu": [ - "djvu", - "djv" - ], - "image/vnd.dwg": [ - "dwg" - ], - "image/vnd.dxf": [ - "dxf" - ], - "image/vnd.fastbidsheet": [ - "fbs" - ], - "image/vnd.fpx": [ - "fpx" - ], - "image/vnd.fst": [ - "fst" - ], - "image/vnd.fujixerox.edmics-mmr": [ - "mmr" - ], - "image/vnd.fujixerox.edmics-rlc": [ - "rlc" - ], - "image/vnd.globalgraphics.pgb": [], - "image/vnd.microsoft.icon": [], - "image/vnd.mix": [], - "image/vnd.ms-modi": [ - "mdi" - ], - "image/vnd.ms-photo": [ - "wdp" - ], - "image/vnd.net-fpx": [ - "npx" - ], - "image/vnd.radiance": [], - "image/vnd.sealed.png": [], - "image/vnd.sealedmedia.softseal.gif": [], - "image/vnd.sealedmedia.softseal.jpg": [], - "image/vnd.svf": [], - "image/vnd.wap.wbmp": [ - "wbmp" - ], - "image/vnd.xiff": [ - "xif" - ], - "image/webp": [ - "webp" - ], - "image/x-3ds": [ - "3ds" - ], - "image/x-cmu-raster": [ - "ras" - ], - "image/x-cmx": [ - "cmx" - ], - "image/x-freehand": [ - "fh", - "fhc", - "fh4", - "fh5", - "fh7" - ], - "image/x-icon": [ - "ico" - ], - "image/x-mrsid-image": [ - "sid" - ], - "image/x-pcx": [ - "pcx" - ], - "image/x-pict": [ - "pic", - "pct" - ], - "image/x-portable-anymap": [ - "pnm" - ], - "image/x-portable-bitmap": [ - "pbm" - ], - "image/x-portable-graymap": [ - "pgm" - ], - "image/x-portable-pixmap": [ - "ppm" - ], - "image/x-rgb": [ - "rgb" - ], - "image/x-tga": [ - "tga" - ], - "image/x-xbitmap": [ - "xbm" - ], - "image/x-xpixmap": [ - "xpm" - ], - "image/x-xwindowdump": [ - "xwd" - ], - "message/cpim": [], - "message/delivery-status": [], - "message/disposition-notification": [], - "message/example": [], - "message/external-body": [], - "message/feedback-report": [], - "message/global": [], - "message/global-delivery-status": [], - "message/global-disposition-notification": [], - "message/global-headers": [], - "message/http": [], - "message/imdn+xml": [], - "message/news": [], - "message/partial": [], - "message/rfc822": [ - "eml", - "mime" - ], - "message/s-http": [], - "message/sip": [], - "message/sipfrag": [], - "message/tracking-status": [], - "message/vnd.si.simp": [], - "model/example": [], - "model/iges": [ - "igs", - "iges" - ], - "model/mesh": [ - "msh", - "mesh", - "silo" - ], - "model/vnd.collada+xml": [ - "dae" - ], - "model/vnd.dwf": [ - "dwf" - ], - "model/vnd.flatland.3dml": [], - "model/vnd.gdl": [ - "gdl" - ], - "model/vnd.gs-gdl": [], - "model/vnd.gs.gdl": [], - "model/vnd.gtw": [ - "gtw" - ], - "model/vnd.moml+xml": [], - "model/vnd.mts": [ - "mts" - ], - "model/vnd.parasolid.transmit.binary": [], - "model/vnd.parasolid.transmit.text": [], - "model/vnd.vtu": [ - "vtu" - ], - "model/vrml": [ - "wrl", - "vrml" - ], - "model/x3d+binary": [ - "x3db", - "x3dbz" - ], - "model/x3d+vrml": [ - "x3dv", - "x3dvz" - ], - "model/x3d+xml": [ - "x3d", - "x3dz" - ], - "multipart/alternative": [], - "multipart/appledouble": [], - "multipart/byteranges": [], - "multipart/digest": [], - "multipart/encrypted": [], - "multipart/example": [], - "multipart/form-data": [], - "multipart/header-set": [], - "multipart/mixed": [], - "multipart/parallel": [], - "multipart/related": [], - "multipart/report": [], - "multipart/signed": [], - "multipart/voice-message": [], - "text/1d-interleaved-parityfec": [], - "text/cache-manifest": [ - "appcache" - ], - "text/calendar": [ - "ics", - "ifb" - ], - "text/css": [ - "css" - ], - "text/csv": [ - "csv" - ], - "text/directory": [], - "text/dns": [], - "text/ecmascript": [], - "text/enriched": [], - "text/example": [], - "text/fwdred": [], - "text/html": [ - "html", - "htm" - ], - "text/javascript": [], - "text/n3": [ - "n3" - ], - "text/parityfec": [], - "text/plain": [ - "txt", - "text", - "conf", - "def", - "list", - "log", - "in" - ], - "text/prs.fallenstein.rst": [], - "text/prs.lines.tag": [ - "dsc" - ], - "text/vnd.radisys.msml-basic-layout": [], - "text/red": [], - "text/rfc822-headers": [], - "text/richtext": [ - "rtx" - ], - "text/rtf": [], - "text/rtp-enc-aescm128": [], - "text/rtx": [], - "text/sgml": [ - "sgml", - "sgm" - ], - "text/t140": [], - "text/tab-separated-values": [ - "tsv" - ], - "text/troff": [ - "t", - "tr", - "roff", - "man", - "me", - "ms" - ], - "text/turtle": [ - "ttl" - ], - "text/ulpfec": [], - "text/uri-list": [ - "uri", - "uris", - "urls" - ], - "text/vcard": [ - "vcard" - ], - "text/vnd.abc": [], - "text/vnd.curl": [ - "curl" - ], - "text/vnd.curl.dcurl": [ - "dcurl" - ], - "text/vnd.curl.scurl": [ - "scurl" - ], - "text/vnd.curl.mcurl": [ - "mcurl" - ], - "text/vnd.dmclientscript": [], - "text/vnd.dvb.subtitle": [ - "sub" - ], - "text/vnd.esmertec.theme-descriptor": [], - "text/vnd.fly": [ - "fly" - ], - "text/vnd.fmi.flexstor": [ - "flx" - ], - "text/vnd.graphviz": [ - "gv" - ], - "text/vnd.in3d.3dml": [ - "3dml" - ], - "text/vnd.in3d.spot": [ - "spot" - ], - "text/vnd.iptc.newsml": [], - "text/vnd.iptc.nitf": [], - "text/vnd.latex-z": [], - "text/vnd.motorola.reflex": [], - "text/vnd.ms-mediapackage": [], - "text/vnd.net2phone.commcenter.command": [], - "text/vnd.si.uricatalogue": [], - "text/vnd.sun.j2me.app-descriptor": [ - "jad" - ], - "text/vnd.trolltech.linguist": [], - "text/vnd.wap.si": [], - "text/vnd.wap.sl": [], - "text/vnd.wap.wml": [ - "wml" - ], - "text/vnd.wap.wmlscript": [ - "wmls" - ], - "text/x-asm": [ - "s", - "asm" - ], - "text/x-c": [ - "c", - "cc", - "cxx", - "cpp", - "h", - "hh", - "dic" - ], - "text/x-fortran": [ - "f", - "for", - "f77", - "f90" - ], - "text/x-java-source": [ - "java" - ], - "text/x-opml": [ - "opml" - ], - "text/x-pascal": [ - "p", - "pas" - ], - "text/x-nfo": [ - "nfo" - ], - "text/x-setext": [ - "etx" - ], - "text/x-sfv": [ - "sfv" - ], - "text/x-uuencode": [ - "uu" - ], - "text/x-vcalendar": [ - "vcs" - ], - "text/x-vcard": [ - "vcf" - ], - "text/xml": [], - "text/xml-external-parsed-entity": [], - "video/1d-interleaved-parityfec": [], - "video/3gpp": [ - "3gp" - ], - "video/3gpp-tt": [], - "video/3gpp2": [ - "3g2" - ], - "video/bmpeg": [], - "video/bt656": [], - "video/celb": [], - "video/dv": [], - "video/example": [], - "video/h261": [ - "h261" - ], - "video/h263": [ - "h263" - ], - "video/h263-1998": [], - "video/h263-2000": [], - "video/h264": [ - "h264" - ], - "video/h264-rcdo": [], - "video/h264-svc": [], - "video/jpeg": [ - "jpgv" - ], - "video/jpeg2000": [], - "video/jpm": [ - "jpm", - "jpgm" - ], - "video/mj2": [ - "mj2", - "mjp2" - ], - "video/mp1s": [], - "video/mp2p": [], - "video/mp2t": [], - "video/mp4": [ - "mp4", - "mp4v", - "mpg4" - ], - "video/mp4v-es": [], - "video/mpeg": [ - "mpeg", - "mpg", - "mpe", - "m1v", - "m2v" - ], - "video/mpeg4-generic": [], - "video/mpv": [], - "video/nv": [], - "video/ogg": [ - "ogv" - ], - "video/parityfec": [], - "video/pointer": [], - "video/quicktime": [ - "qt", - "mov" - ], - "video/raw": [], - "video/rtp-enc-aescm128": [], - "video/rtx": [], - "video/smpte292m": [], - "video/ulpfec": [], - "video/vc1": [], - "video/vnd.cctv": [], - "video/vnd.dece.hd": [ - "uvh", - "uvvh" - ], - "video/vnd.dece.mobile": [ - "uvm", - "uvvm" - ], - "video/vnd.dece.mp4": [], - "video/vnd.dece.pd": [ - "uvp", - "uvvp" - ], - "video/vnd.dece.sd": [ - "uvs", - "uvvs" - ], - "video/vnd.dece.video": [ - "uvv", - "uvvv" - ], - "video/vnd.directv.mpeg": [], - "video/vnd.directv.mpeg-tts": [], - "video/vnd.dlna.mpeg-tts": [], - "video/vnd.dvb.file": [ - "dvb" - ], - "video/vnd.fvt": [ - "fvt" - ], - "video/vnd.hns.video": [], - "video/vnd.iptvforum.1dparityfec-1010": [], - "video/vnd.iptvforum.1dparityfec-2005": [], - "video/vnd.iptvforum.2dparityfec-1010": [], - "video/vnd.iptvforum.2dparityfec-2005": [], - "video/vnd.iptvforum.ttsavc": [], - "video/vnd.iptvforum.ttsmpeg2": [], - "video/vnd.motorola.video": [], - "video/vnd.motorola.videop": [], - "video/vnd.mpegurl": [ - "mxu", - "m4u" - ], - "video/vnd.ms-playready.media.pyv": [ - "pyv" - ], - "video/vnd.nokia.interleaved-multimedia": [], - "video/vnd.nokia.videovoip": [], - "video/vnd.objectvideo": [], - "video/vnd.sealed.mpeg1": [], - "video/vnd.sealed.mpeg4": [], - "video/vnd.sealed.swf": [], - "video/vnd.sealedmedia.softseal.mov": [], - "video/vnd.uvvu.mp4": [ - "uvu", - "uvvu" - ], - "video/vnd.vivo": [ - "viv" - ], - "video/webm": [ - "webm" - ], - "video/x-f4v": [ - "f4v" - ], - "video/x-fli": [ - "fli" - ], - "video/x-flv": [ - "flv" - ], - "video/x-m4v": [ - "m4v" - ], - "video/x-matroska": [ - "mkv", - "mk3d", - "mks" - ], - "video/x-mng": [ - "mng" - ], - "video/x-ms-asf": [ - "asf", - "asx" - ], - "video/x-ms-vob": [ - "vob" - ], - "video/x-ms-wm": [ - "wm" - ], - "video/x-ms-wmv": [ - "wmv" - ], - "video/x-ms-wmx": [ - "wmx" - ], - "video/x-ms-wvx": [ - "wvx" - ], - "video/x-msvideo": [ - "avi" - ], - "video/x-sgi-movie": [ - "movie" - ], - "video/x-smv": [ - "smv" - ], - "x-conference/x-cooltalk": [ - "ice" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json deleted file mode 100644 index ad50d61..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/lib/node.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "text/vtt": [ - "vtt" - ], - "application/x-chrome-extension": [ - "crx" - ], - "text/x-component": [ - "htc" - ], - "text/cache-manifest": [ - "manifest" - ], - "application/octet-stream": [ - "buffer" - ], - "application/mp4": [ - "m4p" - ], - "audio/mp4": [ - "m4a" - ], - "video/MP2T": [ - "ts" - ], - "application/x-web-app-manifest+json": [ - "webapp" - ], - "text/x-lua": [ - "lua" - ], - "application/x-lua-bytecode": [ - "luac" - ], - "text/x-markdown": [ - "markdown", - "md", - "mkd" - ], - "text/plain": [ - "ini" - ], - "application/dash+xml": [ - "mdp" - ], - "font/opentype": [ - "otf" - ], - "application/json": [ - "map" - ], - "application/xml": [ - "xsd" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json deleted file mode 100644 index bd487f6..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/node_modules/mime-types/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "mime-types", - "description": "The ultimate javascript content-type utility.", - "version": "1.0.1", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Jeremiah Senkpiel", - "email": "fishrock123@rocketmail.com", - "url": "https://searchbeam.jit.su" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/mime-types" - }, - "license": "MIT", - "main": "lib", - "devDependencies": { - "co": "3", - "cogent": "0", - "mocha": "1", - "should": "3" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "make test" - }, - "bugs": { - "url": "https://github.com/expressjs/mime-types/issues" - }, - "homepage": "https://github.com/expressjs/mime-types", - "_id": "mime-types@1.0.1", - "_shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "_from": "mime-types@>=1.0.1-0 <1.1.0-0", - "_npmVersion": "1.4.9", - "_npmUser": { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - } - ], - "dist": { - "shasum": "4d9ad71bcd4cdef6be892c21b5b81645607c0b8f", - "tarball": "http://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/package.json deleted file mode 100644 index 6cdddee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/type-is/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "type-is", - "description": "Infer the content-type of a request.", - "version": "1.3.2", - "author": { - "name": "Jonathan Ong", - "email": "me@jongleberry.com", - "url": "http://jongleberry.com" - }, - "contributors": [ - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - } - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/expressjs/type-is" - }, - "dependencies": { - "media-typer": "0.2.0", - "mime-types": "~1.0.1" - }, - "devDependencies": { - "istanbul": "0.2.11", - "mocha": "*", - "should": "*" - }, - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "test": "mocha --require should --reporter spec --check-leaks --bail test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - }, - "gitHead": "d76790909638d4cf1785e09858db5576f91f710f", - "bugs": { - "url": "https://github.com/expressjs/type-is/issues" - }, - "homepage": "https://github.com/expressjs/type-is", - "_id": "type-is@1.3.2", - "_shasum": "4f2a5dc58775ca1630250afc7186f8b36309d1bb", - "_from": "type-is@>=1.3.2-0 <1.4.0-0", - "_npmVersion": "1.4.16", - "_npmUser": { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - "maintainers": [ - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "mscdex", - "email": "mscdex@mscdex.net" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - } - ], - "dist": { - "shasum": "4f2a5dc58775ca1630250afc7186f8b36309d1bb", - "tarball": "http://registry.npmjs.org/type-is/-/type-is-1.3.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/type-is/-/type-is-1.3.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/.travis.yml deleted file mode 100644 index af92b02..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: "node_js" -node_js: - - "0.4" - - "0.6" - - "0.8" - - "0.10" diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/LICENSE deleted file mode 100644 index e33bd10..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -(The MIT License) - -Copyright (c) 2013 Jared Hanson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/README.md deleted file mode 100644 index 2f94e9b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# utils-merge - -Merges the properties from a source object into a destination object. - -## Install - - $ npm install utils-merge - -## Usage - -```javascript -var a = { foo: 'bar' } - , b = { bar: 'baz' }; - -merge(a, b); -// => { foo: 'bar', bar: 'baz' } -``` - -## Tests - - $ npm install - $ npm test - -[![Build Status](https://secure.travis-ci.org/jaredhanson/utils-merge.png)](http://travis-ci.org/jaredhanson/utils-merge) - -## Credits - - - [Jared Hanson](http://github.com/jaredhanson) - -## License - -[The MIT License](http://opensource.org/licenses/MIT) - -Copyright (c) 2013 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/index.js deleted file mode 100644 index 4265c69..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/index.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Merge object b with object a. - * - * var a = { foo: 'bar' } - * , b = { bar: 'baz' }; - * - * merge(a, b); - * // => { foo: 'bar', bar: 'baz' } - * - * @param {Object} a - * @param {Object} b - * @return {Object} - * @api public - */ - -exports = module.exports = function(a, b){ - if (a && b) { - for (var key in b) { - a[key] = b[key]; - } - } - return a; -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/package.json deleted file mode 100644 index e655383..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/utils-merge/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "utils-merge", - "version": "1.0.0", - "description": "merge() utility function", - "keywords": [ - "util" - ], - "repository": { - "type": "git", - "url": "git://github.com/jaredhanson/utils-merge.git" - }, - "bugs": { - "url": "http://github.com/jaredhanson/utils-merge/issues" - }, - "author": { - "name": "Jared Hanson", - "email": "jaredhanson@gmail.com", - "url": "http://www.jaredhanson.net/" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://www.opensource.org/licenses/MIT" - } - ], - "main": "./index", - "dependencies": {}, - "devDependencies": { - "mocha": "1.x.x", - "chai": "1.x.x" - }, - "scripts": { - "test": "mocha --reporter spec --require test/bootstrap/node test/*.test.js" - }, - "engines": { - "node": ">= 0.4.0" - }, - "readme": "# utils-merge\n\nMerges the properties from a source object into a destination object.\n\n## Install\n\n $ npm install utils-merge\n\n## Usage\n\n```javascript\nvar a = { foo: 'bar' }\n , b = { bar: 'baz' };\n\nmerge(a, b);\n// => { foo: 'bar', bar: 'baz' }\n```\n\n## Tests\n\n $ npm install\n $ npm test\n\n[![Build Status](https://secure.travis-ci.org/jaredhanson/utils-merge.png)](http://travis-ci.org/jaredhanson/utils-merge)\n\n## Credits\n\n - [Jared Hanson](http://github.com/jaredhanson)\n\n## License\n\n[The MIT License](http://opensource.org/licenses/MIT)\n\nCopyright (c) 2013 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)>\n", - "readmeFilename": "README.md", - "_id": "utils-merge@1.0.0", - "dist": { - "shasum": "0294fb922bb9375153541c4f7096231f287c8af8", - "tarball": "http://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" - }, - "_from": "utils-merge@1.0.0", - "_npmVersion": "1.2.25", - "_npmUser": { - "name": "jaredhanson", - "email": "jaredhanson@gmail.com" - }, - "maintainers": [ - { - "name": "jaredhanson", - "email": "jaredhanson@gmail.com" - } - ], - "directories": {}, - "_shasum": "0294fb922bb9375153541c4f7096231f287c8af8", - "_resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "homepage": "https://github.com/jaredhanson/utils-merge" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/.npmignore deleted file mode 100644 index cd39b77..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -coverage/ -test/ -.travis.yml diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/History.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/History.md deleted file mode 100644 index 10fb1db..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/History.md +++ /dev/null @@ -1,9 +0,0 @@ -0.1.0 / 2014-06-05 -================== - - * Support array of fields to set - -0.0.0 / 2014-06-04 -================== - - * Initial release diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/LICENSE deleted file mode 100644 index b7dce6c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 Douglas Christopher Wilson - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/README.md deleted file mode 100644 index 6ed2825..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# vary - -[![NPM version](https://badge.fury.io/js/vary.svg)](http://badge.fury.io/js/vary) -[![Build Status](https://travis-ci.org/expressjs/vary.svg?branch=master)](https://travis-ci.org/expressjs/vary) -[![Coverage Status](https://img.shields.io/coveralls/expressjs/vary.svg?branch=master)](https://coveralls.io/r/expressjs/vary) - -Update the Vary header of a response - -## Install - -```sh -$ npm install vary -``` - -## API - -```js -var vary = require('vary') -``` - -### vary(res, field) - -Adds the given header `field` to the `Vary` response header of `res`. -This can be a string of a single field or an array of multiple fields. - -This will append the header if not already listed, otherwise leaves -it listed in the current location. - -```js -vary(res, 'Origin') -vary(res, 'User-Agent') -vary(res, ['Accept', 'Accept-Language', 'Accept-Encoding']) -``` - -## Testing - -```sh -$ npm test -``` - -## License - -[MIT](LICENSE) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/index.js deleted file mode 100644 index 6f52730..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/index.js +++ /dev/null @@ -1,79 +0,0 @@ -/*! - * vary - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = vary; - -/** - * Variables. - */ - -var separators = /[\(\)<>@,;:\\"\/\[\]\?=\{\}\u0020\u0009]/; - -/** - * Mark that a request is varied on a header field. - * - * @param {Object} res - * @param {String|Array} field - * @api public - */ - -function vary(res, field) { - if (!res || !res.getHeader || !res.setHeader) { - // quack quack - throw new TypeError('res argument is required'); - } - - if (!field) { - throw new TypeError('field argument is required'); - } - - var fields = !Array.isArray(field) - ? [String(field)] - : field; - - for (var i = 0; i < fields.length; i++) { - if (separators.test(fields[i])) { - throw new TypeError('field argument contains an invalid header'); - } - } - - var val = res.getHeader('Vary') || '' - var headers = Array.isArray(val) - ? val.join(', ') - : String(val); - - // existing unspecified vary - if (headers === '*') { - return; - } - - // enumerate current values - var vals = headers.toLowerCase().split(/ *, */); - - // unspecified vary - if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { - res.setHeader('Vary', '*'); - return; - } - - for (var i = 0; i < fields.length; i++) { - field = fields[i].toLowerCase(); - - // append value (case-preserving) - if (vals.indexOf(field) === -1) { - vals.push(field); - headers = headers - ? headers + ', ' + fields[i] - : fields[i]; - } - } - - res.setHeader('Vary', headers); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/package.json deleted file mode 100644 index c4937fe..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/node_modules/vary/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "vary", - "description": "Update the Vary header of a response", - "version": "0.1.0", - "author": { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - "license": "MIT", - "keywords": [ - "http", - "res", - "vary" - ], - "repository": { - "type": "git", - "url": "git://github.com/expressjs/vary" - }, - "devDependencies": { - "istanbul": "0.2.10", - "mocha": "~1.20.0", - "should": "~4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "mocha --reporter dot test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec test/" - }, - "bugs": { - "url": "https://github.com/expressjs/vary/issues" - }, - "homepage": "https://github.com/expressjs/vary", - "_id": "vary@0.1.0", - "dist": { - "shasum": "df0945899e93c0cc5bd18cc8321d9d21e74f6176", - "tarball": "http://registry.npmjs.org/vary/-/vary-0.1.0.tgz" - }, - "_from": "vary@0.1.0", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "fishrock123", - "email": "fishrock123@rocketmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - } - ], - "directories": {}, - "_shasum": "df0945899e93c0cc5bd18cc8321d9d21e74f6176", - "_resolved": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/package.json deleted file mode 100644 index 65ea6d1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/package.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "name": "express", - "description": "Fast, unopinionated, minimalist web framework", - "version": "4.7.2", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "Aaron Heckmann", - "email": "aaron.heckmann+github@gmail.com" - }, - { - "name": "Ciaran Jessup", - "email": "ciaranj@gmail.com" - }, - { - "name": "Douglas Christopher Wilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "Guillermo Rauch", - "email": "rauchg@gmail.com" - }, - { - "name": "Jonathan Ong", - "email": "me@jongleberry.com" - }, - { - "name": "Roman Shtylman", - "email": "shtylman+expressjs@gmail.com" - }, - { - "name": "Young Jae Sim", - "email": "hanul@hanul.me" - } - ], - "keywords": [ - "express", - "framework", - "sinatra", - "web", - "rest", - "restful", - "router", - "app", - "api" - ], - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/express" - }, - "license": "MIT", - "dependencies": { - "accepts": "~1.0.7", - "buffer-crc32": "0.2.3", - "debug": "1.0.4", - "depd": "0.4.4", - "escape-html": "1.0.1", - "finalhandler": "0.1.0", - "media-typer": "0.2.0", - "methods": "1.1.0", - "parseurl": "~1.2.0", - "path-to-regexp": "0.1.3", - "proxy-addr": "1.0.1", - "range-parser": "1.0.0", - "send": "0.7.2", - "serve-static": "~1.4.2", - "type-is": "~1.3.2", - "vary": "0.1.0", - "cookie": "0.1.2", - "fresh": "0.2.2", - "cookie-signature": "1.0.4", - "merge-descriptors": "0.0.2", - "qs": "0.6.6", - "utils-merge": "1.0.0" - }, - "devDependencies": { - "after": "0.8.1", - "istanbul": "0.3.0", - "mocha": "~1.21.0", - "should": "~4.0.4", - "supertest": "~0.13.0", - "connect-redis": "~2.0.0", - "ejs": "~1.0.0", - "marked": "0.3.2", - "hjs": "~0.0.6", - "body-parser": "~1.5.2", - "cookie-parser": "~1.3.1", - "express-session": "~1.7.2", - "jade": "~1.5.0", - "method-override": "~2.1.1", - "morgan": "~1.2.2", - "multiparty": "~3.3.1", - "vhost": "2.0.0" - }, - "engines": { - "node": ">= 0.10.0" - }, - "scripts": { - "prepublish": "npm prune", - "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/" - }, - "bugs": { - "url": "https://github.com/visionmedia/express/issues" - }, - "homepage": "https://github.com/visionmedia/express", - "_id": "express@4.7.2", - "dist": { - "shasum": "2cbae61efab6c2db72a547ff3bf380e637c08590", - "tarball": "http://registry.npmjs.org/express/-/express-4.7.2.tgz" - }, - "_from": "express@latest", - "_npmVersion": "1.4.3", - "_npmUser": { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "jongleberry", - "email": "jonathanrichardong@gmail.com" - }, - { - "name": "shtylman", - "email": "shtylman@gmail.com" - }, - { - "name": "dougwilson", - "email": "doug@somethingdoug.com" - }, - { - "name": "aredridel", - "email": "aredridel@nbtsc.org" - } - ], - "directories": {}, - "_shasum": "2cbae61efab6c2db72a547ff3bf380e637c08590", - "_resolved": "https://registry.npmjs.org/express/-/express-4.7.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/test.js deleted file mode 100644 index cacd7a3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/node_modules/express/test.js +++ /dev/null @@ -1,8 +0,0 @@ -var app = require('./index')() -app.get('/iamaverylongcomponent/in_a_url/you_said_didnt_work', function (req, res) { - res.send('got long url') -}) -app.get('/IamUSINGcaps', function (req, res) { - res.send('got caps matching') -}) -app.listen(3333) \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/views/home.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/views/home.handlebars deleted file mode 100644 index d694190..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/views/home.handlebars +++ /dev/null @@ -1 +0,0 @@ -

Example App: Home

diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/views/layouts/main.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/views/layouts/main.handlebars deleted file mode 100644 index 49aff4b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/examples/basic/views/layouts/main.handlebars +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Example App - - - - {{{body}}} - - - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/index.js deleted file mode 100644 index 5546d21..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/index.js +++ /dev/null @@ -1,13 +0,0 @@ -var ExpressHandlebars = require('./lib/express-handlebars'); - -function exphbs(config) { - return exphbs.create(config).engine; -} - -exphbs.create = function (config) { - return new ExpressHandlebars(config); -}; - -exphbs.ExpressHandlebars = ExpressHandlebars; - -module.exports = exphbs; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/lib/express-handlebars.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/lib/express-handlebars.js deleted file mode 100644 index 099a743..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/lib/express-handlebars.js +++ /dev/null @@ -1,369 +0,0 @@ -var async = require('async'), - fs = require('fs'), - glob = require('glob'), - path = require('path'), - semver = require('semver'); - -// -- Utilites ----------------------------------------------------------------- - -function extend(obj) { - Array.prototype.slice.call(arguments, 1).forEach(function (source) { - if (!source) { return; } - - for (var key in source) { - obj[key] = source[key]; - } - }); - - return obj; -} - -// -- Constructor -------------------------------------------------------------- - -function ExpressHandlebars(config) { - config || (config = {}); - - var handlebars = config.handlebars || require('handlebars'); - - if ('extname' in config) { this.extname = config.extname; } - if ('layoutsDir' in config) { this.layoutsDir = config.layoutsDir; } - if ('partialsDir' in config) { this.partialsDir = config.partialsDir; } - - if(this.extname[0] !== '.') { this.extname = '.' + this.extname; } - - this.defaultLayout = config.defaultLayout; - this.handlebars = handlebars; - this.helpers = config.helpers; - - this.handlebarsVersion = ExpressHandlebars.getHandlebarsSemver(handlebars); - - this.compiled = {}; - this.precompiled = {}; - - this.engine = this.renderView.bind(this); -} - -// -- Statics ------------------------------------------------------------------ - -ExpressHandlebars._dirCache = {}; -ExpressHandlebars._fileCache = {}; -ExpressHandlebars._pendingReads = {}; - -ExpressHandlebars.getHandlebarsSemver = function (handlebars) { - var version = handlebars.VERSION || ''; - - // Makes sure the Handlebars version is a valid semver. - if (version && !semver.valid(version)) { - version = version.replace(/(\d\.\d)\.(\D.*)/, '$1.0-$2'); - } - - return version; -}; - -// -- Prototype ---------------------------------------------------------------- - -extend(ExpressHandlebars.prototype, { - // -- Public Properties ---------------------------------------------------- - - extname : '.handlebars', - layoutsDir : 'views/layouts/', - partialsDir: 'views/partials/', - - // -- Public Methods ------------------------------------------------------- - - loadPartials: function (options, callback) { - if (arguments.length < 2 && typeof options === 'function') { - callback = options; - options = {}; - } - - options || (options = {}); - - function load(dirs, options, callback) { - Array.isArray(dirs) || (dirs = [dirs]); - var loadTemplates = this.loadTemplates.bind(this); - - async.map(dirs, function (dir, callback) { - loadTemplates(dir, options, callback); - }, callback); - } - - function mapPartials(dirs, callback) { - var getPartialName = this._getPartialName.bind(this), - partials; - - partials = dirs.reduce(function (partials, templates) { - Object.keys(templates).forEach(function (filePath) { - partials[getPartialName(filePath)] = templates[filePath]; - }); - - return partials; - }, {}); - - callback(null, partials); - } - - async.waterfall([ - load.bind(this, this.partialsDir, options), - mapPartials.bind(this) - ], callback); - }, - - loadTemplate: function (filePath, options, callback) { - filePath = path.resolve(filePath); - - if (arguments.length < 3 && typeof options === 'function') { - callback = options; - options = {}; - } - - options || (options = {}); - - var precompiled = options.precompiled, - cache = precompiled ? this.precompiled : this.compiled, - template = options.cache && cache[filePath], - compile; - - if (template) { - callback(null, template); - return; - } - - compile = this.handlebars[precompiled ? 'precompile' : 'compile']; - - this._loadFile(filePath, options, function (err, file) { - if (err) { return callback(err); } - - try { - template = cache[filePath] = compile(file); - callback(null, template); - } catch (ex) { - callback(ex); - } - }); - }, - - loadTemplates: function (dirPath, options, callback) { - if (arguments.length < 3 && typeof options === 'function') { - callback = options; - options = {}; - } - - options || (options = {}); - - function load(filePath, callback) { - this.loadTemplate(path.join(dirPath, filePath), options, callback); - } - - function mapTemplates(filePaths, callback) { - async.map(filePaths, load.bind(this), function (err, templates) { - if (err) { return callback(err); } - - var map = filePaths.reduce(function (map, filePath, i) { - map[filePath] = templates[i]; - return map; - }, {}); - - callback(null, map); - }); - } - - async.waterfall([ - this._loadDir.bind(this, dirPath, options), - mapTemplates.bind(this) - ], callback); - }, - - render: function (filePath, options, callback) { - if (arguments.length < 3 && typeof options === 'function') { - callback = options; - options = {}; - } - - options || (options = {}); - - var helpers = extend({}, - this.handlebars.helpers, this.helpers, options.helpers); - - function loadTemplates(callback) { - async.parallel({ - partials: this.loadPartials.bind(this, options), - template: this.loadTemplate.bind(this, filePath, options) - }, callback); - } - - function renderTemplate(templates, callback) { - this._renderTemplate(templates.template, options, { - helpers : helpers, - partials: templates.partials - }, callback); - } - - // Force `{precompiled: false}` option, before passing `options` along - // to `getPartials()` and `getTemplate()` methods. - if (options.precompiled) { - options = extend({}, options, {precompiled: false}); - } - - async.waterfall([ - loadTemplates.bind(this), - renderTemplate.bind(this) - ], callback); - }, - - renderView: function (viewPath, options, callback) { - if (arguments.length < 3 && typeof options === 'function') { - callback = options; - options = {}; - } - - options || (options = {}); - - var layoutPath = this._resolveLayoutPath(options); - - function renderLayout(body, callback) { - var context = extend({}, options, {body: body}); - this.render(layoutPath, context, callback); - } - - // Simple render when no layout is used. - if (!layoutPath) { - this.render.apply(this, arguments); - return; - } - - // Force `{precompiled: false}` option, before passing options along to - // `getPartials()` and `getTemplate()` methods. - if (options.precompiled) { - options = extend({}, options, {precompiled: false}); - } - - async.waterfall([ - this.render.bind(this, viewPath, options), - renderLayout.bind(this) - ], callback); - }, - - // -- Private Methods ------------------------------------------------------ - - _getPartialName: function (filePath) { - var extRegex = new RegExp(this.extname + '$'), - name = filePath.replace(extRegex, ''), - version = this.handlebarsVersion; - - // Fixes a Handlebars bug in versions prior to 1.0.rc.2 which caused - // partials with "/"s in their name to not be found. - // https://github.com/wycats/handlebars.js/pull/389 - if (version && !semver.satisfies(version, '>=1.0.0-rc.2')) { - name = name.replace('/', '.'); - } - - return name; - }, - - _loadDir: function (dirPath, options, callback) { - dirPath = path.resolve(dirPath); - - var dirCache = ExpressHandlebars._dirCache, - pendingReads = ExpressHandlebars._pendingReads, - dir = options.cache && dirCache[dirPath], - callbacks, pattern; - - if (dir) { - callback(null, dir.concat()); - return; - } - - callbacks = pendingReads[dirPath]; - - if (callbacks) { - callbacks.push(callback); - return; - } - - callbacks = pendingReads[dirPath] = [callback]; - pattern = '**/*' + this.extname; - - glob(pattern, {cwd: dirPath}, function (err, dir) { - if (!err) { - dirCache[dirPath] = dir; - } - - while (callbacks.length) { - callbacks.shift().call(null, err, dir && dir.concat()); - } - - delete pendingReads[dirPath]; - }); - }, - - _loadFile: function (filePath, options, callback) { - filePath = path.resolve(filePath); - - var fileCache = ExpressHandlebars._fileCache, - pendingReads = ExpressHandlebars._pendingReads, - file = options.cache && fileCache[filePath], - callbacks; - - if (file) { - callback(null, file); - return; - } - - callbacks = pendingReads[filePath]; - - if (callbacks) { - callbacks.push(callback); - return; - } - - callbacks = pendingReads[filePath] = [callback]; - - fs.readFile(filePath, 'utf8', function (err, file) { - if (!err) { - fileCache[filePath] = file; - } - - while (callbacks.length) { - callbacks.shift().call(null, err, file); - } - - delete pendingReads[filePath]; - }); - }, - - _renderTemplate: function (template, context, options, callback) { - var output; - - try { - output = template(context, options); - callback(null, output); - } catch (ex) { - callback(ex); - } - }, - - _resolveLayoutPath: function (options) { - // Makes sure to interpret falsy `options.layout` values as no layout. - var layoutPath = 'layout' in options ? options.layout : - this.defaultLayout; - - if (!layoutPath) { - return null; - } - - if (!path.extname(layoutPath)) { - layoutPath += this.extname; - } - - if (layoutPath[0] !== '/') { - layoutPath = path.join(this.layoutsDir, layoutPath); - } - - return layoutPath; - } -}); - -// -- Exports ------------------------------------------------------------------ - -module.exports = ExpressHandlebars; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/.bin/handlebars b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/.bin/handlebars deleted file mode 120000 index fb7d090..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/.bin/handlebars +++ /dev/null @@ -1 +0,0 @@ -../handlebars/bin/handlebars \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/.bin/semver b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/.bin/semver deleted file mode 120000 index 317eb29..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/.bin/semver +++ /dev/null @@ -1 +0,0 @@ -../semver/bin/semver \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/LICENSE deleted file mode 100644 index b7f9d50..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Caolan McMahon - -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/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/README.md deleted file mode 100644 index 951f76e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/README.md +++ /dev/null @@ -1,1425 +0,0 @@ -# Async.js - -Async is a utility module which provides straight-forward, powerful functions -for working with asynchronous JavaScript. Although originally designed for -use with [node.js](http://nodejs.org), it can also be used directly in the -browser. Also supports [component](https://github.com/component/component). - -Async provides around 20 functions that include the usual 'functional' -suspects (map, reduce, filter, each…) as well as some common patterns -for asynchronous control flow (parallel, series, waterfall…). All these -functions assume you follow the node.js convention of providing a single -callback as the last argument of your async function. - - -## Quick Examples - -```javascript -async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file -}); - -async.filter(['file1','file2','file3'], fs.exists, function(results){ - // results now equals an array of the existing files -}); - -async.parallel([ - function(){ ... }, - function(){ ... } -], callback); - -async.series([ - function(){ ... }, - function(){ ... } -]); -``` - -There are many more functions available so take a look at the docs below for a -full list. This module aims to be comprehensive, so if you feel anything is -missing please create a GitHub issue for it. - -## Common Pitfalls - -### Binding a context to an iterator - -This section is really about bind, not about async. If you are wondering how to -make async execute your iterators in a given context, or are confused as to why -a method of another library isn't working as an iterator, study this example: - -```js -// Here is a simple object with an (unnecessarily roundabout) squaring method -var AsyncSquaringLibrary = { - squareExponent: 2, - square: function(number, callback){ - var result = Math.pow(number, this.squareExponent); - setTimeout(function(){ - callback(null, result); - }, 200); - } -}; - -async.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){ - // result is [NaN, NaN, NaN] - // This fails because the `this.squareExponent` expression in the square - // function is not evaluated in the context of AsyncSquaringLibrary, and is - // therefore undefined. -}); - -async.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){ - // result is [1, 4, 9] - // With the help of bind we can attach a context to the iterator before - // passing it to async. Now the square function will be executed in its - // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent` - // will be as expected. -}); -``` - -## Download - -The source is available for download from -[GitHub](http://github.com/caolan/async). -Alternatively, you can install using Node Package Manager (npm): - - npm install async - -__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed - -## In the Browser - -So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage: - -```html - - -``` - -## Documentation - -### Collections - -* [each](#each) -* [eachSeries](#eachSeries) -* [eachLimit](#eachLimit) -* [map](#map) -* [mapSeries](#mapSeries) -* [mapLimit](#mapLimit) -* [filter](#filter) -* [filterSeries](#filterSeries) -* [reject](#reject) -* [rejectSeries](#rejectSeries) -* [reduce](#reduce) -* [reduceRight](#reduceRight) -* [detect](#detect) -* [detectSeries](#detectSeries) -* [sortBy](#sortBy) -* [some](#some) -* [every](#every) -* [concat](#concat) -* [concatSeries](#concatSeries) - -### Control Flow - -* [series](#series) -* [parallel](#parallel) -* [parallelLimit](#parallellimittasks-limit-callback) -* [whilst](#whilst) -* [doWhilst](#doWhilst) -* [until](#until) -* [doUntil](#doUntil) -* [forever](#forever) -* [waterfall](#waterfall) -* [compose](#compose) -* [applyEach](#applyEach) -* [applyEachSeries](#applyEachSeries) -* [queue](#queue) -* [cargo](#cargo) -* [auto](#auto) -* [iterator](#iterator) -* [apply](#apply) -* [nextTick](#nextTick) -* [times](#times) -* [timesSeries](#timesSeries) - -### Utils - -* [memoize](#memoize) -* [unmemoize](#unmemoize) -* [log](#log) -* [dir](#dir) -* [noConflict](#noConflict) - - -## Collections - - - -### each(arr, iterator, callback) - -Applies an iterator function to each item in an array, in parallel. -The iterator is called with an item from the list and a callback for when it -has finished. If the iterator passes an error to this callback, the main -callback for the each function is immediately called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err) which must be called once it has - completed. If no error has occured, the callback should be run without - arguments or with an explicit null argument. -* callback(err) - A callback which is called after all the iterator functions - have finished, or an error has occurred. - -__Example__ - -```js -// assuming openFiles is an array of file names and saveFile is a function -// to save the modified contents of that file: - -async.each(openFiles, saveFile, function(err){ - // if any of the saves produced an error, err would equal that error -}); -``` - ---------------------------------------- - - - -### eachSeries(arr, iterator, callback) - -The same as each only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. This means the iterator functions will complete in order. - - ---------------------------------------- - - - -### eachLimit(arr, limit, iterator, callback) - -The same as each only no more than "limit" iterators will be simultaneously -running at any time. - -Note that the items are not processed in batches, so there is no guarantee that - the first "limit" iterator functions will complete before any others are -started. - -__Arguments__ - -* arr - An array to iterate over. -* limit - The maximum number of iterators to run at any time. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err) which must be called once it has - completed. If no error has occured, the callback should be run without - arguments or with an explicit null argument. -* callback(err) - A callback which is called after all the iterator functions - have finished, or an error has occurred. - -__Example__ - -```js -// Assume documents is an array of JSON objects and requestApi is a -// function that interacts with a rate-limited REST api. - -async.eachLimit(documents, 20, requestApi, function(err){ - // if any of the saves produced an error, err would equal that error -}); -``` - ---------------------------------------- - - -### map(arr, iterator, callback) - -Produces a new array of values by mapping each value in the given array through -the iterator function. The iterator is called with an item from the array and a -callback for when it has finished processing. The callback takes 2 arguments, -an error and the transformed item from the array. If the iterator passes an -error to this callback, the main callback for the map function is immediately -called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order, however -the results array will be in the same order as the original array. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, transformed) which must be called once - it has completed with an error (which can be null) and a transformed item. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array of the - transformed items from the original array. - -__Example__ - -```js -async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file -}); -``` - ---------------------------------------- - - -### mapSeries(arr, iterator, callback) - -The same as map only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - - ---------------------------------------- - - -### mapLimit(arr, limit, iterator, callback) - -The same as map only no more than "limit" iterators will be simultaneously -running at any time. - -Note that the items are not processed in batches, so there is no guarantee that - the first "limit" iterator functions will complete before any others are -started. - -__Arguments__ - -* arr - An array to iterate over. -* limit - The maximum number of iterators to run at any time. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, transformed) which must be called once - it has completed with an error (which can be null) and a transformed item. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array of the - transformed items from the original array. - -__Example__ - -```js -async.mapLimit(['file1','file2','file3'], 1, fs.stat, function(err, results){ - // results is now an array of stats for each file -}); -``` - ---------------------------------------- - - -### filter(arr, iterator, callback) - -__Alias:__ select - -Returns a new array of all the values which pass an async truth test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like fs.exists. This operation is -performed in parallel, but the results array will be in the same order as the -original. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(results) - A callback which is called after all the iterator - functions have finished. - -__Example__ - -```js -async.filter(['file1','file2','file3'], fs.exists, function(results){ - // results now equals an array of the existing files -}); -``` - ---------------------------------------- - - -### filterSeries(arr, iterator, callback) - -__alias:__ selectSeries - -The same as filter only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - ---------------------------------------- - - -### reject(arr, iterator, callback) - -The opposite of filter. Removes values that pass an async truth test. - ---------------------------------------- - - -### rejectSeries(arr, iterator, callback) - -The same as reject, only the iterator is applied to each item in the array -in series. - - ---------------------------------------- - - -### reduce(arr, memo, iterator, callback) - -__aliases:__ inject, foldl - -Reduces a list of values into a single value using an async iterator to return -each successive step. Memo is the initial state of the reduction. This -function only operates in series. For performance reasons, it may make sense to -split a call to this function into a parallel map, then use the normal -Array.prototype.reduce on the results. This function is for situations where -each step in the reduction needs to be async, if you can get the data before -reducing it then it's probably a good idea to do so. - -__Arguments__ - -* arr - An array to iterate over. -* memo - The initial state of the reduction. -* iterator(memo, item, callback) - A function applied to each item in the - array to produce the next step in the reduction. The iterator is passed a - callback(err, reduction) which accepts an optional error as its first - argument, and the state of the reduction as the second. If an error is - passed to the callback, the reduction is stopped and the main callback is - immediately called with the error. -* callback(err, result) - A callback which is called after all the iterator - functions have finished. Result is the reduced value. - -__Example__ - -```js -async.reduce([1,2,3], 0, function(memo, item, callback){ - // pointless async: - process.nextTick(function(){ - callback(null, memo + item) - }); -}, function(err, result){ - // result is now equal to the last value of memo, which is 6 -}); -``` - ---------------------------------------- - - -### reduceRight(arr, memo, iterator, callback) - -__Alias:__ foldr - -Same as reduce, only operates on the items in the array in reverse order. - - ---------------------------------------- - - -### detect(arr, iterator, callback) - -Returns the first value in a list that passes an async truth test. The -iterator is applied in parallel, meaning the first iterator to return true will -fire the detect callback with that result. That means the result might not be -the first item in the original array (in terms of order) that passes the test. - -If order within the original array is important then look at detectSeries. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - the first item in the array that passes the truth test (iterator) or the - value undefined if none passed. - -__Example__ - -```js -async.detect(['file1','file2','file3'], fs.exists, function(result){ - // result now equals the first file in the list that exists -}); -``` - ---------------------------------------- - - -### detectSeries(arr, iterator, callback) - -The same as detect, only the iterator is applied to each item in the array -in series. This means the result is always the first in the original array (in -terms of array order) that passes the truth test. - - ---------------------------------------- - - -### sortBy(arr, iterator, callback) - -Sorts a list by the results of running each value through an async iterator. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, sortValue) which must be called once it - has completed with an error (which can be null) and a value to use as the sort - criteria. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is the items from - the original array sorted by the values returned by the iterator calls. - -__Example__ - -```js -async.sortBy(['file1','file2','file3'], function(file, callback){ - fs.stat(file, function(err, stats){ - callback(err, stats.mtime); - }); -}, function(err, results){ - // results is now the original array of files sorted by - // modified date -}); -``` - ---------------------------------------- - - -### some(arr, iterator, callback) - -__Alias:__ any - -Returns true if at least one element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like fs.exists. Once any iterator -call returns true, the main callback is immediately called. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - either true or false depending on the values of the async tests. - -__Example__ - -```js -async.some(['file1','file2','file3'], fs.exists, function(result){ - // if result is true then at least one of the files exists -}); -``` - ---------------------------------------- - - -### every(arr, iterator, callback) - -__Alias:__ all - -Returns true if every element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like fs.exists. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback(truthValue) which must be called with a - boolean argument once it has completed. -* callback(result) - A callback which is called after all the iterator - functions have finished. Result will be either true or false depending on - the values of the async tests. - -__Example__ - -```js -async.every(['file1','file2','file3'], fs.exists, function(result){ - // if result is true then every file exists -}); -``` - ---------------------------------------- - - -### concat(arr, iterator, callback) - -Applies an iterator to each item in a list, concatenating the results. Returns the -concatenated list. The iterators are called in parallel, and the results are -concatenated as they return. There is no guarantee that the results array will -be returned in the original order of the arguments passed to the iterator function. - -__Arguments__ - -* arr - An array to iterate over -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback(err, results) which must be called once it - has completed with an error (which can be null) and an array of results. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array containing - the concatenated results of the iterator function. - -__Example__ - -```js -async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){ - // files is now a list of filenames that exist in the 3 directories -}); -``` - ---------------------------------------- - - -### concatSeries(arr, iterator, callback) - -Same as async.concat, but executes in series instead of parallel. - - -## Control Flow - - -### series(tasks, [callback]) - -Run an array of functions in series, each one running once the previous -function has completed. If any functions in the series pass an error to its -callback, no more functions are run and the callback for the series is -immediately called with the value of the error. Once the tasks have completed, -the results are passed to the final callback as an array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.series. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback(err, result) it must call on completion with an error (which can - be null) and an optional result value. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - -__Example__ - -```js -async.series([ - function(callback){ - // do some stuff ... - callback(null, 'one'); - }, - function(callback){ - // do some more stuff ... - callback(null, 'two'); - } -], -// optional callback -function(err, results){ - // results is now equal to ['one', 'two'] -}); - - -// an example using an object instead of an array -async.series({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - } -}, -function(err, results) { - // results is now equal to: {one: 1, two: 2} -}); -``` - ---------------------------------------- - - -### parallel(tasks, [callback]) - -Run an array of functions in parallel, without waiting until the previous -function has completed. If any of the functions pass an error to its -callback, the main callback is immediately called with the value of the error. -Once the tasks have completed, the results are passed to the final callback as an -array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.parallel. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback(err, result) it must call on completion with an error (which can - be null) and an optional result value. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - -__Example__ - -```js -async.parallel([ - function(callback){ - setTimeout(function(){ - callback(null, 'one'); - }, 200); - }, - function(callback){ - setTimeout(function(){ - callback(null, 'two'); - }, 100); - } -], -// optional callback -function(err, results){ - // the results array will equal ['one','two'] even though - // the second function had a shorter timeout. -}); - - -// an example using an object instead of an array -async.parallel({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - } -}, -function(err, results) { - // results is now equals to: {one: 1, two: 2} -}); -``` - ---------------------------------------- - - -### parallelLimit(tasks, limit, [callback]) - -The same as parallel only the tasks are executed in parallel with a maximum of "limit" -tasks executing at any time. - -Note that the tasks are not executed in batches, so there is no guarantee that -the first "limit" tasks will complete before any others are started. - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback(err, result) it must call on completion with an error (which can - be null) and an optional result value. -* limit - The maximum number of tasks to run at any time. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - ---------------------------------------- - - -### whilst(test, fn, callback) - -Repeatedly call fn, while test returns true. Calls the callback when stopped, -or an error occurs. - -__Arguments__ - -* test() - synchronous truth test to perform before each execution of fn. -* fn(callback) - A function to call each time the test passes. The function is - passed a callback(err) which must be called once it has completed with an - optional error argument. -* callback(err) - A callback which is called after the test fails and repeated - execution of fn has stopped. - -__Example__ - -```js -var count = 0; - -async.whilst( - function () { return count < 5; }, - function (callback) { - count++; - setTimeout(callback, 1000); - }, - function (err) { - // 5 seconds have passed - } -); -``` - ---------------------------------------- - - -### doWhilst(fn, test, callback) - -The post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. - ---------------------------------------- - - -### until(test, fn, callback) - -Repeatedly call fn, until test returns true. Calls the callback when stopped, -or an error occurs. - -The inverse of async.whilst. - ---------------------------------------- - - -### doUntil(fn, test, callback) - -Like doWhilst except the test is inverted. Note the argument ordering differs from `until`. - ---------------------------------------- - - -### forever(fn, callback) - -Calls the asynchronous function 'fn' repeatedly, in series, indefinitely. -If an error is passed to fn's callback then 'callback' is called with the -error, otherwise it will never be called. - ---------------------------------------- - - -### waterfall(tasks, [callback]) - -Runs an array of functions in series, each passing their results to the next in -the array. However, if any of the functions pass an error to the callback, the -next function is not executed and the main callback is immediately called with -the error. - -__Arguments__ - -* tasks - An array of functions to run, each function is passed a - callback(err, result1, result2, ...) it must call on completion. The first - argument is an error (which can be null) and any further arguments will be - passed as arguments in order to the next task. -* callback(err, [results]) - An optional callback to run once all the functions - have completed. This will be passed the results of the last task's callback. - - - -__Example__ - -```js -async.waterfall([ - function(callback){ - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - callback(null, 'three'); - }, - function(arg1, callback){ - // arg1 now equals 'three' - callback(null, 'done'); - } -], function (err, result) { - // result now equals 'done' -}); -``` - ---------------------------------------- - -### compose(fn1, fn2...) - -Creates a function which is a composition of the passed asynchronous -functions. Each function consumes the return value of the function that -follows. Composing functions f(), g() and h() would produce the result of -f(g(h())), only this version uses callbacks to obtain the return values. - -Each function is executed with the `this` binding of the composed function. - -__Arguments__ - -* functions... - the asynchronous functions to compose - - -__Example__ - -```js -function add1(n, callback) { - setTimeout(function () { - callback(null, n + 1); - }, 10); -} - -function mul3(n, callback) { - setTimeout(function () { - callback(null, n * 3); - }, 10); -} - -var add1mul3 = async.compose(mul3, add1); - -add1mul3(4, function (err, result) { - // result now equals 15 -}); -``` - ---------------------------------------- - -### applyEach(fns, args..., callback) - -Applies the provided arguments to each function in the array, calling the -callback after all functions have completed. If you only provide the first -argument then it will return a function which lets you pass in the -arguments as if it were a single function call. - -__Arguments__ - -* fns - the asynchronous functions to all call with the same arguments -* args... - any number of separate arguments to pass to the function -* callback - the final argument should be the callback, called when all - functions have completed processing - - -__Example__ - -```js -async.applyEach([enableSearch, updateSchema], 'bucket', callback); - -// partial application example: -async.each( - buckets, - async.applyEach([enableSearch, updateSchema]), - callback -); -``` - ---------------------------------------- - - -### applyEachSeries(arr, iterator, callback) - -The same as applyEach only the functions are applied in series. - ---------------------------------------- - - -### queue(worker, concurrency) - -Creates a queue object with the specified concurrency. Tasks added to the -queue will be processed in parallel (up to the concurrency limit). If all -workers are in progress, the task is queued until one is available. Once -a worker has completed a task, the task's callback is called. - -__Arguments__ - -* worker(task, callback) - An asynchronous function for processing a queued - task, which must call its callback(err) argument when finished, with an - optional error as an argument. -* concurrency - An integer for determining how many worker functions should be - run in parallel. - -__Queue objects__ - -The queue object returned by this function has the following properties and -methods: - -* length() - a function returning the number of items waiting to be processed. -* concurrency - an integer for determining how many worker functions should be - run in parallel. This property can be changed after a queue is created to - alter the concurrency on-the-fly. -* push(task, [callback]) - add a new task to the queue, the callback is called - once the worker has finished processing the task. - instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list. -* unshift(task, [callback]) - add a new task to the front of the queue. -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued -* empty - a callback that is called when the last item from the queue is given to a worker -* drain - a callback that is called when the last item from the queue has returned from the worker - -__Example__ - -```js -// create a queue object with concurrency 2 - -var q = async.queue(function (task, callback) { - console.log('hello ' + task.name); - callback(); -}, 2); - - -// assign a callback -q.drain = function() { - console.log('all items have been processed'); -} - -// add some items to the queue - -q.push({name: 'foo'}, function (err) { - console.log('finished processing foo'); -}); -q.push({name: 'bar'}, function (err) { - console.log('finished processing bar'); -}); - -// add some items to the queue (batch-wise) - -q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) { - console.log('finished processing bar'); -}); - -// add some items to the front of the queue - -q.unshift({name: 'bar'}, function (err) { - console.log('finished processing bar'); -}); -``` - ---------------------------------------- - - -### cargo(worker, [payload]) - -Creates a cargo object with the specified payload. Tasks added to the -cargo will be processed altogether (up to the payload limit). If the -worker is in progress, the task is queued until it is available. Once -the worker has completed some tasks, each callback of those tasks is called. - -__Arguments__ - -* worker(tasks, callback) - An asynchronous function for processing an array of - queued tasks, which must call its callback(err) argument when finished, with - an optional error as an argument. -* payload - An optional integer for determining how many tasks should be - processed per round; if omitted, the default is unlimited. - -__Cargo objects__ - -The cargo object returned by this function has the following properties and -methods: - -* length() - a function returning the number of items waiting to be processed. -* payload - an integer for determining how many tasks should be - process per round. This property can be changed after a cargo is created to - alter the payload on-the-fly. -* push(task, [callback]) - add a new task to the queue, the callback is called - once the worker has finished processing the task. - instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list. -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued -* empty - a callback that is called when the last item from the queue is given to a worker -* drain - a callback that is called when the last item from the queue has returned from the worker - -__Example__ - -```js -// create a cargo object with payload 2 - -var cargo = async.cargo(function (tasks, callback) { - for(var i=0; i -### auto(tasks, [callback]) - -Determines the best order for running functions based on their requirements. -Each function can optionally depend on other functions being completed first, -and each function is run as soon as its requirements are satisfied. If any of -the functions pass an error to their callback, that function will not complete -(so any other functions depending on it will not run) and the main callback -will be called immediately with the error. Functions also receive an object -containing the results of functions which have completed so far. - -Note, all functions are called with a results object as a second argument, -so it is unsafe to pass functions in the tasks object which cannot handle the -extra argument. For example, this snippet of code: - -```js -async.auto({ - readData: async.apply(fs.readFile, 'data.txt', 'utf-8') -}, callback); -``` - -will have the effect of calling readFile with the results object as the last -argument, which will fail: - -```js -fs.readFile('data.txt', 'utf-8', cb, {}); -``` - -Instead, wrap the call to readFile in a function which does not forward the -results object: - -```js -async.auto({ - readData: function(cb, results){ - fs.readFile('data.txt', 'utf-8', cb); - } -}, callback); -``` - -__Arguments__ - -* tasks - An object literal containing named functions or an array of - requirements, with the function itself the last item in the array. The key - used for each function or array is used when specifying requirements. The - function receives two arguments: (1) a callback(err, result) which must be - called when finished, passing an error (which can be null) and the result of - the function's execution, and (2) a results object, containing the results of - the previously executed functions. -* callback(err, results) - An optional callback which is called when all the - tasks have been completed. The callback will receive an error as an argument - if any tasks pass an error to their callback. Results will always be passed - but if an error occurred, no other tasks will be performed, and the results - object will only contain partial results. - - -__Example__ - -```js -async.auto({ - get_data: function(callback){ - // async code to get some data - }, - make_folder: function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - }, - write_file: ['get_data', 'make_folder', function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - callback(null, filename); - }], - email_link: ['write_file', function(callback, results){ - // once the file is written let's email a link to it... - // results.write_file contains the filename returned by write_file. - }] -}); -``` - -This is a fairly trivial example, but to do this using the basic parallel and -series functions would look like this: - -```js -async.parallel([ - function(callback){ - // async code to get some data - }, - function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - } -], -function(err, results){ - async.series([ - function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - }, - function(callback){ - // once the file is written let's email a link to it... - } - ]); -}); -``` - -For a complicated series of async tasks using the auto function makes adding -new tasks much easier and makes the code more readable. - - ---------------------------------------- - - -### iterator(tasks) - -Creates an iterator function which calls the next function in the array, -returning a continuation to call the next one after that. It's also possible to -'peek' the next iterator by doing iterator.next(). - -This function is used internally by the async module but can be useful when -you want to manually control the flow of functions in series. - -__Arguments__ - -* tasks - An array of functions to run. - -__Example__ - -```js -var iterator = async.iterator([ - function(){ sys.p('one'); }, - function(){ sys.p('two'); }, - function(){ sys.p('three'); } -]); - -node> var iterator2 = iterator(); -'one' -node> var iterator3 = iterator2(); -'two' -node> iterator3(); -'three' -node> var nextfn = iterator2.next(); -node> nextfn(); -'three' -``` - ---------------------------------------- - - -### apply(function, arguments..) - -Creates a continuation function with some arguments already applied, a useful -shorthand when combined with other control flow functions. Any arguments -passed to the returned function are added to the arguments originally passed -to apply. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to automatically apply when the - continuation is called. - -__Example__ - -```js -// using apply - -async.parallel([ - async.apply(fs.writeFile, 'testfile1', 'test1'), - async.apply(fs.writeFile, 'testfile2', 'test2'), -]); - - -// the same process without using apply - -async.parallel([ - function(callback){ - fs.writeFile('testfile1', 'test1', callback); - }, - function(callback){ - fs.writeFile('testfile2', 'test2', callback); - } -]); -``` - -It's possible to pass any number of additional arguments when calling the -continuation: - -```js -node> var fn = async.apply(sys.puts, 'one'); -node> fn('two', 'three'); -one -two -three -``` - ---------------------------------------- - - -### nextTick(callback) - -Calls the callback on a later loop around the event loop. In node.js this just -calls process.nextTick, in the browser it falls back to setImmediate(callback) -if available, otherwise setTimeout(callback, 0), which means other higher priority -events may precede the execution of the callback. - -This is used internally for browser-compatibility purposes. - -__Arguments__ - -* callback - The function to call on a later loop around the event loop. - -__Example__ - -```js -var call_order = []; -async.nextTick(function(){ - call_order.push('two'); - // call_order now equals ['one','two'] -}); -call_order.push('one') -``` - - -### times(n, callback) - -Calls the callback n times and accumulates results in the same manner -you would use with async.map. - -__Arguments__ - -* n - The number of times to run the function. -* callback - The function to call n times. - -__Example__ - -```js -// Pretend this is some complicated async factory -var createUser = function(id, callback) { - callback(null, { - id: 'user' + id - }) -} -// generate 5 users -async.times(5, function(n, next){ - createUser(n, function(err, user) { - next(err, user) - }) -}, function(err, users) { - // we should now have 5 users -}); -``` - - -### timesSeries(n, callback) - -The same as times only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - - -## Utils - - -### memoize(fn, [hasher]) - -Caches the results of an async function. When creating a hash to store function -results against, the callback is omitted from the hash and an optional hash -function can be used. - -The cache of results is exposed as the `memo` property of the function returned -by `memoize`. - -__Arguments__ - -* fn - the function you to proxy and cache results from. -* hasher - an optional function for generating a custom hash for storing - results, it has all the arguments applied to it apart from the callback, and - must be synchronous. - -__Example__ - -```js -var slow_fn = function (name, callback) { - // do something - callback(null, result); -}; -var fn = async.memoize(slow_fn); - -// fn can now be used as if it were slow_fn -fn('some name', function () { - // callback -}); -``` - - -### unmemoize(fn) - -Undoes a memoized function, reverting it to the original, unmemoized -form. Comes handy in tests. - -__Arguments__ - -* fn - the memoized function - - -### log(function, arguments) - -Logs the result of an async function to the console. Only works in node.js or -in browsers that support console.log and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.log is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - -```js -var hello = function(name, callback){ - setTimeout(function(){ - callback(null, 'hello ' + name); - }, 1000); -}; -``` -```js -node> async.log(hello, 'world'); -'hello world' -``` - ---------------------------------------- - - -### dir(function, arguments) - -Logs the result of an async function to the console using console.dir to -display the properties of the resulting object. Only works in node.js or -in browsers that support console.dir and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.dir is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - -```js -var hello = function(name, callback){ - setTimeout(function(){ - callback(null, {hello: name}); - }, 1000); -}; -``` -```js -node> async.dir(hello, 'world'); -{hello: 'world'} -``` - ---------------------------------------- - - -### noConflict() - -Changes the value of async back to its original value, returning a reference to the -async object. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/component.json deleted file mode 100644 index bbb0115..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/component.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "async", - "repo": "caolan/async", - "description": "Higher-order functions and common patterns for asynchronous code", - "version": "0.1.23", - "keywords": [], - "dependencies": {}, - "development": {}, - "main": "lib/async.js", - "scripts": [ "lib/async.js" ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/lib/async.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/lib/async.js deleted file mode 100755 index 1eebb15..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/express3-handlebars/node_modules/async/lib/async.js +++ /dev/null @@ -1,958 +0,0 @@ -/*global setImmediate: false, setTimeout: false, console: false */ -(function () { - - var async = {}; - - // global on the server, window in the browser - var root, previous_async; - - root = this; - if (root != null) { - previous_async = root.async; - } - - async.noConflict = function () { - root.async = previous_async; - return async; - }; - - function only_once(fn) { - var called = false; - return function() { - if (called) throw new Error("Callback was already called."); - called = true; - fn.apply(root, arguments); - } - } - - //// cross-browser compatiblity functions //// - - var _each = function (arr, iterator) { - if (arr.forEach) { - return arr.forEach(iterator); - } - for (var i = 0; i < arr.length; i += 1) { - iterator(arr[i], i, arr); - } - }; - - var _map = function (arr, iterator) { - if (arr.map) { - return arr.map(iterator); - } - var results = []; - _each(arr, function (x, i, a) { - results.push(iterator(x, i, a)); - }); - return results; - }; - - var _reduce = function (arr, iterator, memo) { - if (arr.reduce) { - return arr.reduce(iterator, memo); - } - _each(arr, function (x, i, a) { - memo = iterator(memo, x, i, a); - }); - return memo; - }; - - var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; - }; - - //// exported async module functions //// - - //// nextTick implementation with browser-compatible fallback //// - if (typeof process === 'undefined' || !(process.nextTick)) { - if (typeof setImmediate === 'function') { - async.nextTick = function (fn) { - // not a direct alias for IE10 compatibility - setImmediate(fn); - }; - async.setImmediate = async.nextTick; - } - else { - async.nextTick = function (fn) { - setTimeout(fn, 0); - }; - async.setImmediate = async.nextTick; - } - } - else { - async.nextTick = process.nextTick; - if (typeof setImmediate !== 'undefined') { - async.setImmediate = function (fn) { - // not a direct alias for IE10 compatibility - setImmediate(fn); - }; - } - else { - async.setImmediate = async.nextTick; - } - } - - async.each = function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length) { - return callback(); - } - var completed = 0; - _each(arr, function (x) { - iterator(x, only_once(function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed >= arr.length) { - callback(null); - } - } - })); - }); - }; - async.forEach = async.each; - - async.eachSeries = function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length) { - return callback(); - } - var completed = 0; - var iterate = function () { - iterator(arr[completed], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed >= arr.length) { - callback(null); - } - else { - iterate(); - } - } - }); - }; - iterate(); - }; - async.forEachSeries = async.eachSeries; - - async.eachLimit = function (arr, limit, iterator, callback) { - var fn = _eachLimit(limit); - fn.apply(null, [arr, iterator, callback]); - }; - async.forEachLimit = async.eachLimit; - - var _eachLimit = function (limit) { - - return function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length || limit <= 0) { - return callback(); - } - var completed = 0; - var started = 0; - var running = 0; - - (function replenish () { - if (completed >= arr.length) { - return callback(); - } - - while (running < limit && started < arr.length) { - started += 1; - running += 1; - iterator(arr[started - 1], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - running -= 1; - if (completed >= arr.length) { - callback(); - } - else { - replenish(); - } - } - }); - } - })(); - }; - }; - - - var doParallel = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.each].concat(args)); - }; - }; - var doParallelLimit = function(limit, fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [_eachLimit(limit)].concat(args)); - }; - }; - var doSeries = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.eachSeries].concat(args)); - }; - }; - - - var _asyncMap = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (err, v) { - results[x.index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - }; - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - async.mapLimit = function (arr, limit, iterator, callback) { - return _mapLimit(limit)(arr, iterator, callback); - }; - - var _mapLimit = function(limit) { - return doParallelLimit(limit, _asyncMap); - }; - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.reduce = function (arr, memo, iterator, callback) { - async.eachSeries(arr, function (x, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - // inject alias - async.inject = async.reduce; - // foldl alias - async.foldl = async.reduce; - - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, function (x) { - return x; - }).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - // foldr alias - async.foldr = async.reduceRight; - - var _filter = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.filter = doParallel(_filter); - async.filterSeries = doSeries(_filter); - // select alias - async.select = async.filter; - async.selectSeries = async.filterSeries; - - var _reject = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (!v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.reject = doParallel(_reject); - async.rejectSeries = doSeries(_reject); - - var _detect = function (eachfn, arr, iterator, main_callback) { - eachfn(arr, function (x, callback) { - iterator(x, function (result) { - if (result) { - main_callback(x); - main_callback = function () {}; - } - else { - callback(); - } - }); - }, function (err) { - main_callback(); - }); - }; - async.detect = doParallel(_detect); - async.detectSeries = doSeries(_detect); - - async.some = function (arr, iterator, main_callback) { - async.each(arr, function (x, callback) { - iterator(x, function (v) { - if (v) { - main_callback(true); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(false); - }); - }; - // any alias - async.any = async.some; - - async.every = function (arr, iterator, main_callback) { - async.each(arr, function (x, callback) { - iterator(x, function (v) { - if (!v) { - main_callback(false); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(true); - }); - }; - // all alias - async.all = async.every; - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - var fn = function (left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var results = {}; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _each(listeners.slice(0), function (fn) { - fn(); - }); - }; - - addListener(function () { - if (_keys(results).length === keys.length) { - callback(null, results); - callback = function () {}; - } - }); - - _each(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - if (err) { - var safeResults = {}; - _each(_keys(results), function(rkey) { - safeResults[rkey] = results[rkey]; - }); - safeResults[k] = args; - callback(err, safeResults); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - results[k] = args; - async.setImmediate(taskComplete); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && results.hasOwnProperty(x)); - }, true) && !results.hasOwnProperty(k); - }; - if (ready()) { - task[task.length - 1](taskCallback, results); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback, results); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor !== Array) { - var err = new Error('First argument to waterfall must be an array of functions'); - return callback(err); - } - if (!tasks.length) { - return callback(); - } - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback.apply(null, arguments); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.setImmediate(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - var _parallel = function(eachfn, tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - eachfn.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - eachfn.each(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.parallel = function (tasks, callback) { - _parallel({ map: async.map, each: async.each }, tasks, callback); - }; - - async.parallelLimit = function(tasks, limit, callback) { - _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback); - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.eachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.doWhilst = function (iterator, test, callback) { - iterator(function (err) { - if (err) { - return callback(err); - } - if (test()) { - async.doWhilst(iterator, test, callback); - } - else { - callback(); - } - }); - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.doUntil = function (iterator, test, callback) { - iterator(function (err) { - if (err) { - return callback(err); - } - if (!test()) { - async.doUntil(iterator, test, callback); - } - else { - callback(); - } - }); - }; - - async.queue = function (worker, concurrency) { - if (concurrency === undefined) { - concurrency = 1; - } - function _insert(q, data, pos, callback) { - if(data.constructor !== Array) { - data = [data]; - } - _each(data, function(task) { - var item = { - data: task, - callback: typeof callback === 'function' ? callback : null - }; - - if (pos) { - q.tasks.unshift(item); - } else { - q.tasks.push(item); - } - - if (q.saturated && q.tasks.length === concurrency) { - q.saturated(); - } - async.setImmediate(q.process); - }); - } - - var workers = 0; - var q = { - tasks: [], - concurrency: concurrency, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - _insert(q, data, false, callback); - }, - unshift: function (data, callback) { - _insert(q, data, true, callback); - }, - process: function () { - if (workers < q.concurrency && q.tasks.length) { - var task = q.tasks.shift(); - if (q.empty && q.tasks.length === 0) { - q.empty(); - } - workers += 1; - var next = function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - if (q.drain && q.tasks.length + workers === 0) { - q.drain(); - } - q.process(); - }; - var cb = only_once(next); - worker(task.data, cb); - } - }, - length: function () { - return q.tasks.length; - }, - running: function () { - return workers; - } - }; - return q; - }; - - async.cargo = function (worker, payload) { - var working = false, - tasks = []; - - var cargo = { - tasks: tasks, - payload: payload, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - if(data.constructor !== Array) { - data = [data]; - } - _each(data, function(task) { - tasks.push({ - data: task, - callback: typeof callback === 'function' ? callback : null - }); - if (cargo.saturated && tasks.length === payload) { - cargo.saturated(); - } - }); - async.setImmediate(cargo.process); - }, - process: function process() { - if (working) return; - if (tasks.length === 0) { - if(cargo.drain) cargo.drain(); - return; - } - - var ts = typeof payload === 'number' - ? tasks.splice(0, payload) - : tasks.splice(0); - - var ds = _map(ts, function (task) { - return task.data; - }); - - if(cargo.empty) cargo.empty(); - working = true; - worker(ds, function () { - working = false; - - var args = arguments; - _each(ts, function (data) { - if (data.callback) { - data.callback.apply(null, args); - } - }); - - process(); - }); - }, - length: function () { - return tasks.length; - }, - running: function () { - return working; - } - }; - return cargo; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _each(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - var queues = {}; - hasher = hasher || function (x) { - return x; - }; - var memoized = function () { - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - var key = hasher.apply(null, args); - if (key in memo) { - callback.apply(null, memo[key]); - } - else if (key in queues) { - queues[key].push(callback); - } - else { - queues[key] = [callback]; - fn.apply(null, args.concat([function () { - memo[key] = arguments; - var q = queues[key]; - delete queues[key]; - for (var i = 0, l = q.length; i < l; i++) { - q[i].apply(null, arguments); - } - }])); - } - }; - memoized.memo = memo; - memoized.unmemoized = fn; - return memoized; - }; - - async.unmemoize = function (fn) { - return function () { - return (fn.unmemoized || fn).apply(null, arguments); - }; - }; - - async.times = function (count, iterator, callback) { - var counter = []; - for (var i = 0; i < count; i++) { - counter.push(i); - } - return async.map(counter, iterator, callback); - }; - - async.timesSeries = function (count, iterator, callback) { - var counter = []; - for (var i = 0; i < count; i++) { - counter.push(i); - } - return async.mapSeries(counter, iterator, callback); - }; - - async.compose = function (/* functions... */) { - var fns = Array.prototype.reverse.call(arguments); - return function () { - var that = this; - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - async.reduce(fns, args, function (newargs, fn, cb) { - fn.apply(that, newargs.concat([function () { - var err = arguments[0]; - var nextargs = Array.prototype.slice.call(arguments, 1); - cb(err, nextargs); - }])) - }, - function (err, results) { - callback.apply(that, [err].concat(results)); - }); - }; - }; - - var _applyEach = function (eachfn, fns /*args...*/) { - var go = function () { - var that = this; - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - return eachfn(fns, function (fn, cb) { - fn.apply(that, args.concat([cb])); - }, - callback); - }; - if (arguments.length > 2) { - var args = Array.prototype.slice.call(arguments, 2); - return go.apply(this, args); - } - else { - return go; - } - }; - async.applyEach = doParallel(_applyEach); - async.applyEachSeries = doSeries(_applyEach); - - async.forever = function (fn, callback) { - function next(err) { - if (err) { - if (callback) { - return callback(err); - } - throw err; - } - fn(next); - } - next(); - }; - - // AMD / RequireJS - if (typeof define !== 'undefined' && define.amd) { - define([], function () { - return async; - }); - } - // Node.js - else if (typeof module !== 'undefined' && module.exports) { - module.exports = async; - } - // included directly via '); - expect(encoded).to.equal('\\x3cscript\\x3ealert\\x281\\x29\\x3c\\x2fscript\\x3e'); - done(); - }); - - it('encodes \' characters', function (done) { - - var encoded = Hoek.escapeJavaScript('something(\'param\')'); - expect(encoded).to.equal('something\\x28\\x27param\\x27\\x29'); - done(); - }); - - it('encodes large unicode characters with the correct padding', function (done) { - - var encoded = Hoek.escapeJavaScript(String.fromCharCode(500) + String.fromCharCode(1000)); - expect(encoded).to.equal('\\u0500\\u1000'); - done(); - }); - - it('doesn\'t throw an exception when passed null', function (done) { - - var encoded = Hoek.escapeJavaScript(null); - expect(encoded).to.equal(''); - done(); - }); -}); - -describe('escapeHtml()', function () { - - it('encodes / characters', function (done) { - - var encoded = Hoek.escapeHtml(''); - expect(encoded).to.equal('<script>alert(1)</script>'); - done(); - }); - - it('encodes < and > as named characters', function (done) { - - var encoded = Hoek.escapeHtml(' -``` - -Or in node.js: - -``` -npm install node-uuid -``` - -```javascript -var uuid = require('node-uuid'); -``` - -Then create some ids ... - -```javascript -// Generate a v1 (time-based) id -uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' - -// Generate a v4 (random) id -uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1' -``` - -## API - -### uuid.v1([`options` [, `buffer` [, `offset`]]]) - -Generate and return a RFC4122 v1 (timestamp-based) UUID. - -* `options` - (Object) Optional uuid state to apply. Properties may include: - - * `node` - (Array) Node id as Array of 6 bytes (per 4.1.6). Default: Randomly generated ID. See note 1. - * `clockseq` - (Number between 0 - 0x3fff) RFC clock sequence. Default: An internally maintained clockseq is used. - * `msecs` - (Number | Date) Time in milliseconds since unix Epoch. Default: The current time is used. - * `nsecs` - (Number between 0-9999) additional time, in 100-nanosecond units. Ignored if `msecs` is unspecified. Default: internal uuid counter is used, as per 4.2.1.2. - -* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. -* `offset` - (Number) Starting index in `buffer` at which to begin writing. - -Returns `buffer`, if specified, otherwise the string form of the UUID - -Notes: - -1. The randomly generated node id is only guaranteed to stay constant for the lifetime of the current JS runtime. (Future versions of this module may use persistent storage mechanisms to extend this guarantee.) - -Example: Generate string UUID with fully-specified options - -```javascript -uuid.v1({ - node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab], - clockseq: 0x1234, - msecs: new Date('2011-11-01').getTime(), - nsecs: 5678 -}); // -> "710b962e-041c-11e1-9234-0123456789ab" -``` - -Example: In-place generation of two binary IDs - -```javascript -// Generate two ids in an array -var arr = new Array(32); // -> [] -uuid.v1(null, arr, 0); // -> [02 a2 ce 90 14 32 11 e1 85 58 0b 48 8e 4f c1 15] -uuid.v1(null, arr, 16); // -> [02 a2 ce 90 14 32 11 e1 85 58 0b 48 8e 4f c1 15 02 a3 1c b0 14 32 11 e1 85 58 0b 48 8e 4f c1 15] - -// Optionally use uuid.unparse() to get stringify the ids -uuid.unparse(buffer); // -> '02a2ce90-1432-11e1-8558-0b488e4fc115' -uuid.unparse(buffer, 16) // -> '02a31cb0-1432-11e1-8558-0b488e4fc115' -``` - -### uuid.v4([`options` [, `buffer` [, `offset`]]]) - -Generate and return a RFC4122 v4 UUID. - -* `options` - (Object) Optional uuid state to apply. Properties may include: - - * `random` - (Number[16]) Array of 16 numbers (0-255) to use in place of randomly generated values - * `rng` - (Function) Random # generator to use. Set to one of the built-in generators - `uuid.mathRNG` (all platforms), `uuid.nodeRNG` (node.js only), `uuid.whatwgRNG` (WebKit only) - or a custom function that returns an array[16] of byte values. - -* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. -* `offset` - (Number) Starting index in `buffer` at which to begin writing. - -Returns `buffer`, if specified, otherwise the string form of the UUID - -Example: Generate string UUID with fully-specified options - -```javascript -uuid.v4({ - random: [ - 0x10, 0x91, 0x56, 0xbe, 0xc4, 0xfb, 0xc1, 0xea, - 0x71, 0xb4, 0xef, 0xe1, 0x67, 0x1c, 0x58, 0x36 - ] -}); -// -> "109156be-c4fb-41ea-b1b4-efe1671c5836" -``` - -Example: Generate two IDs in a single buffer - -```javascript -var buffer = new Array(32); // (or 'new Buffer' in node.js) -uuid.v4(null, buffer, 0); -uuid.v4(null, buffer, 16); -``` - -### uuid.parse(id[, buffer[, offset]]) -### uuid.unparse(buffer[, offset]) - -Parse and unparse UUIDs - - * `id` - (String) UUID(-like) string - * `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. Default: A new Array or Buffer is used - * `offset` - (Number) Starting index in `buffer` at which to begin writing. Default: 0 - -Example parsing and unparsing a UUID string - -```javascript -var bytes = uuid.parse('797ff043-11eb-11e1-80d6-510998755d10'); // -> -var string = uuid.unparse(bytes); // -> '797ff043-11eb-11e1-80d6-510998755d10' -``` - -### uuid.noConflict() - -(Browsers only) Set `uuid` property back to it's previous value. - -Returns the node-uuid object. - -Example: - -```javascript -var myUuid = uuid.noConflict(); -myUuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' -``` - -## Deprecated APIs - -Support for the following v1.2 APIs is available in v1.3, but is deprecated and will be removed in the next major version. - -### uuid([format [, buffer [, offset]]]) - -uuid() has become uuid.v4(), and the `format` argument is now implicit in the `buffer` argument. (i.e. if you specify a buffer, the format is assumed to be binary). - -### uuid.BufferClass - -The class of container created when generating binary uuid data if no buffer argument is specified. This is expected to go away, with no replacement API. - -## Command Line Interface - -To use the executable, it's probably best to install this library globally. - -`npm install -g node-uuid` - -Usage: - -``` -USAGE: uuid [version] [options] - - -options: - ---help Display this message and exit -``` - -`version` must be an RFC4122 version that is supported by this library, which is currently version 1 and version 4 (denoted by "v1" and "v4", respectively). `version` defaults to version 4 when not supplied. - -### Examples - -``` -> uuid -3a91f950-dec8-4688-ba14-5b7bbfc7a563 -``` - -``` -> uuid v1 -9d0b43e0-7696-11e3-964b-250efa37a98e -``` - -``` -> uuid v4 -6790ac7c-24ac-4f98-8464-42f6d98a53ae -``` - -## Testing - -In node.js - -``` -npm test -``` - -In Browser - -``` -open test/test.html -``` - -### Benchmarking - -Requires node.js - -``` -npm install uuid uuid-js -node benchmark/benchmark.js -``` - -For a more complete discussion of node-uuid performance, please see the `benchmark/README.md` file, and the [benchmark wiki](https://github.com/broofa/node-uuid/wiki/Benchmark) - -For browser performance [checkout the JSPerf tests](http://jsperf.com/node-uuid-performance). - -## Release notes - -### 1.4.0 - -* Improved module context detection -* Removed public RNG functions - -### 1.3.2 - -* Improve tests and handling of v1() options (Issue #24) -* Expose RNG option to allow for perf testing with different generators - -### 1.3.0 - -* Support for version 1 ids, thanks to [@ctavan](https://github.com/ctavan)! -* Support for node.js crypto API -* De-emphasizing performance in favor of a) cryptographic quality PRNGs where available and b) more manageable code diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/README.md deleted file mode 100644 index aaeb2ea..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# node-uuid Benchmarks - -### Results - -To see the results of our benchmarks visit https://github.com/broofa/node-uuid/wiki/Benchmark - -### Run them yourself - -node-uuid comes with some benchmarks to measure performance of generating UUIDs. These can be run using node.js. node-uuid is being benchmarked against some other uuid modules, that are available through npm namely `uuid` and `uuid-js`. - -To prepare and run the benchmark issue; - -``` -npm install uuid uuid-js -node benchmark/benchmark.js -``` - -You'll see an output like this one: - -``` -# v4 -nodeuuid.v4(): 854700 uuids/second -nodeuuid.v4('binary'): 788643 uuids/second -nodeuuid.v4('binary', buffer): 1336898 uuids/second -uuid(): 479386 uuids/second -uuid('binary'): 582072 uuids/second -uuidjs.create(4): 312304 uuids/second - -# v1 -nodeuuid.v1(): 938086 uuids/second -nodeuuid.v1('binary'): 683060 uuids/second -nodeuuid.v1('binary', buffer): 1644736 uuids/second -uuidjs.create(1): 190621 uuids/second -``` - -* The `uuid()` entries are for Nikhil Marathe's [uuid module](https://bitbucket.org/nikhilm/uuidjs) which is a wrapper around the native libuuid library. -* The `uuidjs()` entries are for Patrick Negri's [uuid-js module](https://github.com/pnegri/uuid-js) which is a pure javascript implementation based on [UUID.js](https://github.com/LiosK/UUID.js) by LiosK. - -If you want to get more reliable results you can run the benchmark multiple times and write the output into a log file: - -``` -for i in {0..9}; do node benchmark/benchmark.js >> benchmark/bench_0.4.12.log; done; -``` - -If you're interested in how performance varies between different node versions, you can issue the above command multiple times. - -You can then use the shell script `bench.sh` provided in this directory to calculate the averages over all benchmark runs and draw a nice plot: - -``` -(cd benchmark/ && ./bench.sh) -``` - -This assumes you have [gnuplot](http://www.gnuplot.info/) and [ImageMagick](http://www.imagemagick.org/) installed. You'll find a nice `bench.png` graph in the `benchmark/` directory then. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu deleted file mode 100644 index a342fbb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu +++ /dev/null @@ -1,174 +0,0 @@ -#!/opt/local/bin/gnuplot -persist -# -# -# G N U P L O T -# Version 4.4 patchlevel 3 -# last modified March 2011 -# System: Darwin 10.8.0 -# -# Copyright (C) 1986-1993, 1998, 2004, 2007-2010 -# Thomas Williams, Colin Kelley and many others -# -# gnuplot home: http://www.gnuplot.info -# faq, bugs, etc: type "help seeking-assistance" -# immediate help: type "help" -# plot window: hit 'h' -set terminal postscript eps noenhanced defaultplex \ - leveldefault color colortext \ - solid linewidth 1.2 butt noclip \ - palfuncparam 2000,0.003 \ - "Helvetica" 14 -set output 'bench.eps' -unset clip points -set clip one -unset clip two -set bar 1.000000 front -set border 31 front linetype -1 linewidth 1.000 -set xdata -set ydata -set zdata -set x2data -set y2data -set timefmt x "%d/%m/%y,%H:%M" -set timefmt y "%d/%m/%y,%H:%M" -set timefmt z "%d/%m/%y,%H:%M" -set timefmt x2 "%d/%m/%y,%H:%M" -set timefmt y2 "%d/%m/%y,%H:%M" -set timefmt cb "%d/%m/%y,%H:%M" -set boxwidth -set style fill empty border -set style rectangle back fc lt -3 fillstyle solid 1.00 border lt -1 -set style circle radius graph 0.02, first 0, 0 -set dummy x,y -set format x "% g" -set format y "% g" -set format x2 "% g" -set format y2 "% g" -set format z "% g" -set format cb "% g" -set angles radians -unset grid -set key title "" -set key outside left top horizontal Right noreverse enhanced autotitles columnhead nobox -set key noinvert samplen 4 spacing 1 width 0 height 0 -set key maxcolumns 2 maxrows 0 -unset label -unset arrow -set style increment default -unset style line -set style line 1 linetype 1 linewidth 2.000 pointtype 1 pointsize default pointinterval 0 -unset style arrow -set style histogram clustered gap 2 title offset character 0, 0, 0 -unset logscale -set offsets graph 0.05, 0.15, 0, 0 -set pointsize 1.5 -set pointintervalbox 1 -set encoding default -unset polar -unset parametric -unset decimalsign -set view 60, 30, 1, 1 -set samples 100, 100 -set isosamples 10, 10 -set surface -unset contour -set clabel '%8.3g' -set mapping cartesian -set datafile separator whitespace -unset hidden3d -set cntrparam order 4 -set cntrparam linear -set cntrparam levels auto 5 -set cntrparam points 5 -set size ratio 0 1,1 -set origin 0,0 -set style data points -set style function lines -set xzeroaxis linetype -2 linewidth 1.000 -set yzeroaxis linetype -2 linewidth 1.000 -set zzeroaxis linetype -2 linewidth 1.000 -set x2zeroaxis linetype -2 linewidth 1.000 -set y2zeroaxis linetype -2 linewidth 1.000 -set ticslevel 0.5 -set mxtics default -set mytics default -set mztics default -set mx2tics default -set my2tics default -set mcbtics default -set xtics border in scale 1,0.5 mirror norotate offset character 0, 0, 0 -set xtics norangelimit -set xtics () -set ytics border in scale 1,0.5 mirror norotate offset character 0, 0, 0 -set ytics autofreq norangelimit -set ztics border in scale 1,0.5 nomirror norotate offset character 0, 0, 0 -set ztics autofreq norangelimit -set nox2tics -set noy2tics -set cbtics border in scale 1,0.5 mirror norotate offset character 0, 0, 0 -set cbtics autofreq norangelimit -set title "" -set title offset character 0, 0, 0 font "" norotate -set timestamp bottom -set timestamp "" -set timestamp offset character 0, 0, 0 font "" norotate -set rrange [ * : * ] noreverse nowriteback # (currently [8.98847e+307:-8.98847e+307] ) -set autoscale rfixmin -set autoscale rfixmax -set trange [ * : * ] noreverse nowriteback # (currently [-5.00000:5.00000] ) -set autoscale tfixmin -set autoscale tfixmax -set urange [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] ) -set autoscale ufixmin -set autoscale ufixmax -set vrange [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] ) -set autoscale vfixmin -set autoscale vfixmax -set xlabel "" -set xlabel offset character 0, 0, 0 font "" textcolor lt -1 norotate -set x2label "" -set x2label offset character 0, 0, 0 font "" textcolor lt -1 norotate -set xrange [ * : * ] noreverse nowriteback # (currently [-0.150000:3.15000] ) -set autoscale xfixmin -set autoscale xfixmax -set x2range [ * : * ] noreverse nowriteback # (currently [0.00000:3.00000] ) -set autoscale x2fixmin -set autoscale x2fixmax -set ylabel "" -set ylabel offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270 -set y2label "" -set y2label offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270 -set yrange [ 0.00000 : 1.90000e+06 ] noreverse nowriteback # (currently [:] ) -set autoscale yfixmin -set autoscale yfixmax -set y2range [ * : * ] noreverse nowriteback # (currently [0.00000:1.90000e+06] ) -set autoscale y2fixmin -set autoscale y2fixmax -set zlabel "" -set zlabel offset character 0, 0, 0 font "" textcolor lt -1 norotate -set zrange [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] ) -set autoscale zfixmin -set autoscale zfixmax -set cblabel "" -set cblabel offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270 -set cbrange [ * : * ] noreverse nowriteback # (currently [8.98847e+307:-8.98847e+307] ) -set autoscale cbfixmin -set autoscale cbfixmax -set zero 1e-08 -set lmargin -1 -set bmargin -1 -set rmargin -1 -set tmargin -1 -set pm3d explicit at s -set pm3d scansautomatic -set pm3d interpolate 1,1 flush begin noftriangles nohidden3d corners2color mean -set palette positive nops_allcF maxcolors 0 gamma 1.5 color model RGB -set palette rgbformulae 7, 5, 15 -set colorbox default -set colorbox vertical origin screen 0.9, 0.2, 0 size screen 0.05, 0.6, 0 front bdefault -set loadpath -set fontpath -set fit noerrorvariables -GNUTERM = "aqua" -plot 'bench_results.txt' using 2:xticlabel(1) w lp lw 2, '' using 3:xticlabel(1) w lp lw 2, '' using 4:xticlabel(1) w lp lw 2, '' using 5:xticlabel(1) w lp lw 2, '' using 6:xticlabel(1) w lp lw 2, '' using 7:xticlabel(1) w lp lw 2, '' using 8:xticlabel(1) w lp lw 2, '' using 9:xticlabel(1) w lp lw 2 -# EOF diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/bench.sh b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/bench.sh deleted file mode 100755 index d870a0c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/bench.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -# for a given node version run: -# for i in {0..9}; do node benchmark.js >> bench_0.6.2.log; done; - -PATTERNS=('nodeuuid.v1()' "nodeuuid.v1('binary'," 'nodeuuid.v4()' "nodeuuid.v4('binary'," "uuid()" "uuid('binary')" 'uuidjs.create(1)' 'uuidjs.create(4)' '140byte') -FILES=(node_uuid_v1_string node_uuid_v1_buf node_uuid_v4_string node_uuid_v4_buf libuuid_v4_string libuuid_v4_binary uuidjs_v1_string uuidjs_v4_string 140byte_es) -INDICES=(2 3 2 3 2 2 2 2 2) -VERSIONS=$( ls bench_*.log | sed -e 's/^bench_\([0-9\.]*\)\.log/\1/' | tr "\\n" " " ) -TMPJOIN="tmp_join" -OUTPUT="bench_results.txt" - -for I in ${!FILES[*]}; do - F=${FILES[$I]} - P=${PATTERNS[$I]} - INDEX=${INDICES[$I]} - echo "version $F" > $F - for V in $VERSIONS; do - (VAL=$( grep "$P" bench_$V.log | LC_ALL=en_US awk '{ sum += $'$INDEX' } END { print sum/NR }' ); echo $V $VAL) >> $F - done - if [ $I == 0 ]; then - cat $F > $TMPJOIN - else - join $TMPJOIN $F > $OUTPUT - cp $OUTPUT $TMPJOIN - fi - rm $F -done - -rm $TMPJOIN - -gnuplot bench.gnu -convert -density 200 -resize 800x560 -flatten bench.eps bench.png -rm bench.eps diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c deleted file mode 100644 index dbfc75f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c +++ /dev/null @@ -1,34 +0,0 @@ -/* -Test performance of native C UUID generation - -To Compile: cc -luuid benchmark-native.c -o benchmark-native -*/ - -#include -#include -#include -#include - -int main() { - uuid_t myid; - char buf[36+1]; - int i; - struct timeval t; - double start, finish; - - gettimeofday(&t, NULL); - start = t.tv_sec + t.tv_usec/1e6; - - int n = 2e5; - for (i = 0; i < n; i++) { - uuid_generate(myid); - uuid_unparse(myid, buf); - } - - gettimeofday(&t, NULL); - finish = t.tv_sec + t.tv_usec/1e6; - double dur = finish - start; - - printf("%d uuids/sec", (int)(n/dur)); - return 0; -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js deleted file mode 100644 index 40e6efb..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js +++ /dev/null @@ -1,84 +0,0 @@ -try { - var nodeuuid = require('../uuid'); -} catch (e) { - console.error('node-uuid require failed - skipping tests'); -} - -try { - var uuid = require('uuid'); -} catch (e) { - console.error('uuid require failed - skipping tests'); -} - -try { - var uuidjs = require('uuid-js'); -} catch (e) { - console.error('uuid-js require failed - skipping tests'); -} - -var N = 5e5; - -function rate(msg, t) { - console.log(msg + ': ' + - (N / (Date.now() - t) * 1e3 | 0) + - ' uuids/second'); -} - -console.log('# v4'); - -// node-uuid - string form -if (nodeuuid) { - for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4(); - rate('nodeuuid.v4() - using node.js crypto RNG', t); - - for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4({rng: nodeuuid.mathRNG}); - rate('nodeuuid.v4() - using Math.random() RNG', t); - - for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4('binary'); - rate('nodeuuid.v4(\'binary\')', t); - - var buffer = new nodeuuid.BufferClass(16); - for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4('binary', buffer); - rate('nodeuuid.v4(\'binary\', buffer)', t); -} - -// libuuid - string form -if (uuid) { - for (var i = 0, t = Date.now(); i < N; i++) uuid(); - rate('uuid()', t); - - for (var i = 0, t = Date.now(); i < N; i++) uuid('binary'); - rate('uuid(\'binary\')', t); -} - -// uuid-js - string form -if (uuidjs) { - for (var i = 0, t = Date.now(); i < N; i++) uuidjs.create(4); - rate('uuidjs.create(4)', t); -} - -// 140byte.es -for (var i = 0, t = Date.now(); i < N; i++) 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(s,r){r=Math.random()*16|0;return (s=='x'?r:r&0x3|0x8).toString(16)}); -rate('140byte.es_v4', t); - -console.log(''); -console.log('# v1'); - -// node-uuid - v1 string form -if (nodeuuid) { - for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1(); - rate('nodeuuid.v1()', t); - - for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1('binary'); - rate('nodeuuid.v1(\'binary\')', t); - - var buffer = new nodeuuid.BufferClass(16); - for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1('binary', buffer); - rate('nodeuuid.v1(\'binary\', buffer)', t); -} - -// uuid-js - v1 string form -if (uuidjs) { - for (var i = 0, t = Date.now(); i < N; i++) uuidjs.create(1); - rate('uuidjs.create(1)', t); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/bin/uuid b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/bin/uuid deleted file mode 100755 index f732e99..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/bin/uuid +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env node - -var path = require('path'); -var uuid = require(path.join(__dirname, '..')); - -var arg = process.argv[2]; - -if ('--help' === arg) { - console.log('\n USAGE: uuid [version] [options]\n\n'); - console.log(' options:\n'); - console.log(' --help Display this message and exit\n'); - process.exit(0); -} - -if (null == arg) { - console.log(uuid()); - process.exit(0); -} - -if ('v1' !== arg && 'v4' !== arg) { - console.error('Version must be RFC4122 version 1 or version 4, denoted as "v1" or "v4"'); - process.exit(1); -} - -console.log(uuid[arg]()); -process.exit(0); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/bower.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/bower.json deleted file mode 100644 index 1656dc8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/bower.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "node-uuid", - "version": "1.4.3", - "homepage": "https://github.com/broofa/node-uuid", - "authors": [ - "Robert Kieffer " - ], - "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.", - "main": "uuid.js", - "keywords": [ - "uuid", - "gid", - "rfc4122" - ], - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/component.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/component.json deleted file mode 100644 index 149f84b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/component.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "node-uuid", - "repo": "broofa/node-uuid", - "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.", - "version": "1.4.3", - "author": "Robert Kieffer ", - "contributors": [ - {"name": "Christoph Tavan ", "github": "https://github.com/ctavan"} - ], - "keywords": ["uuid", "guid", "rfc4122"], - "dependencies": {}, - "development": {}, - "main": "uuid.js", - "scripts": [ - "uuid.js" - ], - "license": "MIT" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/package.json deleted file mode 100644 index a273d8f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "node-uuid", - "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.", - "url": "http://github.com/broofa/node-uuid", - "keywords": [ - "uuid", - "guid", - "rfc4122" - ], - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com" - }, - "contributors": [ - { - "name": "Christoph Tavan", - "email": "dev@tavan.de" - } - ], - "bin": { - "uuid": "./bin/uuid" - }, - "scripts": { - "test": "node test/test.js" - }, - "lib": ".", - "main": "./uuid.js", - "repository": { - "type": "git", - "url": "https://github.com/broofa/node-uuid.git" - }, - "version": "1.4.3", - "licenses": [ - { - "type": "MIT", - "url": "https://raw.github.com/broofa/node-uuid/master/LICENSE.md" - } - ], - "gitHead": "886463c660a095dfebfa69603921a8d156fdb12c", - "bugs": { - "url": "https://github.com/broofa/node-uuid/issues" - }, - "homepage": "https://github.com/broofa/node-uuid", - "_id": "node-uuid@1.4.3", - "_shasum": "319bb7a56e7cb63f00b5c0cd7851cd4b4ddf1df9", - "_from": "node-uuid@>=1.4.0 <1.5.0", - "_npmVersion": "1.4.28", - "_npmUser": { - "name": "broofa", - "email": "robert@broofa.com" - }, - "maintainers": [ - { - "name": "broofa", - "email": "robert@broofa.com" - } - ], - "dist": { - "shasum": "319bb7a56e7cb63f00b5c0cd7851cd4b4ddf1df9", - "tarball": "http://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/test/compare_v1.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/test/compare_v1.js deleted file mode 100644 index 05af822..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/test/compare_v1.js +++ /dev/null @@ -1,63 +0,0 @@ -var assert = require('assert'), - nodeuuid = require('../uuid'), - uuidjs = require('uuid-js'), - libuuid = require('uuid').generate, - util = require('util'), - exec = require('child_process').exec, - os = require('os'); - -// On Mac Os X / macports there's only the ossp-uuid package that provides uuid -// On Linux there's uuid-runtime which provides uuidgen -var uuidCmd = os.type() === 'Darwin' ? 'uuid -1' : 'uuidgen -t'; - -function compare(ids) { - console.log(ids); - for (var i = 0; i < ids.length; i++) { - var id = ids[i].split('-'); - id = [id[2], id[1], id[0]].join(''); - ids[i] = id; - } - var sorted = ([].concat(ids)).sort(); - - if (sorted.toString() !== ids.toString()) { - console.log('Warning: sorted !== ids'); - } else { - console.log('everything in order!'); - } -} - -// Test time order of v1 uuids -var ids = []; -while (ids.length < 10e3) ids.push(nodeuuid.v1()); - -var max = 10; -console.log('node-uuid:'); -ids = []; -for (var i = 0; i < max; i++) ids.push(nodeuuid.v1()); -compare(ids); - -console.log(''); -console.log('uuidjs:'); -ids = []; -for (var i = 0; i < max; i++) ids.push(uuidjs.create(1).toString()); -compare(ids); - -console.log(''); -console.log('libuuid:'); -ids = []; -var count = 0; -var last = function() { - compare(ids); -} -var cb = function(err, stdout, stderr) { - ids.push(stdout.substring(0, stdout.length-1)); - count++; - if (count < max) { - return next(); - } - last(); -}; -var next = function() { - exec(uuidCmd, cb); -}; -next(); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/test/test.html b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/test/test.html deleted file mode 100644 index d80326e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/test/test.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/test/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/test/test.js deleted file mode 100644 index 2469225..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/test/test.js +++ /dev/null @@ -1,228 +0,0 @@ -if (!this.uuid) { - // node.js - uuid = require('../uuid'); -} - -// -// x-platform log/assert shims -// - -function _log(msg, type) { - type = type || 'log'; - - if (typeof(document) != 'undefined') { - document.write('
' + msg.replace(/\n/g, '
') + '
'); - } - if (typeof(console) != 'undefined') { - var color = { - log: '\033[39m', - warn: '\033[33m', - error: '\033[31m' - }; - console[type](color[type] + msg + color.log); - } -} - -function log(msg) {_log(msg, 'log');} -function warn(msg) {_log(msg, 'warn');} -function error(msg) {_log(msg, 'error');} - -function assert(res, msg) { - if (!res) { - error('FAIL: ' + msg); - } else { - log('Pass: ' + msg); - } -} - -// -// Unit tests -// - -// Verify ordering of v1 ids created with explicit times -var TIME = 1321644961388; // 2011-11-18 11:36:01.388-08:00 - -function compare(name, ids) { - ids = ids.map(function(id) { - return id.split('-').reverse().join('-'); - }).sort(); - var sorted = ([].concat(ids)).sort(); - - assert(sorted.toString() == ids.toString(), name + ' have expected order'); -} - -// Verify ordering of v1 ids created using default behavior -compare('uuids with current time', [ - uuid.v1(), - uuid.v1(), - uuid.v1(), - uuid.v1(), - uuid.v1() -]); - -// Verify ordering of v1 ids created with explicit times -compare('uuids with time option', [ - uuid.v1({msecs: TIME - 10*3600*1000}), - uuid.v1({msecs: TIME - 1}), - uuid.v1({msecs: TIME}), - uuid.v1({msecs: TIME + 1}), - uuid.v1({msecs: TIME + 28*24*3600*1000}) -]); - -assert( - uuid.v1({msecs: TIME}) != uuid.v1({msecs: TIME}), - 'IDs created at same msec are different' -); - -// Verify throw if too many ids created -var thrown = false; -try { - uuid.v1({msecs: TIME, nsecs: 10000}); -} catch (e) { - thrown = true; -} -assert(thrown, 'Exception thrown when > 10K ids created in 1 ms'); - -// Verify clock regression bumps clockseq -var uidt = uuid.v1({msecs: TIME}); -var uidtb = uuid.v1({msecs: TIME - 1}); -assert( - parseInt(uidtb.split('-')[3], 16) - parseInt(uidt.split('-')[3], 16) === 1, - 'Clock regression by msec increments the clockseq' -); - -// Verify clock regression bumps clockseq -var uidtn = uuid.v1({msecs: TIME, nsecs: 10}); -var uidtnb = uuid.v1({msecs: TIME, nsecs: 9}); -assert( - parseInt(uidtnb.split('-')[3], 16) - parseInt(uidtn.split('-')[3], 16) === 1, - 'Clock regression by nsec increments the clockseq' -); - -// Verify explicit options produce expected id -var id = uuid.v1({ - msecs: 1321651533573, - nsecs: 5432, - clockseq: 0x385c, - node: [ 0x61, 0xcd, 0x3c, 0xbb, 0x32, 0x10 ] -}); -assert(id == 'd9428888-122b-11e1-b85c-61cd3cbb3210', 'Explicit options produce expected id'); - -// Verify adjacent ids across a msec boundary are 1 time unit apart -var u0 = uuid.v1({msecs: TIME, nsecs: 9999}); -var u1 = uuid.v1({msecs: TIME + 1, nsecs: 0}); - -var before = u0.split('-')[0], after = u1.split('-')[0]; -var dt = parseInt(after, 16) - parseInt(before, 16); -assert(dt === 1, 'Ids spanning 1ms boundary are 100ns apart'); - -// -// Test parse/unparse -// - -id = '00112233445566778899aabbccddeeff'; -assert(uuid.unparse(uuid.parse(id.substr(0,10))) == - '00112233-4400-0000-0000-000000000000', 'Short parse'); -assert(uuid.unparse(uuid.parse('(this is the uuid -> ' + id + id)) == - '00112233-4455-6677-8899-aabbccddeeff', 'Dirty parse'); - -// -// Perf tests -// - -var generators = { - v1: uuid.v1, - v4: uuid.v4 -}; - -var UUID_FORMAT = { - v1: /[0-9a-f]{8}-[0-9a-f]{4}-1[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i, - v4: /[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i -}; - -var N = 1e4; - -// Get %'age an actual value differs from the ideal value -function divergence(actual, ideal) { - return Math.round(100*100*(actual - ideal)/ideal)/100; -} - -function rate(msg, t) { - log(msg + ': ' + (N / (Date.now() - t) * 1e3 | 0) + ' uuids\/second'); -} - -for (var version in generators) { - var counts = {}, max = 0; - var generator = generators[version]; - var format = UUID_FORMAT[version]; - - log('\nSanity check ' + N + ' ' + version + ' uuids'); - for (var i = 0, ok = 0; i < N; i++) { - id = generator(); - if (!format.test(id)) { - throw Error(id + ' is not a valid UUID string'); - } - - if (id != uuid.unparse(uuid.parse(id))) { - assert(fail, id + ' is not a valid id'); - } - - // Count digits for our randomness check - if (version == 'v4') { - var digits = id.replace(/-/g, '').split(''); - for (var j = digits.length-1; j >= 0; j--) { - var c = digits[j]; - max = Math.max(max, counts[c] = (counts[c] || 0) + 1); - } - } - } - - // Check randomness for v4 UUIDs - if (version == 'v4') { - // Limit that we get worried about randomness. (Purely empirical choice, this!) - var limit = 2*100*Math.sqrt(1/N); - - log('\nChecking v4 randomness. Distribution of Hex Digits (% deviation from ideal)'); - - for (var i = 0; i < 16; i++) { - var c = i.toString(16); - var bar = '', n = counts[c], p = Math.round(n/max*100|0); - - // 1-3,5-8, and D-F: 1:16 odds over 30 digits - var ideal = N*30/16; - if (i == 4) { - // 4: 1:1 odds on 1 digit, plus 1:16 odds on 30 digits - ideal = N*(1 + 30/16); - } else if (i >= 8 && i <= 11) { - // 8-B: 1:4 odds on 1 digit, plus 1:16 odds on 30 digits - ideal = N*(1/4 + 30/16); - } else { - // Otherwise: 1:16 odds on 30 digits - ideal = N*30/16; - } - var d = divergence(n, ideal); - - // Draw bar using UTF squares (just for grins) - var s = n/max*50 | 0; - while (s--) bar += '='; - - assert(Math.abs(d) < limit, c + ' |' + bar + '| ' + counts[c] + ' (' + d + '% < ' + limit + '%)'); - } - } -} - -// Perf tests -for (var version in generators) { - log('\nPerformance testing ' + version + ' UUIDs'); - var generator = generators[version]; - var buf = new uuid.BufferClass(16); - - for (var i = 0, t = Date.now(); i < N; i++) generator(); - rate('uuid.' + version + '()', t); - - for (var i = 0, t = Date.now(); i < N; i++) generator('binary'); - rate('uuid.' + version + '(\'binary\')', t); - - for (var i = 0, t = Date.now(); i < N; i++) generator('binary', buf); - rate('uuid.' + version + '(\'binary\', buffer)', t); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/uuid.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/uuid.js deleted file mode 100644 index 0a61769..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/node-uuid/uuid.js +++ /dev/null @@ -1,247 +0,0 @@ -// uuid.js -// -// Copyright (c) 2010-2012 Robert Kieffer -// MIT License - http://opensource.org/licenses/mit-license.php - -(function() { - var _global = this; - - // Unique ID creation requires a high quality random # generator. We feature - // detect to determine the best RNG source, normalizing to a function that - // returns 128-bits of randomness, since that's what's usually required - var _rng; - - // Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html - // - // Moderately fast, high quality - if (typeof(_global.require) == 'function') { - try { - var _rb = _global.require('crypto').randomBytes; - _rng = _rb && function() {return _rb(16);}; - } catch(e) {} - } - - if (!_rng && _global.crypto && crypto.getRandomValues) { - // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto - // - // Moderately fast, high quality - var _rnds8 = new Uint8Array(16); - _rng = function whatwgRNG() { - crypto.getRandomValues(_rnds8); - return _rnds8; - }; - } - - if (!_rng) { - // Math.random()-based (RNG) - // - // If all else fails, use Math.random(). It's fast, but is of unspecified - // quality. - var _rnds = new Array(16); - _rng = function() { - for (var i = 0, r; i < 16; i++) { - if ((i & 0x03) === 0) r = Math.random() * 0x100000000; - _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff; - } - - return _rnds; - }; - } - - // Buffer class to use - var BufferClass = typeof(_global.Buffer) == 'function' ? _global.Buffer : Array; - - // Maps for number <-> hex string conversion - var _byteToHex = []; - var _hexToByte = {}; - for (var i = 0; i < 256; i++) { - _byteToHex[i] = (i + 0x100).toString(16).substr(1); - _hexToByte[_byteToHex[i]] = i; - } - - // **`parse()` - Parse a UUID into it's component bytes** - function parse(s, buf, offset) { - var i = (buf && offset) || 0, ii = 0; - - buf = buf || []; - s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) { - if (ii < 16) { // Don't overflow! - buf[i + ii++] = _hexToByte[oct]; - } - }); - - // Zero out remaining bytes if string was short - while (ii < 16) { - buf[i + ii++] = 0; - } - - return buf; - } - - // **`unparse()` - Convert UUID byte array (ala parse()) into a string** - function unparse(buf, offset) { - var i = offset || 0, bth = _byteToHex; - return bth[buf[i++]] + bth[buf[i++]] + - bth[buf[i++]] + bth[buf[i++]] + '-' + - bth[buf[i++]] + bth[buf[i++]] + '-' + - bth[buf[i++]] + bth[buf[i++]] + '-' + - bth[buf[i++]] + bth[buf[i++]] + '-' + - bth[buf[i++]] + bth[buf[i++]] + - bth[buf[i++]] + bth[buf[i++]] + - bth[buf[i++]] + bth[buf[i++]]; - } - - // **`v1()` - Generate time-based UUID** - // - // Inspired by https://github.com/LiosK/UUID.js - // and http://docs.python.org/library/uuid.html - - // random #'s we need to init node and clockseq - var _seedBytes = _rng(); - - // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) - var _nodeId = [ - _seedBytes[0] | 0x01, - _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5] - ]; - - // Per 4.2.2, randomize (14 bit) clockseq - var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff; - - // Previous uuid creation time - var _lastMSecs = 0, _lastNSecs = 0; - - // See https://github.com/broofa/node-uuid for API details - function v1(options, buf, offset) { - var i = buf && offset || 0; - var b = buf || []; - - options = options || {}; - - var clockseq = options.clockseq != null ? options.clockseq : _clockseq; - - // UUID timestamps are 100 nano-second units since the Gregorian epoch, - // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so - // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' - // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. - var msecs = options.msecs != null ? options.msecs : new Date().getTime(); - - // Per 4.2.1.2, use count of uuid's generated during the current clock - // cycle to simulate higher resolution clock - var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1; - - // Time since last uuid creation (in msecs) - var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000; - - // Per 4.2.1.2, Bump clockseq on clock regression - if (dt < 0 && options.clockseq == null) { - clockseq = clockseq + 1 & 0x3fff; - } - - // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new - // time interval - if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) { - nsecs = 0; - } - - // Per 4.2.1.2 Throw error if too many uuids are requested - if (nsecs >= 10000) { - throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); - } - - _lastMSecs = msecs; - _lastNSecs = nsecs; - _clockseq = clockseq; - - // Per 4.1.4 - Convert from unix epoch to Gregorian epoch - msecs += 12219292800000; - - // `time_low` - var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; - b[i++] = tl >>> 24 & 0xff; - b[i++] = tl >>> 16 & 0xff; - b[i++] = tl >>> 8 & 0xff; - b[i++] = tl & 0xff; - - // `time_mid` - var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff; - b[i++] = tmh >>> 8 & 0xff; - b[i++] = tmh & 0xff; - - // `time_high_and_version` - b[i++] = tmh >>> 24 & 0xf | 0x10; // include version - b[i++] = tmh >>> 16 & 0xff; - - // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) - b[i++] = clockseq >>> 8 | 0x80; - - // `clock_seq_low` - b[i++] = clockseq & 0xff; - - // `node` - var node = options.node || _nodeId; - for (var n = 0; n < 6; n++) { - b[i + n] = node[n]; - } - - return buf ? buf : unparse(b); - } - - // **`v4()` - Generate random UUID** - - // See https://github.com/broofa/node-uuid for API details - function v4(options, buf, offset) { - // Deprecated - 'format' argument, as supported in v1.2 - var i = buf && offset || 0; - - if (typeof(options) == 'string') { - buf = options == 'binary' ? new BufferClass(16) : null; - options = null; - } - options = options || {}; - - var rnds = options.random || (options.rng || _rng)(); - - // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` - rnds[6] = (rnds[6] & 0x0f) | 0x40; - rnds[8] = (rnds[8] & 0x3f) | 0x80; - - // Copy bytes to buffer, if provided - if (buf) { - for (var ii = 0; ii < 16; ii++) { - buf[i + ii] = rnds[ii]; - } - } - - return buf || unparse(rnds); - } - - // Export public API - var uuid = v4; - uuid.v1 = v1; - uuid.v4 = v4; - uuid.parse = parse; - uuid.unparse = unparse; - uuid.BufferClass = BufferClass; - - if (typeof(module) != 'undefined' && module.exports) { - // Publish as node.js module - module.exports = uuid; - } else if (typeof define === 'function' && define.amd) { - // Publish as AMD module - define(function() {return uuid;}); - - - } else { - // Publish as global (in browsers) - var _previousRoot = _global.uuid; - - // **`noConflict()` - (browser only) to reset global 'uuid' var** - uuid.noConflict = function() { - _global.uuid = _previousRoot; - return uuid; - }; - - _global.uuid = uuid; - } -}).call(this); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/LICENSE deleted file mode 100644 index a4a9aee..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/README.md deleted file mode 100644 index 34c4a85..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/README.md +++ /dev/null @@ -1,4 +0,0 @@ -oauth-sign -========== - -OAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/index.js deleted file mode 100644 index a587541..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/index.js +++ /dev/null @@ -1,134 +0,0 @@ -var crypto = require('crypto') - , qs = require('querystring') - ; - -function sha1 (key, body) { - return crypto.createHmac('sha1', key).update(body).digest('base64') -} - -function rsa (key, body) { - return crypto.createSign("RSA-SHA1").update(body).sign(key, 'base64'); -} - -function rfc3986 (str) { - return encodeURIComponent(str) - .replace(/!/g,'%21') - .replace(/\*/g,'%2A') - .replace(/\(/g,'%28') - .replace(/\)/g,'%29') - .replace(/'/g,'%27') - ; -} - -// Maps object to bi-dimensional array -// Converts { foo: 'A', bar: [ 'b', 'B' ]} to -// [ ['foo', 'A'], ['bar', 'b'], ['bar', 'B'] ] -function map (obj) { - var key, val, arr = [] - for (key in obj) { - val = obj[key] - if (Array.isArray(val)) - for (var i = 0; i < val.length; i++) - arr.push([key, val[i]]) - else if (typeof val === "object") - for (var prop in val) - arr.push([key + '[' + prop + ']', val[prop]]); - else - arr.push([key, val]) - } - return arr -} - -// Compare function for sort -function compare (a, b) { - return a > b ? 1 : a < b ? -1 : 0 -} - -function generateBase (httpMethod, base_uri, params) { - // adapted from https://dev.twitter.com/docs/auth/oauth and - // https://dev.twitter.com/docs/auth/creating-signature - - // Parameter normalization - // http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2 - var normalized = map(params) - // 1. First, the name and value of each parameter are encoded - .map(function (p) { - return [ rfc3986(p[0]), rfc3986(p[1] || '') ] - }) - // 2. The parameters are sorted by name, using ascending byte value - // ordering. If two or more parameters share the same name, they - // are sorted by their value. - .sort(function (a, b) { - return compare(a[0], b[0]) || compare(a[1], b[1]) - }) - // 3. The name of each parameter is concatenated to its corresponding - // value using an "=" character (ASCII code 61) as a separator, even - // if the value is empty. - .map(function (p) { return p.join('=') }) - // 4. The sorted name/value pairs are concatenated together into a - // single string by using an "&" character (ASCII code 38) as - // separator. - .join('&') - - var base = [ - rfc3986(httpMethod ? httpMethod.toUpperCase() : 'GET'), - rfc3986(base_uri), - rfc3986(normalized) - ].join('&') - - return base -} - -function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) { - var base = generateBase(httpMethod, base_uri, params) - var key = [ - consumer_secret || '', - token_secret || '' - ].map(rfc3986).join('&') - - return sha1(key, base) -} - -function rsasign (httpMethod, base_uri, params, private_key, token_secret) { - var base = generateBase(httpMethod, base_uri, params) - var key = private_key || '' - - return rsa(key, base) -} - -function plaintext (consumer_secret, token_secret) { - var key = [ - consumer_secret || '', - token_secret || '' - ].map(rfc3986).join('&') - - return key -} - -function sign (signMethod, httpMethod, base_uri, params, consumer_secret, token_secret) { - var method - var skipArgs = 1 - - switch (signMethod) { - case 'RSA-SHA1': - method = rsasign - break - case 'HMAC-SHA1': - method = hmacsign - break - case 'PLAINTEXT': - method = plaintext - skipArgs = 4 - break - default: - throw new Error("Signature method not supported: " + signMethod) - } - - return method.apply(null, [].slice.call(arguments, skipArgs)) -} - -exports.hmacsign = hmacsign -exports.rsasign = rsasign -exports.plaintext = plaintext -exports.sign = sign -exports.rfc3986 = rfc3986 diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/package.json deleted file mode 100644 index 074a72b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "author": { - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com", - "url": "http://www.futurealoof.com" - }, - "name": "oauth-sign", - "description": "OAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module.", - "version": "0.8.0", - "license": "Apache-2.0", - "repository": { - "url": "git+https://github.com/mikeal/oauth-sign.git" - }, - "main": "index.js", - "dependencies": {}, - "devDependencies": {}, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "scripts": { - "test": "node test.js" - }, - "gitHead": "e1f2b42ff039901ce977f8e81918767d97d496b5", - "bugs": { - "url": "https://github.com/mikeal/oauth-sign/issues" - }, - "homepage": "https://github.com/mikeal/oauth-sign#readme", - "_id": "oauth-sign@0.8.0", - "_shasum": "938fdc875765ba527137d8aec9d178e24debc553", - "_from": "oauth-sign@>=0.8.0 <0.9.0", - "_npmVersion": "2.10.1", - "_nodeVersion": "0.12.4", - "_npmUser": { - "name": "simov", - "email": "simeonvelichkov@gmail.com" - }, - "maintainers": [ - { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - { - "name": "nylen", - "email": "jnylen@gmail.com" - }, - { - "name": "simov", - "email": "simeonvelichkov@gmail.com" - } - ], - "dist": { - "shasum": "938fdc875765ba527137d8aec9d178e24debc553", - "tarball": "http://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/test.js deleted file mode 100644 index a884727..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/oauth-sign/test.js +++ /dev/null @@ -1,89 +0,0 @@ -var oauth = require('./index') - , hmacsign = oauth.hmacsign - , assert = require('assert') - , qs = require('querystring') - ; - -// Tests from Twitter documentation https://dev.twitter.com/docs/auth/oauth - -var reqsign = hmacsign('POST', 'https://api.twitter.com/oauth/request_token', - { oauth_callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_timestamp: '1272323042' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98") - -console.log(reqsign) -console.log('8wUi7m5HFQy76nowoCThusfgB+Q=') -assert.equal(reqsign, '8wUi7m5HFQy76nowoCThusfgB+Q=') - -var accsign = hmacsign('POST', 'https://api.twitter.com/oauth/access_token', - { oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , oauth_timestamp: '1272323047' - , oauth_verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA") - -console.log(accsign) -console.log('PUw/dHA4fnlJYM6RhXk5IU/0fCc=') -assert.equal(accsign, 'PUw/dHA4fnlJYM6RhXk5IU/0fCc=') - -var upsign = hmacsign('POST', 'http://api.twitter.com/1/statuses/update.json', - { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g" - , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , oauth_signature_method: "HMAC-SHA1" - , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , oauth_timestamp: "1272325550" - , oauth_version: "1.0" - , status: 'setting up my twitter 私のさえずりを設定する' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA") - -console.log(upsign) -console.log('yOahq5m0YjDDjfjxHaXEsW9D+X0=') -assert.equal(upsign, 'yOahq5m0YjDDjfjxHaXEsW9D+X0=') - -// handle objects in params (useful for Wordpress REST API) -var upsign = hmacsign('POST', 'http://wordpress.com/wp-json', - { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g" - , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , oauth_signature_method: "HMAC-SHA1" - , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , oauth_timestamp: "1272325550" - , oauth_version: "1.0" - , filter: { number: "-1" } - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA") - -console.log(upsign) -console.log('YrJFBdwnjuIitGpKrxLUplcuuUQ=') -assert.equal(upsign, 'YrJFBdwnjuIitGpKrxLUplcuuUQ=') - -// example in rfc5849 -var params = qs.parse('b5=%3D%253D&a3=a&c%40=&a2=r%20b' + '&' + 'c2&a3=2+q') -params.oauth_consumer_key = '9djdj82h48djs9d2' -params.oauth_token = 'kkk9d7dh3k39sjv7' -params.oauth_nonce = '7d8f3e4a' -params.oauth_signature_method = 'HMAC-SHA1' -params.oauth_timestamp = '137131201' - -var rfc5849sign = hmacsign('POST', 'http://example.com/request', - params, "j49sk3j29djd", "dh893hdasih9") - -console.log(rfc5849sign) -console.log('r6/TJjbCOr97/+UU0NsvSne7s5g=') -assert.equal(rfc5849sign, 'r6/TJjbCOr97/+UU0NsvSne7s5g=') - - -// PLAINTEXT - -var plainSign = oauth.sign('PLAINTEXT', 'GET', 'http://dummy.com', {}, 'consumer_secret', 'token_secret') -console.log(plainSign) -assert.equal(plainSign, 'consumer_secret&token_secret') - -plainSign = oauth.plaintext('consumer_secret', 'token_secret') -console.log(plainSign) -assert.equal(plainSign, 'consumer_secret&token_secret') diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/.eslintignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/.eslintignore deleted file mode 100644 index 1521c8b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/.npmignore deleted file mode 100644 index 2abba8d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/.npmignore +++ /dev/null @@ -1,19 +0,0 @@ -.idea -*.iml -npm-debug.log -dump.rdb -node_modules -results.tap -results.xml -npm-shrinkwrap.json -config.json -.DS_Store -*/.DS_Store -*/*/.DS_Store -._* -*/._* -*/*/._* -coverage.* -lib-cov -complexity.md -dist diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/.travis.yml deleted file mode 100644 index f502178..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js - -node_js: - - 0.10 - - 0.12 - - iojs diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/CHANGELOG.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/CHANGELOG.md deleted file mode 100644 index 1fadc78..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/CHANGELOG.md +++ /dev/null @@ -1,88 +0,0 @@ - -## [**3.1.0**](https://github.com/hapijs/qs/issues?milestone=24&state=open) -- [**#89**](https://github.com/hapijs/qs/issues/89) Add option to disable "Transform dot notation to bracket notation" - -## [**3.0.0**](https://github.com/hapijs/qs/issues?milestone=23&state=closed) -- [**#77**](https://github.com/hapijs/qs/issues/77) Perf boost -- [**#60**](https://github.com/hapijs/qs/issues/60) Add explicit option to disable array parsing -- [**#80**](https://github.com/hapijs/qs/issues/80) qs.parse silently drops properties -- [**#74**](https://github.com/hapijs/qs/issues/74) Bad parse when turning array into object -- [**#81**](https://github.com/hapijs/qs/issues/81) Add a `filter` option -- [**#68**](https://github.com/hapijs/qs/issues/68) Fixed issue with recursion and passing strings into objects. -- [**#66**](https://github.com/hapijs/qs/issues/66) Add mixed array and object dot notation support Closes: #47 -- [**#76**](https://github.com/hapijs/qs/issues/76) RFC 3986 -- [**#85**](https://github.com/hapijs/qs/issues/85) No equal sign -- [**#84**](https://github.com/hapijs/qs/issues/84) update license attribute - -## [**2.4.1**](https://github.com/hapijs/qs/issues?milestone=20&state=closed) -- [**#73**](https://github.com/hapijs/qs/issues/73) Property 'hasOwnProperty' of object # is not a function - -## [**2.4.0**](https://github.com/hapijs/qs/issues?milestone=19&state=closed) -- [**#70**](https://github.com/hapijs/qs/issues/70) Add arrayFormat option - -## [**2.3.3**](https://github.com/hapijs/qs/issues?milestone=18&state=closed) -- [**#59**](https://github.com/hapijs/qs/issues/59) make sure array indexes are >= 0, closes #57 -- [**#58**](https://github.com/hapijs/qs/issues/58) make qs usable for browser loader - -## [**2.3.2**](https://github.com/hapijs/qs/issues?milestone=17&state=closed) -- [**#55**](https://github.com/hapijs/qs/issues/55) allow merging a string into an object - -## [**2.3.1**](https://github.com/hapijs/qs/issues?milestone=16&state=closed) -- [**#52**](https://github.com/hapijs/qs/issues/52) Return "undefined" and "false" instead of throwing "TypeError". - -## [**2.3.0**](https://github.com/hapijs/qs/issues?milestone=15&state=closed) -- [**#50**](https://github.com/hapijs/qs/issues/50) add option to omit array indices, closes #46 - -## [**2.2.5**](https://github.com/hapijs/qs/issues?milestone=14&state=closed) -- [**#39**](https://github.com/hapijs/qs/issues/39) Is there an alternative to Buffer.isBuffer? -- [**#49**](https://github.com/hapijs/qs/issues/49) refactor utils.merge, fixes #45 -- [**#41**](https://github.com/hapijs/qs/issues/41) avoid browserifying Buffer, for #39 - -## [**2.2.4**](https://github.com/hapijs/qs/issues?milestone=13&state=closed) -- [**#38**](https://github.com/hapijs/qs/issues/38) how to handle object keys beginning with a number - -## [**2.2.3**](https://github.com/hapijs/qs/issues?milestone=12&state=closed) -- [**#37**](https://github.com/hapijs/qs/issues/37) parser discards first empty value in array -- [**#36**](https://github.com/hapijs/qs/issues/36) Update to lab 4.x - -## [**2.2.2**](https://github.com/hapijs/qs/issues?milestone=11&state=closed) -- [**#33**](https://github.com/hapijs/qs/issues/33) Error when plain object in a value -- [**#34**](https://github.com/hapijs/qs/issues/34) use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty -- [**#24**](https://github.com/hapijs/qs/issues/24) Changelog? Semver? - -## [**2.2.1**](https://github.com/hapijs/qs/issues?milestone=10&state=closed) -- [**#32**](https://github.com/hapijs/qs/issues/32) account for circular references properly, closes #31 -- [**#31**](https://github.com/hapijs/qs/issues/31) qs.parse stackoverflow on circular objects - -## [**2.2.0**](https://github.com/hapijs/qs/issues?milestone=9&state=closed) -- [**#26**](https://github.com/hapijs/qs/issues/26) Don't use Buffer global if it's not present -- [**#30**](https://github.com/hapijs/qs/issues/30) Bug when merging non-object values into arrays -- [**#29**](https://github.com/hapijs/qs/issues/29) Don't call Utils.clone at the top of Utils.merge -- [**#23**](https://github.com/hapijs/qs/issues/23) Ability to not limit parameters? - -## [**2.1.0**](https://github.com/hapijs/qs/issues?milestone=8&state=closed) -- [**#22**](https://github.com/hapijs/qs/issues/22) Enable using a RegExp as delimiter - -## [**2.0.0**](https://github.com/hapijs/qs/issues?milestone=7&state=closed) -- [**#18**](https://github.com/hapijs/qs/issues/18) Why is there arrayLimit? -- [**#20**](https://github.com/hapijs/qs/issues/20) Configurable parametersLimit -- [**#21**](https://github.com/hapijs/qs/issues/21) make all limits optional, for #18, for #20 - -## [**1.2.2**](https://github.com/hapijs/qs/issues?milestone=6&state=closed) -- [**#19**](https://github.com/hapijs/qs/issues/19) Don't overwrite null values - -## [**1.2.1**](https://github.com/hapijs/qs/issues?milestone=5&state=closed) -- [**#16**](https://github.com/hapijs/qs/issues/16) ignore non-string delimiters -- [**#15**](https://github.com/hapijs/qs/issues/15) Close code block - -## [**1.2.0**](https://github.com/hapijs/qs/issues?milestone=4&state=closed) -- [**#12**](https://github.com/hapijs/qs/issues/12) Add optional delim argument -- [**#13**](https://github.com/hapijs/qs/issues/13) fix #11: flattened keys in array are now correctly parsed - -## [**1.1.0**](https://github.com/hapijs/qs/issues?milestone=3&state=closed) -- [**#7**](https://github.com/hapijs/qs/issues/7) Empty values of a POST array disappear after being submitted -- [**#9**](https://github.com/hapijs/qs/issues/9) Should not omit equals signs (=) when value is null -- [**#6**](https://github.com/hapijs/qs/issues/6) Minor grammar fix in README - -## [**1.0.2**](https://github.com/hapijs/qs/issues?milestone=2&state=closed) -- [**#5**](https://github.com/hapijs/qs/issues/5) array holes incorrectly copied into object on large index diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/CONTRIBUTING.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/CONTRIBUTING.md deleted file mode 100644 index 8928361..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/CONTRIBUTING.md +++ /dev/null @@ -1 +0,0 @@ -Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md). diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/LICENSE deleted file mode 100644 index d456948..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2014 Nathan LaFreniere and other contributors. -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. - * The names of any contributors may not 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 HOLDERS AND 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. - - * * * - -The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/README.md deleted file mode 100644 index 48a0de9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/README.md +++ /dev/null @@ -1,317 +0,0 @@ -# qs - -A querystring parsing and stringifying library with some added security. - -[![Build Status](https://secure.travis-ci.org/hapijs/qs.svg)](http://travis-ci.org/hapijs/qs) - -Lead Maintainer: [Nathan LaFreniere](https://github.com/nlf) - -The **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring). - -## Usage - -```javascript -var Qs = require('qs'); - -var obj = Qs.parse('a=c'); // { a: 'c' } -var str = Qs.stringify(obj); // 'a=c' -``` - -### Parsing Objects - -```javascript -Qs.parse(string, [options]); -``` - -**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`, or prefixing the sub-key with a dot `.`. -For example, the string `'foo[bar]=baz'` converts to: - -```javascript -{ - foo: { - bar: 'baz' - } -} -``` - -When using the `plainObjects` option the parsed value is returned as a plain object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like: - -```javascript -Qs.parse('a.hasOwnProperty=b', { plainObjects: true }); -// { a: { hasOwnProperty: 'b' } } -``` - -By default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option. - -```javascript -Qs.parse('a.hasOwnProperty=b', { allowPrototypes: true }); -// { a: { hasOwnProperty: 'b' } } -``` - -URI encoded strings work too: - -```javascript -Qs.parse('a%5Bb%5D=c'); -// { a: { b: 'c' } } -``` - -You can also nest your objects, like `'foo[bar][baz]=foobarbaz'`: - -```javascript -{ - foo: { - bar: { - baz: 'foobarbaz' - } - } -} -``` - -By default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like -`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be: - -```javascript -{ - a: { - b: { - c: { - d: { - e: { - f: { - '[g][h][i]': 'j' - } - } - } - } - } - } -} -``` - -This depth can be overridden by passing a `depth` option to `Qs.parse(string, [options])`: - -```javascript -Qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 }); -// { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } } -``` - -The depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number. - -For similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option: - -```javascript -Qs.parse('a=b&c=d', { parameterLimit: 1 }); -// { a: 'b' } -``` - -An optional delimiter can also be passed: - -```javascript -Qs.parse('a=b;c=d', { delimiter: ';' }); -// { a: 'b', c: 'd' } -``` - -Delimiters can be a regular expression too: - -```javascript -Qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ }); -// { a: 'b', c: 'd', e: 'f' } -``` - -Option `allowDots` can be used to disable dot notation: - -```javascript -Qs.parse('a.b=c', { allowDots: false }); -// { 'a.b': 'c' } } -``` - -### Parsing Arrays - -**qs** can also parse arrays using a similar `[]` notation: - -```javascript -Qs.parse('a[]=b&a[]=c'); -// { a: ['b', 'c'] } -``` - -You may specify an index as well: - -```javascript -Qs.parse('a[1]=c&a[0]=b'); -// { a: ['b', 'c'] } -``` - -Note that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number -to create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving -their order: - -```javascript -Qs.parse('a[1]=b&a[15]=c'); -// { a: ['b', 'c'] } -``` - -Note that an empty string is also a value, and will be preserved: - -```javascript -Qs.parse('a[]=&a[]=b'); -// { a: ['', 'b'] } -Qs.parse('a[0]=b&a[1]=&a[2]=c'); -// { a: ['b', '', 'c'] } -``` - -**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will -instead be converted to an object with the index as the key: - -```javascript -Qs.parse('a[100]=b'); -// { a: { '100': 'b' } } -``` - -This limit can be overridden by passing an `arrayLimit` option: - -```javascript -Qs.parse('a[1]=b', { arrayLimit: 0 }); -// { a: { '1': 'b' } } -``` - -To disable array parsing entirely, set `parseArrays` to `false`. - -```javascript -Qs.parse('a[]=b', { parseArrays: false }); -// { a: { '0': 'b' } } -``` - -If you mix notations, **qs** will merge the two items into an object: - -```javascript -Qs.parse('a[0]=b&a[b]=c'); -// { a: { '0': 'b', b: 'c' } } -``` - -You can also create arrays of objects: - -```javascript -Qs.parse('a[][b]=c'); -// { a: [{ b: 'c' }] } -``` - -### Stringifying - -```javascript -Qs.stringify(object, [options]); -``` - -When stringifying, **qs** always URI encodes output. Objects are stringified as you would expect: - -```javascript -Qs.stringify({ a: 'b' }); -// 'a=b' -Qs.stringify({ a: { b: 'c' } }); -// 'a%5Bb%5D=c' -``` - -Examples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage. - -When arrays are stringified, by default they are given explicit indices: - -```javascript -Qs.stringify({ a: ['b', 'c', 'd'] }); -// 'a[0]=b&a[1]=c&a[2]=d' -``` - -You may override this by setting the `indices` option to `false`: - -```javascript -Qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }); -// 'a=b&a=c&a=d' -``` - -You may use the `arrayFormat` option to specify the format of the output array - -```javascript -Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }) -// 'a[0]=b&a[1]=c' -Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }) -// 'a[]=b&a[]=c' -Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }) -// 'a=b&a=c' -``` - -Empty strings and null values will omit the value, but the equals sign (=) remains in place: - -```javascript -Qs.stringify({ a: '' }); -// 'a=' -``` - -Properties that are set to `undefined` will be omitted entirely: - -```javascript -Qs.stringify({ a: null, b: undefined }); -// 'a=' -``` - -The delimiter may be overridden with stringify as well: - -```javascript -Qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }); -// 'a=b;c=d' -``` - -Finally, you can use the `filter` option to restrict which keys will be included in the stringified output. -If you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you -pass an array, it will be used to select properties and array indices for stringification: - -```javascript -function filterFunc(prefix, value) { - if (prefix == 'b') { - // Return an `undefined` value to omit a property. - return; - } - if (prefix == 'e[f]') { - return value.getTime(); - } - if (prefix == 'e[g][0]') { - return value * 2; - } - return value; -} -Qs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc }) -// 'a=b&c=d&e[f]=123&e[g][0]=4' -Qs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] }) -// 'a=b&e=f' -Qs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] }) -// 'a[0]=b&a[2]=d' -``` - -### Handling of `null` values - -By default, `null` values are treated like empty strings: - -```javascript -Qs.stringify({ a: null, b: '' }); -// 'a=&b=' -``` - -Parsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings. - -```javascript -Qs.parse('a&b=') -// { a: '', b: '' } -``` - -To distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null` -values have no `=` sign: - -```javascript -Qs.stringify({ a: null, b: '' }, { strictNullHandling: true }); -// 'a&b=' -``` - -To parse values without `=` back to `null` use the `strictNullHandling` flag: - -```javascript -Qs.parse('a&b=', { strictNullHandling: true }); -// { a: null, b: '' } - -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/bower.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/bower.json deleted file mode 100644 index ffd0641..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/bower.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "qs", - "main": "dist/qs.js", - "version": "3.0.0", - "homepage": "https://github.com/hapijs/qs", - "authors": [ - "Nathan LaFreniere " - ], - "description": "A querystring parser that supports nesting and arrays, with a depth limit", - "keywords": [ - "querystring", - "qs" - ], - "license": "BSD-3-Clause", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/index.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/index.js deleted file mode 100644 index 0e09493..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/index.js +++ /dev/null @@ -1,15 +0,0 @@ -// Load modules - -var Stringify = require('./stringify'); -var Parse = require('./parse'); - - -// Declare internals - -var internals = {}; - - -module.exports = { - stringify: Stringify, - parse: Parse -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/parse.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/parse.js deleted file mode 100644 index e7c56c5..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/parse.js +++ /dev/null @@ -1,186 +0,0 @@ -// Load modules - -var Utils = require('./utils'); - - -// Declare internals - -var internals = { - delimiter: '&', - depth: 5, - arrayLimit: 20, - parameterLimit: 1000, - strictNullHandling: false, - plainObjects: false, - allowPrototypes: false -}; - - -internals.parseValues = function (str, options) { - - var obj = {}; - var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit); - - for (var i = 0, il = parts.length; i < il; ++i) { - var part = parts[i]; - var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1; - - if (pos === -1) { - obj[Utils.decode(part)] = ''; - - if (options.strictNullHandling) { - obj[Utils.decode(part)] = null; - } - } - else { - var key = Utils.decode(part.slice(0, pos)); - var val = Utils.decode(part.slice(pos + 1)); - - if (!Object.prototype.hasOwnProperty.call(obj, key)) { - obj[key] = val; - } - else { - obj[key] = [].concat(obj[key]).concat(val); - } - } - } - - return obj; -}; - - -internals.parseObject = function (chain, val, options) { - - if (!chain.length) { - return val; - } - - var root = chain.shift(); - - var obj; - if (root === '[]') { - obj = []; - obj = obj.concat(internals.parseObject(chain, val, options)); - } - else { - obj = options.plainObjects ? Object.create(null) : {}; - var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root; - var index = parseInt(cleanRoot, 10); - var indexString = '' + index; - if (!isNaN(index) && - root !== cleanRoot && - indexString === cleanRoot && - index >= 0 && - (options.parseArrays && - index <= options.arrayLimit)) { - - obj = []; - obj[index] = internals.parseObject(chain, val, options); - } - else { - obj[cleanRoot] = internals.parseObject(chain, val, options); - } - } - - return obj; -}; - - -internals.parseKeys = function (key, val, options) { - - if (!key) { - return; - } - - // Transform dot notation to bracket notation - - if (options.allowDots) { - key = key.replace(/\.([^\.\[]+)/g, '[$1]'); - } - - // The regex chunks - - var parent = /^([^\[\]]*)/; - var child = /(\[[^\[\]]*\])/g; - - // Get the parent - - var segment = parent.exec(key); - - // Stash the parent if it exists - - var keys = []; - if (segment[1]) { - // If we aren't using plain objects, optionally prefix keys - // that would overwrite object prototype properties - if (!options.plainObjects && - Object.prototype.hasOwnProperty(segment[1])) { - - if (!options.allowPrototypes) { - return; - } - } - - keys.push(segment[1]); - } - - // Loop through children appending to the array until we hit depth - - var i = 0; - while ((segment = child.exec(key)) !== null && i < options.depth) { - - ++i; - if (!options.plainObjects && - Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) { - - if (!options.allowPrototypes) { - continue; - } - } - keys.push(segment[1]); - } - - // If there's a remainder, just add whatever is left - - if (segment) { - keys.push('[' + key.slice(segment.index) + ']'); - } - - return internals.parseObject(keys, val, options); -}; - - -module.exports = function (str, options) { - - options = options || {}; - options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : internals.delimiter; - options.depth = typeof options.depth === 'number' ? options.depth : internals.depth; - options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : internals.arrayLimit; - options.parseArrays = options.parseArrays !== false; - options.allowDots = options.allowDots !== false; - options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : internals.plainObjects; - options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : internals.allowPrototypes; - options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : internals.parameterLimit; - options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling; - - if (str === '' || - str === null || - typeof str === 'undefined') { - - return options.plainObjects ? Object.create(null) : {}; - } - - var tempObj = typeof str === 'string' ? internals.parseValues(str, options) : str; - var obj = options.plainObjects ? Object.create(null) : {}; - - // Iterate over the keys and setup the new object - - var keys = Object.keys(tempObj); - for (var i = 0, il = keys.length; i < il; ++i) { - var key = keys[i]; - var newObj = internals.parseKeys(key, tempObj[key], options); - obj = Utils.merge(obj, newObj, options); - } - - return Utils.compact(obj); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/stringify.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/stringify.js deleted file mode 100644 index 7414284..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/stringify.js +++ /dev/null @@ -1,121 +0,0 @@ -// Load modules - -var Utils = require('./utils'); - - -// Declare internals - -var internals = { - delimiter: '&', - arrayPrefixGenerators: { - brackets: function (prefix, key) { - - return prefix + '[]'; - }, - indices: function (prefix, key) { - - return prefix + '[' + key + ']'; - }, - repeat: function (prefix, key) { - - return prefix; - } - }, - strictNullHandling: false -}; - - -internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, filter) { - - if (typeof filter === 'function') { - obj = filter(prefix, obj); - } - else if (Utils.isBuffer(obj)) { - obj = obj.toString(); - } - else if (obj instanceof Date) { - obj = obj.toISOString(); - } - else if (obj === null) { - if (strictNullHandling) { - return Utils.encode(prefix); - } - - obj = ''; - } - - if (typeof obj === 'string' || - typeof obj === 'number' || - typeof obj === 'boolean') { - - return [Utils.encode(prefix) + '=' + Utils.encode(obj)]; - } - - var values = []; - - if (typeof obj === 'undefined') { - return values; - } - - var objKeys = Array.isArray(filter) ? filter : Object.keys(obj); - for (var i = 0, il = objKeys.length; i < il; ++i) { - var key = objKeys[i]; - - if (Array.isArray(obj)) { - values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, filter)); - } - else { - values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix, strictNullHandling, filter)); - } - } - - return values; -}; - - -module.exports = function (obj, options) { - - options = options || {}; - var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter; - var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling; - var objKeys; - var filter; - if (typeof options.filter === 'function') { - filter = options.filter; - obj = filter('', obj); - } - else if (Array.isArray(options.filter)) { - objKeys = filter = options.filter; - } - - var keys = []; - - if (typeof obj !== 'object' || - obj === null) { - - return ''; - } - - var arrayFormat; - if (options.arrayFormat in internals.arrayPrefixGenerators) { - arrayFormat = options.arrayFormat; - } - else if ('indices' in options) { - arrayFormat = options.indices ? 'indices' : 'repeat'; - } - else { - arrayFormat = 'indices'; - } - - var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat]; - - if (!objKeys) { - objKeys = Object.keys(obj); - } - for (var i = 0, il = objKeys.length; i < il; ++i) { - var key = objKeys[i]; - keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, filter)); - } - - return keys.join(delimiter); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/utils.js deleted file mode 100644 index 88f3147..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/lib/utils.js +++ /dev/null @@ -1,190 +0,0 @@ -// Load modules - - -// Declare internals - -var internals = {}; -internals.hexTable = new Array(256); -for (var h = 0; h < 256; ++h) { - internals.hexTable[h] = '%' + ((h < 16 ? '0' : '') + h.toString(16)).toUpperCase(); -} - - -exports.arrayToObject = function (source, options) { - - var obj = options.plainObjects ? Object.create(null) : {}; - for (var i = 0, il = source.length; i < il; ++i) { - if (typeof source[i] !== 'undefined') { - - obj[i] = source[i]; - } - } - - return obj; -}; - - -exports.merge = function (target, source, options) { - - if (!source) { - return target; - } - - if (typeof source !== 'object') { - if (Array.isArray(target)) { - target.push(source); - } - else if (typeof target === 'object') { - target[source] = true; - } - else { - target = [target, source]; - } - - return target; - } - - if (typeof target !== 'object') { - target = [target].concat(source); - return target; - } - - if (Array.isArray(target) && - !Array.isArray(source)) { - - target = exports.arrayToObject(target, options); - } - - var keys = Object.keys(source); - for (var k = 0, kl = keys.length; k < kl; ++k) { - var key = keys[k]; - var value = source[key]; - - if (!Object.prototype.hasOwnProperty.call(target, key)) { - target[key] = value; - } - else { - target[key] = exports.merge(target[key], value, options); - } - } - - return target; -}; - - -exports.decode = function (str) { - - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (e) { - return str; - } -}; - -exports.encode = function (str) { - - // This code was originally written by Brian White (mscdex) for the io.js core querystring library. - // It has been adapted here for stricter adherence to RFC 3986 - if (str.length === 0) { - return str; - } - - if (typeof str !== 'string') { - str = '' + str; - } - - var out = ''; - for (var i = 0, il = str.length; i < il; ++i) { - var c = str.charCodeAt(i); - - if (c === 0x2D || // - - c === 0x2E || // . - c === 0x5F || // _ - c === 0x7E || // ~ - (c >= 0x30 && c <= 0x39) || // 0-9 - (c >= 0x41 && c <= 0x5A) || // a-z - (c >= 0x61 && c <= 0x7A)) { // A-Z - - out += str[i]; - continue; - } - - if (c < 0x80) { - out += internals.hexTable[c]; - continue; - } - - if (c < 0x800) { - out += internals.hexTable[0xC0 | (c >> 6)] + internals.hexTable[0x80 | (c & 0x3F)]; - continue; - } - - if (c < 0xD800 || c >= 0xE000) { - out += internals.hexTable[0xE0 | (c >> 12)] + internals.hexTable[0x80 | ((c >> 6) & 0x3F)] + internals.hexTable[0x80 | (c & 0x3F)]; - continue; - } - - ++i; - c = 0x10000 + (((c & 0x3FF) << 10) | (str.charCodeAt(i) & 0x3FF)); - out += internals.hexTable[0xF0 | (c >> 18)] + internals.hexTable[0x80 | ((c >> 12) & 0x3F)] + internals.hexTable[0x80 | ((c >> 6) & 0x3F)] + internals.hexTable[0x80 | (c & 0x3F)]; - } - - return out; -}; - -exports.compact = function (obj, refs) { - - if (typeof obj !== 'object' || - obj === null) { - - return obj; - } - - refs = refs || []; - var lookup = refs.indexOf(obj); - if (lookup !== -1) { - return refs[lookup]; - } - - refs.push(obj); - - if (Array.isArray(obj)) { - var compacted = []; - - for (var i = 0, il = obj.length; i < il; ++i) { - if (typeof obj[i] !== 'undefined') { - compacted.push(obj[i]); - } - } - - return compacted; - } - - var keys = Object.keys(obj); - for (i = 0, il = keys.length; i < il; ++i) { - var key = keys[i]; - obj[key] = exports.compact(obj[key], refs); - } - - return obj; -}; - - -exports.isRegExp = function (obj) { - - return Object.prototype.toString.call(obj) === '[object RegExp]'; -}; - - -exports.isBuffer = function (obj) { - - if (obj === null || - typeof obj === 'undefined') { - - return false; - } - - return !!(obj.constructor && - obj.constructor.isBuffer && - obj.constructor.isBuffer(obj)); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/package.json deleted file mode 100644 index 4c45772..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "qs", - "version": "4.0.0", - "description": "A querystring parser that supports nesting and arrays, with a depth limit", - "homepage": "https://github.com/hapijs/qs", - "main": "lib/index.js", - "dependencies": {}, - "devDependencies": { - "browserify": "^10.2.1", - "code": "1.x.x", - "lab": "5.x.x" - }, - "scripts": { - "test": "lab -a code -t 100 -L", - "test-cov-html": "lab -a code -r html -o coverage.html", - "dist": "browserify --standalone Qs lib/index.js > dist/qs.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/hapijs/qs.git" - }, - "keywords": [ - "querystring", - "qs" - ], - "license": "BSD-3-Clause", - "gitHead": "e573dd08eae6cce30d2202704691a102dfa3782a", - "bugs": { - "url": "https://github.com/hapijs/qs/issues" - }, - "_id": "qs@4.0.0", - "_shasum": "c31d9b74ec27df75e543a86c78728ed8d4623607", - "_from": "qs@>=4.0.0 <4.1.0", - "_npmVersion": "2.12.0", - "_nodeVersion": "0.12.4", - "_npmUser": { - "name": "nlf", - "email": "quitlahok@gmail.com" - }, - "dist": { - "shasum": "c31d9b74ec27df75e543a86c78728ed8d4623607", - "tarball": "http://registry.npmjs.org/qs/-/qs-4.0.0.tgz" - }, - "maintainers": [ - { - "name": "nlf", - "email": "quitlahok@gmail.com" - }, - { - "name": "hueniverse", - "email": "eran@hueniverse.com" - } - ], - "directories": {}, - "_resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/test/parse.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/test/parse.js deleted file mode 100644 index a19d764..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/test/parse.js +++ /dev/null @@ -1,478 +0,0 @@ -/* eslint no-extend-native:0 */ -// Load modules - -var Code = require('code'); -var Lab = require('lab'); -var Qs = require('../'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var expect = Code.expect; -var describe = lab.experiment; -var it = lab.test; - - -describe('parse()', function () { - - it('parses a simple string', function (done) { - - expect(Qs.parse('0=foo')).to.deep.equal({ '0': 'foo' }); - expect(Qs.parse('foo=c++')).to.deep.equal({ foo: 'c ' }); - expect(Qs.parse('a[>=]=23')).to.deep.equal({ a: { '>=': '23' } }); - expect(Qs.parse('a[<=>]==23')).to.deep.equal({ a: { '<=>': '=23' } }); - expect(Qs.parse('a[==]=23')).to.deep.equal({ a: { '==': '23' } }); - expect(Qs.parse('foo', { strictNullHandling: true })).to.deep.equal({ foo: null }); - expect(Qs.parse('foo' )).to.deep.equal({ foo: '' }); - expect(Qs.parse('foo=')).to.deep.equal({ foo: '' }); - expect(Qs.parse('foo=bar')).to.deep.equal({ foo: 'bar' }); - expect(Qs.parse(' foo = bar = baz ')).to.deep.equal({ ' foo ': ' bar = baz ' }); - expect(Qs.parse('foo=bar=baz')).to.deep.equal({ foo: 'bar=baz' }); - expect(Qs.parse('foo=bar&bar=baz')).to.deep.equal({ foo: 'bar', bar: 'baz' }); - expect(Qs.parse('foo2=bar2&baz2=')).to.deep.equal({ foo2: 'bar2', baz2: '' }); - expect(Qs.parse('foo=bar&baz', { strictNullHandling: true })).to.deep.equal({ foo: 'bar', baz: null }); - expect(Qs.parse('foo=bar&baz')).to.deep.equal({ foo: 'bar', baz: '' }); - expect(Qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World')).to.deep.equal({ - cht: 'p3', - chd: 't:60,40', - chs: '250x100', - chl: 'Hello|World' - }); - done(); - }); - - it('allows disabling dot notation', function (done) { - - expect(Qs.parse('a.b=c')).to.deep.equal({ a: { b: 'c' } }); - expect(Qs.parse('a.b=c', { allowDots: false })).to.deep.equal({ 'a.b': 'c' }); - done(); - }); - - it('parses a single nested string', function (done) { - - expect(Qs.parse('a[b]=c')).to.deep.equal({ a: { b: 'c' } }); - done(); - }); - - it('parses a double nested string', function (done) { - - expect(Qs.parse('a[b][c]=d')).to.deep.equal({ a: { b: { c: 'd' } } }); - done(); - }); - - it('defaults to a depth of 5', function (done) { - - expect(Qs.parse('a[b][c][d][e][f][g][h]=i')).to.deep.equal({ a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } }); - done(); - }); - - it('only parses one level when depth = 1', function (done) { - - expect(Qs.parse('a[b][c]=d', { depth: 1 })).to.deep.equal({ a: { b: { '[c]': 'd' } } }); - expect(Qs.parse('a[b][c][d]=e', { depth: 1 })).to.deep.equal({ a: { b: { '[c][d]': 'e' } } }); - done(); - }); - - it('parses a simple array', function (done) { - - expect(Qs.parse('a=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); - done(); - }); - - it('parses an explicit array', function (done) { - - expect(Qs.parse('a[]=b')).to.deep.equal({ a: ['b'] }); - expect(Qs.parse('a[]=b&a[]=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[]=b&a[]=c&a[]=d')).to.deep.equal({ a: ['b', 'c', 'd'] }); - done(); - }); - - it('parses a mix of simple and explicit arrays', function (done) { - - expect(Qs.parse('a=b&a[]=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[]=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[0]=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a=b&a[0]=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[1]=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a=b&a[1]=c')).to.deep.equal({ a: ['b', 'c'] }); - done(); - }); - - it('parses a nested array', function (done) { - - expect(Qs.parse('a[b][]=c&a[b][]=d')).to.deep.equal({ a: { b: ['c', 'd'] } }); - expect(Qs.parse('a[>=]=25')).to.deep.equal({ a: { '>=': '25' } }); - done(); - }); - - it('allows to specify array indices', function (done) { - - expect(Qs.parse('a[1]=c&a[0]=b&a[2]=d')).to.deep.equal({ a: ['b', 'c', 'd'] }); - expect(Qs.parse('a[1]=c&a[0]=b')).to.deep.equal({ a: ['b', 'c'] }); - expect(Qs.parse('a[1]=c')).to.deep.equal({ a: ['c'] }); - done(); - }); - - it('limits specific array indices to 20', function (done) { - - expect(Qs.parse('a[20]=a')).to.deep.equal({ a: ['a'] }); - expect(Qs.parse('a[21]=a')).to.deep.equal({ a: { '21': 'a' } }); - done(); - }); - - it('supports keys that begin with a number', function (done) { - - expect(Qs.parse('a[12b]=c')).to.deep.equal({ a: { '12b': 'c' } }); - done(); - }); - - it('supports encoded = signs', function (done) { - - expect(Qs.parse('he%3Dllo=th%3Dere')).to.deep.equal({ 'he=llo': 'th=ere' }); - done(); - }); - - it('is ok with url encoded strings', function (done) { - - expect(Qs.parse('a[b%20c]=d')).to.deep.equal({ a: { 'b c': 'd' } }); - expect(Qs.parse('a[b]=c%20d')).to.deep.equal({ a: { b: 'c d' } }); - done(); - }); - - it('allows brackets in the value', function (done) { - - expect(Qs.parse('pets=["tobi"]')).to.deep.equal({ pets: '["tobi"]' }); - expect(Qs.parse('operators=[">=", "<="]')).to.deep.equal({ operators: '[">=", "<="]' }); - done(); - }); - - it('allows empty values', function (done) { - - expect(Qs.parse('')).to.deep.equal({}); - expect(Qs.parse(null)).to.deep.equal({}); - expect(Qs.parse(undefined)).to.deep.equal({}); - done(); - }); - - it('transforms arrays to objects', function (done) { - - expect(Qs.parse('foo[0]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }); - expect(Qs.parse('foo[bad]=baz&foo[0]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); - expect(Qs.parse('foo[bad]=baz&foo[]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); - expect(Qs.parse('foo[]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }); - expect(Qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar', '1': 'foo' } }); - expect(Qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb')).to.deep.equal({ foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); - expect(Qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c')).to.deep.equal({ a: { '0': 'b', t: 'u', c: true } }); - expect(Qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y')).to.deep.equal({ a: { '0': 'b', '1': 'c', x: 'y' } }); - done(); - }); - - it('transforms arrays to objects (dot notation)', function (done) { - - expect(Qs.parse('foo[0].baz=bar&fool.bad=baz')).to.deep.equal({ foo: [{ baz: 'bar' }], fool: { bad: 'baz' } }); - expect(Qs.parse('foo[0].baz=bar&fool.bad.boo=baz')).to.deep.equal({ foo: [{ baz: 'bar' }], fool: { bad: { boo: 'baz' } } }); - expect(Qs.parse('foo[0][0].baz=bar&fool.bad=baz')).to.deep.equal({ foo: [[{ baz: 'bar' }]], fool: { bad: 'baz' } }); - expect(Qs.parse('foo[0].baz[0]=15&foo[0].bar=2')).to.deep.equal({ foo: [{ baz: ['15'], bar: '2' }] }); - expect(Qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2')).to.deep.equal({ foo: [{ baz: ['15', '16'], bar: '2' }] }); - expect(Qs.parse('foo.bad=baz&foo[0]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); - expect(Qs.parse('foo.bad=baz&foo[]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); - expect(Qs.parse('foo[]=bar&foo.bad=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }); - expect(Qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar', '1': 'foo' } }); - expect(Qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb')).to.deep.equal({ foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); - done(); - }); - - it('can add keys to objects', function (done) { - - expect(Qs.parse('a[b]=c&a=d')).to.deep.equal({ a: { b: 'c', d: true } }); - done(); - }); - - it('correctly prunes undefined values when converting an array to an object', function (done) { - - expect(Qs.parse('a[2]=b&a[99999999]=c')).to.deep.equal({ a: { '2': 'b', '99999999': 'c' } }); - done(); - }); - - it('supports malformed uri characters', function (done) { - - expect(Qs.parse('{%:%}', { strictNullHandling: true })).to.deep.equal({ '{%:%}': null }); - expect(Qs.parse('{%:%}=')).to.deep.equal({ '{%:%}': '' }); - expect(Qs.parse('foo=%:%}')).to.deep.equal({ foo: '%:%}' }); - done(); - }); - - it('doesn\'t produce empty keys', function (done) { - - expect(Qs.parse('_r=1&')).to.deep.equal({ '_r': '1' }); - done(); - }); - - it('cannot access Object prototype', function (done) { - - Qs.parse('constructor[prototype][bad]=bad'); - Qs.parse('bad[constructor][prototype][bad]=bad'); - expect(typeof Object.prototype.bad).to.equal('undefined'); - done(); - }); - - it('parses arrays of objects', function (done) { - - expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }); - expect(Qs.parse('a[0][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }); - done(); - }); - - it('allows for empty strings in arrays', function (done) { - - expect(Qs.parse('a[]=b&a[]=&a[]=c')).to.deep.equal({ a: ['b', '', 'c'] }); - expect(Qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', { strictNullHandling: true })).to.deep.equal({ a: ['b', null, 'c', ''] }); - expect(Qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', { strictNullHandling: true })).to.deep.equal({ a: ['b', '', 'c', null] }); - expect(Qs.parse('a[]=&a[]=b&a[]=c')).to.deep.equal({ a: ['', 'b', 'c'] }); - done(); - }); - - it('compacts sparse arrays', function (done) { - - expect(Qs.parse('a[10]=1&a[2]=2')).to.deep.equal({ a: ['2', '1'] }); - done(); - }); - - it('parses semi-parsed strings', function (done) { - - expect(Qs.parse({ 'a[b]': 'c' })).to.deep.equal({ a: { b: 'c' } }); - expect(Qs.parse({ 'a[b]': 'c', 'a[d]': 'e' })).to.deep.equal({ a: { b: 'c', d: 'e' } }); - done(); - }); - - it('parses buffers correctly', function (done) { - - var b = new Buffer('test'); - expect(Qs.parse({ a: b })).to.deep.equal({ a: b }); - done(); - }); - - it('continues parsing when no parent is found', function (done) { - - expect(Qs.parse('[]=&a=b')).to.deep.equal({ '0': '', a: 'b' }); - expect(Qs.parse('[]&a=b', { strictNullHandling: true })).to.deep.equal({ '0': null, a: 'b' }); - expect(Qs.parse('[foo]=bar')).to.deep.equal({ foo: 'bar' }); - done(); - }); - - it('does not error when parsing a very long array', function (done) { - - var str = 'a[]=a'; - while (Buffer.byteLength(str) < 128 * 1024) { - str += '&' + str; - } - - expect(function () { - - Qs.parse(str); - }).to.not.throw(); - - done(); - }); - - it('should not throw when a native prototype has an enumerable property', { parallel: false }, function (done) { - - Object.prototype.crash = ''; - Array.prototype.crash = ''; - expect(Qs.parse.bind(null, 'a=b')).to.not.throw(); - expect(Qs.parse('a=b')).to.deep.equal({ a: 'b' }); - expect(Qs.parse.bind(null, 'a[][b]=c')).to.not.throw(); - expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }); - delete Object.prototype.crash; - delete Array.prototype.crash; - done(); - }); - - it('parses a string with an alternative string delimiter', function (done) { - - expect(Qs.parse('a=b;c=d', { delimiter: ';' })).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('parses a string with an alternative RegExp delimiter', function (done) { - - expect(Qs.parse('a=b; c=d', { delimiter: /[;,] */ })).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('does not use non-splittable objects as delimiters', function (done) { - - expect(Qs.parse('a=b&c=d', { delimiter: true })).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('allows overriding parameter limit', function (done) { - - expect(Qs.parse('a=b&c=d', { parameterLimit: 1 })).to.deep.equal({ a: 'b' }); - done(); - }); - - it('allows setting the parameter limit to Infinity', function (done) { - - expect(Qs.parse('a=b&c=d', { parameterLimit: Infinity })).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('allows overriding array limit', function (done) { - - expect(Qs.parse('a[0]=b', { arrayLimit: -1 })).to.deep.equal({ a: { '0': 'b' } }); - expect(Qs.parse('a[-1]=b', { arrayLimit: -1 })).to.deep.equal({ a: { '-1': 'b' } }); - expect(Qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 })).to.deep.equal({ a: { '0': 'b', '1': 'c' } }); - done(); - }); - - it('allows disabling array parsing', function (done) { - - expect(Qs.parse('a[0]=b&a[1]=c', { parseArrays: false })).to.deep.equal({ a: { '0': 'b', '1': 'c' } }); - done(); - }); - - it('parses an object', function (done) { - - var input = { - 'user[name]': { 'pop[bob]': 3 }, - 'user[email]': null - }; - - var expected = { - 'user': { - 'name': { 'pop[bob]': 3 }, - 'email': null - } - }; - - var result = Qs.parse(input); - - expect(result).to.deep.equal(expected); - done(); - }); - - it('parses an object in dot notation', function (done) { - - var input = { - 'user.name': { 'pop[bob]': 3 }, - 'user.email.': null - }; - - var expected = { - 'user': { - 'name': { 'pop[bob]': 3 }, - 'email': null - } - }; - - var result = Qs.parse(input); - - expect(result).to.deep.equal(expected); - done(); - }); - - it('parses an object and not child values', function (done) { - - var input = { - 'user[name]': { 'pop[bob]': { 'test': 3 } }, - 'user[email]': null - }; - - var expected = { - 'user': { - 'name': { 'pop[bob]': { 'test': 3 } }, - 'email': null - } - }; - - var result = Qs.parse(input); - - expect(result).to.deep.equal(expected); - done(); - }); - - it('does not blow up when Buffer global is missing', function (done) { - - var tempBuffer = global.Buffer; - delete global.Buffer; - var result = Qs.parse('a=b&c=d'); - global.Buffer = tempBuffer; - expect(result).to.deep.equal({ a: 'b', c: 'd' }); - done(); - }); - - it('does not crash when parsing circular references', function (done) { - - var a = {}; - a.b = a; - - var parsed; - - expect(function () { - - parsed = Qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a }); - }).to.not.throw(); - - expect(parsed).to.contain('foo'); - expect(parsed.foo).to.contain('bar', 'baz'); - expect(parsed.foo.bar).to.equal('baz'); - expect(parsed.foo.baz).to.deep.equal(a); - done(); - }); - - it('parses plain objects correctly', function (done) { - - var a = Object.create(null); - a.b = 'c'; - - expect(Qs.parse(a)).to.deep.equal({ b: 'c' }); - var result = Qs.parse({ a: a }); - expect(result).to.contain('a'); - expect(result.a).to.deep.equal(a); - done(); - }); - - it('parses dates correctly', function (done) { - - var now = new Date(); - expect(Qs.parse({ a: now })).to.deep.equal({ a: now }); - done(); - }); - - it('parses regular expressions correctly', function (done) { - - var re = /^test$/; - expect(Qs.parse({ a: re })).to.deep.equal({ a: re }); - done(); - }); - - it('can allow overwriting prototype properties', function (done) { - - expect(Qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true })).to.deep.equal({ a: { hasOwnProperty: 'b' } }, { prototype: false }); - expect(Qs.parse('hasOwnProperty=b', { allowPrototypes: true })).to.deep.equal({ hasOwnProperty: 'b' }, { prototype: false }); - done(); - }); - - it('can return plain objects', function (done) { - - var expected = Object.create(null); - expected.a = Object.create(null); - expected.a.b = 'c'; - expected.a.hasOwnProperty = 'd'; - expect(Qs.parse('a[b]=c&a[hasOwnProperty]=d', { plainObjects: true })).to.deep.equal(expected); - expect(Qs.parse(null, { plainObjects: true })).to.deep.equal(Object.create(null)); - var expectedArray = Object.create(null); - expectedArray.a = Object.create(null); - expectedArray.a['0'] = 'b'; - expectedArray.a.c = 'd'; - expect(Qs.parse('a[]=b&a[c]=d', { plainObjects: true })).to.deep.equal(expectedArray); - done(); - }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/test/stringify.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/test/stringify.js deleted file mode 100644 index 48b7803..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/test/stringify.js +++ /dev/null @@ -1,259 +0,0 @@ -/* eslint no-extend-native:0 */ -// Load modules - -var Code = require('code'); -var Lab = require('lab'); -var Qs = require('../'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var expect = Code.expect; -var describe = lab.experiment; -var it = lab.test; - - -describe('stringify()', function () { - - it('stringifies a querystring object', function (done) { - - expect(Qs.stringify({ a: 'b' })).to.equal('a=b'); - expect(Qs.stringify({ a: 1 })).to.equal('a=1'); - expect(Qs.stringify({ a: 1, b: 2 })).to.equal('a=1&b=2'); - expect(Qs.stringify({ a: 'A_Z' })).to.equal('a=A_Z'); - expect(Qs.stringify({ a: '€' })).to.equal('a=%E2%82%AC'); - expect(Qs.stringify({ a: '' })).to.equal('a=%EE%80%80'); - expect(Qs.stringify({ a: 'א' })).to.equal('a=%D7%90'); - expect(Qs.stringify({ a: '𐐷' })).to.equal('a=%F0%90%90%B7'); - done(); - }); - - it('stringifies a nested object', function (done) { - - expect(Qs.stringify({ a: { b: 'c' } })).to.equal('a%5Bb%5D=c'); - expect(Qs.stringify({ a: { b: { c: { d: 'e' } } } })).to.equal('a%5Bb%5D%5Bc%5D%5Bd%5D=e'); - done(); - }); - - it('stringifies an array value', function (done) { - - expect(Qs.stringify({ a: ['b', 'c', 'd'] })).to.equal('a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d'); - done(); - }); - - it('omits array indices when asked', function (done) { - - expect(Qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false })).to.equal('a=b&a=c&a=d'); - done(); - }); - - it('stringifies a nested array value', function (done) { - - expect(Qs.stringify({ a: { b: ['c', 'd'] } })).to.equal('a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); - done(); - }); - - it('stringifies an object inside an array', function (done) { - - expect(Qs.stringify({ a: [{ b: 'c' }] })).to.equal('a%5B0%5D%5Bb%5D=c'); - expect(Qs.stringify({ a: [{ b: { c: [1] } }] })).to.equal('a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1'); - done(); - }); - - it('does not omit object keys when indices = false', function (done) { - - expect(Qs.stringify({ a: [{ b: 'c' }] }, { indices: false })).to.equal('a%5Bb%5D=c'); - done(); - }); - - it('uses indices notation for arrays when indices=true', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] }, { indices: true })).to.equal('a%5B0%5D=b&a%5B1%5D=c'); - done(); - }); - - it('uses indices notation for arrays when no arrayFormat is specified', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] })).to.equal('a%5B0%5D=b&a%5B1%5D=c'); - done(); - }); - - it('uses indices notation for arrays when no arrayFormat=indices', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })).to.equal('a%5B0%5D=b&a%5B1%5D=c'); - done(); - }); - - it('uses repeat notation for arrays when no arrayFormat=repeat', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })).to.equal('a=b&a=c'); - done(); - }); - - it('uses brackets notation for arrays when no arrayFormat=brackets', function (done) { - - expect(Qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })).to.equal('a%5B%5D=b&a%5B%5D=c'); - done(); - }); - - it('stringifies a complicated object', function (done) { - - expect(Qs.stringify({ a: { b: 'c', d: 'e' } })).to.equal('a%5Bb%5D=c&a%5Bd%5D=e'); - done(); - }); - - it('stringifies an empty value', function (done) { - - expect(Qs.stringify({ a: '' })).to.equal('a='); - expect(Qs.stringify({ a: null }, { strictNullHandling: true })).to.equal('a'); - - expect(Qs.stringify({ a: '', b: '' })).to.equal('a=&b='); - expect(Qs.stringify({ a: null, b: '' }, { strictNullHandling: true })).to.equal('a&b='); - - expect(Qs.stringify({ a: { b: '' } })).to.equal('a%5Bb%5D='); - expect(Qs.stringify({ a: { b: null } }, { strictNullHandling: true })).to.equal('a%5Bb%5D'); - expect(Qs.stringify({ a: { b: null } }, { strictNullHandling: false })).to.equal('a%5Bb%5D='); - - done(); - }); - - it('stringifies an empty object', function (done) { - - var obj = Object.create(null); - obj.a = 'b'; - expect(Qs.stringify(obj)).to.equal('a=b'); - done(); - }); - - it('returns an empty string for invalid input', function (done) { - - expect(Qs.stringify(undefined)).to.equal(''); - expect(Qs.stringify(false)).to.equal(''); - expect(Qs.stringify(null)).to.equal(''); - expect(Qs.stringify('')).to.equal(''); - done(); - }); - - it('stringifies an object with an empty object as a child', function (done) { - - var obj = { - a: Object.create(null) - }; - - obj.a.b = 'c'; - expect(Qs.stringify(obj)).to.equal('a%5Bb%5D=c'); - done(); - }); - - it('drops keys with a value of undefined', function (done) { - - expect(Qs.stringify({ a: undefined })).to.equal(''); - - expect(Qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true })).to.equal('a%5Bc%5D'); - expect(Qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false })).to.equal('a%5Bc%5D='); - expect(Qs.stringify({ a: { b: undefined, c: '' } })).to.equal('a%5Bc%5D='); - done(); - }); - - it('url encodes values', function (done) { - - expect(Qs.stringify({ a: 'b c' })).to.equal('a=b%20c'); - done(); - }); - - it('stringifies a date', function (done) { - - var now = new Date(); - var str = 'a=' + encodeURIComponent(now.toISOString()); - expect(Qs.stringify({ a: now })).to.equal(str); - done(); - }); - - it('stringifies the weird object from qs', function (done) { - - expect(Qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' })).to.equal('my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F'); - done(); - }); - - it('skips properties that are part of the object prototype', function (done) { - - Object.prototype.crash = 'test'; - expect(Qs.stringify({ a: 'b' })).to.equal('a=b'); - expect(Qs.stringify({ a: { b: 'c' } })).to.equal('a%5Bb%5D=c'); - delete Object.prototype.crash; - done(); - }); - - it('stringifies boolean values', function (done) { - - expect(Qs.stringify({ a: true })).to.equal('a=true'); - expect(Qs.stringify({ a: { b: true } })).to.equal('a%5Bb%5D=true'); - expect(Qs.stringify({ b: false })).to.equal('b=false'); - expect(Qs.stringify({ b: { c: false } })).to.equal('b%5Bc%5D=false'); - done(); - }); - - it('stringifies buffer values', function (done) { - - expect(Qs.stringify({ a: new Buffer('test') })).to.equal('a=test'); - expect(Qs.stringify({ a: { b: new Buffer('test') } })).to.equal('a%5Bb%5D=test'); - done(); - }); - - it('stringifies an object using an alternative delimiter', function (done) { - - expect(Qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' })).to.equal('a=b;c=d'); - done(); - }); - - it('doesn\'t blow up when Buffer global is missing', function (done) { - - var tempBuffer = global.Buffer; - delete global.Buffer; - expect(Qs.stringify({ a: 'b', c: 'd' })).to.equal('a=b&c=d'); - global.Buffer = tempBuffer; - done(); - }); - - it('selects properties when filter=array', function (done) { - - expect(Qs.stringify({ a: 'b' }, { filter: ['a'] })).to.equal('a=b'); - expect(Qs.stringify({ a: 1 }, { filter: [] })).to.equal(''); - expect(Qs.stringify({ a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, { filter: ['a', 'b', 0, 2] })).to.equal('a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3'); - done(); - - }); - - it('supports custom representations when filter=function', function (done) { - - var calls = 0; - var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } }; - var filterFunc = function (prefix, value) { - - calls++; - if (calls === 1) { - expect(prefix).to.be.empty(); - expect(value).to.equal(obj); - } - else if (prefix === 'c') { - return; - } - else if (value instanceof Date) { - expect(prefix).to.equal('e[f]'); - return value.getTime(); - } - return value; - }; - - expect(Qs.stringify(obj, { filter: filterFunc })).to.equal('a=b&e%5Bf%5D=1257894000000'); - expect(calls).to.equal(5); - done(); - - }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/test/utils.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/test/utils.js deleted file mode 100644 index a9a6b52..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/qs/test/utils.js +++ /dev/null @@ -1,28 +0,0 @@ -// Load modules - -var Code = require('code'); -var Lab = require('lab'); -var Utils = require('../lib/utils'); - - -// Declare internals - -var internals = {}; - - -// Test shortcuts - -var lab = exports.lab = Lab.script(); -var expect = Code.expect; -var describe = lab.experiment; -var it = lab.test; - - -describe('merge()', function () { - - it('can merge two objects with the same key', function (done) { - - expect(Utils.merge({ a: 'b' }, { a: 'c' })).to.deep.equal({ a: ['b', 'c'] }); - done(); - }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/.npmignore deleted file mode 100644 index 7dccd97..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/.npmignore +++ /dev/null @@ -1,15 +0,0 @@ -lib-cov -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.gz - -pids -logs -results - -node_modules -npm-debug.log \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/LICENSE.txt b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/LICENSE.txt deleted file mode 100644 index eac1881..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/LICENSE.txt +++ /dev/null @@ -1,4 +0,0 @@ -Copyright 2012 Michael Hart (michael.hart.au@gmail.com) - -This project is free software released under the MIT license: -http://www.opensource.org/licenses/mit-license.php diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/README.md deleted file mode 100644 index 32fc982..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Decode streams into strings The Right Way(tm) - -```javascript -var fs = require('fs') -var zlib = require('zlib') -var strs = require('stringstream') - -var utf8Stream = fs.createReadStream('massiveLogFile.gz') - .pipe(zlib.createGunzip()) - .pipe(strs('utf8')) -``` - -No need to deal with `setEncoding()` weirdness, just compose streams -like they were supposed to be! - -Handles input and output encoding: - -```javascript -// Stream from utf8 to hex to base64... Why not, ay. -var hex64Stream = fs.createReadStream('myFile') - .pipe(strs('utf8', 'hex')) - .pipe(strs('hex', 'base64')) -``` - -Also deals with `base64` output correctly by aligning each emitted data -chunk so that there are no dangling `=` characters: - -```javascript -var stream = fs.createReadStream('myFile').pipe(strs('base64')) - -var base64Str = '' - -stream.on('data', function(data) { base64Str += data }) -stream.on('end', function() { - console.log('My base64 encoded file is: ' + base64Str) // Wouldn't work with setEncoding() - console.log('Original file is: ' + new Buffer(base64Str, 'base64')) -}) -``` diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/example.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/example.js deleted file mode 100644 index f82b85e..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/example.js +++ /dev/null @@ -1,27 +0,0 @@ -var fs = require('fs') -var zlib = require('zlib') -var strs = require('stringstream') - -var utf8Stream = fs.createReadStream('massiveLogFile.gz') - .pipe(zlib.createGunzip()) - .pipe(strs('utf8')) - -utf8Stream.pipe(process.stdout) - -// Stream from utf8 to hex to base64... Why not, ay. -var hex64Stream = fs.createReadStream('myFile') - .pipe(strs('utf8', 'hex')) - .pipe(strs('hex', 'base64')) - -hex64Stream.pipe(process.stdout) - -// Deals with base64 correctly by aligning chunks -var stream = fs.createReadStream('myFile').pipe(strs('base64')) - -var base64Str = '' - -stream.on('data', function(data) { base64Str += data }) -stream.on('end', function() { - console.log('My base64 encoded file is: ' + base64Str) // Wouldn't work with setEncoding() - console.log('Original file is: ' + new Buffer(base64Str, 'base64')) -}) diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/package.json deleted file mode 100644 index b71cf28..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "stringstream", - "version": "0.0.4", - "description": "Encode and decode streams into string streams", - "author": { - "name": "Michael Hart", - "email": "michael.hart.au@gmail.com", - "url": "http://github.com/mhart" - }, - "main": "stringstream.js", - "keywords": [ - "string", - "stream", - "base64", - "gzip" - ], - "repository": { - "type": "git", - "url": "https://github.com/mhart/StringStream.git" - }, - "license": "MIT", - "readme": "# Decode streams into strings The Right Way(tm)\n\n```javascript\nvar fs = require('fs')\nvar zlib = require('zlib')\nvar strs = require('stringstream')\n\nvar utf8Stream = fs.createReadStream('massiveLogFile.gz')\n .pipe(zlib.createGunzip())\n .pipe(strs('utf8'))\n```\n\nNo need to deal with `setEncoding()` weirdness, just compose streams\nlike they were supposed to be!\n\nHandles input and output encoding:\n\n```javascript\n// Stream from utf8 to hex to base64... Why not, ay.\nvar hex64Stream = fs.createReadStream('myFile')\n .pipe(strs('utf8', 'hex'))\n .pipe(strs('hex', 'base64'))\n```\n\nAlso deals with `base64` output correctly by aligning each emitted data\nchunk so that there are no dangling `=` characters:\n\n```javascript\nvar stream = fs.createReadStream('myFile').pipe(strs('base64'))\n\nvar base64Str = ''\n\nstream.on('data', function(data) { base64Str += data })\nstream.on('end', function() {\n console.log('My base64 encoded file is: ' + base64Str) // Wouldn't work with setEncoding()\n console.log('Original file is: ' + new Buffer(base64Str, 'base64'))\n})\n```\n", - "readmeFilename": "README.md", - "_id": "stringstream@0.0.4", - "dist": { - "shasum": "0f0e3423f942960b5692ac324a57dd093bc41a92", - "tarball": "http://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" - }, - "_npmVersion": "1.2.0", - "_npmUser": { - "name": "hichaelmart", - "email": "michael.hart.au@gmail.com" - }, - "maintainers": [ - { - "name": "hichaelmart", - "email": "michael.hart.au@gmail.com" - } - ], - "directories": {}, - "_shasum": "0f0e3423f942960b5692ac324a57dd093bc41a92", - "_resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz", - "_from": "stringstream@>=0.0.4 <0.1.0", - "bugs": { - "url": "https://github.com/mhart/StringStream/issues" - }, - "homepage": "https://github.com/mhart/StringStream", - "scripts": {} -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/stringstream.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/stringstream.js deleted file mode 100644 index 4ece127..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/stringstream/stringstream.js +++ /dev/null @@ -1,102 +0,0 @@ -var util = require('util') -var Stream = require('stream') -var StringDecoder = require('string_decoder').StringDecoder - -module.exports = StringStream -module.exports.AlignedStringDecoder = AlignedStringDecoder - -function StringStream(from, to) { - if (!(this instanceof StringStream)) return new StringStream(from, to) - - Stream.call(this) - - if (from == null) from = 'utf8' - - this.readable = this.writable = true - this.paused = false - this.toEncoding = (to == null ? from : to) - this.fromEncoding = (to == null ? '' : from) - this.decoder = new AlignedStringDecoder(this.toEncoding) -} -util.inherits(StringStream, Stream) - -StringStream.prototype.write = function(data) { - if (!this.writable) { - var err = new Error('stream not writable') - err.code = 'EPIPE' - this.emit('error', err) - return false - } - if (this.fromEncoding) { - if (Buffer.isBuffer(data)) data = data.toString() - data = new Buffer(data, this.fromEncoding) - } - var string = this.decoder.write(data) - if (string.length) this.emit('data', string) - return !this.paused -} - -StringStream.prototype.flush = function() { - if (this.decoder.flush) { - var string = this.decoder.flush() - if (string.length) this.emit('data', string) - } -} - -StringStream.prototype.end = function() { - if (!this.writable && !this.readable) return - this.flush() - this.emit('end') - this.writable = this.readable = false - this.destroy() -} - -StringStream.prototype.destroy = function() { - this.decoder = null - this.writable = this.readable = false - this.emit('close') -} - -StringStream.prototype.pause = function() { - this.paused = true -} - -StringStream.prototype.resume = function () { - if (this.paused) this.emit('drain') - this.paused = false -} - -function AlignedStringDecoder(encoding) { - StringDecoder.call(this, encoding) - - switch (this.encoding) { - case 'base64': - this.write = alignedWrite - this.alignedBuffer = new Buffer(3) - this.alignedBytes = 0 - break - } -} -util.inherits(AlignedStringDecoder, StringDecoder) - -AlignedStringDecoder.prototype.flush = function() { - if (!this.alignedBuffer || !this.alignedBytes) return '' - var leftover = this.alignedBuffer.toString(this.encoding, 0, this.alignedBytes) - this.alignedBytes = 0 - return leftover -} - -function alignedWrite(buffer) { - var rem = (this.alignedBytes + buffer.length) % this.alignedBuffer.length - if (!rem && !this.alignedBytes) return buffer.toString(this.encoding) - - var returnBuffer = new Buffer(this.alignedBytes + buffer.length - rem) - - this.alignedBuffer.copy(returnBuffer, 0, 0, this.alignedBytes) - buffer.copy(returnBuffer, this.alignedBytes, 0, buffer.length - rem) - - buffer.copy(this.alignedBuffer, 0, buffer.length - rem, buffer.length) - this.alignedBytes = rem - - return returnBuffer.toString(this.encoding) -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.editorconfig b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.editorconfig deleted file mode 100644 index e09b844..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -# This file is for unifying the coding style for different editors and IDEs -# editorconfig.org - -root = true - -[*] -end_of_line = lf -charset = utf-8 -insert_final_newline = true -trim_trailing_whitespace = true -indent_style = space -indent_size = 2 diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.jshintrc b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.jshintrc deleted file mode 100644 index fb11913..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.jshintrc +++ /dev/null @@ -1,70 +0,0 @@ -{ - "passfail" : false, - "maxerr" : 100, - - "browser" : false, - "node" : true, - "rhino" : false, - "couch" : false, - "wsh" : false, - - "jquery" : false, - "prototypejs" : false, - "mootools" : false, - "dojo" : false, - - "debug" : false, - "devel" : false, - - "esnext" : true, - "strict" : true, - "globalstrict" : true, - - "asi" : false, - "laxbreak" : false, - "bitwise" : true, - "boss" : false, - "curly" : true, - "eqeqeq" : false, - "eqnull" : true, - "evil" : false, - "expr" : false, - "forin" : false, - "immed" : true, - "lastsemic" : true, - "latedef" : false, - "loopfunc" : false, - "noarg" : true, - "regexp" : false, - "regexdash" : false, - "scripturl" : false, - "shadow" : false, - "supernew" : false, - "undef" : true, - "unused" : true, - - "newcap" : true, - "noempty" : true, - "nonew" : true, - "nomen" : false, - "onevar" : false, - "onecase" : true, - "plusplus" : false, - "proto" : false, - "sub" : true, - "trailing" : true, - "white" : false, - - "predef": [ - "describe", - "it", - "before", - "beforeEach", - "after", - "afterEach", - "expect", - "setTimeout", - "clearTimeout" - ], - "maxlen": 0 -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.npmignore b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.npmignore deleted file mode 100644 index 5a8d2d8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -.idea -node_modules/ -.*.sw[nmop] -npm-debug.log diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.travis.yml b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.travis.yml deleted file mode 100644 index 02059d0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: node_js -node_js: -- "0.10" -- "0.12" -- iojs -matrix: - fast_finish: true - allow_failures: - - node_js: 0.11 diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/LICENSE b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/LICENSE deleted file mode 100644 index 84e0cad..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/LICENSE +++ /dev/null @@ -1,74 +0,0 @@ -Copyright (c) 2015, Salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -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. - -3. Neither the name of Salesforce.com 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. - -=== - -The following exceptions apply: - -=== - -`pubSufTest()` of generate-pubsuffix.js is in the public domain. - - // Any copyright is dedicated to the Public Domain. - // http://creativecommons.org/publicdomain/zero/1.0/ - -=== - -`public-suffix.txt` was obtained from - -via . - -That file contains the usual Mozilla triple-license, for which this project uses it -under the terms of the MPL 1.1: - - // ***** BEGIN LICENSE BLOCK ***** - // Version: MPL 1.1/GPL 2.0/LGPL 2.1 - // - // The contents of this file are subject to the Mozilla Public License Version - // 1.1 (the "License"); you may not use this file except in compliance with - // the License. You may obtain a copy of the License at - // http://www.mozilla.org/MPL/ - // - // Software distributed under the License is distributed on an "AS IS" basis, - // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - // for the specific language governing rights and limitations under the - // License. - // - // The Original Code is the Public Suffix List. - // - // The Initial Developer of the Original Code is - // Jo Hermans . - // Portions created by the Initial Developer are Copyright (C) 2007 - // the Initial Developer. All Rights Reserved. - // - // Contributor(s): - // Ruben Arakelyan - // Gervase Markham - // Pamela Greene - // David Triendl - // Jothan Frakes - // The kind representatives of many TLD registries - // - // Alternatively, the contents of this file may be used under the terms of - // either the GNU General Public License Version 2 or later (the "GPL"), or - // the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - // in which case the provisions of the GPL or the LGPL are applicable instead - // of those above. If you wish to allow use of your version of this file only - // under the terms of either the GPL or the LGPL, and not to allow others to - // use your version of this file under the terms of the MPL, indicate your - // decision by deleting the provisions above and replace them with the notice - // and other provisions required by the GPL or the LGPL. If you do not delete - // the provisions above, a recipient may use your version of this file under - // the terms of any one of the MPL, the GPL or the LGPL. - // - // ***** END LICENSE BLOCK ***** diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/README.md b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/README.md deleted file mode 100644 index 419dd48..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/README.md +++ /dev/null @@ -1,486 +0,0 @@ -[RFC6265](https://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js - -[![Build Status](https://travis-ci.org/SalesforceEng/tough-cookie.png?branch=master)](https://travis-ci.org/SalesforceEng/tough-cookie) - -[![NPM Stats](https://nodei.co/npm/tough-cookie.png?downloads=true&stars=true)](https://npmjs.org/package/tough-cookie) -![NPM Downloads](https://nodei.co/npm-dl/tough-cookie.png?months=9) - -# Synopsis - -``` javascript -var tough = require('tough-cookie'); -var Cookie = tough.Cookie; -var cookie = Cookie.parse(header); -cookie.value = 'somethingdifferent'; -header = cookie.toString(); - -var cookiejar = new tough.CookieJar(); -cookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb); -// ... -cookiejar.getCookies('http://example.com/otherpath',function(err,cookies) { - res.headers['cookie'] = cookies.join('; '); -}); -``` - -# Installation - -It's _so_ easy! - -`npm install tough-cookie` - -Why the name? NPM modules `cookie`, `cookies` and `cookiejar` were already taken. - -# API - -## tough - -Functions on the module you get from `require('tough-cookie')`. All can be used as pure functions and don't need to be "bound". - -**Note**: prior to 1.0.x, several of these functions took a `strict` parameter. This has since been removed from the API as it was no longer necessary. - -### `parseDate(string)` - -Parse a cookie date string into a `Date`. Parses according to RFC6265 Section 5.1.1, not `Date.parse()`. - -### `formatDate(date)` - -Format a Date into a RFC1123 string (the RFC6265-recommended format). - -### `canonicalDomain(str)` - -Transforms a domain-name into a canonical domain-name. The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265). For the most part, this function is idempotent (can be run again on its output without ill effects). - -### `domainMatch(str,domStr[,canonicalize=true])` - -Answers "does this real domain match the domain in a cookie?". The `str` is the "current" domain-name and the `domStr` is the "cookie" domain-name. Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a "suffix match". - -The `canonicalize` parameter will run the other two paramters through `canonicalDomain` or not. - -### `defaultPath(path)` - -Given a current request/response path, gives the Path apropriate for storing in a cookie. This is basically the "directory" of a "file" in the path, but is specified by Section 5.1.4 of the RFC. - -The `path` parameter MUST be _only_ the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.). This is the `.pathname` property of node's `uri.parse()` output. - -### `pathMatch(reqPath,cookiePath)` - -Answers "does the request-path path-match a given cookie-path?" as per RFC6265 Section 5.1.4. Returns a boolean. - -This is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`. - -### `parse(header)` - -alias for `Cookie.parse(header)` - -### `fromJSON(string)` - -alias for `Cookie.fromJSON(string)` - -### `getPublicSuffix(hostname)` - -Returns the public suffix of this hostname. The public suffix is the shortest domain-name upon which a cookie can be set. Returns `null` if the hostname cannot have cookies set for it. - -For example: `www.example.com` and `www.subdomain.example.com` both have public suffix `example.com`. - -For further information, see http://publicsuffix.org/. This module derives its list from that site. - -### `cookieCompare(a,b)` - -For use with `.sort()`, sorts a list of cookies into the recommended order given in the RFC (Section 5.4 step 2). The sort algorithm is, in order of precedence: - -* Longest `.path` -* oldest `.creation` (which has a 1ms precision, same as `Date`) -* lowest `.creationIndex` (to get beyond the 1ms precision) - -``` javascript -var cookies = [ /* unsorted array of Cookie objects */ ]; -cookies = cookies.sort(cookieCompare); -``` - -**Note**: Since JavaScript's `Date` is limited to a 1ms precision, cookies within the same milisecond are entirely possible. This is especially true when using the `now` option to `.setCookie()`. The `.creationIndex` property is a per-process global counter, assigned during construction with `new Cookie()`. This preserves the spirit of the RFC sorting: older cookies go first. This works great for `MemoryCookieStore`, since `Set-Cookie` headers are parsed in order, but may not be so great for distributed systems. Sophisticated `Store`s may wish to set this to some other _logical clock_ such that if cookies A and B are created in the same millisecond, but cookie A is created before cookie B, then `A.creationIndex < B.creationIndex`. If you want to alter the global counter, which you probably _shouldn't_ do, it's stored in `Cookie.cookiesCreated`. - -### `permuteDomain(domain)` - -Generates a list of all possible domains that `domainMatch()` the parameter. May be handy for implementing cookie stores. - -### `permutePath(path)` - -Generates a list of all possible paths that `pathMatch()` the parameter. May be handy for implementing cookie stores. - - -## Cookie - -Exported via `tough.Cookie`. - -### `Cookie.parse(header)` - -Parses a single Cookie or Set-Cookie HTTP header into a `Cookie` object. Returns `undefined` if the string can't be parsed. - -Here's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response: - -``` javascript -if (res.headers['set-cookie'] instanceof Array) - cookies = res.headers['set-cookie'].map(function (c) { return (Cookie.parse(c)); }); -else - cookies = [Cookie.parse(res.headers['set-cookie'])]; -``` - -### Properties - -Cookie object properties: - - * _key_ - string - the name or key of the cookie (default "") - * _value_ - string - the value of the cookie (default "") - * _expires_ - `Date` - if set, the `Expires=` attribute of the cookie (defaults to the string `"Infinity"`). See `setExpires()` - * _maxAge_ - seconds - if set, the `Max-Age=` attribute _in seconds_ of the cookie. May also be set to strings `"Infinity"` and `"-Infinity"` for non-expiry and immediate-expiry, respectively. See `setMaxAge()` - * _domain_ - string - the `Domain=` attribute of the cookie - * _path_ - string - the `Path=` of the cookie - * _secure_ - boolean - the `Secure` cookie flag - * _httpOnly_ - boolean - the `HttpOnly` cookie flag - * _extensions_ - `Array` - any unrecognized cookie attributes as strings (even if equal-signs inside) - * _creation_ - `Date` - when this cookie was constructed - * _creationIndex_ - number - set at construction, used to provide greater sort precision (please see `cookieCompare(a,b)` for a full explanation) - -After a cookie has been passed through `CookieJar.setCookie()` it will have the following additional attributes: - - * _hostOnly_ - boolean - is this a host-only cookie (i.e. no Domain field was set, but was instead implied) - * _pathIsDefault_ - boolean - if true, there was no Path field on the cookie and `defaultPath()` was used to derive one. - * _creation_ - `Date` - **modified** from construction to when the cookie was added to the jar - * _lastAccessed_ - `Date` - last time the cookie got accessed. Will affect cookie cleaning once implemented. Using `cookiejar.getCookies(...)` will update this attribute. - -### `Cookie([{properties}])` - -Receives an options object that can contain any of the above Cookie properties, uses the default for unspecified properties. - -### `.toString()` - -encode to a Set-Cookie header value. The Expires cookie field is set using `formatDate()`, but is omitted entirely if `.expires` is `Infinity`. - -### `.cookieString()` - -encode to a Cookie header value (i.e. the `.key` and `.value` properties joined with '='). - -### `.setExpires(String)` - -sets the expiry based on a date-string passed through `parseDate()`. If parseDate returns `null` (i.e. can't parse this date string), `.expires` is set to `"Infinity"` (a string) is set. - -### `.setMaxAge(number)` - -sets the maxAge in seconds. Coerces `-Infinity` to `"-Infinity"` and `Infinity` to `"Infinity"` so it JSON serializes correctly. - -### `.expiryTime([now=Date.now()])` - -### `.expiryDate([now=Date.now()])` - -expiryTime() Computes the absolute unix-epoch milliseconds that this cookie expires. expiryDate() works similarly, except it returns a `Date` object. Note that in both cases the `now` parameter should be milliseconds. - -Max-Age takes precedence over Expires (as per the RFC). The `.creation` attribute -- or, by default, the `now` paramter -- is used to offset the `.maxAge` attribute. - -If Expires (`.expires`) is set, that's returned. - -Otherwise, `expiryTime()` returns `Infinity` and `expiryDate()` returns a `Date` object for "Tue, 19 Jan 2038 03:14:07 GMT" (latest date that can be expressed by a 32-bit `time_t`; the common limit for most user-agents). - -### `.TTL([now=Date.now()])` - -compute the TTL relative to `now` (milliseconds). The same precedence rules as for `expiryTime`/`expiryDate` apply. - -The "number" `Infinity` is returned for cookies without an explicit expiry and `0` is returned if the cookie is expired. Otherwise a time-to-live in milliseconds is returned. - -### `.canonicalizedDoman()` - -### `.cdomain()` - -return the canonicalized `.domain` field. This is lower-cased and punycode (RFC3490) encoded if the domain has any non-ASCII characters. - -### `.toJSON()` - -For convenience in using `JSON.serialize(cookie)`. Returns a plain-old `Object` that can be JSON-serialized. - -Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are exported in ISO format (`.toISOString()`). - -**NOTE**: Custom `Cookie` properties will be discarded. In tough-cookie 1.x, since there was no `.toJSON` method explicitly defined, all enumerable properties were captured. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array. - -### `Cookie.fromJSON(strOrObj)` - -Does the reverse of `cookie.toJSON()`. If passed a string, will `JSON.parse()` that first. - -Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are parsed via `Date.parse()`, not the tough-cookie `parseDate`, since it's JavaScript/JSON-y timestamps being handled at this layer. - -Returns `null` upon JSON parsing error. - -### `.clone()` - -Does a deep clone of this cookie, exactly implemented as `Cookie.fromJSON(cookie.toJSON())`. - -### `.validate()` - -Status: *IN PROGRESS*. Works for a few things, but is by no means comprehensive. - -validates cookie attributes for semantic correctness. Useful for "lint" checking any Set-Cookie headers you generate. For now, it returns a boolean, but eventually could return a reason string -- you can future-proof with this construct: - -``` javascript -if (cookie.validate() === true) { - // it's tasty -} else { - // yuck! -} -``` - - -## CookieJar - -Exported via `tough.CookieJar`. - -### `CookieJar([store],[rejectPublicSuffixes])` - -Simply use `new CookieJar()`. If you'd like to use a custom store, pass that to the constructor otherwise a `MemoryCookieStore` will be created and used. - -### Properties - -CookieJar object properties: - - * _rejectPublicSuffixes_ - boolean - reject cookies with domains like "com" and "co.uk" (default: `true`) - -Since eventually this module would like to support database/remote/etc. CookieJars, continuation passing style is used for CookieJar methods. - -### `.setCookie(cookieOrString, currentUrl, [{options},] cb(err,cookie))` - -Attempt to set the cookie in the cookie jar. If the operation fails, an error will be given to the callback `cb`, otherwise the cookie is passed through. The cookie will have updated `.creation`, `.lastAccessed` and `.hostOnly` properties. - -The `options` object can be omitted and can have the following properties: - - * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies. - * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`. - * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies - * _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains. `Store` errors aren't ignored by this option. - -As per the RFC, the `.hostOnly` property is set if there was no "Domain=" parameter in the cookie string (or `.domain` was null on the Cookie object). The `.domain` property is set to the fully-qualified hostname of `currentUrl` in this case. Matching this cookie requires an exact hostname match (not a `domainMatch` as per usual). - -### `.setCookieSync(cookieOrString, currentUrl, [{options}])` - -Synchronous version of `setCookie`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). - -### `.getCookies(currentUrl, [{options},] cb(err,cookies))` - -Retrieve the list of cookies that can be sent in a Cookie header for the current url. - -If an error is encountered, that's passed as `err` to the callback, otherwise an `Array` of `Cookie` objects is passed. The array is sorted with `cookieCompare()` unless the `{sort:false}` option is given. - -The `options` object can be omitted and can have the following properties: - - * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies. - * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`. - * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies - * _expire_ - boolean - default `true` - perform expiry-time checking of cookies and asynchronously remove expired cookies from the store. Using `false` will return expired cookies and **not** remove them from the store (which is useful for replaying Set-Cookie headers, potentially). - * _allPaths_ - boolean - default `false` - if `true`, do not scope cookies by path. The default uses RFC-compliant path scoping. **Note**: may not be supported by the underlying store (the default `MemoryCookieStore` supports it). - -The `.lastAccessed` property of the returned cookies will have been updated. - -### `.getCookiesSync(currentUrl, [{options}])` - -Synchronous version of `getCookies`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). - -### `.getCookieString(...)` - -Accepts the same options as `.getCookies()` but passes a string suitable for a Cookie header rather than an array to the callback. Simply maps the `Cookie` array via `.cookieString()`. - -### `.getCookieStringSync(...)` - -Synchronous version of `getCookieString`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). - -### `.getSetCookieStrings(...)` - -Returns an array of strings suitable for **Set-Cookie** headers. Accepts the same options as `.getCookies()`. Simply maps the cookie array via `.toString()`. - -### `.getSetCookieStringsSync(...)` - -Synchronous version of `getSetCookieStrings`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). - -### `.serialize(cb(err,serializedObject))` - -Serialize the Jar if the underlying store supports `.getAllCookies`. - -**NOTE**: Custom `Cookie` properties will be discarded. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array. - -See [Serialization Format]. - -### `.serializeSync()` - -Sync version of .serialize - -### `.toJSON()` - -Alias of .serializeSync() for the convenience of `JSON.stringify(cookiejar)`. - -### `CookieJar.deserialize(serialized, [store], cb(err,object))` - -A new Jar is created and the serialized Cookies are added to the underlying store. Each `Cookie` is added via `store.putCookie` in the order in which they appear in the serialization. - -The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created. - -As a convenience, if `serialized` is a string, it is passed through `JSON.parse` first. If that throws an error, this is passed to the callback. - -### `CookieJar.deserializeSync(serialized, [store])` - -Sync version of `.deserialize`. _Note_ that the `store` must be synchronous for this to work. - -### `CookieJar.fromJSON(string)` - -Alias of `.deserializeSync` to provide consistency with `Cookie.fromJSON()`. - -### `.clone([store,]cb(err,newJar))` - -Produces a deep clone of this jar. Modifications to the original won't affect the clone, and vice versa. - -The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created. Transferring between store types is supported so long as the source implements `.getAllCookies()` and the destination implements `.putCookie()`. - -### `.cloneSync([store])` - -Synchronous version of `.clone`, returning a new `CookieJar` instance. - -The `store` argument is optional, but must be a _synchronous_ `Store` instance if specified. If not passed, a new instance of `MemoryCookieStore` is used. - -The _source_ and _destination_ must both be synchronous `Store`s. If one or both stores are asynchronous, use `.clone` instead. Recall that `MemoryCookieStore` supports both synchronous and asynchronous API calls. - -## Store - -Base class for CookieJar stores. Available as `tough.Store`. - -## Store API - -The storage model for each `CookieJar` instance can be replaced with a custom implementation. The default is `MemoryCookieStore` which can be found in the `lib/memstore.js` file. The API uses continuation-passing-style to allow for asynchronous stores. - -Stores should inherit from the base `Store` class, which is available as `require('tough-cookie').Store`. - -Stores are asynchronous by default, but if `store.synchronous` is set to `true`, then the `*Sync` methods on the of the containing `CookieJar` can be used (however, the continuation-passing style - -All `domain` parameters will have been normalized before calling. - -The Cookie store must have all of the following methods. - -### `store.findCookie(domain, path, key, cb(err,cookie))` - -Retrieve a cookie with the given domain, path and key (a.k.a. name). The RFC maintains that exactly one of these cookies should exist in a store. If the store is using versioning, this means that the latest/newest such cookie should be returned. - -Callback takes an error and the resulting `Cookie` object. If no cookie is found then `null` MUST be passed instead (i.e. not an error). - -### `store.findCookies(domain, path, cb(err,cookies))` - -Locates cookies matching the given domain and path. This is most often called in the context of `cookiejar.getCookies()` above. - -If no cookies are found, the callback MUST be passed an empty array. - -The resulting list will be checked for applicability to the current request according to the RFC (domain-match, path-match, http-only-flag, secure-flag, expiry, etc.), so it's OK to use an optimistic search algorithm when implementing this method. However, the search algorithm used SHOULD try to find cookies that `domainMatch()` the domain and `pathMatch()` the path in order to limit the amount of checking that needs to be done. - -As of version 0.9.12, the `allPaths` option to `cookiejar.getCookies()` above will cause the path here to be `null`. If the path is `null`, path-matching MUST NOT be performed (i.e. domain-matching only). - -### `store.putCookie(cookie, cb(err))` - -Adds a new cookie to the store. The implementation SHOULD replace any existing cookie with the same `.domain`, `.path`, and `.key` properties -- depending on the nature of the implementation, it's possible that between the call to `fetchCookie` and `putCookie` that a duplicate `putCookie` can occur. - -The `cookie` object MUST NOT be modified; the caller will have already updated the `.creation` and `.lastAccessed` properties. - -Pass an error if the cookie cannot be stored. - -### `store.updateCookie(oldCookie, newCookie, cb(err))` - -Update an existing cookie. The implementation MUST update the `.value` for a cookie with the same `domain`, `.path` and `.key`. The implementation SHOULD check that the old value in the store is equivalent to `oldCookie` - how the conflict is resolved is up to the store. - -The `.lastAccessed` property will always be different between the two objects (to the precision possible via JavaScript's clock). Both `.creation` and `.creationIndex` are guaranteed to be the same. Stores MAY ignore or defer the `.lastAccessed` change at the cost of affecting how cookies are selected for automatic deletion (e.g., least-recently-used, which is up to the store to implement). - -Stores may wish to optimize changing the `.value` of the cookie in the store versus storing a new cookie. If the implementation doesn't define this method a stub that calls `putCookie(newCookie,cb)` will be added to the store object. - -The `newCookie` and `oldCookie` objects MUST NOT be modified. - -Pass an error if the newCookie cannot be stored. - -### `store.removeCookie(domain, path, key, cb(err))` - -Remove a cookie from the store (see notes on `findCookie` about the uniqueness constraint). - -The implementation MUST NOT pass an error if the cookie doesn't exist; only pass an error due to the failure to remove an existing cookie. - -### `store.removeCookies(domain, path, cb(err))` - -Removes matching cookies from the store. The `path` parameter is optional, and if missing means all paths in a domain should be removed. - -Pass an error ONLY if removing any existing cookies failed. - -### `store.getAllCookies(cb(err, cookies))` - -Produces an `Array` of all cookies during `jar.serialize()`. The items in the array can be true `Cookie` objects or generic `Object`s with the [Serialization Format] data structure. - -Cookies SHOULD be returned in creation order to preserve sorting via `compareCookies()`. For reference, `MemoryCookieStore` will sort by `.creationIndex` since it uses true `Cookie` objects internally. If you don't return the cookies in creation order, they'll still be sorted by creation time, but this only has a precision of 1ms. See `compareCookies` for more detail. - -Pass an error if retrieval fails. - -## MemoryCookieStore - -Inherits from `Store`. - -A just-in-memory CookieJar synchronous store implementation, used by default. Despite being a synchronous implementation, it's usable with both the synchronous and asynchronous forms of the `CookieJar` API. - -# Serialization Format - -**NOTE**: if you want to have custom `Cookie` properties serialized, add the property name to `Cookie.serializableProperties`. - -```js - { - // The version of tough-cookie that serialized this jar. - version: 'tough-cookie@1.x.y', - - // add the store type, to make humans happy: - storeType: 'MemoryCookieStore', - - // CookieJar configuration: - rejectPublicSuffixes: true, - // ... future items go here - - // Gets filled from jar.store.getAllCookies(): - cookies: [ - { - key: 'string', - value: 'string', - // ... - /* other Cookie.serializableProperties go here */ - } - ] - } -``` - -# Copyright and License - -(tl;dr: BSD-3-Clause with some MPL/1.1) - -```text - Copyright (c) 2015, Salesforce.com, Inc. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 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. - - 3. Neither the name of Salesforce.com 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. -``` - -Portions may be licensed under different licenses (in particular public-suffix.txt is MPL/1.1); please read the LICENSE file for full details. diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js deleted file mode 100644 index ba054f4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js +++ /dev/null @@ -1,293 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ -'use strict'; -var fs = require('fs'); -var assert = require('assert'); -var punycode = require('punycode'); - -fs.readFile('./public-suffix.txt', 'utf8', function(err,string) { - if (err) { - throw err; - } - var lines = string.split("\n"); - process.nextTick(function() { - processList(lines); - }); -}); - -var index = {}; - -var COMMENT = new RegExp('//.+'); -function processList(lines) { - while (lines.length) { - var line = lines.shift(); - line = line.replace(COMMENT,'').trim(); - if (!line) { - continue; - } - addToIndex(index,line); - } - - pubSufTest(); - - var w = fs.createWriteStream('./lib/pubsuffix.js',{ - flags: 'w', - encoding: 'utf8', - mode: parseInt('644',8) - }); - w.on('end', process.exit); - w.write("/****************************************************\n"); - w.write(" * AUTOMATICALLY GENERATED by generate-pubsuffix.js *\n"); - w.write(" * DO NOT EDIT! *\n"); - w.write(" ****************************************************/\n\n"); - - w.write('"use strict";\n\n'); - w.write("var punycode = require('punycode');\n\n"); - - w.write("module.exports.getPublicSuffix = "); - w.write(getPublicSuffix.toString()); - w.write(";\n\n"); - - w.write("// The following generated structure is used under the MPL version 1.1\n"); - w.write("// See public-suffix.txt for more information\n\n"); - w.write("var index = module.exports.index = Object.freeze(\n"); - w.write(JSON.stringify(index)); - w.write(");\n\n"); - w.write("// END of automatically generated file\n"); - - w.end(); -} - -function addToIndex(index,line) { - var prefix = ''; - if (line.replace(/^(!|\*\.)/)) { - prefix = RegExp.$1; - line = line.slice(prefix.length); - } - line = prefix + punycode.toASCII(line); - - if (line.substr(0,1) == '!') { - index[line.substr(1)] = false; - } else { - index[line] = true; - } -} - -// include the licence in the function since it gets written to pubsuffix.js -function getPublicSuffix(domain) { - /*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ - if (!domain) { - return null; - } - if (domain.match(/^\./)) { - return null; - } - var asciiDomain = punycode.toASCII(domain); - var converted = false; - if (asciiDomain !== domain) { - domain = asciiDomain; - converted = true; - } - if (index[domain]) { - return null; - } - - domain = domain.toLowerCase(); - var parts = domain.split('.').reverse(); - - var suffix = ''; - var suffixLen = 0; - for (var i=0; i suffixLen) { - var publicSuffix = parts.slice(0,suffixLen+1).reverse().join('.'); - return converted ? punycode.toUnicode(publicSuffix) : publicSuffix; - } - - return null; -} - -function checkPublicSuffix(give,get) { - var got = getPublicSuffix(give); - assert.equal(got, get, give+' should be '+(get==null?'NULL':get)+' but got '+got); -} - -// pubSufTest() was converted to JavaScript from http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit/data/test_psl.txt?raw=1 -function pubSufTest() { - // For this function-scope and this function-scope ONLY: - // Any copyright is dedicated to the Public Domain. - // http://creativecommons.org/publicdomain/zero/1.0/ - - // NULL input. - checkPublicSuffix(null, null); - // Mixed case. - checkPublicSuffix('COM', null); - checkPublicSuffix('example.COM', 'example.com'); - checkPublicSuffix('WwW.example.COM', 'example.com'); - // Leading dot. - checkPublicSuffix('.com', null); - checkPublicSuffix('.example', null); - checkPublicSuffix('.example.com', null); - checkPublicSuffix('.example.example', null); - // Unlisted TLD. - checkPublicSuffix('example', null); - checkPublicSuffix('example.example', 'example.example'); - checkPublicSuffix('b.example.example', 'example.example'); - checkPublicSuffix('a.b.example.example', 'example.example'); - // Listed, but non-Internet, TLD. - //checkPublicSuffix('local', null); - //checkPublicSuffix('example.local', null); - //checkPublicSuffix('b.example.local', null); - //checkPublicSuffix('a.b.example.local', null); - // TLD with only 1 rule. - checkPublicSuffix('biz', null); - checkPublicSuffix('domain.biz', 'domain.biz'); - checkPublicSuffix('b.domain.biz', 'domain.biz'); - checkPublicSuffix('a.b.domain.biz', 'domain.biz'); - // TLD with some 2-level rules. - checkPublicSuffix('com', null); - checkPublicSuffix('example.com', 'example.com'); - checkPublicSuffix('b.example.com', 'example.com'); - checkPublicSuffix('a.b.example.com', 'example.com'); - checkPublicSuffix('uk.com', null); - checkPublicSuffix('example.uk.com', 'example.uk.com'); - checkPublicSuffix('b.example.uk.com', 'example.uk.com'); - checkPublicSuffix('a.b.example.uk.com', 'example.uk.com'); - checkPublicSuffix('test.ac', 'test.ac'); - // TLD with only 1 (wildcard) rule. - checkPublicSuffix('cy', null); - checkPublicSuffix('c.cy', null); - checkPublicSuffix('b.c.cy', 'b.c.cy'); - checkPublicSuffix('a.b.c.cy', 'b.c.cy'); - // More complex TLD. - checkPublicSuffix('jp', null); - checkPublicSuffix('test.jp', 'test.jp'); - checkPublicSuffix('www.test.jp', 'test.jp'); - checkPublicSuffix('ac.jp', null); - checkPublicSuffix('test.ac.jp', 'test.ac.jp'); - checkPublicSuffix('www.test.ac.jp', 'test.ac.jp'); - checkPublicSuffix('kyoto.jp', null); - checkPublicSuffix('test.kyoto.jp', 'test.kyoto.jp'); - checkPublicSuffix('ide.kyoto.jp', null); - checkPublicSuffix('b.ide.kyoto.jp', 'b.ide.kyoto.jp'); - checkPublicSuffix('a.b.ide.kyoto.jp', 'b.ide.kyoto.jp'); - checkPublicSuffix('c.kobe.jp', null); - checkPublicSuffix('b.c.kobe.jp', 'b.c.kobe.jp'); - checkPublicSuffix('a.b.c.kobe.jp', 'b.c.kobe.jp'); - checkPublicSuffix('city.kobe.jp', 'city.kobe.jp'); - checkPublicSuffix('www.city.kobe.jp', 'city.kobe.jp'); - // TLD with a wildcard rule and exceptions. - checkPublicSuffix('ck', null); - checkPublicSuffix('test.ck', null); - checkPublicSuffix('b.test.ck', 'b.test.ck'); - checkPublicSuffix('a.b.test.ck', 'b.test.ck'); - checkPublicSuffix('www.ck', 'www.ck'); - checkPublicSuffix('www.www.ck', 'www.ck'); - // US K12. - checkPublicSuffix('us', null); - checkPublicSuffix('test.us', 'test.us'); - checkPublicSuffix('www.test.us', 'test.us'); - checkPublicSuffix('ak.us', null); - checkPublicSuffix('test.ak.us', 'test.ak.us'); - checkPublicSuffix('www.test.ak.us', 'test.ak.us'); - checkPublicSuffix('k12.ak.us', null); - checkPublicSuffix('test.k12.ak.us', 'test.k12.ak.us'); - checkPublicSuffix('www.test.k12.ak.us', 'test.k12.ak.us'); - // IDN labels. - checkPublicSuffix('食狮.com.cn', '食狮.com.cn'); - checkPublicSuffix('食狮.公司.cn', '食狮.公司.cn'); - checkPublicSuffix('www.食狮.公司.cn', '食狮.公司.cn'); - checkPublicSuffix('shishi.公司.cn', 'shishi.公司.cn'); - checkPublicSuffix('公司.cn', null); - checkPublicSuffix('食狮.中国', '食狮.中国'); - checkPublicSuffix('www.食狮.中国', '食狮.中国'); - checkPublicSuffix('shishi.中国', 'shishi.中国'); - checkPublicSuffix('中国', null); - // Same as above, but punycoded. - checkPublicSuffix('xn--85x722f.com.cn', 'xn--85x722f.com.cn'); - checkPublicSuffix('xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); - checkPublicSuffix('www.xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); - checkPublicSuffix('shishi.xn--55qx5d.cn', 'shishi.xn--55qx5d.cn'); - checkPublicSuffix('xn--55qx5d.cn', null); - checkPublicSuffix('xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'); - checkPublicSuffix('www.xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'); - checkPublicSuffix('shishi.xn--fiqs8s', 'shishi.xn--fiqs8s'); - checkPublicSuffix('xn--fiqs8s', null); -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/lib/cookie.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/lib/cookie.js deleted file mode 100644 index 4f677c3..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/lib/cookie.js +++ /dev/null @@ -1,1309 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ -'use strict'; -var net = require('net'); -var urlParse = require('url').parse; -var pubsuffix = require('./pubsuffix'); -var Store = require('./store').Store; -var MemoryCookieStore = require('./memstore').MemoryCookieStore; -var pathMatch = require('./pathMatch').pathMatch; -var VERSION = require('../package.json').version; - -var punycode; -try { - punycode = require('punycode'); -} catch(e) { - console.warn("cookie: can't load punycode; won't use punycode for domain normalization"); -} - -var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/; - -// From RFC6265 S4.1.1 -// note that it excludes \x3B ";" -var COOKIE_OCTET = /[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]/; -var COOKIE_OCTETS = new RegExp('^'+COOKIE_OCTET.source+'$'); - -// Double quotes are part of the value (see: S4.1.1). -// '\r', '\n' and '\0' should be treated as a terminator in the "relaxed" mode -// (see: https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60) -// '=' and ';' are attribute/values separators -// (see: https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L64) -var COOKIE_PAIR = /^([^=;]+)\s*=\s*(("?)[^\n\r\0]*\3)/; - -// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or ";"' -// Note ';' is \x3B -var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/; - -// Used for checking whether or not there is a trailing semi-colon -var TRAILING_SEMICOLON = /;+$/; - -var DAY_OF_MONTH = /^(\d{1,2})[^\d]*$/; -var TIME = /^(\d{1,2})[^\d]*:(\d{1,2})[^\d]*:(\d{1,2})[^\d]*$/; -var MONTH = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)/i; - -var MONTH_TO_NUM = { - jan:0, feb:1, mar:2, apr:3, may:4, jun:5, - jul:6, aug:7, sep:8, oct:9, nov:10, dec:11 -}; -var NUM_TO_MONTH = [ - 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' -]; -var NUM_TO_DAY = [ - 'Sun','Mon','Tue','Wed','Thu','Fri','Sat' -]; - -var YEAR = /^(\d{2}|\d{4})$/; // 2 to 4 digits - -var MAX_TIME = 2147483647000; // 31-bit max -var MIN_TIME = 0; // 31-bit min - - -// RFC6265 S5.1.1 date parser: -function parseDate(str) { - if (!str) { - return; - } - - /* RFC6265 S5.1.1: - * 2. Process each date-token sequentially in the order the date-tokens - * appear in the cookie-date - */ - var tokens = str.split(DATE_DELIM); - if (!tokens) { - return; - } - - var hour = null; - var minutes = null; - var seconds = null; - var day = null; - var month = null; - var year = null; - - for (var i=0; i 23 || minutes > 59 || seconds > 59) { - return; - } - - continue; - } - } - - /* 2.2. If the found-day-of-month flag is not set and the date-token matches - * the day-of-month production, set the found-day-of- month flag and set - * the day-of-month-value to the number denoted by the date-token. Skip - * the remaining sub-steps and continue to the next date-token. - */ - if (day === null) { - result = DAY_OF_MONTH.exec(token); - if (result) { - day = parseInt(result, 10); - /* RFC6265 S5.1.1.5: - * [fail if] the day-of-month-value is less than 1 or greater than 31 - */ - if(day < 1 || day > 31) { - return; - } - continue; - } - } - - /* 2.3. If the found-month flag is not set and the date-token matches the - * month production, set the found-month flag and set the month-value to - * the month denoted by the date-token. Skip the remaining sub-steps and - * continue to the next date-token. - */ - if (month === null) { - result = MONTH.exec(token); - if (result) { - month = MONTH_TO_NUM[result[1].toLowerCase()]; - continue; - } - } - - /* 2.4. If the found-year flag is not set and the date-token matches the year - * production, set the found-year flag and set the year-value to the number - * denoted by the date-token. Skip the remaining sub-steps and continue to - * the next date-token. - */ - if (year === null) { - result = YEAR.exec(token); - if (result) { - year = parseInt(result[0], 10); - /* From S5.1.1: - * 3. If the year-value is greater than or equal to 70 and less - * than or equal to 99, increment the year-value by 1900. - * 4. If the year-value is greater than or equal to 0 and less - * than or equal to 69, increment the year-value by 2000. - */ - if (70 <= year && year <= 99) { - year += 1900; - } else if (0 <= year && year <= 69) { - year += 2000; - } - - if (year < 1601) { - return; // 5. ... the year-value is less than 1601 - } - } - } - } - - if (seconds === null || day === null || month === null || year === null) { - return; // 5. ... at least one of the found-day-of-month, found-month, found- - // year, or found-time flags is not set, - } - - return new Date(Date.UTC(year, month, day, hour, minutes, seconds)); -} - -function formatDate(date) { - var d = date.getUTCDate(); d = d >= 10 ? d : '0'+d; - var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h; - var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m; - var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s; - return NUM_TO_DAY[date.getUTCDay()] + ', ' + - d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+ - h+':'+m+':'+s+' GMT'; -} - -// S5.1.2 Canonicalized Host Names -function canonicalDomain(str) { - if (str == null) { - return null; - } - str = str.trim().replace(/^\./,''); // S4.1.2.3 & S5.2.3: ignore leading . - - // convert to IDN if any non-ASCII characters - if (punycode && /[^\u0001-\u007f]/.test(str)) { - str = punycode.toASCII(str); - } - - return str.toLowerCase(); -} - -// S5.1.3 Domain Matching -function domainMatch(str, domStr, canonicalize) { - if (str == null || domStr == null) { - return null; - } - if (canonicalize !== false) { - str = canonicalDomain(str); - domStr = canonicalDomain(domStr); - } - - /* - * "The domain string and the string are identical. (Note that both the - * domain string and the string will have been canonicalized to lower case at - * this point)" - */ - if (str == domStr) { - return true; - } - - /* "All of the following [three] conditions hold:" (order adjusted from the RFC) */ - - /* "* The string is a host name (i.e., not an IP address)." */ - if (net.isIP(str)) { - return false; - } - - /* "* The domain string is a suffix of the string" */ - var idx = str.indexOf(domStr); - if (idx <= 0) { - return false; // it's a non-match (-1) or prefix (0) - } - - // e.g "a.b.c".indexOf("b.c") === 2 - // 5 === 3+2 - if (str.length !== domStr.length + idx) { // it's not a suffix - return false; - } - - /* "* The last character of the string that is not included in the domain - * string is a %x2E (".") character." */ - if (str.substr(idx-1,1) !== '.') { - return false; - } - - return true; -} - - -// RFC6265 S5.1.4 Paths and Path-Match - -/* - * "The user agent MUST use an algorithm equivalent to the following algorithm - * to compute the default-path of a cookie:" - * - * Assumption: the path (and not query part or absolute uri) is passed in. - */ -function defaultPath(path) { - // "2. If the uri-path is empty or if the first character of the uri-path is not - // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps. - if (!path || path.substr(0,1) !== "/") { - return "/"; - } - - // "3. If the uri-path contains no more than one %x2F ("/") character, output - // %x2F ("/") and skip the remaining step." - if (path === "/") { - return path; - } - - var rightSlash = path.lastIndexOf("/"); - if (rightSlash === 0) { - return "/"; - } - - // "4. Output the characters of the uri-path from the first character up to, - // but not including, the right-most %x2F ("/")." - return path.slice(0, rightSlash); -} - - -function parse(str) { - str = str.trim(); - - // S4.1.1 Trailing semi-colons are not part of the specification. - var semiColonCheck = TRAILING_SEMICOLON.exec(str); - if (semiColonCheck) { - str = str.slice(0, semiColonCheck.index); - } - - // We use a regex to parse the "name-value-pair" part of S5.2 - var firstSemi = str.indexOf(';'); // S5.2 step 1 - var result = COOKIE_PAIR.exec(firstSemi === -1 ? str : str.substr(0,firstSemi)); - - // Rx satisfies the "the name string is empty" and "lacks a %x3D ("=")" - // constraints as well as trimming any whitespace. - if (!result) { - return; - } - - var c = new Cookie(); - c.key = result[1].trim(); - c.value = result[2].trim(); - - if (firstSemi === -1) { - return c; - } - - // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string - // (including the %x3B (";") in question)." plus later on in the same section - // "discard the first ";" and trim". - var unparsed = str.slice(firstSemi).replace(/^\s*;\s*/,'').trim(); - - // "If the unparsed-attributes string is empty, skip the rest of these - // steps." - if (unparsed.length === 0) { - return c; - } - - /* - * S5.2 says that when looping over the items "[p]rocess the attribute-name - * and attribute-value according to the requirements in the following - * subsections" for every item. Plus, for many of the individual attributes - * in S5.3 it says to use the "attribute-value of the last attribute in the - * cookie-attribute-list". Therefore, in this implementation, we overwrite - * the previous value. - */ - var cookie_avs = unparsed.split(/\s*;\s*/); - while (cookie_avs.length) { - var av = cookie_avs.shift(); - var av_sep = av.indexOf('='); - var av_key, av_value; - - if (av_sep === -1) { - av_key = av; - av_value = null; - } else { - av_key = av.substr(0,av_sep); - av_value = av.substr(av_sep+1); - } - - av_key = av_key.trim().toLowerCase(); - - if (av_value) { - av_value = av_value.trim(); - } - - switch(av_key) { - case 'expires': // S5.2.1 - if (av_value) { - var exp = parseDate(av_value); - // "If the attribute-value failed to parse as a cookie date, ignore the - // cookie-av." - if (exp) { - // over and underflow not realistically a concern: V8's getTime() seems to - // store something larger than a 32-bit time_t (even with 32-bit node) - c.expires = exp; - } - } - break; - - case 'max-age': // S5.2.2 - if (av_value) { - // "If the first character of the attribute-value is not a DIGIT or a "-" - // character ...[or]... If the remainder of attribute-value contains a - // non-DIGIT character, ignore the cookie-av." - if (/^-?[0-9]+$/.test(av_value)) { - var delta = parseInt(av_value, 10); - // "If delta-seconds is less than or equal to zero (0), let expiry-time - // be the earliest representable date and time." - c.setMaxAge(delta); - } - } - break; - - case 'domain': // S5.2.3 - // "If the attribute-value is empty, the behavior is undefined. However, - // the user agent SHOULD ignore the cookie-av entirely." - if (av_value) { - // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E - // (".") character." - var domain = av_value.trim().replace(/^\./, ''); - if (domain) { - // "Convert the cookie-domain to lower case." - c.domain = domain.toLowerCase(); - } - } - break; - - case 'path': // S5.2.4 - /* - * "If the attribute-value is empty or if the first character of the - * attribute-value is not %x2F ("/"): - * Let cookie-path be the default-path. - * Otherwise: - * Let cookie-path be the attribute-value." - * - * We'll represent the default-path as null since it depends on the - * context of the parsing. - */ - c.path = av_value && av_value[0] === "/" ? av_value : null; - break; - - case 'secure': // S5.2.5 - /* - * "If the attribute-name case-insensitively matches the string "Secure", - * the user agent MUST append an attribute to the cookie-attribute-list - * with an attribute-name of Secure and an empty attribute-value." - */ - c.secure = true; - break; - - case 'httponly': // S5.2.6 -- effectively the same as 'secure' - c.httpOnly = true; - break; - - default: - c.extensions = c.extensions || []; - c.extensions.push(av); - break; - } - } - - return c; -} - -// avoid the V8 deoptimization monster! -function jsonParse(str) { - var obj; - try { - obj = JSON.parse(str); - } catch (e) { - return e; - } - return obj; -} - -function fromJSON(str) { - if (!str) { - return null; - } - - var obj; - if (typeof str === 'string') { - obj = jsonParse(str); - if (obj instanceof Error) { - return null; - } - } else { - // assume it's an Object - obj = str; - } - - var c = new Cookie(); - for (var i=0; i 1) { - var lindex = path.lastIndexOf('/'); - if (lindex === 0) { - break; - } - path = path.substr(0,lindex); - permutations.push(path); - } - permutations.push('/'); - return permutations; -} - -function getCookieContext(url) { - if (url instanceof Object) { - return url; - } - // NOTE: decodeURI will throw on malformed URIs (see GH-32). - // Therefore, we will just skip decoding for such URIs. - try { - url = decodeURI(url); - } - catch(err) { - // Silently swallow error - } - - return urlParse(url); -} - -function Cookie(opts) { - opts = opts || {}; - - Object.keys(opts).forEach(function(prop) { - if (Cookie.prototype.hasOwnProperty(prop) && - Cookie.prototype[prop] !== opts[prop] && - prop.substr(0,1) !== '_') - { - this[prop] = opts[prop]; - } - }, this); - - this.creation = this.creation || new Date(); - - // used to break creation ties in cookieCompare(): - Object.defineProperty(this, 'creationIndex', { - configurable: false, - enumerable: false, // important for assert.deepEqual checks - writable: true, - value: ++Cookie.cookiesCreated - }); -} - -Cookie.cookiesCreated = 0; // incremented each time a cookie is created - -Cookie.parse = parse; -Cookie.fromJSON = fromJSON; - -Cookie.prototype.key = ""; -Cookie.prototype.value = ""; - -// the order in which the RFC has them: -Cookie.prototype.expires = "Infinity"; // coerces to literal Infinity -Cookie.prototype.maxAge = null; // takes precedence over expires for TTL -Cookie.prototype.domain = null; -Cookie.prototype.path = null; -Cookie.prototype.secure = false; -Cookie.prototype.httpOnly = false; -Cookie.prototype.extensions = null; - -// set by the CookieJar: -Cookie.prototype.hostOnly = null; // boolean when set -Cookie.prototype.pathIsDefault = null; // boolean when set -Cookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse -Cookie.prototype.lastAccessed = null; // Date when set -Object.defineProperty(Cookie.prototype, 'creationIndex', { - configurable: true, - enumerable: false, - writable: true, - value: 0 -}); - -Cookie.serializableProperties = Object.keys(Cookie.prototype) - .filter(function(prop) { - return !( - Cookie.prototype[prop] instanceof Function || - prop === 'creationIndex' || - prop.substr(0,1) === '_' - ); - }); - -Cookie.prototype.inspect = function inspect() { - var now = Date.now(); - return 'Cookie="'+this.toString() + - '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') + - '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') + - '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') + - '"'; -}; - -Cookie.prototype.toJSON = function() { - var obj = {}; - - var props = Cookie.serializableProperties; - for (var i=0; i suffixLen) { - var publicSuffix = parts.slice(0,suffixLen+1).reverse().join('.'); - return converted ? punycode.toUnicode(publicSuffix) : publicSuffix; - } - - return null; -}; - -// The following generated structure is used under the MPL version 1.1 -// See public-suffix.txt for more information - -var index = module.exports.index = Object.freeze( -{"ac":true,"com.ac":true,"edu.ac":true,"gov.ac":true,"net.ac":true,"mil.ac":true,"org.ac":true,"ad":true,"nom.ad":true,"ae":true,"co.ae":true,"net.ae":true,"org.ae":true,"sch.ae":true,"ac.ae":true,"gov.ae":true,"mil.ae":true,"aero":true,"accident-investigation.aero":true,"accident-prevention.aero":true,"aerobatic.aero":true,"aeroclub.aero":true,"aerodrome.aero":true,"agents.aero":true,"aircraft.aero":true,"airline.aero":true,"airport.aero":true,"air-surveillance.aero":true,"airtraffic.aero":true,"air-traffic-control.aero":true,"ambulance.aero":true,"amusement.aero":true,"association.aero":true,"author.aero":true,"ballooning.aero":true,"broker.aero":true,"caa.aero":true,"cargo.aero":true,"catering.aero":true,"certification.aero":true,"championship.aero":true,"charter.aero":true,"civilaviation.aero":true,"club.aero":true,"conference.aero":true,"consultant.aero":true,"consulting.aero":true,"control.aero":true,"council.aero":true,"crew.aero":true,"design.aero":true,"dgca.aero":true,"educator.aero":true,"emergency.aero":true,"engine.aero":true,"engineer.aero":true,"entertainment.aero":true,"equipment.aero":true,"exchange.aero":true,"express.aero":true,"federation.aero":true,"flight.aero":true,"freight.aero":true,"fuel.aero":true,"gliding.aero":true,"government.aero":true,"groundhandling.aero":true,"group.aero":true,"hanggliding.aero":true,"homebuilt.aero":true,"insurance.aero":true,"journal.aero":true,"journalist.aero":true,"leasing.aero":true,"logistics.aero":true,"magazine.aero":true,"maintenance.aero":true,"marketplace.aero":true,"media.aero":true,"microlight.aero":true,"modelling.aero":true,"navigation.aero":true,"parachuting.aero":true,"paragliding.aero":true,"passenger-association.aero":true,"pilot.aero":true,"press.aero":true,"production.aero":true,"recreation.aero":true,"repbody.aero":true,"res.aero":true,"research.aero":true,"rotorcraft.aero":true,"safety.aero":true,"scientist.aero":true,"services.aero":true,"show.aero":true,"skydiving.aero":true,"software.aero":true,"student.aero":true,"taxi.aero":true,"trader.aero":true,"trading.aero":true,"trainer.aero":true,"union.aero":true,"workinggroup.aero":true,"works.aero":true,"af":true,"gov.af":true,"com.af":true,"org.af":true,"net.af":true,"edu.af":true,"ag":true,"com.ag":true,"org.ag":true,"net.ag":true,"co.ag":true,"nom.ag":true,"ai":true,"off.ai":true,"com.ai":true,"net.ai":true,"org.ai":true,"al":true,"com.al":true,"edu.al":true,"gov.al":true,"mil.al":true,"net.al":true,"org.al":true,"am":true,"an":true,"com.an":true,"net.an":true,"org.an":true,"edu.an":true,"ao":true,"ed.ao":true,"gv.ao":true,"og.ao":true,"co.ao":true,"pb.ao":true,"it.ao":true,"aq":true,"ar":true,"com.ar":true,"edu.ar":true,"gob.ar":true,"gov.ar":true,"int.ar":true,"mil.ar":true,"net.ar":true,"org.ar":true,"tur.ar":true,"arpa":true,"e164.arpa":true,"in-addr.arpa":true,"ip6.arpa":true,"iris.arpa":true,"uri.arpa":true,"urn.arpa":true,"as":true,"gov.as":true,"asia":true,"at":true,"ac.at":true,"co.at":true,"gv.at":true,"or.at":true,"au":true,"com.au":true,"net.au":true,"org.au":true,"edu.au":true,"gov.au":true,"asn.au":true,"id.au":true,"info.au":true,"conf.au":true,"oz.au":true,"act.au":true,"nsw.au":true,"nt.au":true,"qld.au":true,"sa.au":true,"tas.au":true,"vic.au":true,"wa.au":true,"act.edu.au":true,"nsw.edu.au":true,"nt.edu.au":true,"qld.edu.au":true,"sa.edu.au":true,"tas.edu.au":true,"vic.edu.au":true,"wa.edu.au":true,"qld.gov.au":true,"sa.gov.au":true,"tas.gov.au":true,"vic.gov.au":true,"wa.gov.au":true,"aw":true,"com.aw":true,"ax":true,"az":true,"com.az":true,"net.az":true,"int.az":true,"gov.az":true,"org.az":true,"edu.az":true,"info.az":true,"pp.az":true,"mil.az":true,"name.az":true,"pro.az":true,"biz.az":true,"ba":true,"org.ba":true,"net.ba":true,"edu.ba":true,"gov.ba":true,"mil.ba":true,"unsa.ba":true,"unbi.ba":true,"co.ba":true,"com.ba":true,"rs.ba":true,"bb":true,"biz.bb":true,"co.bb":true,"com.bb":true,"edu.bb":true,"gov.bb":true,"info.bb":true,"net.bb":true,"org.bb":true,"store.bb":true,"tv.bb":true,"*.bd":true,"be":true,"ac.be":true,"bf":true,"gov.bf":true,"bg":true,"a.bg":true,"b.bg":true,"c.bg":true,"d.bg":true,"e.bg":true,"f.bg":true,"g.bg":true,"h.bg":true,"i.bg":true,"j.bg":true,"k.bg":true,"l.bg":true,"m.bg":true,"n.bg":true,"o.bg":true,"p.bg":true,"q.bg":true,"r.bg":true,"s.bg":true,"t.bg":true,"u.bg":true,"v.bg":true,"w.bg":true,"x.bg":true,"y.bg":true,"z.bg":true,"0.bg":true,"1.bg":true,"2.bg":true,"3.bg":true,"4.bg":true,"5.bg":true,"6.bg":true,"7.bg":true,"8.bg":true,"9.bg":true,"bh":true,"com.bh":true,"edu.bh":true,"net.bh":true,"org.bh":true,"gov.bh":true,"bi":true,"co.bi":true,"com.bi":true,"edu.bi":true,"or.bi":true,"org.bi":true,"biz":true,"bj":true,"asso.bj":true,"barreau.bj":true,"gouv.bj":true,"bm":true,"com.bm":true,"edu.bm":true,"gov.bm":true,"net.bm":true,"org.bm":true,"*.bn":true,"bo":true,"com.bo":true,"edu.bo":true,"gov.bo":true,"gob.bo":true,"int.bo":true,"org.bo":true,"net.bo":true,"mil.bo":true,"tv.bo":true,"br":true,"adm.br":true,"adv.br":true,"agr.br":true,"am.br":true,"arq.br":true,"art.br":true,"ato.br":true,"b.br":true,"bio.br":true,"blog.br":true,"bmd.br":true,"cim.br":true,"cng.br":true,"cnt.br":true,"com.br":true,"coop.br":true,"ecn.br":true,"eco.br":true,"edu.br":true,"emp.br":true,"eng.br":true,"esp.br":true,"etc.br":true,"eti.br":true,"far.br":true,"flog.br":true,"fm.br":true,"fnd.br":true,"fot.br":true,"fst.br":true,"g12.br":true,"ggf.br":true,"gov.br":true,"imb.br":true,"ind.br":true,"inf.br":true,"jor.br":true,"jus.br":true,"leg.br":true,"lel.br":true,"mat.br":true,"med.br":true,"mil.br":true,"mp.br":true,"mus.br":true,"net.br":true,"*.nom.br":true,"not.br":true,"ntr.br":true,"odo.br":true,"org.br":true,"ppg.br":true,"pro.br":true,"psc.br":true,"psi.br":true,"qsl.br":true,"radio.br":true,"rec.br":true,"slg.br":true,"srv.br":true,"taxi.br":true,"teo.br":true,"tmp.br":true,"trd.br":true,"tur.br":true,"tv.br":true,"vet.br":true,"vlog.br":true,"wiki.br":true,"zlg.br":true,"bs":true,"com.bs":true,"net.bs":true,"org.bs":true,"edu.bs":true,"gov.bs":true,"bt":true,"com.bt":true,"edu.bt":true,"gov.bt":true,"net.bt":true,"org.bt":true,"bv":true,"bw":true,"co.bw":true,"org.bw":true,"by":true,"gov.by":true,"mil.by":true,"com.by":true,"of.by":true,"bz":true,"com.bz":true,"net.bz":true,"org.bz":true,"edu.bz":true,"gov.bz":true,"ca":true,"ab.ca":true,"bc.ca":true,"mb.ca":true,"nb.ca":true,"nf.ca":true,"nl.ca":true,"ns.ca":true,"nt.ca":true,"nu.ca":true,"on.ca":true,"pe.ca":true,"qc.ca":true,"sk.ca":true,"yk.ca":true,"gc.ca":true,"cat":true,"cc":true,"cd":true,"gov.cd":true,"cf":true,"cg":true,"ch":true,"ci":true,"org.ci":true,"or.ci":true,"com.ci":true,"co.ci":true,"edu.ci":true,"ed.ci":true,"ac.ci":true,"net.ci":true,"go.ci":true,"asso.ci":true,"xn--aroport-bya.ci":true,"int.ci":true,"presse.ci":true,"md.ci":true,"gouv.ci":true,"*.ck":true,"www.ck":false,"cl":true,"gov.cl":true,"gob.cl":true,"co.cl":true,"mil.cl":true,"cm":true,"co.cm":true,"com.cm":true,"gov.cm":true,"net.cm":true,"cn":true,"ac.cn":true,"com.cn":true,"edu.cn":true,"gov.cn":true,"net.cn":true,"org.cn":true,"mil.cn":true,"xn--55qx5d.cn":true,"xn--io0a7i.cn":true,"xn--od0alg.cn":true,"ah.cn":true,"bj.cn":true,"cq.cn":true,"fj.cn":true,"gd.cn":true,"gs.cn":true,"gz.cn":true,"gx.cn":true,"ha.cn":true,"hb.cn":true,"he.cn":true,"hi.cn":true,"hl.cn":true,"hn.cn":true,"jl.cn":true,"js.cn":true,"jx.cn":true,"ln.cn":true,"nm.cn":true,"nx.cn":true,"qh.cn":true,"sc.cn":true,"sd.cn":true,"sh.cn":true,"sn.cn":true,"sx.cn":true,"tj.cn":true,"xj.cn":true,"xz.cn":true,"yn.cn":true,"zj.cn":true,"hk.cn":true,"mo.cn":true,"tw.cn":true,"co":true,"arts.co":true,"com.co":true,"edu.co":true,"firm.co":true,"gov.co":true,"info.co":true,"int.co":true,"mil.co":true,"net.co":true,"nom.co":true,"org.co":true,"rec.co":true,"web.co":true,"com":true,"coop":true,"cr":true,"ac.cr":true,"co.cr":true,"ed.cr":true,"fi.cr":true,"go.cr":true,"or.cr":true,"sa.cr":true,"cu":true,"com.cu":true,"edu.cu":true,"org.cu":true,"net.cu":true,"gov.cu":true,"inf.cu":true,"cv":true,"cw":true,"com.cw":true,"edu.cw":true,"net.cw":true,"org.cw":true,"cx":true,"gov.cx":true,"*.cy":true,"cz":true,"de":true,"dj":true,"dk":true,"dm":true,"com.dm":true,"net.dm":true,"org.dm":true,"edu.dm":true,"gov.dm":true,"do":true,"art.do":true,"com.do":true,"edu.do":true,"gob.do":true,"gov.do":true,"mil.do":true,"net.do":true,"org.do":true,"sld.do":true,"web.do":true,"dz":true,"com.dz":true,"org.dz":true,"net.dz":true,"gov.dz":true,"edu.dz":true,"asso.dz":true,"pol.dz":true,"art.dz":true,"ec":true,"com.ec":true,"info.ec":true,"net.ec":true,"fin.ec":true,"k12.ec":true,"med.ec":true,"pro.ec":true,"org.ec":true,"edu.ec":true,"gov.ec":true,"gob.ec":true,"mil.ec":true,"edu":true,"ee":true,"edu.ee":true,"gov.ee":true,"riik.ee":true,"lib.ee":true,"med.ee":true,"com.ee":true,"pri.ee":true,"aip.ee":true,"org.ee":true,"fie.ee":true,"eg":true,"com.eg":true,"edu.eg":true,"eun.eg":true,"gov.eg":true,"mil.eg":true,"name.eg":true,"net.eg":true,"org.eg":true,"sci.eg":true,"*.er":true,"es":true,"com.es":true,"nom.es":true,"org.es":true,"gob.es":true,"edu.es":true,"et":true,"com.et":true,"gov.et":true,"org.et":true,"edu.et":true,"biz.et":true,"name.et":true,"info.et":true,"eu":true,"fi":true,"aland.fi":true,"*.fj":true,"*.fk":true,"fm":true,"fo":true,"fr":true,"com.fr":true,"asso.fr":true,"nom.fr":true,"prd.fr":true,"presse.fr":true,"tm.fr":true,"aeroport.fr":true,"assedic.fr":true,"avocat.fr":true,"avoues.fr":true,"cci.fr":true,"chambagri.fr":true,"chirurgiens-dentistes.fr":true,"experts-comptables.fr":true,"geometre-expert.fr":true,"gouv.fr":true,"greta.fr":true,"huissier-justice.fr":true,"medecin.fr":true,"notaires.fr":true,"pharmacien.fr":true,"port.fr":true,"veterinaire.fr":true,"ga":true,"gb":true,"gd":true,"ge":true,"com.ge":true,"edu.ge":true,"gov.ge":true,"org.ge":true,"mil.ge":true,"net.ge":true,"pvt.ge":true,"gf":true,"gg":true,"co.gg":true,"net.gg":true,"org.gg":true,"gh":true,"com.gh":true,"edu.gh":true,"gov.gh":true,"org.gh":true,"mil.gh":true,"gi":true,"com.gi":true,"ltd.gi":true,"gov.gi":true,"mod.gi":true,"edu.gi":true,"org.gi":true,"gl":true,"gm":true,"gn":true,"ac.gn":true,"com.gn":true,"edu.gn":true,"gov.gn":true,"org.gn":true,"net.gn":true,"gov":true,"gp":true,"com.gp":true,"net.gp":true,"mobi.gp":true,"edu.gp":true,"org.gp":true,"asso.gp":true,"gq":true,"gr":true,"com.gr":true,"edu.gr":true,"net.gr":true,"org.gr":true,"gov.gr":true,"gs":true,"gt":true,"com.gt":true,"edu.gt":true,"gob.gt":true,"ind.gt":true,"mil.gt":true,"net.gt":true,"org.gt":true,"*.gu":true,"gw":true,"gy":true,"co.gy":true,"com.gy":true,"net.gy":true,"hk":true,"com.hk":true,"edu.hk":true,"gov.hk":true,"idv.hk":true,"net.hk":true,"org.hk":true,"xn--55qx5d.hk":true,"xn--wcvs22d.hk":true,"xn--lcvr32d.hk":true,"xn--mxtq1m.hk":true,"xn--gmqw5a.hk":true,"xn--ciqpn.hk":true,"xn--gmq050i.hk":true,"xn--zf0avx.hk":true,"xn--io0a7i.hk":true,"xn--mk0axi.hk":true,"xn--od0alg.hk":true,"xn--od0aq3b.hk":true,"xn--tn0ag.hk":true,"xn--uc0atv.hk":true,"xn--uc0ay4a.hk":true,"hm":true,"hn":true,"com.hn":true,"edu.hn":true,"org.hn":true,"net.hn":true,"mil.hn":true,"gob.hn":true,"hr":true,"iz.hr":true,"from.hr":true,"name.hr":true,"com.hr":true,"ht":true,"com.ht":true,"shop.ht":true,"firm.ht":true,"info.ht":true,"adult.ht":true,"net.ht":true,"pro.ht":true,"org.ht":true,"med.ht":true,"art.ht":true,"coop.ht":true,"pol.ht":true,"asso.ht":true,"edu.ht":true,"rel.ht":true,"gouv.ht":true,"perso.ht":true,"hu":true,"co.hu":true,"info.hu":true,"org.hu":true,"priv.hu":true,"sport.hu":true,"tm.hu":true,"2000.hu":true,"agrar.hu":true,"bolt.hu":true,"casino.hu":true,"city.hu":true,"erotica.hu":true,"erotika.hu":true,"film.hu":true,"forum.hu":true,"games.hu":true,"hotel.hu":true,"ingatlan.hu":true,"jogasz.hu":true,"konyvelo.hu":true,"lakas.hu":true,"media.hu":true,"news.hu":true,"reklam.hu":true,"sex.hu":true,"shop.hu":true,"suli.hu":true,"szex.hu":true,"tozsde.hu":true,"utazas.hu":true,"video.hu":true,"id":true,"ac.id":true,"biz.id":true,"co.id":true,"desa.id":true,"go.id":true,"mil.id":true,"my.id":true,"net.id":true,"or.id":true,"sch.id":true,"web.id":true,"ie":true,"gov.ie":true,"*.il":true,"im":true,"ac.im":true,"co.im":true,"com.im":true,"ltd.co.im":true,"net.im":true,"org.im":true,"plc.co.im":true,"tt.im":true,"tv.im":true,"in":true,"co.in":true,"firm.in":true,"net.in":true,"org.in":true,"gen.in":true,"ind.in":true,"nic.in":true,"ac.in":true,"edu.in":true,"res.in":true,"gov.in":true,"mil.in":true,"info":true,"int":true,"eu.int":true,"io":true,"com.io":true,"iq":true,"gov.iq":true,"edu.iq":true,"mil.iq":true,"com.iq":true,"org.iq":true,"net.iq":true,"ir":true,"ac.ir":true,"co.ir":true,"gov.ir":true,"id.ir":true,"net.ir":true,"org.ir":true,"sch.ir":true,"xn--mgba3a4f16a.ir":true,"xn--mgba3a4fra.ir":true,"is":true,"net.is":true,"com.is":true,"edu.is":true,"gov.is":true,"org.is":true,"int.is":true,"it":true,"gov.it":true,"edu.it":true,"abr.it":true,"abruzzo.it":true,"aosta-valley.it":true,"aostavalley.it":true,"bas.it":true,"basilicata.it":true,"cal.it":true,"calabria.it":true,"cam.it":true,"campania.it":true,"emilia-romagna.it":true,"emiliaromagna.it":true,"emr.it":true,"friuli-v-giulia.it":true,"friuli-ve-giulia.it":true,"friuli-vegiulia.it":true,"friuli-venezia-giulia.it":true,"friuli-veneziagiulia.it":true,"friuli-vgiulia.it":true,"friuliv-giulia.it":true,"friulive-giulia.it":true,"friulivegiulia.it":true,"friulivenezia-giulia.it":true,"friuliveneziagiulia.it":true,"friulivgiulia.it":true,"fvg.it":true,"laz.it":true,"lazio.it":true,"lig.it":true,"liguria.it":true,"lom.it":true,"lombardia.it":true,"lombardy.it":true,"lucania.it":true,"mar.it":true,"marche.it":true,"mol.it":true,"molise.it":true,"piedmont.it":true,"piemonte.it":true,"pmn.it":true,"pug.it":true,"puglia.it":true,"sar.it":true,"sardegna.it":true,"sardinia.it":true,"sic.it":true,"sicilia.it":true,"sicily.it":true,"taa.it":true,"tos.it":true,"toscana.it":true,"trentino-a-adige.it":true,"trentino-aadige.it":true,"trentino-alto-adige.it":true,"trentino-altoadige.it":true,"trentino-s-tirol.it":true,"trentino-stirol.it":true,"trentino-sud-tirol.it":true,"trentino-sudtirol.it":true,"trentino-sued-tirol.it":true,"trentino-suedtirol.it":true,"trentinoa-adige.it":true,"trentinoaadige.it":true,"trentinoalto-adige.it":true,"trentinoaltoadige.it":true,"trentinos-tirol.it":true,"trentinostirol.it":true,"trentinosud-tirol.it":true,"trentinosudtirol.it":true,"trentinosued-tirol.it":true,"trentinosuedtirol.it":true,"tuscany.it":true,"umb.it":true,"umbria.it":true,"val-d-aosta.it":true,"val-daosta.it":true,"vald-aosta.it":true,"valdaosta.it":true,"valle-aosta.it":true,"valle-d-aosta.it":true,"valle-daosta.it":true,"valleaosta.it":true,"valled-aosta.it":true,"valledaosta.it":true,"vallee-aoste.it":true,"valleeaoste.it":true,"vao.it":true,"vda.it":true,"ven.it":true,"veneto.it":true,"ag.it":true,"agrigento.it":true,"al.it":true,"alessandria.it":true,"alto-adige.it":true,"altoadige.it":true,"an.it":true,"ancona.it":true,"andria-barletta-trani.it":true,"andria-trani-barletta.it":true,"andriabarlettatrani.it":true,"andriatranibarletta.it":true,"ao.it":true,"aosta.it":true,"aoste.it":true,"ap.it":true,"aq.it":true,"aquila.it":true,"ar.it":true,"arezzo.it":true,"ascoli-piceno.it":true,"ascolipiceno.it":true,"asti.it":true,"at.it":true,"av.it":true,"avellino.it":true,"ba.it":true,"balsan.it":true,"bari.it":true,"barletta-trani-andria.it":true,"barlettatraniandria.it":true,"belluno.it":true,"benevento.it":true,"bergamo.it":true,"bg.it":true,"bi.it":true,"biella.it":true,"bl.it":true,"bn.it":true,"bo.it":true,"bologna.it":true,"bolzano.it":true,"bozen.it":true,"br.it":true,"brescia.it":true,"brindisi.it":true,"bs.it":true,"bt.it":true,"bz.it":true,"ca.it":true,"cagliari.it":true,"caltanissetta.it":true,"campidano-medio.it":true,"campidanomedio.it":true,"campobasso.it":true,"carbonia-iglesias.it":true,"carboniaiglesias.it":true,"carrara-massa.it":true,"carraramassa.it":true,"caserta.it":true,"catania.it":true,"catanzaro.it":true,"cb.it":true,"ce.it":true,"cesena-forli.it":true,"cesenaforli.it":true,"ch.it":true,"chieti.it":true,"ci.it":true,"cl.it":true,"cn.it":true,"co.it":true,"como.it":true,"cosenza.it":true,"cr.it":true,"cremona.it":true,"crotone.it":true,"cs.it":true,"ct.it":true,"cuneo.it":true,"cz.it":true,"dell-ogliastra.it":true,"dellogliastra.it":true,"en.it":true,"enna.it":true,"fc.it":true,"fe.it":true,"fermo.it":true,"ferrara.it":true,"fg.it":true,"fi.it":true,"firenze.it":true,"florence.it":true,"fm.it":true,"foggia.it":true,"forli-cesena.it":true,"forlicesena.it":true,"fr.it":true,"frosinone.it":true,"ge.it":true,"genoa.it":true,"genova.it":true,"go.it":true,"gorizia.it":true,"gr.it":true,"grosseto.it":true,"iglesias-carbonia.it":true,"iglesiascarbonia.it":true,"im.it":true,"imperia.it":true,"is.it":true,"isernia.it":true,"kr.it":true,"la-spezia.it":true,"laquila.it":true,"laspezia.it":true,"latina.it":true,"lc.it":true,"le.it":true,"lecce.it":true,"lecco.it":true,"li.it":true,"livorno.it":true,"lo.it":true,"lodi.it":true,"lt.it":true,"lu.it":true,"lucca.it":true,"macerata.it":true,"mantova.it":true,"massa-carrara.it":true,"massacarrara.it":true,"matera.it":true,"mb.it":true,"mc.it":true,"me.it":true,"medio-campidano.it":true,"mediocampidano.it":true,"messina.it":true,"mi.it":true,"milan.it":true,"milano.it":true,"mn.it":true,"mo.it":true,"modena.it":true,"monza-brianza.it":true,"monza-e-della-brianza.it":true,"monza.it":true,"monzabrianza.it":true,"monzaebrianza.it":true,"monzaedellabrianza.it":true,"ms.it":true,"mt.it":true,"na.it":true,"naples.it":true,"napoli.it":true,"no.it":true,"novara.it":true,"nu.it":true,"nuoro.it":true,"og.it":true,"ogliastra.it":true,"olbia-tempio.it":true,"olbiatempio.it":true,"or.it":true,"oristano.it":true,"ot.it":true,"pa.it":true,"padova.it":true,"padua.it":true,"palermo.it":true,"parma.it":true,"pavia.it":true,"pc.it":true,"pd.it":true,"pe.it":true,"perugia.it":true,"pesaro-urbino.it":true,"pesarourbino.it":true,"pescara.it":true,"pg.it":true,"pi.it":true,"piacenza.it":true,"pisa.it":true,"pistoia.it":true,"pn.it":true,"po.it":true,"pordenone.it":true,"potenza.it":true,"pr.it":true,"prato.it":true,"pt.it":true,"pu.it":true,"pv.it":true,"pz.it":true,"ra.it":true,"ragusa.it":true,"ravenna.it":true,"rc.it":true,"re.it":true,"reggio-calabria.it":true,"reggio-emilia.it":true,"reggiocalabria.it":true,"reggioemilia.it":true,"rg.it":true,"ri.it":true,"rieti.it":true,"rimini.it":true,"rm.it":true,"rn.it":true,"ro.it":true,"roma.it":true,"rome.it":true,"rovigo.it":true,"sa.it":true,"salerno.it":true,"sassari.it":true,"savona.it":true,"si.it":true,"siena.it":true,"siracusa.it":true,"so.it":true,"sondrio.it":true,"sp.it":true,"sr.it":true,"ss.it":true,"suedtirol.it":true,"sv.it":true,"ta.it":true,"taranto.it":true,"te.it":true,"tempio-olbia.it":true,"tempioolbia.it":true,"teramo.it":true,"terni.it":true,"tn.it":true,"to.it":true,"torino.it":true,"tp.it":true,"tr.it":true,"trani-andria-barletta.it":true,"trani-barletta-andria.it":true,"traniandriabarletta.it":true,"tranibarlettaandria.it":true,"trapani.it":true,"trentino.it":true,"trento.it":true,"treviso.it":true,"trieste.it":true,"ts.it":true,"turin.it":true,"tv.it":true,"ud.it":true,"udine.it":true,"urbino-pesaro.it":true,"urbinopesaro.it":true,"va.it":true,"varese.it":true,"vb.it":true,"vc.it":true,"ve.it":true,"venezia.it":true,"venice.it":true,"verbania.it":true,"vercelli.it":true,"verona.it":true,"vi.it":true,"vibo-valentia.it":true,"vibovalentia.it":true,"vicenza.it":true,"viterbo.it":true,"vr.it":true,"vs.it":true,"vt.it":true,"vv.it":true,"je":true,"co.je":true,"net.je":true,"org.je":true,"*.jm":true,"jo":true,"com.jo":true,"org.jo":true,"net.jo":true,"edu.jo":true,"sch.jo":true,"gov.jo":true,"mil.jo":true,"name.jo":true,"jobs":true,"jp":true,"ac.jp":true,"ad.jp":true,"co.jp":true,"ed.jp":true,"go.jp":true,"gr.jp":true,"lg.jp":true,"ne.jp":true,"or.jp":true,"aichi.jp":true,"akita.jp":true,"aomori.jp":true,"chiba.jp":true,"ehime.jp":true,"fukui.jp":true,"fukuoka.jp":true,"fukushima.jp":true,"gifu.jp":true,"gunma.jp":true,"hiroshima.jp":true,"hokkaido.jp":true,"hyogo.jp":true,"ibaraki.jp":true,"ishikawa.jp":true,"iwate.jp":true,"kagawa.jp":true,"kagoshima.jp":true,"kanagawa.jp":true,"kochi.jp":true,"kumamoto.jp":true,"kyoto.jp":true,"mie.jp":true,"miyagi.jp":true,"miyazaki.jp":true,"nagano.jp":true,"nagasaki.jp":true,"nara.jp":true,"niigata.jp":true,"oita.jp":true,"okayama.jp":true,"okinawa.jp":true,"osaka.jp":true,"saga.jp":true,"saitama.jp":true,"shiga.jp":true,"shimane.jp":true,"shizuoka.jp":true,"tochigi.jp":true,"tokushima.jp":true,"tokyo.jp":true,"tottori.jp":true,"toyama.jp":true,"wakayama.jp":true,"yamagata.jp":true,"yamaguchi.jp":true,"yamanashi.jp":true,"xn--4pvxs.jp":true,"xn--vgu402c.jp":true,"xn--c3s14m.jp":true,"xn--f6qx53a.jp":true,"xn--8pvr4u.jp":true,"xn--uist22h.jp":true,"xn--djrs72d6uy.jp":true,"xn--mkru45i.jp":true,"xn--0trq7p7nn.jp":true,"xn--8ltr62k.jp":true,"xn--2m4a15e.jp":true,"xn--efvn9s.jp":true,"xn--32vp30h.jp":true,"xn--4it797k.jp":true,"xn--1lqs71d.jp":true,"xn--5rtp49c.jp":true,"xn--5js045d.jp":true,"xn--ehqz56n.jp":true,"xn--1lqs03n.jp":true,"xn--qqqt11m.jp":true,"xn--kbrq7o.jp":true,"xn--pssu33l.jp":true,"xn--ntsq17g.jp":true,"xn--uisz3g.jp":true,"xn--6btw5a.jp":true,"xn--1ctwo.jp":true,"xn--6orx2r.jp":true,"xn--rht61e.jp":true,"xn--rht27z.jp":true,"xn--djty4k.jp":true,"xn--nit225k.jp":true,"xn--rht3d.jp":true,"xn--klty5x.jp":true,"xn--kltx9a.jp":true,"xn--kltp7d.jp":true,"xn--uuwu58a.jp":true,"xn--zbx025d.jp":true,"xn--ntso0iqx3a.jp":true,"xn--elqq16h.jp":true,"xn--4it168d.jp":true,"xn--klt787d.jp":true,"xn--rny31h.jp":true,"xn--7t0a264c.jp":true,"xn--5rtq34k.jp":true,"xn--k7yn95e.jp":true,"xn--tor131o.jp":true,"xn--d5qv7z876c.jp":true,"*.kawasaki.jp":true,"*.kitakyushu.jp":true,"*.kobe.jp":true,"*.nagoya.jp":true,"*.sapporo.jp":true,"*.sendai.jp":true,"*.yokohama.jp":true,"city.kawasaki.jp":false,"city.kitakyushu.jp":false,"city.kobe.jp":false,"city.nagoya.jp":false,"city.sapporo.jp":false,"city.sendai.jp":false,"city.yokohama.jp":false,"aisai.aichi.jp":true,"ama.aichi.jp":true,"anjo.aichi.jp":true,"asuke.aichi.jp":true,"chiryu.aichi.jp":true,"chita.aichi.jp":true,"fuso.aichi.jp":true,"gamagori.aichi.jp":true,"handa.aichi.jp":true,"hazu.aichi.jp":true,"hekinan.aichi.jp":true,"higashiura.aichi.jp":true,"ichinomiya.aichi.jp":true,"inazawa.aichi.jp":true,"inuyama.aichi.jp":true,"isshiki.aichi.jp":true,"iwakura.aichi.jp":true,"kanie.aichi.jp":true,"kariya.aichi.jp":true,"kasugai.aichi.jp":true,"kira.aichi.jp":true,"kiyosu.aichi.jp":true,"komaki.aichi.jp":true,"konan.aichi.jp":true,"kota.aichi.jp":true,"mihama.aichi.jp":true,"miyoshi.aichi.jp":true,"nishio.aichi.jp":true,"nisshin.aichi.jp":true,"obu.aichi.jp":true,"oguchi.aichi.jp":true,"oharu.aichi.jp":true,"okazaki.aichi.jp":true,"owariasahi.aichi.jp":true,"seto.aichi.jp":true,"shikatsu.aichi.jp":true,"shinshiro.aichi.jp":true,"shitara.aichi.jp":true,"tahara.aichi.jp":true,"takahama.aichi.jp":true,"tobishima.aichi.jp":true,"toei.aichi.jp":true,"togo.aichi.jp":true,"tokai.aichi.jp":true,"tokoname.aichi.jp":true,"toyoake.aichi.jp":true,"toyohashi.aichi.jp":true,"toyokawa.aichi.jp":true,"toyone.aichi.jp":true,"toyota.aichi.jp":true,"tsushima.aichi.jp":true,"yatomi.aichi.jp":true,"akita.akita.jp":true,"daisen.akita.jp":true,"fujisato.akita.jp":true,"gojome.akita.jp":true,"hachirogata.akita.jp":true,"happou.akita.jp":true,"higashinaruse.akita.jp":true,"honjo.akita.jp":true,"honjyo.akita.jp":true,"ikawa.akita.jp":true,"kamikoani.akita.jp":true,"kamioka.akita.jp":true,"katagami.akita.jp":true,"kazuno.akita.jp":true,"kitaakita.akita.jp":true,"kosaka.akita.jp":true,"kyowa.akita.jp":true,"misato.akita.jp":true,"mitane.akita.jp":true,"moriyoshi.akita.jp":true,"nikaho.akita.jp":true,"noshiro.akita.jp":true,"odate.akita.jp":true,"oga.akita.jp":true,"ogata.akita.jp":true,"semboku.akita.jp":true,"yokote.akita.jp":true,"yurihonjo.akita.jp":true,"aomori.aomori.jp":true,"gonohe.aomori.jp":true,"hachinohe.aomori.jp":true,"hashikami.aomori.jp":true,"hiranai.aomori.jp":true,"hirosaki.aomori.jp":true,"itayanagi.aomori.jp":true,"kuroishi.aomori.jp":true,"misawa.aomori.jp":true,"mutsu.aomori.jp":true,"nakadomari.aomori.jp":true,"noheji.aomori.jp":true,"oirase.aomori.jp":true,"owani.aomori.jp":true,"rokunohe.aomori.jp":true,"sannohe.aomori.jp":true,"shichinohe.aomori.jp":true,"shingo.aomori.jp":true,"takko.aomori.jp":true,"towada.aomori.jp":true,"tsugaru.aomori.jp":true,"tsuruta.aomori.jp":true,"abiko.chiba.jp":true,"asahi.chiba.jp":true,"chonan.chiba.jp":true,"chosei.chiba.jp":true,"choshi.chiba.jp":true,"chuo.chiba.jp":true,"funabashi.chiba.jp":true,"futtsu.chiba.jp":true,"hanamigawa.chiba.jp":true,"ichihara.chiba.jp":true,"ichikawa.chiba.jp":true,"ichinomiya.chiba.jp":true,"inzai.chiba.jp":true,"isumi.chiba.jp":true,"kamagaya.chiba.jp":true,"kamogawa.chiba.jp":true,"kashiwa.chiba.jp":true,"katori.chiba.jp":true,"katsuura.chiba.jp":true,"kimitsu.chiba.jp":true,"kisarazu.chiba.jp":true,"kozaki.chiba.jp":true,"kujukuri.chiba.jp":true,"kyonan.chiba.jp":true,"matsudo.chiba.jp":true,"midori.chiba.jp":true,"mihama.chiba.jp":true,"minamiboso.chiba.jp":true,"mobara.chiba.jp":true,"mutsuzawa.chiba.jp":true,"nagara.chiba.jp":true,"nagareyama.chiba.jp":true,"narashino.chiba.jp":true,"narita.chiba.jp":true,"noda.chiba.jp":true,"oamishirasato.chiba.jp":true,"omigawa.chiba.jp":true,"onjuku.chiba.jp":true,"otaki.chiba.jp":true,"sakae.chiba.jp":true,"sakura.chiba.jp":true,"shimofusa.chiba.jp":true,"shirako.chiba.jp":true,"shiroi.chiba.jp":true,"shisui.chiba.jp":true,"sodegaura.chiba.jp":true,"sosa.chiba.jp":true,"tako.chiba.jp":true,"tateyama.chiba.jp":true,"togane.chiba.jp":true,"tohnosho.chiba.jp":true,"tomisato.chiba.jp":true,"urayasu.chiba.jp":true,"yachimata.chiba.jp":true,"yachiyo.chiba.jp":true,"yokaichiba.chiba.jp":true,"yokoshibahikari.chiba.jp":true,"yotsukaido.chiba.jp":true,"ainan.ehime.jp":true,"honai.ehime.jp":true,"ikata.ehime.jp":true,"imabari.ehime.jp":true,"iyo.ehime.jp":true,"kamijima.ehime.jp":true,"kihoku.ehime.jp":true,"kumakogen.ehime.jp":true,"masaki.ehime.jp":true,"matsuno.ehime.jp":true,"matsuyama.ehime.jp":true,"namikata.ehime.jp":true,"niihama.ehime.jp":true,"ozu.ehime.jp":true,"saijo.ehime.jp":true,"seiyo.ehime.jp":true,"shikokuchuo.ehime.jp":true,"tobe.ehime.jp":true,"toon.ehime.jp":true,"uchiko.ehime.jp":true,"uwajima.ehime.jp":true,"yawatahama.ehime.jp":true,"echizen.fukui.jp":true,"eiheiji.fukui.jp":true,"fukui.fukui.jp":true,"ikeda.fukui.jp":true,"katsuyama.fukui.jp":true,"mihama.fukui.jp":true,"minamiechizen.fukui.jp":true,"obama.fukui.jp":true,"ohi.fukui.jp":true,"ono.fukui.jp":true,"sabae.fukui.jp":true,"sakai.fukui.jp":true,"takahama.fukui.jp":true,"tsuruga.fukui.jp":true,"wakasa.fukui.jp":true,"ashiya.fukuoka.jp":true,"buzen.fukuoka.jp":true,"chikugo.fukuoka.jp":true,"chikuho.fukuoka.jp":true,"chikujo.fukuoka.jp":true,"chikushino.fukuoka.jp":true,"chikuzen.fukuoka.jp":true,"chuo.fukuoka.jp":true,"dazaifu.fukuoka.jp":true,"fukuchi.fukuoka.jp":true,"hakata.fukuoka.jp":true,"higashi.fukuoka.jp":true,"hirokawa.fukuoka.jp":true,"hisayama.fukuoka.jp":true,"iizuka.fukuoka.jp":true,"inatsuki.fukuoka.jp":true,"kaho.fukuoka.jp":true,"kasuga.fukuoka.jp":true,"kasuya.fukuoka.jp":true,"kawara.fukuoka.jp":true,"keisen.fukuoka.jp":true,"koga.fukuoka.jp":true,"kurate.fukuoka.jp":true,"kurogi.fukuoka.jp":true,"kurume.fukuoka.jp":true,"minami.fukuoka.jp":true,"miyako.fukuoka.jp":true,"miyama.fukuoka.jp":true,"miyawaka.fukuoka.jp":true,"mizumaki.fukuoka.jp":true,"munakata.fukuoka.jp":true,"nakagawa.fukuoka.jp":true,"nakama.fukuoka.jp":true,"nishi.fukuoka.jp":true,"nogata.fukuoka.jp":true,"ogori.fukuoka.jp":true,"okagaki.fukuoka.jp":true,"okawa.fukuoka.jp":true,"oki.fukuoka.jp":true,"omuta.fukuoka.jp":true,"onga.fukuoka.jp":true,"onojo.fukuoka.jp":true,"oto.fukuoka.jp":true,"saigawa.fukuoka.jp":true,"sasaguri.fukuoka.jp":true,"shingu.fukuoka.jp":true,"shinyoshitomi.fukuoka.jp":true,"shonai.fukuoka.jp":true,"soeda.fukuoka.jp":true,"sue.fukuoka.jp":true,"tachiarai.fukuoka.jp":true,"tagawa.fukuoka.jp":true,"takata.fukuoka.jp":true,"toho.fukuoka.jp":true,"toyotsu.fukuoka.jp":true,"tsuiki.fukuoka.jp":true,"ukiha.fukuoka.jp":true,"umi.fukuoka.jp":true,"usui.fukuoka.jp":true,"yamada.fukuoka.jp":true,"yame.fukuoka.jp":true,"yanagawa.fukuoka.jp":true,"yukuhashi.fukuoka.jp":true,"aizubange.fukushima.jp":true,"aizumisato.fukushima.jp":true,"aizuwakamatsu.fukushima.jp":true,"asakawa.fukushima.jp":true,"bandai.fukushima.jp":true,"date.fukushima.jp":true,"fukushima.fukushima.jp":true,"furudono.fukushima.jp":true,"futaba.fukushima.jp":true,"hanawa.fukushima.jp":true,"higashi.fukushima.jp":true,"hirata.fukushima.jp":true,"hirono.fukushima.jp":true,"iitate.fukushima.jp":true,"inawashiro.fukushima.jp":true,"ishikawa.fukushima.jp":true,"iwaki.fukushima.jp":true,"izumizaki.fukushima.jp":true,"kagamiishi.fukushima.jp":true,"kaneyama.fukushima.jp":true,"kawamata.fukushima.jp":true,"kitakata.fukushima.jp":true,"kitashiobara.fukushima.jp":true,"koori.fukushima.jp":true,"koriyama.fukushima.jp":true,"kunimi.fukushima.jp":true,"miharu.fukushima.jp":true,"mishima.fukushima.jp":true,"namie.fukushima.jp":true,"nango.fukushima.jp":true,"nishiaizu.fukushima.jp":true,"nishigo.fukushima.jp":true,"okuma.fukushima.jp":true,"omotego.fukushima.jp":true,"ono.fukushima.jp":true,"otama.fukushima.jp":true,"samegawa.fukushima.jp":true,"shimogo.fukushima.jp":true,"shirakawa.fukushima.jp":true,"showa.fukushima.jp":true,"soma.fukushima.jp":true,"sukagawa.fukushima.jp":true,"taishin.fukushima.jp":true,"tamakawa.fukushima.jp":true,"tanagura.fukushima.jp":true,"tenei.fukushima.jp":true,"yabuki.fukushima.jp":true,"yamato.fukushima.jp":true,"yamatsuri.fukushima.jp":true,"yanaizu.fukushima.jp":true,"yugawa.fukushima.jp":true,"anpachi.gifu.jp":true,"ena.gifu.jp":true,"gifu.gifu.jp":true,"ginan.gifu.jp":true,"godo.gifu.jp":true,"gujo.gifu.jp":true,"hashima.gifu.jp":true,"hichiso.gifu.jp":true,"hida.gifu.jp":true,"higashishirakawa.gifu.jp":true,"ibigawa.gifu.jp":true,"ikeda.gifu.jp":true,"kakamigahara.gifu.jp":true,"kani.gifu.jp":true,"kasahara.gifu.jp":true,"kasamatsu.gifu.jp":true,"kawaue.gifu.jp":true,"kitagata.gifu.jp":true,"mino.gifu.jp":true,"minokamo.gifu.jp":true,"mitake.gifu.jp":true,"mizunami.gifu.jp":true,"motosu.gifu.jp":true,"nakatsugawa.gifu.jp":true,"ogaki.gifu.jp":true,"sakahogi.gifu.jp":true,"seki.gifu.jp":true,"sekigahara.gifu.jp":true,"shirakawa.gifu.jp":true,"tajimi.gifu.jp":true,"takayama.gifu.jp":true,"tarui.gifu.jp":true,"toki.gifu.jp":true,"tomika.gifu.jp":true,"wanouchi.gifu.jp":true,"yamagata.gifu.jp":true,"yaotsu.gifu.jp":true,"yoro.gifu.jp":true,"annaka.gunma.jp":true,"chiyoda.gunma.jp":true,"fujioka.gunma.jp":true,"higashiagatsuma.gunma.jp":true,"isesaki.gunma.jp":true,"itakura.gunma.jp":true,"kanna.gunma.jp":true,"kanra.gunma.jp":true,"katashina.gunma.jp":true,"kawaba.gunma.jp":true,"kiryu.gunma.jp":true,"kusatsu.gunma.jp":true,"maebashi.gunma.jp":true,"meiwa.gunma.jp":true,"midori.gunma.jp":true,"minakami.gunma.jp":true,"naganohara.gunma.jp":true,"nakanojo.gunma.jp":true,"nanmoku.gunma.jp":true,"numata.gunma.jp":true,"oizumi.gunma.jp":true,"ora.gunma.jp":true,"ota.gunma.jp":true,"shibukawa.gunma.jp":true,"shimonita.gunma.jp":true,"shinto.gunma.jp":true,"showa.gunma.jp":true,"takasaki.gunma.jp":true,"takayama.gunma.jp":true,"tamamura.gunma.jp":true,"tatebayashi.gunma.jp":true,"tomioka.gunma.jp":true,"tsukiyono.gunma.jp":true,"tsumagoi.gunma.jp":true,"ueno.gunma.jp":true,"yoshioka.gunma.jp":true,"asaminami.hiroshima.jp":true,"daiwa.hiroshima.jp":true,"etajima.hiroshima.jp":true,"fuchu.hiroshima.jp":true,"fukuyama.hiroshima.jp":true,"hatsukaichi.hiroshima.jp":true,"higashihiroshima.hiroshima.jp":true,"hongo.hiroshima.jp":true,"jinsekikogen.hiroshima.jp":true,"kaita.hiroshima.jp":true,"kui.hiroshima.jp":true,"kumano.hiroshima.jp":true,"kure.hiroshima.jp":true,"mihara.hiroshima.jp":true,"miyoshi.hiroshima.jp":true,"naka.hiroshima.jp":true,"onomichi.hiroshima.jp":true,"osakikamijima.hiroshima.jp":true,"otake.hiroshima.jp":true,"saka.hiroshima.jp":true,"sera.hiroshima.jp":true,"seranishi.hiroshima.jp":true,"shinichi.hiroshima.jp":true,"shobara.hiroshima.jp":true,"takehara.hiroshima.jp":true,"abashiri.hokkaido.jp":true,"abira.hokkaido.jp":true,"aibetsu.hokkaido.jp":true,"akabira.hokkaido.jp":true,"akkeshi.hokkaido.jp":true,"asahikawa.hokkaido.jp":true,"ashibetsu.hokkaido.jp":true,"ashoro.hokkaido.jp":true,"assabu.hokkaido.jp":true,"atsuma.hokkaido.jp":true,"bibai.hokkaido.jp":true,"biei.hokkaido.jp":true,"bifuka.hokkaido.jp":true,"bihoro.hokkaido.jp":true,"biratori.hokkaido.jp":true,"chippubetsu.hokkaido.jp":true,"chitose.hokkaido.jp":true,"date.hokkaido.jp":true,"ebetsu.hokkaido.jp":true,"embetsu.hokkaido.jp":true,"eniwa.hokkaido.jp":true,"erimo.hokkaido.jp":true,"esan.hokkaido.jp":true,"esashi.hokkaido.jp":true,"fukagawa.hokkaido.jp":true,"fukushima.hokkaido.jp":true,"furano.hokkaido.jp":true,"furubira.hokkaido.jp":true,"haboro.hokkaido.jp":true,"hakodate.hokkaido.jp":true,"hamatonbetsu.hokkaido.jp":true,"hidaka.hokkaido.jp":true,"higashikagura.hokkaido.jp":true,"higashikawa.hokkaido.jp":true,"hiroo.hokkaido.jp":true,"hokuryu.hokkaido.jp":true,"hokuto.hokkaido.jp":true,"honbetsu.hokkaido.jp":true,"horokanai.hokkaido.jp":true,"horonobe.hokkaido.jp":true,"ikeda.hokkaido.jp":true,"imakane.hokkaido.jp":true,"ishikari.hokkaido.jp":true,"iwamizawa.hokkaido.jp":true,"iwanai.hokkaido.jp":true,"kamifurano.hokkaido.jp":true,"kamikawa.hokkaido.jp":true,"kamishihoro.hokkaido.jp":true,"kamisunagawa.hokkaido.jp":true,"kamoenai.hokkaido.jp":true,"kayabe.hokkaido.jp":true,"kembuchi.hokkaido.jp":true,"kikonai.hokkaido.jp":true,"kimobetsu.hokkaido.jp":true,"kitahiroshima.hokkaido.jp":true,"kitami.hokkaido.jp":true,"kiyosato.hokkaido.jp":true,"koshimizu.hokkaido.jp":true,"kunneppu.hokkaido.jp":true,"kuriyama.hokkaido.jp":true,"kuromatsunai.hokkaido.jp":true,"kushiro.hokkaido.jp":true,"kutchan.hokkaido.jp":true,"kyowa.hokkaido.jp":true,"mashike.hokkaido.jp":true,"matsumae.hokkaido.jp":true,"mikasa.hokkaido.jp":true,"minamifurano.hokkaido.jp":true,"mombetsu.hokkaido.jp":true,"moseushi.hokkaido.jp":true,"mukawa.hokkaido.jp":true,"muroran.hokkaido.jp":true,"naie.hokkaido.jp":true,"nakagawa.hokkaido.jp":true,"nakasatsunai.hokkaido.jp":true,"nakatombetsu.hokkaido.jp":true,"nanae.hokkaido.jp":true,"nanporo.hokkaido.jp":true,"nayoro.hokkaido.jp":true,"nemuro.hokkaido.jp":true,"niikappu.hokkaido.jp":true,"niki.hokkaido.jp":true,"nishiokoppe.hokkaido.jp":true,"noboribetsu.hokkaido.jp":true,"numata.hokkaido.jp":true,"obihiro.hokkaido.jp":true,"obira.hokkaido.jp":true,"oketo.hokkaido.jp":true,"okoppe.hokkaido.jp":true,"otaru.hokkaido.jp":true,"otobe.hokkaido.jp":true,"otofuke.hokkaido.jp":true,"otoineppu.hokkaido.jp":true,"oumu.hokkaido.jp":true,"ozora.hokkaido.jp":true,"pippu.hokkaido.jp":true,"rankoshi.hokkaido.jp":true,"rebun.hokkaido.jp":true,"rikubetsu.hokkaido.jp":true,"rishiri.hokkaido.jp":true,"rishirifuji.hokkaido.jp":true,"saroma.hokkaido.jp":true,"sarufutsu.hokkaido.jp":true,"shakotan.hokkaido.jp":true,"shari.hokkaido.jp":true,"shibecha.hokkaido.jp":true,"shibetsu.hokkaido.jp":true,"shikabe.hokkaido.jp":true,"shikaoi.hokkaido.jp":true,"shimamaki.hokkaido.jp":true,"shimizu.hokkaido.jp":true,"shimokawa.hokkaido.jp":true,"shinshinotsu.hokkaido.jp":true,"shintoku.hokkaido.jp":true,"shiranuka.hokkaido.jp":true,"shiraoi.hokkaido.jp":true,"shiriuchi.hokkaido.jp":true,"sobetsu.hokkaido.jp":true,"sunagawa.hokkaido.jp":true,"taiki.hokkaido.jp":true,"takasu.hokkaido.jp":true,"takikawa.hokkaido.jp":true,"takinoue.hokkaido.jp":true,"teshikaga.hokkaido.jp":true,"tobetsu.hokkaido.jp":true,"tohma.hokkaido.jp":true,"tomakomai.hokkaido.jp":true,"tomari.hokkaido.jp":true,"toya.hokkaido.jp":true,"toyako.hokkaido.jp":true,"toyotomi.hokkaido.jp":true,"toyoura.hokkaido.jp":true,"tsubetsu.hokkaido.jp":true,"tsukigata.hokkaido.jp":true,"urakawa.hokkaido.jp":true,"urausu.hokkaido.jp":true,"uryu.hokkaido.jp":true,"utashinai.hokkaido.jp":true,"wakkanai.hokkaido.jp":true,"wassamu.hokkaido.jp":true,"yakumo.hokkaido.jp":true,"yoichi.hokkaido.jp":true,"aioi.hyogo.jp":true,"akashi.hyogo.jp":true,"ako.hyogo.jp":true,"amagasaki.hyogo.jp":true,"aogaki.hyogo.jp":true,"asago.hyogo.jp":true,"ashiya.hyogo.jp":true,"awaji.hyogo.jp":true,"fukusaki.hyogo.jp":true,"goshiki.hyogo.jp":true,"harima.hyogo.jp":true,"himeji.hyogo.jp":true,"ichikawa.hyogo.jp":true,"inagawa.hyogo.jp":true,"itami.hyogo.jp":true,"kakogawa.hyogo.jp":true,"kamigori.hyogo.jp":true,"kamikawa.hyogo.jp":true,"kasai.hyogo.jp":true,"kasuga.hyogo.jp":true,"kawanishi.hyogo.jp":true,"miki.hyogo.jp":true,"minamiawaji.hyogo.jp":true,"nishinomiya.hyogo.jp":true,"nishiwaki.hyogo.jp":true,"ono.hyogo.jp":true,"sanda.hyogo.jp":true,"sannan.hyogo.jp":true,"sasayama.hyogo.jp":true,"sayo.hyogo.jp":true,"shingu.hyogo.jp":true,"shinonsen.hyogo.jp":true,"shiso.hyogo.jp":true,"sumoto.hyogo.jp":true,"taishi.hyogo.jp":true,"taka.hyogo.jp":true,"takarazuka.hyogo.jp":true,"takasago.hyogo.jp":true,"takino.hyogo.jp":true,"tamba.hyogo.jp":true,"tatsuno.hyogo.jp":true,"toyooka.hyogo.jp":true,"yabu.hyogo.jp":true,"yashiro.hyogo.jp":true,"yoka.hyogo.jp":true,"yokawa.hyogo.jp":true,"ami.ibaraki.jp":true,"asahi.ibaraki.jp":true,"bando.ibaraki.jp":true,"chikusei.ibaraki.jp":true,"daigo.ibaraki.jp":true,"fujishiro.ibaraki.jp":true,"hitachi.ibaraki.jp":true,"hitachinaka.ibaraki.jp":true,"hitachiomiya.ibaraki.jp":true,"hitachiota.ibaraki.jp":true,"ibaraki.ibaraki.jp":true,"ina.ibaraki.jp":true,"inashiki.ibaraki.jp":true,"itako.ibaraki.jp":true,"iwama.ibaraki.jp":true,"joso.ibaraki.jp":true,"kamisu.ibaraki.jp":true,"kasama.ibaraki.jp":true,"kashima.ibaraki.jp":true,"kasumigaura.ibaraki.jp":true,"koga.ibaraki.jp":true,"miho.ibaraki.jp":true,"mito.ibaraki.jp":true,"moriya.ibaraki.jp":true,"naka.ibaraki.jp":true,"namegata.ibaraki.jp":true,"oarai.ibaraki.jp":true,"ogawa.ibaraki.jp":true,"omitama.ibaraki.jp":true,"ryugasaki.ibaraki.jp":true,"sakai.ibaraki.jp":true,"sakuragawa.ibaraki.jp":true,"shimodate.ibaraki.jp":true,"shimotsuma.ibaraki.jp":true,"shirosato.ibaraki.jp":true,"sowa.ibaraki.jp":true,"suifu.ibaraki.jp":true,"takahagi.ibaraki.jp":true,"tamatsukuri.ibaraki.jp":true,"tokai.ibaraki.jp":true,"tomobe.ibaraki.jp":true,"tone.ibaraki.jp":true,"toride.ibaraki.jp":true,"tsuchiura.ibaraki.jp":true,"tsukuba.ibaraki.jp":true,"uchihara.ibaraki.jp":true,"ushiku.ibaraki.jp":true,"yachiyo.ibaraki.jp":true,"yamagata.ibaraki.jp":true,"yawara.ibaraki.jp":true,"yuki.ibaraki.jp":true,"anamizu.ishikawa.jp":true,"hakui.ishikawa.jp":true,"hakusan.ishikawa.jp":true,"kaga.ishikawa.jp":true,"kahoku.ishikawa.jp":true,"kanazawa.ishikawa.jp":true,"kawakita.ishikawa.jp":true,"komatsu.ishikawa.jp":true,"nakanoto.ishikawa.jp":true,"nanao.ishikawa.jp":true,"nomi.ishikawa.jp":true,"nonoichi.ishikawa.jp":true,"noto.ishikawa.jp":true,"shika.ishikawa.jp":true,"suzu.ishikawa.jp":true,"tsubata.ishikawa.jp":true,"tsurugi.ishikawa.jp":true,"uchinada.ishikawa.jp":true,"wajima.ishikawa.jp":true,"fudai.iwate.jp":true,"fujisawa.iwate.jp":true,"hanamaki.iwate.jp":true,"hiraizumi.iwate.jp":true,"hirono.iwate.jp":true,"ichinohe.iwate.jp":true,"ichinoseki.iwate.jp":true,"iwaizumi.iwate.jp":true,"iwate.iwate.jp":true,"joboji.iwate.jp":true,"kamaishi.iwate.jp":true,"kanegasaki.iwate.jp":true,"karumai.iwate.jp":true,"kawai.iwate.jp":true,"kitakami.iwate.jp":true,"kuji.iwate.jp":true,"kunohe.iwate.jp":true,"kuzumaki.iwate.jp":true,"miyako.iwate.jp":true,"mizusawa.iwate.jp":true,"morioka.iwate.jp":true,"ninohe.iwate.jp":true,"noda.iwate.jp":true,"ofunato.iwate.jp":true,"oshu.iwate.jp":true,"otsuchi.iwate.jp":true,"rikuzentakata.iwate.jp":true,"shiwa.iwate.jp":true,"shizukuishi.iwate.jp":true,"sumita.iwate.jp":true,"tanohata.iwate.jp":true,"tono.iwate.jp":true,"yahaba.iwate.jp":true,"yamada.iwate.jp":true,"ayagawa.kagawa.jp":true,"higashikagawa.kagawa.jp":true,"kanonji.kagawa.jp":true,"kotohira.kagawa.jp":true,"manno.kagawa.jp":true,"marugame.kagawa.jp":true,"mitoyo.kagawa.jp":true,"naoshima.kagawa.jp":true,"sanuki.kagawa.jp":true,"tadotsu.kagawa.jp":true,"takamatsu.kagawa.jp":true,"tonosho.kagawa.jp":true,"uchinomi.kagawa.jp":true,"utazu.kagawa.jp":true,"zentsuji.kagawa.jp":true,"akune.kagoshima.jp":true,"amami.kagoshima.jp":true,"hioki.kagoshima.jp":true,"isa.kagoshima.jp":true,"isen.kagoshima.jp":true,"izumi.kagoshima.jp":true,"kagoshima.kagoshima.jp":true,"kanoya.kagoshima.jp":true,"kawanabe.kagoshima.jp":true,"kinko.kagoshima.jp":true,"kouyama.kagoshima.jp":true,"makurazaki.kagoshima.jp":true,"matsumoto.kagoshima.jp":true,"minamitane.kagoshima.jp":true,"nakatane.kagoshima.jp":true,"nishinoomote.kagoshima.jp":true,"satsumasendai.kagoshima.jp":true,"soo.kagoshima.jp":true,"tarumizu.kagoshima.jp":true,"yusui.kagoshima.jp":true,"aikawa.kanagawa.jp":true,"atsugi.kanagawa.jp":true,"ayase.kanagawa.jp":true,"chigasaki.kanagawa.jp":true,"ebina.kanagawa.jp":true,"fujisawa.kanagawa.jp":true,"hadano.kanagawa.jp":true,"hakone.kanagawa.jp":true,"hiratsuka.kanagawa.jp":true,"isehara.kanagawa.jp":true,"kaisei.kanagawa.jp":true,"kamakura.kanagawa.jp":true,"kiyokawa.kanagawa.jp":true,"matsuda.kanagawa.jp":true,"minamiashigara.kanagawa.jp":true,"miura.kanagawa.jp":true,"nakai.kanagawa.jp":true,"ninomiya.kanagawa.jp":true,"odawara.kanagawa.jp":true,"oi.kanagawa.jp":true,"oiso.kanagawa.jp":true,"sagamihara.kanagawa.jp":true,"samukawa.kanagawa.jp":true,"tsukui.kanagawa.jp":true,"yamakita.kanagawa.jp":true,"yamato.kanagawa.jp":true,"yokosuka.kanagawa.jp":true,"yugawara.kanagawa.jp":true,"zama.kanagawa.jp":true,"zushi.kanagawa.jp":true,"aki.kochi.jp":true,"geisei.kochi.jp":true,"hidaka.kochi.jp":true,"higashitsuno.kochi.jp":true,"ino.kochi.jp":true,"kagami.kochi.jp":true,"kami.kochi.jp":true,"kitagawa.kochi.jp":true,"kochi.kochi.jp":true,"mihara.kochi.jp":true,"motoyama.kochi.jp":true,"muroto.kochi.jp":true,"nahari.kochi.jp":true,"nakamura.kochi.jp":true,"nankoku.kochi.jp":true,"nishitosa.kochi.jp":true,"niyodogawa.kochi.jp":true,"ochi.kochi.jp":true,"okawa.kochi.jp":true,"otoyo.kochi.jp":true,"otsuki.kochi.jp":true,"sakawa.kochi.jp":true,"sukumo.kochi.jp":true,"susaki.kochi.jp":true,"tosa.kochi.jp":true,"tosashimizu.kochi.jp":true,"toyo.kochi.jp":true,"tsuno.kochi.jp":true,"umaji.kochi.jp":true,"yasuda.kochi.jp":true,"yusuhara.kochi.jp":true,"amakusa.kumamoto.jp":true,"arao.kumamoto.jp":true,"aso.kumamoto.jp":true,"choyo.kumamoto.jp":true,"gyokuto.kumamoto.jp":true,"hitoyoshi.kumamoto.jp":true,"kamiamakusa.kumamoto.jp":true,"kashima.kumamoto.jp":true,"kikuchi.kumamoto.jp":true,"kosa.kumamoto.jp":true,"kumamoto.kumamoto.jp":true,"mashiki.kumamoto.jp":true,"mifune.kumamoto.jp":true,"minamata.kumamoto.jp":true,"minamioguni.kumamoto.jp":true,"nagasu.kumamoto.jp":true,"nishihara.kumamoto.jp":true,"oguni.kumamoto.jp":true,"ozu.kumamoto.jp":true,"sumoto.kumamoto.jp":true,"takamori.kumamoto.jp":true,"uki.kumamoto.jp":true,"uto.kumamoto.jp":true,"yamaga.kumamoto.jp":true,"yamato.kumamoto.jp":true,"yatsushiro.kumamoto.jp":true,"ayabe.kyoto.jp":true,"fukuchiyama.kyoto.jp":true,"higashiyama.kyoto.jp":true,"ide.kyoto.jp":true,"ine.kyoto.jp":true,"joyo.kyoto.jp":true,"kameoka.kyoto.jp":true,"kamo.kyoto.jp":true,"kita.kyoto.jp":true,"kizu.kyoto.jp":true,"kumiyama.kyoto.jp":true,"kyotamba.kyoto.jp":true,"kyotanabe.kyoto.jp":true,"kyotango.kyoto.jp":true,"maizuru.kyoto.jp":true,"minami.kyoto.jp":true,"minamiyamashiro.kyoto.jp":true,"miyazu.kyoto.jp":true,"muko.kyoto.jp":true,"nagaokakyo.kyoto.jp":true,"nakagyo.kyoto.jp":true,"nantan.kyoto.jp":true,"oyamazaki.kyoto.jp":true,"sakyo.kyoto.jp":true,"seika.kyoto.jp":true,"tanabe.kyoto.jp":true,"uji.kyoto.jp":true,"ujitawara.kyoto.jp":true,"wazuka.kyoto.jp":true,"yamashina.kyoto.jp":true,"yawata.kyoto.jp":true,"asahi.mie.jp":true,"inabe.mie.jp":true,"ise.mie.jp":true,"kameyama.mie.jp":true,"kawagoe.mie.jp":true,"kiho.mie.jp":true,"kisosaki.mie.jp":true,"kiwa.mie.jp":true,"komono.mie.jp":true,"kumano.mie.jp":true,"kuwana.mie.jp":true,"matsusaka.mie.jp":true,"meiwa.mie.jp":true,"mihama.mie.jp":true,"minamiise.mie.jp":true,"misugi.mie.jp":true,"miyama.mie.jp":true,"nabari.mie.jp":true,"shima.mie.jp":true,"suzuka.mie.jp":true,"tado.mie.jp":true,"taiki.mie.jp":true,"taki.mie.jp":true,"tamaki.mie.jp":true,"toba.mie.jp":true,"tsu.mie.jp":true,"udono.mie.jp":true,"ureshino.mie.jp":true,"watarai.mie.jp":true,"yokkaichi.mie.jp":true,"furukawa.miyagi.jp":true,"higashimatsushima.miyagi.jp":true,"ishinomaki.miyagi.jp":true,"iwanuma.miyagi.jp":true,"kakuda.miyagi.jp":true,"kami.miyagi.jp":true,"kawasaki.miyagi.jp":true,"kesennuma.miyagi.jp":true,"marumori.miyagi.jp":true,"matsushima.miyagi.jp":true,"minamisanriku.miyagi.jp":true,"misato.miyagi.jp":true,"murata.miyagi.jp":true,"natori.miyagi.jp":true,"ogawara.miyagi.jp":true,"ohira.miyagi.jp":true,"onagawa.miyagi.jp":true,"osaki.miyagi.jp":true,"rifu.miyagi.jp":true,"semine.miyagi.jp":true,"shibata.miyagi.jp":true,"shichikashuku.miyagi.jp":true,"shikama.miyagi.jp":true,"shiogama.miyagi.jp":true,"shiroishi.miyagi.jp":true,"tagajo.miyagi.jp":true,"taiwa.miyagi.jp":true,"tome.miyagi.jp":true,"tomiya.miyagi.jp":true,"wakuya.miyagi.jp":true,"watari.miyagi.jp":true,"yamamoto.miyagi.jp":true,"zao.miyagi.jp":true,"aya.miyazaki.jp":true,"ebino.miyazaki.jp":true,"gokase.miyazaki.jp":true,"hyuga.miyazaki.jp":true,"kadogawa.miyazaki.jp":true,"kawaminami.miyazaki.jp":true,"kijo.miyazaki.jp":true,"kitagawa.miyazaki.jp":true,"kitakata.miyazaki.jp":true,"kitaura.miyazaki.jp":true,"kobayashi.miyazaki.jp":true,"kunitomi.miyazaki.jp":true,"kushima.miyazaki.jp":true,"mimata.miyazaki.jp":true,"miyakonojo.miyazaki.jp":true,"miyazaki.miyazaki.jp":true,"morotsuka.miyazaki.jp":true,"nichinan.miyazaki.jp":true,"nishimera.miyazaki.jp":true,"nobeoka.miyazaki.jp":true,"saito.miyazaki.jp":true,"shiiba.miyazaki.jp":true,"shintomi.miyazaki.jp":true,"takaharu.miyazaki.jp":true,"takanabe.miyazaki.jp":true,"takazaki.miyazaki.jp":true,"tsuno.miyazaki.jp":true,"achi.nagano.jp":true,"agematsu.nagano.jp":true,"anan.nagano.jp":true,"aoki.nagano.jp":true,"asahi.nagano.jp":true,"azumino.nagano.jp":true,"chikuhoku.nagano.jp":true,"chikuma.nagano.jp":true,"chino.nagano.jp":true,"fujimi.nagano.jp":true,"hakuba.nagano.jp":true,"hara.nagano.jp":true,"hiraya.nagano.jp":true,"iida.nagano.jp":true,"iijima.nagano.jp":true,"iiyama.nagano.jp":true,"iizuna.nagano.jp":true,"ikeda.nagano.jp":true,"ikusaka.nagano.jp":true,"ina.nagano.jp":true,"karuizawa.nagano.jp":true,"kawakami.nagano.jp":true,"kiso.nagano.jp":true,"kisofukushima.nagano.jp":true,"kitaaiki.nagano.jp":true,"komagane.nagano.jp":true,"komoro.nagano.jp":true,"matsukawa.nagano.jp":true,"matsumoto.nagano.jp":true,"miasa.nagano.jp":true,"minamiaiki.nagano.jp":true,"minamimaki.nagano.jp":true,"minamiminowa.nagano.jp":true,"minowa.nagano.jp":true,"miyada.nagano.jp":true,"miyota.nagano.jp":true,"mochizuki.nagano.jp":true,"nagano.nagano.jp":true,"nagawa.nagano.jp":true,"nagiso.nagano.jp":true,"nakagawa.nagano.jp":true,"nakano.nagano.jp":true,"nozawaonsen.nagano.jp":true,"obuse.nagano.jp":true,"ogawa.nagano.jp":true,"okaya.nagano.jp":true,"omachi.nagano.jp":true,"omi.nagano.jp":true,"ookuwa.nagano.jp":true,"ooshika.nagano.jp":true,"otaki.nagano.jp":true,"otari.nagano.jp":true,"sakae.nagano.jp":true,"sakaki.nagano.jp":true,"saku.nagano.jp":true,"sakuho.nagano.jp":true,"shimosuwa.nagano.jp":true,"shinanomachi.nagano.jp":true,"shiojiri.nagano.jp":true,"suwa.nagano.jp":true,"suzaka.nagano.jp":true,"takagi.nagano.jp":true,"takamori.nagano.jp":true,"takayama.nagano.jp":true,"tateshina.nagano.jp":true,"tatsuno.nagano.jp":true,"togakushi.nagano.jp":true,"togura.nagano.jp":true,"tomi.nagano.jp":true,"ueda.nagano.jp":true,"wada.nagano.jp":true,"yamagata.nagano.jp":true,"yamanouchi.nagano.jp":true,"yasaka.nagano.jp":true,"yasuoka.nagano.jp":true,"chijiwa.nagasaki.jp":true,"futsu.nagasaki.jp":true,"goto.nagasaki.jp":true,"hasami.nagasaki.jp":true,"hirado.nagasaki.jp":true,"iki.nagasaki.jp":true,"isahaya.nagasaki.jp":true,"kawatana.nagasaki.jp":true,"kuchinotsu.nagasaki.jp":true,"matsuura.nagasaki.jp":true,"nagasaki.nagasaki.jp":true,"obama.nagasaki.jp":true,"omura.nagasaki.jp":true,"oseto.nagasaki.jp":true,"saikai.nagasaki.jp":true,"sasebo.nagasaki.jp":true,"seihi.nagasaki.jp":true,"shimabara.nagasaki.jp":true,"shinkamigoto.nagasaki.jp":true,"togitsu.nagasaki.jp":true,"tsushima.nagasaki.jp":true,"unzen.nagasaki.jp":true,"ando.nara.jp":true,"gose.nara.jp":true,"heguri.nara.jp":true,"higashiyoshino.nara.jp":true,"ikaruga.nara.jp":true,"ikoma.nara.jp":true,"kamikitayama.nara.jp":true,"kanmaki.nara.jp":true,"kashiba.nara.jp":true,"kashihara.nara.jp":true,"katsuragi.nara.jp":true,"kawai.nara.jp":true,"kawakami.nara.jp":true,"kawanishi.nara.jp":true,"koryo.nara.jp":true,"kurotaki.nara.jp":true,"mitsue.nara.jp":true,"miyake.nara.jp":true,"nara.nara.jp":true,"nosegawa.nara.jp":true,"oji.nara.jp":true,"ouda.nara.jp":true,"oyodo.nara.jp":true,"sakurai.nara.jp":true,"sango.nara.jp":true,"shimoichi.nara.jp":true,"shimokitayama.nara.jp":true,"shinjo.nara.jp":true,"soni.nara.jp":true,"takatori.nara.jp":true,"tawaramoto.nara.jp":true,"tenkawa.nara.jp":true,"tenri.nara.jp":true,"uda.nara.jp":true,"yamatokoriyama.nara.jp":true,"yamatotakada.nara.jp":true,"yamazoe.nara.jp":true,"yoshino.nara.jp":true,"aga.niigata.jp":true,"agano.niigata.jp":true,"gosen.niigata.jp":true,"itoigawa.niigata.jp":true,"izumozaki.niigata.jp":true,"joetsu.niigata.jp":true,"kamo.niigata.jp":true,"kariwa.niigata.jp":true,"kashiwazaki.niigata.jp":true,"minamiuonuma.niigata.jp":true,"mitsuke.niigata.jp":true,"muika.niigata.jp":true,"murakami.niigata.jp":true,"myoko.niigata.jp":true,"nagaoka.niigata.jp":true,"niigata.niigata.jp":true,"ojiya.niigata.jp":true,"omi.niigata.jp":true,"sado.niigata.jp":true,"sanjo.niigata.jp":true,"seiro.niigata.jp":true,"seirou.niigata.jp":true,"sekikawa.niigata.jp":true,"shibata.niigata.jp":true,"tagami.niigata.jp":true,"tainai.niigata.jp":true,"tochio.niigata.jp":true,"tokamachi.niigata.jp":true,"tsubame.niigata.jp":true,"tsunan.niigata.jp":true,"uonuma.niigata.jp":true,"yahiko.niigata.jp":true,"yoita.niigata.jp":true,"yuzawa.niigata.jp":true,"beppu.oita.jp":true,"bungoono.oita.jp":true,"bungotakada.oita.jp":true,"hasama.oita.jp":true,"hiji.oita.jp":true,"himeshima.oita.jp":true,"hita.oita.jp":true,"kamitsue.oita.jp":true,"kokonoe.oita.jp":true,"kuju.oita.jp":true,"kunisaki.oita.jp":true,"kusu.oita.jp":true,"oita.oita.jp":true,"saiki.oita.jp":true,"taketa.oita.jp":true,"tsukumi.oita.jp":true,"usa.oita.jp":true,"usuki.oita.jp":true,"yufu.oita.jp":true,"akaiwa.okayama.jp":true,"asakuchi.okayama.jp":true,"bizen.okayama.jp":true,"hayashima.okayama.jp":true,"ibara.okayama.jp":true,"kagamino.okayama.jp":true,"kasaoka.okayama.jp":true,"kibichuo.okayama.jp":true,"kumenan.okayama.jp":true,"kurashiki.okayama.jp":true,"maniwa.okayama.jp":true,"misaki.okayama.jp":true,"nagi.okayama.jp":true,"niimi.okayama.jp":true,"nishiawakura.okayama.jp":true,"okayama.okayama.jp":true,"satosho.okayama.jp":true,"setouchi.okayama.jp":true,"shinjo.okayama.jp":true,"shoo.okayama.jp":true,"soja.okayama.jp":true,"takahashi.okayama.jp":true,"tamano.okayama.jp":true,"tsuyama.okayama.jp":true,"wake.okayama.jp":true,"yakage.okayama.jp":true,"aguni.okinawa.jp":true,"ginowan.okinawa.jp":true,"ginoza.okinawa.jp":true,"gushikami.okinawa.jp":true,"haebaru.okinawa.jp":true,"higashi.okinawa.jp":true,"hirara.okinawa.jp":true,"iheya.okinawa.jp":true,"ishigaki.okinawa.jp":true,"ishikawa.okinawa.jp":true,"itoman.okinawa.jp":true,"izena.okinawa.jp":true,"kadena.okinawa.jp":true,"kin.okinawa.jp":true,"kitadaito.okinawa.jp":true,"kitanakagusuku.okinawa.jp":true,"kumejima.okinawa.jp":true,"kunigami.okinawa.jp":true,"minamidaito.okinawa.jp":true,"motobu.okinawa.jp":true,"nago.okinawa.jp":true,"naha.okinawa.jp":true,"nakagusuku.okinawa.jp":true,"nakijin.okinawa.jp":true,"nanjo.okinawa.jp":true,"nishihara.okinawa.jp":true,"ogimi.okinawa.jp":true,"okinawa.okinawa.jp":true,"onna.okinawa.jp":true,"shimoji.okinawa.jp":true,"taketomi.okinawa.jp":true,"tarama.okinawa.jp":true,"tokashiki.okinawa.jp":true,"tomigusuku.okinawa.jp":true,"tonaki.okinawa.jp":true,"urasoe.okinawa.jp":true,"uruma.okinawa.jp":true,"yaese.okinawa.jp":true,"yomitan.okinawa.jp":true,"yonabaru.okinawa.jp":true,"yonaguni.okinawa.jp":true,"zamami.okinawa.jp":true,"abeno.osaka.jp":true,"chihayaakasaka.osaka.jp":true,"chuo.osaka.jp":true,"daito.osaka.jp":true,"fujiidera.osaka.jp":true,"habikino.osaka.jp":true,"hannan.osaka.jp":true,"higashiosaka.osaka.jp":true,"higashisumiyoshi.osaka.jp":true,"higashiyodogawa.osaka.jp":true,"hirakata.osaka.jp":true,"ibaraki.osaka.jp":true,"ikeda.osaka.jp":true,"izumi.osaka.jp":true,"izumiotsu.osaka.jp":true,"izumisano.osaka.jp":true,"kadoma.osaka.jp":true,"kaizuka.osaka.jp":true,"kanan.osaka.jp":true,"kashiwara.osaka.jp":true,"katano.osaka.jp":true,"kawachinagano.osaka.jp":true,"kishiwada.osaka.jp":true,"kita.osaka.jp":true,"kumatori.osaka.jp":true,"matsubara.osaka.jp":true,"minato.osaka.jp":true,"minoh.osaka.jp":true,"misaki.osaka.jp":true,"moriguchi.osaka.jp":true,"neyagawa.osaka.jp":true,"nishi.osaka.jp":true,"nose.osaka.jp":true,"osakasayama.osaka.jp":true,"sakai.osaka.jp":true,"sayama.osaka.jp":true,"sennan.osaka.jp":true,"settsu.osaka.jp":true,"shijonawate.osaka.jp":true,"shimamoto.osaka.jp":true,"suita.osaka.jp":true,"tadaoka.osaka.jp":true,"taishi.osaka.jp":true,"tajiri.osaka.jp":true,"takaishi.osaka.jp":true,"takatsuki.osaka.jp":true,"tondabayashi.osaka.jp":true,"toyonaka.osaka.jp":true,"toyono.osaka.jp":true,"yao.osaka.jp":true,"ariake.saga.jp":true,"arita.saga.jp":true,"fukudomi.saga.jp":true,"genkai.saga.jp":true,"hamatama.saga.jp":true,"hizen.saga.jp":true,"imari.saga.jp":true,"kamimine.saga.jp":true,"kanzaki.saga.jp":true,"karatsu.saga.jp":true,"kashima.saga.jp":true,"kitagata.saga.jp":true,"kitahata.saga.jp":true,"kiyama.saga.jp":true,"kouhoku.saga.jp":true,"kyuragi.saga.jp":true,"nishiarita.saga.jp":true,"ogi.saga.jp":true,"omachi.saga.jp":true,"ouchi.saga.jp":true,"saga.saga.jp":true,"shiroishi.saga.jp":true,"taku.saga.jp":true,"tara.saga.jp":true,"tosu.saga.jp":true,"yoshinogari.saga.jp":true,"arakawa.saitama.jp":true,"asaka.saitama.jp":true,"chichibu.saitama.jp":true,"fujimi.saitama.jp":true,"fujimino.saitama.jp":true,"fukaya.saitama.jp":true,"hanno.saitama.jp":true,"hanyu.saitama.jp":true,"hasuda.saitama.jp":true,"hatogaya.saitama.jp":true,"hatoyama.saitama.jp":true,"hidaka.saitama.jp":true,"higashichichibu.saitama.jp":true,"higashimatsuyama.saitama.jp":true,"honjo.saitama.jp":true,"ina.saitama.jp":true,"iruma.saitama.jp":true,"iwatsuki.saitama.jp":true,"kamiizumi.saitama.jp":true,"kamikawa.saitama.jp":true,"kamisato.saitama.jp":true,"kasukabe.saitama.jp":true,"kawagoe.saitama.jp":true,"kawaguchi.saitama.jp":true,"kawajima.saitama.jp":true,"kazo.saitama.jp":true,"kitamoto.saitama.jp":true,"koshigaya.saitama.jp":true,"kounosu.saitama.jp":true,"kuki.saitama.jp":true,"kumagaya.saitama.jp":true,"matsubushi.saitama.jp":true,"minano.saitama.jp":true,"misato.saitama.jp":true,"miyashiro.saitama.jp":true,"miyoshi.saitama.jp":true,"moroyama.saitama.jp":true,"nagatoro.saitama.jp":true,"namegawa.saitama.jp":true,"niiza.saitama.jp":true,"ogano.saitama.jp":true,"ogawa.saitama.jp":true,"ogose.saitama.jp":true,"okegawa.saitama.jp":true,"omiya.saitama.jp":true,"otaki.saitama.jp":true,"ranzan.saitama.jp":true,"ryokami.saitama.jp":true,"saitama.saitama.jp":true,"sakado.saitama.jp":true,"satte.saitama.jp":true,"sayama.saitama.jp":true,"shiki.saitama.jp":true,"shiraoka.saitama.jp":true,"soka.saitama.jp":true,"sugito.saitama.jp":true,"toda.saitama.jp":true,"tokigawa.saitama.jp":true,"tokorozawa.saitama.jp":true,"tsurugashima.saitama.jp":true,"urawa.saitama.jp":true,"warabi.saitama.jp":true,"yashio.saitama.jp":true,"yokoze.saitama.jp":true,"yono.saitama.jp":true,"yorii.saitama.jp":true,"yoshida.saitama.jp":true,"yoshikawa.saitama.jp":true,"yoshimi.saitama.jp":true,"aisho.shiga.jp":true,"gamo.shiga.jp":true,"higashiomi.shiga.jp":true,"hikone.shiga.jp":true,"koka.shiga.jp":true,"konan.shiga.jp":true,"kosei.shiga.jp":true,"koto.shiga.jp":true,"kusatsu.shiga.jp":true,"maibara.shiga.jp":true,"moriyama.shiga.jp":true,"nagahama.shiga.jp":true,"nishiazai.shiga.jp":true,"notogawa.shiga.jp":true,"omihachiman.shiga.jp":true,"otsu.shiga.jp":true,"ritto.shiga.jp":true,"ryuoh.shiga.jp":true,"takashima.shiga.jp":true,"takatsuki.shiga.jp":true,"torahime.shiga.jp":true,"toyosato.shiga.jp":true,"yasu.shiga.jp":true,"akagi.shimane.jp":true,"ama.shimane.jp":true,"gotsu.shimane.jp":true,"hamada.shimane.jp":true,"higashiizumo.shimane.jp":true,"hikawa.shimane.jp":true,"hikimi.shimane.jp":true,"izumo.shimane.jp":true,"kakinoki.shimane.jp":true,"masuda.shimane.jp":true,"matsue.shimane.jp":true,"misato.shimane.jp":true,"nishinoshima.shimane.jp":true,"ohda.shimane.jp":true,"okinoshima.shimane.jp":true,"okuizumo.shimane.jp":true,"shimane.shimane.jp":true,"tamayu.shimane.jp":true,"tsuwano.shimane.jp":true,"unnan.shimane.jp":true,"yakumo.shimane.jp":true,"yasugi.shimane.jp":true,"yatsuka.shimane.jp":true,"arai.shizuoka.jp":true,"atami.shizuoka.jp":true,"fuji.shizuoka.jp":true,"fujieda.shizuoka.jp":true,"fujikawa.shizuoka.jp":true,"fujinomiya.shizuoka.jp":true,"fukuroi.shizuoka.jp":true,"gotemba.shizuoka.jp":true,"haibara.shizuoka.jp":true,"hamamatsu.shizuoka.jp":true,"higashiizu.shizuoka.jp":true,"ito.shizuoka.jp":true,"iwata.shizuoka.jp":true,"izu.shizuoka.jp":true,"izunokuni.shizuoka.jp":true,"kakegawa.shizuoka.jp":true,"kannami.shizuoka.jp":true,"kawanehon.shizuoka.jp":true,"kawazu.shizuoka.jp":true,"kikugawa.shizuoka.jp":true,"kosai.shizuoka.jp":true,"makinohara.shizuoka.jp":true,"matsuzaki.shizuoka.jp":true,"minamiizu.shizuoka.jp":true,"mishima.shizuoka.jp":true,"morimachi.shizuoka.jp":true,"nishiizu.shizuoka.jp":true,"numazu.shizuoka.jp":true,"omaezaki.shizuoka.jp":true,"shimada.shizuoka.jp":true,"shimizu.shizuoka.jp":true,"shimoda.shizuoka.jp":true,"shizuoka.shizuoka.jp":true,"susono.shizuoka.jp":true,"yaizu.shizuoka.jp":true,"yoshida.shizuoka.jp":true,"ashikaga.tochigi.jp":true,"bato.tochigi.jp":true,"haga.tochigi.jp":true,"ichikai.tochigi.jp":true,"iwafune.tochigi.jp":true,"kaminokawa.tochigi.jp":true,"kanuma.tochigi.jp":true,"karasuyama.tochigi.jp":true,"kuroiso.tochigi.jp":true,"mashiko.tochigi.jp":true,"mibu.tochigi.jp":true,"moka.tochigi.jp":true,"motegi.tochigi.jp":true,"nasu.tochigi.jp":true,"nasushiobara.tochigi.jp":true,"nikko.tochigi.jp":true,"nishikata.tochigi.jp":true,"nogi.tochigi.jp":true,"ohira.tochigi.jp":true,"ohtawara.tochigi.jp":true,"oyama.tochigi.jp":true,"sakura.tochigi.jp":true,"sano.tochigi.jp":true,"shimotsuke.tochigi.jp":true,"shioya.tochigi.jp":true,"takanezawa.tochigi.jp":true,"tochigi.tochigi.jp":true,"tsuga.tochigi.jp":true,"ujiie.tochigi.jp":true,"utsunomiya.tochigi.jp":true,"yaita.tochigi.jp":true,"aizumi.tokushima.jp":true,"anan.tokushima.jp":true,"ichiba.tokushima.jp":true,"itano.tokushima.jp":true,"kainan.tokushima.jp":true,"komatsushima.tokushima.jp":true,"matsushige.tokushima.jp":true,"mima.tokushima.jp":true,"minami.tokushima.jp":true,"miyoshi.tokushima.jp":true,"mugi.tokushima.jp":true,"nakagawa.tokushima.jp":true,"naruto.tokushima.jp":true,"sanagochi.tokushima.jp":true,"shishikui.tokushima.jp":true,"tokushima.tokushima.jp":true,"wajiki.tokushima.jp":true,"adachi.tokyo.jp":true,"akiruno.tokyo.jp":true,"akishima.tokyo.jp":true,"aogashima.tokyo.jp":true,"arakawa.tokyo.jp":true,"bunkyo.tokyo.jp":true,"chiyoda.tokyo.jp":true,"chofu.tokyo.jp":true,"chuo.tokyo.jp":true,"edogawa.tokyo.jp":true,"fuchu.tokyo.jp":true,"fussa.tokyo.jp":true,"hachijo.tokyo.jp":true,"hachioji.tokyo.jp":true,"hamura.tokyo.jp":true,"higashikurume.tokyo.jp":true,"higashimurayama.tokyo.jp":true,"higashiyamato.tokyo.jp":true,"hino.tokyo.jp":true,"hinode.tokyo.jp":true,"hinohara.tokyo.jp":true,"inagi.tokyo.jp":true,"itabashi.tokyo.jp":true,"katsushika.tokyo.jp":true,"kita.tokyo.jp":true,"kiyose.tokyo.jp":true,"kodaira.tokyo.jp":true,"koganei.tokyo.jp":true,"kokubunji.tokyo.jp":true,"komae.tokyo.jp":true,"koto.tokyo.jp":true,"kouzushima.tokyo.jp":true,"kunitachi.tokyo.jp":true,"machida.tokyo.jp":true,"meguro.tokyo.jp":true,"minato.tokyo.jp":true,"mitaka.tokyo.jp":true,"mizuho.tokyo.jp":true,"musashimurayama.tokyo.jp":true,"musashino.tokyo.jp":true,"nakano.tokyo.jp":true,"nerima.tokyo.jp":true,"ogasawara.tokyo.jp":true,"okutama.tokyo.jp":true,"ome.tokyo.jp":true,"oshima.tokyo.jp":true,"ota.tokyo.jp":true,"setagaya.tokyo.jp":true,"shibuya.tokyo.jp":true,"shinagawa.tokyo.jp":true,"shinjuku.tokyo.jp":true,"suginami.tokyo.jp":true,"sumida.tokyo.jp":true,"tachikawa.tokyo.jp":true,"taito.tokyo.jp":true,"tama.tokyo.jp":true,"toshima.tokyo.jp":true,"chizu.tottori.jp":true,"hino.tottori.jp":true,"kawahara.tottori.jp":true,"koge.tottori.jp":true,"kotoura.tottori.jp":true,"misasa.tottori.jp":true,"nanbu.tottori.jp":true,"nichinan.tottori.jp":true,"sakaiminato.tottori.jp":true,"tottori.tottori.jp":true,"wakasa.tottori.jp":true,"yazu.tottori.jp":true,"yonago.tottori.jp":true,"asahi.toyama.jp":true,"fuchu.toyama.jp":true,"fukumitsu.toyama.jp":true,"funahashi.toyama.jp":true,"himi.toyama.jp":true,"imizu.toyama.jp":true,"inami.toyama.jp":true,"johana.toyama.jp":true,"kamiichi.toyama.jp":true,"kurobe.toyama.jp":true,"nakaniikawa.toyama.jp":true,"namerikawa.toyama.jp":true,"nanto.toyama.jp":true,"nyuzen.toyama.jp":true,"oyabe.toyama.jp":true,"taira.toyama.jp":true,"takaoka.toyama.jp":true,"tateyama.toyama.jp":true,"toga.toyama.jp":true,"tonami.toyama.jp":true,"toyama.toyama.jp":true,"unazuki.toyama.jp":true,"uozu.toyama.jp":true,"yamada.toyama.jp":true,"arida.wakayama.jp":true,"aridagawa.wakayama.jp":true,"gobo.wakayama.jp":true,"hashimoto.wakayama.jp":true,"hidaka.wakayama.jp":true,"hirogawa.wakayama.jp":true,"inami.wakayama.jp":true,"iwade.wakayama.jp":true,"kainan.wakayama.jp":true,"kamitonda.wakayama.jp":true,"katsuragi.wakayama.jp":true,"kimino.wakayama.jp":true,"kinokawa.wakayama.jp":true,"kitayama.wakayama.jp":true,"koya.wakayama.jp":true,"koza.wakayama.jp":true,"kozagawa.wakayama.jp":true,"kudoyama.wakayama.jp":true,"kushimoto.wakayama.jp":true,"mihama.wakayama.jp":true,"misato.wakayama.jp":true,"nachikatsuura.wakayama.jp":true,"shingu.wakayama.jp":true,"shirahama.wakayama.jp":true,"taiji.wakayama.jp":true,"tanabe.wakayama.jp":true,"wakayama.wakayama.jp":true,"yuasa.wakayama.jp":true,"yura.wakayama.jp":true,"asahi.yamagata.jp":true,"funagata.yamagata.jp":true,"higashine.yamagata.jp":true,"iide.yamagata.jp":true,"kahoku.yamagata.jp":true,"kaminoyama.yamagata.jp":true,"kaneyama.yamagata.jp":true,"kawanishi.yamagata.jp":true,"mamurogawa.yamagata.jp":true,"mikawa.yamagata.jp":true,"murayama.yamagata.jp":true,"nagai.yamagata.jp":true,"nakayama.yamagata.jp":true,"nanyo.yamagata.jp":true,"nishikawa.yamagata.jp":true,"obanazawa.yamagata.jp":true,"oe.yamagata.jp":true,"oguni.yamagata.jp":true,"ohkura.yamagata.jp":true,"oishida.yamagata.jp":true,"sagae.yamagata.jp":true,"sakata.yamagata.jp":true,"sakegawa.yamagata.jp":true,"shinjo.yamagata.jp":true,"shirataka.yamagata.jp":true,"shonai.yamagata.jp":true,"takahata.yamagata.jp":true,"tendo.yamagata.jp":true,"tozawa.yamagata.jp":true,"tsuruoka.yamagata.jp":true,"yamagata.yamagata.jp":true,"yamanobe.yamagata.jp":true,"yonezawa.yamagata.jp":true,"yuza.yamagata.jp":true,"abu.yamaguchi.jp":true,"hagi.yamaguchi.jp":true,"hikari.yamaguchi.jp":true,"hofu.yamaguchi.jp":true,"iwakuni.yamaguchi.jp":true,"kudamatsu.yamaguchi.jp":true,"mitou.yamaguchi.jp":true,"nagato.yamaguchi.jp":true,"oshima.yamaguchi.jp":true,"shimonoseki.yamaguchi.jp":true,"shunan.yamaguchi.jp":true,"tabuse.yamaguchi.jp":true,"tokuyama.yamaguchi.jp":true,"toyota.yamaguchi.jp":true,"ube.yamaguchi.jp":true,"yuu.yamaguchi.jp":true,"chuo.yamanashi.jp":true,"doshi.yamanashi.jp":true,"fuefuki.yamanashi.jp":true,"fujikawa.yamanashi.jp":true,"fujikawaguchiko.yamanashi.jp":true,"fujiyoshida.yamanashi.jp":true,"hayakawa.yamanashi.jp":true,"hokuto.yamanashi.jp":true,"ichikawamisato.yamanashi.jp":true,"kai.yamanashi.jp":true,"kofu.yamanashi.jp":true,"koshu.yamanashi.jp":true,"kosuge.yamanashi.jp":true,"minami-alps.yamanashi.jp":true,"minobu.yamanashi.jp":true,"nakamichi.yamanashi.jp":true,"nanbu.yamanashi.jp":true,"narusawa.yamanashi.jp":true,"nirasaki.yamanashi.jp":true,"nishikatsura.yamanashi.jp":true,"oshino.yamanashi.jp":true,"otsuki.yamanashi.jp":true,"showa.yamanashi.jp":true,"tabayama.yamanashi.jp":true,"tsuru.yamanashi.jp":true,"uenohara.yamanashi.jp":true,"yamanakako.yamanashi.jp":true,"yamanashi.yamanashi.jp":true,"*.ke":true,"kg":true,"org.kg":true,"net.kg":true,"com.kg":true,"edu.kg":true,"gov.kg":true,"mil.kg":true,"*.kh":true,"ki":true,"edu.ki":true,"biz.ki":true,"net.ki":true,"org.ki":true,"gov.ki":true,"info.ki":true,"com.ki":true,"km":true,"org.km":true,"nom.km":true,"gov.km":true,"prd.km":true,"tm.km":true,"edu.km":true,"mil.km":true,"ass.km":true,"com.km":true,"coop.km":true,"asso.km":true,"presse.km":true,"medecin.km":true,"notaires.km":true,"pharmaciens.km":true,"veterinaire.km":true,"gouv.km":true,"kn":true,"net.kn":true,"org.kn":true,"edu.kn":true,"gov.kn":true,"kp":true,"com.kp":true,"edu.kp":true,"gov.kp":true,"org.kp":true,"rep.kp":true,"tra.kp":true,"kr":true,"ac.kr":true,"co.kr":true,"es.kr":true,"go.kr":true,"hs.kr":true,"kg.kr":true,"mil.kr":true,"ms.kr":true,"ne.kr":true,"or.kr":true,"pe.kr":true,"re.kr":true,"sc.kr":true,"busan.kr":true,"chungbuk.kr":true,"chungnam.kr":true,"daegu.kr":true,"daejeon.kr":true,"gangwon.kr":true,"gwangju.kr":true,"gyeongbuk.kr":true,"gyeonggi.kr":true,"gyeongnam.kr":true,"incheon.kr":true,"jeju.kr":true,"jeonbuk.kr":true,"jeonnam.kr":true,"seoul.kr":true,"ulsan.kr":true,"*.kw":true,"ky":true,"edu.ky":true,"gov.ky":true,"com.ky":true,"org.ky":true,"net.ky":true,"kz":true,"org.kz":true,"edu.kz":true,"net.kz":true,"gov.kz":true,"mil.kz":true,"com.kz":true,"la":true,"int.la":true,"net.la":true,"info.la":true,"edu.la":true,"gov.la":true,"per.la":true,"com.la":true,"org.la":true,"lb":true,"com.lb":true,"edu.lb":true,"gov.lb":true,"net.lb":true,"org.lb":true,"lc":true,"com.lc":true,"net.lc":true,"co.lc":true,"org.lc":true,"edu.lc":true,"gov.lc":true,"li":true,"lk":true,"gov.lk":true,"sch.lk":true,"net.lk":true,"int.lk":true,"com.lk":true,"org.lk":true,"edu.lk":true,"ngo.lk":true,"soc.lk":true,"web.lk":true,"ltd.lk":true,"assn.lk":true,"grp.lk":true,"hotel.lk":true,"lr":true,"com.lr":true,"edu.lr":true,"gov.lr":true,"org.lr":true,"net.lr":true,"ls":true,"co.ls":true,"org.ls":true,"lt":true,"gov.lt":true,"lu":true,"lv":true,"com.lv":true,"edu.lv":true,"gov.lv":true,"org.lv":true,"mil.lv":true,"id.lv":true,"net.lv":true,"asn.lv":true,"conf.lv":true,"ly":true,"com.ly":true,"net.ly":true,"gov.ly":true,"plc.ly":true,"edu.ly":true,"sch.ly":true,"med.ly":true,"org.ly":true,"id.ly":true,"ma":true,"co.ma":true,"net.ma":true,"gov.ma":true,"org.ma":true,"ac.ma":true,"press.ma":true,"mc":true,"tm.mc":true,"asso.mc":true,"md":true,"me":true,"co.me":true,"net.me":true,"org.me":true,"edu.me":true,"ac.me":true,"gov.me":true,"its.me":true,"priv.me":true,"mg":true,"org.mg":true,"nom.mg":true,"gov.mg":true,"prd.mg":true,"tm.mg":true,"edu.mg":true,"mil.mg":true,"com.mg":true,"mh":true,"mil":true,"mk":true,"com.mk":true,"org.mk":true,"net.mk":true,"edu.mk":true,"gov.mk":true,"inf.mk":true,"name.mk":true,"ml":true,"com.ml":true,"edu.ml":true,"gouv.ml":true,"gov.ml":true,"net.ml":true,"org.ml":true,"presse.ml":true,"*.mm":true,"mn":true,"gov.mn":true,"edu.mn":true,"org.mn":true,"mo":true,"com.mo":true,"net.mo":true,"org.mo":true,"edu.mo":true,"gov.mo":true,"mobi":true,"mp":true,"mq":true,"mr":true,"gov.mr":true,"ms":true,"com.ms":true,"edu.ms":true,"gov.ms":true,"net.ms":true,"org.ms":true,"mt":true,"com.mt":true,"edu.mt":true,"net.mt":true,"org.mt":true,"mu":true,"com.mu":true,"net.mu":true,"org.mu":true,"gov.mu":true,"ac.mu":true,"co.mu":true,"or.mu":true,"museum":true,"academy.museum":true,"agriculture.museum":true,"air.museum":true,"airguard.museum":true,"alabama.museum":true,"alaska.museum":true,"amber.museum":true,"ambulance.museum":true,"american.museum":true,"americana.museum":true,"americanantiques.museum":true,"americanart.museum":true,"amsterdam.museum":true,"and.museum":true,"annefrank.museum":true,"anthro.museum":true,"anthropology.museum":true,"antiques.museum":true,"aquarium.museum":true,"arboretum.museum":true,"archaeological.museum":true,"archaeology.museum":true,"architecture.museum":true,"art.museum":true,"artanddesign.museum":true,"artcenter.museum":true,"artdeco.museum":true,"arteducation.museum":true,"artgallery.museum":true,"arts.museum":true,"artsandcrafts.museum":true,"asmatart.museum":true,"assassination.museum":true,"assisi.museum":true,"association.museum":true,"astronomy.museum":true,"atlanta.museum":true,"austin.museum":true,"australia.museum":true,"automotive.museum":true,"aviation.museum":true,"axis.museum":true,"badajoz.museum":true,"baghdad.museum":true,"bahn.museum":true,"bale.museum":true,"baltimore.museum":true,"barcelona.museum":true,"baseball.museum":true,"basel.museum":true,"baths.museum":true,"bauern.museum":true,"beauxarts.museum":true,"beeldengeluid.museum":true,"bellevue.museum":true,"bergbau.museum":true,"berkeley.museum":true,"berlin.museum":true,"bern.museum":true,"bible.museum":true,"bilbao.museum":true,"bill.museum":true,"birdart.museum":true,"birthplace.museum":true,"bonn.museum":true,"boston.museum":true,"botanical.museum":true,"botanicalgarden.museum":true,"botanicgarden.museum":true,"botany.museum":true,"brandywinevalley.museum":true,"brasil.museum":true,"bristol.museum":true,"british.museum":true,"britishcolumbia.museum":true,"broadcast.museum":true,"brunel.museum":true,"brussel.museum":true,"brussels.museum":true,"bruxelles.museum":true,"building.museum":true,"burghof.museum":true,"bus.museum":true,"bushey.museum":true,"cadaques.museum":true,"california.museum":true,"cambridge.museum":true,"can.museum":true,"canada.museum":true,"capebreton.museum":true,"carrier.museum":true,"cartoonart.museum":true,"casadelamoneda.museum":true,"castle.museum":true,"castres.museum":true,"celtic.museum":true,"center.museum":true,"chattanooga.museum":true,"cheltenham.museum":true,"chesapeakebay.museum":true,"chicago.museum":true,"children.museum":true,"childrens.museum":true,"childrensgarden.museum":true,"chiropractic.museum":true,"chocolate.museum":true,"christiansburg.museum":true,"cincinnati.museum":true,"cinema.museum":true,"circus.museum":true,"civilisation.museum":true,"civilization.museum":true,"civilwar.museum":true,"clinton.museum":true,"clock.museum":true,"coal.museum":true,"coastaldefence.museum":true,"cody.museum":true,"coldwar.museum":true,"collection.museum":true,"colonialwilliamsburg.museum":true,"coloradoplateau.museum":true,"columbia.museum":true,"columbus.museum":true,"communication.museum":true,"communications.museum":true,"community.museum":true,"computer.museum":true,"computerhistory.museum":true,"xn--comunicaes-v6a2o.museum":true,"contemporary.museum":true,"contemporaryart.museum":true,"convent.museum":true,"copenhagen.museum":true,"corporation.museum":true,"xn--correios-e-telecomunicaes-ghc29a.museum":true,"corvette.museum":true,"costume.museum":true,"countryestate.museum":true,"county.museum":true,"crafts.museum":true,"cranbrook.museum":true,"creation.museum":true,"cultural.museum":true,"culturalcenter.museum":true,"culture.museum":true,"cyber.museum":true,"cymru.museum":true,"dali.museum":true,"dallas.museum":true,"database.museum":true,"ddr.museum":true,"decorativearts.museum":true,"delaware.museum":true,"delmenhorst.museum":true,"denmark.museum":true,"depot.museum":true,"design.museum":true,"detroit.museum":true,"dinosaur.museum":true,"discovery.museum":true,"dolls.museum":true,"donostia.museum":true,"durham.museum":true,"eastafrica.museum":true,"eastcoast.museum":true,"education.museum":true,"educational.museum":true,"egyptian.museum":true,"eisenbahn.museum":true,"elburg.museum":true,"elvendrell.museum":true,"embroidery.museum":true,"encyclopedic.museum":true,"england.museum":true,"entomology.museum":true,"environment.museum":true,"environmentalconservation.museum":true,"epilepsy.museum":true,"essex.museum":true,"estate.museum":true,"ethnology.museum":true,"exeter.museum":true,"exhibition.museum":true,"family.museum":true,"farm.museum":true,"farmequipment.museum":true,"farmers.museum":true,"farmstead.museum":true,"field.museum":true,"figueres.museum":true,"filatelia.museum":true,"film.museum":true,"fineart.museum":true,"finearts.museum":true,"finland.museum":true,"flanders.museum":true,"florida.museum":true,"force.museum":true,"fortmissoula.museum":true,"fortworth.museum":true,"foundation.museum":true,"francaise.museum":true,"frankfurt.museum":true,"franziskaner.museum":true,"freemasonry.museum":true,"freiburg.museum":true,"fribourg.museum":true,"frog.museum":true,"fundacio.museum":true,"furniture.museum":true,"gallery.museum":true,"garden.museum":true,"gateway.museum":true,"geelvinck.museum":true,"gemological.museum":true,"geology.museum":true,"georgia.museum":true,"giessen.museum":true,"glas.museum":true,"glass.museum":true,"gorge.museum":true,"grandrapids.museum":true,"graz.museum":true,"guernsey.museum":true,"halloffame.museum":true,"hamburg.museum":true,"handson.museum":true,"harvestcelebration.museum":true,"hawaii.museum":true,"health.museum":true,"heimatunduhren.museum":true,"hellas.museum":true,"helsinki.museum":true,"hembygdsforbund.museum":true,"heritage.museum":true,"histoire.museum":true,"historical.museum":true,"historicalsociety.museum":true,"historichouses.museum":true,"historisch.museum":true,"historisches.museum":true,"history.museum":true,"historyofscience.museum":true,"horology.museum":true,"house.museum":true,"humanities.museum":true,"illustration.museum":true,"imageandsound.museum":true,"indian.museum":true,"indiana.museum":true,"indianapolis.museum":true,"indianmarket.museum":true,"intelligence.museum":true,"interactive.museum":true,"iraq.museum":true,"iron.museum":true,"isleofman.museum":true,"jamison.museum":true,"jefferson.museum":true,"jerusalem.museum":true,"jewelry.museum":true,"jewish.museum":true,"jewishart.museum":true,"jfk.museum":true,"journalism.museum":true,"judaica.museum":true,"judygarland.museum":true,"juedisches.museum":true,"juif.museum":true,"karate.museum":true,"karikatur.museum":true,"kids.museum":true,"koebenhavn.museum":true,"koeln.museum":true,"kunst.museum":true,"kunstsammlung.museum":true,"kunstunddesign.museum":true,"labor.museum":true,"labour.museum":true,"lajolla.museum":true,"lancashire.museum":true,"landes.museum":true,"lans.museum":true,"xn--lns-qla.museum":true,"larsson.museum":true,"lewismiller.museum":true,"lincoln.museum":true,"linz.museum":true,"living.museum":true,"livinghistory.museum":true,"localhistory.museum":true,"london.museum":true,"losangeles.museum":true,"louvre.museum":true,"loyalist.museum":true,"lucerne.museum":true,"luxembourg.museum":true,"luzern.museum":true,"mad.museum":true,"madrid.museum":true,"mallorca.museum":true,"manchester.museum":true,"mansion.museum":true,"mansions.museum":true,"manx.museum":true,"marburg.museum":true,"maritime.museum":true,"maritimo.museum":true,"maryland.museum":true,"marylhurst.museum":true,"media.museum":true,"medical.museum":true,"medizinhistorisches.museum":true,"meeres.museum":true,"memorial.museum":true,"mesaverde.museum":true,"michigan.museum":true,"midatlantic.museum":true,"military.museum":true,"mill.museum":true,"miners.museum":true,"mining.museum":true,"minnesota.museum":true,"missile.museum":true,"missoula.museum":true,"modern.museum":true,"moma.museum":true,"money.museum":true,"monmouth.museum":true,"monticello.museum":true,"montreal.museum":true,"moscow.museum":true,"motorcycle.museum":true,"muenchen.museum":true,"muenster.museum":true,"mulhouse.museum":true,"muncie.museum":true,"museet.museum":true,"museumcenter.museum":true,"museumvereniging.museum":true,"music.museum":true,"national.museum":true,"nationalfirearms.museum":true,"nationalheritage.museum":true,"nativeamerican.museum":true,"naturalhistory.museum":true,"naturalhistorymuseum.museum":true,"naturalsciences.museum":true,"nature.museum":true,"naturhistorisches.museum":true,"natuurwetenschappen.museum":true,"naumburg.museum":true,"naval.museum":true,"nebraska.museum":true,"neues.museum":true,"newhampshire.museum":true,"newjersey.museum":true,"newmexico.museum":true,"newport.museum":true,"newspaper.museum":true,"newyork.museum":true,"niepce.museum":true,"norfolk.museum":true,"north.museum":true,"nrw.museum":true,"nuernberg.museum":true,"nuremberg.museum":true,"nyc.museum":true,"nyny.museum":true,"oceanographic.museum":true,"oceanographique.museum":true,"omaha.museum":true,"online.museum":true,"ontario.museum":true,"openair.museum":true,"oregon.museum":true,"oregontrail.museum":true,"otago.museum":true,"oxford.museum":true,"pacific.museum":true,"paderborn.museum":true,"palace.museum":true,"paleo.museum":true,"palmsprings.museum":true,"panama.museum":true,"paris.museum":true,"pasadena.museum":true,"pharmacy.museum":true,"philadelphia.museum":true,"philadelphiaarea.museum":true,"philately.museum":true,"phoenix.museum":true,"photography.museum":true,"pilots.museum":true,"pittsburgh.museum":true,"planetarium.museum":true,"plantation.museum":true,"plants.museum":true,"plaza.museum":true,"portal.museum":true,"portland.museum":true,"portlligat.museum":true,"posts-and-telecommunications.museum":true,"preservation.museum":true,"presidio.museum":true,"press.museum":true,"project.museum":true,"public.museum":true,"pubol.museum":true,"quebec.museum":true,"railroad.museum":true,"railway.museum":true,"research.museum":true,"resistance.museum":true,"riodejaneiro.museum":true,"rochester.museum":true,"rockart.museum":true,"roma.museum":true,"russia.museum":true,"saintlouis.museum":true,"salem.museum":true,"salvadordali.museum":true,"salzburg.museum":true,"sandiego.museum":true,"sanfrancisco.museum":true,"santabarbara.museum":true,"santacruz.museum":true,"santafe.museum":true,"saskatchewan.museum":true,"satx.museum":true,"savannahga.museum":true,"schlesisches.museum":true,"schoenbrunn.museum":true,"schokoladen.museum":true,"school.museum":true,"schweiz.museum":true,"science.museum":true,"scienceandhistory.museum":true,"scienceandindustry.museum":true,"sciencecenter.museum":true,"sciencecenters.museum":true,"science-fiction.museum":true,"sciencehistory.museum":true,"sciences.museum":true,"sciencesnaturelles.museum":true,"scotland.museum":true,"seaport.museum":true,"settlement.museum":true,"settlers.museum":true,"shell.museum":true,"sherbrooke.museum":true,"sibenik.museum":true,"silk.museum":true,"ski.museum":true,"skole.museum":true,"society.museum":true,"sologne.museum":true,"soundandvision.museum":true,"southcarolina.museum":true,"southwest.museum":true,"space.museum":true,"spy.museum":true,"square.museum":true,"stadt.museum":true,"stalbans.museum":true,"starnberg.museum":true,"state.museum":true,"stateofdelaware.museum":true,"station.museum":true,"steam.museum":true,"steiermark.museum":true,"stjohn.museum":true,"stockholm.museum":true,"stpetersburg.museum":true,"stuttgart.museum":true,"suisse.museum":true,"surgeonshall.museum":true,"surrey.museum":true,"svizzera.museum":true,"sweden.museum":true,"sydney.museum":true,"tank.museum":true,"tcm.museum":true,"technology.museum":true,"telekommunikation.museum":true,"television.museum":true,"texas.museum":true,"textile.museum":true,"theater.museum":true,"time.museum":true,"timekeeping.museum":true,"topology.museum":true,"torino.museum":true,"touch.museum":true,"town.museum":true,"transport.museum":true,"tree.museum":true,"trolley.museum":true,"trust.museum":true,"trustee.museum":true,"uhren.museum":true,"ulm.museum":true,"undersea.museum":true,"university.museum":true,"usa.museum":true,"usantiques.museum":true,"usarts.museum":true,"uscountryestate.museum":true,"usculture.museum":true,"usdecorativearts.museum":true,"usgarden.museum":true,"ushistory.museum":true,"ushuaia.museum":true,"uslivinghistory.museum":true,"utah.museum":true,"uvic.museum":true,"valley.museum":true,"vantaa.museum":true,"versailles.museum":true,"viking.museum":true,"village.museum":true,"virginia.museum":true,"virtual.museum":true,"virtuel.museum":true,"vlaanderen.museum":true,"volkenkunde.museum":true,"wales.museum":true,"wallonie.museum":true,"war.museum":true,"washingtondc.museum":true,"watchandclock.museum":true,"watch-and-clock.museum":true,"western.museum":true,"westfalen.museum":true,"whaling.museum":true,"wildlife.museum":true,"williamsburg.museum":true,"windmill.museum":true,"workshop.museum":true,"york.museum":true,"yorkshire.museum":true,"yosemite.museum":true,"youth.museum":true,"zoological.museum":true,"zoology.museum":true,"xn--9dbhblg6di.museum":true,"xn--h1aegh.museum":true,"mv":true,"aero.mv":true,"biz.mv":true,"com.mv":true,"coop.mv":true,"edu.mv":true,"gov.mv":true,"info.mv":true,"int.mv":true,"mil.mv":true,"museum.mv":true,"name.mv":true,"net.mv":true,"org.mv":true,"pro.mv":true,"mw":true,"ac.mw":true,"biz.mw":true,"co.mw":true,"com.mw":true,"coop.mw":true,"edu.mw":true,"gov.mw":true,"int.mw":true,"museum.mw":true,"net.mw":true,"org.mw":true,"mx":true,"com.mx":true,"org.mx":true,"gob.mx":true,"edu.mx":true,"net.mx":true,"my":true,"com.my":true,"net.my":true,"org.my":true,"gov.my":true,"edu.my":true,"mil.my":true,"name.my":true,"*.mz":true,"teledata.mz":false,"na":true,"info.na":true,"pro.na":true,"name.na":true,"school.na":true,"or.na":true,"dr.na":true,"us.na":true,"mx.na":true,"ca.na":true,"in.na":true,"cc.na":true,"tv.na":true,"ws.na":true,"mobi.na":true,"co.na":true,"com.na":true,"org.na":true,"name":true,"nc":true,"asso.nc":true,"ne":true,"net":true,"nf":true,"com.nf":true,"net.nf":true,"per.nf":true,"rec.nf":true,"web.nf":true,"arts.nf":true,"firm.nf":true,"info.nf":true,"other.nf":true,"store.nf":true,"ng":true,"com.ng":true,"edu.ng":true,"name.ng":true,"net.ng":true,"org.ng":true,"sch.ng":true,"gov.ng":true,"mil.ng":true,"mobi.ng":true,"*.ni":true,"nl":true,"bv.nl":true,"no":true,"fhs.no":true,"vgs.no":true,"fylkesbibl.no":true,"folkebibl.no":true,"museum.no":true,"idrett.no":true,"priv.no":true,"mil.no":true,"stat.no":true,"dep.no":true,"kommune.no":true,"herad.no":true,"aa.no":true,"ah.no":true,"bu.no":true,"fm.no":true,"hl.no":true,"hm.no":true,"jan-mayen.no":true,"mr.no":true,"nl.no":true,"nt.no":true,"of.no":true,"ol.no":true,"oslo.no":true,"rl.no":true,"sf.no":true,"st.no":true,"svalbard.no":true,"tm.no":true,"tr.no":true,"va.no":true,"vf.no":true,"gs.aa.no":true,"gs.ah.no":true,"gs.bu.no":true,"gs.fm.no":true,"gs.hl.no":true,"gs.hm.no":true,"gs.jan-mayen.no":true,"gs.mr.no":true,"gs.nl.no":true,"gs.nt.no":true,"gs.of.no":true,"gs.ol.no":true,"gs.oslo.no":true,"gs.rl.no":true,"gs.sf.no":true,"gs.st.no":true,"gs.svalbard.no":true,"gs.tm.no":true,"gs.tr.no":true,"gs.va.no":true,"gs.vf.no":true,"akrehamn.no":true,"xn--krehamn-dxa.no":true,"algard.no":true,"xn--lgrd-poac.no":true,"arna.no":true,"brumunddal.no":true,"bryne.no":true,"bronnoysund.no":true,"xn--brnnysund-m8ac.no":true,"drobak.no":true,"xn--drbak-wua.no":true,"egersund.no":true,"fetsund.no":true,"floro.no":true,"xn--flor-jra.no":true,"fredrikstad.no":true,"hokksund.no":true,"honefoss.no":true,"xn--hnefoss-q1a.no":true,"jessheim.no":true,"jorpeland.no":true,"xn--jrpeland-54a.no":true,"kirkenes.no":true,"kopervik.no":true,"krokstadelva.no":true,"langevag.no":true,"xn--langevg-jxa.no":true,"leirvik.no":true,"mjondalen.no":true,"xn--mjndalen-64a.no":true,"mo-i-rana.no":true,"mosjoen.no":true,"xn--mosjen-eya.no":true,"nesoddtangen.no":true,"orkanger.no":true,"osoyro.no":true,"xn--osyro-wua.no":true,"raholt.no":true,"xn--rholt-mra.no":true,"sandnessjoen.no":true,"xn--sandnessjen-ogb.no":true,"skedsmokorset.no":true,"slattum.no":true,"spjelkavik.no":true,"stathelle.no":true,"stavern.no":true,"stjordalshalsen.no":true,"xn--stjrdalshalsen-sqb.no":true,"tananger.no":true,"tranby.no":true,"vossevangen.no":true,"afjord.no":true,"xn--fjord-lra.no":true,"agdenes.no":true,"al.no":true,"xn--l-1fa.no":true,"alesund.no":true,"xn--lesund-hua.no":true,"alstahaug.no":true,"alta.no":true,"xn--lt-liac.no":true,"alaheadju.no":true,"xn--laheadju-7ya.no":true,"alvdal.no":true,"amli.no":true,"xn--mli-tla.no":true,"amot.no":true,"xn--mot-tla.no":true,"andebu.no":true,"andoy.no":true,"xn--andy-ira.no":true,"andasuolo.no":true,"ardal.no":true,"xn--rdal-poa.no":true,"aremark.no":true,"arendal.no":true,"xn--s-1fa.no":true,"aseral.no":true,"xn--seral-lra.no":true,"asker.no":true,"askim.no":true,"askvoll.no":true,"askoy.no":true,"xn--asky-ira.no":true,"asnes.no":true,"xn--snes-poa.no":true,"audnedaln.no":true,"aukra.no":true,"aure.no":true,"aurland.no":true,"aurskog-holand.no":true,"xn--aurskog-hland-jnb.no":true,"austevoll.no":true,"austrheim.no":true,"averoy.no":true,"xn--avery-yua.no":true,"balestrand.no":true,"ballangen.no":true,"balat.no":true,"xn--blt-elab.no":true,"balsfjord.no":true,"bahccavuotna.no":true,"xn--bhccavuotna-k7a.no":true,"bamble.no":true,"bardu.no":true,"beardu.no":true,"beiarn.no":true,"bajddar.no":true,"xn--bjddar-pta.no":true,"baidar.no":true,"xn--bidr-5nac.no":true,"berg.no":true,"bergen.no":true,"berlevag.no":true,"xn--berlevg-jxa.no":true,"bearalvahki.no":true,"xn--bearalvhki-y4a.no":true,"bindal.no":true,"birkenes.no":true,"bjarkoy.no":true,"xn--bjarky-fya.no":true,"bjerkreim.no":true,"bjugn.no":true,"bodo.no":true,"xn--bod-2na.no":true,"badaddja.no":true,"xn--bdddj-mrabd.no":true,"budejju.no":true,"bokn.no":true,"bremanger.no":true,"bronnoy.no":true,"xn--brnny-wuac.no":true,"bygland.no":true,"bykle.no":true,"barum.no":true,"xn--brum-voa.no":true,"bo.telemark.no":true,"xn--b-5ga.telemark.no":true,"bo.nordland.no":true,"xn--b-5ga.nordland.no":true,"bievat.no":true,"xn--bievt-0qa.no":true,"bomlo.no":true,"xn--bmlo-gra.no":true,"batsfjord.no":true,"xn--btsfjord-9za.no":true,"bahcavuotna.no":true,"xn--bhcavuotna-s4a.no":true,"dovre.no":true,"drammen.no":true,"drangedal.no":true,"dyroy.no":true,"xn--dyry-ira.no":true,"donna.no":true,"xn--dnna-gra.no":true,"eid.no":true,"eidfjord.no":true,"eidsberg.no":true,"eidskog.no":true,"eidsvoll.no":true,"eigersund.no":true,"elverum.no":true,"enebakk.no":true,"engerdal.no":true,"etne.no":true,"etnedal.no":true,"evenes.no":true,"evenassi.no":true,"xn--eveni-0qa01ga.no":true,"evje-og-hornnes.no":true,"farsund.no":true,"fauske.no":true,"fuossko.no":true,"fuoisku.no":true,"fedje.no":true,"fet.no":true,"finnoy.no":true,"xn--finny-yua.no":true,"fitjar.no":true,"fjaler.no":true,"fjell.no":true,"flakstad.no":true,"flatanger.no":true,"flekkefjord.no":true,"flesberg.no":true,"flora.no":true,"fla.no":true,"xn--fl-zia.no":true,"folldal.no":true,"forsand.no":true,"fosnes.no":true,"frei.no":true,"frogn.no":true,"froland.no":true,"frosta.no":true,"frana.no":true,"xn--frna-woa.no":true,"froya.no":true,"xn--frya-hra.no":true,"fusa.no":true,"fyresdal.no":true,"forde.no":true,"xn--frde-gra.no":true,"gamvik.no":true,"gangaviika.no":true,"xn--ggaviika-8ya47h.no":true,"gaular.no":true,"gausdal.no":true,"gildeskal.no":true,"xn--gildeskl-g0a.no":true,"giske.no":true,"gjemnes.no":true,"gjerdrum.no":true,"gjerstad.no":true,"gjesdal.no":true,"gjovik.no":true,"xn--gjvik-wua.no":true,"gloppen.no":true,"gol.no":true,"gran.no":true,"grane.no":true,"granvin.no":true,"gratangen.no":true,"grimstad.no":true,"grong.no":true,"kraanghke.no":true,"xn--kranghke-b0a.no":true,"grue.no":true,"gulen.no":true,"hadsel.no":true,"halden.no":true,"halsa.no":true,"hamar.no":true,"hamaroy.no":true,"habmer.no":true,"xn--hbmer-xqa.no":true,"hapmir.no":true,"xn--hpmir-xqa.no":true,"hammerfest.no":true,"hammarfeasta.no":true,"xn--hmmrfeasta-s4ac.no":true,"haram.no":true,"hareid.no":true,"harstad.no":true,"hasvik.no":true,"aknoluokta.no":true,"xn--koluokta-7ya57h.no":true,"hattfjelldal.no":true,"aarborte.no":true,"haugesund.no":true,"hemne.no":true,"hemnes.no":true,"hemsedal.no":true,"heroy.more-og-romsdal.no":true,"xn--hery-ira.xn--mre-og-romsdal-qqb.no":true,"heroy.nordland.no":true,"xn--hery-ira.nordland.no":true,"hitra.no":true,"hjartdal.no":true,"hjelmeland.no":true,"hobol.no":true,"xn--hobl-ira.no":true,"hof.no":true,"hol.no":true,"hole.no":true,"holmestrand.no":true,"holtalen.no":true,"xn--holtlen-hxa.no":true,"hornindal.no":true,"horten.no":true,"hurdal.no":true,"hurum.no":true,"hvaler.no":true,"hyllestad.no":true,"hagebostad.no":true,"xn--hgebostad-g3a.no":true,"hoyanger.no":true,"xn--hyanger-q1a.no":true,"hoylandet.no":true,"xn--hylandet-54a.no":true,"ha.no":true,"xn--h-2fa.no":true,"ibestad.no":true,"inderoy.no":true,"xn--indery-fya.no":true,"iveland.no":true,"jevnaker.no":true,"jondal.no":true,"jolster.no":true,"xn--jlster-bya.no":true,"karasjok.no":true,"karasjohka.no":true,"xn--krjohka-hwab49j.no":true,"karlsoy.no":true,"galsa.no":true,"xn--gls-elac.no":true,"karmoy.no":true,"xn--karmy-yua.no":true,"kautokeino.no":true,"guovdageaidnu.no":true,"klepp.no":true,"klabu.no":true,"xn--klbu-woa.no":true,"kongsberg.no":true,"kongsvinger.no":true,"kragero.no":true,"xn--krager-gya.no":true,"kristiansand.no":true,"kristiansund.no":true,"krodsherad.no":true,"xn--krdsherad-m8a.no":true,"kvalsund.no":true,"rahkkeravju.no":true,"xn--rhkkervju-01af.no":true,"kvam.no":true,"kvinesdal.no":true,"kvinnherad.no":true,"kviteseid.no":true,"kvitsoy.no":true,"xn--kvitsy-fya.no":true,"kvafjord.no":true,"xn--kvfjord-nxa.no":true,"giehtavuoatna.no":true,"kvanangen.no":true,"xn--kvnangen-k0a.no":true,"navuotna.no":true,"xn--nvuotna-hwa.no":true,"kafjord.no":true,"xn--kfjord-iua.no":true,"gaivuotna.no":true,"xn--givuotna-8ya.no":true,"larvik.no":true,"lavangen.no":true,"lavagis.no":true,"loabat.no":true,"xn--loabt-0qa.no":true,"lebesby.no":true,"davvesiida.no":true,"leikanger.no":true,"leirfjord.no":true,"leka.no":true,"leksvik.no":true,"lenvik.no":true,"leangaviika.no":true,"xn--leagaviika-52b.no":true,"lesja.no":true,"levanger.no":true,"lier.no":true,"lierne.no":true,"lillehammer.no":true,"lillesand.no":true,"lindesnes.no":true,"lindas.no":true,"xn--linds-pra.no":true,"lom.no":true,"loppa.no":true,"lahppi.no":true,"xn--lhppi-xqa.no":true,"lund.no":true,"lunner.no":true,"luroy.no":true,"xn--lury-ira.no":true,"luster.no":true,"lyngdal.no":true,"lyngen.no":true,"ivgu.no":true,"lardal.no":true,"lerdal.no":true,"xn--lrdal-sra.no":true,"lodingen.no":true,"xn--ldingen-q1a.no":true,"lorenskog.no":true,"xn--lrenskog-54a.no":true,"loten.no":true,"xn--lten-gra.no":true,"malvik.no":true,"masoy.no":true,"xn--msy-ula0h.no":true,"muosat.no":true,"xn--muost-0qa.no":true,"mandal.no":true,"marker.no":true,"marnardal.no":true,"masfjorden.no":true,"meland.no":true,"meldal.no":true,"melhus.no":true,"meloy.no":true,"xn--mely-ira.no":true,"meraker.no":true,"xn--merker-kua.no":true,"moareke.no":true,"xn--moreke-jua.no":true,"midsund.no":true,"midtre-gauldal.no":true,"modalen.no":true,"modum.no":true,"molde.no":true,"moskenes.no":true,"moss.no":true,"mosvik.no":true,"malselv.no":true,"xn--mlselv-iua.no":true,"malatvuopmi.no":true,"xn--mlatvuopmi-s4a.no":true,"namdalseid.no":true,"aejrie.no":true,"namsos.no":true,"namsskogan.no":true,"naamesjevuemie.no":true,"xn--nmesjevuemie-tcba.no":true,"laakesvuemie.no":true,"nannestad.no":true,"narvik.no":true,"narviika.no":true,"naustdal.no":true,"nedre-eiker.no":true,"nes.akershus.no":true,"nes.buskerud.no":true,"nesna.no":true,"nesodden.no":true,"nesseby.no":true,"unjarga.no":true,"xn--unjrga-rta.no":true,"nesset.no":true,"nissedal.no":true,"nittedal.no":true,"nord-aurdal.no":true,"nord-fron.no":true,"nord-odal.no":true,"norddal.no":true,"nordkapp.no":true,"davvenjarga.no":true,"xn--davvenjrga-y4a.no":true,"nordre-land.no":true,"nordreisa.no":true,"raisa.no":true,"xn--risa-5na.no":true,"nore-og-uvdal.no":true,"notodden.no":true,"naroy.no":true,"xn--nry-yla5g.no":true,"notteroy.no":true,"xn--nttery-byae.no":true,"odda.no":true,"oksnes.no":true,"xn--ksnes-uua.no":true,"oppdal.no":true,"oppegard.no":true,"xn--oppegrd-ixa.no":true,"orkdal.no":true,"orland.no":true,"xn--rland-uua.no":true,"orskog.no":true,"xn--rskog-uua.no":true,"orsta.no":true,"xn--rsta-fra.no":true,"os.hedmark.no":true,"os.hordaland.no":true,"osen.no":true,"osteroy.no":true,"xn--ostery-fya.no":true,"ostre-toten.no":true,"xn--stre-toten-zcb.no":true,"overhalla.no":true,"ovre-eiker.no":true,"xn--vre-eiker-k8a.no":true,"oyer.no":true,"xn--yer-zna.no":true,"oygarden.no":true,"xn--ygarden-p1a.no":true,"oystre-slidre.no":true,"xn--ystre-slidre-ujb.no":true,"porsanger.no":true,"porsangu.no":true,"xn--porsgu-sta26f.no":true,"porsgrunn.no":true,"radoy.no":true,"xn--rady-ira.no":true,"rakkestad.no":true,"rana.no":true,"ruovat.no":true,"randaberg.no":true,"rauma.no":true,"rendalen.no":true,"rennebu.no":true,"rennesoy.no":true,"xn--rennesy-v1a.no":true,"rindal.no":true,"ringebu.no":true,"ringerike.no":true,"ringsaker.no":true,"rissa.no":true,"risor.no":true,"xn--risr-ira.no":true,"roan.no":true,"rollag.no":true,"rygge.no":true,"ralingen.no":true,"xn--rlingen-mxa.no":true,"rodoy.no":true,"xn--rdy-0nab.no":true,"romskog.no":true,"xn--rmskog-bya.no":true,"roros.no":true,"xn--rros-gra.no":true,"rost.no":true,"xn--rst-0na.no":true,"royken.no":true,"xn--ryken-vua.no":true,"royrvik.no":true,"xn--ryrvik-bya.no":true,"rade.no":true,"xn--rde-ula.no":true,"salangen.no":true,"siellak.no":true,"saltdal.no":true,"salat.no":true,"xn--slt-elab.no":true,"xn--slat-5na.no":true,"samnanger.no":true,"sande.more-og-romsdal.no":true,"sande.xn--mre-og-romsdal-qqb.no":true,"sande.vestfold.no":true,"sandefjord.no":true,"sandnes.no":true,"sandoy.no":true,"xn--sandy-yua.no":true,"sarpsborg.no":true,"sauda.no":true,"sauherad.no":true,"sel.no":true,"selbu.no":true,"selje.no":true,"seljord.no":true,"sigdal.no":true,"siljan.no":true,"sirdal.no":true,"skaun.no":true,"skedsmo.no":true,"ski.no":true,"skien.no":true,"skiptvet.no":true,"skjervoy.no":true,"xn--skjervy-v1a.no":true,"skierva.no":true,"xn--skierv-uta.no":true,"skjak.no":true,"xn--skjk-soa.no":true,"skodje.no":true,"skanland.no":true,"xn--sknland-fxa.no":true,"skanit.no":true,"xn--sknit-yqa.no":true,"smola.no":true,"xn--smla-hra.no":true,"snillfjord.no":true,"snasa.no":true,"xn--snsa-roa.no":true,"snoasa.no":true,"snaase.no":true,"xn--snase-nra.no":true,"sogndal.no":true,"sokndal.no":true,"sola.no":true,"solund.no":true,"songdalen.no":true,"sortland.no":true,"spydeberg.no":true,"stange.no":true,"stavanger.no":true,"steigen.no":true,"steinkjer.no":true,"stjordal.no":true,"xn--stjrdal-s1a.no":true,"stokke.no":true,"stor-elvdal.no":true,"stord.no":true,"stordal.no":true,"storfjord.no":true,"omasvuotna.no":true,"strand.no":true,"stranda.no":true,"stryn.no":true,"sula.no":true,"suldal.no":true,"sund.no":true,"sunndal.no":true,"surnadal.no":true,"sveio.no":true,"svelvik.no":true,"sykkylven.no":true,"sogne.no":true,"xn--sgne-gra.no":true,"somna.no":true,"xn--smna-gra.no":true,"sondre-land.no":true,"xn--sndre-land-0cb.no":true,"sor-aurdal.no":true,"xn--sr-aurdal-l8a.no":true,"sor-fron.no":true,"xn--sr-fron-q1a.no":true,"sor-odal.no":true,"xn--sr-odal-q1a.no":true,"sor-varanger.no":true,"xn--sr-varanger-ggb.no":true,"matta-varjjat.no":true,"xn--mtta-vrjjat-k7af.no":true,"sorfold.no":true,"xn--srfold-bya.no":true,"sorreisa.no":true,"xn--srreisa-q1a.no":true,"sorum.no":true,"xn--srum-gra.no":true,"tana.no":true,"deatnu.no":true,"time.no":true,"tingvoll.no":true,"tinn.no":true,"tjeldsund.no":true,"dielddanuorri.no":true,"tjome.no":true,"xn--tjme-hra.no":true,"tokke.no":true,"tolga.no":true,"torsken.no":true,"tranoy.no":true,"xn--trany-yua.no":true,"tromso.no":true,"xn--troms-zua.no":true,"tromsa.no":true,"romsa.no":true,"trondheim.no":true,"troandin.no":true,"trysil.no":true,"trana.no":true,"xn--trna-woa.no":true,"trogstad.no":true,"xn--trgstad-r1a.no":true,"tvedestrand.no":true,"tydal.no":true,"tynset.no":true,"tysfjord.no":true,"divtasvuodna.no":true,"divttasvuotna.no":true,"tysnes.no":true,"tysvar.no":true,"xn--tysvr-vra.no":true,"tonsberg.no":true,"xn--tnsberg-q1a.no":true,"ullensaker.no":true,"ullensvang.no":true,"ulvik.no":true,"utsira.no":true,"vadso.no":true,"xn--vads-jra.no":true,"cahcesuolo.no":true,"xn--hcesuolo-7ya35b.no":true,"vaksdal.no":true,"valle.no":true,"vang.no":true,"vanylven.no":true,"vardo.no":true,"xn--vard-jra.no":true,"varggat.no":true,"xn--vrggt-xqad.no":true,"vefsn.no":true,"vaapste.no":true,"vega.no":true,"vegarshei.no":true,"xn--vegrshei-c0a.no":true,"vennesla.no":true,"verdal.no":true,"verran.no":true,"vestby.no":true,"vestnes.no":true,"vestre-slidre.no":true,"vestre-toten.no":true,"vestvagoy.no":true,"xn--vestvgy-ixa6o.no":true,"vevelstad.no":true,"vik.no":true,"vikna.no":true,"vindafjord.no":true,"volda.no":true,"voss.no":true,"varoy.no":true,"xn--vry-yla5g.no":true,"vagan.no":true,"xn--vgan-qoa.no":true,"voagat.no":true,"vagsoy.no":true,"xn--vgsy-qoa0j.no":true,"vaga.no":true,"xn--vg-yiab.no":true,"valer.ostfold.no":true,"xn--vler-qoa.xn--stfold-9xa.no":true,"valer.hedmark.no":true,"xn--vler-qoa.hedmark.no":true,"*.np":true,"nr":true,"biz.nr":true,"info.nr":true,"gov.nr":true,"edu.nr":true,"org.nr":true,"net.nr":true,"com.nr":true,"nu":true,"nz":true,"ac.nz":true,"co.nz":true,"cri.nz":true,"geek.nz":true,"gen.nz":true,"govt.nz":true,"health.nz":true,"iwi.nz":true,"kiwi.nz":true,"maori.nz":true,"mil.nz":true,"xn--mori-qsa.nz":true,"net.nz":true,"org.nz":true,"parliament.nz":true,"school.nz":true,"om":true,"co.om":true,"com.om":true,"edu.om":true,"gov.om":true,"med.om":true,"museum.om":true,"net.om":true,"org.om":true,"pro.om":true,"org":true,"pa":true,"ac.pa":true,"gob.pa":true,"com.pa":true,"org.pa":true,"sld.pa":true,"edu.pa":true,"net.pa":true,"ing.pa":true,"abo.pa":true,"med.pa":true,"nom.pa":true,"pe":true,"edu.pe":true,"gob.pe":true,"nom.pe":true,"mil.pe":true,"org.pe":true,"com.pe":true,"net.pe":true,"pf":true,"com.pf":true,"org.pf":true,"edu.pf":true,"*.pg":true,"ph":true,"com.ph":true,"net.ph":true,"org.ph":true,"gov.ph":true,"edu.ph":true,"ngo.ph":true,"mil.ph":true,"i.ph":true,"pk":true,"com.pk":true,"net.pk":true,"edu.pk":true,"org.pk":true,"fam.pk":true,"biz.pk":true,"web.pk":true,"gov.pk":true,"gob.pk":true,"gok.pk":true,"gon.pk":true,"gop.pk":true,"gos.pk":true,"info.pk":true,"pl":true,"com.pl":true,"net.pl":true,"org.pl":true,"info.pl":true,"waw.pl":true,"gov.pl":true,"aid.pl":true,"agro.pl":true,"atm.pl":true,"auto.pl":true,"biz.pl":true,"edu.pl":true,"gmina.pl":true,"gsm.pl":true,"mail.pl":true,"miasta.pl":true,"media.pl":true,"mil.pl":true,"nieruchomosci.pl":true,"nom.pl":true,"pc.pl":true,"powiat.pl":true,"priv.pl":true,"realestate.pl":true,"rel.pl":true,"sex.pl":true,"shop.pl":true,"sklep.pl":true,"sos.pl":true,"szkola.pl":true,"targi.pl":true,"tm.pl":true,"tourism.pl":true,"travel.pl":true,"turystyka.pl":true,"uw.gov.pl":true,"um.gov.pl":true,"ug.gov.pl":true,"upow.gov.pl":true,"starostwo.gov.pl":true,"so.gov.pl":true,"sr.gov.pl":true,"po.gov.pl":true,"pa.gov.pl":true,"augustow.pl":true,"babia-gora.pl":true,"bedzin.pl":true,"beskidy.pl":true,"bialowieza.pl":true,"bialystok.pl":true,"bielawa.pl":true,"bieszczady.pl":true,"boleslawiec.pl":true,"bydgoszcz.pl":true,"bytom.pl":true,"cieszyn.pl":true,"czeladz.pl":true,"czest.pl":true,"dlugoleka.pl":true,"elblag.pl":true,"elk.pl":true,"glogow.pl":true,"gniezno.pl":true,"gorlice.pl":true,"grajewo.pl":true,"ilawa.pl":true,"jaworzno.pl":true,"jelenia-gora.pl":true,"jgora.pl":true,"kalisz.pl":true,"kazimierz-dolny.pl":true,"karpacz.pl":true,"kartuzy.pl":true,"kaszuby.pl":true,"katowice.pl":true,"kepno.pl":true,"ketrzyn.pl":true,"klodzko.pl":true,"kobierzyce.pl":true,"kolobrzeg.pl":true,"konin.pl":true,"konskowola.pl":true,"kutno.pl":true,"lapy.pl":true,"lebork.pl":true,"legnica.pl":true,"lezajsk.pl":true,"limanowa.pl":true,"lomza.pl":true,"lowicz.pl":true,"lubin.pl":true,"lukow.pl":true,"malbork.pl":true,"malopolska.pl":true,"mazowsze.pl":true,"mazury.pl":true,"mielec.pl":true,"mielno.pl":true,"mragowo.pl":true,"naklo.pl":true,"nowaruda.pl":true,"nysa.pl":true,"olawa.pl":true,"olecko.pl":true,"olkusz.pl":true,"olsztyn.pl":true,"opoczno.pl":true,"opole.pl":true,"ostroda.pl":true,"ostroleka.pl":true,"ostrowiec.pl":true,"ostrowwlkp.pl":true,"pila.pl":true,"pisz.pl":true,"podhale.pl":true,"podlasie.pl":true,"polkowice.pl":true,"pomorze.pl":true,"pomorskie.pl":true,"prochowice.pl":true,"pruszkow.pl":true,"przeworsk.pl":true,"pulawy.pl":true,"radom.pl":true,"rawa-maz.pl":true,"rybnik.pl":true,"rzeszow.pl":true,"sanok.pl":true,"sejny.pl":true,"slask.pl":true,"slupsk.pl":true,"sosnowiec.pl":true,"stalowa-wola.pl":true,"skoczow.pl":true,"starachowice.pl":true,"stargard.pl":true,"suwalki.pl":true,"swidnica.pl":true,"swiebodzin.pl":true,"swinoujscie.pl":true,"szczecin.pl":true,"szczytno.pl":true,"tarnobrzeg.pl":true,"tgory.pl":true,"turek.pl":true,"tychy.pl":true,"ustka.pl":true,"walbrzych.pl":true,"warmia.pl":true,"warszawa.pl":true,"wegrow.pl":true,"wielun.pl":true,"wlocl.pl":true,"wloclawek.pl":true,"wodzislaw.pl":true,"wolomin.pl":true,"wroclaw.pl":true,"zachpomor.pl":true,"zagan.pl":true,"zarow.pl":true,"zgora.pl":true,"zgorzelec.pl":true,"pm":true,"pn":true,"gov.pn":true,"co.pn":true,"org.pn":true,"edu.pn":true,"net.pn":true,"post":true,"pr":true,"com.pr":true,"net.pr":true,"org.pr":true,"gov.pr":true,"edu.pr":true,"isla.pr":true,"pro.pr":true,"biz.pr":true,"info.pr":true,"name.pr":true,"est.pr":true,"prof.pr":true,"ac.pr":true,"pro":true,"aca.pro":true,"bar.pro":true,"cpa.pro":true,"jur.pro":true,"law.pro":true,"med.pro":true,"eng.pro":true,"ps":true,"edu.ps":true,"gov.ps":true,"sec.ps":true,"plo.ps":true,"com.ps":true,"org.ps":true,"net.ps":true,"pt":true,"net.pt":true,"gov.pt":true,"org.pt":true,"edu.pt":true,"int.pt":true,"publ.pt":true,"com.pt":true,"nome.pt":true,"pw":true,"co.pw":true,"ne.pw":true,"or.pw":true,"ed.pw":true,"go.pw":true,"belau.pw":true,"py":true,"com.py":true,"coop.py":true,"edu.py":true,"gov.py":true,"mil.py":true,"net.py":true,"org.py":true,"qa":true,"com.qa":true,"edu.qa":true,"gov.qa":true,"mil.qa":true,"name.qa":true,"net.qa":true,"org.qa":true,"sch.qa":true,"re":true,"com.re":true,"asso.re":true,"nom.re":true,"ro":true,"com.ro":true,"org.ro":true,"tm.ro":true,"nt.ro":true,"nom.ro":true,"info.ro":true,"rec.ro":true,"arts.ro":true,"firm.ro":true,"store.ro":true,"www.ro":true,"rs":true,"co.rs":true,"org.rs":true,"edu.rs":true,"ac.rs":true,"gov.rs":true,"in.rs":true,"ru":true,"ac.ru":true,"com.ru":true,"edu.ru":true,"int.ru":true,"net.ru":true,"org.ru":true,"pp.ru":true,"adygeya.ru":true,"altai.ru":true,"amur.ru":true,"arkhangelsk.ru":true,"astrakhan.ru":true,"bashkiria.ru":true,"belgorod.ru":true,"bir.ru":true,"bryansk.ru":true,"buryatia.ru":true,"cbg.ru":true,"chel.ru":true,"chelyabinsk.ru":true,"chita.ru":true,"chukotka.ru":true,"chuvashia.ru":true,"dagestan.ru":true,"dudinka.ru":true,"e-burg.ru":true,"grozny.ru":true,"irkutsk.ru":true,"ivanovo.ru":true,"izhevsk.ru":true,"jar.ru":true,"joshkar-ola.ru":true,"kalmykia.ru":true,"kaluga.ru":true,"kamchatka.ru":true,"karelia.ru":true,"kazan.ru":true,"kchr.ru":true,"kemerovo.ru":true,"khabarovsk.ru":true,"khakassia.ru":true,"khv.ru":true,"kirov.ru":true,"koenig.ru":true,"komi.ru":true,"kostroma.ru":true,"krasnoyarsk.ru":true,"kuban.ru":true,"kurgan.ru":true,"kursk.ru":true,"lipetsk.ru":true,"magadan.ru":true,"mari.ru":true,"mari-el.ru":true,"marine.ru":true,"mordovia.ru":true,"msk.ru":true,"murmansk.ru":true,"nalchik.ru":true,"nnov.ru":true,"nov.ru":true,"novosibirsk.ru":true,"nsk.ru":true,"omsk.ru":true,"orenburg.ru":true,"oryol.ru":true,"palana.ru":true,"penza.ru":true,"perm.ru":true,"ptz.ru":true,"rnd.ru":true,"ryazan.ru":true,"sakhalin.ru":true,"samara.ru":true,"saratov.ru":true,"simbirsk.ru":true,"smolensk.ru":true,"spb.ru":true,"stavropol.ru":true,"stv.ru":true,"surgut.ru":true,"tambov.ru":true,"tatarstan.ru":true,"tom.ru":true,"tomsk.ru":true,"tsaritsyn.ru":true,"tsk.ru":true,"tula.ru":true,"tuva.ru":true,"tver.ru":true,"tyumen.ru":true,"udm.ru":true,"udmurtia.ru":true,"ulan-ude.ru":true,"vladikavkaz.ru":true,"vladimir.ru":true,"vladivostok.ru":true,"volgograd.ru":true,"vologda.ru":true,"voronezh.ru":true,"vrn.ru":true,"vyatka.ru":true,"yakutia.ru":true,"yamal.ru":true,"yaroslavl.ru":true,"yekaterinburg.ru":true,"yuzhno-sakhalinsk.ru":true,"amursk.ru":true,"baikal.ru":true,"cmw.ru":true,"fareast.ru":true,"jamal.ru":true,"kms.ru":true,"k-uralsk.ru":true,"kustanai.ru":true,"kuzbass.ru":true,"magnitka.ru":true,"mytis.ru":true,"nakhodka.ru":true,"nkz.ru":true,"norilsk.ru":true,"oskol.ru":true,"pyatigorsk.ru":true,"rubtsovsk.ru":true,"snz.ru":true,"syzran.ru":true,"vdonsk.ru":true,"zgrad.ru":true,"gov.ru":true,"mil.ru":true,"test.ru":true,"rw":true,"gov.rw":true,"net.rw":true,"edu.rw":true,"ac.rw":true,"com.rw":true,"co.rw":true,"int.rw":true,"mil.rw":true,"gouv.rw":true,"sa":true,"com.sa":true,"net.sa":true,"org.sa":true,"gov.sa":true,"med.sa":true,"pub.sa":true,"edu.sa":true,"sch.sa":true,"sb":true,"com.sb":true,"edu.sb":true,"gov.sb":true,"net.sb":true,"org.sb":true,"sc":true,"com.sc":true,"gov.sc":true,"net.sc":true,"org.sc":true,"edu.sc":true,"sd":true,"com.sd":true,"net.sd":true,"org.sd":true,"edu.sd":true,"med.sd":true,"tv.sd":true,"gov.sd":true,"info.sd":true,"se":true,"a.se":true,"ac.se":true,"b.se":true,"bd.se":true,"brand.se":true,"c.se":true,"d.se":true,"e.se":true,"f.se":true,"fh.se":true,"fhsk.se":true,"fhv.se":true,"g.se":true,"h.se":true,"i.se":true,"k.se":true,"komforb.se":true,"kommunalforbund.se":true,"komvux.se":true,"l.se":true,"lanbib.se":true,"m.se":true,"n.se":true,"naturbruksgymn.se":true,"o.se":true,"org.se":true,"p.se":true,"parti.se":true,"pp.se":true,"press.se":true,"r.se":true,"s.se":true,"t.se":true,"tm.se":true,"u.se":true,"w.se":true,"x.se":true,"y.se":true,"z.se":true,"sg":true,"com.sg":true,"net.sg":true,"org.sg":true,"gov.sg":true,"edu.sg":true,"per.sg":true,"sh":true,"com.sh":true,"net.sh":true,"gov.sh":true,"org.sh":true,"mil.sh":true,"si":true,"sj":true,"sk":true,"sl":true,"com.sl":true,"net.sl":true,"edu.sl":true,"gov.sl":true,"org.sl":true,"sm":true,"sn":true,"art.sn":true,"com.sn":true,"edu.sn":true,"gouv.sn":true,"org.sn":true,"perso.sn":true,"univ.sn":true,"so":true,"com.so":true,"net.so":true,"org.so":true,"sr":true,"st":true,"co.st":true,"com.st":true,"consulado.st":true,"edu.st":true,"embaixada.st":true,"gov.st":true,"mil.st":true,"net.st":true,"org.st":true,"principe.st":true,"saotome.st":true,"store.st":true,"su":true,"adygeya.su":true,"arkhangelsk.su":true,"balashov.su":true,"bashkiria.su":true,"bryansk.su":true,"dagestan.su":true,"grozny.su":true,"ivanovo.su":true,"kalmykia.su":true,"kaluga.su":true,"karelia.su":true,"khakassia.su":true,"krasnodar.su":true,"kurgan.su":true,"lenug.su":true,"mordovia.su":true,"msk.su":true,"murmansk.su":true,"nalchik.su":true,"nov.su":true,"obninsk.su":true,"penza.su":true,"pokrovsk.su":true,"sochi.su":true,"spb.su":true,"togliatti.su":true,"troitsk.su":true,"tula.su":true,"tuva.su":true,"vladikavkaz.su":true,"vladimir.su":true,"vologda.su":true,"sv":true,"com.sv":true,"edu.sv":true,"gob.sv":true,"org.sv":true,"red.sv":true,"sx":true,"gov.sx":true,"sy":true,"edu.sy":true,"gov.sy":true,"net.sy":true,"mil.sy":true,"com.sy":true,"org.sy":true,"sz":true,"co.sz":true,"ac.sz":true,"org.sz":true,"tc":true,"td":true,"tel":true,"tf":true,"tg":true,"th":true,"ac.th":true,"co.th":true,"go.th":true,"in.th":true,"mi.th":true,"net.th":true,"or.th":true,"tj":true,"ac.tj":true,"biz.tj":true,"co.tj":true,"com.tj":true,"edu.tj":true,"go.tj":true,"gov.tj":true,"int.tj":true,"mil.tj":true,"name.tj":true,"net.tj":true,"nic.tj":true,"org.tj":true,"test.tj":true,"web.tj":true,"tk":true,"tl":true,"gov.tl":true,"tm":true,"com.tm":true,"co.tm":true,"org.tm":true,"net.tm":true,"nom.tm":true,"gov.tm":true,"mil.tm":true,"edu.tm":true,"tn":true,"com.tn":true,"ens.tn":true,"fin.tn":true,"gov.tn":true,"ind.tn":true,"intl.tn":true,"nat.tn":true,"net.tn":true,"org.tn":true,"info.tn":true,"perso.tn":true,"tourism.tn":true,"edunet.tn":true,"rnrt.tn":true,"rns.tn":true,"rnu.tn":true,"mincom.tn":true,"agrinet.tn":true,"defense.tn":true,"turen.tn":true,"to":true,"com.to":true,"gov.to":true,"net.to":true,"org.to":true,"edu.to":true,"mil.to":true,"tp":true,"tr":true,"com.tr":true,"info.tr":true,"biz.tr":true,"net.tr":true,"org.tr":true,"web.tr":true,"gen.tr":true,"tv.tr":true,"av.tr":true,"dr.tr":true,"bbs.tr":true,"name.tr":true,"tel.tr":true,"gov.tr":true,"bel.tr":true,"pol.tr":true,"mil.tr":true,"k12.tr":true,"edu.tr":true,"kep.tr":true,"nc.tr":true,"gov.nc.tr":true,"travel":true,"tt":true,"co.tt":true,"com.tt":true,"org.tt":true,"net.tt":true,"biz.tt":true,"info.tt":true,"pro.tt":true,"int.tt":true,"coop.tt":true,"jobs.tt":true,"mobi.tt":true,"travel.tt":true,"museum.tt":true,"aero.tt":true,"name.tt":true,"gov.tt":true,"edu.tt":true,"tv":true,"tw":true,"edu.tw":true,"gov.tw":true,"mil.tw":true,"com.tw":true,"net.tw":true,"org.tw":true,"idv.tw":true,"game.tw":true,"ebiz.tw":true,"club.tw":true,"xn--zf0ao64a.tw":true,"xn--uc0atv.tw":true,"xn--czrw28b.tw":true,"tz":true,"ac.tz":true,"co.tz":true,"go.tz":true,"hotel.tz":true,"info.tz":true,"me.tz":true,"mil.tz":true,"mobi.tz":true,"ne.tz":true,"or.tz":true,"sc.tz":true,"tv.tz":true,"ua":true,"com.ua":true,"edu.ua":true,"gov.ua":true,"in.ua":true,"net.ua":true,"org.ua":true,"cherkassy.ua":true,"cherkasy.ua":true,"chernigov.ua":true,"chernihiv.ua":true,"chernivtsi.ua":true,"chernovtsy.ua":true,"ck.ua":true,"cn.ua":true,"cr.ua":true,"crimea.ua":true,"cv.ua":true,"dn.ua":true,"dnepropetrovsk.ua":true,"dnipropetrovsk.ua":true,"dominic.ua":true,"donetsk.ua":true,"dp.ua":true,"if.ua":true,"ivano-frankivsk.ua":true,"kh.ua":true,"kharkiv.ua":true,"kharkov.ua":true,"kherson.ua":true,"khmelnitskiy.ua":true,"khmelnytskyi.ua":true,"kiev.ua":true,"kirovograd.ua":true,"km.ua":true,"kr.ua":true,"krym.ua":true,"ks.ua":true,"kv.ua":true,"kyiv.ua":true,"lg.ua":true,"lt.ua":true,"lugansk.ua":true,"lutsk.ua":true,"lv.ua":true,"lviv.ua":true,"mk.ua":true,"mykolaiv.ua":true,"nikolaev.ua":true,"od.ua":true,"odesa.ua":true,"odessa.ua":true,"pl.ua":true,"poltava.ua":true,"rivne.ua":true,"rovno.ua":true,"rv.ua":true,"sb.ua":true,"sebastopol.ua":true,"sevastopol.ua":true,"sm.ua":true,"sumy.ua":true,"te.ua":true,"ternopil.ua":true,"uz.ua":true,"uzhgorod.ua":true,"vinnica.ua":true,"vinnytsia.ua":true,"vn.ua":true,"volyn.ua":true,"yalta.ua":true,"zaporizhzhe.ua":true,"zaporizhzhia.ua":true,"zhitomir.ua":true,"zhytomyr.ua":true,"zp.ua":true,"zt.ua":true,"co.ua":true,"pp.ua":true,"ug":true,"co.ug":true,"or.ug":true,"ac.ug":true,"sc.ug":true,"go.ug":true,"ne.ug":true,"com.ug":true,"org.ug":true,"uk":true,"ac.uk":true,"co.uk":true,"gov.uk":true,"ltd.uk":true,"me.uk":true,"net.uk":true,"nhs.uk":true,"org.uk":true,"plc.uk":true,"police.uk":true,"*.sch.uk":true,"us":true,"dni.us":true,"fed.us":true,"isa.us":true,"kids.us":true,"nsn.us":true,"ak.us":true,"al.us":true,"ar.us":true,"as.us":true,"az.us":true,"ca.us":true,"co.us":true,"ct.us":true,"dc.us":true,"de.us":true,"fl.us":true,"ga.us":true,"gu.us":true,"hi.us":true,"ia.us":true,"id.us":true,"il.us":true,"in.us":true,"ks.us":true,"ky.us":true,"la.us":true,"ma.us":true,"md.us":true,"me.us":true,"mi.us":true,"mn.us":true,"mo.us":true,"ms.us":true,"mt.us":true,"nc.us":true,"nd.us":true,"ne.us":true,"nh.us":true,"nj.us":true,"nm.us":true,"nv.us":true,"ny.us":true,"oh.us":true,"ok.us":true,"or.us":true,"pa.us":true,"pr.us":true,"ri.us":true,"sc.us":true,"sd.us":true,"tn.us":true,"tx.us":true,"ut.us":true,"vi.us":true,"vt.us":true,"va.us":true,"wa.us":true,"wi.us":true,"wv.us":true,"wy.us":true,"k12.ak.us":true,"k12.al.us":true,"k12.ar.us":true,"k12.as.us":true,"k12.az.us":true,"k12.ca.us":true,"k12.co.us":true,"k12.ct.us":true,"k12.dc.us":true,"k12.de.us":true,"k12.fl.us":true,"k12.ga.us":true,"k12.gu.us":true,"k12.ia.us":true,"k12.id.us":true,"k12.il.us":true,"k12.in.us":true,"k12.ks.us":true,"k12.ky.us":true,"k12.la.us":true,"k12.ma.us":true,"k12.md.us":true,"k12.me.us":true,"k12.mi.us":true,"k12.mn.us":true,"k12.mo.us":true,"k12.ms.us":true,"k12.mt.us":true,"k12.nc.us":true,"k12.ne.us":true,"k12.nh.us":true,"k12.nj.us":true,"k12.nm.us":true,"k12.nv.us":true,"k12.ny.us":true,"k12.oh.us":true,"k12.ok.us":true,"k12.or.us":true,"k12.pa.us":true,"k12.pr.us":true,"k12.ri.us":true,"k12.sc.us":true,"k12.tn.us":true,"k12.tx.us":true,"k12.ut.us":true,"k12.vi.us":true,"k12.vt.us":true,"k12.va.us":true,"k12.wa.us":true,"k12.wi.us":true,"k12.wy.us":true,"cc.ak.us":true,"cc.al.us":true,"cc.ar.us":true,"cc.as.us":true,"cc.az.us":true,"cc.ca.us":true,"cc.co.us":true,"cc.ct.us":true,"cc.dc.us":true,"cc.de.us":true,"cc.fl.us":true,"cc.ga.us":true,"cc.gu.us":true,"cc.hi.us":true,"cc.ia.us":true,"cc.id.us":true,"cc.il.us":true,"cc.in.us":true,"cc.ks.us":true,"cc.ky.us":true,"cc.la.us":true,"cc.ma.us":true,"cc.md.us":true,"cc.me.us":true,"cc.mi.us":true,"cc.mn.us":true,"cc.mo.us":true,"cc.ms.us":true,"cc.mt.us":true,"cc.nc.us":true,"cc.nd.us":true,"cc.ne.us":true,"cc.nh.us":true,"cc.nj.us":true,"cc.nm.us":true,"cc.nv.us":true,"cc.ny.us":true,"cc.oh.us":true,"cc.ok.us":true,"cc.or.us":true,"cc.pa.us":true,"cc.pr.us":true,"cc.ri.us":true,"cc.sc.us":true,"cc.sd.us":true,"cc.tn.us":true,"cc.tx.us":true,"cc.ut.us":true,"cc.vi.us":true,"cc.vt.us":true,"cc.va.us":true,"cc.wa.us":true,"cc.wi.us":true,"cc.wv.us":true,"cc.wy.us":true,"lib.ak.us":true,"lib.al.us":true,"lib.ar.us":true,"lib.as.us":true,"lib.az.us":true,"lib.ca.us":true,"lib.co.us":true,"lib.ct.us":true,"lib.dc.us":true,"lib.de.us":true,"lib.fl.us":true,"lib.ga.us":true,"lib.gu.us":true,"lib.hi.us":true,"lib.ia.us":true,"lib.id.us":true,"lib.il.us":true,"lib.in.us":true,"lib.ks.us":true,"lib.ky.us":true,"lib.la.us":true,"lib.ma.us":true,"lib.md.us":true,"lib.me.us":true,"lib.mi.us":true,"lib.mn.us":true,"lib.mo.us":true,"lib.ms.us":true,"lib.mt.us":true,"lib.nc.us":true,"lib.nd.us":true,"lib.ne.us":true,"lib.nh.us":true,"lib.nj.us":true,"lib.nm.us":true,"lib.nv.us":true,"lib.ny.us":true,"lib.oh.us":true,"lib.ok.us":true,"lib.or.us":true,"lib.pa.us":true,"lib.pr.us":true,"lib.ri.us":true,"lib.sc.us":true,"lib.sd.us":true,"lib.tn.us":true,"lib.tx.us":true,"lib.ut.us":true,"lib.vi.us":true,"lib.vt.us":true,"lib.va.us":true,"lib.wa.us":true,"lib.wi.us":true,"lib.wy.us":true,"pvt.k12.ma.us":true,"chtr.k12.ma.us":true,"paroch.k12.ma.us":true,"uy":true,"com.uy":true,"edu.uy":true,"gub.uy":true,"mil.uy":true,"net.uy":true,"org.uy":true,"uz":true,"co.uz":true,"com.uz":true,"net.uz":true,"org.uz":true,"va":true,"vc":true,"com.vc":true,"net.vc":true,"org.vc":true,"gov.vc":true,"mil.vc":true,"edu.vc":true,"ve":true,"arts.ve":true,"co.ve":true,"com.ve":true,"e12.ve":true,"edu.ve":true,"firm.ve":true,"gob.ve":true,"gov.ve":true,"info.ve":true,"int.ve":true,"mil.ve":true,"net.ve":true,"org.ve":true,"rec.ve":true,"store.ve":true,"tec.ve":true,"web.ve":true,"vg":true,"vi":true,"co.vi":true,"com.vi":true,"k12.vi":true,"net.vi":true,"org.vi":true,"vn":true,"com.vn":true,"net.vn":true,"org.vn":true,"edu.vn":true,"gov.vn":true,"int.vn":true,"ac.vn":true,"biz.vn":true,"info.vn":true,"name.vn":true,"pro.vn":true,"health.vn":true,"vu":true,"com.vu":true,"edu.vu":true,"net.vu":true,"org.vu":true,"wf":true,"ws":true,"com.ws":true,"net.ws":true,"org.ws":true,"gov.ws":true,"edu.ws":true,"yt":true,"xn--mgbaam7a8h":true,"xn--54b7fta0cc":true,"xn--fiqs8s":true,"xn--fiqz9s":true,"xn--lgbbat1ad8j":true,"xn--wgbh1c":true,"xn--node":true,"xn--j6w193g":true,"xn--h2brj9c":true,"xn--mgbbh1a71e":true,"xn--fpcrj9c3d":true,"xn--gecrj9c":true,"xn--s9brj9c":true,"xn--45brj9c":true,"xn--xkc2dl3a5ee0h":true,"xn--mgba3a4f16a":true,"xn--mgba3a4fra":true,"xn--mgbayh7gpa":true,"xn--3e0b707e":true,"xn--80ao21a":true,"xn--fzc2c9e2c":true,"xn--xkc2al3hye2a":true,"xn--mgbc0a9azcg":true,"xn--l1acc":true,"xn--mgbx4cd0ab":true,"xn--mgb9awbf":true,"xn--ygbi2ammx":true,"xn--90a3ac":true,"xn--o1ac.xn--90a3ac":true,"xn--c1avg.xn--90a3ac":true,"xn--90azh.xn--90a3ac":true,"xn--d1at.xn--90a3ac":true,"xn--o1ach.xn--90a3ac":true,"xn--80au.xn--90a3ac":true,"xn--p1ai":true,"xn--wgbl6a":true,"xn--mgberp4a5d4ar":true,"xn--mgberp4a5d4a87g":true,"xn--mgbqly7c0a67fbc":true,"xn--mgbqly7cvafr":true,"xn--ogbpf8fl":true,"xn--mgbtf8fl":true,"xn--yfro4i67o":true,"xn--clchc0ea0b2g2a9gcd":true,"xn--o3cw4h":true,"xn--pgbs0dh":true,"xn--kpry57d":true,"xn--kprw13d":true,"xn--nnx388a":true,"xn--j1amh":true,"xn--mgb2ddes":true,"xxx":true,"*.ye":true,"*.za":true,"*.zm":true,"*.zw":true,"aaa":true,"abb":true,"abbott":true,"abogado":true,"academy":true,"accenture":true,"accountant":true,"accountants":true,"aco":true,"active":true,"actor":true,"ads":true,"adult":true,"aeg":true,"afl":true,"africa":true,"africamagic":true,"agency":true,"aig":true,"airforce":true,"airtel":true,"alibaba":true,"alipay":true,"allfinanz":true,"alsace":true,"amsterdam":true,"analytics":true,"android":true,"anquan":true,"apartments":true,"aquarelle":true,"aramco":true,"archi":true,"army":true,"arte":true,"associates":true,"attorney":true,"auction":true,"audio":true,"author":true,"auto":true,"autos":true,"avianca":true,"axa":true,"azure":true,"baidu":true,"band":true,"bank":true,"bar":true,"barcelona":true,"barclaycard":true,"barclays":true,"bargains":true,"bauhaus":true,"bayern":true,"bbc":true,"bbva":true,"bcg":true,"bcn":true,"beer":true,"bentley":true,"berlin":true,"best":true,"bharti":true,"bible":true,"bid":true,"bike":true,"bing":true,"bingo":true,"bio":true,"black":true,"blackfriday":true,"bloomberg":true,"blue":true,"bms":true,"bmw":true,"bnl":true,"bnpparibas":true,"boats":true,"bom":true,"bond":true,"boo":true,"boots":true,"bot":true,"boutique":true,"bradesco":true,"bridgestone":true,"broadway":true,"broker":true,"brother":true,"brussels":true,"budapest":true,"build":true,"builders":true,"business":true,"buy":true,"buzz":true,"bzh":true,"cab":true,"cafe":true,"cal":true,"call":true,"camera":true,"camp":true,"cancerresearch":true,"canon":true,"capetown":true,"capital":true,"car":true,"caravan":true,"cards":true,"care":true,"career":true,"careers":true,"cars":true,"cartier":true,"casa":true,"cash":true,"casino":true,"catering":true,"cba":true,"cbn":true,"center":true,"ceo":true,"cern":true,"cfa":true,"cfd":true,"channel":true,"chat":true,"cheap":true,"chloe":true,"christmas":true,"chrome":true,"church":true,"cipriani":true,"circle":true,"cisco":true,"citic":true,"city":true,"cityeats":true,"claims":true,"cleaning":true,"click":true,"clinic":true,"clothing":true,"club":true,"coach":true,"codes":true,"coffee":true,"college":true,"cologne":true,"commbank":true,"community":true,"company":true,"computer":true,"comsec":true,"condos":true,"construction":true,"consulting":true,"contact":true,"contractors":true,"cooking":true,"cool":true,"corsica":true,"country":true,"coupon":true,"coupons":true,"courses":true,"credit":true,"creditcard":true,"creditunion":true,"cricket":true,"crown":true,"crs":true,"cruises":true,"csc":true,"cuisinella":true,"cymru":true,"cyou":true,"dabur":true,"dad":true,"dance":true,"date":true,"dating":true,"datsun":true,"day":true,"dclk":true,"dealer":true,"deals":true,"degree":true,"delivery":true,"dell":true,"delta":true,"democrat":true,"dental":true,"dentist":true,"desi":true,"design":true,"dev":true,"diamonds":true,"diet":true,"digital":true,"direct":true,"directory":true,"discount":true,"dnp":true,"docs":true,"dog":true,"doha":true,"domains":true,"doosan":true,"download":true,"drive":true,"dstv":true,"dubai":true,"durban":true,"dvag":true,"earth":true,"eat":true,"edeka":true,"education":true,"email":true,"emerck":true,"energy":true,"engineer":true,"engineering":true,"enterprises":true,"epson":true,"equipment":true,"erni":true,"esq":true,"estate":true,"eurovision":true,"eus":true,"events":true,"everbank":true,"exchange":true,"expert":true,"exposed":true,"express":true,"fage":true,"fail":true,"fairwinds":true,"faith":true,"family":true,"fan":true,"fans":true,"farm":true,"fashion":true,"fast":true,"feedback":true,"ferrero":true,"film":true,"final":true,"finance":true,"financial":true,"firestone":true,"firmdale":true,"fish":true,"fishing":true,"fit":true,"fitness":true,"flickr":true,"flights":true,"florist":true,"flowers":true,"flsmidth":true,"fly":true,"foo":true,"football":true,"ford":true,"forex":true,"forsale":true,"forum":true,"foundation":true,"frl":true,"frogans":true,"frontier":true,"fund":true,"furniture":true,"futbol":true,"fyi":true,"gal":true,"gallery":true,"gallup":true,"garden":true,"gbiz":true,"gdn":true,"gea":true,"gent":true,"genting":true,"ggee":true,"gift":true,"gifts":true,"gives":true,"giving":true,"glass":true,"gle":true,"global":true,"globo":true,"gmail":true,"gmo":true,"gmx":true,"gold":true,"goldpoint":true,"golf":true,"goo":true,"goog":true,"google":true,"gop":true,"got":true,"gotv":true,"graphics":true,"gratis":true,"green":true,"gripe":true,"group":true,"gucci":true,"guge":true,"guide":true,"guitars":true,"guru":true,"hamburg":true,"hangout":true,"haus":true,"hdfcbank":true,"health":true,"healthcare":true,"help":true,"helsinki":true,"here":true,"hermes":true,"hiphop":true,"hitachi":true,"hiv":true,"hockey":true,"holdings":true,"holiday":true,"homedepot":true,"homes":true,"honda":true,"horse":true,"host":true,"hosting":true,"hoteles":true,"hotmail":true,"house":true,"how":true,"hsbc":true,"htc":true,"ibm":true,"icbc":true,"ice":true,"icu":true,"ifm":true,"iinet":true,"immo":true,"immobilien":true,"industries":true,"infiniti":true,"ing":true,"ink":true,"institute":true,"insurance":true,"insure":true,"international":true,"investments":true,"ipiranga":true,"irish":true,"iselect":true,"ist":true,"istanbul":true,"itau":true,"iwc":true,"jaguar":true,"java":true,"jcb":true,"jetzt":true,"jewelry":true,"jio":true,"jlc":true,"jll":true,"jmp":true,"joburg":true,"jot":true,"joy":true,"jprs":true,"juegos":true,"kaufen":true,"kddi":true,"kfh":true,"kim":true,"kinder":true,"kitchen":true,"kiwi":true,"koeln":true,"komatsu":true,"kpn":true,"krd":true,"kred":true,"kyknet":true,"kyoto":true,"lacaixa":true,"lancaster":true,"land":true,"landrover":true,"lasalle":true,"lat":true,"latrobe":true,"law":true,"lawyer":true,"lds":true,"lease":true,"leclerc":true,"legal":true,"lgbt":true,"liaison":true,"lidl":true,"life":true,"lifeinsurance":true,"lifestyle":true,"lighting":true,"like":true,"limited":true,"limo":true,"lincoln":true,"linde":true,"link":true,"live":true,"lixil":true,"loan":true,"loans":true,"lol":true,"london":true,"lotte":true,"lotto":true,"love":true,"ltd":true,"ltda":true,"lupin":true,"luxe":true,"luxury":true,"madrid":true,"maif":true,"maison":true,"makeup":true,"man":true,"management":true,"mango":true,"market":true,"marketing":true,"markets":true,"marriott":true,"mba":true,"media":true,"meet":true,"melbourne":true,"meme":true,"memorial":true,"men":true,"menu":true,"meo":true,"miami":true,"microsoft":true,"mini":true,"mma":true,"mnet":true,"mobily":true,"moda":true,"moe":true,"moi":true,"monash":true,"money":true,"montblanc":true,"mormon":true,"mortgage":true,"moscow":true,"motorcycles":true,"mov":true,"movie":true,"movistar":true,"mtn":true,"mtpc":true,"mtr":true,"multichoice":true,"mutual":true,"mzansimagic":true,"nadex":true,"nagoya":true,"naspers":true,"natura":true,"navy":true,"nec":true,"netbank":true,"network":true,"neustar":true,"new":true,"news":true,"nexus":true,"ngo":true,"nhk":true,"nico":true,"ninja":true,"nissan":true,"nokia":true,"norton":true,"nowruz":true,"nra":true,"nrw":true,"ntt":true,"nyc":true,"obi":true,"office":true,"okinawa":true,"omega":true,"one":true,"ong":true,"onl":true,"online":true,"ooo":true,"oracle":true,"orange":true,"organic":true,"orientexpress":true,"osaka":true,"otsuka":true,"ovh":true,"page":true,"pamperedchef":true,"panerai":true,"paris":true,"pars":true,"partners":true,"parts":true,"party":true,"passagens":true,"payu":true,"pharmacy":true,"philips":true,"photo":true,"photography":true,"photos":true,"physio":true,"piaget":true,"pics":true,"pictet":true,"pictures":true,"pid":true,"pin":true,"pink":true,"pizza":true,"place":true,"play":true,"plumbing":true,"plus":true,"pohl":true,"poker":true,"porn":true,"praxi":true,"press":true,"prod":true,"productions":true,"prof":true,"promo":true,"properties":true,"property":true,"pub":true,"qpon":true,"quebec":true,"quest":true,"racing":true,"read":true,"realtor":true,"realty":true,"recipes":true,"red":true,"redstone":true,"redumbrella":true,"rehab":true,"reise":true,"reisen":true,"reit":true,"reliance":true,"ren":true,"rent":true,"rentals":true,"repair":true,"report":true,"republican":true,"rest":true,"restaurant":true,"review":true,"reviews":true,"rich":true,"ricoh":true,"ril":true,"rio":true,"rip":true,"rocher":true,"rocks":true,"rodeo":true,"room":true,"rsvp":true,"ruhr":true,"run":true,"rwe":true,"ryukyu":true,"saarland":true,"safe":true,"safety":true,"sakura":true,"sale":true,"salon":true,"samsung":true,"sandvik":true,"sandvikcoromant":true,"sanofi":true,"sap":true,"sapo":true,"sarl":true,"sas":true,"saxo":true,"sbi":true,"sbs":true,"sca":true,"scb":true,"schmidt":true,"scholarships":true,"school":true,"schule":true,"schwarz":true,"science":true,"scor":true,"scot":true,"seat":true,"seek":true,"sener":true,"services":true,"sew":true,"sex":true,"sexy":true,"sharp":true,"shia":true,"shiksha":true,"shoes":true,"shouji":true,"show":true,"shriram":true,"sina":true,"singles":true,"site":true,"skin":true,"sky":true,"skype":true,"smile":true,"sncf":true,"soccer":true,"social":true,"software":true,"sohu":true,"solar":true,"solutions":true,"song":true,"sony":true,"soy":true,"space":true,"spiegel":true,"spot":true,"spreadbetting":true,"stada":true,"star":true,"starhub":true,"statebank":true,"statoil":true,"stc":true,"stcgroup":true,"stockholm":true,"storage":true,"studio":true,"study":true,"style":true,"sucks":true,"supersport":true,"supplies":true,"supply":true,"support":true,"surf":true,"surgery":true,"suzuki":true,"swatch":true,"swiss":true,"sydney":true,"symantec":true,"systems":true,"tab":true,"taipei":true,"taobao":true,"tatamotors":true,"tatar":true,"tattoo":true,"tax":true,"taxi":true,"tci":true,"team":true,"tech":true,"technology":true,"telecity":true,"telefonica":true,"temasek":true,"tennis":true,"thd":true,"theater":true,"tickets":true,"tienda":true,"tiffany":true,"tips":true,"tires":true,"tirol":true,"tmall":true,"today":true,"tokyo":true,"tools":true,"top":true,"toray":true,"toshiba":true,"tours":true,"town":true,"toys":true,"trade":true,"trading":true,"training":true,"travelers":true,"travelersinsurance":true,"trust":true,"trv":true,"tui":true,"tunes":true,"tushu":true,"tvs":true,"ubs":true,"university":true,"uno":true,"uol":true,"vacations":true,"vana":true,"vegas":true,"ventures":true,"versicherung":true,"vet":true,"viajes":true,"video":true,"viking":true,"villas":true,"vip":true,"virgin":true,"vision":true,"vista":true,"vistaprint":true,"viva":true,"vlaanderen":true,"vodka":true,"vote":true,"voting":true,"voto":true,"voyage":true,"vuelos":true,"wales":true,"walter":true,"wang":true,"wanggou":true,"watch":true,"watches":true,"weather":true,"weatherchannel":true,"webcam":true,"website":true,"wed":true,"wedding":true,"weibo":true,"weir":true,"whoswho":true,"wien":true,"wiki":true,"williamhill":true,"win":true,"windows":true,"wme":true,"work":true,"works":true,"world":true,"wtc":true,"wtf":true,"xbox":true,"xerox":true,"xihuan":true,"xin":true,"xn--11b4c3d":true,"xn--1ck2e1b":true,"xn--1qqw23a":true,"xn--30rr7y":true,"xn--3bst00m":true,"xn--3ds443g":true,"xn--3pxu8k":true,"xn--42c2d9a":true,"xn--45q11c":true,"xn--4gbrim":true,"xn--55qw42g":true,"xn--55qx5d":true,"xn--5tzm5g":true,"xn--6frz82g":true,"xn--6qq986b3xl":true,"xn--80adxhks":true,"xn--80asehdb":true,"xn--80aswg":true,"xn--8y0a063a":true,"xn--9dbq2a":true,"xn--9et52u":true,"xn--9krt00a":true,"xn--b4w605ferd":true,"xn--bck1b9a5dre4c":true,"xn--c1avg":true,"xn--c2br7g":true,"xn--cck2b3b":true,"xn--cg4bki":true,"xn--czr694b":true,"xn--czrs0t":true,"xn--czru2d":true,"xn--d1acj3b":true,"xn--eckvdtc9d":true,"xn--efvy88h":true,"xn--estv75g":true,"xn--fhbei":true,"xn--fiq228c5hs":true,"xn--fiq64b":true,"xn--fjq720a":true,"xn--flw351e":true,"xn--g2xx48c":true,"xn--gckr3f0f":true,"xn--hxt814e":true,"xn--i1b6b1a6a2e":true,"xn--imr513n":true,"xn--io0a7i":true,"xn--j1aef":true,"xn--jlq61u9w7b":true,"xn--jvr189m":true,"xn--kcrx77d1x4a":true,"xn--kpu716f":true,"xn--kput3i":true,"xn--mgba3a3ejt":true,"xn--mgbab2bd":true,"xn--mgbb9fbpob":true,"xn--mgbt3dhd":true,"xn--mk1bu44c":true,"xn--mxtq1m":true,"xn--ngbc5azd":true,"xn--ngbe9e0a":true,"xn--nqv7f":true,"xn--nqv7fs00ema":true,"xn--nyqy26a":true,"xn--p1acf":true,"xn--pbt977c":true,"xn--pssy2u":true,"xn--q9jyb4c":true,"xn--qcka1pmc":true,"xn--rhqv96g":true,"xn--rovu88b":true,"xn--ses554g":true,"xn--t60b56a":true,"xn--tckwe":true,"xn--unup4y":true,"xn--vermgensberater-ctb":true,"xn--vermgensberatung-pwb":true,"xn--vhquv":true,"xn--vuq861b":true,"xn--xhq521b":true,"xn--zfr164b":true,"xyz":true,"yachts":true,"yahoo":true,"yamaxun":true,"yandex":true,"yodobashi":true,"yoga":true,"yokohama":true,"youtube":true,"yun":true,"zara":true,"zero":true,"zip":true,"zone":true,"zuerich":true,"cloudfront.net":true,"ap-northeast-1.compute.amazonaws.com":true,"ap-southeast-1.compute.amazonaws.com":true,"ap-southeast-2.compute.amazonaws.com":true,"cn-north-1.compute.amazonaws.cn":true,"compute.amazonaws.cn":true,"compute.amazonaws.com":true,"compute-1.amazonaws.com":true,"eu-west-1.compute.amazonaws.com":true,"eu-central-1.compute.amazonaws.com":true,"sa-east-1.compute.amazonaws.com":true,"us-east-1.amazonaws.com":true,"us-gov-west-1.compute.amazonaws.com":true,"us-west-1.compute.amazonaws.com":true,"us-west-2.compute.amazonaws.com":true,"z-1.compute-1.amazonaws.com":true,"z-2.compute-1.amazonaws.com":true,"elasticbeanstalk.com":true,"elb.amazonaws.com":true,"s3.amazonaws.com":true,"s3-us-west-2.amazonaws.com":true,"s3-us-west-1.amazonaws.com":true,"s3-eu-west-1.amazonaws.com":true,"s3-ap-southeast-1.amazonaws.com":true,"s3-ap-southeast-2.amazonaws.com":true,"s3-ap-northeast-1.amazonaws.com":true,"s3-sa-east-1.amazonaws.com":true,"s3-us-gov-west-1.amazonaws.com":true,"s3-fips-us-gov-west-1.amazonaws.com":true,"s3-website-us-east-1.amazonaws.com":true,"s3-website-us-west-2.amazonaws.com":true,"s3-website-us-west-1.amazonaws.com":true,"s3-website-eu-west-1.amazonaws.com":true,"s3-website-ap-southeast-1.amazonaws.com":true,"s3-website-ap-southeast-2.amazonaws.com":true,"s3-website-ap-northeast-1.amazonaws.com":true,"s3-website-sa-east-1.amazonaws.com":true,"s3-website-us-gov-west-1.amazonaws.com":true,"betainabox.com":true,"ae.org":true,"ar.com":true,"br.com":true,"cn.com":true,"com.de":true,"com.se":true,"de.com":true,"eu.com":true,"gb.com":true,"gb.net":true,"hu.com":true,"hu.net":true,"jp.net":true,"jpn.com":true,"kr.com":true,"mex.com":true,"no.com":true,"qc.com":true,"ru.com":true,"sa.com":true,"se.com":true,"se.net":true,"uk.com":true,"uk.net":true,"us.com":true,"uy.com":true,"za.bz":true,"za.com":true,"africa.com":true,"gr.com":true,"in.net":true,"us.org":true,"co.com":true,"c.la":true,"cloudcontrolled.com":true,"cloudcontrolapp.com":true,"co.ca":true,"co.nl":true,"co.no":true,"*.platform.sh":true,"cupcake.is":true,"dreamhosters.com":true,"dyndns-at-home.com":true,"dyndns-at-work.com":true,"dyndns-blog.com":true,"dyndns-free.com":true,"dyndns-home.com":true,"dyndns-ip.com":true,"dyndns-mail.com":true,"dyndns-office.com":true,"dyndns-pics.com":true,"dyndns-remote.com":true,"dyndns-server.com":true,"dyndns-web.com":true,"dyndns-wiki.com":true,"dyndns-work.com":true,"dyndns.biz":true,"dyndns.info":true,"dyndns.org":true,"dyndns.tv":true,"at-band-camp.net":true,"ath.cx":true,"barrel-of-knowledge.info":true,"barrell-of-knowledge.info":true,"better-than.tv":true,"blogdns.com":true,"blogdns.net":true,"blogdns.org":true,"blogsite.org":true,"boldlygoingnowhere.org":true,"broke-it.net":true,"buyshouses.net":true,"cechire.com":true,"dnsalias.com":true,"dnsalias.net":true,"dnsalias.org":true,"dnsdojo.com":true,"dnsdojo.net":true,"dnsdojo.org":true,"does-it.net":true,"doesntexist.com":true,"doesntexist.org":true,"dontexist.com":true,"dontexist.net":true,"dontexist.org":true,"doomdns.com":true,"doomdns.org":true,"dvrdns.org":true,"dyn-o-saur.com":true,"dynalias.com":true,"dynalias.net":true,"dynalias.org":true,"dynathome.net":true,"dyndns.ws":true,"endofinternet.net":true,"endofinternet.org":true,"endoftheinternet.org":true,"est-a-la-maison.com":true,"est-a-la-masion.com":true,"est-le-patron.com":true,"est-mon-blogueur.com":true,"for-better.biz":true,"for-more.biz":true,"for-our.info":true,"for-some.biz":true,"for-the.biz":true,"forgot.her.name":true,"forgot.his.name":true,"from-ak.com":true,"from-al.com":true,"from-ar.com":true,"from-az.net":true,"from-ca.com":true,"from-co.net":true,"from-ct.com":true,"from-dc.com":true,"from-de.com":true,"from-fl.com":true,"from-ga.com":true,"from-hi.com":true,"from-ia.com":true,"from-id.com":true,"from-il.com":true,"from-in.com":true,"from-ks.com":true,"from-ky.com":true,"from-la.net":true,"from-ma.com":true,"from-md.com":true,"from-me.org":true,"from-mi.com":true,"from-mn.com":true,"from-mo.com":true,"from-ms.com":true,"from-mt.com":true,"from-nc.com":true,"from-nd.com":true,"from-ne.com":true,"from-nh.com":true,"from-nj.com":true,"from-nm.com":true,"from-nv.com":true,"from-ny.net":true,"from-oh.com":true,"from-ok.com":true,"from-or.com":true,"from-pa.com":true,"from-pr.com":true,"from-ri.com":true,"from-sc.com":true,"from-sd.com":true,"from-tn.com":true,"from-tx.com":true,"from-ut.com":true,"from-va.com":true,"from-vt.com":true,"from-wa.com":true,"from-wi.com":true,"from-wv.com":true,"from-wy.com":true,"ftpaccess.cc":true,"fuettertdasnetz.de":true,"game-host.org":true,"game-server.cc":true,"getmyip.com":true,"gets-it.net":true,"go.dyndns.org":true,"gotdns.com":true,"gotdns.org":true,"groks-the.info":true,"groks-this.info":true,"ham-radio-op.net":true,"here-for-more.info":true,"hobby-site.com":true,"hobby-site.org":true,"home.dyndns.org":true,"homedns.org":true,"homeftp.net":true,"homeftp.org":true,"homeip.net":true,"homelinux.com":true,"homelinux.net":true,"homelinux.org":true,"homeunix.com":true,"homeunix.net":true,"homeunix.org":true,"iamallama.com":true,"in-the-band.net":true,"is-a-anarchist.com":true,"is-a-blogger.com":true,"is-a-bookkeeper.com":true,"is-a-bruinsfan.org":true,"is-a-bulls-fan.com":true,"is-a-candidate.org":true,"is-a-caterer.com":true,"is-a-celticsfan.org":true,"is-a-chef.com":true,"is-a-chef.net":true,"is-a-chef.org":true,"is-a-conservative.com":true,"is-a-cpa.com":true,"is-a-cubicle-slave.com":true,"is-a-democrat.com":true,"is-a-designer.com":true,"is-a-doctor.com":true,"is-a-financialadvisor.com":true,"is-a-geek.com":true,"is-a-geek.net":true,"is-a-geek.org":true,"is-a-green.com":true,"is-a-guru.com":true,"is-a-hard-worker.com":true,"is-a-hunter.com":true,"is-a-knight.org":true,"is-a-landscaper.com":true,"is-a-lawyer.com":true,"is-a-liberal.com":true,"is-a-libertarian.com":true,"is-a-linux-user.org":true,"is-a-llama.com":true,"is-a-musician.com":true,"is-a-nascarfan.com":true,"is-a-nurse.com":true,"is-a-painter.com":true,"is-a-patsfan.org":true,"is-a-personaltrainer.com":true,"is-a-photographer.com":true,"is-a-player.com":true,"is-a-republican.com":true,"is-a-rockstar.com":true,"is-a-socialist.com":true,"is-a-soxfan.org":true,"is-a-student.com":true,"is-a-teacher.com":true,"is-a-techie.com":true,"is-a-therapist.com":true,"is-an-accountant.com":true,"is-an-actor.com":true,"is-an-actress.com":true,"is-an-anarchist.com":true,"is-an-artist.com":true,"is-an-engineer.com":true,"is-an-entertainer.com":true,"is-by.us":true,"is-certified.com":true,"is-found.org":true,"is-gone.com":true,"is-into-anime.com":true,"is-into-cars.com":true,"is-into-cartoons.com":true,"is-into-games.com":true,"is-leet.com":true,"is-lost.org":true,"is-not-certified.com":true,"is-saved.org":true,"is-slick.com":true,"is-uberleet.com":true,"is-very-bad.org":true,"is-very-evil.org":true,"is-very-good.org":true,"is-very-nice.org":true,"is-very-sweet.org":true,"is-with-theband.com":true,"isa-geek.com":true,"isa-geek.net":true,"isa-geek.org":true,"isa-hockeynut.com":true,"issmarterthanyou.com":true,"isteingeek.de":true,"istmein.de":true,"kicks-ass.net":true,"kicks-ass.org":true,"knowsitall.info":true,"land-4-sale.us":true,"lebtimnetz.de":true,"leitungsen.de":true,"likes-pie.com":true,"likescandy.com":true,"merseine.nu":true,"mine.nu":true,"misconfused.org":true,"mypets.ws":true,"myphotos.cc":true,"neat-url.com":true,"office-on-the.net":true,"on-the-web.tv":true,"podzone.net":true,"podzone.org":true,"readmyblog.org":true,"saves-the-whales.com":true,"scrapper-site.net":true,"scrapping.cc":true,"selfip.biz":true,"selfip.com":true,"selfip.info":true,"selfip.net":true,"selfip.org":true,"sells-for-less.com":true,"sells-for-u.com":true,"sells-it.net":true,"sellsyourhome.org":true,"servebbs.com":true,"servebbs.net":true,"servebbs.org":true,"serveftp.net":true,"serveftp.org":true,"servegame.org":true,"shacknet.nu":true,"simple-url.com":true,"space-to-rent.com":true,"stuff-4-sale.org":true,"stuff-4-sale.us":true,"teaches-yoga.com":true,"thruhere.net":true,"traeumtgerade.de":true,"webhop.biz":true,"webhop.info":true,"webhop.net":true,"webhop.org":true,"worse-than.tv":true,"writesthisblog.com":true,"a.ssl.fastly.net":true,"b.ssl.fastly.net":true,"global.ssl.fastly.net":true,"a.prod.fastly.net":true,"global.prod.fastly.net":true,"firebaseapp.com":true,"flynnhub.com":true,"service.gov.uk":true,"github.io":true,"githubusercontent.com":true,"ro.com":true,"appspot.com":true,"blogspot.ae":true,"blogspot.be":true,"blogspot.bj":true,"blogspot.ca":true,"blogspot.cf":true,"blogspot.ch":true,"blogspot.co.at":true,"blogspot.co.il":true,"blogspot.co.nz":true,"blogspot.co.uk":true,"blogspot.com":true,"blogspot.com.ar":true,"blogspot.com.au":true,"blogspot.com.br":true,"blogspot.com.es":true,"blogspot.com.tr":true,"blogspot.cv":true,"blogspot.cz":true,"blogspot.de":true,"blogspot.dk":true,"blogspot.fi":true,"blogspot.fr":true,"blogspot.gr":true,"blogspot.hk":true,"blogspot.hu":true,"blogspot.ie":true,"blogspot.in":true,"blogspot.it":true,"blogspot.jp":true,"blogspot.kr":true,"blogspot.mr":true,"blogspot.mx":true,"blogspot.nl":true,"blogspot.no":true,"blogspot.pt":true,"blogspot.re":true,"blogspot.ro":true,"blogspot.ru":true,"blogspot.se":true,"blogspot.sg":true,"blogspot.sk":true,"blogspot.td":true,"blogspot.tw":true,"codespot.com":true,"googleapis.com":true,"googlecode.com":true,"pagespeedmobilizer.com":true,"withgoogle.com":true,"herokuapp.com":true,"herokussl.com":true,"iki.fi":true,"biz.at":true,"info.at":true,"co.pl":true,"azurewebsites.net":true,"azure-mobile.net":true,"cloudapp.net":true,"nfshost.com":true,"nyc.mn":true,"nid.io":true,"operaunite.com":true,"outsystemscloud.com":true,"art.pl":true,"gliwice.pl":true,"krakow.pl":true,"poznan.pl":true,"wroc.pl":true,"zakopane.pl":true,"priv.at":true,"rhcloud.com":true,"sinaapp.com":true,"vipsinaapp.com":true,"1kapp.com":true,"gda.pl":true,"gdansk.pl":true,"gdynia.pl":true,"med.pl":true,"sopot.pl":true,"hk.com":true,"hk.org":true,"ltd.hk":true,"inc.hk":true,"yolasite.com":true,"za.net":true,"za.org":true}); - -// END of automatically generated file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/lib/store.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/lib/store.js deleted file mode 100644 index bce5292..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/lib/store.js +++ /dev/null @@ -1,71 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ -'use strict'; -/*jshint unused:false */ - -function Store() { -} -exports.Store = Store; - -// Stores may be synchronous, but are still required to use a -// Continuation-Passing Style API. The CookieJar itself will expose a "*Sync" -// API that converts from synchronous-callbacks to imperative style. -Store.prototype.synchronous = false; - -Store.prototype.findCookie = function(domain, path, key, cb) { - throw new Error('findCookie is not implemented'); -}; - -Store.prototype.findCookies = function(domain, path, cb) { - throw new Error('findCookies is not implemented'); -}; - -Store.prototype.putCookie = function(cookie, cb) { - throw new Error('putCookie is not implemented'); -}; - -Store.prototype.updateCookie = function(oldCookie, newCookie, cb) { - // recommended default implementation: - // return this.putCookie(newCookie, cb); - throw new Error('updateCookie is not implemented'); -}; - -Store.prototype.removeCookie = function(domain, path, key, cb) { - throw new Error('removeCookie is not implemented'); -}; - -Store.prototype.removeCookies = function(domain, path, cb) { - throw new Error('removeCookies is not implemented'); -}; - -Store.prototype.getAllCookies = function(cb) { - throw new Error('getAllCookies is not implemented (therefore jar cannot be serialized)'); -}; diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/package.json deleted file mode 100644 index 6c3d079..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "author": { - "name": "Jeremy Stashewsky", - "email": "jstashewsky@salesforce.com" - }, - "license": "BSD-3-Clause", - "name": "tough-cookie", - "description": "RFC6265 Cookies and Cookie Jar for node.js", - "keywords": [ - "HTTP", - "cookie", - "cookies", - "set-cookie", - "cookiejar", - "jar", - "RFC6265", - "RFC2965" - ], - "version": "2.0.0", - "homepage": "https://github.com/SalesforceEng/tough-cookie", - "repository": { - "type": "git", - "url": "git://github.com/SalesforceEng/tough-cookie.git" - }, - "bugs": { - "url": "https://github.com/SalesforceEng/tough-cookie/issues" - }, - "main": "./lib/cookie", - "scripts": { - "test": "vows test/*_test.js" - }, - "engines": { - "node": ">=0.10.0" - }, - "devDependencies": { - "vows": "0.7.0", - "async": ">=0.1.12" - }, - "gitHead": "a3af6104da7787c23bb98910109b0e0e8a10153c", - "_id": "tough-cookie@2.0.0", - "_shasum": "41ce08720b35cf90beb044dd2609fb19e928718f", - "_from": "tough-cookie@>=0.12.0", - "_npmVersion": "2.7.4", - "_nodeVersion": "0.12.2", - "_npmUser": { - "name": "jstash", - "email": "jstash@gmail.com" - }, - "dist": { - "shasum": "41ce08720b35cf90beb044dd2609fb19e928718f", - "tarball": "http://registry.npmjs.org/tough-cookie/-/tough-cookie-2.0.0.tgz" - }, - "maintainers": [ - { - "name": "jstash", - "email": "jeremy@goinstant.com" - }, - { - "name": "goinstant", - "email": "services@goinstant.com" - } - ], - "directories": {}, - "_resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.0.0.tgz" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/public-suffix.txt b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/public-suffix.txt deleted file mode 100644 index d5c9924..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/public-suffix.txt +++ /dev/null @@ -1,10309 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -// ===BEGIN ICANN DOMAINS=== - -// ac : http://en.wikipedia.org/wiki/.ac -ac -com.ac -edu.ac -gov.ac -net.ac -mil.ac -org.ac - -// ad : http://en.wikipedia.org/wiki/.ad -ad -nom.ad - -// ae : http://en.wikipedia.org/wiki/.ae -// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php -ae -co.ae -net.ae -org.ae -sch.ae -ac.ae -gov.ae -mil.ae - -// aero : see http://www.information.aero/index.php?id=66 -aero -accident-investigation.aero -accident-prevention.aero -aerobatic.aero -aeroclub.aero -aerodrome.aero -agents.aero -aircraft.aero -airline.aero -airport.aero -air-surveillance.aero -airtraffic.aero -air-traffic-control.aero -ambulance.aero -amusement.aero -association.aero -author.aero -ballooning.aero -broker.aero -caa.aero -cargo.aero -catering.aero -certification.aero -championship.aero -charter.aero -civilaviation.aero -club.aero -conference.aero -consultant.aero -consulting.aero -control.aero -council.aero -crew.aero -design.aero -dgca.aero -educator.aero -emergency.aero -engine.aero -engineer.aero -entertainment.aero -equipment.aero -exchange.aero -express.aero -federation.aero -flight.aero -freight.aero -fuel.aero -gliding.aero -government.aero -groundhandling.aero -group.aero -hanggliding.aero -homebuilt.aero -insurance.aero -journal.aero -journalist.aero -leasing.aero -logistics.aero -magazine.aero -maintenance.aero -marketplace.aero -media.aero -microlight.aero -modelling.aero -navigation.aero -parachuting.aero -paragliding.aero -passenger-association.aero -pilot.aero -press.aero -production.aero -recreation.aero -repbody.aero -res.aero -research.aero -rotorcraft.aero -safety.aero -scientist.aero -services.aero -show.aero -skydiving.aero -software.aero -student.aero -taxi.aero -trader.aero -trading.aero -trainer.aero -union.aero -workinggroup.aero -works.aero - -// af : http://www.nic.af/help.jsp -af -gov.af -com.af -org.af -net.af -edu.af - -// ag : http://www.nic.ag/prices.htm -ag -com.ag -org.ag -net.ag -co.ag -nom.ag - -// ai : http://nic.com.ai/ -ai -off.ai -com.ai -net.ai -org.ai - -// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 -al -com.al -edu.al -gov.al -mil.al -net.al -org.al - -// am : http://en.wikipedia.org/wiki/.am -am - -// an : http://www.una.an/an_domreg/default.asp -an -com.an -net.an -org.an -edu.an - -// ao : http://en.wikipedia.org/wiki/.ao -// http://www.dns.ao/REGISTR.DOC -ao -ed.ao -gv.ao -og.ao -co.ao -pb.ao -it.ao - -// aq : http://en.wikipedia.org/wiki/.aq -aq - -// ar : https://nic.ar/normativa-vigente.xhtml -ar -com.ar -edu.ar -gob.ar -gov.ar -int.ar -mil.ar -net.ar -org.ar -tur.ar - -// arpa : http://en.wikipedia.org/wiki/.arpa -// Confirmed by registry 2008-06-18 -arpa -e164.arpa -in-addr.arpa -ip6.arpa -iris.arpa -uri.arpa -urn.arpa - -// as : http://en.wikipedia.org/wiki/.as -as -gov.as - -// asia : http://en.wikipedia.org/wiki/.asia -asia - -// at : http://en.wikipedia.org/wiki/.at -// Confirmed by registry 2008-06-17 -at -ac.at -co.at -gv.at -or.at - -// au : http://en.wikipedia.org/wiki/.au -// http://www.auda.org.au/ -au -// 2LDs -com.au -net.au -org.au -edu.au -gov.au -asn.au -id.au -// Historic 2LDs (closed to new registration, but sites still exist) -info.au -conf.au -oz.au -// CGDNs - http://www.cgdn.org.au/ -act.au -nsw.au -nt.au -qld.au -sa.au -tas.au -vic.au -wa.au -// 3LDs -act.edu.au -nsw.edu.au -nt.edu.au -qld.edu.au -sa.edu.au -tas.edu.au -vic.edu.au -wa.edu.au -// act.gov.au Bug 984824 - Removed at request of Greg Tankard -// nsw.gov.au Bug 547985 - Removed at request of -// nt.gov.au Bug 940478 - Removed at request of Greg Connors -qld.gov.au -sa.gov.au -tas.gov.au -vic.gov.au -wa.gov.au - -// aw : http://en.wikipedia.org/wiki/.aw -aw -com.aw - -// ax : http://en.wikipedia.org/wiki/.ax -ax - -// az : http://en.wikipedia.org/wiki/.az -az -com.az -net.az -int.az -gov.az -org.az -edu.az -info.az -pp.az -mil.az -name.az -pro.az -biz.az - -// ba : http://en.wikipedia.org/wiki/.ba -ba -org.ba -net.ba -edu.ba -gov.ba -mil.ba -unsa.ba -unbi.ba -co.ba -com.ba -rs.ba - -// bb : http://en.wikipedia.org/wiki/.bb -bb -biz.bb -co.bb -com.bb -edu.bb -gov.bb -info.bb -net.bb -org.bb -store.bb -tv.bb - -// bd : http://en.wikipedia.org/wiki/.bd -*.bd - -// be : http://en.wikipedia.org/wiki/.be -// Confirmed by registry 2008-06-08 -be -ac.be - -// bf : http://en.wikipedia.org/wiki/.bf -bf -gov.bf - -// bg : http://en.wikipedia.org/wiki/.bg -// https://www.register.bg/user/static/rules/en/index.html -bg -a.bg -b.bg -c.bg -d.bg -e.bg -f.bg -g.bg -h.bg -i.bg -j.bg -k.bg -l.bg -m.bg -n.bg -o.bg -p.bg -q.bg -r.bg -s.bg -t.bg -u.bg -v.bg -w.bg -x.bg -y.bg -z.bg -0.bg -1.bg -2.bg -3.bg -4.bg -5.bg -6.bg -7.bg -8.bg -9.bg - -// bh : http://en.wikipedia.org/wiki/.bh -bh -com.bh -edu.bh -net.bh -org.bh -gov.bh - -// bi : http://en.wikipedia.org/wiki/.bi -// http://whois.nic.bi/ -bi -co.bi -com.bi -edu.bi -or.bi -org.bi - -// biz : http://en.wikipedia.org/wiki/.biz -biz - -// bj : http://en.wikipedia.org/wiki/.bj -bj -asso.bj -barreau.bj -gouv.bj - -// bm : http://www.bermudanic.bm/dnr-text.txt -bm -com.bm -edu.bm -gov.bm -net.bm -org.bm - -// bn : http://en.wikipedia.org/wiki/.bn -*.bn - -// bo : http://www.nic.bo/ -bo -com.bo -edu.bo -gov.bo -gob.bo -int.bo -org.bo -net.bo -mil.bo -tv.bo - -// br : http://registro.br/dominio/categoria.html -// Submitted by registry 2014-08-11 -br -adm.br -adv.br -agr.br -am.br -arq.br -art.br -ato.br -b.br -bio.br -blog.br -bmd.br -cim.br -cng.br -cnt.br -com.br -coop.br -ecn.br -eco.br -edu.br -emp.br -eng.br -esp.br -etc.br -eti.br -far.br -flog.br -fm.br -fnd.br -fot.br -fst.br -g12.br -ggf.br -gov.br -imb.br -ind.br -inf.br -jor.br -jus.br -leg.br -lel.br -mat.br -med.br -mil.br -mp.br -mus.br -net.br -*.nom.br -not.br -ntr.br -odo.br -org.br -ppg.br -pro.br -psc.br -psi.br -qsl.br -radio.br -rec.br -slg.br -srv.br -taxi.br -teo.br -tmp.br -trd.br -tur.br -tv.br -vet.br -vlog.br -wiki.br -zlg.br - -// bs : http://www.nic.bs/rules.html -bs -com.bs -net.bs -org.bs -edu.bs -gov.bs - -// bt : http://en.wikipedia.org/wiki/.bt -bt -com.bt -edu.bt -gov.bt -net.bt -org.bt - -// bv : No registrations at this time. -// Submitted by registry 2006-06-16 -bv - -// bw : http://en.wikipedia.org/wiki/.bw -// http://www.gobin.info/domainname/bw.doc -// list of other 2nd level tlds ? -bw -co.bw -org.bw - -// by : http://en.wikipedia.org/wiki/.by -// http://tld.by/rules_2006_en.html -// list of other 2nd level tlds ? -by -gov.by -mil.by -// Official information does not indicate that com.by is a reserved -// second-level domain, but it's being used as one (see www.google.com.by and -// www.yahoo.com.by, for example), so we list it here for safety's sake. -com.by - -// http://hoster.by/ -of.by - -// bz : http://en.wikipedia.org/wiki/.bz -// http://www.belizenic.bz/ -bz -com.bz -net.bz -org.bz -edu.bz -gov.bz - -// ca : http://en.wikipedia.org/wiki/.ca -ca -// ca geographical names -ab.ca -bc.ca -mb.ca -nb.ca -nf.ca -nl.ca -ns.ca -nt.ca -nu.ca -on.ca -pe.ca -qc.ca -sk.ca -yk.ca -// gc.ca: http://en.wikipedia.org/wiki/.gc.ca -// see also: http://registry.gc.ca/en/SubdomainFAQ -gc.ca - -// cat : http://en.wikipedia.org/wiki/.cat -cat - -// cc : http://en.wikipedia.org/wiki/.cc -cc - -// cd : http://en.wikipedia.org/wiki/.cd -// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 -cd -gov.cd - -// cf : http://en.wikipedia.org/wiki/.cf -cf - -// cg : http://en.wikipedia.org/wiki/.cg -cg - -// ch : http://en.wikipedia.org/wiki/.ch -ch - -// ci : http://en.wikipedia.org/wiki/.ci -// http://www.nic.ci/index.php?page=charte -ci -org.ci -or.ci -com.ci -co.ci -edu.ci -ed.ci -ac.ci -net.ci -go.ci -asso.ci -aéroport.ci -int.ci -presse.ci -md.ci -gouv.ci - -// ck : http://en.wikipedia.org/wiki/.ck -*.ck -!www.ck - -// cl : http://en.wikipedia.org/wiki/.cl -cl -gov.cl -gob.cl -co.cl -mil.cl - -// cm : http://en.wikipedia.org/wiki/.cm plus bug 981927 -cm -co.cm -com.cm -gov.cm -net.cm - -// cn : http://en.wikipedia.org/wiki/.cn -// Submitted by registry 2008-06-11 -cn -ac.cn -com.cn -edu.cn -gov.cn -net.cn -org.cn -mil.cn -公司.cn -网络.cn -網絡.cn -// cn geographic names -ah.cn -bj.cn -cq.cn -fj.cn -gd.cn -gs.cn -gz.cn -gx.cn -ha.cn -hb.cn -he.cn -hi.cn -hl.cn -hn.cn -jl.cn -js.cn -jx.cn -ln.cn -nm.cn -nx.cn -qh.cn -sc.cn -sd.cn -sh.cn -sn.cn -sx.cn -tj.cn -xj.cn -xz.cn -yn.cn -zj.cn -hk.cn -mo.cn -tw.cn - -// co : http://en.wikipedia.org/wiki/.co -// Submitted by registry 2008-06-11 -co -arts.co -com.co -edu.co -firm.co -gov.co -info.co -int.co -mil.co -net.co -nom.co -org.co -rec.co -web.co - -// com : http://en.wikipedia.org/wiki/.com -com - -// coop : http://en.wikipedia.org/wiki/.coop -coop - -// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do -cr -ac.cr -co.cr -ed.cr -fi.cr -go.cr -or.cr -sa.cr - -// cu : http://en.wikipedia.org/wiki/.cu -cu -com.cu -edu.cu -org.cu -net.cu -gov.cu -inf.cu - -// cv : http://en.wikipedia.org/wiki/.cv -cv - -// cw : http://www.una.cw/cw_registry/ -// Confirmed by registry 2013-03-26 -cw -com.cw -edu.cw -net.cw -org.cw - -// cx : http://en.wikipedia.org/wiki/.cx -// list of other 2nd level tlds ? -cx -gov.cx - -// cy : http://en.wikipedia.org/wiki/.cy -*.cy - -// cz : http://en.wikipedia.org/wiki/.cz -cz - -// de : http://en.wikipedia.org/wiki/.de -// Confirmed by registry (with technical -// reservations) 2008-07-01 -de - -// dj : http://en.wikipedia.org/wiki/.dj -dj - -// dk : http://en.wikipedia.org/wiki/.dk -// Confirmed by registry 2008-06-17 -dk - -// dm : http://en.wikipedia.org/wiki/.dm -dm -com.dm -net.dm -org.dm -edu.dm -gov.dm - -// do : http://en.wikipedia.org/wiki/.do -do -art.do -com.do -edu.do -gob.do -gov.do -mil.do -net.do -org.do -sld.do -web.do - -// dz : http://en.wikipedia.org/wiki/.dz -dz -com.dz -org.dz -net.dz -gov.dz -edu.dz -asso.dz -pol.dz -art.dz - -// ec : http://www.nic.ec/reg/paso1.asp -// Submitted by registry 2008-07-04 -ec -com.ec -info.ec -net.ec -fin.ec -k12.ec -med.ec -pro.ec -org.ec -edu.ec -gov.ec -gob.ec -mil.ec - -// edu : http://en.wikipedia.org/wiki/.edu -edu - -// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B -ee -edu.ee -gov.ee -riik.ee -lib.ee -med.ee -com.ee -pri.ee -aip.ee -org.ee -fie.ee - -// eg : http://en.wikipedia.org/wiki/.eg -eg -com.eg -edu.eg -eun.eg -gov.eg -mil.eg -name.eg -net.eg -org.eg -sci.eg - -// er : http://en.wikipedia.org/wiki/.er -*.er - -// es : https://www.nic.es/site_ingles/ingles/dominios/index.html -es -com.es -nom.es -org.es -gob.es -edu.es - -// et : http://en.wikipedia.org/wiki/.et -et -com.et -gov.et -org.et -edu.et -biz.et -name.et -info.et -net.et - -// eu : http://en.wikipedia.org/wiki/.eu -eu - -// fi : http://en.wikipedia.org/wiki/.fi -fi -// aland.fi : http://en.wikipedia.org/wiki/.ax -// This domain is being phased out in favor of .ax. As there are still many -// domains under aland.fi, we still keep it on the list until aland.fi is -// completely removed. -// TODO: Check for updates (expected to be phased out around Q1/2009) -aland.fi - -// fj : http://en.wikipedia.org/wiki/.fj -*.fj - -// fk : http://en.wikipedia.org/wiki/.fk -*.fk - -// fm : http://en.wikipedia.org/wiki/.fm -fm - -// fo : http://en.wikipedia.org/wiki/.fo -fo - -// fr : http://www.afnic.fr/ -// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs -fr -com.fr -asso.fr -nom.fr -prd.fr -presse.fr -tm.fr -// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels -aeroport.fr -assedic.fr -avocat.fr -avoues.fr -cci.fr -chambagri.fr -chirurgiens-dentistes.fr -experts-comptables.fr -geometre-expert.fr -gouv.fr -greta.fr -huissier-justice.fr -medecin.fr -notaires.fr -pharmacien.fr -port.fr -veterinaire.fr - -// ga : http://en.wikipedia.org/wiki/.ga -ga - -// gb : This registry is effectively dormant -// Submitted by registry 2008-06-12 -gb - -// gd : http://en.wikipedia.org/wiki/.gd -gd - -// ge : http://www.nic.net.ge/policy_en.pdf -ge -com.ge -edu.ge -gov.ge -org.ge -mil.ge -net.ge -pvt.ge - -// gf : http://en.wikipedia.org/wiki/.gf -gf - -// gg : http://www.channelisles.net/register-domains/ -// Confirmed by registry 2013-11-28 -gg -co.gg -net.gg -org.gg - -// gh : http://en.wikipedia.org/wiki/.gh -// see also: http://www.nic.gh/reg_now.php -// Although domains directly at second level are not possible at the moment, -// they have been possible for some time and may come back. -gh -com.gh -edu.gh -gov.gh -org.gh -mil.gh - -// gi : http://www.nic.gi/rules.html -gi -com.gi -ltd.gi -gov.gi -mod.gi -edu.gi -org.gi - -// gl : http://en.wikipedia.org/wiki/.gl -// http://nic.gl -gl -co.gl -com.gl -edu.gl -net.gl -org.gl - -// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm -gm - -// gn : http://psg.com/dns/gn/gn.txt -// Submitted by registry 2008-06-17 -gn -ac.gn -com.gn -edu.gn -gov.gn -org.gn -net.gn - -// gov : http://en.wikipedia.org/wiki/.gov -gov - -// gp : http://www.nic.gp/index.php?lang=en -gp -com.gp -net.gp -mobi.gp -edu.gp -org.gp -asso.gp - -// gq : http://en.wikipedia.org/wiki/.gq -gq - -// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html -// Submitted by registry 2008-06-09 -gr -com.gr -edu.gr -net.gr -org.gr -gov.gr - -// gs : http://en.wikipedia.org/wiki/.gs -gs - -// gt : http://www.gt/politicas_de_registro.html -gt -com.gt -edu.gt -gob.gt -ind.gt -mil.gt -net.gt -org.gt - -// gu : http://gadao.gov.gu/registration.txt -*.gu - -// gw : http://en.wikipedia.org/wiki/.gw -gw - -// gy : http://en.wikipedia.org/wiki/.gy -// http://registry.gy/ -gy -co.gy -com.gy -net.gy - -// hk : https://www.hkdnr.hk -// Submitted by registry 2008-06-11 -hk -com.hk -edu.hk -gov.hk -idv.hk -net.hk -org.hk -公司.hk -教育.hk -敎育.hk -政府.hk -個人.hk -个人.hk -箇人.hk -網络.hk -网络.hk -组織.hk -網絡.hk -网絡.hk -组织.hk -組織.hk -組织.hk - -// hm : http://en.wikipedia.org/wiki/.hm -hm - -// hn : http://www.nic.hn/politicas/ps02,,05.html -hn -com.hn -edu.hn -org.hn -net.hn -mil.hn -gob.hn - -// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf -hr -iz.hr -from.hr -name.hr -com.hr - -// ht : http://www.nic.ht/info/charte.cfm -ht -com.ht -shop.ht -firm.ht -info.ht -adult.ht -net.ht -pro.ht -org.ht -med.ht -art.ht -coop.ht -pol.ht -asso.ht -edu.ht -rel.ht -gouv.ht -perso.ht - -// hu : http://www.domain.hu/domain/English/sld.html -// Confirmed by registry 2008-06-12 -hu -co.hu -info.hu -org.hu -priv.hu -sport.hu -tm.hu -2000.hu -agrar.hu -bolt.hu -casino.hu -city.hu -erotica.hu -erotika.hu -film.hu -forum.hu -games.hu -hotel.hu -ingatlan.hu -jogasz.hu -konyvelo.hu -lakas.hu -media.hu -news.hu -reklam.hu -sex.hu -shop.hu -suli.hu -szex.hu -tozsde.hu -utazas.hu -video.hu - -// id : https://register.pandi.or.id/ -id -ac.id -biz.id -co.id -desa.id -go.id -mil.id -my.id -net.id -or.id -sch.id -web.id - -// ie : http://en.wikipedia.org/wiki/.ie -ie -gov.ie - -// il : http://en.wikipedia.org/wiki/.il -*.il - -// im : https://www.nic.im/ -// Submitted by registry 2013-11-15 -im -ac.im -co.im -com.im -ltd.co.im -net.im -org.im -plc.co.im -tt.im -tv.im - -// in : http://en.wikipedia.org/wiki/.in -// see also: https://registry.in/Policies -// Please note, that nic.in is not an offical eTLD, but used by most -// government institutions. -in -co.in -firm.in -net.in -org.in -gen.in -ind.in -nic.in -ac.in -edu.in -res.in -gov.in -mil.in - -// info : http://en.wikipedia.org/wiki/.info -info - -// int : http://en.wikipedia.org/wiki/.int -// Confirmed by registry 2008-06-18 -int -eu.int - -// io : http://www.nic.io/rules.html -// list of other 2nd level tlds ? -io -com.io - -// iq : http://www.cmc.iq/english/iq/iqregister1.htm -iq -gov.iq -edu.iq -mil.iq -com.iq -org.iq -net.iq - -// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules -// Also see http://www.nic.ir/Internationalized_Domain_Names -// Two .ir entries added at request of , 2010-04-16 -ir -ac.ir -co.ir -gov.ir -id.ir -net.ir -org.ir -sch.ir -// xn--mgba3a4f16a.ir (.ir, Persian YEH) -ایران.ir -// xn--mgba3a4fra.ir (.ir, Arabic YEH) -ايران.ir - -// is : http://www.isnic.is/domain/rules.php -// Confirmed by registry 2008-12-06 -is -net.is -com.is -edu.is -gov.is -org.is -int.is - -// it : http://en.wikipedia.org/wiki/.it -it -gov.it -edu.it -// Reserved geo-names: -// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf -// There is also a list of reserved geo-names corresponding to Italian municipalities -// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here. -// Regions -abr.it -abruzzo.it -aosta-valley.it -aostavalley.it -bas.it -basilicata.it -cal.it -calabria.it -cam.it -campania.it -emilia-romagna.it -emiliaromagna.it -emr.it -friuli-v-giulia.it -friuli-ve-giulia.it -friuli-vegiulia.it -friuli-venezia-giulia.it -friuli-veneziagiulia.it -friuli-vgiulia.it -friuliv-giulia.it -friulive-giulia.it -friulivegiulia.it -friulivenezia-giulia.it -friuliveneziagiulia.it -friulivgiulia.it -fvg.it -laz.it -lazio.it -lig.it -liguria.it -lom.it -lombardia.it -lombardy.it -lucania.it -mar.it -marche.it -mol.it -molise.it -piedmont.it -piemonte.it -pmn.it -pug.it -puglia.it -sar.it -sardegna.it -sardinia.it -sic.it -sicilia.it -sicily.it -taa.it -tos.it -toscana.it -trentino-a-adige.it -trentino-aadige.it -trentino-alto-adige.it -trentino-altoadige.it -trentino-s-tirol.it -trentino-stirol.it -trentino-sud-tirol.it -trentino-sudtirol.it -trentino-sued-tirol.it -trentino-suedtirol.it -trentinoa-adige.it -trentinoaadige.it -trentinoalto-adige.it -trentinoaltoadige.it -trentinos-tirol.it -trentinostirol.it -trentinosud-tirol.it -trentinosudtirol.it -trentinosued-tirol.it -trentinosuedtirol.it -tuscany.it -umb.it -umbria.it -val-d-aosta.it -val-daosta.it -vald-aosta.it -valdaosta.it -valle-aosta.it -valle-d-aosta.it -valle-daosta.it -valleaosta.it -valled-aosta.it -valledaosta.it -vallee-aoste.it -valleeaoste.it -vao.it -vda.it -ven.it -veneto.it -// Provinces -ag.it -agrigento.it -al.it -alessandria.it -alto-adige.it -altoadige.it -an.it -ancona.it -andria-barletta-trani.it -andria-trani-barletta.it -andriabarlettatrani.it -andriatranibarletta.it -ao.it -aosta.it -aoste.it -ap.it -aq.it -aquila.it -ar.it -arezzo.it -ascoli-piceno.it -ascolipiceno.it -asti.it -at.it -av.it -avellino.it -ba.it -balsan.it -bari.it -barletta-trani-andria.it -barlettatraniandria.it -belluno.it -benevento.it -bergamo.it -bg.it -bi.it -biella.it -bl.it -bn.it -bo.it -bologna.it -bolzano.it -bozen.it -br.it -brescia.it -brindisi.it -bs.it -bt.it -bz.it -ca.it -cagliari.it -caltanissetta.it -campidano-medio.it -campidanomedio.it -campobasso.it -carbonia-iglesias.it -carboniaiglesias.it -carrara-massa.it -carraramassa.it -caserta.it -catania.it -catanzaro.it -cb.it -ce.it -cesena-forli.it -cesenaforli.it -ch.it -chieti.it -ci.it -cl.it -cn.it -co.it -como.it -cosenza.it -cr.it -cremona.it -crotone.it -cs.it -ct.it -cuneo.it -cz.it -dell-ogliastra.it -dellogliastra.it -en.it -enna.it -fc.it -fe.it -fermo.it -ferrara.it -fg.it -fi.it -firenze.it -florence.it -fm.it -foggia.it -forli-cesena.it -forlicesena.it -fr.it -frosinone.it -ge.it -genoa.it -genova.it -go.it -gorizia.it -gr.it -grosseto.it -iglesias-carbonia.it -iglesiascarbonia.it -im.it -imperia.it -is.it -isernia.it -kr.it -la-spezia.it -laquila.it -laspezia.it -latina.it -lc.it -le.it -lecce.it -lecco.it -li.it -livorno.it -lo.it -lodi.it -lt.it -lu.it -lucca.it -macerata.it -mantova.it -massa-carrara.it -massacarrara.it -matera.it -mb.it -mc.it -me.it -medio-campidano.it -mediocampidano.it -messina.it -mi.it -milan.it -milano.it -mn.it -mo.it -modena.it -monza-brianza.it -monza-e-della-brianza.it -monza.it -monzabrianza.it -monzaebrianza.it -monzaedellabrianza.it -ms.it -mt.it -na.it -naples.it -napoli.it -no.it -novara.it -nu.it -nuoro.it -og.it -ogliastra.it -olbia-tempio.it -olbiatempio.it -or.it -oristano.it -ot.it -pa.it -padova.it -padua.it -palermo.it -parma.it -pavia.it -pc.it -pd.it -pe.it -perugia.it -pesaro-urbino.it -pesarourbino.it -pescara.it -pg.it -pi.it -piacenza.it -pisa.it -pistoia.it -pn.it -po.it -pordenone.it -potenza.it -pr.it -prato.it -pt.it -pu.it -pv.it -pz.it -ra.it -ragusa.it -ravenna.it -rc.it -re.it -reggio-calabria.it -reggio-emilia.it -reggiocalabria.it -reggioemilia.it -rg.it -ri.it -rieti.it -rimini.it -rm.it -rn.it -ro.it -roma.it -rome.it -rovigo.it -sa.it -salerno.it -sassari.it -savona.it -si.it -siena.it -siracusa.it -so.it -sondrio.it -sp.it -sr.it -ss.it -suedtirol.it -sv.it -ta.it -taranto.it -te.it -tempio-olbia.it -tempioolbia.it -teramo.it -terni.it -tn.it -to.it -torino.it -tp.it -tr.it -trani-andria-barletta.it -trani-barletta-andria.it -traniandriabarletta.it -tranibarlettaandria.it -trapani.it -trentino.it -trento.it -treviso.it -trieste.it -ts.it -turin.it -tv.it -ud.it -udine.it -urbino-pesaro.it -urbinopesaro.it -va.it -varese.it -vb.it -vc.it -ve.it -venezia.it -venice.it -verbania.it -vercelli.it -verona.it -vi.it -vibo-valentia.it -vibovalentia.it -vicenza.it -viterbo.it -vr.it -vs.it -vt.it -vv.it - -// je : http://www.channelisles.net/register-domains/ -// Confirmed by registry 2013-11-28 -je -co.je -net.je -org.je - -// jm : http://www.com.jm/register.html -*.jm - -// jo : http://www.dns.jo/Registration_policy.aspx -jo -com.jo -org.jo -net.jo -edu.jo -sch.jo -gov.jo -mil.jo -name.jo - -// jobs : http://en.wikipedia.org/wiki/.jobs -jobs - -// jp : http://en.wikipedia.org/wiki/.jp -// http://jprs.co.jp/en/jpdomain.html -// Submitted by registry 2014-10-30 -jp -// jp organizational type names -ac.jp -ad.jp -co.jp -ed.jp -go.jp -gr.jp -lg.jp -ne.jp -or.jp -// jp prefecture type names -aichi.jp -akita.jp -aomori.jp -chiba.jp -ehime.jp -fukui.jp -fukuoka.jp -fukushima.jp -gifu.jp -gunma.jp -hiroshima.jp -hokkaido.jp -hyogo.jp -ibaraki.jp -ishikawa.jp -iwate.jp -kagawa.jp -kagoshima.jp -kanagawa.jp -kochi.jp -kumamoto.jp -kyoto.jp -mie.jp -miyagi.jp -miyazaki.jp -nagano.jp -nagasaki.jp -nara.jp -niigata.jp -oita.jp -okayama.jp -okinawa.jp -osaka.jp -saga.jp -saitama.jp -shiga.jp -shimane.jp -shizuoka.jp -tochigi.jp -tokushima.jp -tokyo.jp -tottori.jp -toyama.jp -wakayama.jp -yamagata.jp -yamaguchi.jp -yamanashi.jp -栃木.jp -愛知.jp -愛媛.jp -兵庫.jp -熊本.jp -茨城.jp -北海道.jp -千葉.jp -和歌山.jp -長崎.jp -長野.jp -新潟.jp -青森.jp -静岡.jp -東京.jp -石川.jp -埼玉.jp -三重.jp -京都.jp -佐賀.jp -大分.jp -大阪.jp -奈良.jp -宮城.jp -宮崎.jp -富山.jp -山口.jp -山形.jp -山梨.jp -岩手.jp -岐阜.jp -岡山.jp -島根.jp -広島.jp -徳島.jp -沖縄.jp -滋賀.jp -神奈川.jp -福井.jp -福岡.jp -福島.jp -秋田.jp -群馬.jp -香川.jp -高知.jp -鳥取.jp -鹿児島.jp -// jp geographic type names -// http://jprs.jp/doc/rule/saisoku-1.html -*.kawasaki.jp -*.kitakyushu.jp -*.kobe.jp -*.nagoya.jp -*.sapporo.jp -*.sendai.jp -*.yokohama.jp -!city.kawasaki.jp -!city.kitakyushu.jp -!city.kobe.jp -!city.nagoya.jp -!city.sapporo.jp -!city.sendai.jp -!city.yokohama.jp -// 4th level registration -aisai.aichi.jp -ama.aichi.jp -anjo.aichi.jp -asuke.aichi.jp -chiryu.aichi.jp -chita.aichi.jp -fuso.aichi.jp -gamagori.aichi.jp -handa.aichi.jp -hazu.aichi.jp -hekinan.aichi.jp -higashiura.aichi.jp -ichinomiya.aichi.jp -inazawa.aichi.jp -inuyama.aichi.jp -isshiki.aichi.jp -iwakura.aichi.jp -kanie.aichi.jp -kariya.aichi.jp -kasugai.aichi.jp -kira.aichi.jp -kiyosu.aichi.jp -komaki.aichi.jp -konan.aichi.jp -kota.aichi.jp -mihama.aichi.jp -miyoshi.aichi.jp -nishio.aichi.jp -nisshin.aichi.jp -obu.aichi.jp -oguchi.aichi.jp -oharu.aichi.jp -okazaki.aichi.jp -owariasahi.aichi.jp -seto.aichi.jp -shikatsu.aichi.jp -shinshiro.aichi.jp -shitara.aichi.jp -tahara.aichi.jp -takahama.aichi.jp -tobishima.aichi.jp -toei.aichi.jp -togo.aichi.jp -tokai.aichi.jp -tokoname.aichi.jp -toyoake.aichi.jp -toyohashi.aichi.jp -toyokawa.aichi.jp -toyone.aichi.jp -toyota.aichi.jp -tsushima.aichi.jp -yatomi.aichi.jp -akita.akita.jp -daisen.akita.jp -fujisato.akita.jp -gojome.akita.jp -hachirogata.akita.jp -happou.akita.jp -higashinaruse.akita.jp -honjo.akita.jp -honjyo.akita.jp -ikawa.akita.jp -kamikoani.akita.jp -kamioka.akita.jp -katagami.akita.jp -kazuno.akita.jp -kitaakita.akita.jp -kosaka.akita.jp -kyowa.akita.jp -misato.akita.jp -mitane.akita.jp -moriyoshi.akita.jp -nikaho.akita.jp -noshiro.akita.jp -odate.akita.jp -oga.akita.jp -ogata.akita.jp -semboku.akita.jp -yokote.akita.jp -yurihonjo.akita.jp -aomori.aomori.jp -gonohe.aomori.jp -hachinohe.aomori.jp -hashikami.aomori.jp -hiranai.aomori.jp -hirosaki.aomori.jp -itayanagi.aomori.jp -kuroishi.aomori.jp -misawa.aomori.jp -mutsu.aomori.jp -nakadomari.aomori.jp -noheji.aomori.jp -oirase.aomori.jp -owani.aomori.jp -rokunohe.aomori.jp -sannohe.aomori.jp -shichinohe.aomori.jp -shingo.aomori.jp -takko.aomori.jp -towada.aomori.jp -tsugaru.aomori.jp -tsuruta.aomori.jp -abiko.chiba.jp -asahi.chiba.jp -chonan.chiba.jp -chosei.chiba.jp -choshi.chiba.jp -chuo.chiba.jp -funabashi.chiba.jp -futtsu.chiba.jp -hanamigawa.chiba.jp -ichihara.chiba.jp -ichikawa.chiba.jp -ichinomiya.chiba.jp -inzai.chiba.jp -isumi.chiba.jp -kamagaya.chiba.jp -kamogawa.chiba.jp -kashiwa.chiba.jp -katori.chiba.jp -katsuura.chiba.jp -kimitsu.chiba.jp -kisarazu.chiba.jp -kozaki.chiba.jp -kujukuri.chiba.jp -kyonan.chiba.jp -matsudo.chiba.jp -midori.chiba.jp -mihama.chiba.jp -minamiboso.chiba.jp -mobara.chiba.jp -mutsuzawa.chiba.jp -nagara.chiba.jp -nagareyama.chiba.jp -narashino.chiba.jp -narita.chiba.jp -noda.chiba.jp -oamishirasato.chiba.jp -omigawa.chiba.jp -onjuku.chiba.jp -otaki.chiba.jp -sakae.chiba.jp -sakura.chiba.jp -shimofusa.chiba.jp -shirako.chiba.jp -shiroi.chiba.jp -shisui.chiba.jp -sodegaura.chiba.jp -sosa.chiba.jp -tako.chiba.jp -tateyama.chiba.jp -togane.chiba.jp -tohnosho.chiba.jp -tomisato.chiba.jp -urayasu.chiba.jp -yachimata.chiba.jp -yachiyo.chiba.jp -yokaichiba.chiba.jp -yokoshibahikari.chiba.jp -yotsukaido.chiba.jp -ainan.ehime.jp -honai.ehime.jp -ikata.ehime.jp -imabari.ehime.jp -iyo.ehime.jp -kamijima.ehime.jp -kihoku.ehime.jp -kumakogen.ehime.jp -masaki.ehime.jp -matsuno.ehime.jp -matsuyama.ehime.jp -namikata.ehime.jp -niihama.ehime.jp -ozu.ehime.jp -saijo.ehime.jp -seiyo.ehime.jp -shikokuchuo.ehime.jp -tobe.ehime.jp -toon.ehime.jp -uchiko.ehime.jp -uwajima.ehime.jp -yawatahama.ehime.jp -echizen.fukui.jp -eiheiji.fukui.jp -fukui.fukui.jp -ikeda.fukui.jp -katsuyama.fukui.jp -mihama.fukui.jp -minamiechizen.fukui.jp -obama.fukui.jp -ohi.fukui.jp -ono.fukui.jp -sabae.fukui.jp -sakai.fukui.jp -takahama.fukui.jp -tsuruga.fukui.jp -wakasa.fukui.jp -ashiya.fukuoka.jp -buzen.fukuoka.jp -chikugo.fukuoka.jp -chikuho.fukuoka.jp -chikujo.fukuoka.jp -chikushino.fukuoka.jp -chikuzen.fukuoka.jp -chuo.fukuoka.jp -dazaifu.fukuoka.jp -fukuchi.fukuoka.jp -hakata.fukuoka.jp -higashi.fukuoka.jp -hirokawa.fukuoka.jp -hisayama.fukuoka.jp -iizuka.fukuoka.jp -inatsuki.fukuoka.jp -kaho.fukuoka.jp -kasuga.fukuoka.jp -kasuya.fukuoka.jp -kawara.fukuoka.jp -keisen.fukuoka.jp -koga.fukuoka.jp -kurate.fukuoka.jp -kurogi.fukuoka.jp -kurume.fukuoka.jp -minami.fukuoka.jp -miyako.fukuoka.jp -miyama.fukuoka.jp -miyawaka.fukuoka.jp -mizumaki.fukuoka.jp -munakata.fukuoka.jp -nakagawa.fukuoka.jp -nakama.fukuoka.jp -nishi.fukuoka.jp -nogata.fukuoka.jp -ogori.fukuoka.jp -okagaki.fukuoka.jp -okawa.fukuoka.jp -oki.fukuoka.jp -omuta.fukuoka.jp -onga.fukuoka.jp -onojo.fukuoka.jp -oto.fukuoka.jp -saigawa.fukuoka.jp -sasaguri.fukuoka.jp -shingu.fukuoka.jp -shinyoshitomi.fukuoka.jp -shonai.fukuoka.jp -soeda.fukuoka.jp -sue.fukuoka.jp -tachiarai.fukuoka.jp -tagawa.fukuoka.jp -takata.fukuoka.jp -toho.fukuoka.jp -toyotsu.fukuoka.jp -tsuiki.fukuoka.jp -ukiha.fukuoka.jp -umi.fukuoka.jp -usui.fukuoka.jp -yamada.fukuoka.jp -yame.fukuoka.jp -yanagawa.fukuoka.jp -yukuhashi.fukuoka.jp -aizubange.fukushima.jp -aizumisato.fukushima.jp -aizuwakamatsu.fukushima.jp -asakawa.fukushima.jp -bandai.fukushima.jp -date.fukushima.jp -fukushima.fukushima.jp -furudono.fukushima.jp -futaba.fukushima.jp -hanawa.fukushima.jp -higashi.fukushima.jp -hirata.fukushima.jp -hirono.fukushima.jp -iitate.fukushima.jp -inawashiro.fukushima.jp -ishikawa.fukushima.jp -iwaki.fukushima.jp -izumizaki.fukushima.jp -kagamiishi.fukushima.jp -kaneyama.fukushima.jp -kawamata.fukushima.jp -kitakata.fukushima.jp -kitashiobara.fukushima.jp -koori.fukushima.jp -koriyama.fukushima.jp -kunimi.fukushima.jp -miharu.fukushima.jp -mishima.fukushima.jp -namie.fukushima.jp -nango.fukushima.jp -nishiaizu.fukushima.jp -nishigo.fukushima.jp -okuma.fukushima.jp -omotego.fukushima.jp -ono.fukushima.jp -otama.fukushima.jp -samegawa.fukushima.jp -shimogo.fukushima.jp -shirakawa.fukushima.jp -showa.fukushima.jp -soma.fukushima.jp -sukagawa.fukushima.jp -taishin.fukushima.jp -tamakawa.fukushima.jp -tanagura.fukushima.jp -tenei.fukushima.jp -yabuki.fukushima.jp -yamato.fukushima.jp -yamatsuri.fukushima.jp -yanaizu.fukushima.jp -yugawa.fukushima.jp -anpachi.gifu.jp -ena.gifu.jp -gifu.gifu.jp -ginan.gifu.jp -godo.gifu.jp -gujo.gifu.jp -hashima.gifu.jp -hichiso.gifu.jp -hida.gifu.jp -higashishirakawa.gifu.jp -ibigawa.gifu.jp -ikeda.gifu.jp -kakamigahara.gifu.jp -kani.gifu.jp -kasahara.gifu.jp -kasamatsu.gifu.jp -kawaue.gifu.jp -kitagata.gifu.jp -mino.gifu.jp -minokamo.gifu.jp -mitake.gifu.jp -mizunami.gifu.jp -motosu.gifu.jp -nakatsugawa.gifu.jp -ogaki.gifu.jp -sakahogi.gifu.jp -seki.gifu.jp -sekigahara.gifu.jp -shirakawa.gifu.jp -tajimi.gifu.jp -takayama.gifu.jp -tarui.gifu.jp -toki.gifu.jp -tomika.gifu.jp -wanouchi.gifu.jp -yamagata.gifu.jp -yaotsu.gifu.jp -yoro.gifu.jp -annaka.gunma.jp -chiyoda.gunma.jp -fujioka.gunma.jp -higashiagatsuma.gunma.jp -isesaki.gunma.jp -itakura.gunma.jp -kanna.gunma.jp -kanra.gunma.jp -katashina.gunma.jp -kawaba.gunma.jp -kiryu.gunma.jp -kusatsu.gunma.jp -maebashi.gunma.jp -meiwa.gunma.jp -midori.gunma.jp -minakami.gunma.jp -naganohara.gunma.jp -nakanojo.gunma.jp -nanmoku.gunma.jp -numata.gunma.jp -oizumi.gunma.jp -ora.gunma.jp -ota.gunma.jp -shibukawa.gunma.jp -shimonita.gunma.jp -shinto.gunma.jp -showa.gunma.jp -takasaki.gunma.jp -takayama.gunma.jp -tamamura.gunma.jp -tatebayashi.gunma.jp -tomioka.gunma.jp -tsukiyono.gunma.jp -tsumagoi.gunma.jp -ueno.gunma.jp -yoshioka.gunma.jp -asaminami.hiroshima.jp -daiwa.hiroshima.jp -etajima.hiroshima.jp -fuchu.hiroshima.jp -fukuyama.hiroshima.jp -hatsukaichi.hiroshima.jp -higashihiroshima.hiroshima.jp -hongo.hiroshima.jp -jinsekikogen.hiroshima.jp -kaita.hiroshima.jp -kui.hiroshima.jp -kumano.hiroshima.jp -kure.hiroshima.jp -mihara.hiroshima.jp -miyoshi.hiroshima.jp -naka.hiroshima.jp -onomichi.hiroshima.jp -osakikamijima.hiroshima.jp -otake.hiroshima.jp -saka.hiroshima.jp -sera.hiroshima.jp -seranishi.hiroshima.jp -shinichi.hiroshima.jp -shobara.hiroshima.jp -takehara.hiroshima.jp -abashiri.hokkaido.jp -abira.hokkaido.jp -aibetsu.hokkaido.jp -akabira.hokkaido.jp -akkeshi.hokkaido.jp -asahikawa.hokkaido.jp -ashibetsu.hokkaido.jp -ashoro.hokkaido.jp -assabu.hokkaido.jp -atsuma.hokkaido.jp -bibai.hokkaido.jp -biei.hokkaido.jp -bifuka.hokkaido.jp -bihoro.hokkaido.jp -biratori.hokkaido.jp -chippubetsu.hokkaido.jp -chitose.hokkaido.jp -date.hokkaido.jp -ebetsu.hokkaido.jp -embetsu.hokkaido.jp -eniwa.hokkaido.jp -erimo.hokkaido.jp -esan.hokkaido.jp -esashi.hokkaido.jp -fukagawa.hokkaido.jp -fukushima.hokkaido.jp -furano.hokkaido.jp -furubira.hokkaido.jp -haboro.hokkaido.jp -hakodate.hokkaido.jp -hamatonbetsu.hokkaido.jp -hidaka.hokkaido.jp -higashikagura.hokkaido.jp -higashikawa.hokkaido.jp -hiroo.hokkaido.jp -hokuryu.hokkaido.jp -hokuto.hokkaido.jp -honbetsu.hokkaido.jp -horokanai.hokkaido.jp -horonobe.hokkaido.jp -ikeda.hokkaido.jp -imakane.hokkaido.jp -ishikari.hokkaido.jp -iwamizawa.hokkaido.jp -iwanai.hokkaido.jp -kamifurano.hokkaido.jp -kamikawa.hokkaido.jp -kamishihoro.hokkaido.jp -kamisunagawa.hokkaido.jp -kamoenai.hokkaido.jp -kayabe.hokkaido.jp -kembuchi.hokkaido.jp -kikonai.hokkaido.jp -kimobetsu.hokkaido.jp -kitahiroshima.hokkaido.jp -kitami.hokkaido.jp -kiyosato.hokkaido.jp -koshimizu.hokkaido.jp -kunneppu.hokkaido.jp -kuriyama.hokkaido.jp -kuromatsunai.hokkaido.jp -kushiro.hokkaido.jp -kutchan.hokkaido.jp -kyowa.hokkaido.jp -mashike.hokkaido.jp -matsumae.hokkaido.jp -mikasa.hokkaido.jp -minamifurano.hokkaido.jp -mombetsu.hokkaido.jp -moseushi.hokkaido.jp -mukawa.hokkaido.jp -muroran.hokkaido.jp -naie.hokkaido.jp -nakagawa.hokkaido.jp -nakasatsunai.hokkaido.jp -nakatombetsu.hokkaido.jp -nanae.hokkaido.jp -nanporo.hokkaido.jp -nayoro.hokkaido.jp -nemuro.hokkaido.jp -niikappu.hokkaido.jp -niki.hokkaido.jp -nishiokoppe.hokkaido.jp -noboribetsu.hokkaido.jp -numata.hokkaido.jp -obihiro.hokkaido.jp -obira.hokkaido.jp -oketo.hokkaido.jp -okoppe.hokkaido.jp -otaru.hokkaido.jp -otobe.hokkaido.jp -otofuke.hokkaido.jp -otoineppu.hokkaido.jp -oumu.hokkaido.jp -ozora.hokkaido.jp -pippu.hokkaido.jp -rankoshi.hokkaido.jp -rebun.hokkaido.jp -rikubetsu.hokkaido.jp -rishiri.hokkaido.jp -rishirifuji.hokkaido.jp -saroma.hokkaido.jp -sarufutsu.hokkaido.jp -shakotan.hokkaido.jp -shari.hokkaido.jp -shibecha.hokkaido.jp -shibetsu.hokkaido.jp -shikabe.hokkaido.jp -shikaoi.hokkaido.jp -shimamaki.hokkaido.jp -shimizu.hokkaido.jp -shimokawa.hokkaido.jp -shinshinotsu.hokkaido.jp -shintoku.hokkaido.jp -shiranuka.hokkaido.jp -shiraoi.hokkaido.jp -shiriuchi.hokkaido.jp -sobetsu.hokkaido.jp -sunagawa.hokkaido.jp -taiki.hokkaido.jp -takasu.hokkaido.jp -takikawa.hokkaido.jp -takinoue.hokkaido.jp -teshikaga.hokkaido.jp -tobetsu.hokkaido.jp -tohma.hokkaido.jp -tomakomai.hokkaido.jp -tomari.hokkaido.jp -toya.hokkaido.jp -toyako.hokkaido.jp -toyotomi.hokkaido.jp -toyoura.hokkaido.jp -tsubetsu.hokkaido.jp -tsukigata.hokkaido.jp -urakawa.hokkaido.jp -urausu.hokkaido.jp -uryu.hokkaido.jp -utashinai.hokkaido.jp -wakkanai.hokkaido.jp -wassamu.hokkaido.jp -yakumo.hokkaido.jp -yoichi.hokkaido.jp -aioi.hyogo.jp -akashi.hyogo.jp -ako.hyogo.jp -amagasaki.hyogo.jp -aogaki.hyogo.jp -asago.hyogo.jp -ashiya.hyogo.jp -awaji.hyogo.jp -fukusaki.hyogo.jp -goshiki.hyogo.jp -harima.hyogo.jp -himeji.hyogo.jp -ichikawa.hyogo.jp -inagawa.hyogo.jp -itami.hyogo.jp -kakogawa.hyogo.jp -kamigori.hyogo.jp -kamikawa.hyogo.jp -kasai.hyogo.jp -kasuga.hyogo.jp -kawanishi.hyogo.jp -miki.hyogo.jp -minamiawaji.hyogo.jp -nishinomiya.hyogo.jp -nishiwaki.hyogo.jp -ono.hyogo.jp -sanda.hyogo.jp -sannan.hyogo.jp -sasayama.hyogo.jp -sayo.hyogo.jp -shingu.hyogo.jp -shinonsen.hyogo.jp -shiso.hyogo.jp -sumoto.hyogo.jp -taishi.hyogo.jp -taka.hyogo.jp -takarazuka.hyogo.jp -takasago.hyogo.jp -takino.hyogo.jp -tamba.hyogo.jp -tatsuno.hyogo.jp -toyooka.hyogo.jp -yabu.hyogo.jp -yashiro.hyogo.jp -yoka.hyogo.jp -yokawa.hyogo.jp -ami.ibaraki.jp -asahi.ibaraki.jp -bando.ibaraki.jp -chikusei.ibaraki.jp -daigo.ibaraki.jp -fujishiro.ibaraki.jp -hitachi.ibaraki.jp -hitachinaka.ibaraki.jp -hitachiomiya.ibaraki.jp -hitachiota.ibaraki.jp -ibaraki.ibaraki.jp -ina.ibaraki.jp -inashiki.ibaraki.jp -itako.ibaraki.jp -iwama.ibaraki.jp -joso.ibaraki.jp -kamisu.ibaraki.jp -kasama.ibaraki.jp -kashima.ibaraki.jp -kasumigaura.ibaraki.jp -koga.ibaraki.jp -miho.ibaraki.jp -mito.ibaraki.jp -moriya.ibaraki.jp -naka.ibaraki.jp -namegata.ibaraki.jp -oarai.ibaraki.jp -ogawa.ibaraki.jp -omitama.ibaraki.jp -ryugasaki.ibaraki.jp -sakai.ibaraki.jp -sakuragawa.ibaraki.jp -shimodate.ibaraki.jp -shimotsuma.ibaraki.jp -shirosato.ibaraki.jp -sowa.ibaraki.jp -suifu.ibaraki.jp -takahagi.ibaraki.jp -tamatsukuri.ibaraki.jp -tokai.ibaraki.jp -tomobe.ibaraki.jp -tone.ibaraki.jp -toride.ibaraki.jp -tsuchiura.ibaraki.jp -tsukuba.ibaraki.jp -uchihara.ibaraki.jp -ushiku.ibaraki.jp -yachiyo.ibaraki.jp -yamagata.ibaraki.jp -yawara.ibaraki.jp -yuki.ibaraki.jp -anamizu.ishikawa.jp -hakui.ishikawa.jp -hakusan.ishikawa.jp -kaga.ishikawa.jp -kahoku.ishikawa.jp -kanazawa.ishikawa.jp -kawakita.ishikawa.jp -komatsu.ishikawa.jp -nakanoto.ishikawa.jp -nanao.ishikawa.jp -nomi.ishikawa.jp -nonoichi.ishikawa.jp -noto.ishikawa.jp -shika.ishikawa.jp -suzu.ishikawa.jp -tsubata.ishikawa.jp -tsurugi.ishikawa.jp -uchinada.ishikawa.jp -wajima.ishikawa.jp -fudai.iwate.jp -fujisawa.iwate.jp -hanamaki.iwate.jp -hiraizumi.iwate.jp -hirono.iwate.jp -ichinohe.iwate.jp -ichinoseki.iwate.jp -iwaizumi.iwate.jp -iwate.iwate.jp -joboji.iwate.jp -kamaishi.iwate.jp -kanegasaki.iwate.jp -karumai.iwate.jp -kawai.iwate.jp -kitakami.iwate.jp -kuji.iwate.jp -kunohe.iwate.jp -kuzumaki.iwate.jp -miyako.iwate.jp -mizusawa.iwate.jp -morioka.iwate.jp -ninohe.iwate.jp -noda.iwate.jp -ofunato.iwate.jp -oshu.iwate.jp -otsuchi.iwate.jp -rikuzentakata.iwate.jp -shiwa.iwate.jp -shizukuishi.iwate.jp -sumita.iwate.jp -tanohata.iwate.jp -tono.iwate.jp -yahaba.iwate.jp -yamada.iwate.jp -ayagawa.kagawa.jp -higashikagawa.kagawa.jp -kanonji.kagawa.jp -kotohira.kagawa.jp -manno.kagawa.jp -marugame.kagawa.jp -mitoyo.kagawa.jp -naoshima.kagawa.jp -sanuki.kagawa.jp -tadotsu.kagawa.jp -takamatsu.kagawa.jp -tonosho.kagawa.jp -uchinomi.kagawa.jp -utazu.kagawa.jp -zentsuji.kagawa.jp -akune.kagoshima.jp -amami.kagoshima.jp -hioki.kagoshima.jp -isa.kagoshima.jp -isen.kagoshima.jp -izumi.kagoshima.jp -kagoshima.kagoshima.jp -kanoya.kagoshima.jp -kawanabe.kagoshima.jp -kinko.kagoshima.jp -kouyama.kagoshima.jp -makurazaki.kagoshima.jp -matsumoto.kagoshima.jp -minamitane.kagoshima.jp -nakatane.kagoshima.jp -nishinoomote.kagoshima.jp -satsumasendai.kagoshima.jp -soo.kagoshima.jp -tarumizu.kagoshima.jp -yusui.kagoshima.jp -aikawa.kanagawa.jp -atsugi.kanagawa.jp -ayase.kanagawa.jp -chigasaki.kanagawa.jp -ebina.kanagawa.jp -fujisawa.kanagawa.jp -hadano.kanagawa.jp -hakone.kanagawa.jp -hiratsuka.kanagawa.jp -isehara.kanagawa.jp -kaisei.kanagawa.jp -kamakura.kanagawa.jp -kiyokawa.kanagawa.jp -matsuda.kanagawa.jp -minamiashigara.kanagawa.jp -miura.kanagawa.jp -nakai.kanagawa.jp -ninomiya.kanagawa.jp -odawara.kanagawa.jp -oi.kanagawa.jp -oiso.kanagawa.jp -sagamihara.kanagawa.jp -samukawa.kanagawa.jp -tsukui.kanagawa.jp -yamakita.kanagawa.jp -yamato.kanagawa.jp -yokosuka.kanagawa.jp -yugawara.kanagawa.jp -zama.kanagawa.jp -zushi.kanagawa.jp -aki.kochi.jp -geisei.kochi.jp -hidaka.kochi.jp -higashitsuno.kochi.jp -ino.kochi.jp -kagami.kochi.jp -kami.kochi.jp -kitagawa.kochi.jp -kochi.kochi.jp -mihara.kochi.jp -motoyama.kochi.jp -muroto.kochi.jp -nahari.kochi.jp -nakamura.kochi.jp -nankoku.kochi.jp -nishitosa.kochi.jp -niyodogawa.kochi.jp -ochi.kochi.jp -okawa.kochi.jp -otoyo.kochi.jp -otsuki.kochi.jp -sakawa.kochi.jp -sukumo.kochi.jp -susaki.kochi.jp -tosa.kochi.jp -tosashimizu.kochi.jp -toyo.kochi.jp -tsuno.kochi.jp -umaji.kochi.jp -yasuda.kochi.jp -yusuhara.kochi.jp -amakusa.kumamoto.jp -arao.kumamoto.jp -aso.kumamoto.jp -choyo.kumamoto.jp -gyokuto.kumamoto.jp -hitoyoshi.kumamoto.jp -kamiamakusa.kumamoto.jp -kashima.kumamoto.jp -kikuchi.kumamoto.jp -kosa.kumamoto.jp -kumamoto.kumamoto.jp -mashiki.kumamoto.jp -mifune.kumamoto.jp -minamata.kumamoto.jp -minamioguni.kumamoto.jp -nagasu.kumamoto.jp -nishihara.kumamoto.jp -oguni.kumamoto.jp -ozu.kumamoto.jp -sumoto.kumamoto.jp -takamori.kumamoto.jp -uki.kumamoto.jp -uto.kumamoto.jp -yamaga.kumamoto.jp -yamato.kumamoto.jp -yatsushiro.kumamoto.jp -ayabe.kyoto.jp -fukuchiyama.kyoto.jp -higashiyama.kyoto.jp -ide.kyoto.jp -ine.kyoto.jp -joyo.kyoto.jp -kameoka.kyoto.jp -kamo.kyoto.jp -kita.kyoto.jp -kizu.kyoto.jp -kumiyama.kyoto.jp -kyotamba.kyoto.jp -kyotanabe.kyoto.jp -kyotango.kyoto.jp -maizuru.kyoto.jp -minami.kyoto.jp -minamiyamashiro.kyoto.jp -miyazu.kyoto.jp -muko.kyoto.jp -nagaokakyo.kyoto.jp -nakagyo.kyoto.jp -nantan.kyoto.jp -oyamazaki.kyoto.jp -sakyo.kyoto.jp -seika.kyoto.jp -tanabe.kyoto.jp -uji.kyoto.jp -ujitawara.kyoto.jp -wazuka.kyoto.jp -yamashina.kyoto.jp -yawata.kyoto.jp -asahi.mie.jp -inabe.mie.jp -ise.mie.jp -kameyama.mie.jp -kawagoe.mie.jp -kiho.mie.jp -kisosaki.mie.jp -kiwa.mie.jp -komono.mie.jp -kumano.mie.jp -kuwana.mie.jp -matsusaka.mie.jp -meiwa.mie.jp -mihama.mie.jp -minamiise.mie.jp -misugi.mie.jp -miyama.mie.jp -nabari.mie.jp -shima.mie.jp -suzuka.mie.jp -tado.mie.jp -taiki.mie.jp -taki.mie.jp -tamaki.mie.jp -toba.mie.jp -tsu.mie.jp -udono.mie.jp -ureshino.mie.jp -watarai.mie.jp -yokkaichi.mie.jp -furukawa.miyagi.jp -higashimatsushima.miyagi.jp -ishinomaki.miyagi.jp -iwanuma.miyagi.jp -kakuda.miyagi.jp -kami.miyagi.jp -kawasaki.miyagi.jp -kesennuma.miyagi.jp -marumori.miyagi.jp -matsushima.miyagi.jp -minamisanriku.miyagi.jp -misato.miyagi.jp -murata.miyagi.jp -natori.miyagi.jp -ogawara.miyagi.jp -ohira.miyagi.jp -onagawa.miyagi.jp -osaki.miyagi.jp -rifu.miyagi.jp -semine.miyagi.jp -shibata.miyagi.jp -shichikashuku.miyagi.jp -shikama.miyagi.jp -shiogama.miyagi.jp -shiroishi.miyagi.jp -tagajo.miyagi.jp -taiwa.miyagi.jp -tome.miyagi.jp -tomiya.miyagi.jp -wakuya.miyagi.jp -watari.miyagi.jp -yamamoto.miyagi.jp -zao.miyagi.jp -aya.miyazaki.jp -ebino.miyazaki.jp -gokase.miyazaki.jp -hyuga.miyazaki.jp -kadogawa.miyazaki.jp -kawaminami.miyazaki.jp -kijo.miyazaki.jp -kitagawa.miyazaki.jp -kitakata.miyazaki.jp -kitaura.miyazaki.jp -kobayashi.miyazaki.jp -kunitomi.miyazaki.jp -kushima.miyazaki.jp -mimata.miyazaki.jp -miyakonojo.miyazaki.jp -miyazaki.miyazaki.jp -morotsuka.miyazaki.jp -nichinan.miyazaki.jp -nishimera.miyazaki.jp -nobeoka.miyazaki.jp -saito.miyazaki.jp -shiiba.miyazaki.jp -shintomi.miyazaki.jp -takaharu.miyazaki.jp -takanabe.miyazaki.jp -takazaki.miyazaki.jp -tsuno.miyazaki.jp -achi.nagano.jp -agematsu.nagano.jp -anan.nagano.jp -aoki.nagano.jp -asahi.nagano.jp -azumino.nagano.jp -chikuhoku.nagano.jp -chikuma.nagano.jp -chino.nagano.jp -fujimi.nagano.jp -hakuba.nagano.jp -hara.nagano.jp -hiraya.nagano.jp -iida.nagano.jp -iijima.nagano.jp -iiyama.nagano.jp -iizuna.nagano.jp -ikeda.nagano.jp -ikusaka.nagano.jp -ina.nagano.jp -karuizawa.nagano.jp -kawakami.nagano.jp -kiso.nagano.jp -kisofukushima.nagano.jp -kitaaiki.nagano.jp -komagane.nagano.jp -komoro.nagano.jp -matsukawa.nagano.jp -matsumoto.nagano.jp -miasa.nagano.jp -minamiaiki.nagano.jp -minamimaki.nagano.jp -minamiminowa.nagano.jp -minowa.nagano.jp -miyada.nagano.jp -miyota.nagano.jp -mochizuki.nagano.jp -nagano.nagano.jp -nagawa.nagano.jp -nagiso.nagano.jp -nakagawa.nagano.jp -nakano.nagano.jp -nozawaonsen.nagano.jp -obuse.nagano.jp -ogawa.nagano.jp -okaya.nagano.jp -omachi.nagano.jp -omi.nagano.jp -ookuwa.nagano.jp -ooshika.nagano.jp -otaki.nagano.jp -otari.nagano.jp -sakae.nagano.jp -sakaki.nagano.jp -saku.nagano.jp -sakuho.nagano.jp -shimosuwa.nagano.jp -shinanomachi.nagano.jp -shiojiri.nagano.jp -suwa.nagano.jp -suzaka.nagano.jp -takagi.nagano.jp -takamori.nagano.jp -takayama.nagano.jp -tateshina.nagano.jp -tatsuno.nagano.jp -togakushi.nagano.jp -togura.nagano.jp -tomi.nagano.jp -ueda.nagano.jp -wada.nagano.jp -yamagata.nagano.jp -yamanouchi.nagano.jp -yasaka.nagano.jp -yasuoka.nagano.jp -chijiwa.nagasaki.jp -futsu.nagasaki.jp -goto.nagasaki.jp -hasami.nagasaki.jp -hirado.nagasaki.jp -iki.nagasaki.jp -isahaya.nagasaki.jp -kawatana.nagasaki.jp -kuchinotsu.nagasaki.jp -matsuura.nagasaki.jp -nagasaki.nagasaki.jp -obama.nagasaki.jp -omura.nagasaki.jp -oseto.nagasaki.jp -saikai.nagasaki.jp -sasebo.nagasaki.jp -seihi.nagasaki.jp -shimabara.nagasaki.jp -shinkamigoto.nagasaki.jp -togitsu.nagasaki.jp -tsushima.nagasaki.jp -unzen.nagasaki.jp -ando.nara.jp -gose.nara.jp -heguri.nara.jp -higashiyoshino.nara.jp -ikaruga.nara.jp -ikoma.nara.jp -kamikitayama.nara.jp -kanmaki.nara.jp -kashiba.nara.jp -kashihara.nara.jp -katsuragi.nara.jp -kawai.nara.jp -kawakami.nara.jp -kawanishi.nara.jp -koryo.nara.jp -kurotaki.nara.jp -mitsue.nara.jp -miyake.nara.jp -nara.nara.jp -nosegawa.nara.jp -oji.nara.jp -ouda.nara.jp -oyodo.nara.jp -sakurai.nara.jp -sango.nara.jp -shimoichi.nara.jp -shimokitayama.nara.jp -shinjo.nara.jp -soni.nara.jp -takatori.nara.jp -tawaramoto.nara.jp -tenkawa.nara.jp -tenri.nara.jp -uda.nara.jp -yamatokoriyama.nara.jp -yamatotakada.nara.jp -yamazoe.nara.jp -yoshino.nara.jp -aga.niigata.jp -agano.niigata.jp -gosen.niigata.jp -itoigawa.niigata.jp -izumozaki.niigata.jp -joetsu.niigata.jp -kamo.niigata.jp -kariwa.niigata.jp -kashiwazaki.niigata.jp -minamiuonuma.niigata.jp -mitsuke.niigata.jp -muika.niigata.jp -murakami.niigata.jp -myoko.niigata.jp -nagaoka.niigata.jp -niigata.niigata.jp -ojiya.niigata.jp -omi.niigata.jp -sado.niigata.jp -sanjo.niigata.jp -seiro.niigata.jp -seirou.niigata.jp -sekikawa.niigata.jp -shibata.niigata.jp -tagami.niigata.jp -tainai.niigata.jp -tochio.niigata.jp -tokamachi.niigata.jp -tsubame.niigata.jp -tsunan.niigata.jp -uonuma.niigata.jp -yahiko.niigata.jp -yoita.niigata.jp -yuzawa.niigata.jp -beppu.oita.jp -bungoono.oita.jp -bungotakada.oita.jp -hasama.oita.jp -hiji.oita.jp -himeshima.oita.jp -hita.oita.jp -kamitsue.oita.jp -kokonoe.oita.jp -kuju.oita.jp -kunisaki.oita.jp -kusu.oita.jp -oita.oita.jp -saiki.oita.jp -taketa.oita.jp -tsukumi.oita.jp -usa.oita.jp -usuki.oita.jp -yufu.oita.jp -akaiwa.okayama.jp -asakuchi.okayama.jp -bizen.okayama.jp -hayashima.okayama.jp -ibara.okayama.jp -kagamino.okayama.jp -kasaoka.okayama.jp -kibichuo.okayama.jp -kumenan.okayama.jp -kurashiki.okayama.jp -maniwa.okayama.jp -misaki.okayama.jp -nagi.okayama.jp -niimi.okayama.jp -nishiawakura.okayama.jp -okayama.okayama.jp -satosho.okayama.jp -setouchi.okayama.jp -shinjo.okayama.jp -shoo.okayama.jp -soja.okayama.jp -takahashi.okayama.jp -tamano.okayama.jp -tsuyama.okayama.jp -wake.okayama.jp -yakage.okayama.jp -aguni.okinawa.jp -ginowan.okinawa.jp -ginoza.okinawa.jp -gushikami.okinawa.jp -haebaru.okinawa.jp -higashi.okinawa.jp -hirara.okinawa.jp -iheya.okinawa.jp -ishigaki.okinawa.jp -ishikawa.okinawa.jp -itoman.okinawa.jp -izena.okinawa.jp -kadena.okinawa.jp -kin.okinawa.jp -kitadaito.okinawa.jp -kitanakagusuku.okinawa.jp -kumejima.okinawa.jp -kunigami.okinawa.jp -minamidaito.okinawa.jp -motobu.okinawa.jp -nago.okinawa.jp -naha.okinawa.jp -nakagusuku.okinawa.jp -nakijin.okinawa.jp -nanjo.okinawa.jp -nishihara.okinawa.jp -ogimi.okinawa.jp -okinawa.okinawa.jp -onna.okinawa.jp -shimoji.okinawa.jp -taketomi.okinawa.jp -tarama.okinawa.jp -tokashiki.okinawa.jp -tomigusuku.okinawa.jp -tonaki.okinawa.jp -urasoe.okinawa.jp -uruma.okinawa.jp -yaese.okinawa.jp -yomitan.okinawa.jp -yonabaru.okinawa.jp -yonaguni.okinawa.jp -zamami.okinawa.jp -abeno.osaka.jp -chihayaakasaka.osaka.jp -chuo.osaka.jp -daito.osaka.jp -fujiidera.osaka.jp -habikino.osaka.jp -hannan.osaka.jp -higashiosaka.osaka.jp -higashisumiyoshi.osaka.jp -higashiyodogawa.osaka.jp -hirakata.osaka.jp -ibaraki.osaka.jp -ikeda.osaka.jp -izumi.osaka.jp -izumiotsu.osaka.jp -izumisano.osaka.jp -kadoma.osaka.jp -kaizuka.osaka.jp -kanan.osaka.jp -kashiwara.osaka.jp -katano.osaka.jp -kawachinagano.osaka.jp -kishiwada.osaka.jp -kita.osaka.jp -kumatori.osaka.jp -matsubara.osaka.jp -minato.osaka.jp -minoh.osaka.jp -misaki.osaka.jp -moriguchi.osaka.jp -neyagawa.osaka.jp -nishi.osaka.jp -nose.osaka.jp -osakasayama.osaka.jp -sakai.osaka.jp -sayama.osaka.jp -sennan.osaka.jp -settsu.osaka.jp -shijonawate.osaka.jp -shimamoto.osaka.jp -suita.osaka.jp -tadaoka.osaka.jp -taishi.osaka.jp -tajiri.osaka.jp -takaishi.osaka.jp -takatsuki.osaka.jp -tondabayashi.osaka.jp -toyonaka.osaka.jp -toyono.osaka.jp -yao.osaka.jp -ariake.saga.jp -arita.saga.jp -fukudomi.saga.jp -genkai.saga.jp -hamatama.saga.jp -hizen.saga.jp -imari.saga.jp -kamimine.saga.jp -kanzaki.saga.jp -karatsu.saga.jp -kashima.saga.jp -kitagata.saga.jp -kitahata.saga.jp -kiyama.saga.jp -kouhoku.saga.jp -kyuragi.saga.jp -nishiarita.saga.jp -ogi.saga.jp -omachi.saga.jp -ouchi.saga.jp -saga.saga.jp -shiroishi.saga.jp -taku.saga.jp -tara.saga.jp -tosu.saga.jp -yoshinogari.saga.jp -arakawa.saitama.jp -asaka.saitama.jp -chichibu.saitama.jp -fujimi.saitama.jp -fujimino.saitama.jp -fukaya.saitama.jp -hanno.saitama.jp -hanyu.saitama.jp -hasuda.saitama.jp -hatogaya.saitama.jp -hatoyama.saitama.jp -hidaka.saitama.jp -higashichichibu.saitama.jp -higashimatsuyama.saitama.jp -honjo.saitama.jp -ina.saitama.jp -iruma.saitama.jp -iwatsuki.saitama.jp -kamiizumi.saitama.jp -kamikawa.saitama.jp -kamisato.saitama.jp -kasukabe.saitama.jp -kawagoe.saitama.jp -kawaguchi.saitama.jp -kawajima.saitama.jp -kazo.saitama.jp -kitamoto.saitama.jp -koshigaya.saitama.jp -kounosu.saitama.jp -kuki.saitama.jp -kumagaya.saitama.jp -matsubushi.saitama.jp -minano.saitama.jp -misato.saitama.jp -miyashiro.saitama.jp -miyoshi.saitama.jp -moroyama.saitama.jp -nagatoro.saitama.jp -namegawa.saitama.jp -niiza.saitama.jp -ogano.saitama.jp -ogawa.saitama.jp -ogose.saitama.jp -okegawa.saitama.jp -omiya.saitama.jp -otaki.saitama.jp -ranzan.saitama.jp -ryokami.saitama.jp -saitama.saitama.jp -sakado.saitama.jp -satte.saitama.jp -sayama.saitama.jp -shiki.saitama.jp -shiraoka.saitama.jp -soka.saitama.jp -sugito.saitama.jp -toda.saitama.jp -tokigawa.saitama.jp -tokorozawa.saitama.jp -tsurugashima.saitama.jp -urawa.saitama.jp -warabi.saitama.jp -yashio.saitama.jp -yokoze.saitama.jp -yono.saitama.jp -yorii.saitama.jp -yoshida.saitama.jp -yoshikawa.saitama.jp -yoshimi.saitama.jp -aisho.shiga.jp -gamo.shiga.jp -higashiomi.shiga.jp -hikone.shiga.jp -koka.shiga.jp -konan.shiga.jp -kosei.shiga.jp -koto.shiga.jp -kusatsu.shiga.jp -maibara.shiga.jp -moriyama.shiga.jp -nagahama.shiga.jp -nishiazai.shiga.jp -notogawa.shiga.jp -omihachiman.shiga.jp -otsu.shiga.jp -ritto.shiga.jp -ryuoh.shiga.jp -takashima.shiga.jp -takatsuki.shiga.jp -torahime.shiga.jp -toyosato.shiga.jp -yasu.shiga.jp -akagi.shimane.jp -ama.shimane.jp -gotsu.shimane.jp -hamada.shimane.jp -higashiizumo.shimane.jp -hikawa.shimane.jp -hikimi.shimane.jp -izumo.shimane.jp -kakinoki.shimane.jp -masuda.shimane.jp -matsue.shimane.jp -misato.shimane.jp -nishinoshima.shimane.jp -ohda.shimane.jp -okinoshima.shimane.jp -okuizumo.shimane.jp -shimane.shimane.jp -tamayu.shimane.jp -tsuwano.shimane.jp -unnan.shimane.jp -yakumo.shimane.jp -yasugi.shimane.jp -yatsuka.shimane.jp -arai.shizuoka.jp -atami.shizuoka.jp -fuji.shizuoka.jp -fujieda.shizuoka.jp -fujikawa.shizuoka.jp -fujinomiya.shizuoka.jp -fukuroi.shizuoka.jp -gotemba.shizuoka.jp -haibara.shizuoka.jp -hamamatsu.shizuoka.jp -higashiizu.shizuoka.jp -ito.shizuoka.jp -iwata.shizuoka.jp -izu.shizuoka.jp -izunokuni.shizuoka.jp -kakegawa.shizuoka.jp -kannami.shizuoka.jp -kawanehon.shizuoka.jp -kawazu.shizuoka.jp -kikugawa.shizuoka.jp -kosai.shizuoka.jp -makinohara.shizuoka.jp -matsuzaki.shizuoka.jp -minamiizu.shizuoka.jp -mishima.shizuoka.jp -morimachi.shizuoka.jp -nishiizu.shizuoka.jp -numazu.shizuoka.jp -omaezaki.shizuoka.jp -shimada.shizuoka.jp -shimizu.shizuoka.jp -shimoda.shizuoka.jp -shizuoka.shizuoka.jp -susono.shizuoka.jp -yaizu.shizuoka.jp -yoshida.shizuoka.jp -ashikaga.tochigi.jp -bato.tochigi.jp -haga.tochigi.jp -ichikai.tochigi.jp -iwafune.tochigi.jp -kaminokawa.tochigi.jp -kanuma.tochigi.jp -karasuyama.tochigi.jp -kuroiso.tochigi.jp -mashiko.tochigi.jp -mibu.tochigi.jp -moka.tochigi.jp -motegi.tochigi.jp -nasu.tochigi.jp -nasushiobara.tochigi.jp -nikko.tochigi.jp -nishikata.tochigi.jp -nogi.tochigi.jp -ohira.tochigi.jp -ohtawara.tochigi.jp -oyama.tochigi.jp -sakura.tochigi.jp -sano.tochigi.jp -shimotsuke.tochigi.jp -shioya.tochigi.jp -takanezawa.tochigi.jp -tochigi.tochigi.jp -tsuga.tochigi.jp -ujiie.tochigi.jp -utsunomiya.tochigi.jp -yaita.tochigi.jp -aizumi.tokushima.jp -anan.tokushima.jp -ichiba.tokushima.jp -itano.tokushima.jp -kainan.tokushima.jp -komatsushima.tokushima.jp -matsushige.tokushima.jp -mima.tokushima.jp -minami.tokushima.jp -miyoshi.tokushima.jp -mugi.tokushima.jp -nakagawa.tokushima.jp -naruto.tokushima.jp -sanagochi.tokushima.jp -shishikui.tokushima.jp -tokushima.tokushima.jp -wajiki.tokushima.jp -adachi.tokyo.jp -akiruno.tokyo.jp -akishima.tokyo.jp -aogashima.tokyo.jp -arakawa.tokyo.jp -bunkyo.tokyo.jp -chiyoda.tokyo.jp -chofu.tokyo.jp -chuo.tokyo.jp -edogawa.tokyo.jp -fuchu.tokyo.jp -fussa.tokyo.jp -hachijo.tokyo.jp -hachioji.tokyo.jp -hamura.tokyo.jp -higashikurume.tokyo.jp -higashimurayama.tokyo.jp -higashiyamato.tokyo.jp -hino.tokyo.jp -hinode.tokyo.jp -hinohara.tokyo.jp -inagi.tokyo.jp -itabashi.tokyo.jp -katsushika.tokyo.jp -kita.tokyo.jp -kiyose.tokyo.jp -kodaira.tokyo.jp -koganei.tokyo.jp -kokubunji.tokyo.jp -komae.tokyo.jp -koto.tokyo.jp -kouzushima.tokyo.jp -kunitachi.tokyo.jp -machida.tokyo.jp -meguro.tokyo.jp -minato.tokyo.jp -mitaka.tokyo.jp -mizuho.tokyo.jp -musashimurayama.tokyo.jp -musashino.tokyo.jp -nakano.tokyo.jp -nerima.tokyo.jp -ogasawara.tokyo.jp -okutama.tokyo.jp -ome.tokyo.jp -oshima.tokyo.jp -ota.tokyo.jp -setagaya.tokyo.jp -shibuya.tokyo.jp -shinagawa.tokyo.jp -shinjuku.tokyo.jp -suginami.tokyo.jp -sumida.tokyo.jp -tachikawa.tokyo.jp -taito.tokyo.jp -tama.tokyo.jp -toshima.tokyo.jp -chizu.tottori.jp -hino.tottori.jp -kawahara.tottori.jp -koge.tottori.jp -kotoura.tottori.jp -misasa.tottori.jp -nanbu.tottori.jp -nichinan.tottori.jp -sakaiminato.tottori.jp -tottori.tottori.jp -wakasa.tottori.jp -yazu.tottori.jp -yonago.tottori.jp -asahi.toyama.jp -fuchu.toyama.jp -fukumitsu.toyama.jp -funahashi.toyama.jp -himi.toyama.jp -imizu.toyama.jp -inami.toyama.jp -johana.toyama.jp -kamiichi.toyama.jp -kurobe.toyama.jp -nakaniikawa.toyama.jp -namerikawa.toyama.jp -nanto.toyama.jp -nyuzen.toyama.jp -oyabe.toyama.jp -taira.toyama.jp -takaoka.toyama.jp -tateyama.toyama.jp -toga.toyama.jp -tonami.toyama.jp -toyama.toyama.jp -unazuki.toyama.jp -uozu.toyama.jp -yamada.toyama.jp -arida.wakayama.jp -aridagawa.wakayama.jp -gobo.wakayama.jp -hashimoto.wakayama.jp -hidaka.wakayama.jp -hirogawa.wakayama.jp -inami.wakayama.jp -iwade.wakayama.jp -kainan.wakayama.jp -kamitonda.wakayama.jp -katsuragi.wakayama.jp -kimino.wakayama.jp -kinokawa.wakayama.jp -kitayama.wakayama.jp -koya.wakayama.jp -koza.wakayama.jp -kozagawa.wakayama.jp -kudoyama.wakayama.jp -kushimoto.wakayama.jp -mihama.wakayama.jp -misato.wakayama.jp -nachikatsuura.wakayama.jp -shingu.wakayama.jp -shirahama.wakayama.jp -taiji.wakayama.jp -tanabe.wakayama.jp -wakayama.wakayama.jp -yuasa.wakayama.jp -yura.wakayama.jp -asahi.yamagata.jp -funagata.yamagata.jp -higashine.yamagata.jp -iide.yamagata.jp -kahoku.yamagata.jp -kaminoyama.yamagata.jp -kaneyama.yamagata.jp -kawanishi.yamagata.jp -mamurogawa.yamagata.jp -mikawa.yamagata.jp -murayama.yamagata.jp -nagai.yamagata.jp -nakayama.yamagata.jp -nanyo.yamagata.jp -nishikawa.yamagata.jp -obanazawa.yamagata.jp -oe.yamagata.jp -oguni.yamagata.jp -ohkura.yamagata.jp -oishida.yamagata.jp -sagae.yamagata.jp -sakata.yamagata.jp -sakegawa.yamagata.jp -shinjo.yamagata.jp -shirataka.yamagata.jp -shonai.yamagata.jp -takahata.yamagata.jp -tendo.yamagata.jp -tozawa.yamagata.jp -tsuruoka.yamagata.jp -yamagata.yamagata.jp -yamanobe.yamagata.jp -yonezawa.yamagata.jp -yuza.yamagata.jp -abu.yamaguchi.jp -hagi.yamaguchi.jp -hikari.yamaguchi.jp -hofu.yamaguchi.jp -iwakuni.yamaguchi.jp -kudamatsu.yamaguchi.jp -mitou.yamaguchi.jp -nagato.yamaguchi.jp -oshima.yamaguchi.jp -shimonoseki.yamaguchi.jp -shunan.yamaguchi.jp -tabuse.yamaguchi.jp -tokuyama.yamaguchi.jp -toyota.yamaguchi.jp -ube.yamaguchi.jp -yuu.yamaguchi.jp -chuo.yamanashi.jp -doshi.yamanashi.jp -fuefuki.yamanashi.jp -fujikawa.yamanashi.jp -fujikawaguchiko.yamanashi.jp -fujiyoshida.yamanashi.jp -hayakawa.yamanashi.jp -hokuto.yamanashi.jp -ichikawamisato.yamanashi.jp -kai.yamanashi.jp -kofu.yamanashi.jp -koshu.yamanashi.jp -kosuge.yamanashi.jp -minami-alps.yamanashi.jp -minobu.yamanashi.jp -nakamichi.yamanashi.jp -nanbu.yamanashi.jp -narusawa.yamanashi.jp -nirasaki.yamanashi.jp -nishikatsura.yamanashi.jp -oshino.yamanashi.jp -otsuki.yamanashi.jp -showa.yamanashi.jp -tabayama.yamanashi.jp -tsuru.yamanashi.jp -uenohara.yamanashi.jp -yamanakako.yamanashi.jp -yamanashi.yamanashi.jp - -// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 -*.ke - -// kg : http://www.domain.kg/dmn_n.html -kg -org.kg -net.kg -com.kg -edu.kg -gov.kg -mil.kg - -// kh : http://www.mptc.gov.kh/dns_registration.htm -*.kh - -// ki : http://www.ki/dns/index.html -ki -edu.ki -biz.ki -net.ki -org.ki -gov.ki -info.ki -com.ki - -// km : http://en.wikipedia.org/wiki/.km -// http://www.domaine.km/documents/charte.doc -km -org.km -nom.km -gov.km -prd.km -tm.km -edu.km -mil.km -ass.km -com.km -// These are only mentioned as proposed suggestions at domaine.km, but -// http://en.wikipedia.org/wiki/.km says they're available for registration: -coop.km -asso.km -presse.km -medecin.km -notaires.km -pharmaciens.km -veterinaire.km -gouv.km - -// kn : http://en.wikipedia.org/wiki/.kn -// http://www.dot.kn/domainRules.html -kn -net.kn -org.kn -edu.kn -gov.kn - -// kp : http://www.kcce.kp/en_index.php -kp -com.kp -edu.kp -gov.kp -org.kp -rep.kp -tra.kp - -// kr : http://en.wikipedia.org/wiki/.kr -// see also: http://domain.nida.or.kr/eng/registration.jsp -kr -ac.kr -co.kr -es.kr -go.kr -hs.kr -kg.kr -mil.kr -ms.kr -ne.kr -or.kr -pe.kr -re.kr -sc.kr -// kr geographical names -busan.kr -chungbuk.kr -chungnam.kr -daegu.kr -daejeon.kr -gangwon.kr -gwangju.kr -gyeongbuk.kr -gyeonggi.kr -gyeongnam.kr -incheon.kr -jeju.kr -jeonbuk.kr -jeonnam.kr -seoul.kr -ulsan.kr - -// kw : http://en.wikipedia.org/wiki/.kw -*.kw - -// ky : http://www.icta.ky/da_ky_reg_dom.php -// Confirmed by registry 2008-06-17 -ky -edu.ky -gov.ky -com.ky -org.ky -net.ky - -// kz : http://en.wikipedia.org/wiki/.kz -// see also: http://www.nic.kz/rules/index.jsp -kz -org.kz -edu.kz -net.kz -gov.kz -mil.kz -com.kz - -// la : http://en.wikipedia.org/wiki/.la -// Submitted by registry 2008-06-10 -la -int.la -net.la -info.la -edu.la -gov.la -per.la -com.la -org.la - -// lb : http://en.wikipedia.org/wiki/.lb -// Submitted by registry 2008-06-17 -lb -com.lb -edu.lb -gov.lb -net.lb -org.lb - -// lc : http://en.wikipedia.org/wiki/.lc -// see also: http://www.nic.lc/rules.htm -lc -com.lc -net.lc -co.lc -org.lc -edu.lc -gov.lc - -// li : http://en.wikipedia.org/wiki/.li -li - -// lk : http://www.nic.lk/seclevpr.html -lk -gov.lk -sch.lk -net.lk -int.lk -com.lk -org.lk -edu.lk -ngo.lk -soc.lk -web.lk -ltd.lk -assn.lk -grp.lk -hotel.lk -ac.lk - -// lr : http://psg.com/dns/lr/lr.txt -// Submitted by registry 2008-06-17 -lr -com.lr -edu.lr -gov.lr -org.lr -net.lr - -// ls : http://en.wikipedia.org/wiki/.ls -ls -co.ls -org.ls - -// lt : http://en.wikipedia.org/wiki/.lt -lt -// gov.lt : http://www.gov.lt/index_en.php -gov.lt - -// lu : http://www.dns.lu/en/ -lu - -// lv : http://www.nic.lv/DNS/En/generic.php -lv -com.lv -edu.lv -gov.lv -org.lv -mil.lv -id.lv -net.lv -asn.lv -conf.lv - -// ly : http://www.nic.ly/regulations.php -ly -com.ly -net.ly -gov.ly -plc.ly -edu.ly -sch.ly -med.ly -org.ly -id.ly - -// ma : http://en.wikipedia.org/wiki/.ma -// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf -ma -co.ma -net.ma -gov.ma -org.ma -ac.ma -press.ma - -// mc : http://www.nic.mc/ -mc -tm.mc -asso.mc - -// md : http://en.wikipedia.org/wiki/.md -md - -// me : http://en.wikipedia.org/wiki/.me -me -co.me -net.me -org.me -edu.me -ac.me -gov.me -its.me -priv.me - -// mg : http://www.nic.mg/tarif.htm -mg -org.mg -nom.mg -gov.mg -prd.mg -tm.mg -edu.mg -mil.mg -com.mg - -// mh : http://en.wikipedia.org/wiki/.mh -mh - -// mil : http://en.wikipedia.org/wiki/.mil -mil - -// mk : http://en.wikipedia.org/wiki/.mk -// see also: http://dns.marnet.net.mk/postapka.php -mk -com.mk -org.mk -net.mk -edu.mk -gov.mk -inf.mk -name.mk - -// ml : http://www.gobin.info/domainname/ml-template.doc -// see also: http://en.wikipedia.org/wiki/.ml -ml -com.ml -edu.ml -gouv.ml -gov.ml -net.ml -org.ml -presse.ml - -// mm : http://en.wikipedia.org/wiki/.mm -*.mm - -// mn : http://en.wikipedia.org/wiki/.mn -mn -gov.mn -edu.mn -org.mn - -// mo : http://www.monic.net.mo/ -mo -com.mo -net.mo -org.mo -edu.mo -gov.mo - -// mobi : http://en.wikipedia.org/wiki/.mobi -mobi - -// mp : http://www.dot.mp/ -// Confirmed by registry 2008-06-17 -mp - -// mq : http://en.wikipedia.org/wiki/.mq -mq - -// mr : http://en.wikipedia.org/wiki/.mr -mr -gov.mr - -// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf -ms -com.ms -edu.ms -gov.ms -net.ms -org.ms - -// mt : https://www.nic.org.mt/go/policy -// Submitted by registry 2013-11-19 -mt -com.mt -edu.mt -net.mt -org.mt - -// mu : http://en.wikipedia.org/wiki/.mu -mu -com.mu -net.mu -org.mu -gov.mu -ac.mu -co.mu -or.mu - -// museum : http://about.museum/naming/ -// http://index.museum/ -museum -academy.museum -agriculture.museum -air.museum -airguard.museum -alabama.museum -alaska.museum -amber.museum -ambulance.museum -american.museum -americana.museum -americanantiques.museum -americanart.museum -amsterdam.museum -and.museum -annefrank.museum -anthro.museum -anthropology.museum -antiques.museum -aquarium.museum -arboretum.museum -archaeological.museum -archaeology.museum -architecture.museum -art.museum -artanddesign.museum -artcenter.museum -artdeco.museum -arteducation.museum -artgallery.museum -arts.museum -artsandcrafts.museum -asmatart.museum -assassination.museum -assisi.museum -association.museum -astronomy.museum -atlanta.museum -austin.museum -australia.museum -automotive.museum -aviation.museum -axis.museum -badajoz.museum -baghdad.museum -bahn.museum -bale.museum -baltimore.museum -barcelona.museum -baseball.museum -basel.museum -baths.museum -bauern.museum -beauxarts.museum -beeldengeluid.museum -bellevue.museum -bergbau.museum -berkeley.museum -berlin.museum -bern.museum -bible.museum -bilbao.museum -bill.museum -birdart.museum -birthplace.museum -bonn.museum -boston.museum -botanical.museum -botanicalgarden.museum -botanicgarden.museum -botany.museum -brandywinevalley.museum -brasil.museum -bristol.museum -british.museum -britishcolumbia.museum -broadcast.museum -brunel.museum -brussel.museum -brussels.museum -bruxelles.museum -building.museum -burghof.museum -bus.museum -bushey.museum -cadaques.museum -california.museum -cambridge.museum -can.museum -canada.museum -capebreton.museum -carrier.museum -cartoonart.museum -casadelamoneda.museum -castle.museum -castres.museum -celtic.museum -center.museum -chattanooga.museum -cheltenham.museum -chesapeakebay.museum -chicago.museum -children.museum -childrens.museum -childrensgarden.museum -chiropractic.museum -chocolate.museum -christiansburg.museum -cincinnati.museum -cinema.museum -circus.museum -civilisation.museum -civilization.museum -civilwar.museum -clinton.museum -clock.museum -coal.museum -coastaldefence.museum -cody.museum -coldwar.museum -collection.museum -colonialwilliamsburg.museum -coloradoplateau.museum -columbia.museum -columbus.museum -communication.museum -communications.museum -community.museum -computer.museum -computerhistory.museum -comunicações.museum -contemporary.museum -contemporaryart.museum -convent.museum -copenhagen.museum -corporation.museum -correios-e-telecomunicações.museum -corvette.museum -costume.museum -countryestate.museum -county.museum -crafts.museum -cranbrook.museum -creation.museum -cultural.museum -culturalcenter.museum -culture.museum -cyber.museum -cymru.museum -dali.museum -dallas.museum -database.museum -ddr.museum -decorativearts.museum -delaware.museum -delmenhorst.museum -denmark.museum -depot.museum -design.museum -detroit.museum -dinosaur.museum -discovery.museum -dolls.museum -donostia.museum -durham.museum -eastafrica.museum -eastcoast.museum -education.museum -educational.museum -egyptian.museum -eisenbahn.museum -elburg.museum -elvendrell.museum -embroidery.museum -encyclopedic.museum -england.museum -entomology.museum -environment.museum -environmentalconservation.museum -epilepsy.museum -essex.museum -estate.museum -ethnology.museum -exeter.museum -exhibition.museum -family.museum -farm.museum -farmequipment.museum -farmers.museum -farmstead.museum -field.museum -figueres.museum -filatelia.museum -film.museum -fineart.museum -finearts.museum -finland.museum -flanders.museum -florida.museum -force.museum -fortmissoula.museum -fortworth.museum -foundation.museum -francaise.museum -frankfurt.museum -franziskaner.museum -freemasonry.museum -freiburg.museum -fribourg.museum -frog.museum -fundacio.museum -furniture.museum -gallery.museum -garden.museum -gateway.museum -geelvinck.museum -gemological.museum -geology.museum -georgia.museum -giessen.museum -glas.museum -glass.museum -gorge.museum -grandrapids.museum -graz.museum -guernsey.museum -halloffame.museum -hamburg.museum -handson.museum -harvestcelebration.museum -hawaii.museum -health.museum -heimatunduhren.museum -hellas.museum -helsinki.museum -hembygdsforbund.museum -heritage.museum -histoire.museum -historical.museum -historicalsociety.museum -historichouses.museum -historisch.museum -historisches.museum -history.museum -historyofscience.museum -horology.museum -house.museum -humanities.museum -illustration.museum -imageandsound.museum -indian.museum -indiana.museum -indianapolis.museum -indianmarket.museum -intelligence.museum -interactive.museum -iraq.museum -iron.museum -isleofman.museum -jamison.museum -jefferson.museum -jerusalem.museum -jewelry.museum -jewish.museum -jewishart.museum -jfk.museum -journalism.museum -judaica.museum -judygarland.museum -juedisches.museum -juif.museum -karate.museum -karikatur.museum -kids.museum -koebenhavn.museum -koeln.museum -kunst.museum -kunstsammlung.museum -kunstunddesign.museum -labor.museum -labour.museum -lajolla.museum -lancashire.museum -landes.museum -lans.museum -läns.museum -larsson.museum -lewismiller.museum -lincoln.museum -linz.museum -living.museum -livinghistory.museum -localhistory.museum -london.museum -losangeles.museum -louvre.museum -loyalist.museum -lucerne.museum -luxembourg.museum -luzern.museum -mad.museum -madrid.museum -mallorca.museum -manchester.museum -mansion.museum -mansions.museum -manx.museum -marburg.museum -maritime.museum -maritimo.museum -maryland.museum -marylhurst.museum -media.museum -medical.museum -medizinhistorisches.museum -meeres.museum -memorial.museum -mesaverde.museum -michigan.museum -midatlantic.museum -military.museum -mill.museum -miners.museum -mining.museum -minnesota.museum -missile.museum -missoula.museum -modern.museum -moma.museum -money.museum -monmouth.museum -monticello.museum -montreal.museum -moscow.museum -motorcycle.museum -muenchen.museum -muenster.museum -mulhouse.museum -muncie.museum -museet.museum -museumcenter.museum -museumvereniging.museum -music.museum -national.museum -nationalfirearms.museum -nationalheritage.museum -nativeamerican.museum -naturalhistory.museum -naturalhistorymuseum.museum -naturalsciences.museum -nature.museum -naturhistorisches.museum -natuurwetenschappen.museum -naumburg.museum -naval.museum -nebraska.museum -neues.museum -newhampshire.museum -newjersey.museum -newmexico.museum -newport.museum -newspaper.museum -newyork.museum -niepce.museum -norfolk.museum -north.museum -nrw.museum -nuernberg.museum -nuremberg.museum -nyc.museum -nyny.museum -oceanographic.museum -oceanographique.museum -omaha.museum -online.museum -ontario.museum -openair.museum -oregon.museum -oregontrail.museum -otago.museum -oxford.museum -pacific.museum -paderborn.museum -palace.museum -paleo.museum -palmsprings.museum -panama.museum -paris.museum -pasadena.museum -pharmacy.museum -philadelphia.museum -philadelphiaarea.museum -philately.museum -phoenix.museum -photography.museum -pilots.museum -pittsburgh.museum -planetarium.museum -plantation.museum -plants.museum -plaza.museum -portal.museum -portland.museum -portlligat.museum -posts-and-telecommunications.museum -preservation.museum -presidio.museum -press.museum -project.museum -public.museum -pubol.museum -quebec.museum -railroad.museum -railway.museum -research.museum -resistance.museum -riodejaneiro.museum -rochester.museum -rockart.museum -roma.museum -russia.museum -saintlouis.museum -salem.museum -salvadordali.museum -salzburg.museum -sandiego.museum -sanfrancisco.museum -santabarbara.museum -santacruz.museum -santafe.museum -saskatchewan.museum -satx.museum -savannahga.museum -schlesisches.museum -schoenbrunn.museum -schokoladen.museum -school.museum -schweiz.museum -science.museum -scienceandhistory.museum -scienceandindustry.museum -sciencecenter.museum -sciencecenters.museum -science-fiction.museum -sciencehistory.museum -sciences.museum -sciencesnaturelles.museum -scotland.museum -seaport.museum -settlement.museum -settlers.museum -shell.museum -sherbrooke.museum -sibenik.museum -silk.museum -ski.museum -skole.museum -society.museum -sologne.museum -soundandvision.museum -southcarolina.museum -southwest.museum -space.museum -spy.museum -square.museum -stadt.museum -stalbans.museum -starnberg.museum -state.museum -stateofdelaware.museum -station.museum -steam.museum -steiermark.museum -stjohn.museum -stockholm.museum -stpetersburg.museum -stuttgart.museum -suisse.museum -surgeonshall.museum -surrey.museum -svizzera.museum -sweden.museum -sydney.museum -tank.museum -tcm.museum -technology.museum -telekommunikation.museum -television.museum -texas.museum -textile.museum -theater.museum -time.museum -timekeeping.museum -topology.museum -torino.museum -touch.museum -town.museum -transport.museum -tree.museum -trolley.museum -trust.museum -trustee.museum -uhren.museum -ulm.museum -undersea.museum -university.museum -usa.museum -usantiques.museum -usarts.museum -uscountryestate.museum -usculture.museum -usdecorativearts.museum -usgarden.museum -ushistory.museum -ushuaia.museum -uslivinghistory.museum -utah.museum -uvic.museum -valley.museum -vantaa.museum -versailles.museum -viking.museum -village.museum -virginia.museum -virtual.museum -virtuel.museum -vlaanderen.museum -volkenkunde.museum -wales.museum -wallonie.museum -war.museum -washingtondc.museum -watchandclock.museum -watch-and-clock.museum -western.museum -westfalen.museum -whaling.museum -wildlife.museum -williamsburg.museum -windmill.museum -workshop.museum -york.museum -yorkshire.museum -yosemite.museum -youth.museum -zoological.museum -zoology.museum -ירושלים.museum -иком.museum - -// mv : http://en.wikipedia.org/wiki/.mv -// "mv" included because, contra Wikipedia, google.mv exists. -mv -aero.mv -biz.mv -com.mv -coop.mv -edu.mv -gov.mv -info.mv -int.mv -mil.mv -museum.mv -name.mv -net.mv -org.mv -pro.mv - -// mw : http://www.registrar.mw/ -mw -ac.mw -biz.mw -co.mw -com.mw -coop.mw -edu.mw -gov.mw -int.mw -museum.mw -net.mw -org.mw - -// mx : http://www.nic.mx/ -// Submitted by registry 2008-06-19 -mx -com.mx -org.mx -gob.mx -edu.mx -net.mx - -// my : http://www.mynic.net.my/ -my -com.my -net.my -org.my -gov.my -edu.my -mil.my -name.my - -// mz : http://www.gobin.info/domainname/mz-template.doc -*.mz -!teledata.mz - -// na : http://www.na-nic.com.na/ -// http://www.info.na/domain/ -na -info.na -pro.na -name.na -school.na -or.na -dr.na -us.na -mx.na -ca.na -in.na -cc.na -tv.na -ws.na -mobi.na -co.na -com.na -org.na - -// name : has 2nd-level tlds, but there's no list of them -name - -// nc : http://www.cctld.nc/ -nc -asso.nc - -// ne : http://en.wikipedia.org/wiki/.ne -ne - -// net : http://en.wikipedia.org/wiki/.net -net - -// nf : http://en.wikipedia.org/wiki/.nf -nf -com.nf -net.nf -per.nf -rec.nf -web.nf -arts.nf -firm.nf -info.nf -other.nf -store.nf - -// ng : http://psg.com/dns/ng/ -ng -com.ng -edu.ng -name.ng -net.ng -org.ng -sch.ng -gov.ng -mil.ng -mobi.ng - -// ni : http://www.nic.ni/dominios.htm -*.ni - -// nl : http://en.wikipedia.org/wiki/.nl -// https://www.sidn.nl/ -// ccTLD for the Netherlands -nl - -// BV.nl will be a registry for dutch BV's (besloten vennootschap) -bv.nl - -// no : http://www.norid.no/regelverk/index.en.html -// The Norwegian registry has declined to notify us of updates. The web pages -// referenced below are the official source of the data. There is also an -// announce mailing list: -// https://postlister.uninett.no/sympa/info/norid-diskusjon -no -// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html -fhs.no -vgs.no -fylkesbibl.no -folkebibl.no -museum.no -idrett.no -priv.no -// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html -mil.no -stat.no -dep.no -kommune.no -herad.no -// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html -// counties -aa.no -ah.no -bu.no -fm.no -hl.no -hm.no -jan-mayen.no -mr.no -nl.no -nt.no -of.no -ol.no -oslo.no -rl.no -sf.no -st.no -svalbard.no -tm.no -tr.no -va.no -vf.no -// primary and lower secondary schools per county -gs.aa.no -gs.ah.no -gs.bu.no -gs.fm.no -gs.hl.no -gs.hm.no -gs.jan-mayen.no -gs.mr.no -gs.nl.no -gs.nt.no -gs.of.no -gs.ol.no -gs.oslo.no -gs.rl.no -gs.sf.no -gs.st.no -gs.svalbard.no -gs.tm.no -gs.tr.no -gs.va.no -gs.vf.no -// cities -akrehamn.no -åkrehamn.no -algard.no -ålgård.no -arna.no -brumunddal.no -bryne.no -bronnoysund.no -brønnøysund.no -drobak.no -drøbak.no -egersund.no -fetsund.no -floro.no -florø.no -fredrikstad.no -hokksund.no -honefoss.no -hønefoss.no -jessheim.no -jorpeland.no -jørpeland.no -kirkenes.no -kopervik.no -krokstadelva.no -langevag.no -langevåg.no -leirvik.no -mjondalen.no -mjøndalen.no -mo-i-rana.no -mosjoen.no -mosjøen.no -nesoddtangen.no -orkanger.no -osoyro.no -osøyro.no -raholt.no -råholt.no -sandnessjoen.no -sandnessjøen.no -skedsmokorset.no -slattum.no -spjelkavik.no -stathelle.no -stavern.no -stjordalshalsen.no -stjørdalshalsen.no -tananger.no -tranby.no -vossevangen.no -// communities -afjord.no -åfjord.no -agdenes.no -al.no -ål.no -alesund.no -ålesund.no -alstahaug.no -alta.no -áltá.no -alaheadju.no -álaheadju.no -alvdal.no -amli.no -åmli.no -amot.no -åmot.no -andebu.no -andoy.no -andøy.no -andasuolo.no -ardal.no -årdal.no -aremark.no -arendal.no -ås.no -aseral.no -åseral.no -asker.no -askim.no -askvoll.no -askoy.no -askøy.no -asnes.no -åsnes.no -audnedaln.no -aukra.no -aure.no -aurland.no -aurskog-holand.no -aurskog-høland.no -austevoll.no -austrheim.no -averoy.no -averøy.no -balestrand.no -ballangen.no -balat.no -bálát.no -balsfjord.no -bahccavuotna.no -báhccavuotna.no -bamble.no -bardu.no -beardu.no -beiarn.no -bajddar.no -bájddar.no -baidar.no -báidár.no -berg.no -bergen.no -berlevag.no -berlevåg.no -bearalvahki.no -bearalváhki.no -bindal.no -birkenes.no -bjarkoy.no -bjarkøy.no -bjerkreim.no -bjugn.no -bodo.no -bodø.no -badaddja.no -bådåddjå.no -budejju.no -bokn.no -bremanger.no -bronnoy.no -brønnøy.no -bygland.no -bykle.no -barum.no -bærum.no -bo.telemark.no -bø.telemark.no -bo.nordland.no -bø.nordland.no -bievat.no -bievát.no -bomlo.no -bømlo.no -batsfjord.no -båtsfjord.no -bahcavuotna.no -báhcavuotna.no -dovre.no -drammen.no -drangedal.no -dyroy.no -dyrøy.no -donna.no -dønna.no -eid.no -eidfjord.no -eidsberg.no -eidskog.no -eidsvoll.no -eigersund.no -elverum.no -enebakk.no -engerdal.no -etne.no -etnedal.no -evenes.no -evenassi.no -evenášši.no -evje-og-hornnes.no -farsund.no -fauske.no -fuossko.no -fuoisku.no -fedje.no -fet.no -finnoy.no -finnøy.no -fitjar.no -fjaler.no -fjell.no -flakstad.no -flatanger.no -flekkefjord.no -flesberg.no -flora.no -fla.no -flå.no -folldal.no -forsand.no -fosnes.no -frei.no -frogn.no -froland.no -frosta.no -frana.no -fræna.no -froya.no -frøya.no -fusa.no -fyresdal.no -forde.no -førde.no -gamvik.no -gangaviika.no -gáŋgaviika.no -gaular.no -gausdal.no -gildeskal.no -gildeskål.no -giske.no -gjemnes.no -gjerdrum.no -gjerstad.no -gjesdal.no -gjovik.no -gjøvik.no -gloppen.no -gol.no -gran.no -grane.no -granvin.no -gratangen.no -grimstad.no -grong.no -kraanghke.no -kråanghke.no -grue.no -gulen.no -hadsel.no -halden.no -halsa.no -hamar.no -hamaroy.no -habmer.no -hábmer.no -hapmir.no -hápmir.no -hammerfest.no -hammarfeasta.no -hámmárfeasta.no -haram.no -hareid.no -harstad.no -hasvik.no -aknoluokta.no -ákŋoluokta.no -hattfjelldal.no -aarborte.no -haugesund.no -hemne.no -hemnes.no -hemsedal.no -heroy.more-og-romsdal.no -herøy.møre-og-romsdal.no -heroy.nordland.no -herøy.nordland.no -hitra.no -hjartdal.no -hjelmeland.no -hobol.no -hobøl.no -hof.no -hol.no -hole.no -holmestrand.no -holtalen.no -holtålen.no -hornindal.no -horten.no -hurdal.no -hurum.no -hvaler.no -hyllestad.no -hagebostad.no -hægebostad.no -hoyanger.no -høyanger.no -hoylandet.no -høylandet.no -ha.no -hå.no -ibestad.no -inderoy.no -inderøy.no -iveland.no -jevnaker.no -jondal.no -jolster.no -jølster.no -karasjok.no -karasjohka.no -kárášjohka.no -karlsoy.no -galsa.no -gálsá.no -karmoy.no -karmøy.no -kautokeino.no -guovdageaidnu.no -klepp.no -klabu.no -klæbu.no -kongsberg.no -kongsvinger.no -kragero.no -kragerø.no -kristiansand.no -kristiansund.no -krodsherad.no -krødsherad.no -kvalsund.no -rahkkeravju.no -ráhkkerávju.no -kvam.no -kvinesdal.no -kvinnherad.no -kviteseid.no -kvitsoy.no -kvitsøy.no -kvafjord.no -kvæfjord.no -giehtavuoatna.no -kvanangen.no -kvænangen.no -navuotna.no -návuotna.no -kafjord.no -kåfjord.no -gaivuotna.no -gáivuotna.no -larvik.no -lavangen.no -lavagis.no -loabat.no -loabát.no -lebesby.no -davvesiida.no -leikanger.no -leirfjord.no -leka.no -leksvik.no -lenvik.no -leangaviika.no -leaŋgaviika.no -lesja.no -levanger.no -lier.no -lierne.no -lillehammer.no -lillesand.no -lindesnes.no -lindas.no -lindås.no -lom.no -loppa.no -lahppi.no -láhppi.no -lund.no -lunner.no -luroy.no -lurøy.no -luster.no -lyngdal.no -lyngen.no -ivgu.no -lardal.no -lerdal.no -lærdal.no -lodingen.no -lødingen.no -lorenskog.no -lørenskog.no -loten.no -løten.no -malvik.no -masoy.no -måsøy.no -muosat.no -muosát.no -mandal.no -marker.no -marnardal.no -masfjorden.no -meland.no -meldal.no -melhus.no -meloy.no -meløy.no -meraker.no -meråker.no -moareke.no -moåreke.no -midsund.no -midtre-gauldal.no -modalen.no -modum.no -molde.no -moskenes.no -moss.no -mosvik.no -malselv.no -målselv.no -malatvuopmi.no -málatvuopmi.no -namdalseid.no -aejrie.no -namsos.no -namsskogan.no -naamesjevuemie.no -nååmesjevuemie.no -laakesvuemie.no -nannestad.no -narvik.no -narviika.no -naustdal.no -nedre-eiker.no -nes.akershus.no -nes.buskerud.no -nesna.no -nesodden.no -nesseby.no -unjarga.no -unjárga.no -nesset.no -nissedal.no -nittedal.no -nord-aurdal.no -nord-fron.no -nord-odal.no -norddal.no -nordkapp.no -davvenjarga.no -davvenjárga.no -nordre-land.no -nordreisa.no -raisa.no -ráisa.no -nore-og-uvdal.no -notodden.no -naroy.no -nærøy.no -notteroy.no -nøtterøy.no -odda.no -oksnes.no -øksnes.no -oppdal.no -oppegard.no -oppegård.no -orkdal.no -orland.no -ørland.no -orskog.no -ørskog.no -orsta.no -ørsta.no -os.hedmark.no -os.hordaland.no -osen.no -osteroy.no -osterøy.no -ostre-toten.no -østre-toten.no -overhalla.no -ovre-eiker.no -øvre-eiker.no -oyer.no -øyer.no -oygarden.no -øygarden.no -oystre-slidre.no -øystre-slidre.no -porsanger.no -porsangu.no -porsáŋgu.no -porsgrunn.no -radoy.no -radøy.no -rakkestad.no -rana.no -ruovat.no -randaberg.no -rauma.no -rendalen.no -rennebu.no -rennesoy.no -rennesøy.no -rindal.no -ringebu.no -ringerike.no -ringsaker.no -rissa.no -risor.no -risør.no -roan.no -rollag.no -rygge.no -ralingen.no -rælingen.no -rodoy.no -rødøy.no -romskog.no -rømskog.no -roros.no -røros.no -rost.no -røst.no -royken.no -røyken.no -royrvik.no -røyrvik.no -rade.no -råde.no -salangen.no -siellak.no -saltdal.no -salat.no -sálát.no -sálat.no -samnanger.no -sande.more-og-romsdal.no -sande.møre-og-romsdal.no -sande.vestfold.no -sandefjord.no -sandnes.no -sandoy.no -sandøy.no -sarpsborg.no -sauda.no -sauherad.no -sel.no -selbu.no -selje.no -seljord.no -sigdal.no -siljan.no -sirdal.no -skaun.no -skedsmo.no -ski.no -skien.no -skiptvet.no -skjervoy.no -skjervøy.no -skierva.no -skiervá.no -skjak.no -skjåk.no -skodje.no -skanland.no -skånland.no -skanit.no -skánit.no -smola.no -smøla.no -snillfjord.no -snasa.no -snåsa.no -snoasa.no -snaase.no -snåase.no -sogndal.no -sokndal.no -sola.no -solund.no -songdalen.no -sortland.no -spydeberg.no -stange.no -stavanger.no -steigen.no -steinkjer.no -stjordal.no -stjørdal.no -stokke.no -stor-elvdal.no -stord.no -stordal.no -storfjord.no -omasvuotna.no -strand.no -stranda.no -stryn.no -sula.no -suldal.no -sund.no -sunndal.no -surnadal.no -sveio.no -svelvik.no -sykkylven.no -sogne.no -søgne.no -somna.no -sømna.no -sondre-land.no -søndre-land.no -sor-aurdal.no -sør-aurdal.no -sor-fron.no -sør-fron.no -sor-odal.no -sør-odal.no -sor-varanger.no -sør-varanger.no -matta-varjjat.no -mátta-várjjat.no -sorfold.no -sørfold.no -sorreisa.no -sørreisa.no -sorum.no -sørum.no -tana.no -deatnu.no -time.no -tingvoll.no -tinn.no -tjeldsund.no -dielddanuorri.no -tjome.no -tjøme.no -tokke.no -tolga.no -torsken.no -tranoy.no -tranøy.no -tromso.no -tromsø.no -tromsa.no -romsa.no -trondheim.no -troandin.no -trysil.no -trana.no -træna.no -trogstad.no -trøgstad.no -tvedestrand.no -tydal.no -tynset.no -tysfjord.no -divtasvuodna.no -divttasvuotna.no -tysnes.no -tysvar.no -tysvær.no -tonsberg.no -tønsberg.no -ullensaker.no -ullensvang.no -ulvik.no -utsira.no -vadso.no -vadsø.no -cahcesuolo.no -čáhcesuolo.no -vaksdal.no -valle.no -vang.no -vanylven.no -vardo.no -vardø.no -varggat.no -várggát.no -vefsn.no -vaapste.no -vega.no -vegarshei.no -vegårshei.no -vennesla.no -verdal.no -verran.no -vestby.no -vestnes.no -vestre-slidre.no -vestre-toten.no -vestvagoy.no -vestvågøy.no -vevelstad.no -vik.no -vikna.no -vindafjord.no -volda.no -voss.no -varoy.no -værøy.no -vagan.no -vågan.no -voagat.no -vagsoy.no -vågsøy.no -vaga.no -vågå.no -valer.ostfold.no -våler.østfold.no -valer.hedmark.no -våler.hedmark.no - -// np : http://www.mos.com.np/register.html -*.np - -// nr : http://cenpac.net.nr/dns/index.html -// Confirmed by registry 2008-06-17 -nr -biz.nr -info.nr -gov.nr -edu.nr -org.nr -net.nr -com.nr - -// nu : http://en.wikipedia.org/wiki/.nu -nu - -// nz : http://en.wikipedia.org/wiki/.nz -// Confirmed by registry 2014-05-19 -nz -ac.nz -co.nz -cri.nz -geek.nz -gen.nz -govt.nz -health.nz -iwi.nz -kiwi.nz -maori.nz -mil.nz -māori.nz -net.nz -org.nz -parliament.nz -school.nz - -// om : http://en.wikipedia.org/wiki/.om -om -co.om -com.om -edu.om -gov.om -med.om -museum.om -net.om -org.om -pro.om - -// org : http://en.wikipedia.org/wiki/.org -org - -// pa : http://www.nic.pa/ -// Some additional second level "domains" resolve directly as hostnames, such as -// pannet.pa, so we add a rule for "pa". -pa -ac.pa -gob.pa -com.pa -org.pa -sld.pa -edu.pa -net.pa -ing.pa -abo.pa -med.pa -nom.pa - -// pe : https://www.nic.pe/InformeFinalComision.pdf -pe -edu.pe -gob.pe -nom.pe -mil.pe -org.pe -com.pe -net.pe - -// pf : http://www.gobin.info/domainname/formulaire-pf.pdf -pf -com.pf -org.pf -edu.pf - -// pg : http://en.wikipedia.org/wiki/.pg -*.pg - -// ph : http://www.domains.ph/FAQ2.asp -// Submitted by registry 2008-06-13 -ph -com.ph -net.ph -org.ph -gov.ph -edu.ph -ngo.ph -mil.ph -i.ph - -// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK -pk -com.pk -net.pk -edu.pk -org.pk -fam.pk -biz.pk -web.pk -gov.pk -gob.pk -gok.pk -gon.pk -gop.pk -gos.pk -info.pk - -// pl http://www.dns.pl/english/index.html -// updated by .PL registry on 2015-04-28 -pl -com.pl -net.pl -org.pl -// pl functional domains (http://www.dns.pl/english/index.html) -aid.pl -agro.pl -atm.pl -auto.pl -biz.pl -edu.pl -gmina.pl -gsm.pl -info.pl -mail.pl -miasta.pl -media.pl -mil.pl -nieruchomosci.pl -nom.pl -pc.pl -powiat.pl -priv.pl -realestate.pl -rel.pl -sex.pl -shop.pl -sklep.pl -sos.pl -szkola.pl -targi.pl -tm.pl -tourism.pl -travel.pl -turystyka.pl -// Government domains -gov.pl -ap.gov.pl -ic.gov.pl -is.gov.pl -us.gov.pl -kmpsp.gov.pl -kppsp.gov.pl -kwpsp.gov.pl -psp.gov.pl -wskr.gov.pl -kwp.gov.pl -mw.gov.pl -ug.gov.pl -um.gov.pl -umig.gov.pl -ugim.gov.pl -upow.gov.pl -uw.gov.pl -starostwo.gov.pl -pa.gov.pl -po.gov.pl -psse.gov.pl -pup.gov.pl -rzgw.gov.pl -sa.gov.pl -so.gov.pl -sr.gov.pl -wsa.gov.pl -sko.gov.pl -uzs.gov.pl -wiih.gov.pl -winb.gov.pl -pinb.gov.pl -wios.gov.pl -witd.gov.pl -wzmiuw.gov.pl -piw.gov.pl -wiw.gov.pl -griw.gov.pl -wif.gov.pl -oum.gov.pl -sdn.gov.pl -zp.gov.pl -uppo.gov.pl -mup.gov.pl -wuoz.gov.pl -konsulat.gov.pl -oirm.gov.pl -// pl regional domains (http://www.dns.pl/english/index.html) -augustow.pl -babia-gora.pl -bedzin.pl -beskidy.pl -bialowieza.pl -bialystok.pl -bielawa.pl -bieszczady.pl -boleslawiec.pl -bydgoszcz.pl -bytom.pl -cieszyn.pl -czeladz.pl -czest.pl -dlugoleka.pl -elblag.pl -elk.pl -glogow.pl -gniezno.pl -gorlice.pl -grajewo.pl -ilawa.pl -jaworzno.pl -jelenia-gora.pl -jgora.pl -kalisz.pl -kazimierz-dolny.pl -karpacz.pl -kartuzy.pl -kaszuby.pl -katowice.pl -kepno.pl -ketrzyn.pl -klodzko.pl -kobierzyce.pl -kolobrzeg.pl -konin.pl -konskowola.pl -kutno.pl -lapy.pl -lebork.pl -legnica.pl -lezajsk.pl -limanowa.pl -lomza.pl -lowicz.pl -lubin.pl -lukow.pl -malbork.pl -malopolska.pl -mazowsze.pl -mazury.pl -mielec.pl -mielno.pl -mragowo.pl -naklo.pl -nowaruda.pl -nysa.pl -olawa.pl -olecko.pl -olkusz.pl -olsztyn.pl -opoczno.pl -opole.pl -ostroda.pl -ostroleka.pl -ostrowiec.pl -ostrowwlkp.pl -pila.pl -pisz.pl -podhale.pl -podlasie.pl -polkowice.pl -pomorze.pl -pomorskie.pl -prochowice.pl -pruszkow.pl -przeworsk.pl -pulawy.pl -radom.pl -rawa-maz.pl -rybnik.pl -rzeszow.pl -sanok.pl -sejny.pl -slask.pl -slupsk.pl -sosnowiec.pl -stalowa-wola.pl -skoczow.pl -starachowice.pl -stargard.pl -suwalki.pl -swidnica.pl -swiebodzin.pl -swinoujscie.pl -szczecin.pl -szczytno.pl -tarnobrzeg.pl -tgory.pl -turek.pl -tychy.pl -ustka.pl -walbrzych.pl -warmia.pl -warszawa.pl -waw.pl -wegrow.pl -wielun.pl -wlocl.pl -wloclawek.pl -wodzislaw.pl -wolomin.pl -wroclaw.pl -zachpomor.pl -zagan.pl -zarow.pl -zgora.pl -zgorzelec.pl - -// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf -pm - -// pn : http://www.government.pn/PnRegistry/policies.htm -pn -gov.pn -co.pn -org.pn -edu.pn -net.pn - -// post : http://en.wikipedia.org/wiki/.post -post - -// pr : http://www.nic.pr/index.asp?f=1 -pr -com.pr -net.pr -org.pr -gov.pr -edu.pr -isla.pr -pro.pr -biz.pr -info.pr -name.pr -// these aren't mentioned on nic.pr, but on http://en.wikipedia.org/wiki/.pr -est.pr -prof.pr -ac.pr - -// pro : http://www.nic.pro/support_faq.htm -pro -aca.pro -bar.pro -cpa.pro -jur.pro -law.pro -med.pro -eng.pro - -// ps : http://en.wikipedia.org/wiki/.ps -// http://www.nic.ps/registration/policy.html#reg -ps -edu.ps -gov.ps -sec.ps -plo.ps -com.ps -org.ps -net.ps - -// pt : http://online.dns.pt/dns/start_dns -pt -net.pt -gov.pt -org.pt -edu.pt -int.pt -publ.pt -com.pt -nome.pt - -// pw : http://en.wikipedia.org/wiki/.pw -pw -co.pw -ne.pw -or.pw -ed.pw -go.pw -belau.pw - -// py : http://www.nic.py/pautas.html#seccion_9 -// Confirmed by registry 2012-10-03 -py -com.py -coop.py -edu.py -gov.py -mil.py -net.py -org.py - -// qa : http://domains.qa/en/ -qa -com.qa -edu.qa -gov.qa -mil.qa -name.qa -net.qa -org.qa -sch.qa - -// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs -re -com.re -asso.re -nom.re - -// ro : http://www.rotld.ro/ -ro -com.ro -org.ro -tm.ro -nt.ro -nom.ro -info.ro -rec.ro -arts.ro -firm.ro -store.ro -www.ro - -// rs : http://en.wikipedia.org/wiki/.rs -rs -co.rs -org.rs -edu.rs -ac.rs -gov.rs -in.rs - -// ru : http://www.cctld.ru/ru/docs/aktiv_8.php -// Industry domains -ru -ac.ru -com.ru -edu.ru -int.ru -net.ru -org.ru -pp.ru -// Geographical domains -adygeya.ru -altai.ru -amur.ru -arkhangelsk.ru -astrakhan.ru -bashkiria.ru -belgorod.ru -bir.ru -bryansk.ru -buryatia.ru -cbg.ru -chel.ru -chelyabinsk.ru -chita.ru -chukotka.ru -chuvashia.ru -dagestan.ru -dudinka.ru -e-burg.ru -grozny.ru -irkutsk.ru -ivanovo.ru -izhevsk.ru -jar.ru -joshkar-ola.ru -kalmykia.ru -kaluga.ru -kamchatka.ru -karelia.ru -kazan.ru -kchr.ru -kemerovo.ru -khabarovsk.ru -khakassia.ru -khv.ru -kirov.ru -koenig.ru -komi.ru -kostroma.ru -krasnoyarsk.ru -kuban.ru -kurgan.ru -kursk.ru -lipetsk.ru -magadan.ru -mari.ru -mari-el.ru -marine.ru -mordovia.ru -// mosreg.ru Bug 1090800 - removed at request of Aleksey Konstantinov -msk.ru -murmansk.ru -nalchik.ru -nnov.ru -nov.ru -novosibirsk.ru -nsk.ru -omsk.ru -orenburg.ru -oryol.ru -palana.ru -penza.ru -perm.ru -ptz.ru -rnd.ru -ryazan.ru -sakhalin.ru -samara.ru -saratov.ru -simbirsk.ru -smolensk.ru -spb.ru -stavropol.ru -stv.ru -surgut.ru -tambov.ru -tatarstan.ru -tom.ru -tomsk.ru -tsaritsyn.ru -tsk.ru -tula.ru -tuva.ru -tver.ru -tyumen.ru -udm.ru -udmurtia.ru -ulan-ude.ru -vladikavkaz.ru -vladimir.ru -vladivostok.ru -volgograd.ru -vologda.ru -voronezh.ru -vrn.ru -vyatka.ru -yakutia.ru -yamal.ru -yaroslavl.ru -yekaterinburg.ru -yuzhno-sakhalinsk.ru -// More geographical domains -amursk.ru -baikal.ru -cmw.ru -fareast.ru -jamal.ru -kms.ru -k-uralsk.ru -kustanai.ru -kuzbass.ru -magnitka.ru -mytis.ru -nakhodka.ru -nkz.ru -norilsk.ru -oskol.ru -pyatigorsk.ru -rubtsovsk.ru -snz.ru -syzran.ru -vdonsk.ru -zgrad.ru -// State domains -gov.ru -mil.ru -// Technical domains -test.ru - -// rw : http://www.nic.rw/cgi-bin/policy.pl -rw -gov.rw -net.rw -edu.rw -ac.rw -com.rw -co.rw -int.rw -mil.rw -gouv.rw - -// sa : http://www.nic.net.sa/ -sa -com.sa -net.sa -org.sa -gov.sa -med.sa -pub.sa -edu.sa -sch.sa - -// sb : http://www.sbnic.net.sb/ -// Submitted by registry 2008-06-08 -sb -com.sb -edu.sb -gov.sb -net.sb -org.sb - -// sc : http://www.nic.sc/ -sc -com.sc -gov.sc -net.sc -org.sc -edu.sc - -// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm -// Submitted by registry 2008-06-17 -sd -com.sd -net.sd -org.sd -edu.sd -med.sd -tv.sd -gov.sd -info.sd - -// se : http://en.wikipedia.org/wiki/.se -// Submitted by registry 2014-03-18 -se -a.se -ac.se -b.se -bd.se -brand.se -c.se -d.se -e.se -f.se -fh.se -fhsk.se -fhv.se -g.se -h.se -i.se -k.se -komforb.se -kommunalforbund.se -komvux.se -l.se -lanbib.se -m.se -n.se -naturbruksgymn.se -o.se -org.se -p.se -parti.se -pp.se -press.se -r.se -s.se -t.se -tm.se -u.se -w.se -x.se -y.se -z.se - -// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines -sg -com.sg -net.sg -org.sg -gov.sg -edu.sg -per.sg - -// sh : http://www.nic.sh/registrar.html -sh -com.sh -net.sh -gov.sh -org.sh -mil.sh - -// si : http://en.wikipedia.org/wiki/.si -si - -// sj : No registrations at this time. -// Submitted by registry 2008-06-16 -sj - -// sk : http://en.wikipedia.org/wiki/.sk -// list of 2nd level domains ? -sk - -// sl : http://www.nic.sl -// Submitted by registry 2008-06-12 -sl -com.sl -net.sl -edu.sl -gov.sl -org.sl - -// sm : http://en.wikipedia.org/wiki/.sm -sm - -// sn : http://en.wikipedia.org/wiki/.sn -sn -art.sn -com.sn -edu.sn -gouv.sn -org.sn -perso.sn -univ.sn - -// so : http://www.soregistry.com/ -so -com.so -net.so -org.so - -// sr : http://en.wikipedia.org/wiki/.sr -sr - -// st : http://www.nic.st/html/policyrules/ -st -co.st -com.st -consulado.st -edu.st -embaixada.st -gov.st -mil.st -net.st -org.st -principe.st -saotome.st -store.st - -// su : http://en.wikipedia.org/wiki/.su -su -adygeya.su -arkhangelsk.su -balashov.su -bashkiria.su -bryansk.su -dagestan.su -grozny.su -ivanovo.su -kalmykia.su -kaluga.su -karelia.su -khakassia.su -krasnodar.su -kurgan.su -lenug.su -mordovia.su -msk.su -murmansk.su -nalchik.su -nov.su -obninsk.su -penza.su -pokrovsk.su -sochi.su -spb.su -togliatti.su -troitsk.su -tula.su -tuva.su -vladikavkaz.su -vladimir.su -vologda.su - -// sv : http://www.svnet.org.sv/niveldos.pdf -sv -com.sv -edu.sv -gob.sv -org.sv -red.sv - -// sx : http://en.wikipedia.org/wiki/.sx -// Confirmed by registry 2012-05-31 -sx -gov.sx - -// sy : http://en.wikipedia.org/wiki/.sy -// see also: http://www.gobin.info/domainname/sy.doc -sy -edu.sy -gov.sy -net.sy -mil.sy -com.sy -org.sy - -// sz : http://en.wikipedia.org/wiki/.sz -// http://www.sispa.org.sz/ -sz -co.sz -ac.sz -org.sz - -// tc : http://en.wikipedia.org/wiki/.tc -tc - -// td : http://en.wikipedia.org/wiki/.td -td - -// tel: http://en.wikipedia.org/wiki/.tel -// http://www.telnic.org/ -tel - -// tf : http://en.wikipedia.org/wiki/.tf -tf - -// tg : http://en.wikipedia.org/wiki/.tg -// http://www.nic.tg/ -tg - -// th : http://en.wikipedia.org/wiki/.th -// Submitted by registry 2008-06-17 -th -ac.th -co.th -go.th -in.th -mi.th -net.th -or.th - -// tj : http://www.nic.tj/policy.html -tj -ac.tj -biz.tj -co.tj -com.tj -edu.tj -go.tj -gov.tj -int.tj -mil.tj -name.tj -net.tj -nic.tj -org.tj -test.tj -web.tj - -// tk : http://en.wikipedia.org/wiki/.tk -tk - -// tl : http://en.wikipedia.org/wiki/.tl -tl -gov.tl - -// tm : http://www.nic.tm/local.html -tm -com.tm -co.tm -org.tm -net.tm -nom.tm -gov.tm -mil.tm -edu.tm - -// tn : http://en.wikipedia.org/wiki/.tn -// http://whois.ati.tn/ -tn -com.tn -ens.tn -fin.tn -gov.tn -ind.tn -intl.tn -nat.tn -net.tn -org.tn -info.tn -perso.tn -tourism.tn -edunet.tn -rnrt.tn -rns.tn -rnu.tn -mincom.tn -agrinet.tn -defense.tn -turen.tn - -// to : http://en.wikipedia.org/wiki/.to -// Submitted by registry 2008-06-17 -to -com.to -gov.to -net.to -org.to -edu.to -mil.to - -// tp : No registrations at this time. -// Submitted by Ryan Sleevi 2014-01-03 -tp - -// subTLDs: https://www.nic.tr/forms/eng/policies.pdf -// and: https://www.nic.tr/forms/politikalar.pdf -// Submitted by 2014-07-19 -tr -com.tr -info.tr -biz.tr -net.tr -org.tr -web.tr -gen.tr -tv.tr -av.tr -dr.tr -bbs.tr -name.tr -tel.tr -gov.tr -bel.tr -pol.tr -mil.tr -k12.tr -edu.tr -kep.tr - -// Used by Northern Cyprus -nc.tr - -// Used by government agencies of Northern Cyprus -gov.nc.tr - -// travel : http://en.wikipedia.org/wiki/.travel -travel - -// tt : http://www.nic.tt/ -tt -co.tt -com.tt -org.tt -net.tt -biz.tt -info.tt -pro.tt -int.tt -coop.tt -jobs.tt -mobi.tt -travel.tt -museum.tt -aero.tt -name.tt -gov.tt -edu.tt - -// tv : http://en.wikipedia.org/wiki/.tv -// Not listing any 2LDs as reserved since none seem to exist in practice, -// Wikipedia notwithstanding. -tv - -// tw : http://en.wikipedia.org/wiki/.tw -tw -edu.tw -gov.tw -mil.tw -com.tw -net.tw -org.tw -idv.tw -game.tw -ebiz.tw -club.tw -網路.tw -組織.tw -商業.tw - -// tz : http://www.tznic.or.tz/index.php/domains -// Confirmed by registry 2013-01-22 -tz -ac.tz -co.tz -go.tz -hotel.tz -info.tz -me.tz -mil.tz -mobi.tz -ne.tz -or.tz -sc.tz -tv.tz - -// ua : https://hostmaster.ua/policy/?ua -// Submitted by registry 2012-04-27 -ua -// ua 2LD -com.ua -edu.ua -gov.ua -in.ua -net.ua -org.ua -// ua geographic names -// https://hostmaster.ua/2ld/ -cherkassy.ua -cherkasy.ua -chernigov.ua -chernihiv.ua -chernivtsi.ua -chernovtsy.ua -ck.ua -cn.ua -cr.ua -crimea.ua -cv.ua -dn.ua -dnepropetrovsk.ua -dnipropetrovsk.ua -dominic.ua -donetsk.ua -dp.ua -if.ua -ivano-frankivsk.ua -kh.ua -kharkiv.ua -kharkov.ua -kherson.ua -khmelnitskiy.ua -khmelnytskyi.ua -kiev.ua -kirovograd.ua -km.ua -kr.ua -krym.ua -ks.ua -kv.ua -kyiv.ua -lg.ua -lt.ua -lugansk.ua -lutsk.ua -lv.ua -lviv.ua -mk.ua -mykolaiv.ua -nikolaev.ua -od.ua -odesa.ua -odessa.ua -pl.ua -poltava.ua -rivne.ua -rovno.ua -rv.ua -sb.ua -sebastopol.ua -sevastopol.ua -sm.ua -sumy.ua -te.ua -ternopil.ua -uz.ua -uzhgorod.ua -vinnica.ua -vinnytsia.ua -vn.ua -volyn.ua -yalta.ua -zaporizhzhe.ua -zaporizhzhia.ua -zhitomir.ua -zhytomyr.ua -zp.ua -zt.ua - -// Private registries in .ua -co.ua -pp.ua - -// ug : https://www.registry.co.ug/ -ug -co.ug -or.ug -ac.ug -sc.ug -go.ug -ne.ug -com.ug -org.ug - -// uk : http://en.wikipedia.org/wiki/.uk -// Submitted by registry -uk -ac.uk -co.uk -gov.uk -ltd.uk -me.uk -net.uk -nhs.uk -org.uk -plc.uk -police.uk -*.sch.uk - -// us : http://en.wikipedia.org/wiki/.us -us -dni.us -fed.us -isa.us -kids.us -nsn.us -// us geographic names -ak.us -al.us -ar.us -as.us -az.us -ca.us -co.us -ct.us -dc.us -de.us -fl.us -ga.us -gu.us -hi.us -ia.us -id.us -il.us -in.us -ks.us -ky.us -la.us -ma.us -md.us -me.us -mi.us -mn.us -mo.us -ms.us -mt.us -nc.us -nd.us -ne.us -nh.us -nj.us -nm.us -nv.us -ny.us -oh.us -ok.us -or.us -pa.us -pr.us -ri.us -sc.us -sd.us -tn.us -tx.us -ut.us -vi.us -vt.us -va.us -wa.us -wi.us -wv.us -wy.us -// The registrar notes several more specific domains available in each state, -// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat -// haphazard; in some states these domains resolve as addresses, while in others -// only subdomains are available, or even nothing at all. We include the -// most common ones where it's clear that different sites are different -// entities. -k12.ak.us -k12.al.us -k12.ar.us -k12.as.us -k12.az.us -k12.ca.us -k12.co.us -k12.ct.us -k12.dc.us -k12.de.us -k12.fl.us -k12.ga.us -k12.gu.us -// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login -k12.ia.us -k12.id.us -k12.il.us -k12.in.us -k12.ks.us -k12.ky.us -k12.la.us -k12.ma.us -k12.md.us -k12.me.us -k12.mi.us -k12.mn.us -k12.mo.us -k12.ms.us -k12.mt.us -k12.nc.us -// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso -k12.ne.us -k12.nh.us -k12.nj.us -k12.nm.us -k12.nv.us -k12.ny.us -k12.oh.us -k12.ok.us -k12.or.us -k12.pa.us -k12.pr.us -k12.ri.us -k12.sc.us -// k12.sd.us Bug 934131 - Removed at request of James Booze -k12.tn.us -k12.tx.us -k12.ut.us -k12.vi.us -k12.vt.us -k12.va.us -k12.wa.us -k12.wi.us -// k12.wv.us Bug 947705 - Removed at request of Verne Britton -k12.wy.us -cc.ak.us -cc.al.us -cc.ar.us -cc.as.us -cc.az.us -cc.ca.us -cc.co.us -cc.ct.us -cc.dc.us -cc.de.us -cc.fl.us -cc.ga.us -cc.gu.us -cc.hi.us -cc.ia.us -cc.id.us -cc.il.us -cc.in.us -cc.ks.us -cc.ky.us -cc.la.us -cc.ma.us -cc.md.us -cc.me.us -cc.mi.us -cc.mn.us -cc.mo.us -cc.ms.us -cc.mt.us -cc.nc.us -cc.nd.us -cc.ne.us -cc.nh.us -cc.nj.us -cc.nm.us -cc.nv.us -cc.ny.us -cc.oh.us -cc.ok.us -cc.or.us -cc.pa.us -cc.pr.us -cc.ri.us -cc.sc.us -cc.sd.us -cc.tn.us -cc.tx.us -cc.ut.us -cc.vi.us -cc.vt.us -cc.va.us -cc.wa.us -cc.wi.us -cc.wv.us -cc.wy.us -lib.ak.us -lib.al.us -lib.ar.us -lib.as.us -lib.az.us -lib.ca.us -lib.co.us -lib.ct.us -lib.dc.us -lib.de.us -lib.fl.us -lib.ga.us -lib.gu.us -lib.hi.us -lib.ia.us -lib.id.us -lib.il.us -lib.in.us -lib.ks.us -lib.ky.us -lib.la.us -lib.ma.us -lib.md.us -lib.me.us -lib.mi.us -lib.mn.us -lib.mo.us -lib.ms.us -lib.mt.us -lib.nc.us -lib.nd.us -lib.ne.us -lib.nh.us -lib.nj.us -lib.nm.us -lib.nv.us -lib.ny.us -lib.oh.us -lib.ok.us -lib.or.us -lib.pa.us -lib.pr.us -lib.ri.us -lib.sc.us -lib.sd.us -lib.tn.us -lib.tx.us -lib.ut.us -lib.vi.us -lib.vt.us -lib.va.us -lib.wa.us -lib.wi.us -// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold -lib.wy.us -// k12.ma.us contains school districts in Massachusetts. The 4LDs are -// managed indepedently except for private (PVT), charter (CHTR) and -// parochial (PAROCH) schools. Those are delegated dorectly to the -// 5LD operators. -pvt.k12.ma.us -chtr.k12.ma.us -paroch.k12.ma.us - -// uy : http://www.nic.org.uy/ -uy -com.uy -edu.uy -gub.uy -mil.uy -net.uy -org.uy - -// uz : http://www.reg.uz/ -uz -co.uz -com.uz -net.uz -org.uz - -// va : http://en.wikipedia.org/wiki/.va -va - -// vc : http://en.wikipedia.org/wiki/.vc -// Submitted by registry 2008-06-13 -vc -com.vc -net.vc -org.vc -gov.vc -mil.vc -edu.vc - -// ve : https://registro.nic.ve/ -// Confirmed by registry 2012-10-04 -// Updated 2014-05-20 - Bug 940478 -ve -arts.ve -co.ve -com.ve -e12.ve -edu.ve -firm.ve -gob.ve -gov.ve -info.ve -int.ve -mil.ve -net.ve -org.ve -rec.ve -store.ve -tec.ve -web.ve - -// vg : http://en.wikipedia.org/wiki/.vg -vg - -// vi : http://www.nic.vi/newdomainform.htm -// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other -// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they -// are available for registration (which they do not seem to be). -vi -co.vi -com.vi -k12.vi -net.vi -org.vi - -// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp -vn -com.vn -net.vn -org.vn -edu.vn -gov.vn -int.vn -ac.vn -biz.vn -info.vn -name.vn -pro.vn -health.vn - -// vu : http://en.wikipedia.org/wiki/.vu -// http://www.vunic.vu/ -vu -com.vu -edu.vu -net.vu -org.vu - -// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf -wf - -// ws : http://en.wikipedia.org/wiki/.ws -// http://samoanic.ws/index.dhtml -ws -com.ws -net.ws -org.ws -gov.ws -edu.ws - -// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf -yt - -// IDN ccTLDs -// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then -// U-label, and follow this format: -// // A-Label ("", [, variant info]) : -// // [sponsoring org] -// U-Label - -// xn--mgbaam7a8h ("Emerat", Arabic) : AE -// http://nic.ae/english/arabicdomain/rules.jsp -امارات - -// xn--y9a3aq ("hye", Armenian) : AM -// ISOC AM (operated by .am Registry) -հայ - -// xn--54b7fta0cc ("Bangla", Bangla) : BD -বাংলা - -// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY -// Operated by .by registry -бел - -// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN -// CNNIC -// http://cnnic.cn/html/Dir/2005/10/11/3218.htm -中国 - -// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN -// CNNIC -// http://cnnic.cn/html/Dir/2005/10/11/3218.htm -中國 - -// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ -الجزائر - -// xn--wgbh1c ("Egypt/Masr", Arabic) : EG -// http://www.dotmasr.eg/ -مصر - -// xn--node ("ge", Georgian Mkhedruli) : GE -გე - -// xn--qxam ("el", Greek) : GR -// Hellenic Ministry of Infrastructure, Transport, and Networks -ελ - -// xn--j6w193g ("Hong Kong", Chinese) : HK -// https://www2.hkirc.hk/register/rules.jsp -香港 - -// xn--h2brj9c ("Bharat", Devanagari) : IN -// India -भारत - -// xn--mgbbh1a71e ("Bharat", Arabic) : IN -// India -بھارت - -// xn--fpcrj9c3d ("Bharat", Telugu) : IN -// India -భారత్ - -// xn--gecrj9c ("Bharat", Gujarati) : IN -// India -ભારત - -// xn--s9brj9c ("Bharat", Gurmukhi) : IN -// India -ਭਾਰਤ - -// xn--45brj9c ("Bharat", Bengali) : IN -// India -ভারত - -// xn--xkc2dl3a5ee0h ("India", Tamil) : IN -// India -இந்தியா - -// xn--mgba3a4f16a ("Iran", Persian) : IR -ایران - -// xn--mgba3a4fra ("Iran", Arabic) : IR -ايران - -// xn--mgbtx2b ("Iraq", Arabic) : IQ -// Communications and Media Commission -عراق - -// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO -// National Information Technology Center (NITC) -// Royal Scientific Society, Al-Jubeiha -الاردن - -// xn--3e0b707e ("Republic of Korea", Hangul) : KR -한국 - -// xn--80ao21a ("Kaz", Kazakh) : KZ -қаз - -// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK -// http://nic.lk -ලංකා - -// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK -// http://nic.lk -இலங்கை - -// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA -المغرب - -// xn--d1alf ("mkd", Macedonian) : MK -// MARnet -мкд - -// xn--l1acc ("mon", Mongolian) : MN -мон - -// xn--mix891f ("Macao", Chinese, Traditional) : MO -// MONIC / HNET Asia (Registry Operator for .mo) -澳門 - -// xn--mix082f ("Macao", Chinese, Simplified) : MO -澳门 - -// xn--mgbx4cd0ab ("Malaysia", Malay) : MY -مليسيا - -// xn--mgb9awbf ("Oman", Arabic) : OM -عمان - -// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK -پاکستان - -// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK -پاكستان - -// xn--ygbi2ammx ("Falasteen", Arabic) : PS -// The Palestinian National Internet Naming Authority (PNINA) -// http://www.pnina.ps -فلسطين - -// xn--90a3ac ("srb", Cyrillic) : RS -// http://www.rnids.rs/en/the-.срб-domain -срб -пр.срб -орг.срб -обр.срб -од.срб -упр.срб -ак.срб - -// xn--p1ai ("rf", Russian-Cyrillic) : RU -// http://www.cctld.ru/en/docs/rulesrf.php -рф - -// xn--wgbl6a ("Qatar", Arabic) : QA -// http://www.ict.gov.qa/ -قطر - -// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA -// http://www.nic.net.sa/ -السعودية - -// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA -السعودیة - -// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA -السعودیۃ - -// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA -السعوديه - -// xn--mgbpl2fh ("sudan", Arabic) : SD -// Operated by .sd registry -سودان - -// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG -新加坡 - -// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG -சிங்கப்பூர் - -// xn--ogbpf8fl ("Syria", Arabic) : SY -سورية - -// xn--mgbtf8fl ("Syria", Arabic, variant) : SY -سوريا - -// xn--o3cw4h ("Thai", Thai) : TH -// http://www.thnic.co.th -ไทย - -// xn--pgbs0dh ("Tunisia", Arabic) : TN -// http://nic.tn -تونس - -// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW -// http://www.twnic.net/english/dn/dn_07a.htm -台灣 - -// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW -// http://www.twnic.net/english/dn/dn_07a.htm -台湾 - -// xn--nnx388a ("Taiwan", Chinese, variant) : TW -臺灣 - -// xn--j1amh ("ukr", Cyrillic) : UA -укр - -// xn--mgb2ddes ("AlYemen", Arabic) : YE -اليمن - -// xxx : http://icmregistry.com -xxx - -// ye : http://www.y.net.ye/services/domain_name.htm -*.ye - -// za : http://www.zadna.org.za/slds.html -*.za - -// zm : http://en.wikipedia.org/wiki/.zm -*.zm - -// zw : http://en.wikipedia.org/wiki/.zw -*.zw - - -// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2015-05-06T09:31:08Z - -// aaa : 2015-02-26 American Automobile Association, Inc. -aaa - -// abb : 2014-10-24 ABB Ltd -abb - -// abbott : 2014-07-24 Abbott Laboratories, Inc. -abbott - -// abogado : 2014-04-24 Top Level Domain Holdings Limited -abogado - -// academy : 2013-11-07 Half Oaks, LLC -academy - -// accenture : 2014-08-15 Accenture plc -accenture - -// accountant : 2014-11-20 dot Accountant Limited -accountant - -// accountants : 2014-03-20 Knob Town, LLC -accountants - -// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG -aco - -// active : 2014-05-01 The Active Network, Inc -active - -// actor : 2013-12-12 United TLD Holdco Ltd. -actor - -// ads : 2014-12-04 Charleston Road Registry Inc. -ads - -// adult : 2014-10-16 ICM Registry AD LLC -adult - -// aeg : 2015-03-19 Aktiebolaget Electrolux -aeg - -// afl : 2014-10-02 Australian Football League -afl - -// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa -africa - -// africamagic : 2015-03-05 Electronic Media Network (Pty) Ltd -africamagic - -// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) -agakhan - -// agency : 2013-11-14 Steel Falls, LLC -agency - -// aig : 2014-12-18 American International Group, Inc. -aig - -// airforce : 2014-03-06 United TLD Holdco Ltd. -airforce - -// airtel : 2014-10-24 Bharti Airtel Limited -airtel - -// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation) -akdn - -// alibaba : 2015-01-15 Alibaba Group Holding Limited -alibaba - -// alipay : 2015-01-15 Alibaba Group Holding Limited -alipay - -// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft -allfinanz - -// alsace : 2014-07-02 REGION D ALSACE -alsace - -// amsterdam : 2014-07-24 Gemeente Amsterdam -amsterdam - -// analytics : 2014-12-18 Campus IP LLC -analytics - -// android : 2014-08-07 Charleston Road Registry Inc. -android - -// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -anquan - -// apartments : 2014-12-11 June Maple, LLC -apartments - -// aquarelle : 2014-07-24 Aquarelle.com -aquarelle - -// aramco : 2014-11-20 Aramco Services Company -aramco - -// archi : 2014-02-06 STARTING DOT LIMITED -archi - -// army : 2014-03-06 United TLD Holdco Ltd. -army - -// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E. -arte - -// associates : 2014-03-06 Baxter Hill, LLC -associates - -// attorney : 2014-03-20 -attorney - -// auction : 2014-03-20 -auction - -// audio : 2014-03-20 Uniregistry, Corp. -audio - -// author : 2014-12-18 Amazon EU S.à r.l. -author - -// auto : 2014-11-13 Uniregistry, Corp. -auto - -// autos : 2014-01-09 DERAutos, LLC -autos - -// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca -avianca - -// axa : 2013-12-19 AXA SA -axa - -// azure : 2014-12-18 Microsoft Corporation -azure - -// baby : 2015-04-09 Johnson & Johnson Services, Inc. -baby - -// baidu : 2015-01-08 Baidu, Inc. -baidu - -// band : 2014-06-12 -band - -// bank : 2014-09-25 fTLD Registry Services LLC -bank - -// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable -bar - -// barcelona : 2014-07-24 Municipi de Barcelona -barcelona - -// barclaycard : 2014-11-20 Barclays Bank PLC -barclaycard - -// barclays : 2014-11-20 Barclays Bank PLC -barclays - -// bargains : 2013-11-14 Half Hallow, LLC -bargains - -// bauhaus : 2014-04-17 Werkhaus GmbH -bauhaus - -// bayern : 2014-01-23 Bayern Connect GmbH -bayern - -// bbc : 2014-12-18 British Broadcasting Corporation -bbc - -// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A. -bbva - -// bcg : 2015-04-02 The Boston Consulting Group, Inc. -bcg - -// bcn : 2014-07-24 Municipi de Barcelona -bcn - -// beer : 2014-01-09 Top Level Domain Holdings Limited -beer - -// bentley : 2014-12-18 Bentley Motors Limited -bentley - -// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG -berlin - -// best : 2013-12-19 BestTLD Pty Ltd -best - -// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited -bharti - -// bible : 2014-06-19 American Bible Society -bible - -// bid : 2013-12-19 dot Bid Limited -bid - -// bike : 2013-08-27 Grand Hollow, LLC -bike - -// bing : 2014-12-18 Microsoft Corporation -bing - -// bingo : 2014-12-04 Sand Cedar, LLC -bingo - -// bio : 2014-03-06 STARTING DOT LIMITED -bio - -// black : 2014-01-16 Afilias Limited -black - -// blackfriday : 2014-01-16 Uniregistry, Corp. -blackfriday - -// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC -bloomberg - -// blue : 2013-11-07 Afilias Limited -blue - -// bms : 2014-10-30 Bristol-Myers Squibb Company -bms - -// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft -bmw - -// bnl : 2014-07-24 Banca Nazionale del Lavoro -bnl - -// bnpparibas : 2014-05-29 BNP Paribas -bnpparibas - -// boats : 2014-12-04 DERBoats, LLC -boats - -// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br -bom - -// bond : 2014-06-05 Bond University Limited -bond - -// boo : 2014-01-30 Charleston Road Registry Inc. -boo - -// boots : 2015-01-08 THE BOOTS COMPANY PLC -boots - -// bot : 2014-12-18 Amazon EU S.à r.l. -bot - -// boutique : 2013-11-14 Over Galley, LLC -boutique - -// bradesco : 2014-12-18 Banco Bradesco S.A. -bradesco - -// bridgestone : 2014-12-18 Bridgestone Corporation -bridgestone - -// broadway : 2014-12-22 Celebrate Broadway, Inc. -broadway - -// broker : 2014-12-11 IG Group Holdings PLC -broker - -// brother : 2015-01-29 Brother Industries, Ltd. -brother - -// brussels : 2014-02-06 DNS.be vzw -brussels - -// budapest : 2013-11-21 Top Level Domain Holdings Limited -budapest - -// build : 2013-11-07 Plan Bee LLC -build - -// builders : 2013-11-07 Atomic Madison, LLC -builders - -// business : 2013-11-07 Spring Cross, LLC -business - -// buy : 2014-12-18 Amazon EU S.à r.l. -buy - -// buzz : 2013-10-02 DOTSTRATEGY CO. -buzz - -// bzh : 2014-02-27 Association www.bzh -bzh - -// cab : 2013-10-24 Half Sunset, LLC -cab - -// cafe : 2015-02-11 Pioneer Canyon, LLC -cafe - -// cal : 2014-07-24 Charleston Road Registry Inc. -cal - -// call : 2014-12-18 Amazon EU S.à r.l. -call - -// camera : 2013-08-27 Atomic Maple, LLC -camera - -// camp : 2013-11-07 Delta Dynamite, LLC -camp - -// cancerresearch : 2014-05-15 Australian Cancer Research Foundation -cancerresearch - -// canon : 2014-09-12 Canon Inc. -canon - -// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry -capetown - -// capital : 2014-03-06 Delta Mill, LLC -capital - -// car : 2015-01-22 Charleston Road Registry Inc. -car - -// caravan : 2013-12-12 Caravan International, Inc. -caravan - -// cards : 2013-12-05 Foggy Hollow, LLC -cards - -// care : 2014-03-06 Goose Cross -care - -// career : 2013-10-09 dotCareer LLC -career - -// careers : 2013-10-02 Wild Corner, LLC -careers - -// cars : 2014-11-13 Uniregistry, Corp. -cars - -// cartier : 2014-06-23 Richemont DNS Inc. -cartier - -// casa : 2013-11-21 Top Level Domain Holdings Limited -casa - -// cash : 2014-03-06 Delta Lake, LLC -cash - -// casino : 2014-12-18 Binky Sky, LLC -casino - -// catering : 2013-12-05 New Falls. LLC -catering - -// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -cba - -// cbn : 2014-08-22 The Christian Broadcasting Network, Inc. -cbn - -// ceb : 2015-04-09 The Corporate Executive Board Company -ceb - -// center : 2013-11-07 Tin Mill, LLC -center - -// ceo : 2013-11-07 CEOTLD Pty Ltd -ceo - -// cern : 2014-06-05 European Organization for Nuclear Research ("CERN") -cern - -// cfa : 2014-08-28 CFA Institute -cfa - -// cfd : 2014-12-11 IG Group Holdings PLC -cfd - -// chanel : 2015-04-09 Chanel International B.V. -chanel - -// channel : 2014-05-08 Charleston Road Registry Inc. -channel - -// chase : 2015-04-30 JPMorgan Chase & Co. -chase - -// chat : 2014-12-04 Sand Fields, LLC -chat - -// cheap : 2013-11-14 Sand Cover, LLC -cheap - -// chloe : 2014-10-16 Richemont DNS Inc. -chloe - -// christmas : 2013-11-21 Uniregistry, Corp. -christmas - -// chrome : 2014-07-24 Charleston Road Registry Inc. -chrome - -// church : 2014-02-06 Holly Fields, LLC -church - -// cipriani : 2015-02-19 Hotel Cipriani Srl -cipriani - -// circle : 2014-12-18 Amazon EU S.à r.l. -circle - -// cisco : 2014-12-22 Cisco Technology, Inc. -cisco - -// citic : 2014-01-09 CITIC Group Corporation -citic - -// city : 2014-05-29 Snow Sky, LLC -city - -// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. -cityeats - -// claims : 2014-03-20 Black Corner, LLC -claims - -// cleaning : 2013-12-05 Fox Shadow, LLC -cleaning - -// click : 2014-06-05 Uniregistry, Corp. -click - -// clinic : 2014-03-20 Goose Park, LLC -clinic - -// clothing : 2013-08-27 Steel Lake, LLC -clothing - -// cloud : 2015-04-16 ARUBA S.p.A. -cloud - -// club : 2013-11-08 .CLUB DOMAINS, LLC -club - -// coach : 2014-10-09 Koko Island, LLC -coach - -// codes : 2013-10-31 Puff Willow, LLC -codes - -// coffee : 2013-10-17 Trixy Cover, LLC -coffee - -// college : 2014-01-16 XYZ.COM LLC -college - -// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH -cologne - -// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -commbank - -// community : 2013-12-05 Fox Orchard, LLC -community - -// company : 2013-11-07 Silver Avenue, LLC -company - -// computer : 2013-10-24 Pine Mill, LLC -computer - -// comsec : 2015-01-08 VeriSign, Inc. -comsec - -// condos : 2013-12-05 Pine House, LLC -condos - -// construction : 2013-09-16 Fox Dynamite, LLC -construction - -// consulting : 2013-12-05 -consulting - -// contact : 2015-01-08 Top Level Spectrum, Inc. -contact - -// contractors : 2013-09-10 Magic Woods, LLC -contractors - -// cooking : 2013-11-21 Top Level Domain Holdings Limited -cooking - -// cool : 2013-11-14 Koko Lake, LLC -cool - -// corsica : 2014-09-25 Collectivité Territoriale de Corse -corsica - -// country : 2013-12-19 Top Level Domain Holdings Limited -country - -// coupon : 2015-02-26 Amazon EU S.à r.l. -coupon - -// coupons : 2015-03-26 Black Island, LLC -coupons - -// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD -courses - -// credit : 2014-03-20 Snow Shadow, LLC -credit - -// creditcard : 2014-03-20 Binky Frostbite, LLC -creditcard - -// creditunion : 2015-01-22 CUNA Performance Resources, LLC -creditunion - -// cricket : 2014-10-09 dot Cricket Limited -cricket - -// crown : 2014-10-24 Crown Equipment Corporation -crown - -// crs : 2014-04-03 Federated Co-operatives Limited -crs - -// cruises : 2013-12-05 Spring Way, LLC -cruises - -// csc : 2014-09-25 Alliance-One Services, Inc. -csc - -// cuisinella : 2014-04-03 SALM S.A.S. -cuisinella - -// cymru : 2014-05-08 Nominet UK -cymru - -// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd. -cyou - -// dabur : 2014-02-06 Dabur India Limited -dabur - -// dad : 2014-01-23 Charleston Road Registry Inc. -dad - -// dance : 2013-10-24 United TLD Holdco Ltd. -dance - -// date : 2014-11-20 dot Date Limited -date - -// dating : 2013-12-05 Pine Fest, LLC -dating - -// datsun : 2014-03-27 NISSAN MOTOR CO., LTD. -datsun - -// day : 2014-01-30 Charleston Road Registry Inc. -day - -// dclk : 2014-11-20 Charleston Road Registry Inc. -dclk - -// dealer : 2014-12-22 Dealer Dot Com, Inc. -dealer - -// deals : 2014-05-22 Sand Sunset, LLC -deals - -// degree : 2014-03-06 -degree - -// delivery : 2014-09-11 Steel Station, LLC -delivery - -// dell : 2014-10-24 Dell Inc. -dell - -// delta : 2015-02-19 Delta Air Lines, Inc. -delta - -// democrat : 2013-10-24 United TLD Holdco Ltd. -democrat - -// dental : 2014-03-20 Tin Birch, LLC -dental - -// dentist : 2014-03-20 -dentist - -// desi : 2013-11-14 Desi Networks LLC -desi - -// design : 2014-11-07 Top Level Design, LLC -design - -// dev : 2014-10-16 Charleston Road Registry Inc. -dev - -// diamonds : 2013-09-22 John Edge, LLC -diamonds - -// diet : 2014-06-26 Uniregistry, Corp. -diet - -// digital : 2014-03-06 Dash Park, LLC -digital - -// direct : 2014-04-10 Half Trail, LLC -direct - -// directory : 2013-09-20 Extra Madison, LLC -directory - -// discount : 2014-03-06 Holly Hill, LLC -discount - -// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd. -dnp - -// docs : 2014-10-16 Charleston Road Registry Inc. -docs - -// dog : 2014-12-04 Koko Mill, LLC -dog - -// doha : 2014-09-18 Communications Regulatory Authority (CRA) -doha - -// domains : 2013-10-17 Sugar Cross, LLC -domains - -// doosan : 2014-04-03 Doosan Corporation -doosan - -// download : 2014-11-20 dot Support Limited -download - -// drive : 2015-03-05 Charleston Road Registry Inc. -drive - -// dstv : 2015-03-12 MultiChoice (Proprietary) Limited -dstv - -// dubai : 2015-01-01 Dubai Smart Government Department -dubai - -// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry -durban - -// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -dvag - -// earth : 2014-12-04 Interlink Co., Ltd. -earth - -// eat : 2014-01-23 Charleston Road Registry Inc. -eat - -// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V. -edeka - -// education : 2013-11-07 Brice Way, LLC -education - -// email : 2013-10-31 Spring Madison, LLC -email - -// emerck : 2014-04-03 Merck KGaA -emerck - -// energy : 2014-09-11 Binky Birch, LLC -energy - -// engineer : 2014-03-06 United TLD Holdco Ltd. -engineer - -// engineering : 2014-03-06 Romeo Canyon -engineering - -// enterprises : 2013-09-20 Snow Oaks, LLC -enterprises - -// epson : 2014-12-04 Seiko Epson Corporation -epson - -// equipment : 2013-08-27 Corn Station, LLC -equipment - -// erni : 2014-04-03 ERNI Group Holding AG -erni - -// esq : 2014-05-08 Charleston Road Registry Inc. -esq - -// estate : 2013-08-27 Trixy Park, LLC -estate - -// eurovision : 2014-04-24 European Broadcasting Union (EBU) -eurovision - -// eus : 2013-12-12 Puntueus Fundazioa -eus - -// events : 2013-12-05 Pioneer Maple, LLC -events - -// everbank : 2014-05-15 EverBank -everbank - -// exchange : 2014-03-06 Spring Falls, LLC -exchange - -// expert : 2013-11-21 Magic Pass, LLC -expert - -// exposed : 2013-12-05 Victor Beach, LLC -exposed - -// express : 2015-02-11 Sea Sunset, LLC -express - -// fage : 2014-12-18 Fage International S.A. -fage - -// fail : 2014-03-06 Atomic Pipe, LLC -fail - -// fairwinds : 2014-11-13 FairWinds Partners, LLC -fairwinds - -// faith : 2014-11-20 dot Faith Limited -faith - -// family : 2015-04-02 Bitter Galley, LLC -family - -// fan : 2014-03-06 -fan - -// fans : 2014-11-07 Asiamix Digital Limited -fans - -// farm : 2013-11-07 Just Maple, LLC -farm - -// fashion : 2014-07-03 Top Level Domain Holdings Limited -fashion - -// fast : 2014-12-18 Amazon EU S.à r.l. -fast - -// feedback : 2013-12-19 Top Level Spectrum, Inc. -feedback - -// ferrero : 2014-12-18 Ferrero Trading Lux S.A. -ferrero - -// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd -film - -// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br -final - -// finance : 2014-03-20 Cotton Cypress, LLC -finance - -// financial : 2014-03-06 Just Cover, LLC -financial - -// firestone : 2014-12-18 Bridgestone Corporation -firestone - -// firmdale : 2014-03-27 Firmdale Holdings Limited -firmdale - -// fish : 2013-12-12 Fox Woods, LLC -fish - -// fishing : 2013-11-21 Top Level Domain Holdings Limited -fishing - -// fit : 2014-11-07 Top Level Domain Holdings Limited -fit - -// fitness : 2014-03-06 Brice Orchard, LLC -fitness - -// flickr : 2015-04-02 Yahoo! Domain Services Inc. -flickr - -// flights : 2013-12-05 Fox Station, LLC -flights - -// florist : 2013-11-07 Half Cypress, LLC -florist - -// flowers : 2014-10-09 Uniregistry, Corp. -flowers - -// flsmidth : 2014-07-24 FLSmidth A/S -flsmidth - -// fly : 2014-05-08 Charleston Road Registry Inc. -fly - -// foo : 2014-01-23 Charleston Road Registry Inc. -foo - -// football : 2014-12-18 Foggy Farms, LLC -football - -// ford : 2014-11-13 Ford Motor Company -ford - -// forex : 2014-12-11 IG Group Holdings PLC -forex - -// forsale : 2014-05-22 -forsale - -// forum : 2015-04-02 Fegistry, LLC -forum - -// foundation : 2013-12-05 John Dale, LLC -foundation - -// frl : 2014-05-15 FRLregistry B.V. -frl - -// frogans : 2013-12-19 OP3FT -frogans - -// frontier : 2015-02-05 Frontier Communications Corporation -frontier - -// fund : 2014-03-20 John Castle, LLC -fund - -// furniture : 2014-03-20 Lone Fields, LLC -furniture - -// futbol : 2013-09-20 -futbol - -// fyi : 2015-04-02 Silver Tigers, LLC -fyi - -// gal : 2013-11-07 Asociación puntoGAL -gal - -// gallery : 2013-09-13 Sugar House, LLC -gallery - -// gallup : 2015-02-19 Gallup, Inc. -gallup - -// garden : 2014-06-26 Top Level Domain Holdings Limited -garden - -// gbiz : 2014-07-17 Charleston Road Registry Inc. -gbiz - -// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems" -gdn - -// gea : 2014-12-04 GEA Group Aktiengesellschaft -gea - -// gent : 2014-01-23 COMBELL GROUP NV/SA -gent - -// genting : 2015-03-12 Resorts World Inc Pte. Ltd. -genting - -// ggee : 2014-01-09 GMO Internet, Inc. -ggee - -// gift : 2013-10-17 Uniregistry, Corp. -gift - -// gifts : 2014-07-03 Goose Sky, LLC -gifts - -// gives : 2014-03-06 United TLD Holdco Ltd. -gives - -// giving : 2014-11-13 Giving Limited -giving - -// glass : 2013-11-07 Black Cover, LLC -glass - -// gle : 2014-07-24 Charleston Road Registry Inc. -gle - -// global : 2014-04-17 Dot GLOBAL AS -global - -// globo : 2013-12-19 Globo Comunicação e Participações S.A -globo - -// gmail : 2014-05-01 Charleston Road Registry Inc. -gmail - -// gmo : 2014-01-09 GMO Internet, Inc. -gmo - -// gmx : 2014-04-24 1&1 Mail & Media GmbH -gmx - -// gold : 2015-01-22 June Edge, LLC -gold - -// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. -goldpoint - -// golf : 2014-12-18 Lone falls, LLC -golf - -// goo : 2014-12-18 NTT Resonant Inc. -goo - -// goog : 2014-11-20 Charleston Road Registry Inc. -goog - -// google : 2014-07-24 Charleston Road Registry Inc. -google - -// gop : 2014-01-16 Republican State Leadership Committee, Inc. -gop - -// got : 2014-12-18 Amazon EU S.à r.l. -got - -// gotv : 2015-03-12 MultiChoice (Proprietary) Limited -gotv - -// graphics : 2013-09-13 Over Madison, LLC -graphics - -// gratis : 2014-03-20 Pioneer Tigers, LLC -gratis - -// green : 2014-05-08 Afilias Limited -green - -// gripe : 2014-03-06 Corn Sunset, LLC -gripe - -// group : 2014-08-15 Romeo Town, LLC -group - -// gucci : 2014-11-13 Guccio Gucci S.p.a. -gucci - -// guge : 2014-08-28 Charleston Road Registry Inc. -guge - -// guide : 2013-09-13 Snow Moon, LLC -guide - -// guitars : 2013-11-14 Uniregistry, Corp. -guitars - -// guru : 2013-08-27 Pioneer Cypress, LLC -guru - -// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH -hamburg - -// hangout : 2014-11-13 Charleston Road Registry Inc. -hangout - -// haus : 2013-12-05 -haus - -// hdfcbank : 2015-02-12 HDFC Bank Limited -hdfcbank - -// health : 2015-02-11 DotHealth, LLC -health - -// healthcare : 2014-06-12 Silver Glen, LLC -healthcare - -// help : 2014-06-26 Uniregistry, Corp. -help - -// helsinki : 2015-02-05 City of Helsinki -helsinki - -// here : 2014-02-06 Charleston Road Registry Inc. -here - -// hermes : 2014-07-10 HERMES INTERNATIONAL -hermes - -// hiphop : 2014-03-06 Uniregistry, Corp. -hiphop - -// hitachi : 2014-10-31 Hitachi, Ltd. -hitachi - -// hiv : 2014-03-13 dotHIV gemeinnuetziger e.V. -hiv - -// hockey : 2015-03-19 Half Willow, LLC -hockey - -// holdings : 2013-08-27 John Madison, LLC -holdings - -// holiday : 2013-11-07 Goose Woods, LLC -holiday - -// homedepot : 2015-04-02 Homer TLC, Inc. -homedepot - -// homes : 2014-01-09 DERHomes, LLC -homes - -// honda : 2014-12-18 Honda Motor Co., Ltd. -honda - -// horse : 2013-11-21 Top Level Domain Holdings Limited -horse - -// host : 2014-04-17 DotHost Inc. -host - -// hosting : 2014-05-29 Uniregistry, Corp. -hosting - -// hoteles : 2015-03-05 Travel Reservations SRL -hoteles - -// hotmail : 2014-12-18 Microsoft Corporation -hotmail - -// house : 2013-11-07 Sugar Park, LLC -house - -// how : 2014-01-23 Charleston Road Registry Inc. -how - -// hsbc : 2014-10-24 HSBC Holdings PLC -hsbc - -// htc : 2015-04-02 HTC corporation -htc - -// ibm : 2014-07-31 International Business Machines Corporation -ibm - -// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited -icbc - -// ice : 2014-10-30 IntercontinentalExchange, Inc. -ice - -// icu : 2015-01-08 One.com A/S -icu - -// ifm : 2014-01-30 ifm electronic gmbh -ifm - -// iinet : 2014-07-03 Connect West Pty. Ltd. -iinet - -// immo : 2014-07-10 Auburn Bloom, LLC -immo - -// immobilien : 2013-11-07 United TLD Holdco Ltd. -immobilien - -// industries : 2013-12-05 Outer House, LLC -industries - -// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD. -infiniti - -// ing : 2014-01-23 Charleston Road Registry Inc. -ing - -// ink : 2013-12-05 Top Level Design, LLC -ink - -// institute : 2013-11-07 Outer Maple, LLC -institute - -// insurance : 2015-02-19 fTLD Registry Services LLC -insurance - -// insure : 2014-03-20 Pioneer Willow, LLC -insure - -// international : 2013-11-07 Wild Way, LLC -international - -// investments : 2014-03-20 Holly Glen, LLC -investments - -// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. -ipiranga - -// irish : 2014-08-07 Dot-Irish LLC -irish - -// iselect : 2015-02-11 iSelect Ltd -iselect - -// ist : 2014-08-28 Istanbul Metropolitan Municipality -ist - -// istanbul : 2014-08-28 Istanbul Metropolitan Municipality -istanbul - -// itau : 2014-10-02 Itau Unibanco Holding S.A. -itau - -// iwc : 2014-06-23 Richemont DNS Inc. -iwc - -// jaguar : 2014-11-13 Jaguar Land Rover Ltd -jaguar - -// java : 2014-06-19 Oracle Corporation -java - -// jcb : 2014-11-20 JCB Co., Ltd. -jcb - -// jcp : 2015-04-23 JCP Media, Inc. -jcp - -// jetzt : 2014-01-09 New TLD Company AB -jetzt - -// jewelry : 2015-03-05 Wild Bloom, LLC -jewelry - -// jio : 2015-04-02 Affinity Names, Inc. -jio - -// jlc : 2014-12-04 Richemont DNS Inc. -jlc - -// jll : 2015-04-02 Jones Lang LaSalle Incorporated -jll - -// jmp : 2015-03-26 Matrix IP LLC -jmp - -// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry -joburg - -// jot : 2014-12-18 Amazon EU S.à r.l. -jot - -// joy : 2014-12-18 Amazon EU S.à r.l. -joy - -// jpmorgan : 2015-04-30 JPMorgan Chase & Co. -jpmorgan - -// jprs : 2014-09-18 Japan Registry Services Co., Ltd. -jprs - -// juegos : 2014-03-20 Uniregistry, Corp. -juegos - -// kaufen : 2013-11-07 United TLD Holdco Ltd. -kaufen - -// kddi : 2014-09-12 KDDI CORPORATION -kddi - -// kerryhotels : 2015-04-30 Kerry Trading Co. Limited -kerryhotels - -// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited -kerrylogistics - -// kerryproperties : 2015-04-09 Kerry Trading Co. Limited -kerryproperties - -// kfh : 2014-12-04 Kuwait Finance House -kfh - -// kim : 2013-09-23 Afilias Limited -kim - -// kinder : 2014-11-07 Ferrero Trading Lux S.A. -kinder - -// kitchen : 2013-09-20 Just Goodbye, LLC -kitchen - -// kiwi : 2013-09-20 DOT KIWI LIMITED -kiwi - -// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH -koeln - -// komatsu : 2015-01-08 Komatsu Ltd. -komatsu - -// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft) -kpmg - -// kpn : 2015-01-08 Koninklijke KPN N.V. -kpn - -// krd : 2013-12-05 KRG Department of Information Technology -krd - -// kred : 2013-12-19 KredTLD Pty Ltd -kred - -// kuokgroup : 2015-04-09 Kerry Trading Co. Limited -kuokgroup - -// kyknet : 2015-03-05 Electronic Media Network (Pty) Ltd -kyknet - -// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen -kyoto - -// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA -lacaixa - -// lancaster : 2015-02-12 LANCASTER -lancaster - -// land : 2013-09-10 Pine Moon, LLC -land - -// landrover : 2014-11-13 Jaguar Land Rover Ltd -landrover - -// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated -lasalle - -// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico -lat - -// latrobe : 2014-06-16 La Trobe University -latrobe - -// law : 2015-01-22 Minds + Machines Group Limited -law - -// lawyer : 2014-03-20 -lawyer - -// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") -lds - -// lease : 2014-03-06 Victor Trail, LLC -lease - -// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc -leclerc - -// legal : 2014-10-16 Blue Falls, LLC -legal - -// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION -lexus - -// lgbt : 2014-05-08 Afilias Limited -lgbt - -// liaison : 2014-10-02 Liaison Technologies, Incorporated -liaison - -// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG -lidl - -// life : 2014-02-06 Trixy Oaks, LLC -life - -// lifeinsurance : 2015-01-15 American Council of Life Insurers -lifeinsurance - -// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc. -lifestyle - -// lighting : 2013-08-27 John McCook, LLC -lighting - -// like : 2014-12-18 Amazon EU S.à r.l. -like - -// limited : 2014-03-06 Big Fest, LLC -limited - -// limo : 2013-10-17 Hidden Frostbite, LLC -limo - -// lincoln : 2014-11-13 Ford Motor Company -lincoln - -// linde : 2014-12-04 Linde Aktiengesellschaft -linde - -// link : 2013-11-14 Uniregistry, Corp. -link - -// live : 2014-12-04 Half Woods, LLC -live - -// lixil : 2015-03-19 LIXIL Group Corporation -lixil - -// loan : 2014-11-20 dot Loan Limited -loan - -// loans : 2014-03-20 June Woods, LLC -loans - -// lol : 2015-01-30 Uniregistry, Corp. -lol - -// london : 2013-11-14 Dot London Domains Limited -london - -// lotte : 2014-11-07 Lotte Holdings Co., Ltd. -lotte - -// lotto : 2014-04-10 Afilias Limited -lotto - -// love : 2014-12-22 Merchant Law Group LLP -love - -// ltd : 2014-09-25 Over Corner, LLC -ltd - -// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA -ltda - -// lupin : 2014-11-07 LUPIN LIMITED -lupin - -// luxe : 2014-01-09 Top Level Domain Holdings Limited -luxe - -// luxury : 2013-10-17 Luxury Partners, LLC -luxury - -// madrid : 2014-05-01 Comunidad de Madrid -madrid - -// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF) -maif - -// maison : 2013-12-05 Victor Frostbite, LLC -maison - -// makeup : 2015-01-15 L'Oréal -makeup - -// man : 2014-12-04 MAN SE -man - -// management : 2013-11-07 John Goodbye, LLC -management - -// mango : 2013-10-24 PUNTO FA S.L. -mango - -// market : 2014-03-06 -market - -// marketing : 2013-11-07 Fern Pass, LLC -marketing - -// markets : 2014-12-11 IG Group Holdings PLC -markets - -// marriott : 2014-10-09 Marriott Worldwide Corporation -marriott - -// mba : 2015-04-02 Lone Hollow, LLC -mba - -// media : 2014-03-06 Grand Glen, LLC -media - -// meet : 2014-01-16 -meet - -// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation -melbourne - -// meme : 2014-01-30 Charleston Road Registry Inc. -meme - -// memorial : 2014-10-16 Dog Beach, LLC -memorial - -// men : 2015-02-26 Exclusive Registry Limited -men - -// menu : 2013-09-11 Wedding TLD2, LLC -menu - -// meo : 2014-11-07 PT Comunicacoes S.A. -meo - -// miami : 2013-12-19 Top Level Domain Holdings Limited -miami - -// microsoft : 2014-12-18 Microsoft Corporation -microsoft - -// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft -mini - -// mls : 2015-04-23 The Canadian Real Estate Association -mls - -// mma : 2014-11-07 MMA IARD -mma - -// mnet : 2015-03-05 Electronic Media Network (Pty) Ltd -mnet - -// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L. -mobily - -// moda : 2013-11-07 United TLD Holdco Ltd. -moda - -// moe : 2013-11-13 Interlink Co., Ltd. -moe - -// moi : 2014-12-18 Amazon EU S.à r.l. -moi - -// mom : 2015-04-16 Uniregistry, Corp. -mom - -// monash : 2013-09-30 Monash University -monash - -// money : 2014-10-16 Outer McCook, LLC -money - -// montblanc : 2014-06-23 Richemont DNS Inc. -montblanc - -// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant") -mormon - -// mortgage : 2014-03-20 -mortgage - -// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) -moscow - -// motorcycles : 2014-01-09 DERMotorcycles, LLC -motorcycles - -// mov : 2014-01-30 Charleston Road Registry Inc. -mov - -// movie : 2015-02-05 New Frostbite, LLC -movie - -// movistar : 2014-10-16 Telefónica S.A. -movistar - -// mtn : 2014-12-04 MTN Dubai Limited -mtn - -// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation -mtpc - -// mtr : 2015-03-12 MTR Corporation Limited -mtr - -// multichoice : 2015-03-12 MultiChoice (Proprietary) Limited -multichoice - -// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC -mutual - -// mzansimagic : 2015-03-05 Electronic Media Network (Pty) Ltd -mzansimagic - -// nadex : 2014-12-11 IG Group Holdings PLC -nadex - -// nagoya : 2013-10-24 GMO Registry, Inc. -nagoya - -// naspers : 2015-02-12 Intelprop (Proprietary) Limited -naspers - -// natura : 2015-03-12 NATURA COSMÉTICOS S.A. -natura - -// navy : 2014-03-06 United TLD Holdco Ltd. -navy - -// nec : 2015-01-08 NEC Corporation -nec - -// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -netbank - -// network : 2013-11-14 Trixy Manor, LLC -network - -// neustar : 2013-12-05 NeuStar, Inc. -neustar - -// new : 2014-01-30 Charleston Road Registry Inc. -new - -// news : 2014-12-18 -news - -// nexus : 2014-07-24 Charleston Road Registry Inc. -nexus - -// ngo : 2014-03-06 Public Interest Registry -ngo - -// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK) -nhk - -// nico : 2014-12-04 DWANGO Co., Ltd. -nico - -// ninja : 2013-11-07 United TLD Holdco Ltd. -ninja - -// nissan : 2014-03-27 NISSAN MOTOR CO., LTD. -nissan - -// nokia : 2015-01-08 Nokia Corporation -nokia - -// norton : 2014-12-04 Symantec Corporation -norton - -// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -nowruz - -// nra : 2014-05-22 NRA Holdings Company, INC. -nra - -// nrw : 2013-11-21 Minds + Machines GmbH -nrw - -// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION -ntt - -// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications -nyc - -// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA -obi - -// observer : 2015-04-30 Guardian News and Media Limited -observer - -// office : 2015-03-12 Microsoft Corporation -office - -// okinawa : 2013-12-05 BusinessRalliart Inc. -okinawa - -// omega : 2015-01-08 The Swatch Group Ltd -omega - -// one : 2014-11-07 One.com A/S -one - -// ong : 2014-03-06 Public Interest Registry -ong - -// onl : 2013-09-16 I-Registry Ltd. -onl - -// online : 2015-01-15 DotOnline Inc. -online - -// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED -ooo - -// oracle : 2014-06-19 Oracle Corporation -oracle - -// orange : 2015-03-12 Orange Brand Services Limited -orange - -// organic : 2014-03-27 Afilias Limited -organic - -// orientexpress : 2015-02-05 Belmond Ltd. -orientexpress - -// osaka : 2014-09-04 Interlink Co., Ltd. -osaka - -// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd. -otsuka - -// ovh : 2014-01-16 OVH SAS -ovh - -// page : 2014-12-04 Charleston Road Registry Inc. -page - -// pamperedchef : 2015-02-05 The Pampered Chef, Ltd. -pamperedchef - -// panerai : 2014-11-07 Richemont DNS Inc. -panerai - -// paris : 2014-01-30 City of Paris -paris - -// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -pars - -// partners : 2013-12-05 Magic Glen, LLC -partners - -// parts : 2013-12-05 Sea Goodbye, LLC -parts - -// party : 2014-09-11 Blue Sky Registry Limited -party - -// passagens : 2015-03-05 Travel Reservations SRL -passagens - -// payu : 2015-02-12 MIH PayU B.V. -payu - -// pharmacy : 2014-06-19 National Association of Boards of Pharmacy -pharmacy - -// philips : 2014-11-07 Koninklijke Philips N.V. -philips - -// photo : 2013-11-14 Uniregistry, Corp. -photo - -// photography : 2013-09-20 Sugar Glen, LLC -photography - -// photos : 2013-10-17 Sea Corner, LLC -photos - -// physio : 2014-05-01 PhysBiz Pty Ltd -physio - -// piaget : 2014-10-16 Richemont DNS Inc. -piaget - -// pics : 2013-11-14 Uniregistry, Corp. -pics - -// pictet : 2014-06-26 Pictet Europe S.A. -pictet - -// pictures : 2014-03-06 Foggy Sky, LLC -pictures - -// pid : 2015-01-08 Top Level Spectrum, Inc. -pid - -// pin : 2014-12-18 Amazon EU S.à r.l. -pin - -// pink : 2013-10-01 Afilias Limited -pink - -// pizza : 2014-06-26 Foggy Moon, LLC -pizza - -// place : 2014-04-24 Snow Galley, LLC -place - -// play : 2015-03-05 Charleston Road Registry Inc. -play - -// plumbing : 2013-09-10 Spring Tigers, LLC -plumbing - -// plus : 2015-02-05 Sugar Mill, LLC -plus - -// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -pohl - -// poker : 2014-07-03 Afilias Domains No. 5 Limited -poker - -// porn : 2014-10-16 ICM Registry PN LLC -porn - -// praxi : 2013-12-05 Praxi S.p.A. -praxi - -// press : 2014-04-03 DotPress Inc. -press - -// prod : 2014-01-23 Charleston Road Registry Inc. -prod - -// productions : 2013-12-05 Magic Birch, LLC -productions - -// prof : 2014-07-24 Charleston Road Registry Inc. -prof - -// promo : 2014-12-18 Play.PROMO Oy -promo - -// properties : 2013-12-05 Big Pass, LLC -properties - -// property : 2014-05-22 Uniregistry, Corp. -property - -// protection : 2015-04-23 Symantec Corporation -protection - -// pub : 2013-12-12 United TLD Holdco Ltd. -pub - -// qpon : 2013-11-14 dotCOOL, Inc. -qpon - -// quebec : 2013-12-19 PointQuébec Inc -quebec - -// quest : 2015-03-26 Quest ION Limited -quest - -// racing : 2014-12-04 Premier Registry Limited -racing - -// read : 2014-12-18 Amazon EU S.à r.l. -read - -// realtor : 2014-05-29 Real Estate Domains LLC -realtor - -// realty : 2015-03-19 Fegistry, LLC -realty - -// recipes : 2013-10-17 Grand Island, LLC -recipes - -// red : 2013-11-07 Afilias Limited -red - -// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd. -redstone - -// redumbrella : 2015-03-26 Travelers TLD, LLC -redumbrella - -// rehab : 2014-03-06 United TLD Holdco Ltd. -rehab - -// reise : 2014-03-13 dotreise GmbH -reise - -// reisen : 2014-03-06 New Cypress, LLC -reisen - -// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc. -reit - -// reliance : 2015-04-02 Reliance Industries Limited -reliance - -// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd. -ren - -// rent : 2014-12-04 DERRent, LLC -rent - -// rentals : 2013-12-05 Big Hollow,LLC -rentals - -// repair : 2013-11-07 Lone Sunset, LLC -repair - -// report : 2013-12-05 Binky Glen, LLC -report - -// republican : 2014-03-20 United TLD Holdco Ltd. -republican - -// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable -rest - -// restaurant : 2014-07-03 Snow Avenue, LLC -restaurant - -// review : 2014-11-20 dot Review Limited -review - -// reviews : 2013-09-13 -reviews - -// rich : 2013-11-21 I-Registry Ltd. -rich - -// ricoh : 2014-11-20 Ricoh Company, Ltd. -ricoh - -// ril : 2015-04-02 Reliance Industries Limited -ril - -// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO -rio - -// rip : 2014-07-10 United TLD Holdco Ltd. -rip - -// rocher : 2014-12-18 Ferrero Trading Lux S.A. -rocher - -// rocks : 2013-11-14 -rocks - -// rodeo : 2013-12-19 Top Level Domain Holdings Limited -rodeo - -// room : 2014-12-18 Amazon EU S.à r.l. -room - -// rsvp : 2014-05-08 Charleston Road Registry Inc. -rsvp - -// ruhr : 2013-10-02 regiodot GmbH & Co. KG -ruhr - -// run : 2015-03-19 Snow Park, LLC -run - -// rwe : 2015-04-02 RWE AG -rwe - -// ryukyu : 2014-01-09 BusinessRalliart Inc. -ryukyu - -// saarland : 2013-12-12 dotSaarland GmbH -saarland - -// safe : 2014-12-18 Amazon EU S.à r.l. -safe - -// safety : 2015-01-08 Safety Registry Services, LLC. -safety - -// sakura : 2014-12-18 SAKURA Internet Inc. -sakura - -// sale : 2014-10-16 -sale - -// salon : 2014-12-11 Outer Orchard, LLC -salon - -// samsung : 2014-04-03 SAMSUNG SDS CO., LTD -samsung - -// sandvik : 2014-11-13 Sandvik AB -sandvik - -// sandvikcoromant : 2014-11-07 Sandvik AB -sandvikcoromant - -// sanofi : 2014-10-09 Sanofi -sanofi - -// sap : 2014-03-27 SAP AG -sap - -// sapo : 2014-11-07 PT Comunicacoes S.A. -sapo - -// sarl : 2014-07-03 Delta Orchard, LLC -sarl - -// sas : 2015-04-02 Research IP LLC -sas - -// saxo : 2014-10-31 Saxo Bank A/S -saxo - -// sbi : 2015-03-12 STATE BANK OF INDIA -sbi - -// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION -sbs - -// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ) -sca - -// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB") -scb - -// schmidt : 2014-04-03 SALM S.A.S. -schmidt - -// scholarships : 2014-04-24 Scholarships.com, LLC -scholarships - -// school : 2014-12-18 Little Galley, LLC -school - -// schule : 2014-03-06 Outer Moon, LLC -schule - -// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG -schwarz - -// science : 2014-09-11 dot Science Limited -science - -// scor : 2014-10-31 SCOR SE -scor - -// scot : 2014-01-23 Dot Scot Registry Limited -scot - -// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal) -seat - -// seek : 2014-12-04 Seek Limited -seek - -// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A. -sener - -// services : 2014-02-27 Fox Castle, LLC -services - -// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG -sew - -// sex : 2014-11-13 ICM Registry SX LLC -sex - -// sexy : 2013-09-11 Uniregistry, Corp. -sexy - -// sharp : 2014-05-01 Sharp Corporation -sharp - -// shaw : 2015-04-23 Shaw Cablesystems G.P. -shaw - -// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -shia - -// shiksha : 2013-11-14 Afilias Limited -shiksha - -// shoes : 2013-10-02 Binky Galley, LLC -shoes - -// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -shouji - -// show : 2015-03-05 Snow Beach, LLC -show - -// shriram : 2014-01-23 Shriram Capital Ltd. -shriram - -// sina : 2015-03-12 Sina Corporation -sina - -// singles : 2013-08-27 Fern Madison, LLC -singles - -// site : 2015-01-15 DotSite Inc. -site - -// ski : 2015-04-09 STARTING DOT LIMITED -ski - -// skin : 2015-01-15 L'Oréal -skin - -// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch -sky - -// skype : 2014-12-18 Microsoft Corporation -skype - -// smile : 2014-12-18 Amazon EU S.à r.l. -smile - -// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F -sncf - -// soccer : 2015-03-26 Foggy Shadow, LLC -soccer - -// social : 2013-11-07 United TLD Holdco Ltd. -social - -// software : 2014-03-20 -software - -// sohu : 2013-12-19 Sohu.com Limited -sohu - -// solar : 2013-11-07 Ruby Town, LLC -solar - -// solutions : 2013-11-07 Silver Cover, LLC -solutions - -// song : 2015-02-26 Amazon EU S.à r.l. -song - -// sony : 2015-01-08 Sony Corporation -sony - -// soy : 2014-01-23 Charleston Road Registry Inc. -soy - -// space : 2014-04-03 DotSpace Inc. -space - -// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG -spiegel - -// spot : 2015-02-26 Amazon EU S.à r.l. -spot - -// spreadbetting : 2014-12-11 IG Group Holdings PLC -spreadbetting - -// stada : 2014-11-13 STADA Arzneimittel AG -stada - -// star : 2015-01-08 Star India Private Limited -star - -// starhub : 2015-02-05 StarHub Limited -starhub - -// statebank : 2015-03-12 STATE BANK OF INDIA -statebank - -// statoil : 2014-12-04 Statoil ASA -statoil - -// stc : 2014-10-09 Saudi Telecom Company -stc - -// stcgroup : 2014-10-09 Saudi Telecom Company -stcgroup - -// stockholm : 2014-12-18 Stockholms kommun -stockholm - -// storage : 2014-12-22 Self Storage Company LLC -storage - -// store : 2015-04-09 DotStore Inc. -store - -// studio : 2015-02-11 Spring Goodbye, LLC -studio - -// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD -study - -// style : 2014-12-04 Binky Moon, LLC -style - -// sucks : 2014-12-22 Vox Populi Registry Inc. -sucks - -// supersport : 2015-03-05 SuperSport International Holdings Proprietary Limited -supersport - -// supplies : 2013-12-19 Atomic Fields, LLC -supplies - -// supply : 2013-12-19 Half Falls, LLC -supply - -// support : 2013-10-24 Grand Orchard, LLC -support - -// surf : 2014-01-09 Top Level Domain Holdings Limited -surf - -// surgery : 2014-03-20 Tin Avenue, LLC -surgery - -// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION -suzuki - -// swatch : 2015-01-08 The Swatch Group Ltd -swatch - -// swiss : 2014-10-16 Swiss Confederation -swiss - -// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet -sydney - -// symantec : 2014-12-04 Symantec Corporation -symantec - -// systems : 2013-11-07 Dash Cypress, LLC -systems - -// tab : 2014-12-04 Tabcorp Holdings Limited -tab - -// taipei : 2014-07-10 Taipei City Government -taipei - -// talk : 2015-04-09 Amazon EU S.à r.l. -talk - -// taobao : 2015-01-15 Alibaba Group Holding Limited -taobao - -// tatamotors : 2015-03-12 Tata Motors Ltd -tatamotors - -// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic" -tatar - -// tattoo : 2013-08-30 Uniregistry, Corp. -tattoo - -// tax : 2014-03-20 Storm Orchard, LLC -tax - -// taxi : 2015-03-19 Pine Falls, LLC -taxi - -// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -tci - -// team : 2015-03-05 Atomic Lake, LLC -team - -// tech : 2015-01-30 Dot Tech LLC -tech - -// technology : 2013-09-13 Auburn Falls -technology - -// telecity : 2015-02-19 TelecityGroup International Limited -telecity - -// telefonica : 2014-10-16 Telefónica S.A. -telefonica - -// temasek : 2014-08-07 Temasek Holdings (Private) Limited -temasek - -// tennis : 2014-12-04 Cotton Bloom, LLC -tennis - -// thd : 2015-04-02 Homer TLC, Inc. -thd - -// theater : 2015-03-19 Blue Tigers, LLC -theater - -// theguardian : 2015-04-30 Guardian News and Media Limited -theguardian - -// tickets : 2015-02-05 Accent Media Limited -tickets - -// tienda : 2013-11-14 Victor Manor, LLC -tienda - -// tiffany : 2015-01-30 Tiffany and Company -tiffany - -// tips : 2013-09-20 Corn Willow, LLC -tips - -// tires : 2014-11-07 Dog Edge, LLC -tires - -// tirol : 2014-04-24 punkt Tirol GmbH -tirol - -// tmall : 2015-01-15 Alibaba Group Holding Limited -tmall - -// today : 2013-09-20 Pearl Woods, LLC -today - -// tokyo : 2013-11-13 GMO Registry, Inc. -tokyo - -// tools : 2013-11-21 Pioneer North, LLC -tools - -// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd. -top - -// toray : 2014-12-18 Toray Industries, Inc. -toray - -// toshiba : 2014-04-10 TOSHIBA Corporation -toshiba - -// tours : 2015-01-22 Sugar Station, LLC -tours - -// town : 2014-03-06 Koko Moon, LLC -town - -// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION -toyota - -// toys : 2014-03-06 Pioneer Orchard, LLC -toys - -// trade : 2014-01-23 Elite Registry Limited -trade - -// trading : 2014-12-11 IG Group Holdings PLC -trading - -// training : 2013-11-07 Wild Willow, LLC -training - -// travelers : 2015-03-26 Travelers TLD, LLC -travelers - -// travelersinsurance : 2015-03-26 Travelers TLD, LLC -travelersinsurance - -// trust : 2014-10-16 -trust - -// trv : 2015-03-26 Travelers TLD, LLC -trv - -// tui : 2014-07-03 TUI AG -tui - -// tunes : 2015-02-26 Amazon EU S.à r.l. -tunes - -// tushu : 2014-12-18 Amazon EU S.à r.l. -tushu - -// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED -tvs - -// ubs : 2014-12-11 UBS AG -ubs - -// university : 2014-03-06 Little Station, LLC -university - -// uno : 2013-09-11 Dot Latin LLC -uno - -// uol : 2014-05-01 UBN INTERNET LTDA. -uol - -// vacations : 2013-12-05 Atomic Tigers, LLC -vacations - -// vana : 2014-12-11 Lifestyle Domain Holdings, Inc. -vana - -// vegas : 2014-01-16 Dot Vegas, Inc. -vegas - -// ventures : 2013-08-27 Binky Lake, LLC -ventures - -// versicherung : 2014-03-20 dotversicherung-registry GmbH -versicherung - -// vet : 2014-03-06 -vet - -// viajes : 2013-10-17 Black Madison, LLC -viajes - -// video : 2014-10-16 -video - -// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd. -viking - -// villas : 2013-12-05 New Sky, LLC -villas - -// vip : 2015-01-22 Minds + Machines Group Limited -vip - -// virgin : 2014-09-25 Virgin Enterprises Limited -virgin - -// vision : 2013-12-05 Koko Station, LLC -vision - -// vista : 2014-09-18 Vistaprint Limited -vista - -// vistaprint : 2014-09-18 Vistaprint Limited -vistaprint - -// viva : 2014-11-07 Saudi Telecom Company -viva - -// vlaanderen : 2014-02-06 DNS.be vzw -vlaanderen - -// vodka : 2013-12-19 Top Level Domain Holdings Limited -vodka - -// vote : 2013-11-21 Monolith Registry LLC -vote - -// voting : 2013-11-13 Valuetainment Corp. -voting - -// voto : 2013-11-21 Monolith Registry LLC -voto - -// voyage : 2013-08-27 Ruby House, LLC -voyage - -// vuelos : 2015-03-05 Travel Reservations SRL -vuelos - -// wales : 2014-05-08 Nominet UK -wales - -// walter : 2014-11-13 Sandvik AB -walter - -// wang : 2013-10-24 Zodiac Leo Limited -wang - -// wanggou : 2014-12-18 Amazon EU S.à r.l. -wanggou - -// watch : 2013-11-14 Sand Shadow, LLC -watch - -// watches : 2014-12-22 Richemont DNS Inc. -watches - -// weather : 2015-01-08 The Weather Channel, LLC -weather - -// weatherchannel : 2015-03-12 The Weather Channel, LLC -weatherchannel - -// webcam : 2014-01-23 dot Webcam Limited -webcam - -// website : 2014-04-03 DotWebsite Inc. -website - -// wed : 2013-10-01 Atgron, Inc. -wed - -// wedding : 2014-04-24 Top Level Domain Holdings Limited -wedding - -// weibo : 2015-03-05 Sina Corporation -weibo - -// weir : 2015-01-29 Weir Group IP Limited -weir - -// whoswho : 2014-02-20 Who's Who Registry -whoswho - -// wien : 2013-10-28 punkt.wien GmbH -wien - -// wiki : 2013-11-07 Top Level Design, LLC -wiki - -// williamhill : 2014-03-13 William Hill Organization Limited -williamhill - -// win : 2014-11-20 First Registry Limited -win - -// windows : 2014-12-18 Microsoft Corporation -windows - -// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC -wme - -// work : 2013-12-19 Top Level Domain Holdings Limited -work - -// works : 2013-11-14 Little Dynamite, LLC -works - -// world : 2014-06-12 Bitter Fields, LLC -world - -// wtc : 2013-12-19 World Trade Centers Association, Inc. -wtc - -// wtf : 2014-03-06 Hidden Way, LLC -wtf - -// xbox : 2014-12-18 Microsoft Corporation -xbox - -// xerox : 2014-10-24 Xerox DNHC LLC -xerox - -// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -xihuan - -// xin : 2014-12-11 Elegant Leader Limited -xin - -// xn--11b4c3d : 2015-01-15 VeriSign Sarl -कॉम - -// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l. -セール - -// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd. -佛山 - -// xn--30rr7y : 2014-06-12 Excellent First Limited -慈善 - -// xn--3bst00m : 2013-09-13 Eagle Horizon Limited -集团 - -// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED -在线 - -// xn--3pxu8k : 2015-01-15 VeriSign Sarl -点看 - -// xn--42c2d9a : 2015-01-15 VeriSign Sarl -คอม - -// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited -八卦 - -// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment -موقع - -// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center -公益 - -// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) -公司 - -// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited -网站 - -// xn--6frz82g : 2013-09-23 Afilias Limited -移动 - -// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited -我爱你 - -// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) -москва - -// xn--80asehdb : 2013-07-14 CORE Association -онлайн - -// xn--80aswg : 2013-07-14 CORE Association -сайт - -// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited -联通 - -// xn--9dbq2a : 2015-01-15 VeriSign Sarl -קום - -// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED -时尚 - -// xn--9krt00a : 2015-03-12 Sina Corporation -微博 - -// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited -淡马锡 - -// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l. -ファッション - -// xn--c1avg : 2013-11-14 Public Interest Registry -орг - -// xn--c2br7g : 2015-01-15 VeriSign Sarl -नेट - -// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l. -ストア - -// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD -삼성 - -// xn--czr694b : 2014-01-16 HU YI GLOBAL INFORMATION RESOURCES (HOLDING) COMPANY.HONGKONG LIMITED -商标 - -// xn--czrs0t : 2013-12-19 Wild Island, LLC -商店 - -// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited -商城 - -// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet” -дети - -// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l. -ポイント - -// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch 新华通讯社广东分社 -新闻 - -// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited -工行 - -// xn--fct429k : 2015-04-09 Amazon EU S.à r.l. -家電 - -// xn--fhbei : 2015-01-15 VeriSign Sarl -كوم - -// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED -中文网 - -// xn--fiq64b : 2013-10-14 CITIC Group Corporation -中信 - -// xn--fjq720a : 2014-05-22 Will Bloom, LLC -娱乐 - -// xn--flw351e : 2014-07-31 Charleston Road Registry Inc. -谷歌 - -// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited -购物 - -// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l. -クラウド - -// xn--hxt814e : 2014-05-15 Zodiac Libra Limited -网店 - -// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry -संगठन - -// xn--imr513n : 2014-12-11 HU YI GLOBAL INFORMATION RESOURCES (HOLDING) COMPANY. HONGKONG LIMITED -餐厅 - -// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center) -网络 - -// xn--j1aef : 2015-01-15 VeriSign Sarl -ком - -// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation -诺基亚 - -// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l. -食品 - -// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V. -飞利浦 - -// xn--kpu716f : 2014-12-22 Richemont DNS Inc. -手表 - -// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd -手机 - -// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company -ارامكو - -// xn--mgbab2bd : 2013-10-31 CORE Association -بازار - -// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L. -موبايلي - -// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti. -همراه - -// xn--mk1bu44c : 2015-01-15 VeriSign Sarl -닷컴 - -// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd. -政府 - -// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd. -شبكة - -// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House -بيتك - -// xn--nqv7f : 2013-11-14 Public Interest Registry -机构 - -// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry -组织机构 - -// xn--nyqy26a : 2014-11-07 Stable Tone Limited -健康 - -// xn--p1acf : 2013-12-12 Rusnames Limited -рус - -// xn--pbt977c : 2014-12-22 Richemont DNS Inc. -珠宝 - -// xn--pssy2u : 2015-01-15 VeriSign Sarl -大拿 - -// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc. -みんな - -// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc. -グーグル - -// xn--rhqv96g : 2013-09-11 Stable Tone Limited -世界 - -// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l. -書籍 - -// xn--ses554g : 2014-01-16 -网址 - -// xn--t60b56a : 2015-01-15 VeriSign Sarl -닷넷 - -// xn--tckwe : 2015-01-15 VeriSign Sarl -コム - -// xn--unup4y : 2013-07-14 Spring Fields, LLC -游戏 - -// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -vermögensberater - -// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG -vermögensberatung - -// xn--vhquv : 2013-08-27 Dash McCook, LLC -企业 - -// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd. -信息 - -// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited -嘉里大酒店 - -// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd. -广东 - -// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center -政务 - -// xyz : 2013-12-05 XYZ.COM LLC -xyz - -// yachts : 2014-01-09 DERYachts, LLC -yachts - -// yahoo : 2015-04-02 Yahoo! Domain Services Inc. -yahoo - -// yamaxun : 2014-12-18 Amazon EU S.à r.l. -yamaxun - -// yandex : 2014-04-10 YANDEX, LLC -yandex - -// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. -yodobashi - -// yoga : 2014-05-29 Top Level Domain Holdings Limited -yoga - -// yokohama : 2013-12-12 GMO Registry, Inc. -yokohama - -// you : 2015-04-09 Amazon EU S.à r.l. -you - -// youtube : 2014-05-01 Charleston Road Registry Inc. -youtube - -// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -yun - -// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) -zara - -// zero : 2014-12-18 Amazon EU S.à r.l. -zero - -// zip : 2014-05-08 Charleston Road Registry Inc. -zip - -// zone : 2013-11-14 Outer Falls, LLC -zone - -// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich) -zuerich - - -// ===END ICANN DOMAINS=== -// ===BEGIN PRIVATE DOMAINS=== -// (Note: these are in alphabetical order by company name) - -// Amazon CloudFront : https://aws.amazon.com/cloudfront/ -// Submitted by Donavan Miller 2013-03-22 -cloudfront.net - -// Amazon Elastic Compute Cloud: https://aws.amazon.com/ec2/ -// Submitted by Osman Surkatty 2014-12-16 -ap-northeast-1.compute.amazonaws.com -ap-southeast-1.compute.amazonaws.com -ap-southeast-2.compute.amazonaws.com -cn-north-1.compute.amazonaws.cn -compute.amazonaws.cn -compute.amazonaws.com -compute-1.amazonaws.com -eu-west-1.compute.amazonaws.com -eu-central-1.compute.amazonaws.com -sa-east-1.compute.amazonaws.com -us-east-1.amazonaws.com -us-gov-west-1.compute.amazonaws.com -us-west-1.compute.amazonaws.com -us-west-2.compute.amazonaws.com -z-1.compute-1.amazonaws.com -z-2.compute-1.amazonaws.com - -// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/ -// Submitted by Adam Stein 2013-04-02 -elasticbeanstalk.com - -// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/ -// Submitted by Scott Vidmar 2013-03-27 -elb.amazonaws.com - -// Amazon S3 : https://aws.amazon.com/s3/ -// Submitted by Courtney Eckhardt 2013-03-22 -s3.amazonaws.com -s3-us-west-2.amazonaws.com -s3-us-west-1.amazonaws.com -s3-eu-west-1.amazonaws.com -s3-ap-southeast-1.amazonaws.com -s3-ap-southeast-2.amazonaws.com -s3-ap-northeast-1.amazonaws.com -s3-sa-east-1.amazonaws.com -s3-us-gov-west-1.amazonaws.com -s3-fips-us-gov-west-1.amazonaws.com -s3-website-us-east-1.amazonaws.com -s3-website-us-west-2.amazonaws.com -s3-website-us-west-1.amazonaws.com -s3-website-eu-west-1.amazonaws.com -s3-website-ap-southeast-1.amazonaws.com -s3-website-ap-southeast-2.amazonaws.com -s3-website-ap-northeast-1.amazonaws.com -s3-website-sa-east-1.amazonaws.com -s3-website-us-gov-west-1.amazonaws.com - -// BetaInABox -// Submitted by adrian@betainabox.com 2012-09-13 -betainabox.com - -// CentralNic : http://www.centralnic.com/names/domains -// Submitted by registry 2012-09-27 -ae.org -ar.com -br.com -cn.com -com.de -com.se -de.com -eu.com -gb.com -gb.net -hu.com -hu.net -jp.net -jpn.com -kr.com -mex.com -no.com -qc.com -ru.com -sa.com -se.com -se.net -uk.com -uk.net -us.com -uy.com -za.bz -za.com - -// Africa.com Web Solutions Ltd : https://registry.africa.com -// Submitted by Gavin Brown 2014-02-04 -africa.com - -// iDOT Services Limited : http://www.domain.gr.com -// Submitted by Gavin Brown 2014-02-04 -gr.com - -// Radix FZC : http://domains.in.net -// Submitted by Gavin Brown 2014-02-04 -in.net - -// US REGISTRY LLC : http://us.org -// Submitted by Gavin Brown 2014-02-04 -us.org - -// co.com Registry, LLC : https://registry.co.com -// Submitted by Gavin Brown 2014-02-04 -co.com - -// c.la : http://www.c.la/ -c.la - -// cloudControl : https://www.cloudcontrol.com/ -// Submitted by Tobias Wilken 2013-07-23 -cloudcontrolled.com -cloudcontrolapp.com - -// co.ca : http://registry.co.ca/ -co.ca - -// CoDNS B.V. -co.nl -co.no - -// Commerce Guys, SAS -// Submitted by Damien Tournoud 2015-01-22 -*.platform.sh - -// Cupcake : https://cupcake.io/ -// Submitted by Jonathan Rudenberg 2013-10-08 -cupcake.is - -// DreamHost : http://www.dreamhost.com/ -// Submitted by Andrew Farmer 2012-10-02 -dreamhosters.com - -// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ -dyndns-at-home.com -dyndns-at-work.com -dyndns-blog.com -dyndns-free.com -dyndns-home.com -dyndns-ip.com -dyndns-mail.com -dyndns-office.com -dyndns-pics.com -dyndns-remote.com -dyndns-server.com -dyndns-web.com -dyndns-wiki.com -dyndns-work.com -dyndns.biz -dyndns.info -dyndns.org -dyndns.tv -at-band-camp.net -ath.cx -barrel-of-knowledge.info -barrell-of-knowledge.info -better-than.tv -blogdns.com -blogdns.net -blogdns.org -blogsite.org -boldlygoingnowhere.org -broke-it.net -buyshouses.net -cechire.com -dnsalias.com -dnsalias.net -dnsalias.org -dnsdojo.com -dnsdojo.net -dnsdojo.org -does-it.net -doesntexist.com -doesntexist.org -dontexist.com -dontexist.net -dontexist.org -doomdns.com -doomdns.org -dvrdns.org -dyn-o-saur.com -dynalias.com -dynalias.net -dynalias.org -dynathome.net -dyndns.ws -endofinternet.net -endofinternet.org -endoftheinternet.org -est-a-la-maison.com -est-a-la-masion.com -est-le-patron.com -est-mon-blogueur.com -for-better.biz -for-more.biz -for-our.info -for-some.biz -for-the.biz -forgot.her.name -forgot.his.name -from-ak.com -from-al.com -from-ar.com -from-az.net -from-ca.com -from-co.net -from-ct.com -from-dc.com -from-de.com -from-fl.com -from-ga.com -from-hi.com -from-ia.com -from-id.com -from-il.com -from-in.com -from-ks.com -from-ky.com -from-la.net -from-ma.com -from-md.com -from-me.org -from-mi.com -from-mn.com -from-mo.com -from-ms.com -from-mt.com -from-nc.com -from-nd.com -from-ne.com -from-nh.com -from-nj.com -from-nm.com -from-nv.com -from-ny.net -from-oh.com -from-ok.com -from-or.com -from-pa.com -from-pr.com -from-ri.com -from-sc.com -from-sd.com -from-tn.com -from-tx.com -from-ut.com -from-va.com -from-vt.com -from-wa.com -from-wi.com -from-wv.com -from-wy.com -ftpaccess.cc -fuettertdasnetz.de -game-host.org -game-server.cc -getmyip.com -gets-it.net -go.dyndns.org -gotdns.com -gotdns.org -groks-the.info -groks-this.info -ham-radio-op.net -here-for-more.info -hobby-site.com -hobby-site.org -home.dyndns.org -homedns.org -homeftp.net -homeftp.org -homeip.net -homelinux.com -homelinux.net -homelinux.org -homeunix.com -homeunix.net -homeunix.org -iamallama.com -in-the-band.net -is-a-anarchist.com -is-a-blogger.com -is-a-bookkeeper.com -is-a-bruinsfan.org -is-a-bulls-fan.com -is-a-candidate.org -is-a-caterer.com -is-a-celticsfan.org -is-a-chef.com -is-a-chef.net -is-a-chef.org -is-a-conservative.com -is-a-cpa.com -is-a-cubicle-slave.com -is-a-democrat.com -is-a-designer.com -is-a-doctor.com -is-a-financialadvisor.com -is-a-geek.com -is-a-geek.net -is-a-geek.org -is-a-green.com -is-a-guru.com -is-a-hard-worker.com -is-a-hunter.com -is-a-knight.org -is-a-landscaper.com -is-a-lawyer.com -is-a-liberal.com -is-a-libertarian.com -is-a-linux-user.org -is-a-llama.com -is-a-musician.com -is-a-nascarfan.com -is-a-nurse.com -is-a-painter.com -is-a-patsfan.org -is-a-personaltrainer.com -is-a-photographer.com -is-a-player.com -is-a-republican.com -is-a-rockstar.com -is-a-socialist.com -is-a-soxfan.org -is-a-student.com -is-a-teacher.com -is-a-techie.com -is-a-therapist.com -is-an-accountant.com -is-an-actor.com -is-an-actress.com -is-an-anarchist.com -is-an-artist.com -is-an-engineer.com -is-an-entertainer.com -is-by.us -is-certified.com -is-found.org -is-gone.com -is-into-anime.com -is-into-cars.com -is-into-cartoons.com -is-into-games.com -is-leet.com -is-lost.org -is-not-certified.com -is-saved.org -is-slick.com -is-uberleet.com -is-very-bad.org -is-very-evil.org -is-very-good.org -is-very-nice.org -is-very-sweet.org -is-with-theband.com -isa-geek.com -isa-geek.net -isa-geek.org -isa-hockeynut.com -issmarterthanyou.com -isteingeek.de -istmein.de -kicks-ass.net -kicks-ass.org -knowsitall.info -land-4-sale.us -lebtimnetz.de -leitungsen.de -likes-pie.com -likescandy.com -merseine.nu -mine.nu -misconfused.org -mypets.ws -myphotos.cc -neat-url.com -office-on-the.net -on-the-web.tv -podzone.net -podzone.org -readmyblog.org -saves-the-whales.com -scrapper-site.net -scrapping.cc -selfip.biz -selfip.com -selfip.info -selfip.net -selfip.org -sells-for-less.com -sells-for-u.com -sells-it.net -sellsyourhome.org -servebbs.com -servebbs.net -servebbs.org -serveftp.net -serveftp.org -servegame.org -shacknet.nu -simple-url.com -space-to-rent.com -stuff-4-sale.org -stuff-4-sale.us -teaches-yoga.com -thruhere.net -traeumtgerade.de -webhop.biz -webhop.info -webhop.net -webhop.org -worse-than.tv -writesthisblog.com - -// EU.org https://eu.org/ -// Submitted by Pierre Beyssac 2015-04-17 - -eu.org -al.eu.org -asso.eu.org -at.eu.org -au.eu.org -be.eu.org -bg.eu.org -ca.eu.org -cd.eu.org -ch.eu.org -cn.eu.org -cy.eu.org -cz.eu.org -de.eu.org -dk.eu.org -edu.eu.org -ee.eu.org -es.eu.org -fi.eu.org -fr.eu.org -gr.eu.org -hr.eu.org -hu.eu.org -ie.eu.org -il.eu.org -in.eu.org -int.eu.org -is.eu.org -it.eu.org -jp.eu.org -kr.eu.org -lt.eu.org -lu.eu.org -lv.eu.org -mc.eu.org -me.eu.org -mk.eu.org -mt.eu.org -my.eu.org -net.eu.org -ng.eu.org -nl.eu.org -no.eu.org -nz.eu.org -paris.eu.org -pl.eu.org -pt.eu.org -q-a.eu.org -ro.eu.org -ru.eu.org -se.eu.org -si.eu.org -sk.eu.org -tr.eu.org -uk.eu.org -us.eu.org - -// Fastly Inc. http://www.fastly.com/ -// Submitted by Vladimir Vuksan 2013-05-31 -a.ssl.fastly.net -b.ssl.fastly.net -global.ssl.fastly.net -a.prod.fastly.net -global.prod.fastly.net - -// Firebase, Inc. -// Submitted by Chris Raynor 2014-01-21 -firebaseapp.com - -// Flynn : https://flynn.io -// Submitted by Jonathan Rudenberg 2014-07-12 -flynnhub.com - -// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains -// Submitted by David Illsley 2014-08-28 -service.gov.uk - -// GitHub, Inc. -// Submitted by Ben Toews 2014-02-06 -github.io -githubusercontent.com - -// GlobeHosting, Inc. -// Submitted by Zoltan Egresi 2013-07-12 -ro.com - -// Google, Inc. -// Submitted by Eduardo Vela 2014-12-19 -appspot.com -blogspot.ae -blogspot.be -blogspot.bj -blogspot.ca -blogspot.cf -blogspot.ch -blogspot.co.at -blogspot.co.il -blogspot.co.nz -blogspot.co.uk -blogspot.com -blogspot.com.ar -blogspot.com.au -blogspot.com.br -blogspot.com.es -blogspot.com.tr -blogspot.cv -blogspot.cz -blogspot.de -blogspot.dk -blogspot.fi -blogspot.fr -blogspot.gr -blogspot.hk -blogspot.hu -blogspot.ie -blogspot.in -blogspot.it -blogspot.jp -blogspot.kr -blogspot.mr -blogspot.mx -blogspot.nl -blogspot.no -blogspot.pt -blogspot.re -blogspot.ro -blogspot.ru -blogspot.se -blogspot.sg -blogspot.sk -blogspot.td -blogspot.tw -codespot.com -googleapis.com -googlecode.com -pagespeedmobilizer.com -withgoogle.com - -// Heroku : https://www.heroku.com/ -// Submitted by Tom Maher 2013-05-02 -herokuapp.com -herokussl.com - -// iki.fi -// Submitted by Hannu Aronsson 2009-11-05 -iki.fi - -// info.at : http://www.info.at/ -biz.at -info.at - -// Michau Enterprises Limited : http://www.co.pl/ -co.pl - -// Microsoft : http://microsoft.com -// Submitted by Barry Dorrans 2014-01-24 -azurewebsites.net -azure-mobile.net -cloudapp.net - -// Neustar Inc. -// Submitted by Trung Tran 2015-04-23 -4u.com - -// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ -// Submitted by Jeff Wheelhouse 2014-02-02 -nfshost.com - -// NYC.mn : http://www.information.nyc.mn -// Submitted by Matthew Brown 2013-03-11 -nyc.mn - -// One Fold Media : http://www.onefoldmedia.com/ -// Submitted by Eddie Jones 2014-06-10 -nid.io - -// Opera Software, A.S.A. -// Submitted by Yngve Pettersen 2009-11-26 -operaunite.com - -// OutSystems -// Submitted by Duarte Santos 2014-03-11 -outsystemscloud.com - -// .pl domains (grandfathered) -art.pl -gliwice.pl -krakow.pl -poznan.pl -wroc.pl -zakopane.pl - -// priv.at : http://www.nic.priv.at/ -// Submitted by registry 2008-06-09 -priv.at - -// Red Hat, Inc. OpenShift : https://openshift.redhat.com/ -// Submitted by Tim Kramer 2012-10-24 -rhcloud.com - -// SinaAppEngine : http://sae.sina.com.cn/ -// Submitted by SinaAppEngine 2015-02-02 -sinaapp.com -vipsinaapp.com -1kapp.com - -// TASK geographical domains (www.task.gda.pl/uslugi/dns) -gda.pl -gdansk.pl -gdynia.pl -med.pl -sopot.pl - -// UDR Limited : http://www.udr.hk.com -// Submitted by registry 2014-11-07 -hk.com -hk.org -ltd.hk -inc.hk - -// Yola : https://www.yola.com/ -// Submitted by Stefano Rivera 2014-07-09 -yolasite.com - -// ZaNiC : http://www.za.net/ -// Submitted by registry 2009-10-03 -za.net -za.org - -// ===END PRIVATE DOMAINS=== diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/api_test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/api_test.js deleted file mode 100644 index b21326c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/api_test.js +++ /dev/null @@ -1,372 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ -'use strict'; -var vows = require('vows'); -var assert = require('assert'); -var async = require('async'); -var tough = require('../lib/cookie'); -var Cookie = tough.Cookie; -var CookieJar = tough.CookieJar; - - -var atNow = Date.now(); - -function at(offset) { - return {now: new Date(atNow + offset)}; -} - -vows - .describe('API') - .addBatch({ - "All defined": function () { - assert.ok(Cookie); - assert.ok(CookieJar); - } - }) - .addBatch({ - "Constructor": { - topic: function () { - return new Cookie({ - key: 'test', - value: 'b', - maxAge: 60 - }); - }, - 'check for key property': function (c) { - assert.ok(c); - assert.equal(c.key, 'test'); - }, - 'check for value property': function (c) { - assert.equal(c.value, 'b'); - }, - 'check for maxAge': function (c) { - assert.equal(c.maxAge, 60); - }, - 'check for default values for unspecified properties': function (c) { - assert.equal(c.expires, "Infinity"); - assert.equal(c.secure, false); - assert.equal(c.httpOnly, false); - } - } - }) - .addBatch({ - "expiry option": { - topic: function () { - var cb = this.callback; - var cj = new CookieJar(); - cj.setCookie('near=expiry; Domain=example.com; Path=/; Max-Age=1', 'http://www.example.com', at(-1), function (err, cookie) { - - cb(err, {cj: cj, cookie: cookie}); - }); - }, - "set the cookie": function (t) { - assert.ok(t.cookie, "didn't set?!"); - assert.equal(t.cookie.key, 'near'); - }, - "then, retrieving": { - topic: function (t) { - var cb = this.callback; - setTimeout(function () { - t.cj.getCookies('http://www.example.com', {http: true, expire: false}, function (err, cookies) { - t.cookies = cookies; - cb(err, t); - }); - }, 2000); - }, - "got the cookie": function (t) { - assert.lengthOf(t.cookies, 1); - assert.equal(t.cookies[0].key, 'near'); - } - } - } - }) - .addBatch({ - "allPaths option": { - topic: function () { - var cj = new CookieJar(); - var tasks = []; - tasks.push(cj.setCookie.bind(cj, 'nopath_dom=qq; Path=/; Domain=example.com', 'http://example.com', {})); - tasks.push(cj.setCookie.bind(cj, 'path_dom=qq; Path=/foo; Domain=example.com', 'http://example.com', {})); - tasks.push(cj.setCookie.bind(cj, 'nopath_host=qq; Path=/', 'http://www.example.com', {})); - tasks.push(cj.setCookie.bind(cj, 'path_host=qq; Path=/foo', 'http://www.example.com', {})); - tasks.push(cj.setCookie.bind(cj, 'other=qq; Path=/', 'http://other.example.com/', {})); - tasks.push(cj.setCookie.bind(cj, 'other2=qq; Path=/foo', 'http://other.example.com/foo', {})); - var cb = this.callback; - async.parallel(tasks, function (err, results) { - cb(err, {cj: cj, cookies: results}); - }); - }, - "all set": function (t) { - assert.equal(t.cookies.length, 6); - assert.ok(t.cookies.every(function (c) { - return !!c - })); - }, - "getting without allPaths": { - topic: function (t) { - var cb = this.callback; - var cj = t.cj; - cj.getCookies('http://www.example.com/', {}, function (err, cookies) { - cb(err, {cj: cj, cookies: cookies}); - }); - }, - "found just two cookies": function (t) { - assert.equal(t.cookies.length, 2); - }, - "all are path=/": function (t) { - assert.ok(t.cookies.every(function (c) { - return c.path === '/' - })); - }, - "no 'other' cookies": function (t) { - assert.ok(!t.cookies.some(function (c) { - return (/^other/).test(c.name) - })); - } - }, - "getting without allPaths for /foo": { - topic: function (t) { - var cb = this.callback; - var cj = t.cj; - cj.getCookies('http://www.example.com/foo', {}, function (err, cookies) { - cb(err, {cj: cj, cookies: cookies}); - }); - }, - "found four cookies": function (t) { - assert.equal(t.cookies.length, 4); - }, - "no 'other' cookies": function (t) { - assert.ok(!t.cookies.some(function (c) { - return (/^other/).test(c.name) - })); - } - }, - "getting with allPaths:true": { - topic: function (t) { - var cb = this.callback; - var cj = t.cj; - cj.getCookies('http://www.example.com/', {allPaths: true}, function (err, cookies) { - cb(err, {cj: cj, cookies: cookies}); - }); - }, - "found four cookies": function (t) { - assert.equal(t.cookies.length, 4); - }, - "no 'other' cookies": function (t) { - assert.ok(!t.cookies.some(function (c) { - return (/^other/).test(c.name) - })); - } - } - } - }) - .addBatch({ - "Remove cookies": { - topic: function () { - var jar = new CookieJar(); - var cookie = Cookie.parse("a=b; Domain=example.com; Path=/"); - var cookie2 = Cookie.parse("a=b; Domain=foo.com; Path=/"); - var cookie3 = Cookie.parse("foo=bar; Domain=foo.com; Path=/"); - jar.setCookie(cookie, 'http://example.com/index.html', function () { - }); - jar.setCookie(cookie2, 'http://foo.com/index.html', function () { - }); - jar.setCookie(cookie3, 'http://foo.com/index.html', function () { - }); - return jar; - }, - "all from matching domain": function (jar) { - jar.store.removeCookies('example.com', null, function (err) { - assert(err == null); - - jar.store.findCookies('example.com', null, function (err, cookies) { - assert(err == null); - assert(cookies != null); - assert(cookies.length === 0, 'cookie was not removed'); - }); - - jar.store.findCookies('foo.com', null, function (err, cookies) { - assert(err == null); - assert(cookies != null); - assert(cookies.length === 2, 'cookies should not have been removed'); - }); - }); - }, - "from cookie store matching domain and key": function (jar) { - jar.store.removeCookie('foo.com', '/', 'foo', function (err) { - assert(err == null); - - jar.store.findCookies('foo.com', null, function (err, cookies) { - assert(err == null); - assert(cookies != null); - assert(cookies.length === 1, 'cookie was not removed correctly'); - assert(cookies[0].key === 'a', 'wrong cookie was removed'); - }); - }); - } - } - }) - .addBatch({ - "Synchronous CookieJar": { - "setCookieSync": { - topic: function () { - var jar = new CookieJar(); - var cookie = Cookie.parse("a=b; Domain=example.com; Path=/"); - cookie = jar.setCookieSync(cookie, 'http://example.com/index.html'); - return cookie; - }, - "returns a copy of the cookie": function (cookie) { - assert.instanceOf(cookie, Cookie); - } - }, - "getCookiesSync": { - topic: function () { - var jar = new CookieJar(); - var url = 'http://example.com/index.html'; - jar.setCookieSync("a=b; Domain=example.com; Path=/", url); - jar.setCookieSync("c=d; Domain=example.com; Path=/", url); - return jar.getCookiesSync(url); - }, - "returns the cookie array": function (err, cookies) { - assert.ok(!err); - assert.ok(Array.isArray(cookies)); - assert.lengthOf(cookies, 2); - cookies.forEach(function (cookie) { - assert.instanceOf(cookie, Cookie); - }); - } - }, - - "getCookieStringSync": { - topic: function () { - var jar = new CookieJar(); - var url = 'http://example.com/index.html'; - jar.setCookieSync("a=b; Domain=example.com; Path=/", url); - jar.setCookieSync("c=d; Domain=example.com; Path=/", url); - return jar.getCookieStringSync(url); - }, - "returns the cookie header string": function (err, str) { - assert.ok(!err); - assert.typeOf(str, 'string'); - } - }, - - "getSetCookieStringsSync": { - topic: function () { - var jar = new CookieJar(); - var url = 'http://example.com/index.html'; - jar.setCookieSync("a=b; Domain=example.com; Path=/", url); - jar.setCookieSync("c=d; Domain=example.com; Path=/", url); - return jar.getSetCookieStringsSync(url); - }, - "returns the cookie header string": function (err, headers) { - assert.ok(!err); - assert.ok(Array.isArray(headers)); - assert.lengthOf(headers, 2); - headers.forEach(function (header) { - assert.typeOf(header, 'string'); - }); - } - } - } - }) - .addBatch({ - "Synchronous API on async CookieJar": { - topic: function () { - return new tough.Store(); - }, - "setCookieSync": { - topic: function (store) { - var jar = new CookieJar(store); - try { - jar.setCookieSync("a=b", 'http://example.com/index.html'); - return false; - } catch (e) { - return e; - } - }, - "fails": function (err) { - assert.instanceOf(err, Error); - assert.equal(err.message, - 'CookieJar store is not synchronous; use async API instead.'); - } - }, - "getCookiesSync": { - topic: function (store) { - var jar = new CookieJar(store); - try { - jar.getCookiesSync('http://example.com/index.html'); - return false; - } catch (e) { - return e; - } - }, - "fails": function (err) { - assert.instanceOf(err, Error); - assert.equal(err.message, - 'CookieJar store is not synchronous; use async API instead.'); - } - }, - "getCookieStringSync": { - topic: function (store) { - var jar = new CookieJar(store); - try { - jar.getCookieStringSync('http://example.com/index.html'); - return false; - } catch (e) { - return e; - } - }, - "fails": function (err) { - assert.instanceOf(err, Error); - assert.equal(err.message, - 'CookieJar store is not synchronous; use async API instead.'); - } - }, - "getSetCookieStringsSync": { - topic: function (store) { - var jar = new CookieJar(store); - try { - jar.getSetCookieStringsSync('http://example.com/index.html'); - return false; - } catch (e) { - return e; - } - }, - "fails": function (err) { - assert.instanceOf(err, Error); - assert.equal(err.message, - 'CookieJar store is not synchronous; use async API instead.'); - } - } - } - }) - .export(module); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_jar_test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_jar_test.js deleted file mode 100644 index 689407b..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_jar_test.js +++ /dev/null @@ -1,468 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ -'use strict'; -var vows = require('vows'); -var assert = require('assert'); -var async = require('async'); -var tough = require('../lib/cookie'); -var Cookie = tough.Cookie; -var CookieJar = tough.CookieJar; - -var atNow = Date.now(); - -function at(offset) { - return {now: new Date(atNow + offset)}; -} - -vows - .describe('CookieJar') - .addBatch({ - "Setting a basic cookie": { - topic: function () { - var cj = new CookieJar(); - var c = Cookie.parse("a=b; Domain=example.com; Path=/"); - assert.strictEqual(c.hostOnly, null); - assert.instanceOf(c.creation, Date); - assert.strictEqual(c.lastAccessed, null); - c.creation = new Date(Date.now() - 10000); - cj.setCookie(c, 'http://example.com/index.html', this.callback); - }, - "works": function (c) { - assert.instanceOf(c, Cookie) - }, // C is for Cookie, good enough for me - "gets timestamped": function (c) { - assert.ok(c.creation); - assert.ok(Date.now() - c.creation.getTime() < 5000); // recently stamped - assert.ok(c.lastAccessed); - assert.equal(c.creation, c.lastAccessed); - assert.equal(c.TTL(), Infinity); - assert.ok(!c.isPersistent()); - } - }, - "Setting a no-path cookie": { - topic: function () { - var cj = new CookieJar(); - var c = Cookie.parse("a=b; Domain=example.com"); - assert.strictEqual(c.hostOnly, null); - assert.instanceOf(c.creation, Date); - assert.strictEqual(c.lastAccessed, null); - c.creation = new Date(Date.now() - 10000); - cj.setCookie(c, 'http://example.com/index.html', this.callback); - }, - "domain": function (c) { - assert.equal(c.domain, 'example.com') - }, - "path is /": function (c) { - assert.equal(c.path, '/') - }, - "path was derived": function (c) { - assert.strictEqual(c.pathIsDefault, true) - } - }, - "Setting a cookie already marked as host-only": { - topic: function () { - var cj = new CookieJar(); - var c = Cookie.parse("a=b; Domain=example.com"); - assert.strictEqual(c.hostOnly, null); - assert.instanceOf(c.creation, Date); - assert.strictEqual(c.lastAccessed, null); - c.creation = new Date(Date.now() - 10000); - c.hostOnly = true; - cj.setCookie(c, 'http://example.com/index.html', this.callback); - }, - "domain": function (c) { - assert.equal(c.domain, 'example.com') - }, - "still hostOnly": function (c) { - assert.strictEqual(c.hostOnly, true) - } - }, - "Setting a session cookie": { - topic: function () { - var cj = new CookieJar(); - var c = Cookie.parse("a=b"); - assert.strictEqual(c.path, null); - cj.setCookie(c, 'http://www.example.com/dir/index.html', this.callback); - }, - "works": function (c) { - assert.instanceOf(c, Cookie) - }, - "gets the domain": function (c) { - assert.equal(c.domain, 'www.example.com') - }, - "gets the default path": function (c) { - assert.equal(c.path, '/dir') - }, - "is 'hostOnly'": function (c) { - assert.ok(c.hostOnly) - } - }, - "Setting wrong domain cookie": { - topic: function () { - var cj = new CookieJar(); - var c = Cookie.parse("a=b; Domain=fooxample.com; Path=/"); - cj.setCookie(c, 'http://example.com/index.html', this.callback); - }, - "fails": function (err, c) { - assert.ok(err.message.match(/domain/i)); - assert.ok(!c); - } - }, - "Setting sub-domain cookie": { - topic: function () { - var cj = new CookieJar(); - var c = Cookie.parse("a=b; Domain=www.example.com; Path=/"); - cj.setCookie(c, 'http://example.com/index.html', this.callback); - }, - "fails": function (err, c) { - assert.ok(err.message.match(/domain/i)); - assert.ok(!c); - } - }, - "Setting super-domain cookie": { - topic: function () { - var cj = new CookieJar(); - var c = Cookie.parse("a=b; Domain=example.com; Path=/"); - cj.setCookie(c, 'http://www.app.example.com/index.html', this.callback); - }, - "success": function (err, c) { - assert.ok(!err); - assert.equal(c.domain, 'example.com'); - } - }, - "Setting a sub-path cookie on a super-domain": { - topic: function () { - var cj = new CookieJar(); - var c = Cookie.parse("a=b; Domain=example.com; Path=/subpath"); - assert.strictEqual(c.hostOnly, null); - assert.instanceOf(c.creation, Date); - assert.strictEqual(c.lastAccessed, null); - c.creation = new Date(Date.now() - 10000); - cj.setCookie(c, 'http://www.example.com/index.html', this.callback); - }, - "domain is super-domain": function (c) { - assert.equal(c.domain, 'example.com') - }, - "path is /subpath": function (c) { - assert.equal(c.path, '/subpath') - }, - "path was NOT derived": function (c) { - assert.strictEqual(c.pathIsDefault, null) - } - }, - "Setting HttpOnly cookie over non-HTTP API": { - topic: function () { - var cj = new CookieJar(); - var c = Cookie.parse("a=b; Domain=example.com; Path=/; HttpOnly"); - cj.setCookie(c, 'http://example.com/index.html', {http: false}, this.callback); - }, - "fails": function (err, c) { - assert.match(err.message, /HttpOnly/i); - assert.ok(!c); - } - } - }) - .addBatch({ - "Store eight cookies": { - topic: function () { - var cj = new CookieJar(); - var ex = 'http://example.com/index.html'; - var tasks = []; - tasks.push(function (next) { - cj.setCookie('a=1; Domain=example.com; Path=/', ex, at(0), next); - }); - tasks.push(function (next) { - cj.setCookie('b=2; Domain=example.com; Path=/; HttpOnly', ex, at(1000), next); - }); - tasks.push(function (next) { - cj.setCookie('c=3; Domain=example.com; Path=/; Secure', ex, at(2000), next); - }); - tasks.push(function (next) { // path - cj.setCookie('d=4; Domain=example.com; Path=/foo', ex, at(3000), next); - }); - tasks.push(function (next) { // host only - cj.setCookie('e=5', ex, at(4000), next); - }); - tasks.push(function (next) { // other domain - cj.setCookie('f=6; Domain=nodejs.org; Path=/', 'http://nodejs.org', at(5000), next); - }); - tasks.push(function (next) { // expired - cj.setCookie('g=7; Domain=example.com; Path=/; Expires=Tue, 18 Oct 2011 00:00:00 GMT', ex, at(6000), next); - }); - tasks.push(function (next) { // expired via Max-Age - cj.setCookie('h=8; Domain=example.com; Path=/; Max-Age=1', ex, next); - }); - var cb = this.callback; - async.parallel(tasks, function (err, results) { - setTimeout(function () { - cb(err, cj, results); - }, 2000); // so that 'h=8' expires - }); - }, - "setup ok": function (err, cj, results) { - assert.ok(!err); - assert.ok(cj); - assert.ok(results); - }, - "then retrieving for http://nodejs.org": { - topic: function (cj, oldResults) { - assert.ok(oldResults); - cj.getCookies('http://nodejs.org', this.callback); - }, - "get a nodejs cookie": function (cookies) { - assert.lengthOf(cookies, 1); - var cookie = cookies[0]; - assert.equal(cookie.domain, 'nodejs.org'); - } - }, - "then retrieving for https://example.com": { - topic: function (cj, oldResults) { - assert.ok(oldResults); - cj.getCookies('https://example.com', {secure: true}, this.callback); - }, - "get a secure example cookie with others": function (cookies) { - var names = cookies.map(function (c) { - return c.key - }); - assert.deepEqual(names, ['a', 'b', 'c', 'e']); - } - }, - "then retrieving for https://example.com (missing options)": { - topic: function (cj, oldResults) { - assert.ok(oldResults); - cj.getCookies('https://example.com', this.callback); - }, - "get a secure example cookie with others": function (cookies) { - var names = cookies.map(function (c) { - return c.key - }); - assert.deepEqual(names, ['a', 'b', 'c', 'e']); - } - }, - "then retrieving for http://example.com": { - topic: function (cj, oldResults) { - assert.ok(oldResults); - cj.getCookies('http://example.com', this.callback); - }, - "get a bunch of cookies": function (cookies) { - var names = cookies.map(function (c) { - return c.key - }); - assert.deepEqual(names, ['a', 'b', 'e']); - } - }, - "then retrieving for http://EXAMPlE.com": { - topic: function (cj, oldResults) { - assert.ok(oldResults); - cj.getCookies('http://EXAMPlE.com', this.callback); - }, - "get a bunch of cookies": function (cookies) { - var names = cookies.map(function (c) { - return c.key - }); - assert.deepEqual(names, ['a', 'b', 'e']); - } - }, - "then retrieving for http://example.com, non-HTTP": { - topic: function (cj, oldResults) { - assert.ok(oldResults); - cj.getCookies('http://example.com', {http: false}, this.callback); - }, - "get a bunch of cookies": function (cookies) { - var names = cookies.map(function (c) { - return c.key - }); - assert.deepEqual(names, ['a', 'e']); - } - }, - "then retrieving for http://example.com/foo/bar": { - topic: function (cj, oldResults) { - assert.ok(oldResults); - cj.getCookies('http://example.com/foo/bar', this.callback); - }, - "get a bunch of cookies": function (cookies) { - var names = cookies.map(function (c) { - return c.key - }); - assert.deepEqual(names, ['d', 'a', 'b', 'e']); - } - }, - "then retrieving for http://example.com as a string": { - topic: function (cj, oldResults) { - assert.ok(oldResults); - cj.getCookieString('http://example.com', this.callback); - }, - "get a single string": function (cookieHeader) { - assert.equal(cookieHeader, "a=1; b=2; e=5"); - } - }, - "then retrieving for http://example.com as a set-cookie header": { - topic: function (cj, oldResults) { - assert.ok(oldResults); - cj.getSetCookieStrings('http://example.com', this.callback); - }, - "get a single string": function (cookieHeaders) { - assert.lengthOf(cookieHeaders, 3); - assert.equal(cookieHeaders[0], "a=1; Domain=example.com; Path=/"); - assert.equal(cookieHeaders[1], "b=2; Domain=example.com; Path=/; HttpOnly"); - assert.equal(cookieHeaders[2], "e=5; Path=/"); - } - }, - "then retrieving for http://www.example.com/": { - topic: function (cj, oldResults) { - assert.ok(oldResults); - cj.getCookies('http://www.example.com/foo/bar', this.callback); - }, - "get a bunch of cookies": function (cookies) { - var names = cookies.map(function (c) { - return c.key - }); - assert.deepEqual(names, ['d', 'a', 'b']); // note lack of 'e' - } - } - } - }) - .addBatch({ - "Repeated names": { - topic: function () { - var cb = this.callback; - var cj = new CookieJar(); - var ex = 'http://www.example.com/'; - var sc = cj.setCookie; - var tasks = []; - var now = Date.now(); - tasks.push(sc.bind(cj, 'aaaa=xxxx', ex, at(0))); - tasks.push(sc.bind(cj, 'aaaa=1111; Domain=www.example.com', ex, at(1000))); - tasks.push(sc.bind(cj, 'aaaa=2222; Domain=example.com', ex, at(2000))); - tasks.push(sc.bind(cj, 'aaaa=3333; Domain=www.example.com; Path=/pathA', ex, at(3000))); - async.series(tasks, function (err, results) { - results = results.filter(function (e) { - return e !== undefined - }); - cb(err, {cj: cj, cookies: results, now: now}); - }); - }, - "all got set": function (err, t) { - assert.lengthOf(t.cookies, 4); - }, - "then getting 'em back": { - topic: function (t) { - var cj = t.cj; - cj.getCookies('http://www.example.com/pathA', this.callback); - }, - "there's just three": function (err, cookies) { - var vals = cookies.map(function (c) { - return c.value - }); - // may break with sorting; sorting should put 3333 first due to longest path: - assert.deepEqual(vals, ['3333', '1111', '2222']); - } - } - } - }) - .addBatch({ - "CookieJar setCookie errors": { - "public-suffix domain": { - topic: function () { - var cj = new CookieJar(); - cj.setCookie('i=9; Domain=kyoto.jp; Path=/', 'kyoto.jp', this.callback); - }, - "errors": function (err, cookie) { - assert.ok(err); - assert.ok(!cookie); - assert.match(err.message, /public suffix/i); - } - }, - "wrong domain": { - topic: function () { - var cj = new CookieJar(); - cj.setCookie('j=10; Domain=google.com; Path=/', 'http://google.ca', this.callback); - }, - "errors": function (err, cookie) { - assert.ok(err); - assert.ok(!cookie); - assert.match(err.message, /not in this host's domain/i); - } - }, - "old cookie is HttpOnly": { - topic: function () { - var cb = this.callback; - var next = function (err, c) { - c = null; - return cb(err, cj); - }; - var cj = new CookieJar(); - cj.setCookie('k=11; Domain=example.ca; Path=/; HttpOnly', 'http://example.ca', {http: true}, next); - }, - "initial cookie is set": function (err, cj) { - assert.ok(!err); - assert.ok(cj); - }, - "but when trying to overwrite": { - topic: function (cj) { - var cb = this.callback; - var next = function (err, c) { - c = null; - cb(null, err); - }; - cj.setCookie('k=12; Domain=example.ca; Path=/', 'http://example.ca', {http: false}, next); - }, - "it's an error": function (err) { - assert.ok(err); - }, - "then, checking the original": { - topic: function (ignored, cj) { - assert.ok(cj instanceof CookieJar); - cj.getCookies('http://example.ca', {http: true}, this.callback); - }, - "cookie has original value": function (err, cookies) { - assert.equal(err, null); - assert.lengthOf(cookies, 1); - assert.equal(cookies[0].value, 11); - } - } - } - }, - "similar to public suffix": { - topic: function () { - var cj = new CookieJar(); - var url = 'http://www.foonet.net'; - assert.isTrue(cj.rejectPublicSuffixes); - cj.setCookie('l=13; Domain=foonet.net; Path=/', url, this.callback); - }, - "doesn't error": function (err, cookie) { - assert.ok(!err); - assert.ok(cookie); - } - } - } - }) - .export(module); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_sorting_test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_sorting_test.js deleted file mode 100644 index 826562a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_sorting_test.js +++ /dev/null @@ -1,156 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ -'use strict'; -var vows = require('vows'); -var assert = require('assert'); -var tough = require('../lib/cookie'); -var Cookie = tough.Cookie; -var CookieJar = tough.CookieJar; - -function toKeyArray(cookies) { - return cookies.map(function (c) { - return c.key - }); -} - -vows - .describe('Cookie sorting') - .addBatch({ - "Assumptions:": { - ".creationIndex is set during construction": function() { - var now = new Date(); - var c1 = new Cookie(); - var c2 = new Cookie(); - assert.isNumber(c1.creationIndex); - assert.isNumber(c2.creationIndex); - assert(c1.creationIndex < c2.creationIndex, - 'creationIndex should increase with each construction'); - }, - - ".creationIndex is set during construction (forced ctime)": function() { - var now = new Date(); - var c1 = new Cookie({creation: now}); - var c2 = new Cookie({creation: now}); - assert.strictEqual(c1.creation, c2.creation); - assert.isNumber(c1.creationIndex); - assert.isNumber(c2.creationIndex); - assert(c1.creationIndex < c2.creationIndex, - 'creationIndex should increase with each construction'); - }, - - ".creationIndex is left alone during new setCookie": function() { - var jar = new CookieJar(); - var c = new Cookie({key:'k', value:'v', domain:'example.com'}); - var now = new Date(); - var beforeDate = c.creation; - assert.instanceOf(beforeDate, Date); - assert.notStrictEqual(now, beforeDate); - var beforeIndex = c.creationIndex; - assert.isNumber(c.creationIndex); - - jar.setCookieSync(c, 'http://example.com/', {now: now}); - - assert.strictEqual(c.creation, now); - assert.strictEqual(c.creationIndex, beforeIndex); - }, - - ".creationIndex is preserved during update setCookie": function() { - var jar = new CookieJar(); - - var thisMs = Date.now(); - var t1 = new Date(thisMs); - var t2 = new Date(thisMs); - assert.notStrictEqual(t1, t2); // Date objects are distinct - - var c = new Cookie({key:'k', value:'v1', domain:'example.com'}); - jar.setCookieSync(c, 'http://example.com/', {now: t1}); - var originalIndex = c.creationIndex; - - assert.strictEqual(c.creation, t1); - assert.strictEqual(c.lastAccessed, t1); - - c = new Cookie({key:'k', value:'v2', domain:'example.com'}); - assert.notStrictEqual(c.creation, t1); // new timestamp assigned - - jar.setCookieSync(c, 'http://example.com/', {now: t2}); - - assert.strictEqual(c.creation, t1); // retained - assert.strictEqual(c.lastAccessed, t2); // updated - assert.strictEqual(c.creationIndex, originalIndex); // retained - }, - } - }) - .addBatch({ - "Cookie Sorting": { - topic: function () { - var cookies = []; - cookies.push(Cookie.parse("a=0; Domain=example.com")); - cookies.push(Cookie.parse("b=1; Domain=www.example.com")); - cookies.push(Cookie.parse("c=2; Domain=example.com; Path=/pathA")); - cookies.push(Cookie.parse("d=3; Domain=www.example.com; Path=/pathA")); - cookies.push(Cookie.parse("e=4; Domain=example.com; Path=/pathA/pathB")); - cookies.push(Cookie.parse("f=5; Domain=www.example.com; Path=/pathA/pathB")); - - // weak shuffle: - cookies = cookies.sort(function () { - return Math.random() - 0.5 - }); - - cookies = cookies.sort(tough.cookieCompare); - return cookies; - }, - "got": function (cookies) { - assert.lengthOf(cookies, 6); - assert.deepEqual(toKeyArray(cookies), ['e', 'f', 'c', 'd', 'a', 'b']); - } - } - }) - .addBatch({ - "Changing creation date affects sorting": { - topic: function () { - var cookies = []; - var now = Date.now(); - cookies.push(Cookie.parse("a=0;")); - cookies.push(Cookie.parse("b=1;")); - cookies.push(Cookie.parse("c=2;")); - - cookies.forEach(function (cookie, idx) { - cookie.creation = new Date(now - 100 * idx); - }); - - return cookies.sort(tough.cookieCompare); - }, - "got": function (cookies) { - assert.deepEqual(toKeyArray(cookies), ['c', 'b', 'a']); - } - } - }) - .export(module); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_to_json_test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_to_json_test.js deleted file mode 100644 index 94a23d4..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_to_json_test.js +++ /dev/null @@ -1,164 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ - -'use strict'; -var vows = require('vows'); -var assert = require('assert'); -var tough = require('../lib/cookie'); -var Cookie = tough.Cookie; - -vows - .describe('Cookie.toJSON()') - .addBatch({ - "JSON": { - "serialization": { - topic: function() { - var c = Cookie.parse('alpha=beta; Domain=example.com; Path=/foo; Expires=Tue, 19 Jan 2038 03:14:07 GMT; HttpOnly'); - return JSON.stringify(c); - }, - "gives a string": function(str) { - assert.equal(typeof str, "string"); - }, - "date is in ISO format": function(str) { - assert.match(str, /"expires":"2038-01-19T03:14:07\.000Z"/, 'expires is in ISO format'); - } - }, - "deserialization": { - topic: function() { - var json = '{"key":"alpha","value":"beta","domain":"example.com","path":"/foo","expires":"2038-01-19T03:14:07.000Z","httpOnly":true,"lastAccessed":2000000000123}'; - return Cookie.fromJSON(json); - }, - "works": function(c) { - assert.ok(c); - }, - "key": function(c) { assert.equal(c.key, "alpha") }, - "value": function(c) { assert.equal(c.value, "beta") }, - "domain": function(c) { assert.equal(c.domain, "example.com") }, - "path": function(c) { assert.equal(c.path, "/foo") }, - "httpOnly": function(c) { assert.strictEqual(c.httpOnly, true) }, - "secure": function(c) { assert.strictEqual(c.secure, false) }, - "hostOnly": function(c) { assert.strictEqual(c.hostOnly, null) }, - "expires is a date object": function(c) { - assert.equal(c.expires.getTime(), 2147483647000); - }, - "lastAccessed is a date object": function(c) { - assert.equal(c.lastAccessed.getTime(), 2000000000123); - }, - "creation defaulted": function(c) { - assert.ok(c.creation.getTime()); - } - }, - "null deserialization": { - topic: function() { - return Cookie.fromJSON(null); - }, - "is null": function(cookie) { - assert.equal(cookie,null); - } - } - }, - "expiry deserialization": { - "Infinity": { - topic: Cookie.fromJSON.bind(null, '{"expires":"Infinity"}'), - "is infinite": function(c) { - assert.strictEqual(c.expires, "Infinity"); - assert.equal(c.expires, Infinity); - } - } - }, - "maxAge serialization": { - topic: function() { - return function(toSet) { - var c = new Cookie(); - c.key = 'foo'; c.value = 'bar'; - c.setMaxAge(toSet); - return JSON.stringify(c); - }; - }, - "zero": { - topic: function(f) { return f(0) }, - "looks good": function(str) { - assert.match(str, /"maxAge":0/); - } - }, - "Infinity": { - topic: function(f) { return f(Infinity) }, - "looks good": function(str) { - assert.match(str, /"maxAge":"Infinity"/); - } - }, - "-Infinity": { - topic: function(f) { return f(-Infinity) }, - "looks good": function(str) { - assert.match(str, /"maxAge":"-Infinity"/); - } - }, - "null": { - topic: function(f) { return f(null) }, - "absent": function(str) { - assert.match(str, /(?!"maxAge":null)/); // NB: negative RegExp - } - } - }, - "maxAge deserialization": { - "number": { - topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":123}'), - "is the number": function(c) { - assert.strictEqual(c.maxAge, 123); - } - }, - "null": { - topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":null}'), - "is null": function(c) { - assert.strictEqual(c.maxAge, null); - } - }, - "less than zero": { - topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":-123}'), - "is -123": function(c) { - assert.strictEqual(c.maxAge, -123); - } - }, - "Infinity": { - topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":"Infinity"}'), - "is inf-as-string": function(c) { - assert.strictEqual(c.maxAge, "Infinity"); - } - }, - "-Infinity": { - topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":"-Infinity"}'), - "is inf-as-string": function(c) { - assert.strictEqual(c.maxAge, "-Infinity"); - } - } - } - }) - .export(module); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_to_string_test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_to_string_test.js deleted file mode 100644 index b7ad10d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/cookie_to_string_test.js +++ /dev/null @@ -1,162 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ - -'use strict'; -var vows = require('vows'); -var assert = require('assert'); -var tough = require('../lib/cookie'); -var Cookie = tough.Cookie; - -vows - .describe('Cookie.toString()') - .addBatch({ - "a simple cookie": { - topic: function () { - var c = new Cookie(); - c.key = 'a'; - c.value = 'b'; - return c; - }, - "validates": function (c) { - assert.ok(c.validate()); - }, - "to string": function (c) { - assert.equal(c.toString(), 'a=b'); - } - }, - "a cookie with spaces in the value": { - topic: function () { - var c = new Cookie(); - c.key = 'a'; - c.value = 'beta gamma'; - return c; - }, - "doesn't validate": function (c) { - assert.ok(!c.validate()); - }, - "'garbage in, garbage out'": function (c) { - assert.equal(c.toString(), 'a=beta gamma'); - } - }, - "with an empty value and HttpOnly": { - topic: function () { - var c = new Cookie(); - c.key = 'a'; - c.httpOnly = true; - return c; - }, - "to string": function (c) { - assert.equal(c.toString(), 'a=; HttpOnly'); - } - }, - "with an expiry": { - topic: function () { - var c = new Cookie(); - c.key = 'a'; - c.value = 'b'; - c.setExpires("Oct 18 2011 07:05:03 GMT"); - return c; - }, - "validates": function (c) { - assert.ok(c.validate()); - }, - "to string": function (c) { - assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT'); - }, - "to short string": function (c) { - assert.equal(c.cookieString(), 'a=b'); - } - }, - "with a max-age": { - topic: function () { - var c = new Cookie(); - c.key = 'a'; - c.value = 'b'; - c.setExpires("Oct 18 2011 07:05:03 GMT"); - c.maxAge = 12345; - return c; - }, - "validates": function (c) { - assert.ok(c.validate()); // mabe this one *shouldn't*? - }, - "to string": function (c) { - assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Max-Age=12345'); - } - }, - "with a bunch of things": function () { - var c = new Cookie(); - c.key = 'a'; - c.value = 'b'; - c.setExpires("Oct 18 2011 07:05:03 GMT"); - c.maxAge = 12345; - c.domain = 'example.com'; - c.path = '/foo'; - c.secure = true; - c.httpOnly = true; - c.extensions = ['MyExtension']; - assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Max-Age=12345; Domain=example.com; Path=/foo; Secure; HttpOnly; MyExtension'); - }, - "a host-only cookie": { - topic: function () { - var c = new Cookie(); - c.key = 'a'; - c.value = 'b'; - c.hostOnly = true; - c.domain = 'shouldnt-stringify.example.com'; - c.path = '/should-stringify'; - return c; - }, - "validates": function (c) { - assert.ok(c.validate()); - }, - "to string": function (c) { - assert.equal(c.toString(), 'a=b; Path=/should-stringify'); - } - }, - "minutes are '10'": { - topic: function () { - var c = new Cookie(); - c.key = 'a'; - c.value = 'b'; - c.expires = new Date(1284113410000); - return c; - }, - "validates": function (c) { - assert.ok(c.validate()); - }, - "to string": function (c) { - var str = c.toString(); - assert.notEqual(str, 'a=b; Expires=Fri, 010 Sep 2010 010:010:010 GMT'); - assert.equal(str, 'a=b; Expires=Fri, 10 Sep 2010 10:10:10 GMT'); - } - } - }) - .export(module); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/date_test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/date_test.js deleted file mode 100644 index afd989c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/date_test.js +++ /dev/null @@ -1,79 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ - -'use strict'; -var vows = require('vows'); -var assert = require('assert'); -var tough = require('../lib/cookie'); - -function dateVows(table) { - var theVows = {}; - Object.keys(table).forEach(function (date) { - var expect = table[date]; - theVows[date] = function () { - var got = tough.parseDate(date) ? 'valid' : 'invalid'; - assert.equal(got, expect ? 'valid' : 'invalid'); - }; - }); - return {"date parsing": theVows}; -} - -vows - .describe('Date') - .addBatch(dateVows({ - "Wed, 09 Jun 2021 10:18:14 GMT": true, - "Wed, 09 Jun 2021 22:18:14 GMT": true, - "Tue, 18 Oct 2011 07:42:42.123 GMT": true, - "18 Oct 2011 07:42:42 GMT": true, - "8 Oct 2011 7:42:42 GMT": true, - "8 Oct 2011 7:2:42 GMT": true, - "Oct 18 2011 07:42:42 GMT": true, - "Tue Oct 18 2011 07:05:03 GMT+0000 (GMT)": true, - "09 Jun 2021 10:18:14 GMT": true, - "99 Jix 3038 48:86:72 ZMT": false, - '01 Jan 1970 00:00:00 GMT': true, - '01 Jan 1600 00:00:00 GMT': false, // before 1601 - '01 Jan 1601 00:00:00 GMT': true, - '10 Feb 81 13:00:00 GMT': true, // implicit year - 'Thu, 17-Apr-2014 02:12:29 GMT': true, // dashes - 'Thu, 17-Apr-2014 02:12:29 UTC': true // dashes and UTC - })) - .addBatch({ - "strict date parse of Thu, 01 Jan 1970 00:00:010 GMT": { - topic: function () { - return tough.parseDate('Thu, 01 Jan 1970 00:00:010 GMT', true) ? true : false; - }, - "invalid": function (date) { - assert.equal(date, false); - } - } - }) - .export(module); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/domain_and_path_test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/domain_and_path_test.js deleted file mode 100644 index 36b85b9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/domain_and_path_test.js +++ /dev/null @@ -1,201 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ - -'use strict'; -var vows = require('vows'); -var assert = require('assert'); -var tough = require('../lib/cookie'); -var Cookie = tough.Cookie; - -function matchVows(func, table) { - var theVows = {}; - table.forEach(function (item) { - var str = item[0]; - var dom = item[1]; - var expect = item[2]; - var label = str + (expect ? " matches " : " doesn't match ") + dom; - theVows[label] = function () { - assert.equal(func(str, dom), expect); - }; - }); - return theVows; -} - -function defaultPathVows(table) { - var theVows = {}; - table.forEach(function (item) { - var str = item[0]; - var expect = item[1]; - var label = str + " gives " + expect; - theVows[label] = function () { - assert.equal(tough.defaultPath(str), expect); - }; - }); - return theVows; -} - -vows - .describe('Domain and Path') - .addBatch({ - "domain normalization": { - "simple": function () { - var c = new Cookie(); - c.domain = "EXAMPLE.com"; - assert.equal(c.canonicalizedDomain(), "example.com"); - }, - "extra dots": function () { - var c = new Cookie(); - c.domain = ".EXAMPLE.com"; - assert.equal(c.cdomain(), "example.com"); - }, - "weird trailing dot": function () { - var c = new Cookie(); - c.domain = "EXAMPLE.ca."; - assert.equal(c.canonicalizedDomain(), "example.ca."); - }, - "weird internal dots": function () { - var c = new Cookie(); - c.domain = "EXAMPLE...ca."; - assert.equal(c.canonicalizedDomain(), "example...ca."); - }, - "IDN": function () { - var c = new Cookie(); - c.domain = "δοκιμή.δοκιμή"; // "test.test" in greek - assert.equal(c.canonicalizedDomain(), "xn--jxalpdlp.xn--jxalpdlp"); - } - } - }) - .addBatch({ - "Domain Match": matchVows(tough.domainMatch, [ - // str, dom, expect - ["example.com", "example.com", true], - ["eXaMpLe.cOm", "ExAmPlE.CoM", true], - ["no.ca", "yes.ca", false], - ["wwwexample.com", "example.com", false], - ["www.example.com", "example.com", true], - ["example.com", "www.example.com", false], - ["www.subdom.example.com", "example.com", true], - ["www.subdom.example.com", "subdom.example.com", true], - ["example.com", "example.com.", false], // RFC6265 S4.1.2.3 - ["192.168.0.1", "168.0.1", false], // S5.1.3 "The string is a host name" - [null, "example.com", null], - ["example.com", null, null], - [null, null, null], - [undefined, undefined, null], - ]) - }) - - .addBatch({ - "default-path": defaultPathVows([ - [null, "/"], - ["/", "/"], - ["/file", "/"], - ["/dir/file", "/dir"], - ["noslash", "/"], - ]) - }) - .addBatch({ - "Path-Match": matchVows(tough.pathMatch, [ - // request, cookie, match - ["/", "/", true], - ["/dir", "/", true], - ["/", "/dir", false], - ["/dir/", "/dir/", true], - ["/dir/file", "/dir/", true], - ["/dir/file", "/dir", true], - ["/directory", "/dir", false], - ]) - }) - .addBatch({ - "permuteDomain": { - "base case": { - topic: tough.permuteDomain.bind(null, 'example.com'), - "got the domain": function (list) { - assert.deepEqual(list, ['example.com']); - } - }, - "two levels": { - topic: tough.permuteDomain.bind(null, 'foo.bar.example.com'), - "got three things": function (list) { - assert.deepEqual(list, ['example.com', 'bar.example.com', 'foo.bar.example.com']); - } - }, - "local domain": { - topic: tough.permuteDomain.bind(null, 'foo.bar.example.localduhmain'), - "got three things": function (list) { - assert.deepEqual(list, ['example.localduhmain', 'bar.example.localduhmain', 'foo.bar.example.localduhmain']); - } - } - }, - "permutePath": { - "base case": { - topic: tough.permutePath.bind(null, '/'), - "just slash": function (list) { - assert.deepEqual(list, ['/']); - } - }, - "single case": { - topic: tough.permutePath.bind(null, '/foo'), - "two things": function (list) { - assert.deepEqual(list, ['/foo', '/']); - }, - "path matching": function (list) { - list.forEach(function (e) { - assert.ok(tough.pathMatch('/foo', e)); - }); - } - }, - "double case": { - topic: tough.permutePath.bind(null, '/foo/bar'), - "four things": function (list) { - assert.deepEqual(list, ['/foo/bar', '/foo', '/']); - }, - "path matching": function (list) { - list.forEach(function (e) { - assert.ok(tough.pathMatch('/foo/bar', e)); - }); - } - }, - "trailing slash": { - topic: tough.permutePath.bind(null, '/foo/bar/'), - "three things": function (list) { - assert.deepEqual(list, ['/foo/bar', '/foo', '/']); - }, - "path matching": function (list) { - list.forEach(function (e) { - assert.ok(tough.pathMatch('/foo/bar/', e)); - }); - } - } - } - }) - .export(module); - diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/bsd-examples.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/bsd-examples.json deleted file mode 100644 index bc43160..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/bsd-examples.json +++ /dev/null @@ -1,168 +0,0 @@ -[ - { - "test": "Sat, 15-Apr-17 21:01:22 GMT", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Thu, 19-Apr-2007 16:00:00 GMT", - "expected": "Thu, 19 Apr 2007 16:00:00 GMT" - }, { - "test": "Wed, 25 Apr 2007 21:02:13 GMT", - "expected": "Wed, 25 Apr 2007 21:02:13 GMT" - }, { - "test": "Thu, 19/Apr\\2007 16:00:00 GMT", - "expected": "Thu, 19 Apr 2007 16:00:00 GMT" - }, { - "test": "Fri, 1 Jan 2010 01:01:50 GMT", - "expected": "Fri, 01 Jan 2010 01:01:50 GMT" - }, { - "test": "Wednesday, 1-Jan-2003 00:00:00 GMT", - "expected": "Wed, 01 Jan 2003 00:00:00 GMT" - }, { - "test": ", 1-Jan-2003 00:00:00 GMT", - "expected": "Wed, 01 Jan 2003 00:00:00 GMT" - }, { - "test": " 1-Jan-2003 00:00:00 GMT", - "expected": "Wed, 01 Jan 2003 00:00:00 GMT" - }, { - "test": "1-Jan-2003 00:00:00 GMT", - "expected": "Wed, 01 Jan 2003 00:00:00 GMT" - }, { - "test": "Wed,18-Apr-07 22:50:12 GMT", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "WillyWonka , 18-Apr-07 22:50:12 GMT", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "WillyWonka , 18-Apr-07 22:50:12", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "WillyWonka , 18-apr-07 22:50:12", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "Mon, 18-Apr-1977 22:50:13 GMT", - "expected": "Mon, 18 Apr 1977 22:50:13 GMT" - }, { - "test": "Mon, 18-Apr-77 22:50:13 GMT", - "expected": "Mon, 18 Apr 1977 22:50:13 GMT" - }, { - "test": "\"Sat, 15-Apr-17\\\"21:01:22\\\"GMT\"", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Partyday, 18- April-07 22:50:12", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "Partyday, 18 - Apri-07 22:50:12", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "Wednes, 1-Januar-2003 00:00:00 GMT", - "expected": "Wed, 01 Jan 2003 00:00:00 GMT" - }, { - "test": "Sat, 15-Apr-17 21:01:22", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Sat, 15-Apr-17 21:01:22 GMT-2", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Sat, 15-Apr-17 21:01:22 GMT BLAH", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Sat, 15-Apr-17 21:01:22 GMT-0400", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Sat, 15-Apr-17 21:01:22 GMT-0400 (EDT)", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Sat, 15-Apr-17 21:01:22 DST", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Sat, 15-Apr-17 21:01:22 -0400", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Sat, 15-Apr-17 21:01:22 (hello there)", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Sat, 15-Apr-17 21:01:22 11:22:33", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Sat, 15-Apr-17 ::00 21:01:22", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Sat, 15-Apr-17 boink:z 21:01:22", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Sat, 15-Apr-17 91:22:33 21:01:22", - "expected": null - }, { - "test": "Thu Apr 18 22:50:12 2007 GMT", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "22:50:12 Thu Apr 18 2007 GMT", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "Thu 22:50:12 Apr 18 2007 GMT", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "Thu Apr 22:50:12 18 2007 GMT", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "Thu Apr 18 22:50:12 2007 GMT", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "Thu Apr 18 2007 22:50:12 GMT", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "Thu Apr 18 2007 GMT 22:50:12", - "expected": "Wed, 18 Apr 2007 22:50:12 GMT" - }, { - "test": "Sat, 15-Apr-17 21:01:22 GMT", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "15-Sat, Apr-17 21:01:22 GMT", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "15-Sat, Apr 21:01:22 GMT 17", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "15-Sat, Apr 21:01:22 GMT 2017", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "15 Apr 21:01:22 2017", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "15 17 Apr 21:01:22", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Apr 15 17 21:01:22", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "Apr 15 21:01:22 17", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "2017 April 15 21:01:22", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "15 April 2017 21:01:22", - "expected": "Sat, 15 Apr 2017 21:01:22 GMT" - }, { - "test": "98 April 17 21:01:22", - "expected": null - }, { - "test": "Thu, 012-Aug-2008 20:49:07 GMT", - "expected": null - }, { - "test": "Thu, 12-Aug-31841 20:49:07 GMT", - "expected": null - }, { - "test": "Thu, 12-Aug-9999999999 20:49:07 GMT", - "expected": null - }, { - "test": "Thu, 999999999999-Aug-2007 20:49:07 GMT", - "expected": null - }, { - "test": "Thu, 12-Aug-2007 20:61:99999999999 GMT", - "expected": null - }, { - "test": "IAintNoDateFool", - "expected": null - } -] diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/examples.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/examples.json deleted file mode 100644 index 61e674d..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_data/dates/examples.json +++ /dev/null @@ -1,48 +0,0 @@ -[ - { - "test": "Mon, 10-Dec-2007 17:02:24 GMT", - "expected": "Mon, 10 Dec 2007 17:02:24 GMT" - }, { - "test": "Wed, 09 Dec 2009 16:27:23 GMT", - "expected": "Wed, 09 Dec 2009 16:27:23 GMT" - }, { - "test": "Thursday, 01-Jan-1970 00:00:00 GMT", - "expected": "Thu, 01 Jan 1970 00:00:00 GMT" - }, { - "test": "Mon Dec 10 16:32:30 2007 GMT", - "expected": "Mon, 10 Dec 2007 16:32:30 GMT" - }, { - "test": "Wednesday, 01-Jan-10 00:00:00 GMT", - "expected": "Fri, 01 Jan 2010 00:00:00 GMT" - }, { - "test": "Mon, 10-Dec-07 20:35:03 GMT", - "expected": "Mon, 10 Dec 2007 20:35:03 GMT" - }, { - "test": "Wed, 1 Jan 2020 00:00:00 GMT", - "expected": "Wed, 01 Jan 2020 00:00:00 GMT" - }, { - "test": "Saturday, 8-Dec-2012 21:24:09 GMT", - "expected": "Sat, 08 Dec 2012 21:24:09 GMT" - }, { - "test": "Thu, 31 Dec 23:55:55 2037 GMT", - "expected": "Thu, 31 Dec 2037 23:55:55 GMT" - }, { - "test": "Sun, 9 Dec 2012 13:42:05 GMT", - "expected": "Sun, 09 Dec 2012 13:42:05 GMT" - }, { - "test": "Wed Dec 12 2007 08:44:07 GMT-0500 (EST)", - "expected": "Wed, 12 Dec 2007 08:44:07 GMT" - }, { - "test": "Mon, 01-Jan-2011 00: 00:00 GMT", - "expected": null - }, { - "test": "Sun, 1-Jan-1995 00:00:00 GMT", - "expected": "Sun, 01 Jan 1995 00:00:00 GMT" - }, { - "test": "Wednesday, 01-Jan-10 0:0:00 GMT", - "expected": "Fri, 01 Jan 2010 00:00:00 GMT" - }, { - "test": "Thu, 10 Dec 2009 13:57:2 GMT", - "expected": "Thu, 10 Dec 2009 13:57:02 GMT" - } -] diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_data/parser.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_data/parser.json deleted file mode 100644 index 783f660..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_data/parser.json +++ /dev/null @@ -1,1959 +0,0 @@ -[ - { - "test": "0001", - "received": [ - "foo=bar" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "0002", - "received": [ - "foo=bar; Expires=Fri, 07 Aug 2019 08:04:19 GMT" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "0003", - "received": [ - "foo=bar; Expires=Fri, 07 Aug 2007 08:04:19 GMT", - "foo2=bar2; Expires=Fri, 07 Aug 2017 08:04:19 GMT" - ], - "sent": [ - { "name": "foo2", "value": "bar2" } - ] - }, - { - "test": "0004", - "received": [ - "foo" - ], - "sent": [] - }, - { - "test": "0005", - "received": [ - "foo=bar; max-age=10000;" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "0006", - "received": [ - "foo=bar; max-age=0;" - ], - "sent": [] - }, - { - "test": "0007", - "received": [ - "foo=bar; version=1;" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "0008", - "received": [ - "foo=bar; version=1000;" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "0009", - "received": [ - "foo=bar; customvalue=1000;" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "0010", - "received": [ - "foo=bar; secure;" - ], - "sent": [] - }, - { - "test": "0011", - "received": [ - "foo=bar; customvalue=\"1000 or more\";" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "0012", - "received": [ - "foo=bar; customvalue=\"no trailing semicolon\"" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "0013", - "received": [ - "foo=bar", - "foo=qux" - ], - "sent": [ - { "name": "foo", "value": "qux" } - ] - }, - { - "test": "0014", - "received": [ - "foo1=bar", - "foo2=qux" - ], - "sent": [ - { "name": "foo1", "value": "bar" }, - { "name": "foo2", "value": "qux" } - ] - }, - { - "test": "0015", - "received": [ - "a=b", - "z=y" - ], - "sent": [ - { "name": "a", "value": "b" }, - { "name": "z", "value": "y" } - ] - }, - { - "test": "0016", - "received": [ - "z=y", - "a=b" - ], - "sent": [ - { "name": "z", "value": "y" }, - { "name": "a", "value": "b" } - ] - }, - { - "test": "0017", - "received": [ - "z=y, a=b" - ], - "sent": [ - { "name": "z", "value": "y, a=b" } - ] - }, - { - "test": "0018", - "received": [ - "z=y; foo=bar, a=b" - ], - "sent": [ - { "name": "z", "value": "y" } - ] - }, - { - "test": "0019", - "received": [ - "foo=b;max-age=3600, c=d;path=/" - ], - "sent": [ - { "name": "foo", "value": "b" } - ] - }, - { - "test": "0020", - "received": [ - "a=b", - "=", - "c=d" - ], - "sent": [ - { "name": "a", "value": "b" }, - { "name": "c", "value": "d" } - ] - }, - { - "test": "0021", - "received": [ - "a=b", - "=x", - "c=d" - ], - "sent": [ - { "name": "a", "value": "b" }, - { "name": "c", "value": "d" } - ] - }, - { - "test": "0022", - "received": [ - "a=b", - "x=", - "c=d" - ], - "sent": [ - { "name": "a", "value": "b" }, - { "name": "x", "value": "" }, - { "name": "c", "value": "d" } - ] - }, - { - "test": "0023", - "received": [ - "foo", - "" - ], - "sent": [] - }, - { - "test": "0024", - "received": [ - "foo", - "=" - ], - "sent": [] - }, - { - "test": "0025", - "received": [ - "foo", - "; bar" - ], - "sent": [] - }, - { - "test": "0026", - "received": [ - "foo", - " " - ], - "sent": [] - }, - { - "test": "0027", - "received": [ - "foo", - "bar" - ], - "sent": [] - }, - { - "test": "0028", - "received": [ - "foo", - "\t" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0001", - "received": [ - "foo=bar; Secure" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0002", - "received": [ - "foo=bar; seCURe" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0003", - "received": [ - "foo=bar; \"Secure\"" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "ATTRIBUTE0004", - "received": [ - "foo=bar; Secure=" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0005", - "received": [ - "foo=bar; Secure=aaaa" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0006", - "received": [ - "foo=bar; Secure qux" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "ATTRIBUTE0007", - "received": [ - "foo=bar; Secure =aaaaa" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0008", - "received": [ - "foo=bar; Secure= aaaaa" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0009", - "received": [ - "foo=bar; Secure; qux" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0010", - "received": [ - "foo=bar; Secure;qux" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0011", - "received": [ - "foo=bar; Secure ; qux" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0012", - "received": [ - "foo=bar; Secure" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0013", - "received": [ - "foo=bar; Secure ;" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0014", - "received": [ - "foo=bar; Path" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "ATTRIBUTE0015", - "received": [ - "foo=bar; Path=" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "ATTRIBUTE0016", - "received": [ - "foo=bar; Path=/" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "ATTRIBUTE0017", - "received": [ - "foo=bar; Path=/qux" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0018", - "received": [ - "foo=bar; Path =/qux" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0019", - "received": [ - "foo=bar; Path= /qux" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0020", - "received": [ - "foo=bar; Path=/qux ; taz" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0021", - "received": [ - "foo=bar; Path=/qux; Path=/" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "ATTRIBUTE0022", - "received": [ - "foo=bar; Path=/; Path=/qux" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0023", - "received": [ - "foo=bar; Path=/qux; Path=/cookie-parser-result" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "ATTRIBUTE0024", - "received": [ - "foo=bar; Path=/cookie-parser-result; Path=/qux" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0025", - "received": [ - "foo=bar; qux; Secure" - ], - "sent": [] - }, - { - "test": "ATTRIBUTE0026", - "received": [ - "foo=bar; qux=\"aaa;bbb\"; Secure" - ], - "sent": [] - }, - { - "test": "CHARSET0001", - "received": [ - "foo=\u6625\u8282\u56de\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c" - ], - "sent": [ - { "name": "foo", "value": "\u6625\u8282\u56de\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c" } - ] - }, - { - "test": "CHARSET0002", - "received": [ - "\u6625\u8282\u56de=\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c" - ], - "sent": [ - { "name": "\u6625\u8282\u56de", "value": "\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c" } - ] - }, - { - "test": "CHARSET0003", - "received": [ - "\u6625\u8282\u56de=\u5bb6\u8def\u00b7\u6625\u8fd0; \u5b8c\u5168\u624b\u518c" - ], - "sent": [ - { "name": "\u6625\u8282\u56de", "value": "\u5bb6\u8def\u00b7\u6625\u8fd0" } - ] - }, - { - "test": "CHARSET0004", - "received": [ - "foo=\"\u6625\u8282\u56de\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c\"" - ], - "sent": [ - { "name": "foo", "value": "\"\u6625\u8282\u56de\u5bb6\u8def\u00b7\u6625\u8fd0\u5b8c\u5168\u624b\u518c\"" } - ] - }, - { - "test": "CHROMIUM0001", - "received": [ - "a=b" - ], - "sent": [ - { "name": "a", "value": "b" } - ] - }, - { - "test": "CHROMIUM0002", - "received": [ - "aBc=\"zzz \" ;" - ], - "sent": [ - { "name": "aBc", "value": "\"zzz \"" } - ] - }, - { - "test": "CHROMIUM0003", - "received": [ - "aBc=\"zzz \" ;" - ], - "sent": [ - { "name": "aBc", "value": "\"zzz \"" } - ] - }, - { - "test": "CHROMIUM0004", - "received": [ - "aBc=\"zz;pp\" ; ;" - ], - "sent": [ - { "name": "aBc", "value": "\"zz" } - ] - }, - { - "test": "CHROMIUM0005", - "received": [ - "aBc=\"zz ;" - ], - "sent": [ - { "name": "aBc", "value": "\"zz" } - ] - }, - { - "test": "CHROMIUM0006", - "received": [ - "aBc=\"zzz \" \"ppp\" ;" - ], - "sent": [ - { "name": "aBc", "value": "\"zzz \" \"ppp\"" } - ] - }, - { - "test": "CHROMIUM0007", - "received": [ - "aBc=\"zzz \" \"ppp\" ;" - ], - "sent": [ - { "name": "aBc", "value": "\"zzz \" \"ppp\"" } - ] - }, - { - "test": "CHROMIUM0008", - "received": [ - "aBc=A\"B ;" - ], - "sent": [ - { "name": "aBc", "value": "A\"B" } - ] - }, - { - "test": "CHROMIUM0009", - "received": [ - "BLAHHH; path=/;" - ], - "sent": [] - }, - { - "test": "CHROMIUM0010", - "received": [ - "\"BLA\\\"HHH\"; path=/;" - ], - "sent": [] - }, - { - "test": "CHROMIUM0011", - "received": [ - "a=\"B" - ], - "sent": [ - { "name": "a", "value": "\"B" } - ] - }, - { - "test": "CHROMIUM0012", - "received": [ - "=ABC" - ], - "sent": [] - }, - { - "test": "CHROMIUM0013", - "received": [ - "ABC=; path = /" - ], - "sent": [ - { "name": "ABC", "value": "" } - ] - }, - { - "test": "CHROMIUM0014", - "received": [ - " A = BC ;foo;;; bar" - ], - "sent": [ - { "name": "A", "value": "BC" } - ] - }, - { - "test": "CHROMIUM0015", - "received": [ - " A=== BC ;foo;;; bar" - ], - "sent": [ - { "name": "A", "value": "== BC" } - ] - }, - { - "test": "CHROMIUM0016", - "received": [ - "foo=\"zohNumRKgI0oxyhSsV3Z7D\" ; expires=Sun, 18-Apr-2027 21:06:29 GMT ; path=/ ; " - ], - "sent": [ - { "name": "foo", "value": "\"zohNumRKgI0oxyhSsV3Z7D\"" } - ] - }, - { - "test": "CHROMIUM0017", - "received": [ - "foo=zohNumRKgI0oxyhSsV3Z7D ; expires=Sun, 18-Apr-2027 21:06:29 GMT ; path=/ ; " - ], - "sent": [ - { "name": "foo", "value": "zohNumRKgI0oxyhSsV3Z7D" } - ] - }, - { - "test": "CHROMIUM0018", - "received": [ - " " - ], - "sent": [] - }, - { - "test": "CHROMIUM0019", - "received": [ - "a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - ], - "sent": [ - { "name": "a", "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } - ] - }, - { - "test": "CHROMIUM0021", - "received": [ - "" - ], - "sent": [] - }, - { - "test": "COMMA0001", - "received": [ - "foo=bar, baz=qux" - ], - "sent": [ - { "name": "foo", "value": "bar, baz=qux" } - ] - }, - { - "test": "COMMA0002", - "received": [ - "foo=\"bar, baz=qux\"" - ], - "sent": [ - { "name": "foo", "value": "\"bar, baz=qux\"" } - ] - }, - { - "test": "COMMA0003", - "received": [ - "foo=bar; b,az=qux" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "COMMA0004", - "received": [ - "foo=bar; baz=q,ux" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "COMMA0005", - "received": [ - "foo=bar; Max-Age=50,399" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "COMMA0006", - "received": [ - "foo=bar; Expires=Fri, 07 Aug 2019 08:04:19 GMT" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "COMMA0007", - "received": [ - "foo=bar; Expires=Fri 07 Aug 2019 08:04:19 GMT, baz=qux" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DISABLED_CHROMIUM0020", - "received": [ - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - ], - "sent": [] - }, - { - "test": "DISABLED_CHROMIUM0022", - "received": [ - "AAA=BB\u0000ZYX" - ], - "sent": [ - { "name": "AAA", "value": "BB" } - ] - }, - { - "test": "DISABLED_CHROMIUM0023", - "received": [ - "AAA=BB\rZYX" - ], - "sent": [ - { "name": "AAA", "value": "BB" } - ] - }, - { - "test": "DISABLED_PATH0029", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/bar" - ], - "sent-to": "/cookie-parser-result/f%6Fo/bar?disabled-path0029", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0001", - "received": [ - "foo=bar; domain=home.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0001", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0002", - "received": [ - "foo=bar; domain=home.example.org" - ], - "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0002", - "sent": [] - }, - { - "test": "DOMAIN0003", - "received": [ - "foo=bar; domain=.home.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0003", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0004", - "received": [ - "foo=bar; domain=home.example.org" - ], - "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?domain0004", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0005", - "received": [ - "foo=bar; domain=.home.example.org" - ], - "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?domain0005", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0006", - "received": [ - "foo=bar; domain=.home.example.org" - ], - "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0006", - "sent": [] - }, - { - "test": "DOMAIN0007", - "received": [ - "foo=bar; domain=sibling.example.org" - ], - "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0007", - "sent": [] - }, - { - "test": "DOMAIN0008", - "received": [ - "foo=bar; domain=.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0008", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0009", - "received": [ - "foo=bar; domain=example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0009", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0010", - "received": [ - "foo=bar; domain=..home.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0010", - "sent": [] - }, - { - "test": "DOMAIN0011", - "received": [ - "foo=bar; domain=home..example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0011", - "sent": [] - }, - { - "test": "DOMAIN0012", - "received": [ - "foo=bar; domain= .home.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0012", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0013", - "received": [ - "foo=bar; domain= . home.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0013", - "sent": [] - }, - { - "test": "DOMAIN0014", - "received": [ - "foo=bar; domain=home.example.org." - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0014", - "sent": [] - }, - { - "test": "DOMAIN0015", - "received": [ - "foo=bar; domain=home.example.org.." - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0015", - "sent": [] - }, - { - "test": "DOMAIN0016", - "received": [ - "foo=bar; domain=home.example.org ." - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0016", - "sent": [] - }, - { - "test": "DOMAIN0017", - "received": [ - "foo=bar; domain=.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0017", - "sent": [] - }, - { - "test": "DOMAIN0018", - "received": [ - "foo=bar; domain=.org." - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0018", - "sent": [] - }, - { - "test": "DOMAIN0019", - "received": [ - "foo=bar; domain=home.example.org", - "foo2=bar2; domain=.home.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0019", - "sent": [ - { "name": "foo", "value": "bar" }, - { "name": "foo2", "value": "bar2" } - ] - }, - { - "test": "DOMAIN0020", - "received": [ - "foo2=bar2; domain=.home.example.org", - "foo=bar; domain=home.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0020", - "sent": [ - { "name": "foo2", "value": "bar2" }, - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0021", - "received": [ - "foo=bar; domain=\"home.example.org\"" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0021", - "sent": [] - }, - { - "test": "DOMAIN0022", - "received": [ - "foo=bar; domain=home.example.org", - "foo2=bar2; domain=.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0022", - "sent": [ - { "name": "foo", "value": "bar" }, - { "name": "foo2", "value": "bar2" } - ] - }, - { - "test": "DOMAIN0023", - "received": [ - "foo2=bar2; domain=.example.org", - "foo=bar; domain=home.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0023", - "sent": [ - { "name": "foo2", "value": "bar2" }, - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0024", - "received": [ - "foo=bar; domain=.example.org; domain=home.example.org" - ], - "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0024", - "sent": [] - }, - { - "test": "DOMAIN0025", - "received": [ - "foo=bar; domain=home.example.org; domain=.example.org" - ], - "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0025", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0026", - "received": [ - "foo=bar; domain=home.eXaMpLe.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0026", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0027", - "received": [ - "foo=bar; domain=home.example.org:8888" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0027", - "sent": [] - }, - { - "test": "DOMAIN0028", - "received": [ - "foo=bar; domain=subdomain.home.example.org" - ], - "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?domain0028", - "sent": [] - }, - { - "test": "DOMAIN0029", - "received": [ - "foo=bar" - ], - "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?domain0029", - "sent": [] - }, - { - "test": "DOMAIN0031", - "received": [ - "foo=bar; domain=home.example.org; domain=.example.org" - ], - "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0031", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0033", - "received": [ - "foo=bar; domain=home.example.org" - ], - "sent-to": "http://hoMe.eXaMplE.org:8888/cookie-parser-result?domain0033", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0034", - "received": [ - "foo=bar; domain=home.example.org; domain=home.example.com" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0034", - "sent": [] - }, - { - "test": "DOMAIN0035", - "received": [ - "foo=bar; domain=home.example.com; domain=home.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0035", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0036", - "received": [ - "foo=bar; domain=home.example.org; domain=home.example.com; domain=home.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0036", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0037", - "received": [ - "foo=bar; domain=home.example.com; domain=home.example.org; domain=home.example.com" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0037", - "sent": [] - }, - { - "test": "DOMAIN0038", - "received": [ - "foo=bar; domain=home.example.org; domain=home.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0038", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0039", - "received": [ - "foo=bar; domain=home.example.org; domain=example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0039", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0040", - "received": [ - "foo=bar; domain=example.org; domain=home.example.org" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?domain0040", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "DOMAIN0041", - "received": [ - "foo=bar; domain=.sibling.example.org" - ], - "sent-to": "http://sibling.example.org:8888/cookie-parser-result?domain0041", - "sent": [] - }, - { - "test": "DOMAIN0042", - "received": [ - "foo=bar; domain=.sibling.home.example.org" - ], - "sent-to": "http://sibling.home.example.org:8888/cookie-parser-result?domain0042", - "sent": [] - }, - { - "test": "MOZILLA0001", - "received": [ - "foo=bar; max-age=-1" - ], - "sent": [] - }, - { - "test": "MOZILLA0002", - "received": [ - "foo=bar; max-age=0" - ], - "sent": [] - }, - { - "test": "MOZILLA0003", - "received": [ - "foo=bar; expires=Thu, 10 Apr 1980 16:33:12 GMT" - ], - "sent": [] - }, - { - "test": "MOZILLA0004", - "received": [ - "foo=bar; max-age=60" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "MOZILLA0005", - "received": [ - "foo=bar; max-age=-20" - ], - "sent": [] - }, - { - "test": "MOZILLA0006", - "received": [ - "foo=bar; max-age=60" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "MOZILLA0007", - "received": [ - "foo=bar; expires=Thu, 10 Apr 1980 16:33:12 GMT" - ], - "sent": [] - }, - { - "test": "MOZILLA0008", - "received": [ - "foo=bar; max-age=60", - "foo1=bar; max-age=60" - ], - "sent": [ - { "name": "foo", "value": "bar" }, - { "name": "foo1", "value": "bar" } - ] - }, - { - "test": "MOZILLA0009", - "received": [ - "foo=bar; max-age=60", - "foo1=bar; max-age=60", - "foo=differentvalue; max-age=0" - ], - "sent": [ - { "name": "foo1", "value": "bar" } - ] - }, - { - "test": "MOZILLA0010", - "received": [ - "foo=bar; max-age=60", - "foo1=bar; max-age=60", - "foo=differentvalue; max-age=0", - "foo2=evendifferentvalue; max-age=0" - ], - "sent": [ - { "name": "foo1", "value": "bar" } - ] - }, - { - "test": "MOZILLA0011", - "received": [ - "test=parser; domain=.parser.test; ;; ;=; ,,, ===,abc,=; abracadabra! max-age=20;=;;" - ], - "sent": [] - }, - { - "test": "MOZILLA0012", - "received": [ - "test=\"fubar! = foo;bar\\\";\" parser; max-age=6", - "five; max-age=2.63," - ], - "sent": [ - { "name": "test", "value": "\"fubar! = foo" } - ] - }, - { - "test": "MOZILLA0013", - "received": [ - "test=kill; max-age=0", - "five; max-age=0" - ], - "sent": [] - }, - { - "test": "MOZILLA0014", - "received": [ - "six" - ], - "sent": [] - }, - { - "test": "MOZILLA0015", - "received": [ - "six", - "seven" - ], - "sent": [] - }, - { - "test": "MOZILLA0016", - "received": [ - "six", - "seven", - " =eight" - ], - "sent": [] - }, - { - "test": "MOZILLA0017", - "received": [ - "six", - "seven", - " =eight", - "test=six" - ], - "sent": [ - { "name": "test", "value": "six" } - ] - }, - { - "test": "NAME0001", - "received": [ - "a=bar" - ], - "sent": [ - { "name": "a", "value": "bar" } - ] - }, - { - "test": "NAME0002", - "received": [ - "1=bar" - ], - "sent": [ - { "name": "1", "value": "bar" } - ] - }, - { - "test": "NAME0003", - "received": [ - "$=bar" - ], - "sent": [ - { "name": "$", "value": "bar" } - ] - }, - { - "test": "NAME0004", - "received": [ - "!a=bar" - ], - "sent": [ - { "name": "!a", "value": "bar" } - ] - }, - { - "test": "NAME0005", - "received": [ - "@a=bar" - ], - "sent": [ - { "name": "@a", "value": "bar" } - ] - }, - { - "test": "NAME0006", - "received": [ - "#a=bar" - ], - "sent": [ - { "name": "#a", "value": "bar" } - ] - }, - { - "test": "NAME0007", - "received": [ - "$a=bar" - ], - "sent": [ - { "name": "$a", "value": "bar" } - ] - }, - { - "test": "NAME0008", - "received": [ - "%a=bar" - ], - "sent": [ - { "name": "%a", "value": "bar" } - ] - }, - { - "test": "NAME0009", - "received": [ - "^a=bar" - ], - "sent": [ - { "name": "^a", "value": "bar" } - ] - }, - { - "test": "NAME0010", - "received": [ - "&a=bar" - ], - "sent": [ - { "name": "&a", "value": "bar" } - ] - }, - { - "test": "NAME0011", - "received": [ - "*a=bar" - ], - "sent": [ - { "name": "*a", "value": "bar" } - ] - }, - { - "test": "NAME0012", - "received": [ - "(a=bar" - ], - "sent": [ - { "name": "(a", "value": "bar" } - ] - }, - { - "test": "NAME0013", - "received": [ - ")a=bar" - ], - "sent": [ - { "name": ")a", "value": "bar" } - ] - }, - { - "test": "NAME0014", - "received": [ - "-a=bar" - ], - "sent": [ - { "name": "-a", "value": "bar" } - ] - }, - { - "test": "NAME0015", - "received": [ - "_a=bar" - ], - "sent": [ - { "name": "_a", "value": "bar" } - ] - }, - { - "test": "NAME0016", - "received": [ - "+=bar" - ], - "sent": [ - { "name": "+", "value": "bar" } - ] - }, - { - "test": "NAME0017", - "received": [ - "=a=bar" - ], - "sent": [] - }, - { - "test": "NAME0018", - "received": [ - "a =bar" - ], - "sent": [ - { "name": "a", "value": "bar" } - ] - }, - { - "test": "NAME0019", - "received": [ - "\"a=bar" - ], - "sent": [ - { "name": "\"a", "value": "bar" } - ] - }, - { - "test": "NAME0020", - "received": [ - "\"a=b\"=bar" - ], - "sent": [ - { "name": "\"a", "value": "b\"=bar" } - ] - }, - { - "test": "NAME0021", - "received": [ - "\"a=b\"=bar", - "\"a=qux" - ], - "sent": [ - { "name": "\"a", "value": "qux" } - ] - }, - { - "test": "NAME0022", - "received": [ - " foo=bar" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "NAME0023", - "received": [ - "foo;bar=baz" - ], - "sent": [] - }, - { - "test": "NAME0024", - "received": [ - "$Version=1; foo=bar" - ], - "sent": [ - { "name": "$Version", "value": "1" } - ] - }, - { - "test": "NAME0025", - "received": [ - "===a=bar" - ], - "sent": [] - }, - { - "test": "NAME0026", - "received": [ - "foo=bar " - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "NAME0027", - "received": [ - "foo=bar ;" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "NAME0028", - "received": [ - "=a" - ], - "sent": [] - }, - { - "test": "NAME0029", - "received": [ - "=" - ], - "sent": [] - }, - { - "test": "NAME0030", - "received": [ - "foo bar=baz" - ], - "sent": [ - { "name": "foo bar", "value": "baz" } - ] - }, - { - "test": "NAME0031", - "received": [ - "\"foo;bar\"=baz" - ], - "sent": [] - }, - { - "test": "NAME0032", - "received": [ - "\"foo\\\"bar;baz\"=qux" - ], - "sent": [] - }, - { - "test": "NAME0033", - "received": [ - "=foo=bar", - "aaa" - ], - "sent": [] - }, - { - "test": "OPTIONAL_DOMAIN0030", - "received": [ - "foo=bar; domain=" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?optional-domain0030", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "OPTIONAL_DOMAIN0041", - "received": [ - "foo=bar; domain=example.org; domain=" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?optional-domain0041", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "OPTIONAL_DOMAIN0042", - "received": [ - "foo=bar; domain=foo.example.org; domain=" - ], - "sent-to": "http://home.example.org:8888/cookie-parser-result?optional-domain0042", - "sent": [] - }, - { - "test": "OPTIONAL_DOMAIN0043", - "received": [ - "foo=bar; domain=foo.example.org; domain=" - ], - "sent-to": "http://subdomain.home.example.org:8888/cookie-parser-result?optional-domain0043", - "sent": [] - }, - { - "test": "ORDERING0001", - "received": [ - "key=val0;", - "key=val1; path=/cookie-parser-result", - "key=val2; path=/", - "key=val3; path=/bar", - "key=val4; domain=.example.org", - "key=val5; domain=.example.org; path=/cookie-parser-result/foo" - ], - "sent-to": "/cookie-parser-result/foo/baz?ordering0001", - "sent": [ - { "name": "key", "value": "val5" }, - { "name": "key", "value": "val1" }, - { "name": "key", "value": "val2" }, - { "name": "key", "value": "val4" } - ] - }, - { - "test": "PATH0001", - "received": [ - "a=b; path=/", - "x=y; path=/cookie-parser-result" - ], - "sent": [ - { "name": "x", "value": "y" }, - { "name": "a", "value": "b" } - ] - }, - { - "test": "PATH0002", - "received": [ - "a=b; path=/cookie-parser-result", - "x=y; path=/" - ], - "sent": [ - { "name": "a", "value": "b" }, - { "name": "x", "value": "y" } - ] - }, - { - "test": "PATH0003", - "received": [ - "x=y; path=/", - "a=b; path=/cookie-parser-result" - ], - "sent": [ - { "name": "a", "value": "b" }, - { "name": "x", "value": "y" } - ] - }, - { - "test": "PATH0004", - "received": [ - "x=y; path=/cookie-parser-result", - "a=b; path=/" - ], - "sent": [ - { "name": "x", "value": "y" }, - { "name": "a", "value": "b" } - ] - }, - { - "test": "PATH0005", - "received": [ - "foo=bar; path=/cookie-parser-result/foo" - ], - "sent": [] - }, - { - "test": "PATH0006", - "received": [ - "foo=bar", - "foo=qux; path=/cookie-parser-result/foo" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0007", - "received": [ - "foo=bar; path=/cookie-parser-result/foo" - ], - "sent-to": "/cookie-parser-result/foo?path0007", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0008", - "received": [ - "foo=bar; path=/cookie-parser-result/foo" - ], - "sent-to": "/cookie-parser-result/bar?path0008", - "sent": [] - }, - { - "test": "PATH0009", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/qux" - ], - "sent-to": "/cookie-parser-result/foo?path0009", - "sent": [] - }, - { - "test": "PATH0010", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/qux" - ], - "sent-to": "/cookie-parser-result/foo/qux?path0010", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0011", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/qux" - ], - "sent-to": "/cookie-parser-result/bar/qux?path0011", - "sent": [] - }, - { - "test": "PATH0012", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/qux" - ], - "sent-to": "/cookie-parser-result/foo/baz?path0012", - "sent": [] - }, - { - "test": "PATH0013", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/qux/" - ], - "sent-to": "/cookie-parser-result/foo/baz?path0013", - "sent": [] - }, - { - "test": "PATH0014", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/qux/" - ], - "sent-to": "/cookie-parser-result/foo/qux?path0014", - "sent": [] - }, - { - "test": "PATH0015", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/qux/" - ], - "sent-to": "/cookie-parser-result/foo/qux/?path0015", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0016", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/" - ], - "sent-to": "/cookie-parser-result/foo/qux?path0016", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0017", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/" - ], - "sent-to": "/cookie-parser-result/foo//qux?path0017", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0018", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/" - ], - "sent-to": "/cookie-parser-result/fooqux?path0018", - "sent": [] - }, - { - "test": "PATH0019", - "received": [ - "foo=bar; path" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0020", - "received": [ - "foo=bar; path=" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0021", - "received": [ - "foo=bar; path=/" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0022", - "received": [ - "foo=bar; path= /" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0023", - "received": [ - "foo=bar; Path=/cookie-PARSER-result" - ], - "sent": [] - }, - { - "test": "PATH0024", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/qux?" - ], - "sent-to": "/cookie-parser-result/foo/qux?path0024", - "sent": [] - }, - { - "test": "PATH0025", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/qux#" - ], - "sent-to": "/cookie-parser-result/foo/qux?path0025", - "sent": [] - }, - { - "test": "PATH0026", - "received": [ - "foo=bar; path=/cookie-parser-result/foo/qux;" - ], - "sent-to": "/cookie-parser-result/foo/qux?path0026", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0027", - "received": [ - "foo=bar; path=\"/cookie-parser-result/foo/qux;\"" - ], - "sent-to": "/cookie-parser-result/foo/qux?path0027", - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0028", - "received": [ - "foo=bar; path=/cookie-parser-result/f%6Fo/bar" - ], - "sent-to": "/cookie-parser-result/foo/bar?path0028", - "sent": [] - }, - { - "test": "PATH0029", - "received": [ - "a=b; \tpath\t=\t/cookie-parser-result\t", - "x=y; \tpath\t=\t/book\t" - ], - "sent": [ - { "name": "a", "value": "b" } - ] - }, - { - "test": "PATH0030", - "received": [ - "foo=bar; path=/dog; path=" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "PATH0031", - "received": [ - "foo=bar; path=; path=/dog" - ], - "sent": [] - }, - { - "test": "PATH0032", - "received": [ - "foo=bar; path=/cookie-parser-result", - "foo=qux; path=/cookie-parser-result/" - ], - "sent-to": "/cookie-parser-result/dog?path0032", - "sent": [ - { "name": "foo", "value": "qux" }, - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "VALUE0001", - "received": [ - "foo= bar" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - }, - { - "test": "VALUE0002", - "received": [ - "foo=\"bar\"" - ], - "sent": [ - { "name": "foo", "value": "\"bar\"" } - ] - }, - { - "test": "VALUE0003", - "received": [ - "foo=\" bar \"" - ], - "sent": [ - { "name": "foo", "value": "\" bar \"" } - ] - }, - { - "test": "VALUE0004", - "received": [ - "foo=\"bar;baz\"" - ], - "sent": [ - { "name": "foo", "value": "\"bar" } - ] - }, - { - "test": "VALUE0005", - "received": [ - "foo=\"bar=baz\"" - ], - "sent": [ - { "name": "foo", "value": "\"bar=baz\"" } - ] - }, - { - "test": "VALUE0006", - "received": [ - "\tfoo\t=\tbar\t \t;\tttt" - ], - "sent": [ - { "name": "foo", "value": "bar" } - ] - } -] diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_test.js deleted file mode 100644 index 8bd41dd..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/ietf_test.js +++ /dev/null @@ -1,105 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ - -'use strict'; -var vows = require('vows'); -var assert = require('assert'); -var fs = require('fs'); -var path = require('path'); -var url = require('url'); -var tough = require('../lib/cookie'); -var Cookie = tough.Cookie; -var CookieJar = tough.CookieJar; - -function readJson(filePath) { - filePath = path.join(__dirname, filePath); - return JSON.parse(fs.readFileSync(filePath).toString()); -} - -function setGetCookieVows() { - var theVows = {}; - var data = readJson('./ietf_data/parser.json'); - - data.forEach(function (testCase) { - theVows[testCase.test] = function () { - var jar = new CookieJar(); - var expected = testCase['sent'] - var sentFrom = 'http://home.example.org/cookie-parser?' + testCase.test; - var sentTo = testCase['sent-to'] ? - url.resolve('http://home.example.org', testCase['sent-to']) : - 'http://home.example.org/cookie-parser-result?' + testCase.test; - - testCase['received'].forEach(function (cookieStr) { - jar.setCookieSync(cookieStr, sentFrom, {ignoreError: true}); - }); - - var actual = jar.getCookiesSync(sentTo,{sort:true}); - - assert.strictEqual(actual.length, expected.length); - - actual.forEach(function (actualCookie, idx) { - var expectedCookie = expected[idx]; - assert.strictEqual(actualCookie.key, expectedCookie.name); - assert.strictEqual(actualCookie.value, expectedCookie.value); - }); - }; - }); - - return {'Set/get cookie tests': theVows}; -} - -function dateVows() { - var theVows = {}; - - [ - './ietf_data/dates/bsd-examples.json', - './ietf_data/dates/examples.json' - ].forEach(function (filePath) { - var data = readJson(filePath); - var fileName = path.basename(filePath); - - data.forEach(function (testCase) { - theVows[fileName + ' : ' + testCase.test] = function () { - var actual = tough.parseDate(testCase.test); - actual = actual ? actual.toUTCString() : null; - assert.strictEqual(actual, testCase.expected); - }; - }); - }); - - return {'Date': theVows}; -} - -vows - .describe('IETF http state tests') - .addBatch(setGetCookieVows()) - .addBatch(dateVows()) - .export(module); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/jar_serialization_test.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/jar_serialization_test.js deleted file mode 100644 index 277c90c..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tough-cookie/test/jar_serialization_test.js +++ /dev/null @@ -1,348 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 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. - * - * 3. Neither the name of Salesforce.com 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. - */ - -'use strict'; -var vows = require('vows'); -var assert = require('assert'); -var tough = require('../lib/cookie'); -var Cookie = tough.Cookie; -var CookieJar = tough.CookieJar; -var Store = tough.Store; -var MemoryCookieStore = tough.MemoryCookieStore; -var VERSION = require('../package.json').version; - -var domains = ['example.com','www.example.com','example.net']; -var paths = ['/','/foo','/foo/bar']; - -var isInteger = Number.isInteger || function(value) { - // Node 0.10 (still supported) doesn't have Number.isInteger - // from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger - return typeof value === "number" && - isFinite(value) && - Math.floor(value) === value; -}; - -function setUp(context) { - context.now = new Date(); - context.nowISO = context.now.toISOString(); - context.expires = new Date(context.now.getTime() + 86400000); - - var c, domain; - context.jar = new CookieJar(); - - context.totalCookies = 0; - - // Do paths first since the MemoryCookieStore index is domain at the top - // level. This should cause the preservation of creation order in - // getAllCookies to be exercised. - for (var i = 0; i= this.maxSockets) { - // We are over limit so we'll add it to the queue. - self.requests.push({host: options.host, port: options.port, request: req}) - return - } - - // If we are under maxSockets create a new one. - self.createConnection({host: options.host, port: options.port, request: req}) -} - -TunnelingAgent.prototype.createConnection = function createConnection(pending) { - var self = this - - self.createSocket(pending, function(socket) { - socket.on('free', onFree) - socket.on('close', onCloseOrRemove) - socket.on('agentRemove', onCloseOrRemove) - pending.request.onSocket(socket) - - function onFree() { - self.emit('free', socket, pending.host, pending.port) - } - - function onCloseOrRemove(err) { - self.removeSocket(socket) - socket.removeListener('free', onFree) - socket.removeListener('close', onCloseOrRemove) - socket.removeListener('agentRemove', onCloseOrRemove) - } - }) -} - -TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this - var placeholder = {} - self.sockets.push(placeholder) - - var connectOptions = mergeOptions({}, self.proxyOptions, - { method: 'CONNECT' - , path: options.host + ':' + options.port - , agent: false - } - ) - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {} - connectOptions.headers['Proxy-Authorization'] = 'Basic ' + - new Buffer(connectOptions.proxyAuth).toString('base64') - } - - debug('making CONNECT request') - var connectReq = self.request(connectOptions) - connectReq.useChunkedEncodingByDefault = false // for v0.6 - connectReq.once('response', onResponse) // for v0.6 - connectReq.once('upgrade', onUpgrade) // for v0.6 - connectReq.once('connect', onConnect) // for v0.7 or later - connectReq.once('error', onError) - connectReq.end() - - function onResponse(res) { - // Very hacky. This is necessary to avoid http-parser leaks. - res.upgrade = true - } - - function onUpgrade(res, socket, head) { - // Hacky. - process.nextTick(function() { - onConnect(res, socket, head) - }) - } - - function onConnect(res, socket, head) { - connectReq.removeAllListeners() - socket.removeAllListeners() - - if (res.statusCode === 200) { - assert.equal(head.length, 0) - debug('tunneling connection has established') - self.sockets[self.sockets.indexOf(placeholder)] = socket - cb(socket) - } else { - debug('tunneling socket could not be established, statusCode=%d', res.statusCode) - var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } - } - - function onError(cause) { - connectReq.removeAllListeners() - - debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) - var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } -} - -TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket) - if (pos === -1) return - - this.sockets.splice(pos, 1) - - var pending = this.requests.shift() - if (pending) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createConnection(pending) - } -} - -function createSecureSocket(options, cb) { - var self = this - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { - // 0 is dummy port for v0.6 - var secureSocket = tls.connect(0, mergeOptions({}, self.options, - { servername: options.host - , socket: socket - } - )) - self.sockets[self.sockets.indexOf(socket)] = secureSocket - cb(secureSocket) - }) -} - - -function mergeOptions(target) { - for (var i = 1, len = arguments.length; i < len; ++i) { - var overrides = arguments[i] - if (typeof overrides === 'object') { - var keys = Object.keys(overrides) - for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { - var k = keys[j] - if (overrides[k] !== undefined) { - target[k] = overrides[k] - } - } - } - } - return target -} - - -var debug -if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function() { - var args = Array.prototype.slice.call(arguments) - if (typeof args[0] === 'string') { - args[0] = 'TUNNEL: ' + args[0] - } else { - args.unshift('TUNNEL:') - } - console.error.apply(console, args) - } -} else { - debug = function() {} -} -exports.debug = debug // for test diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tunnel-agent/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tunnel-agent/package.json deleted file mode 100644 index 522571f..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/node_modules/tunnel-agent/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "author": { - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com", - "url": "http://www.futurealoof.com" - }, - "name": "tunnel-agent", - "description": "HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.", - "version": "0.4.1", - "repository": { - "url": "git+https://github.com/mikeal/tunnel-agent.git" - }, - "main": "index.js", - "dependencies": {}, - "devDependencies": {}, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "gitHead": "912a7a6d00e10ec76baf9c9369de280fa5badef3", - "bugs": { - "url": "https://github.com/mikeal/tunnel-agent/issues" - }, - "homepage": "https://github.com/mikeal/tunnel-agent#readme", - "_id": "tunnel-agent@0.4.1", - "scripts": {}, - "_shasum": "bbeecff4d679ce753db9462761a88dfcec3c5ab3", - "_from": "tunnel-agent@>=0.4.0 <0.5.0", - "_npmVersion": "2.11.2", - "_nodeVersion": "0.12.5", - "_npmUser": { - "name": "simov", - "email": "simeonvelichkov@gmail.com" - }, - "dist": { - "shasum": "bbeecff4d679ce753db9462761a88dfcec3c5ab3", - "tarball": "http://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" - }, - "maintainers": [ - { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - { - "name": "nylen", - "email": "jnylen@gmail.com" - }, - { - "name": "fredkschott", - "email": "fkschott@gmail.com" - }, - { - "name": "simov", - "email": "simeonvelichkov@gmail.com" - } - ], - "directories": {}, - "_resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/package.json b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/package.json deleted file mode 100644 index 3cca1ce..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/package.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "name": "request", - "description": "Simplified HTTP request client.", - "tags": [ - "http", - "simple", - "util", - "utility" - ], - "version": "2.61.0", - "author": { - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/request/request.git" - }, - "bugs": { - "url": "http://github.com/request/request/issues" - }, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - }, - "main": "index.js", - "dependencies": { - "bl": "~1.0.0", - "caseless": "~0.11.0", - "extend": "~3.0.0", - "forever-agent": "~0.6.0", - "form-data": "~1.0.0-rc1", - "json-stringify-safe": "~5.0.0", - "mime-types": "~2.1.2", - "node-uuid": "~1.4.0", - "qs": "~4.0.0", - "tunnel-agent": "~0.4.0", - "tough-cookie": ">=0.12.0", - "http-signature": "~0.11.0", - "oauth-sign": "~0.8.0", - "hawk": "~3.1.0", - "aws-sign2": "~0.5.0", - "stringstream": "~0.0.4", - "combined-stream": "~1.0.1", - "isstream": "~0.1.1", - "har-validator": "^1.6.1" - }, - "scripts": { - "test": "npm run lint && npm run test-ci && npm run test-browser", - "test-ci": "taper tests/test-*.js", - "test-cov": "istanbul cover tape tests/test-*.js", - "test-browser": "node tests/browser/start.js", - "lint": "eslint lib/ *.js tests/ && echo Lint passed." - }, - "devDependencies": { - "browserify": "~5.9.1", - "browserify-istanbul": "~0.1.3", - "buffer-equal": "0.0.1", - "codecov.io": "~0.1.2", - "coveralls": "~2.11.2", - "eslint": "0.18.0", - "function-bind": "~1.0.0", - "istanbul": "~0.3.2", - "karma": "~0.12.21", - "karma-browserify": "~3.0.1", - "karma-cli": "0.0.4", - "karma-coverage": "0.2.6", - "karma-phantomjs-launcher": "~0.1.4", - "karma-tap": "~1.0.1", - "rimraf": "~2.2.8", - "server-destroy": "~1.0.0", - "tape": "~3.0.0", - "taper": "~0.4.0", - "bluebird": "~2.9.21" - }, - "gitHead": "8492d18add93af1214943ee12e25371f9f9adad3", - "homepage": "https://github.com/request/request#readme", - "_id": "request@2.61.0", - "_shasum": "6973cb2ac94885f02693f554eec64481d6013f9f", - "_from": "request@*", - "_npmVersion": "2.11.2", - "_nodeVersion": "0.12.6", - "_npmUser": { - "name": "simov", - "email": "simeonvelichkov@gmail.com" - }, - "dist": { - "shasum": "6973cb2ac94885f02693f554eec64481d6013f9f", - "tarball": "http://registry.npmjs.org/request/-/request-2.61.0.tgz" - }, - "maintainers": [ - { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - { - "name": "nylen", - "email": "jnylen@gmail.com" - }, - { - "name": "fredkschott", - "email": "fkschott@gmail.com" - }, - { - "name": "simov", - "email": "simeonvelichkov@gmail.com" - } - ], - "directories": {}, - "_resolved": "https://registry.npmjs.org/request/-/request-2.61.0.tgz" -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/release.sh b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/release.sh deleted file mode 100755 index 7678bf8..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/release.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh - -if [ -z "`which github-changes`" ]; then - # specify version because github-changes "is under heavy development. Things - # may break between releases" until 0.1.0 - echo "First, do: [sudo] npm install -g github-changes@0.0.14" - exit 1 -fi - -if [ -d .git/refs/remotes/upstream ]; then - remote=upstream -else - remote=origin -fi - -# Increment v2.x.y -> v2.x+1.0 -npm version minor || exit 1 - -# Generate changelog from pull requests -github-changes -o request -r request \ - --auth --verbose \ - --file CHANGELOG.md \ - --only-pulls --use-commit-body \ - --date-format '(YYYY/MM/DD)' \ - || exit 1 - -# Since the tag for the new version hasn't been pushed yet, any changes in it -# will be marked as "upcoming" -version="$(grep '"version"' package.json | cut -d'"' -f4)" -sed -i -e "s/^### upcoming/### v$version/" CHANGELOG.md - -# This may fail if no changelog updates -# TODO: would this ever actually happen? handle it better? -git add CHANGELOG.md; git commit -m 'Update changelog' - -# Publish the new version to npm -npm publish || exit 1 - -# Increment v2.x.0 -> v2.x.1 -# For rationale, see: -# https://github.com/request/oauth-sign/issues/10#issuecomment-58917018 -npm version patch || exit 1 - -# Push back to the main repo -git push $remote master --tags || exit 1 diff --git a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/request.js b/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/request.js deleted file mode 100644 index 700b9e0..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/node_modules/request/request.js +++ /dev/null @@ -1,1424 +0,0 @@ -'use strict' - -var http = require('http') - , https = require('https') - , url = require('url') - , util = require('util') - , stream = require('stream') - , zlib = require('zlib') - , bl = require('bl') - , hawk = require('hawk') - , aws = require('aws-sign2') - , httpSignature = require('http-signature') - , mime = require('mime-types') - , stringstream = require('stringstream') - , caseless = require('caseless') - , ForeverAgent = require('forever-agent') - , FormData = require('form-data') - , helpers = require('./lib/helpers') - , cookies = require('./lib/cookies') - , getProxyFromURI = require('./lib/getProxyFromURI') - , Querystring = require('./lib/querystring').Querystring - , Har = require('./lib/har').Har - , Auth = require('./lib/auth').Auth - , OAuth = require('./lib/oauth').OAuth - , Multipart = require('./lib/multipart').Multipart - , Redirect = require('./lib/redirect').Redirect - , Tunnel = require('./lib/tunnel').Tunnel - -var safeStringify = helpers.safeStringify - , isReadStream = helpers.isReadStream - , toBase64 = helpers.toBase64 - , defer = helpers.defer - , copy = helpers.copy - , version = helpers.version - , globalCookieJar = cookies.jar() - - -var globalPool = {} - -function filterForNonReserved(reserved, options) { - // Filter out properties that are not reserved. - // Reserved values are passed in at call site. - - var object = {} - for (var i in options) { - var notReserved = (reserved.indexOf(i) === -1) - if (notReserved) { - object[i] = options[i] - } - } - return object -} - -function filterOutReservedFunctions(reserved, options) { - // Filter out properties that are functions and are reserved. - // Reserved values are passed in at call site. - - var object = {} - for (var i in options) { - var isReserved = !(reserved.indexOf(i) === -1) - var isFunction = (typeof options[i] === 'function') - if (!(isReserved && isFunction)) { - object[i] = options[i] - } - } - return object - -} - -// Function for properly handling a connection error -function connectionErrorHandler(error) { - var socket = this - if (socket.res) { - if (socket.res.request) { - socket.res.request.emit('error', error) - } else { - socket.res.emit('error', error) - } - } else { - socket._httpMessage.emit('error', error) - } -} - -// Return a simpler request object to allow serialization -function requestToJSON() { - var self = this - return { - uri: self.uri, - method: self.method, - headers: self.headers - } -} - -// Return a simpler response object to allow serialization -function responseToJSON() { - var self = this - return { - statusCode: self.statusCode, - body: self.body, - headers: self.headers, - request: requestToJSON.call(self.request) - } -} - -function Request (options) { - // if given the method property in options, set property explicitMethod to true - - // extend the Request instance with any non-reserved properties - // remove any reserved functions from the options object - // set Request instance to be readable and writable - // call init - - var self = this - - // start with HAR, then override with additional options - if (options.har) { - self._har = new Har(self) - options = self._har.options(options) - } - - stream.Stream.call(self) - var reserved = Object.keys(Request.prototype) - var nonReserved = filterForNonReserved(reserved, options) - - stream.Stream.call(self) - util._extend(self, nonReserved) - options = filterOutReservedFunctions(reserved, options) - - self.readable = true - self.writable = true - if (options.method) { - self.explicitMethod = true - } - self._qs = new Querystring(self) - self._auth = new Auth(self) - self._oauth = new OAuth(self) - self._multipart = new Multipart(self) - self._redirect = new Redirect(self) - self._tunnel = new Tunnel(self) - self.init(options) -} - -util.inherits(Request, stream.Stream) - -// Debugging -Request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG) -function debug() { - if (Request.debug) { - console.error('REQUEST %s', util.format.apply(util, arguments)) - } -} -Request.prototype.debug = debug - -Request.prototype.init = function (options) { - // init() contains all the code to setup the request object. - // the actual outgoing request is not started until start() is called - // this function is called from both the constructor and on redirect. - var self = this - if (!options) { - options = {} - } - self.headers = self.headers ? copy(self.headers) : {} - - // Delete headers with value undefined since they break - // ClientRequest.OutgoingMessage.setHeader in node 0.12 - for (var headerName in self.headers) { - if (typeof self.headers[headerName] === 'undefined') { - delete self.headers[headerName] - } - } - - caseless.httpify(self, self.headers) - - if (!self.method) { - self.method = options.method || 'GET' - } - if (!self.localAddress) { - self.localAddress = options.localAddress - } - - self._qs.init(options) - - debug(options) - if (!self.pool && self.pool !== false) { - self.pool = globalPool - } - self.dests = self.dests || [] - self.__isRequestRequest = true - - // Protect against double callback - if (!self._callback && self.callback) { - self._callback = self.callback - self.callback = function () { - if (self._callbackCalled) { - return // Print a warning maybe? - } - self._callbackCalled = true - self._callback.apply(self, arguments) - } - self.on('error', self.callback.bind()) - self.on('complete', self.callback.bind(self, null)) - } - - // People use this property instead all the time, so support it - if (!self.uri && self.url) { - self.uri = self.url - delete self.url - } - - // If there's a baseUrl, then use it as the base URL (i.e. uri must be - // specified as a relative path and is appended to baseUrl). - if (self.baseUrl) { - if (typeof self.baseUrl !== 'string') { - return self.emit('error', new Error('options.baseUrl must be a string')) - } - - if (typeof self.uri !== 'string') { - return self.emit('error', new Error('options.uri must be a string when using options.baseUrl')) - } - - if (self.uri.indexOf('//') === 0 || self.uri.indexOf('://') !== -1) { - return self.emit('error', new Error('options.uri must be a path when using options.baseUrl')) - } - - // Handle all cases to make sure that there's only one slash between - // baseUrl and uri. - var baseUrlEndsWithSlash = self.baseUrl.lastIndexOf('/') === self.baseUrl.length - 1 - var uriStartsWithSlash = self.uri.indexOf('/') === 0 - - if (baseUrlEndsWithSlash && uriStartsWithSlash) { - self.uri = self.baseUrl + self.uri.slice(1) - } else if (baseUrlEndsWithSlash || uriStartsWithSlash) { - self.uri = self.baseUrl + self.uri - } else if (self.uri === '') { - self.uri = self.baseUrl - } else { - self.uri = self.baseUrl + '/' + self.uri - } - delete self.baseUrl - } - - // A URI is needed by this point, emit error if we haven't been able to get one - if (!self.uri) { - return self.emit('error', new Error('options.uri is a required argument')) - } - - // If a string URI/URL was given, parse it into a URL object - if (typeof self.uri === 'string') { - self.uri = url.parse(self.uri) - } - - // DEPRECATED: Warning for users of the old Unix Sockets URL Scheme - if (self.uri.protocol === 'unix:') { - return self.emit('error', new Error('`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`')) - } - - // Support Unix Sockets - if (self.uri.host === 'unix') { - // Get the socket & request paths from the URL - var unixParts = self.uri.path.split(':') - , host = unixParts[0] - , path = unixParts[1] - // Apply unix properties to request - self.socketPath = host - self.uri.pathname = path - self.uri.path = path - self.uri.host = host - self.uri.hostname = host - self.uri.isUnix = true - } - - if (self.strictSSL === false) { - self.rejectUnauthorized = false - } - - if (!self.uri.pathname) {self.uri.pathname = '/'} - - if (!(self.uri.host || (self.uri.hostname && self.uri.port)) && !self.uri.isUnix) { - // Invalid URI: it may generate lot of bad errors, like 'TypeError: Cannot call method `indexOf` of undefined' in CookieJar - // Detect and reject it as soon as possible - var faultyUri = url.format(self.uri) - var message = 'Invalid URI "' + faultyUri + '"' - if (Object.keys(options).length === 0) { - // No option ? This can be the sign of a redirect - // As this is a case where the user cannot do anything (they didn't call request directly with this URL) - // they should be warned that it can be caused by a redirection (can save some hair) - message += '. This can be caused by a crappy redirection.' - } - // This error was fatal - return self.emit('error', new Error(message)) - } - - if (!self.hasOwnProperty('proxy')) { - self.proxy = getProxyFromURI(self.uri) - } - - self.tunnel = self._tunnel.isEnabled(options) - if (self.proxy) { - self._tunnel.setup(options) - } - - self._redirect.onRequest(options) - - self.setHost = false - if (!self.hasHeader('host')) { - var hostHeaderName = self.originalHostHeaderName || 'host' - self.setHeader(hostHeaderName, self.uri.hostname) - if (self.uri.port) { - if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') && - !(self.uri.port === 443 && self.uri.protocol === 'https:') ) { - self.setHeader(hostHeaderName, self.getHeader('host') + (':' + self.uri.port) ) - } - } - self.setHost = true - } - - self.jar(self._jar || options.jar) - - if (!self.uri.port) { - if (self.uri.protocol === 'http:') {self.uri.port = 80} - else if (self.uri.protocol === 'https:') {self.uri.port = 443} - } - - if (self.proxy && !self.tunnel) { - self.port = self.proxy.port - self.host = self.proxy.hostname - } else { - self.port = self.uri.port - self.host = self.uri.hostname - } - - if (options.form) { - self.form(options.form) - } - - if (options.formData) { - var formData = options.formData - var requestForm = self.form() - var appendFormValue = function (key, value) { - if (value.hasOwnProperty('value') && value.hasOwnProperty('options')) { - requestForm.append(key, value.value, value.options) - } else { - requestForm.append(key, value) - } - } - for (var formKey in formData) { - if (formData.hasOwnProperty(formKey)) { - var formValue = formData[formKey] - if (formValue instanceof Array) { - for (var j = 0; j < formValue.length; j++) { - appendFormValue(formKey, formValue[j]) - } - } else { - appendFormValue(formKey, formValue) - } - } - } - } - - if (options.qs) { - self.qs(options.qs) - } - - if (self.uri.path) { - self.path = self.uri.path - } else { - self.path = self.uri.pathname + (self.uri.search || '') - } - - if (self.path.length === 0) { - self.path = '/' - } - - // Auth must happen last in case signing is dependent on other headers - if (options.aws) { - self.aws(options.aws) - } - - if (options.hawk) { - self.hawk(options.hawk) - } - - if (options.httpSignature) { - self.httpSignature(options.httpSignature) - } - - if (options.auth) { - if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) { - options.auth.user = options.auth.username - } - if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) { - options.auth.pass = options.auth.password - } - - self.auth( - options.auth.user, - options.auth.pass, - options.auth.sendImmediately, - options.auth.bearer - ) - } - - if (self.gzip && !self.hasHeader('accept-encoding')) { - self.setHeader('accept-encoding', 'gzip') - } - - if (self.uri.auth && !self.hasHeader('authorization')) { - var uriAuthPieces = self.uri.auth.split(':').map(function(item) {return self._qs.unescape(item)}) - self.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(':'), true) - } - - if (!self.tunnel && self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization')) { - var proxyAuthPieces = self.proxy.auth.split(':').map(function(item) {return self._qs.unescape(item)}) - var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':')) - self.setHeader('proxy-authorization', authHeader) - } - - if (self.proxy && !self.tunnel) { - self.path = (self.uri.protocol + '//' + self.uri.host + self.path) - } - - if (options.json) { - self.json(options.json) - } - if (options.multipart) { - self.multipart(options.multipart) - } - - if (options.time) { - self.timing = true - self.elapsedTime = self.elapsedTime || 0 - } - - function setContentLength () { - if (!self.hasHeader('content-length')) { - var length - if (typeof self.body === 'string') { - length = Buffer.byteLength(self.body) - } - else if (Array.isArray(self.body)) { - length = self.body.reduce(function (a, b) {return a + b.length}, 0) - } - else { - length = self.body.length - } - - if (length) { - self.setHeader('content-length', length) - } else { - self.emit('error', new Error('Argument error, options.body.')) - } - } - } - if (self.body) { - setContentLength() - } - - if (options.oauth) { - self.oauth(options.oauth) - } else if (self._oauth.params && self.hasHeader('authorization')) { - self.oauth(self._oauth.params) - } - - var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol - , defaultModules = {'http:':http, 'https:':https} - , httpModules = self.httpModules || {} - - self.httpModule = httpModules[protocol] || defaultModules[protocol] - - if (!self.httpModule) { - return self.emit('error', new Error('Invalid protocol: ' + protocol)) - } - - if (options.ca) { - self.ca = options.ca - } - - if (!self.agent) { - if (options.agentOptions) { - self.agentOptions = options.agentOptions - } - - if (options.agentClass) { - self.agentClass = options.agentClass - } else if (options.forever) { - var v = version() - // use ForeverAgent in node 0.10- only - if (v.major === 0 && v.minor <= 10) { - self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL - } else { - self.agentClass = self.httpModule.Agent - self.agentOptions = self.agentOptions || {} - self.agentOptions.keepAlive = true - } - } else { - self.agentClass = self.httpModule.Agent - } - } - - if (self.pool === false) { - self.agent = false - } else { - self.agent = self.agent || self.getNewAgent() - } - - self.on('pipe', function (src) { - if (self.ntick && self._started) { - self.emit('error', new Error('You cannot pipe to this stream after the outbound request has started.')) - } - self.src = src - if (isReadStream(src)) { - if (!self.hasHeader('content-type')) { - self.setHeader('content-type', mime.lookup(src.path)) - } - } else { - if (src.headers) { - for (var i in src.headers) { - if (!self.hasHeader(i)) { - self.setHeader(i, src.headers[i]) - } - } - } - if (self._json && !self.hasHeader('content-type')) { - self.setHeader('content-type', 'application/json') - } - if (src.method && !self.explicitMethod) { - self.method = src.method - } - } - - // self.on('pipe', function () { - // console.error('You have already piped to this stream. Pipeing twice is likely to break the request.') - // }) - }) - - defer(function () { - if (self._aborted) { - return - } - - var end = function () { - if (self._form) { - if (!self._auth.hasAuth) { - self._form.pipe(self) - } - else if (self._auth.hasAuth && self._auth.sentAuth) { - self._form.pipe(self) - } - } - if (self._multipart && self._multipart.chunked) { - self._multipart.body.pipe(self) - } - if (self.body) { - setContentLength() - if (Array.isArray(self.body)) { - self.body.forEach(function (part) { - self.write(part) - }) - } else { - self.write(self.body) - } - self.end() - } else if (self.requestBodyStream) { - console.warn('options.requestBodyStream is deprecated, please pass the request object to stream.pipe.') - self.requestBodyStream.pipe(self) - } else if (!self.src) { - if (self._auth.hasAuth && !self._auth.sentAuth) { - self.end() - return - } - if (self.method !== 'GET' && typeof self.method !== 'undefined') { - self.setHeader('content-length', 0) - } - self.end() - } - } - - if (self._form && !self.hasHeader('content-length')) { - // Before ending the request, we had to compute the length of the whole form, asyncly - self.setHeader(self._form.getHeaders(), true) - self._form.getLength(function (err, length) { - if (!err) { - self.setHeader('content-length', length) - } - end() - }) - } else { - end() - } - - self.ntick = true - }) - -} - -// Must call this when following a redirect from https to http or vice versa -// Attempts to keep everything as identical as possible, but update the -// httpModule, Tunneling agent, and/or Forever Agent in use. -Request.prototype._updateProtocol = function () { - var self = this - var protocol = self.uri.protocol - - if (protocol === 'https:' || self.tunnel) { - // previously was doing http, now doing https - // if it's https, then we might need to tunnel now. - if (self.proxy) { - if (self._tunnel.setup()) { - return - } - } - - self.httpModule = https - switch (self.agentClass) { - case ForeverAgent: - self.agentClass = ForeverAgent.SSL - break - case http.Agent: - self.agentClass = https.Agent - break - default: - // nothing we can do. Just hope for the best. - return - } - - // if there's an agent, we need to get a new one. - if (self.agent) { - self.agent = self.getNewAgent() - } - - } else { - // previously was doing https, now doing http - self.httpModule = http - switch (self.agentClass) { - case ForeverAgent.SSL: - self.agentClass = ForeverAgent - break - case https.Agent: - self.agentClass = http.Agent - break - default: - // nothing we can do. just hope for the best - return - } - - // if there's an agent, then get a new one. - if (self.agent) { - self.agent = null - self.agent = self.getNewAgent() - } - } -} - -Request.prototype.getNewAgent = function () { - var self = this - var Agent = self.agentClass - var options = {} - if (self.agentOptions) { - for (var i in self.agentOptions) { - options[i] = self.agentOptions[i] - } - } - if (self.ca) { - options.ca = self.ca - } - if (self.ciphers) { - options.ciphers = self.ciphers - } - if (self.secureProtocol) { - options.secureProtocol = self.secureProtocol - } - if (self.secureOptions) { - options.secureOptions = self.secureOptions - } - if (typeof self.rejectUnauthorized !== 'undefined') { - options.rejectUnauthorized = self.rejectUnauthorized - } - - if (self.cert && self.key) { - options.key = self.key - options.cert = self.cert - } - - if (self.pfx) { - options.pfx = self.pfx - } - - if (self.passphrase) { - options.passphrase = self.passphrase - } - - var poolKey = '' - - // different types of agents are in different pools - if (Agent !== self.httpModule.Agent) { - poolKey += Agent.name - } - - // ca option is only relevant if proxy or destination are https - var proxy = self.proxy - if (typeof proxy === 'string') { - proxy = url.parse(proxy) - } - var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:' - - if (isHttps) { - if (options.ca) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.ca - } - - if (typeof options.rejectUnauthorized !== 'undefined') { - if (poolKey) { - poolKey += ':' - } - poolKey += options.rejectUnauthorized - } - - if (options.cert) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.cert.toString('ascii') + options.key.toString('ascii') - } - - if (options.pfx) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.pfx.toString('ascii') - } - - if (options.ciphers) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.ciphers - } - - if (options.secureProtocol) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.secureProtocol - } - - if (options.secureOptions) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.secureOptions - } - } - - if (self.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self.httpModule.globalAgent) { - // not doing anything special. Use the globalAgent - return self.httpModule.globalAgent - } - - // we're using a stored agent. Make sure it's protocol-specific - poolKey = self.uri.protocol + poolKey - - // generate a new agent for this setting if none yet exists - if (!self.pool[poolKey]) { - self.pool[poolKey] = new Agent(options) - // properly set maxSockets on new agents - if (self.pool.maxSockets) { - self.pool[poolKey].maxSockets = self.pool.maxSockets - } - } - - return self.pool[poolKey] -} - -Request.prototype.start = function () { - // start() is called once we are ready to send the outgoing HTTP request. - // this is usually called on the first write(), end() or on nextTick() - var self = this - - if (self._aborted) { - return - } - - self._started = true - self.method = self.method || 'GET' - self.href = self.uri.href - - if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) { - self.setHeader('content-length', self.src.stat.size) - } - if (self._aws) { - self.aws(self._aws, true) - } - - // We have a method named auth, which is completely different from the http.request - // auth option. If we don't remove it, we're gonna have a bad time. - var reqOptions = copy(self) - delete reqOptions.auth - - debug('make request', self.uri.href) - - self.req = self.httpModule.request(reqOptions) - - if (self.timing) { - self.startTime = new Date().getTime() - } - - if (self.timeout && !self.timeoutTimer) { - var timeout = self.timeout < 0 ? 0 : self.timeout - // Set a timeout in memory - this block will throw if the server takes more - // than `timeout` to write the HTTP status and headers (corresponding to - // the on('response') event on the client). NB: this measures wall-clock - // time, not the time between bytes sent by the server. - self.timeoutTimer = setTimeout(function () { - var connectTimeout = self.req.socket && self.req.socket.readable === false - self.abort() - var e = new Error('ETIMEDOUT') - e.code = 'ETIMEDOUT' - e.connect = connectTimeout - self.emit('error', e) - }, timeout) - - if (self.req.setTimeout) { // only works on node 0.6+ - // Set an additional timeout on the socket, via the `setsockopt` syscall. - // This timeout sets the amount of time to wait *between* bytes sent - // from the server, and may or may not correspond to the wall-clock time - // elapsed from the start of the request. - // - // In particular, it's useful for erroring if the server fails to send - // data halfway through streaming a response. - self.req.setTimeout(timeout, function () { - if (self.req) { - self.req.abort() - var e = new Error('ESOCKETTIMEDOUT') - e.code = 'ESOCKETTIMEDOUT' - e.connect = false - self.emit('error', e) - } - }) - } - } - - self.req.on('response', self.onRequestResponse.bind(self)) - self.req.on('error', self.onRequestError.bind(self)) - self.req.on('drain', function() { - self.emit('drain') - }) - self.req.on('socket', function(socket) { - self.emit('socket', socket) - }) - - self.on('end', function() { - if ( self.req.connection ) { - self.req.connection.removeListener('error', connectionErrorHandler) - } - }) - self.emit('request', self.req) -} - -Request.prototype.onRequestError = function (error) { - var self = this - if (self._aborted) { - return - } - if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET' - && self.agent.addRequestNoreuse) { - self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) } - self.start() - self.req.end() - return - } - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - self.emit('error', error) -} - -Request.prototype.onRequestResponse = function (response) { - var self = this - debug('onRequestResponse', self.uri.href, response.statusCode, response.headers) - response.on('end', function() { - if (self.timing) { - self.elapsedTime += (new Date().getTime() - self.startTime) - debug('elapsed time', self.elapsedTime) - response.elapsedTime = self.elapsedTime - } - debug('response end', self.uri.href, response.statusCode, response.headers) - }) - - // The check on response.connection is a workaround for browserify. - if (response.connection && response.connection.listeners('error').indexOf(connectionErrorHandler) === -1) { - response.connection.setMaxListeners(0) - response.connection.once('error', connectionErrorHandler) - } - if (self._aborted) { - debug('aborted', self.uri.href) - response.resume() - return - } - - self.response = response - response.request = self - response.toJSON = responseToJSON - - // XXX This is different on 0.10, because SSL is strict by default - if (self.httpModule === https && - self.strictSSL && (!response.hasOwnProperty('socket') || - !response.socket.authorized)) { - debug('strict ssl error', self.uri.href) - var sslErr = response.hasOwnProperty('socket') ? response.socket.authorizationError : self.uri.href + ' does not support SSL' - self.emit('error', new Error('SSL Error: ' + sslErr)) - return - } - - // Save the original host before any redirect (if it changes, we need to - // remove any authorization headers). Also remember the case of the header - // name because lots of broken servers expect Host instead of host and we - // want the caller to be able to specify this. - self.originalHost = self.getHeader('host') - if (!self.originalHostHeaderName) { - self.originalHostHeaderName = self.hasHeader('host') - } - if (self.setHost) { - self.removeHeader('host') - } - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - - var targetCookieJar = (self._jar && self._jar.setCookie) ? self._jar : globalCookieJar - var addCookie = function (cookie) { - //set the cookie if it's domain in the href's domain. - try { - targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true}) - } catch (e) { - self.emit('error', e) - } - } - - response.caseless = caseless(response.headers) - - if (response.caseless.has('set-cookie') && (!self._disableCookies)) { - var headerName = response.caseless.has('set-cookie') - if (Array.isArray(response.headers[headerName])) { - response.headers[headerName].forEach(addCookie) - } else { - addCookie(response.headers[headerName]) - } - } - - if (self._redirect.onResponse(response)) { - return // Ignore the rest of the response - } else { - // Be a good stream and emit end when the response is finished. - // Hack to emit end on close because of a core bug that never fires end - response.on('close', function () { - if (!self._ended) { - self.response.emit('end') - } - }) - - response.on('end', function () { - self._ended = true - }) - - var responseContent - if (self.gzip) { - var contentEncoding = response.headers['content-encoding'] || 'identity' - contentEncoding = contentEncoding.trim().toLowerCase() - - if (contentEncoding === 'gzip') { - responseContent = zlib.createGunzip() - response.pipe(responseContent) - } else { - // Since previous versions didn't check for Content-Encoding header, - // ignore any invalid values to preserve backwards-compatibility - if (contentEncoding !== 'identity') { - debug('ignoring unrecognized Content-Encoding ' + contentEncoding) - } - responseContent = response - } - } else { - responseContent = response - } - - if (self.encoding) { - if (self.dests.length !== 0) { - console.error('Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.') - } else if (responseContent.setEncoding) { - responseContent.setEncoding(self.encoding) - } else { - // Should only occur on node pre-v0.9.4 (joyent/node@9b5abe5) with - // zlib streams. - // If/When support for 0.9.4 is dropped, this should be unnecessary. - responseContent = responseContent.pipe(stringstream(self.encoding)) - } - } - - if (self._paused) { - responseContent.pause() - } - - self.responseContent = responseContent - - self.emit('response', response) - - self.dests.forEach(function (dest) { - self.pipeDest(dest) - }) - - responseContent.on('data', function (chunk) { - self._destdata = true - self.emit('data', chunk) - }) - responseContent.on('end', function (chunk) { - self.emit('end', chunk) - }) - responseContent.on('error', function (error) { - self.emit('error', error) - }) - responseContent.on('close', function () {self.emit('close')}) - - if (self.callback) { - var buffer = bl() - , strings = [] - - self.on('data', function (chunk) { - if (Buffer.isBuffer(chunk)) { - buffer.append(chunk) - } else { - strings.push(chunk) - } - }) - self.on('end', function () { - debug('end event', self.uri.href) - if (self._aborted) { - debug('aborted', self.uri.href) - return - } - - if (buffer.length) { - debug('has body', self.uri.href, buffer.length) - if (self.encoding === null) { - // response.body = buffer - // can't move to this until https://github.com/rvagg/bl/issues/13 - response.body = buffer.slice() - } else { - response.body = buffer.toString(self.encoding) - } - } else if (strings.length) { - // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation. - // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse(). - if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\uFEFF') { - strings[0] = strings[0].substring(1) - } - response.body = strings.join('') - } - - if (self._json) { - try { - response.body = JSON.parse(response.body, self._jsonReviver) - } catch (e) { - debug('invalid JSON received', self.uri.href) - } - } - debug('emitting complete', self.uri.href) - if (typeof response.body === 'undefined' && !self._json) { - response.body = self.encoding === null ? new Buffer(0) : '' - } - self.emit('complete', response, response.body) - }) - } - //if no callback - else { - self.on('end', function () { - if (self._aborted) { - debug('aborted', self.uri.href) - return - } - self.emit('complete', response) - }) - } - } - debug('finish init function', self.uri.href) -} - -Request.prototype.abort = function () { - var self = this - self._aborted = true - - if (self.req) { - self.req.abort() - } - else if (self.response) { - self.response.abort() - } - - self.emit('abort') -} - -Request.prototype.pipeDest = function (dest) { - var self = this - var response = self.response - // Called after the response is received - if (dest.headers && !dest.headersSent) { - if (response.caseless.has('content-type')) { - var ctname = response.caseless.has('content-type') - if (dest.setHeader) { - dest.setHeader(ctname, response.headers[ctname]) - } - else { - dest.headers[ctname] = response.headers[ctname] - } - } - - if (response.caseless.has('content-length')) { - var clname = response.caseless.has('content-length') - if (dest.setHeader) { - dest.setHeader(clname, response.headers[clname]) - } else { - dest.headers[clname] = response.headers[clname] - } - } - } - if (dest.setHeader && !dest.headersSent) { - for (var i in response.headers) { - // If the response content is being decoded, the Content-Encoding header - // of the response doesn't represent the piped content, so don't pass it. - if (!self.gzip || i !== 'content-encoding') { - dest.setHeader(i, response.headers[i]) - } - } - dest.statusCode = response.statusCode - } - if (self.pipefilter) { - self.pipefilter(response, dest) - } -} - -Request.prototype.qs = function (q, clobber) { - var self = this - var base - if (!clobber && self.uri.query) { - base = self._qs.parse(self.uri.query) - } else { - base = {} - } - - for (var i in q) { - base[i] = q[i] - } - - if (self._qs.stringify(base) === '') { - return self - } - - var qs = self._qs.stringify(base) - - self.uri = url.parse(self.uri.href.split('?')[0] + '?' + qs) - self.url = self.uri - self.path = self.uri.path - - return self -} -Request.prototype.form = function (form) { - var self = this - if (form) { - if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) { - self.setHeader('content-type', 'application/x-www-form-urlencoded') - } - self.body = (typeof form === 'string') - ? self._qs.rfc3986(form.toString('utf8')) - : self._qs.stringify(form).toString('utf8') - return self - } - // create form-data object - self._form = new FormData() - self._form.on('error', function(err) { - err.message = 'form-data: ' + err.message - self.emit('error', err) - self.abort() - }) - return self._form -} -Request.prototype.multipart = function (multipart) { - var self = this - - self._multipart.onRequest(multipart) - - if (!self._multipart.chunked) { - self.body = self._multipart.body - } - - return self -} -Request.prototype.json = function (val) { - var self = this - - if (!self.hasHeader('accept')) { - self.setHeader('accept', 'application/json') - } - - self._json = true - if (typeof val === 'boolean') { - if (self.body !== undefined) { - if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) { - self.body = safeStringify(self.body) - } else { - self.body = self._qs.rfc3986(self.body) - } - if (!self.hasHeader('content-type')) { - self.setHeader('content-type', 'application/json') - } - } - } else { - self.body = safeStringify(val) - if (!self.hasHeader('content-type')) { - self.setHeader('content-type', 'application/json') - } - } - - if (typeof self.jsonReviver === 'function') { - self._jsonReviver = self.jsonReviver - } - - return self -} -Request.prototype.getHeader = function (name, headers) { - var self = this - var result, re, match - if (!headers) { - headers = self.headers - } - Object.keys(headers).forEach(function (key) { - if (key.length !== name.length) { - return - } - re = new RegExp(name, 'i') - match = key.match(re) - if (match) { - result = headers[key] - } - }) - return result -} - -Request.prototype.auth = function (user, pass, sendImmediately, bearer) { - var self = this - - self._auth.onRequest(user, pass, sendImmediately, bearer) - - return self -} -Request.prototype.aws = function (opts, now) { - var self = this - - if (!now) { - self._aws = opts - return self - } - var date = new Date() - self.setHeader('date', date.toUTCString()) - var auth = - { key: opts.key - , secret: opts.secret - , verb: self.method.toUpperCase() - , date: date - , contentType: self.getHeader('content-type') || '' - , md5: self.getHeader('content-md5') || '' - , amazonHeaders: aws.canonicalizeHeaders(self.headers) - } - var path = self.uri.path - if (opts.bucket && path) { - auth.resource = '/' + opts.bucket + path - } else if (opts.bucket && !path) { - auth.resource = '/' + opts.bucket - } else if (!opts.bucket && path) { - auth.resource = path - } else if (!opts.bucket && !path) { - auth.resource = '/' - } - auth.resource = aws.canonicalizeResource(auth.resource) - self.setHeader('authorization', aws.authorization(auth)) - - return self -} -Request.prototype.httpSignature = function (opts) { - var self = this - httpSignature.signRequest({ - getHeader: function(header) { - return self.getHeader(header, self.headers) - }, - setHeader: function(header, value) { - self.setHeader(header, value) - }, - method: self.method, - path: self.path - }, opts) - debug('httpSignature authorization', self.getHeader('authorization')) - - return self -} -Request.prototype.hawk = function (opts) { - var self = this - self.setHeader('Authorization', hawk.client.header(self.uri, self.method, opts).field) -} -Request.prototype.oauth = function (_oauth) { - var self = this - - self._oauth.onRequest(_oauth) - - return self -} - -Request.prototype.jar = function (jar) { - var self = this - var cookies - - if (self._redirect.redirectsFollowed === 0) { - self.originalCookieHeader = self.getHeader('cookie') - } - - if (!jar) { - // disable cookies - cookies = false - self._disableCookies = true - } else { - var targetCookieJar = (jar && jar.getCookieString) ? jar : globalCookieJar - var urihref = self.uri.href - //fetch cookie in the Specified host - if (targetCookieJar) { - cookies = targetCookieJar.getCookieString(urihref) - } - } - - //if need cookie and cookie is not empty - if (cookies && cookies.length) { - if (self.originalCookieHeader) { - // Don't overwrite existing Cookie header - self.setHeader('cookie', self.originalCookieHeader + '; ' + cookies) - } else { - self.setHeader('cookie', cookies) - } - } - self._jar = jar - return self -} - - -// Stream API -Request.prototype.pipe = function (dest, opts) { - var self = this - - if (self.response) { - if (self._destdata) { - self.emit('error', new Error('You cannot pipe after data has been emitted from the response.')) - } else if (self._ended) { - self.emit('error', new Error('You cannot pipe after the response has been ended.')) - } else { - stream.Stream.prototype.pipe.call(self, dest, opts) - self.pipeDest(dest) - return dest - } - } else { - self.dests.push(dest) - stream.Stream.prototype.pipe.call(self, dest, opts) - return dest - } -} -Request.prototype.write = function () { - var self = this - if (!self._started) { - self.start() - } - return self.req.write.apply(self.req, arguments) -} -Request.prototype.end = function (chunk) { - var self = this - if (chunk) { - self.write(chunk) - } - if (!self._started) { - self.start() - } - self.req.end() -} -Request.prototype.pause = function () { - var self = this - if (!self.responseContent) { - self._paused = true - } else { - self.responseContent.pause.apply(self.responseContent, arguments) - } -} -Request.prototype.resume = function () { - var self = this - if (!self.responseContent) { - self._paused = false - } else { - self.responseContent.resume.apply(self.responseContent, arguments) - } -} -Request.prototype.destroy = function () { - var self = this - if (!self._ended) { - self.end() - } else if (self.response) { - self.response.destroy() - } -} - -Request.defaultProxyHeaderWhiteList = - Tunnel.defaultProxyHeaderWhiteList.slice() - -Request.defaultProxyHeaderExclusiveList = - Tunnel.defaultProxyHeaderExclusiveList.slice() - -// Exports - -Request.prototype.toJSON = requestToJSON -module.exports = Request diff --git a/Excersizes/Loading Dynamic Content (Class 8)/package.json b/Excersizes/Loading Dynamic Content (Class 8)/package.json deleted file mode 100644 index 92d2fd1..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "Adv_JS_Static_Site", - "version": "1.0.0", - "description": "Express excersizes", - "main": "app.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "JoeC718", - "license": "ISC", - "dependencies": { - "express-handlebars": "^2.0.1", - "express3-handlebars": "^0.5.2", - "http": "0.0.0", - "request": "^2.61.0" - } -} diff --git a/Excersizes/Loading Dynamic Content (Class 8)/public/.DS_Store b/Excersizes/Loading Dynamic Content (Class 8)/public/.DS_Store deleted file mode 100644 index e51e16d65bc2c6d9ba1b5f3fdc7219c03592acef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMOK;Oa5T0oZB$S8yf>J;-^a5%Rr7bEKL>k^8)Ih4zLLu16HeGPNk?l5=Dv%@M zzz^Wa`@j$2jNnJWg*)QF32|iByJ<>8CBy+yb;sKM#y7NJC}$%lnh(=Xa6LZb1?Fl!<3zJHeOw4{S$EtC&dNEf z^Q7=2hx;s85juU9`vp->i+R5gPG?nrS9u|t%~@TUfGtpH#_`z%54p=d9xW!4^2k}c zmzIVGkM-L_gOz@JX=G%e-yR+ssZ^{-iNxN+M@KJBl`4;(K70P+<*V24-YWu7KSZEo z6(Jw$Z1DVo{+fYb+>&DBvt_N|W83x}JFT|%j?S)KySw-F?A^D&r^n7&9j=qVQw-#l zoD`l2(%w9qr?1oXiuT!1XhLKz;z6LPp|#`f8AY|`N4((!@!?2fGwx8r_$tK+ZL@3mASS} .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -@font-face { - font-family: 'Glyphicons Halflings'; - - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\2a"; -} -.glyphicon-plus:before { - content: "\2b"; -} -.glyphicon-euro:before, -.glyphicon-eur:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -.glyphicon-cd:before { - content: "\e201"; -} -.glyphicon-save-file:before { - content: "\e202"; -} -.glyphicon-open-file:before { - content: "\e203"; -} -.glyphicon-level-up:before { - content: "\e204"; -} -.glyphicon-copy:before { - content: "\e205"; -} -.glyphicon-paste:before { - content: "\e206"; -} -.glyphicon-alert:before { - content: "\e209"; -} -.glyphicon-equalizer:before { - content: "\e210"; -} -.glyphicon-king:before { - content: "\e211"; -} -.glyphicon-queen:before { - content: "\e212"; -} -.glyphicon-pawn:before { - content: "\e213"; -} -.glyphicon-bishop:before { - content: "\e214"; -} -.glyphicon-knight:before { - content: "\e215"; -} -.glyphicon-baby-formula:before { - content: "\e216"; -} -.glyphicon-tent:before { - content: "\26fa"; -} -.glyphicon-blackboard:before { - content: "\e218"; -} -.glyphicon-bed:before { - content: "\e219"; -} -.glyphicon-apple:before { - content: "\f8ff"; -} -.glyphicon-erase:before { - content: "\e221"; -} -.glyphicon-hourglass:before { - content: "\231b"; -} -.glyphicon-lamp:before { - content: "\e223"; -} -.glyphicon-duplicate:before { - content: "\e224"; -} -.glyphicon-piggy-bank:before { - content: "\e225"; -} -.glyphicon-scissors:before { - content: "\e226"; -} -.glyphicon-bitcoin:before { - content: "\e227"; -} -.glyphicon-btc:before { - content: "\e227"; -} -.glyphicon-xbt:before { - content: "\e227"; -} -.glyphicon-yen:before { - content: "\00a5"; -} -.glyphicon-jpy:before { - content: "\00a5"; -} -.glyphicon-ruble:before { - content: "\20bd"; -} -.glyphicon-rub:before { - content: "\20bd"; -} -.glyphicon-scale:before { - content: "\e230"; -} -.glyphicon-ice-lolly:before { - content: "\e231"; -} -.glyphicon-ice-lolly-tasted:before { - content: "\e232"; -} -.glyphicon-education:before { - content: "\e233"; -} -.glyphicon-option-horizontal:before { - content: "\e234"; -} -.glyphicon-option-vertical:before { - content: "\e235"; -} -.glyphicon-menu-hamburger:before { - content: "\e236"; -} -.glyphicon-modal-window:before { - content: "\e237"; -} -.glyphicon-oil:before { - content: "\e238"; -} -.glyphicon-grain:before { - content: "\e239"; -} -.glyphicon-sunglasses:before { - content: "\e240"; -} -.glyphicon-text-size:before { - content: "\e241"; -} -.glyphicon-text-color:before { - content: "\e242"; -} -.glyphicon-text-background:before { - content: "\e243"; -} -.glyphicon-object-align-top:before { - content: "\e244"; -} -.glyphicon-object-align-bottom:before { - content: "\e245"; -} -.glyphicon-object-align-horizontal:before { - content: "\e246"; -} -.glyphicon-object-align-left:before { - content: "\e247"; -} -.glyphicon-object-align-vertical:before { - content: "\e248"; -} -.glyphicon-object-align-right:before { - content: "\e249"; -} -.glyphicon-triangle-right:before { - content: "\e250"; -} -.glyphicon-triangle-left:before { - content: "\e251"; -} -.glyphicon-triangle-bottom:before { - content: "\e252"; -} -.glyphicon-triangle-top:before { - content: "\e253"; -} -.glyphicon-console:before { - content: "\e254"; -} -.glyphicon-superscript:before { - content: "\e255"; -} -.glyphicon-subscript:before { - content: "\e256"; -} -.glyphicon-menu-left:before { - content: "\e257"; -} -.glyphicon-menu-right:before { - content: "\e258"; -} -.glyphicon-menu-down:before { - content: "\e259"; -} -.glyphicon-menu-up:before { - content: "\e260"; -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 10px; - - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333; - background-color: #fff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #337ab7; - text-decoration: none; -} -a:hover, -a:focus { - color: #23527c; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive, -.thumbnail > img, -.thumbnail a > img, -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - display: inline-block; - max-width: 100%; - height: auto; - padding: 4px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -[role="button"] { - cursor: pointer; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #777; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 36px; -} -h2, -.h2 { - font-size: 30px; -} -h3, -.h3 { - font-size: 24px; -} -h4, -.h4 { - font-size: 18px; -} -h5, -.h5 { - font-size: 14px; -} -h6, -.h6 { - font-size: 12px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 300; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -small, -.small { - font-size: 85%; -} -mark, -.mark { - padding: .2em; - background-color: #fcf8e3; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-nowrap { - white-space: nowrap; -} -.text-lowercase { - text-transform: lowercase; -} -.text-uppercase { - text-transform: uppercase; -} -.text-capitalize { - text-transform: capitalize; -} -.text-muted { - color: #777; -} -.text-primary { - color: #337ab7; -} -a.text-primary:hover, -a.text-primary:focus { - color: #286090; -} -.text-success { - color: #3c763d; -} -a.text-success:hover, -a.text-success:focus { - color: #2b542c; -} -.text-info { - color: #31708f; -} -a.text-info:hover, -a.text-info:focus { - color: #245269; -} -.text-warning { - color: #8a6d3b; -} -a.text-warning:hover, -a.text-warning:focus { - color: #66512c; -} -.text-danger { - color: #a94442; -} -a.text-danger:hover, -a.text-danger:focus { - color: #843534; -} -.bg-primary { - color: #fff; - background-color: #337ab7; -} -a.bg-primary:hover, -a.bg-primary:focus { - background-color: #286090; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover, -a.bg-success:focus { - background-color: #c1e2b3; -} -.bg-info { - background-color: #d9edf7; -} -a.bg-info:hover, -a.bg-info:focus { - background-color: #afd9ee; -} -.bg-warning { - background-color: #fcf8e3; -} -a.bg-warning:hover, -a.bg-warning:focus { - background-color: #f7ecb5; -} -.bg-danger { - background-color: #f2dede; -} -a.bg-danger:hover, -a.bg-danger:focus { - background-color: #e4b9b9; -} -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - margin-left: -5px; - list-style: none; -} -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.42857143; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #777; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #777; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 4px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); -} -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: bold; - -webkit-box-shadow: none; - box-shadow: none; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - margin-right: -15px; - margin-left: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666667%; -} -.col-xs-10 { - width: 83.33333333%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666667%; -} -.col-xs-7 { - width: 58.33333333%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666667%; -} -.col-xs-4 { - width: 33.33333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.66666667%; -} -.col-xs-1 { - width: 8.33333333%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666667%; -} -.col-xs-pull-10 { - right: 83.33333333%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666667%; -} -.col-xs-pull-7 { - right: 58.33333333%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666667%; -} -.col-xs-pull-4 { - right: 33.33333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.66666667%; -} -.col-xs-pull-1 { - right: 8.33333333%; -} -.col-xs-pull-0 { - right: auto; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666667%; -} -.col-xs-push-10 { - left: 83.33333333%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666667%; -} -.col-xs-push-7 { - left: 58.33333333%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666667%; -} -.col-xs-push-4 { - left: 33.33333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.66666667%; -} -.col-xs-push-1 { - left: 8.33333333%; -} -.col-xs-push-0 { - left: auto; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666667%; -} -.col-xs-offset-10 { - margin-left: 83.33333333%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666667%; -} -.col-xs-offset-7 { - margin-left: 58.33333333%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.66666667%; -} -.col-xs-offset-1 { - margin-left: 8.33333333%; -} -.col-xs-offset-0 { - margin-left: 0; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: auto; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: auto; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: auto; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} -table { - background-color: transparent; -} -caption { - padding-top: 8px; - padding-bottom: 8px; - color: #777; - text-align: left; -} -th { - text-align: left; -} -.table { - width: 100%; - max-width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #fff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-of-type(odd) { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - display: table-cell; - float: none; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr:hover > .active, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr:hover > .success, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr:hover > .info, -.table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr:hover > .warning, -.table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr:hover > .danger, -.table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} -.table-responsive { - min-height: .01%; - overflow-x: auto; -} -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-y: hidden; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555; -} -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; - -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); -} -.form-control::-moz-placeholder { - color: #999; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #999; -} -.form-control::-webkit-input-placeholder { - color: #999; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - background-color: #eee; - opacity: 1; -} -.form-control[disabled], -fieldset[disabled] .form-control { - cursor: not-allowed; -} -textarea.form-control { - height: auto; -} -input[type="search"] { - -webkit-appearance: none; -} -@media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"].form-control, - input[type="time"].form-control, - input[type="datetime-local"].form-control, - input[type="month"].form-control { - line-height: 34px; - } - input[type="date"].input-sm, - input[type="time"].input-sm, - input[type="datetime-local"].input-sm, - input[type="month"].input-sm, - .input-group-sm input[type="date"], - .input-group-sm input[type="time"], - .input-group-sm input[type="datetime-local"], - .input-group-sm input[type="month"] { - line-height: 30px; - } - input[type="date"].input-lg, - input[type="time"].input-lg, - input[type="datetime-local"].input-lg, - input[type="month"].input-lg, - .input-group-lg input[type="date"], - .input-group-lg input[type="time"], - .input-group-lg input[type="datetime-local"], - .input-group-lg input[type="month"] { - line-height: 46px; - } -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - position: relative; - display: block; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - min-height: 20px; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-top: 4px \9; - margin-left: -20px; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - position: relative; - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"].disabled, -input[type="checkbox"].disabled, -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"] { - cursor: not-allowed; -} -.radio-inline.disabled, -.checkbox-inline.disabled, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.radio.disabled label, -.checkbox.disabled label, -fieldset[disabled] .radio label, -fieldset[disabled] .checkbox label { - cursor: not-allowed; -} -.form-control-static { - min-height: 34px; - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; -} -.form-control-static.input-lg, -.form-control-static.input-sm { - padding-right: 0; - padding-left: 0; -} -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.form-group-sm .form-control { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.form-group-sm select.form-control { - height: 30px; - line-height: 30px; -} -.form-group-sm textarea.form-control, -.form-group-sm select[multiple].form-control { - height: auto; -} -.form-group-sm .form-control-static { - height: 30px; - min-height: 32px; - padding: 6px 10px; - font-size: 12px; - line-height: 1.5; -} -.input-lg { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.input-lg { - height: 46px; - line-height: 46px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.form-group-lg .form-control { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -.form-group-lg select.form-control { - height: 46px; - line-height: 46px; -} -.form-group-lg textarea.form-control, -.form-group-lg select[multiple].form-control { - height: auto; -} -.form-group-lg .form-control-static { - height: 46px; - min-height: 38px; - padding: 11px 16px; - font-size: 18px; - line-height: 1.3333333; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} -.form-control-feedback { - position: absolute; - top: 0; - right: 0; - z-index: 2; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; - pointer-events: none; -} -.input-lg + .form-control-feedback, -.input-group-lg + .form-control-feedback, -.form-group-lg .form-control + .form-control-feedback { - width: 46px; - height: 46px; - line-height: 46px; -} -.input-sm + .form-control-feedback, -.input-group-sm + .form-control-feedback, -.form-group-sm .form-control + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline, -.has-success.radio label, -.has-success.checkbox label, -.has-success.radio-inline label, -.has-success.checkbox-inline label { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} -.has-success .form-control-feedback { - color: #3c763d; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline, -.has-warning.radio label, -.has-warning.checkbox label, -.has-warning.radio-inline label, -.has-warning.checkbox-inline label { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline, -.has-error.radio label, -.has-error.checkbox label, -.has-error.radio-inline label, -.has-error.checkbox-inline label { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} -.has-error .form-control-feedback { - color: #a94442; -} -.has-feedback label ~ .form-control-feedback { - top: 25px; -} -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-static { - display: inline-block; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - padding-top: 7px; - margin-bottom: 0; - text-align: right; - } -} -.form-horizontal .has-feedback .form-control-feedback { - right: 15px; -} -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 14.333333px; - font-size: 18px; - } -} -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - font-size: 12px; - } -} -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - white-space: nowrap; - vertical-align: middle; - -ms-touch-action: manipulation; - touch-action: manipulation; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.btn:focus, -.btn:active:focus, -.btn.active:focus, -.btn.focus, -.btn:active.focus, -.btn.active.focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus, -.btn.focus { - color: #333; - text-decoration: none; -} -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; -} -a.btn.disabled, -fieldset[disabled] a.btn { - pointer-events: none; -} -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:focus, -.btn-default.focus { - color: #333; - background-color: #e6e6e6; - border-color: #8c8c8c; -} -.btn-default:hover { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active:hover, -.btn-default.active:hover, -.open > .dropdown-toggle.btn-default:hover, -.btn-default:active:focus, -.btn-default.active:focus, -.open > .dropdown-toggle.btn-default:focus, -.btn-default:active.focus, -.btn-default.active.focus, -.open > .dropdown-toggle.btn-default.focus { - color: #333; - background-color: #d4d4d4; - border-color: #8c8c8c; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled.focus, -.btn-default[disabled].focus, -fieldset[disabled] .btn-default.focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} -.btn-primary { - color: #fff; - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary:focus, -.btn-primary.focus { - color: #fff; - background-color: #286090; - border-color: #122b40; -} -.btn-primary:hover { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active:hover, -.btn-primary.active:hover, -.open > .dropdown-toggle.btn-primary:hover, -.btn-primary:active:focus, -.btn-primary.active:focus, -.open > .dropdown-toggle.btn-primary:focus, -.btn-primary:active.focus, -.btn-primary.active.focus, -.open > .dropdown-toggle.btn-primary.focus { - color: #fff; - background-color: #204d74; - border-color: #122b40; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled.focus, -.btn-primary[disabled].focus, -fieldset[disabled] .btn-primary.focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary .badge { - color: #337ab7; - background-color: #fff; -} -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:focus, -.btn-success.focus { - color: #fff; - background-color: #449d44; - border-color: #255625; -} -.btn-success:hover { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active:hover, -.btn-success.active:hover, -.open > .dropdown-toggle.btn-success:hover, -.btn-success:active:focus, -.btn-success.active:focus, -.open > .dropdown-toggle.btn-success:focus, -.btn-success:active.focus, -.btn-success.active.focus, -.open > .dropdown-toggle.btn-success.focus { - color: #fff; - background-color: #398439; - border-color: #255625; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled.focus, -.btn-success[disabled].focus, -fieldset[disabled] .btn-success.focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:focus, -.btn-info.focus { - color: #fff; - background-color: #31b0d5; - border-color: #1b6d85; -} -.btn-info:hover { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active:hover, -.btn-info.active:hover, -.open > .dropdown-toggle.btn-info:hover, -.btn-info:active:focus, -.btn-info.active:focus, -.open > .dropdown-toggle.btn-info:focus, -.btn-info:active.focus, -.btn-info.active.focus, -.open > .dropdown-toggle.btn-info.focus { - color: #fff; - background-color: #269abc; - border-color: #1b6d85; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled.focus, -.btn-info[disabled].focus, -fieldset[disabled] .btn-info.focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:focus, -.btn-warning.focus { - color: #fff; - background-color: #ec971f; - border-color: #985f0d; -} -.btn-warning:hover { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active:hover, -.btn-warning.active:hover, -.open > .dropdown-toggle.btn-warning:hover, -.btn-warning:active:focus, -.btn-warning.active:focus, -.open > .dropdown-toggle.btn-warning:focus, -.btn-warning:active.focus, -.btn-warning.active.focus, -.open > .dropdown-toggle.btn-warning.focus { - color: #fff; - background-color: #d58512; - border-color: #985f0d; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled.focus, -.btn-warning[disabled].focus, -fieldset[disabled] .btn-warning.focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:focus, -.btn-danger.focus { - color: #fff; - background-color: #c9302c; - border-color: #761c19; -} -.btn-danger:hover { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active:hover, -.btn-danger.active:hover, -.open > .dropdown-toggle.btn-danger:hover, -.btn-danger:active:focus, -.btn-danger.active:focus, -.open > .dropdown-toggle.btn-danger:focus, -.btn-danger:active.focus, -.btn-danger.active.focus, -.open > .dropdown-toggle.btn-danger.focus { - color: #fff; - background-color: #ac2925; - border-color: #761c19; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled.focus, -.btn-danger[disabled].focus, -fieldset[disabled] .btn-danger.focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-link { - font-weight: normal; - color: #337ab7; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link.active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #23527c; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #777; - text-decoration: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs, -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - -o-transition: opacity .15s linear; - transition: opacity .15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -tr.collapse.in { - display: table-row; -} -tbody.collapse.in { - display: table-row-group; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height, visibility; - -o-transition-property: height, visibility; - transition-property: height, visibility; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px dashed; - border-top: 4px solid \9; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - text-align: left; - list-style: none; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #337ab7; - outline: 0; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #777; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #777; - white-space: nowrap; -} -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px dashed; - border-bottom: 4px solid \9; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 2px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn, -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: 4px; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -.btn-group-justified > .btn-group .dropdown-menu { - left: auto; -} -[data-toggle="buttons"] > .btn input[type="radio"], -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], -[data-toggle="buttons"] > .btn input[type="checkbox"], -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555; - text-align: center; - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - z-index: 2; - margin-left: -1px; -} -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li.disabled > a { - color: #777; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #777; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eee; - border-color: #337ab7; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #337ab7; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-device-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - height: 50px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -.navbar-brand > img { - display: block; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } -} -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .form-control-static { - display: inline-block; - } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; - } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } - .navbar-form .form-group:last-child { - margin-bottom: 0; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - margin-bottom: 0; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - margin-right: -15px; - } - .navbar-right ~ .navbar-right { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555; - background-color: #e7e7e7; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-default .btn-link { - color: #777; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #333; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; -} -.navbar-inverse { - background-color: #222; - border-color: #080808; -} -.navbar-inverse .navbar-brand { - color: #9d9d9d; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #fff; - background-color: #080808; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #9d9d9d; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #9d9d9d; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.navbar-inverse .btn-link { - color: #9d9d9d; -} -.navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link:focus { - color: #fff; -} -.navbar-inverse .btn-link[disabled]:hover, -fieldset[disabled] .navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link[disabled]:focus, -fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; -} -.breadcrumb > .active { - color: #777; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.42857143; - color: #337ab7; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - z-index: 3; - color: #23527c; - background-color: #eee; - border-color: #ddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #fff; - cursor: default; - background-color: #337ab7; - border-color: #337ab7; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #777; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #777; - cursor: not-allowed; - background-color: #fff; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -a.label:hover, -a.label:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #777; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #5e5e5e; -} -.label-primary { - background-color: #337ab7; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #286090; -} -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: middle; - background-color: #777; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge, -.btn-group-xs > .btn .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #337ab7; - background-color: #fff; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding-top: 30px; - padding-bottom: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron, -.container-fluid .jumbotron { - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron, - .container-fluid .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: border .2s ease-in-out; - -o-transition: border .2s ease-in-out; - transition: border .2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - margin-right: auto; - margin-left: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #337ab7; -} -.thumbnail .caption { - padding: 9px; - color: #333; -} -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; -} -.alert-dismissable .close, -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); -} -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #337ab7; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - -webkit-transition: width .6s ease; - -o-transition: width .6s ease; - transition: width .6s ease; -} -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media, -.media-body { - overflow: hidden; - zoom: 1; -} -.media-body { - width: 10000px; -} -.media-object { - display: block; -} -.media-object.img-thumbnail { - max-width: none; -} -.media-right, -.media > .pull-right { - padding-left: 10px; -} -.media-left, -.media > .pull-left { - padding-right: 10px; -} -.media-left, -.media-right, -.media-body { - display: table-cell; - vertical-align: top; -} -.media-middle { - vertical-align: middle; -} -.media-bottom { - vertical-align: bottom; -} -.media-heading { - margin-top: 0; - margin-bottom: 5px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - padding-left: 0; - margin-bottom: 20px; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -a.list-group-item, -button.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading, -button.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, -button.list-group-item:hover, -a.list-group-item:focus, -button.list-group-item:focus { - color: #555; - text-decoration: none; - background-color: #f5f5f5; -} -button.list-group-item { - width: 100%; - text-align: left; -} -.list-group-item.disabled, -.list-group-item.disabled:hover, -.list-group-item.disabled:focus { - color: #777; - cursor: not-allowed; - background-color: #eee; -} -.list-group-item.disabled .list-group-item-heading, -.list-group-item.disabled:hover .list-group-item-heading, -.list-group-item.disabled:focus .list-group-item-heading { - color: inherit; -} -.list-group-item.disabled .list-group-item-text, -.list-group-item.disabled:hover .list-group-item-text, -.list-group-item.disabled:focus .list-group-item-text { - color: #777; -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, -.list-group-item.active:hover .list-group-item-heading > .small, -.list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; -} -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #c7ddef; -} -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} -a.list-group-item-success, -button.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading, -button.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -button.list-group-item-success:hover, -a.list-group-item-success:focus, -button.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -button.list-group-item-success.active, -a.list-group-item-success.active:hover, -button.list-group-item-success.active:hover, -a.list-group-item-success.active:focus, -button.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} -a.list-group-item-info, -button.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading, -button.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -button.list-group-item-info:hover, -a.list-group-item-info:focus, -button.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, -button.list-group-item-info.active, -a.list-group-item-info.active:hover, -button.list-group-item-info.active:hover, -a.list-group-item-info.active:focus, -button.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} -a.list-group-item-warning, -button.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading, -button.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -button.list-group-item-warning:hover, -a.list-group-item-warning:focus, -button.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, -button.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -button.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus, -button.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} -a.list-group-item-danger, -button.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading, -button.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -button.list-group-item-danger:hover, -a.list-group-item-danger:focus, -button.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, -button.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -button.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus, -button.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); -} -.panel-body { - padding: 15px; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a, -.panel-title > small, -.panel-title > .small, -.panel-title > small > a, -.panel-title > .small > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .list-group, -.panel > .panel-collapse > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item, -.panel > .panel-collapse > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child, -.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child, -.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.list-group + .panel-footer { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; -} -.panel > .table caption, -.panel > .table-responsive > .table caption, -.panel > .panel-collapse > .table caption { - padding-right: 15px; - padding-left: 15px; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive, -.panel > .table + .panel-body, -.panel > .table-responsive + .panel-body { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse > .panel-body, -.panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #333; -} -.panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; -} -.panel-primary { - border-color: #337ab7; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #337ab7; -} -.panel-primary > .panel-heading .badge { - color: #337ab7; - background-color: #fff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #337ab7; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-heading .badge { - color: #dff0d8; - background-color: #3c763d; -} -.panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-heading .badge { - color: #d9edf7; - background-color: #31708f; -} -.panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bce8f1; -} -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-heading .badge { - color: #fcf8e3; - background-color: #8a6d3b; -} -.panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #faebcc; -} -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-heading .badge { - color: #f2dede; - background-color: #a94442; -} -.panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ebccd1; -} -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} -.embed-responsive-16by9 { - padding-bottom: 56.25%; -} -.embed-responsive-4by3 { - padding-bottom: 75%; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, .15); -} -.well-lg { - padding: 24px; - border-radius: 6px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; -} -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} -.modal-open { - overflow: hidden; -} -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: hidden; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -o-transition: -o-transform .3s ease-out; - transition: transform .3s ease-out; - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - -o-transform: translate(0, -25%); - transform: translate(0, -25%); -} -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: 0; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; -} -.modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; -} -.modal-header { - min-height: 16.42857143px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.42857143; -} -.modal-body { - position: relative; - padding: 15px; -} -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - } - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 12px; - font-style: normal; - font-weight: normal; - line-height: 1.42857143; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - white-space: normal; - filter: alpha(opacity=0); - opacity: 0; - - line-break: auto; -} -.tooltip.in { - filter: alpha(opacity=90); - opacity: .9; -} -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - right: 5px; - bottom: 0; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - bottom: 0; - left: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - right: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - left: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - font-style: normal; - font-weight: normal; - line-height: 1.42857143; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - white-space: normal; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - - line-break: auto; -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover > .arrow, -.popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover > .arrow { - border-width: 11px; -} -.popover > .arrow:after { - content: ""; - border-width: 10px; -} -.popover.top > .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} -.popover.top > .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} -.popover.right > .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; -} -.popover.bottom > .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); -} -.popover.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, .25); -} -.popover.left > .arrow:after { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - -o-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - line-height: 1; -} -@media all and (transform-3d), (-webkit-transform-3d) { - .carousel-inner > .item { - -webkit-transition: -webkit-transform .6s ease-in-out; - -o-transition: -o-transform .6s ease-in-out; - transition: transform .6s ease-in-out; - - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000px; - perspective: 1000px; - } - .carousel-inner > .item.next, - .carousel-inner > .item.active.right { - left: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - .carousel-inner > .item.prev, - .carousel-inner > .item.active.left { - left: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - .carousel-inner > .item.next.left, - .carousel-inner > .item.prev.right, - .carousel-inner > .item.active { - left: 0; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - filter: alpha(opacity=50); - opacity: .5; -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: 0; - opacity: .9; -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; - margin-top: -10px; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - font-family: serif; - line-height: 1; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; -} -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - font-size: 30px; - } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -15px; - } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -15px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.dl-horizontal dd:before, -.dl-horizontal dd:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} -.clearfix:after, -.dl-horizontal dd:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; -} -.affix { - position: fixed; -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - display: none !important; -} -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table !important; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table !important; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table !important; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; - } -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table !important; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; - } -} -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table !important; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -.visible-print-block { - display: none !important; -} -@media print { - .visible-print-block { - display: block !important; - } -} -.visible-print-inline { - display: none !important; -} -@media print { - .visible-print-inline { - display: inline !important; - } -} -.visible-print-inline-block { - display: none !important; -} -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} -@media print { - .hidden-print { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/Excersizes/Loading Dynamic Content (Class 8)/public/img/js.jpg b/Excersizes/Loading Dynamic Content (Class 8)/public/img/js.jpg deleted file mode 100644 index c88e053b06d46c59e8e774bf6c93dab85747cb33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 661462 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%0DZt1mgz#S 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� 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

i!4)MEH!LC@>?_dC2w55 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

K@G-MqXNz)YgwIxByg6}0N(cJO5 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 diff --git a/Excersizes/Loading Dynamic Content (Class 8)/public/js/bootstrap.js b/Excersizes/Loading Dynamic Content (Class 8)/public/js/bootstrap.js deleted file mode 100644 index 5debfd7..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/public/js/bootstrap.js +++ /dev/null @@ -1,2363 +0,0 @@ -/*! - * Bootstrap v3.3.5 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under the MIT license - */ - -if (typeof jQuery === 'undefined') { - throw new Error('Bootstrap\'s JavaScript requires jQuery') -} - -+function ($) { - 'use strict'; - var version = $.fn.jquery.split(' ')[0].split('.') - if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { - throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') - } -}(jQuery); - -/* ======================================================================== - * Bootstrap: transition.js v3.3.5 - * http://getbootstrap.com/javascript/#transitions - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - WebkitTransition : 'webkitTransitionEnd', - MozTransition : 'transitionend', - OTransition : 'oTransitionEnd otransitionend', - transition : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false - var $el = this - $(this).one('bsTransitionEnd', function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - - if (!$.support.transition) return - - $.event.special.bsTransitionEnd = { - bindType: $.support.transition.end, - delegateType: $.support.transition.end, - handle: function (e) { - if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) - } - } - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.3.5 - * http://getbootstrap.com/javascript/#alerts - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.VERSION = '3.3.5' - - Alert.TRANSITION_DURATION = 150 - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.closest('.alert') - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - // detach from parent, fire event then clean up data - $parent.detach().trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one('bsTransitionEnd', removeElement) - .emulateTransitionEnd(Alert.TRANSITION_DURATION) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.alert - - $.fn.alert = Plugin - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.3.5 - * http://getbootstrap.com/javascript/#buttons - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } - - Button.VERSION = '3.3.5' - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state += 'Text' - - if (data.resetText == null) $el.data('resetText', $el[val]()) - - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - $el[val](data[state] == null ? this.options[state] : data[state]) - - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d) - } - }, this), 0) - } - - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked')) changed = false - $parent.find('.active').removeClass('active') - this.$element.addClass('active') - } else if ($input.prop('type') == 'checkbox') { - if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false - this.$element.toggleClass('active') - } - $input.prop('checked', this.$element.hasClass('active')) - if (changed) $input.trigger('change') - } else { - this.$element.attr('aria-pressed', !this.$element.hasClass('active')) - this.$element.toggleClass('active') - } - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - var old = $.fn.button - - $.fn.button = Plugin - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document) - .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - Plugin.call($btn, 'toggle') - if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() - }) - .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { - $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.3.5 - * http://getbootstrap.com/javascript/#carousel - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = null - this.sliding = null - this.interval = null - this.$active = null - this.$items = null - - this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) - - this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element - .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) - .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) - } - - Carousel.VERSION = '3.3.5' - - Carousel.TRANSITION_DURATION = 600 - - Carousel.DEFAULTS = { - interval: 5000, - pause: 'hover', - wrap: true, - keyboard: true - } - - Carousel.prototype.keydown = function (e) { - if (/input|textarea/i.test(e.target.tagName)) return - switch (e.which) { - case 37: this.prev(); break - case 39: this.next(); break - default: return - } - - e.preventDefault() - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getItemIndex = function (item) { - this.$items = item.parent().children('.item') - return this.$items.index(item || this.$active) - } - - Carousel.prototype.getItemForDirection = function (direction, active) { - var activeIndex = this.getItemIndex(active) - var willWrap = (direction == 'prev' && activeIndex === 0) - || (direction == 'next' && activeIndex == (this.$items.length - 1)) - if (willWrap && !this.options.wrap) return active - var delta = direction == 'prev' ? -1 : 1 - var itemIndex = (activeIndex + delta) % this.$items.length - return this.$items.eq(itemIndex) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || this.getItemForDirection(type, $active) - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var that = this - - if ($next.hasClass('active')) return (this.sliding = false) - - var relatedTarget = $next[0] - var slideEvent = $.Event('slide.bs.carousel', { - relatedTarget: relatedTarget, - direction: direction - }) - this.$element.trigger(slideEvent) - if (slideEvent.isDefaultPrevented()) return - - this.sliding = true - - isCycling && this.pause() - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) - $nextIndicator && $nextIndicator.addClass('active') - } - - var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" - if ($.support.transition && this.$element.hasClass('slide')) { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one('bsTransitionEnd', function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { - that.$element.trigger(slidEvent) - }, 0) - }) - .emulateTransitionEnd(Carousel.TRANSITION_DURATION) - } else { - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger(slidEvent) - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - var old = $.fn.carousel - - $.fn.carousel = Plugin - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - var clickHandler = function (e) { - var href - var $this = $(this) - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 - if (!$target.hasClass('carousel')) return - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - Plugin.call($target, options) - - if (slideIndex) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - } - - $(document) - .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) - .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - Plugin.call($carousel, $carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.3.5 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + - '[data-toggle="collapse"][data-target="#' + element.id + '"]') - this.transitioning = null - - if (this.options.parent) { - this.$parent = this.getParent() - } else { - this.addAriaAndCollapsedClass(this.$element, this.$trigger) - } - - if (this.options.toggle) this.toggle() - } - - Collapse.VERSION = '3.3.5' - - Collapse.TRANSITION_DURATION = 350 - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var activesData - var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') - - if (actives && actives.length) { - activesData = actives.data('bs.collapse') - if (activesData && activesData.transitioning) return - } - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - if (actives && actives.length) { - Plugin.call(actives, 'hide') - activesData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing')[dimension](0) - .attr('aria-expanded', true) - - this.$trigger - .removeClass('collapsed') - .attr('aria-expanded', true) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in')[dimension]('') - this.transitioning = 0 - this.$element - .trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element[dimension](this.$element[dimension]())[0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse in') - .attr('aria-expanded', false) - - this.$trigger - .addClass('collapsed') - .attr('aria-expanded', false) - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .removeClass('collapsing') - .addClass('collapse') - .trigger('hidden.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(Collapse.TRANSITION_DURATION) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - Collapse.prototype.getParent = function () { - return $(this.options.parent) - .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') - .each($.proxy(function (i, element) { - var $element = $(element) - this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) - }, this)) - .end() - } - - Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { - var isOpen = $element.hasClass('in') - - $element.attr('aria-expanded', isOpen) - $trigger - .toggleClass('collapsed', !isOpen) - .attr('aria-expanded', isOpen) - } - - function getTargetFromTrigger($trigger) { - var href - var target = $trigger.attr('data-target') - || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - - return $(target) - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.collapse - - $.fn.collapse = Plugin - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { - var $this = $(this) - - if (!$this.attr('data-target')) e.preventDefault() - - var $target = getTargetFromTrigger($this) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - - Plugin.call($target, option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.3.5 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle="dropdown"]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.VERSION = '3.3.5' - - function getParent($this) { - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = selector && $(selector) - - return $parent && $parent.length ? $parent : $this.parent() - } - - function clearMenus(e) { - if (e && e.which === 3) return - $(backdrop).remove() - $(toggle).each(function () { - var $this = $(this) - var $parent = getParent($this) - var relatedTarget = { relatedTarget: this } - - if (!$parent.hasClass('open')) return - - if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return - - $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $this.attr('aria-expanded', 'false') - $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) - }) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $(document.createElement('div')) - .addClass('dropdown-backdrop') - .insertAfter($(this)) - .on('click', clearMenus) - } - - var relatedTarget = { relatedTarget: this } - $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $this - .trigger('focus') - .attr('aria-expanded', 'true') - - $parent - .toggleClass('open') - .trigger('shown.bs.dropdown', relatedTarget) - } - - return false - } - - Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return - - var $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - if (!isActive && e.which != 27 || isActive && e.which == 27) { - if (e.which == 27) $parent.find(toggle).trigger('focus') - return $this.trigger('click') - } - - var desc = ' li:not(.disabled):visible a' - var $items = $parent.find('.dropdown-menu' + desc) - - if (!$items.length) return - - var index = $items.index(e.target) - - if (e.which == 38 && index > 0) index-- // up - if (e.which == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 - - $items.eq(index).trigger('focus') - } - - - // DROPDOWN PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.dropdown') - - if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.dropdown - - $.fn.dropdown = Plugin - $.fn.dropdown.Constructor = Dropdown - - - // DROPDOWN NO CONFLICT - // ==================== - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - // APPLY TO STANDARD DROPDOWN ELEMENTS - // =================================== - - $(document) - .on('click.bs.dropdown.data-api', clearMenus) - .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) - .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: modal.js v3.3.5 - * http://getbootstrap.com/javascript/#modals - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // MODAL CLASS DEFINITION - // ====================== - - var Modal = function (element, options) { - this.options = options - this.$body = $(document.body) - this.$element = $(element) - this.$dialog = this.$element.find('.modal-dialog') - this.$backdrop = null - this.isShown = null - this.originalBodyPad = null - this.scrollbarWidth = 0 - this.ignoreBackdropClick = false - - if (this.options.remote) { - this.$element - .find('.modal-content') - .load(this.options.remote, $.proxy(function () { - this.$element.trigger('loaded.bs.modal') - }, this)) - } - } - - Modal.VERSION = '3.3.5' - - Modal.TRANSITION_DURATION = 300 - Modal.BACKDROP_TRANSITION_DURATION = 150 - - Modal.DEFAULTS = { - backdrop: true, - keyboard: true, - show: true - } - - Modal.prototype.toggle = function (_relatedTarget) { - return this.isShown ? this.hide() : this.show(_relatedTarget) - } - - Modal.prototype.show = function (_relatedTarget) { - var that = this - var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.checkScrollbar() - this.setScrollbar() - this.$body.addClass('modal-open') - - this.escape() - this.resize() - - this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) - - this.$dialog.on('mousedown.dismiss.bs.modal', function () { - that.$element.one('mouseup.dismiss.bs.modal', function (e) { - if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true - }) - }) - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(that.$body) // don't move modals dom position - } - - that.$element - .show() - .scrollTop(0) - - that.adjustDialog() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - that.enforceFocus() - - var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) - - transition ? - that.$dialog // wait for modal to slide in - .one('bsTransitionEnd', function () { - that.$element.trigger('focus').trigger(e) - }) - .emulateTransitionEnd(Modal.TRANSITION_DURATION) : - that.$element.trigger('focus').trigger(e) - }) - } - - Modal.prototype.hide = function (e) { - if (e) e.preventDefault() - - e = $.Event('hide.bs.modal') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.escape() - this.resize() - - $(document).off('focusin.bs.modal') - - this.$element - .removeClass('in') - .off('click.dismiss.bs.modal') - .off('mouseup.dismiss.bs.modal') - - this.$dialog.off('mousedown.dismiss.bs.modal') - - $.support.transition && this.$element.hasClass('fade') ? - this.$element - .one('bsTransitionEnd', $.proxy(this.hideModal, this)) - .emulateTransitionEnd(Modal.TRANSITION_DURATION) : - this.hideModal() - } - - Modal.prototype.enforceFocus = function () { - $(document) - .off('focusin.bs.modal') // guard against infinite focus loop - .on('focusin.bs.modal', $.proxy(function (e) { - if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { - this.$element.trigger('focus') - } - }, this)) - } - - Modal.prototype.escape = function () { - if (this.isShown && this.options.keyboard) { - this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { - e.which == 27 && this.hide() - }, this)) - } else if (!this.isShown) { - this.$element.off('keydown.dismiss.bs.modal') - } - } - - Modal.prototype.resize = function () { - if (this.isShown) { - $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) - } else { - $(window).off('resize.bs.modal') - } - } - - Modal.prototype.hideModal = function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.$body.removeClass('modal-open') - that.resetAdjustments() - that.resetScrollbar() - that.$element.trigger('hidden.bs.modal') - }) - } - - Modal.prototype.removeBackdrop = function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - Modal.prototype.backdrop = function (callback) { - var that = this - var animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $(document.createElement('div')) - .addClass('modal-backdrop ' + animate) - .appendTo(this.$body) - - this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { - if (this.ignoreBackdropClick) { - this.ignoreBackdropClick = false - return - } - if (e.target !== e.currentTarget) return - this.options.backdrop == 'static' - ? this.$element[0].focus() - : this.hide() - }, this)) - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - if (!callback) return - - doAnimate ? - this.$backdrop - .one('bsTransitionEnd', callback) - .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - var callbackRemove = function () { - that.removeBackdrop() - callback && callback() - } - $.support.transition && this.$element.hasClass('fade') ? - this.$backdrop - .one('bsTransitionEnd', callbackRemove) - .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : - callbackRemove() - - } else if (callback) { - callback() - } - } - - // these following methods are used to handle overflowing modals - - Modal.prototype.handleUpdate = function () { - this.adjustDialog() - } - - Modal.prototype.adjustDialog = function () { - var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight - - this.$element.css({ - paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', - paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' - }) - } - - Modal.prototype.resetAdjustments = function () { - this.$element.css({ - paddingLeft: '', - paddingRight: '' - }) - } - - Modal.prototype.checkScrollbar = function () { - var fullWindowWidth = window.innerWidth - if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 - var documentElementRect = document.documentElement.getBoundingClientRect() - fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) - } - this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth - this.scrollbarWidth = this.measureScrollbar() - } - - Modal.prototype.setScrollbar = function () { - var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) - this.originalBodyPad = document.body.style.paddingRight || '' - if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) - } - - Modal.prototype.resetScrollbar = function () { - this.$body.css('padding-right', this.originalBodyPad) - } - - Modal.prototype.measureScrollbar = function () { // thx walsh - var scrollDiv = document.createElement('div') - scrollDiv.className = 'modal-scrollbar-measure' - this.$body.append(scrollDiv) - var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth - this.$body[0].removeChild(scrollDiv) - return scrollbarWidth - } - - - // MODAL PLUGIN DEFINITION - // ======================= - - function Plugin(option, _relatedTarget) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.modal') - var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option](_relatedTarget) - else if (options.show) data.show(_relatedTarget) - }) - } - - var old = $.fn.modal - - $.fn.modal = Plugin - $.fn.modal.Constructor = Modal - - - // MODAL NO CONFLICT - // ================= - - $.fn.modal.noConflict = function () { - $.fn.modal = old - return this - } - - - // MODAL DATA-API - // ============== - - $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - var href = $this.attr('href') - var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 - var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) - - if ($this.is('a')) e.preventDefault() - - $target.one('show.bs.modal', function (showEvent) { - if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown - $target.one('hidden.bs.modal', function () { - $this.is(':visible') && $this.trigger('focus') - }) - }) - Plugin.call($target, option, this) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tooltip.js v3.3.5 - * http://getbootstrap.com/javascript/#tooltip - * Inspired by the original jQuery.tipsy by Jason Frame - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TOOLTIP PUBLIC CLASS DEFINITION - // =============================== - - var Tooltip = function (element, options) { - this.type = null - this.options = null - this.enabled = null - this.timeout = null - this.hoverState = null - this.$element = null - this.inState = null - - this.init('tooltip', element, options) - } - - Tooltip.VERSION = '3.3.5' - - Tooltip.TRANSITION_DURATION = 150 - - Tooltip.DEFAULTS = { - animation: true, - placement: 'top', - selector: false, - template: '

', - trigger: 'hover focus', - title: '', - delay: 0, - html: false, - container: false, - viewport: { - selector: 'body', - padding: 0 - } - } - - Tooltip.prototype.init = function (type, element, options) { - this.enabled = true - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) - this.inState = { click: false, hover: false, focus: false } - - if (this.$element[0] instanceof document.constructor && !this.options.selector) { - throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') - } - - var triggers = this.options.trigger.split(' ') - - for (var i = triggers.length; i--;) { - var trigger = triggers[i] - - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' - var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' - - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - Tooltip.prototype.getDefaults = function () { - return Tooltip.DEFAULTS - } - - Tooltip.prototype.getOptions = function (options) { - options = $.extend({}, this.getDefaults(), this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay, - hide: options.delay - } - } - - return options - } - - Tooltip.prototype.getDelegateOptions = function () { - var options = {} - var defaults = this.getDefaults() - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }) - - return options - } - - Tooltip.prototype.enter = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - if (obj instanceof $.Event) { - self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true - } - - if (self.tip().hasClass('in') || self.hoverState == 'in') { - self.hoverState = 'in' - return - } - - clearTimeout(self.timeout) - - self.hoverState = 'in' - - if (!self.options.delay || !self.options.delay.show) return self.show() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - Tooltip.prototype.isInStateTrue = function () { - for (var key in this.inState) { - if (this.inState[key]) return true - } - - return false - } - - Tooltip.prototype.leave = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - if (obj instanceof $.Event) { - self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false - } - - if (self.isInStateTrue()) return - - clearTimeout(self.timeout) - - self.hoverState = 'out' - - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - Tooltip.prototype.show = function () { - var e = $.Event('show.bs.' + this.type) - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - - var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) - if (e.isDefaultPrevented() || !inDom) return - var that = this - - var $tip = this.tip() - - var tipId = this.getUID(this.type) - - this.setContent() - $tip.attr('id', tipId) - this.$element.attr('aria-describedby', tipId) - - if (this.options.animation) $tip.addClass('fade') - - var placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - var autoToken = /\s?auto?\s?/i - var autoPlace = autoToken.test(placement) - if (autoPlace) placement = placement.replace(autoToken, '') || 'top' - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - .addClass(placement) - .data('bs.' + this.type, this) - - this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) - this.$element.trigger('inserted.bs.' + this.type) - - var pos = this.getPosition() - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (autoPlace) { - var orgPlacement = placement - var viewportDim = this.getPosition(this.$viewport) - - placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : - placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : - placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : - placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : - placement - - $tip - .removeClass(orgPlacement) - .addClass(placement) - } - - var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) - - this.applyPlacement(calculatedOffset, placement) - - var complete = function () { - var prevHoverState = that.hoverState - that.$element.trigger('shown.bs.' + that.type) - that.hoverState = null - - if (prevHoverState == 'out') that.leave(that) - } - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : - complete() - } - } - - Tooltip.prototype.applyPlacement = function (offset, placement) { - var $tip = this.tip() - var width = $tip[0].offsetWidth - var height = $tip[0].offsetHeight - - // manually read margins because getBoundingClientRect includes difference - var marginTop = parseInt($tip.css('margin-top'), 10) - var marginLeft = parseInt($tip.css('margin-left'), 10) - - // we must check for NaN for ie 8/9 - if (isNaN(marginTop)) marginTop = 0 - if (isNaN(marginLeft)) marginLeft = 0 - - offset.top += marginTop - offset.left += marginLeft - - // $.fn.offset doesn't round pixel values - // so we use setOffset directly with our own function B-0 - $.offset.setOffset($tip[0], $.extend({ - using: function (props) { - $tip.css({ - top: Math.round(props.top), - left: Math.round(props.left) - }) - } - }, offset), 0) - - $tip.addClass('in') - - // check to see if placing tip in new offset caused the tip to resize itself - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - offset.top = offset.top + height - actualHeight - } - - var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) - - if (delta.left) offset.left += delta.left - else offset.top += delta.top - - var isVertical = /top|bottom/.test(placement) - var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight - var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' - - $tip.offset(offset) - this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) - } - - Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { - this.arrow() - .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') - .css(isVertical ? 'top' : 'left', '') - } - - Tooltip.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - Tooltip.prototype.hide = function (callback) { - var that = this - var $tip = $(this.$tip) - var e = $.Event('hide.bs.' + this.type) - - function complete() { - if (that.hoverState != 'in') $tip.detach() - that.$element - .removeAttr('aria-describedby') - .trigger('hidden.bs.' + that.type) - callback && callback() - } - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - $.support.transition && $tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : - complete() - - this.hoverState = null - - return this - } - - Tooltip.prototype.fixTitle = function () { - var $e = this.$element - if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - Tooltip.prototype.hasContent = function () { - return this.getTitle() - } - - Tooltip.prototype.getPosition = function ($element) { - $element = $element || this.$element - - var el = $element[0] - var isBody = el.tagName == 'BODY' - - var elRect = el.getBoundingClientRect() - if (elRect.width == null) { - // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 - elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) - } - var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() - var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } - var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null - - return $.extend({}, elRect, scroll, outerDims, elOffset) - } - - Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { - return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : - /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } - - } - - Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { - var delta = { top: 0, left: 0 } - if (!this.$viewport) return delta - - var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 - var viewportDimensions = this.getPosition(this.$viewport) - - if (/right|left/.test(placement)) { - var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll - var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight - if (topEdgeOffset < viewportDimensions.top) { // top overflow - delta.top = viewportDimensions.top - topEdgeOffset - } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow - delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset - } - } else { - var leftEdgeOffset = pos.left - viewportPadding - var rightEdgeOffset = pos.left + viewportPadding + actualWidth - if (leftEdgeOffset < viewportDimensions.left) { // left overflow - delta.left = viewportDimensions.left - leftEdgeOffset - } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow - delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset - } - } - - return delta - } - - Tooltip.prototype.getTitle = function () { - var title - var $e = this.$element - var o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - Tooltip.prototype.getUID = function (prefix) { - do prefix += ~~(Math.random() * 1000000) - while (document.getElementById(prefix)) - return prefix - } - - Tooltip.prototype.tip = function () { - if (!this.$tip) { - this.$tip = $(this.options.template) - if (this.$tip.length != 1) { - throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') - } - } - return this.$tip - } - - Tooltip.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) - } - - Tooltip.prototype.enable = function () { - this.enabled = true - } - - Tooltip.prototype.disable = function () { - this.enabled = false - } - - Tooltip.prototype.toggleEnabled = function () { - this.enabled = !this.enabled - } - - Tooltip.prototype.toggle = function (e) { - var self = this - if (e) { - self = $(e.currentTarget).data('bs.' + this.type) - if (!self) { - self = new this.constructor(e.currentTarget, this.getDelegateOptions()) - $(e.currentTarget).data('bs.' + this.type, self) - } - } - - if (e) { - self.inState.click = !self.inState.click - if (self.isInStateTrue()) self.enter(self) - else self.leave(self) - } else { - self.tip().hasClass('in') ? self.leave(self) : self.enter(self) - } - } - - Tooltip.prototype.destroy = function () { - var that = this - clearTimeout(this.timeout) - this.hide(function () { - that.$element.off('.' + that.type).removeData('bs.' + that.type) - if (that.$tip) { - that.$tip.detach() - } - that.$tip = null - that.$arrow = null - that.$viewport = null - }) - } - - - // TOOLTIP PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option - - if (!data && /destroy|hide/.test(option)) return - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tooltip - - $.fn.tooltip = Plugin - $.fn.tooltip.Constructor = Tooltip - - - // TOOLTIP NO CONFLICT - // =================== - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: popover.js v3.3.5 - * http://getbootstrap.com/javascript/#popovers - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // POPOVER PUBLIC CLASS DEFINITION - // =============================== - - var Popover = function (element, options) { - this.init('popover', element, options) - } - - if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') - - Popover.VERSION = '3.3.5' - - Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { - placement: 'right', - trigger: 'click', - content: '', - template: '' - }) - - - // NOTE: POPOVER EXTENDS tooltip.js - // ================================ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) - - Popover.prototype.constructor = Popover - - Popover.prototype.getDefaults = function () { - return Popover.DEFAULTS - } - - Popover.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - var content = this.getContent() - - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events - this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' - ](content) - - $tip.removeClass('fade top bottom left right in') - - // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do - // this manually by checking the contents. - if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() - } - - Popover.prototype.hasContent = function () { - return this.getTitle() || this.getContent() - } - - Popover.prototype.getContent = function () { - var $e = this.$element - var o = this.options - - return $e.attr('data-content') - || (typeof o.content == 'function' ? - o.content.call($e[0]) : - o.content) - } - - Popover.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.arrow')) - } - - - // POPOVER PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.popover') - var options = typeof option == 'object' && option - - if (!data && /destroy|hide/.test(option)) return - if (!data) $this.data('bs.popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.popover - - $.fn.popover = Plugin - $.fn.popover.Constructor = Popover - - - // POPOVER NO CONFLICT - // =================== - - $.fn.popover.noConflict = function () { - $.fn.popover = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: scrollspy.js v3.3.5 - * http://getbootstrap.com/javascript/#scrollspy - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // SCROLLSPY CLASS DEFINITION - // ========================== - - function ScrollSpy(element, options) { - this.$body = $(document.body) - this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) - this.options = $.extend({}, ScrollSpy.DEFAULTS, options) - this.selector = (this.options.target || '') + ' .nav li > a' - this.offsets = [] - this.targets = [] - this.activeTarget = null - this.scrollHeight = 0 - - this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) - this.refresh() - this.process() - } - - ScrollSpy.VERSION = '3.3.5' - - ScrollSpy.DEFAULTS = { - offset: 10 - } - - ScrollSpy.prototype.getScrollHeight = function () { - return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) - } - - ScrollSpy.prototype.refresh = function () { - var that = this - var offsetMethod = 'offset' - var offsetBase = 0 - - this.offsets = [] - this.targets = [] - this.scrollHeight = this.getScrollHeight() - - if (!$.isWindow(this.$scrollElement[0])) { - offsetMethod = 'position' - offsetBase = this.$scrollElement.scrollTop() - } - - this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - var href = $el.data('target') || $el.attr('href') - var $href = /^#./.test(href) && $(href) - - return ($href - && $href.length - && $href.is(':visible') - && [[$href[offsetMethod]().top + offsetBase, href]]) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - that.offsets.push(this[0]) - that.targets.push(this[1]) - }) - } - - ScrollSpy.prototype.process = function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - var scrollHeight = this.getScrollHeight() - var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() - var offsets = this.offsets - var targets = this.targets - var activeTarget = this.activeTarget - var i - - if (this.scrollHeight != scrollHeight) { - this.refresh() - } - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) - } - - if (activeTarget && scrollTop < offsets[0]) { - this.activeTarget = null - return this.clear() - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) - && this.activate(targets[i]) - } - } - - ScrollSpy.prototype.activate = function (target) { - this.activeTarget = target - - this.clear() - - var selector = this.selector + - '[data-target="' + target + '"],' + - this.selector + '[href="' + target + '"]' - - var active = $(selector) - .parents('li') - .addClass('active') - - if (active.parent('.dropdown-menu').length) { - active = active - .closest('li.dropdown') - .addClass('active') - } - - active.trigger('activate.bs.scrollspy') - } - - ScrollSpy.prototype.clear = function () { - $(this.selector) - .parentsUntil(this.options.target, '.active') - .removeClass('active') - } - - - // SCROLLSPY PLUGIN DEFINITION - // =========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.scrollspy') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.scrollspy - - $.fn.scrollspy = Plugin - $.fn.scrollspy.Constructor = ScrollSpy - - - // SCROLLSPY NO CONFLICT - // ===================== - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old - return this - } - - - // SCROLLSPY DATA-API - // ================== - - $(window).on('load.bs.scrollspy.data-api', function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - Plugin.call($spy, $spy.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tab.js v3.3.5 - * http://getbootstrap.com/javascript/#tabs - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TAB CLASS DEFINITION - // ==================== - - var Tab = function (element) { - // jscs:disable requireDollarBeforejQueryAssignment - this.element = $(element) - // jscs:enable requireDollarBeforejQueryAssignment - } - - Tab.VERSION = '3.3.5' - - Tab.TRANSITION_DURATION = 150 - - Tab.prototype.show = function () { - var $this = this.element - var $ul = $this.closest('ul:not(.dropdown-menu)') - var selector = $this.data('target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - if ($this.parent('li').hasClass('active')) return - - var $previous = $ul.find('.active:last a') - var hideEvent = $.Event('hide.bs.tab', { - relatedTarget: $this[0] - }) - var showEvent = $.Event('show.bs.tab', { - relatedTarget: $previous[0] - }) - - $previous.trigger(hideEvent) - $this.trigger(showEvent) - - if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return - - var $target = $(selector) - - this.activate($this.closest('li'), $ul) - this.activate($target, $target.parent(), function () { - $previous.trigger({ - type: 'hidden.bs.tab', - relatedTarget: $this[0] - }) - $this.trigger({ - type: 'shown.bs.tab', - relatedTarget: $previous[0] - }) - }) - } - - Tab.prototype.activate = function (element, container, callback) { - var $active = container.find('> .active') - var transition = callback - && $.support.transition - && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - .end() - .find('[data-toggle="tab"]') - .attr('aria-expanded', false) - - element - .addClass('active') - .find('[data-toggle="tab"]') - .attr('aria-expanded', true) - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if (element.parent('.dropdown-menu').length) { - element - .closest('li.dropdown') - .addClass('active') - .end() - .find('[data-toggle="tab"]') - .attr('aria-expanded', true) - } - - callback && callback() - } - - $active.length && transition ? - $active - .one('bsTransitionEnd', next) - .emulateTransitionEnd(Tab.TRANSITION_DURATION) : - next() - - $active.removeClass('in') - } - - - // TAB PLUGIN DEFINITION - // ===================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tab') - - if (!data) $this.data('bs.tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tab - - $.fn.tab = Plugin - $.fn.tab.Constructor = Tab - - - // TAB NO CONFLICT - // =============== - - $.fn.tab.noConflict = function () { - $.fn.tab = old - return this - } - - - // TAB DATA-API - // ============ - - var clickHandler = function (e) { - e.preventDefault() - Plugin.call($(this), 'show') - } - - $(document) - .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) - .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: affix.js v3.3.5 - * http://getbootstrap.com/javascript/#affix - * ======================================================================== - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // AFFIX CLASS DEFINITION - // ====================== - - var Affix = function (element, options) { - this.options = $.extend({}, Affix.DEFAULTS, options) - - this.$target = $(this.options.target) - .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) - - this.$element = $(element) - this.affixed = null - this.unpin = null - this.pinnedOffset = null - - this.checkPosition() - } - - Affix.VERSION = '3.3.5' - - Affix.RESET = 'affix affix-top affix-bottom' - - Affix.DEFAULTS = { - offset: 0, - target: window - } - - Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - var targetHeight = this.$target.height() - - if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false - - if (this.affixed == 'bottom') { - if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' - return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' - } - - var initializing = this.affixed == null - var colliderTop = initializing ? scrollTop : position.top - var colliderHeight = initializing ? targetHeight : height - - if (offsetTop != null && scrollTop <= offsetTop) return 'top' - if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' - - return false - } - - Affix.prototype.getPinnedOffset = function () { - if (this.pinnedOffset) return this.pinnedOffset - this.$element.removeClass(Affix.RESET).addClass('affix') - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - return (this.pinnedOffset = position.top - scrollTop) - } - - Affix.prototype.checkPositionWithEventLoop = function () { - setTimeout($.proxy(this.checkPosition, this), 1) - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var height = this.$element.height() - var offset = this.options.offset - var offsetTop = offset.top - var offsetBottom = offset.bottom - var scrollHeight = Math.max($(document).height(), $(document.body).height()) - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) - - var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) - - if (this.affixed != affix) { - if (this.unpin != null) this.$element.css('top', '') - - var affixType = 'affix' + (affix ? '-' + affix : '') - var e = $.Event(affixType + '.bs.affix') - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - this.affixed = affix - this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null - - this.$element - .removeClass(Affix.RESET) - .addClass(affixType) - .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') - } - - if (affix == 'bottom') { - this.$element.offset({ - top: scrollHeight - height - offsetBottom - }) - } - } - - - // AFFIX PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.affix') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.affix - - $.fn.affix = Plugin - $.fn.affix.Constructor = Affix - - - // AFFIX NO CONFLICT - // ================= - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - // AFFIX DATA-API - // ============== - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - var data = $spy.data() - - data.offset = data.offset || {} - - if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom - if (data.offsetTop != null) data.offset.top = data.offsetTop - - Plugin.call($spy, data) - }) - }) - -}(jQuery); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/public/js/main.js b/Excersizes/Loading Dynamic Content (Class 8)/public/js/main.js deleted file mode 100644 index fd554a9..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/public/js/main.js +++ /dev/null @@ -1,9 +0,0 @@ -$(document).ready(function(e){ - $('#submit').click(function(){ - var parameters = { search: $('#search').val() }; - $.get( '/searching',parameters, function(data) { - $('#results').html(data); - - }); - }); -}); diff --git a/Excersizes/Loading Dynamic Content (Class 8)/views/.DS_Store b/Excersizes/Loading Dynamic Content (Class 8)/views/.DS_Store deleted file mode 100644 index e775907142d28181cb63802899089ff0c50e78dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%Sr=55UkN00$%p$alSzC4~7sAp8Wx{CZMpmpb2=KKi8`6QL?xPPZB~m%v5hb zW~K{v9sttnu)PI3082Juk}@MQ&$=#JurS#ed)(j|8@ysWGteoTwDyiG?lIzkG~}HLMWlGw}db^EDft8J(T3BL{ClaiIF^=_T1u1!|Lei zNH#OaX)}L6UXsmDd$w?-;uw7}5DZKixb)9X=l>mlnb}AFG$p=*fneaw7)Xot!+OP{ z+S&T6Je{?f?U7BQxGIH0eR2ulhxUPage Not Found - -

Go Home

\ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/views/500.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/views/500.handlebars deleted file mode 100644 index 676f16a..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/views/500.handlebars +++ /dev/null @@ -1 +0,0 @@ -

Server Error

\ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/views/about.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/views/about.handlebars deleted file mode 100644 index ff3bc63..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/views/about.handlebars +++ /dev/null @@ -1 +0,0 @@ -

H3110 ABOUT

diff --git a/Excersizes/Loading Dynamic Content (Class 8)/views/index.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/views/index.handlebars deleted file mode 100644 index b361403..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/views/index.handlebars +++ /dev/null @@ -1 +0,0 @@ -

H3110 WORLD

diff --git a/Excersizes/Loading Dynamic Content (Class 8)/views/layouts/.DS_Store b/Excersizes/Loading Dynamic Content (Class 8)/views/layouts/.DS_Store deleted file mode 100644 index 54a346d06e9a9692b50cdf325955b0f62fd17902..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKyH3ME5S)V)ktpJl^1c9xKR899pymg_1PLTVBoMv3d^XHJK(QPsDbTF6JHEZ0 zJ9!GP7eHCRZ!dukz>;o=y@k2izWK~fGE<0jo^gRk+~EaV472Lv3FEHtOx6>5hx`Zh z%)a97df46f!>(s#_c5{KM=C1?q<|EV0#ZN<{Gx#MUfS|3P*Dm<0V(jUfPEh--LNH& zf&S@W@DYHxVA_q(K1&d*C5SC?3}l8@f=Uc($q}Ojo%xz|EpZGCI*Q-SbMoer6H4*h znXg`s(gGEwfE1W2a2m_b`u`REhxva>(n< - - - Advanced JS - - - - -
- -
- -
-
-
- {{{body}}} -
- - - - \ No newline at end of file diff --git a/Excersizes/Loading Dynamic Content (Class 8)/views/search.handlebars b/Excersizes/Loading Dynamic Content (Class 8)/views/search.handlebars deleted file mode 100644 index 78a8953..0000000 --- a/Excersizes/Loading Dynamic Content (Class 8)/views/search.handlebars +++ /dev/null @@ -1,6 +0,0 @@ -

Stuck in your code? Search for help.

- - - - -

\ No newline at end of file diff --git a/Slide Content /.DS_Store b/Slide Content /.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 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%0ATT4XUe;x{5kn689JD5uhkOmJ*oLrCW*@FTL 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%0D9FsjcZJ|XIXEcS3#BqhCr_q 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 z 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⋘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

9U^tpAE}b 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ⅇNO0^IQnsL%;_NpYf2|-WJor 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

;TF7HFbF_PUk}+^|-1wAOM*g$8 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

_4k$M3m2{ehS+o{0v`X(QqNO^G^j*6@o#4 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ⅅ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⪚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

wOf(`I^eD_qCaY1GBp%KP{=lUMidaNSa`UA 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⁣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

+9;4gP3Dd|!Yu@e4AA=9< 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

+JAtrt0cu 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

@p?ISu+SS!h~ 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%0A+F=@RJ{X#l<2RPV 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

^t^=)v3hMLMuaQ06XTyk8Kimv1a8 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

Y6N9ei3n|-Ouu;C^Q;NU z{CYWb5B(WPuI!?v7V4Q=pAU#hD2@wNeK2aI??Yjtmfh}t;zG0KC~)Mq_QISW*>OsN zVAt749U!0MBr+=4XEu+MAa3?lK!Dx}ZL9rM#XKshkTdwL+O!&)$HF=euju3M zNZE(c@Mn}WxU?bd-{gw4QPtN6j4}*co0f?;>y;#Du7NM`ir5%S5?tS!xCuQkEV$2R zB_qx9@F`nWj)=^gFt{t(*Yw99)NEDX#KUoT$*>8q~KA>;YG;6+H#`U1=kP_LyMGUa zFOer?j3m2wp>~~z?dC7>_6chHO}xW8I}1ynRa|l=Q3i=+xn2M+r^HGB1+b zV^7fu-KuLo-|4VT1qauQIE3XDMx>5Ibw1Q{*P9y0wXBhMY=VJ_oBw0tYVV2;a_{ST zg#+@;t_a9;KIDSmJd5Oz0`TOyq_%8_;keJ)tIogwDJg~S9fn7Y+lZ5OR*bKC%HK}k zbH=pSE5~rSH7@ESS_-%>mD}Uocp}0fNth;Ka3Supp5@mb?hCCF56Tgr+R+oz#;u{( zQYXUJSJ>v*`Jt(;0}&t6-LA+~bP;?mXYIkVo@=q0IX^*~!J?shiFxSwCC7K zlUW*4Vw&^GU;yvtnc(|W_~23VpJwEbBMCdI(zIe-vHr$BQ)|bDB)E4X{!M+}l4Z

K9&(8P}^2yQG-Y!An-f!J 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�$ zoA0GcU5|C!<^<6?wa4uXohwDSQt>tvdDq>Vb)!I>n_J6u0owaZdO z30}!lRwOVdj<;0Xd@byiHJ+0S&{RlTRzo9+H2zwV@IA|y9v{%L=};fH<%`_tXb(Qm zHYgFvTZ&KYkxM2l6tX=-r?W0@(@T-Hl(24Hc9bQkT+E8KJGksF?1J4>6wa0(kfHLL zcghg|GU+QT#9*XU*1QM#*eENMM&3e`WneEMln|O2Fd)f~x@mh}eO|bRCHz{T>T51* z-3fH^3$ZxQYR$HzGXuh`R*5)<+=L4kBZ8x9&UF37z_Z$gmfKCgSksT}qDg9AjQVkK zdI^&X_JCz%QQT1;j|^vf@RqgeAUKgMfn~HTfXF?_;kDP;3+{{>HJ(& zJ=J1oj2Wh<7)e<43?LR|{$P@UJUc{O;;saZit0oz=?oVS!a&v&I!Hdl`mait>0my&p$5&yTST zPWDJvX{rpmlmA}zU3<8Xh^jP?oh5T^`wZuMF@p;tLBVVi9sFE@DM~x)gN2OF!~nI^ zm`QCsW#D`ghyh9RiY*?0ixyH-?3Axn?dbWI_#uPM?H?>ox$0 zRv_ek=}D2W2*5jsRq>oy?OstrpXTUC&aYG`p!~OE^*Y62UT|V>vUmT~R&YRq4|U-~6KM zl9`$pc^LQv>K@-!5G7{IoR zD=R?!Nj%d-8a_4d7EX(KmmSryc_P==%{0gywrV>pZJn)PlzTeXIaZwQS1#ER{|%t^ zKcD|o1ONUSXzp%?80;1T7xLQc+i2^!IsguA-XDoY!~w96Z=Yu{6ct-rS&3O$Srx6I z16!SjTt1uEH#L1_U@Gxwh!_fNeJoKBY_2B>i2Pr-F1ECcjJ$8|=@}Ur;NqoYW20zo zgF%4-`L6Wl?=HVMx%LK3C^*^-nC6FtZpSc&?q5#5X&~euWAg zRKa6HUqpg-AL$a--zUpeL8OmdR9bkhZDeL*plxh!Zfa;~X-SaV<#c}P2K;kl$#%%D zf@7u_76iiQ%MGdyF1NhXFTK9~3sqK9E=awPb8j=IYo8PVoj()nMcY1nx zf<_#Zq^_1O7)>ir|B8W$E=5B{;j^HA>&KIP`^SIYSE^9tR@@ilZjW{(6`Of59X+E$}j&6K;Jd0#C$UM;vTRGE); za;W13&e3LHV@l&zq;Bc-Z zld&$+s7V(NE$kPl&%FjO*NB{4Cx9mZ@KVc*emq~CQT*(6=chy`W2UJoT*Kg8(Ef!E zW8L|VxXc^}C#$Ez$4+Ex*=&_|@YKPT*xFvRL0rss(6f7Zc#kNz3iN~sq{;X>3~;H3 zDo443l9Act3iTT`Y1nC@4!`n`+iiUuuY?&zd0C3x<@_AaC)}uza#v{hpxk+R2l;gy zp!U?4rp|MH9Gq{s*}3vl^CSgLCesU-D0g5!6UnAC0jVH24qR&YbY{hT>#y0t_*mAt z<9_7=P=ljua!N)n55WAd`hhH0G7nq$Ip26Xf0SB@LTI0mv1vD5NM|7ZcCIO5+&|qv zKiZp(n0csa>w8Ig&a_xBI7)Z(a{+J7YQ*ig}n2c}~to*$~eXfRhC( zii>B5_rs_nBX~-GO&(V-)jM4@-Nxs@ErYEIfxc0YrieDV%at1swo>x%K^2Q-^}q&N zR9in(oB_`@*+Pj*lPNF#-ue-O21v^T*DGBeEUc&TKzmTPJ@q_v*HQaAjrwbq=!(di zTB?OV7WoAJQ601H|1wbs4=;{OqvEP}Vh+N}C|LhDz4R*a?o>hJ)wck!7s^Z|-;*MF zi;9}DLex<%yW$m`{Zo?>PNgw6%DXiEWqZ$fJP?cCJ#av_%}fCM$=O|WE!FcK5v^vs ze2^MkkA(s6JXrahKH~Ey<6V=PY!Q1xL&;Ux)JDK`+*>cerGa1aLThR+@ufnQhLY6A z1lQ0VEOtv(SEV@y0yc-oPS{+YQ4-WAFeO;zcrQdyer!qWl&02db%I(>Tw7>P=y zkmmFd6eQcv{`AuWIC}$XQ&EV<0|or9m46;QG?bvGpaY(=oyVYFq+eo7O6f-lfl!FY zvmOO8?g~o~sJslB2`VS7IsGon?^*h|{o#iA`g#&EFvz36> zcpw8FU|$v4#f!p6cSGQ?SPt7P6R;aX^tfaBBhppR@@eO_PUsidFJGKbPC=paGzPj0 zZ+#G}yORsHtWc^3t3LuKJC$OUqW74l#-(fiyp08#{%mX}=_=}W^5_NjRjyqUm)p@< zHTeKIAT~+JYvjxgLD4@g%>h~9vW&X@J|1w;_>m>BAOo*$=ULZCB^gJZ5r*z|ipNAs zvz=v_qd3_!fIMWg*qZ)8tov?QevIw3OZz{cacE;bcPA0s6M&j5{*&N?MYoeqAL*v6 zu79Rjy(PY0>YGbUz$LI~joA>Te}LGEvR(Y!+50Wm-Vj3m3F>`*s)~}HkKPz8(gIan zch&p)tjj6&+Lj;A#A2V^;^wT)^;uk2_$h5kr9}l3{>Ux7f4aaqG;()IiZh@a?Dd>j zZ}`RzMxQZ9IYbQ(zX+o5FMj?8^v;8`0?Ww`6`f4n`*j`K+Omt2asGD! zn*2LFCTK3^y?diDfqy&%X)!2!UMcnv2!INMUrq>c5*GgTg}F|T0S!xl!<_~-NXT{D zxfH(G<)x3NwR7=rmw=0-6#m%d3%$4<7&|L~3tQU=7)@Xia`FDAsos)P0vxin0Pm(# zQIC|NhbaSz%Qp!p?zhnn2)pobk?*KJckmnK3xhzO^jTx;F><(vSwV8+mNo;@grhgYKDUkO3l z$B_M)$+&6J(EZ8}3hXIPjm$j(EXW#egaBddb^1)Gt`+z?Hu&X&05`Xx-V*l{Kqx24 z=m3Pxsh7*R@vEGK72psi&+kgoZqV9-`IfrlLuGj2; zc>gSoBrewi)Y&qG6_PRl?I=QC0S`A!|Je+?wtphNR1Cx&d!DT2rV3{Ubo-BP0F0xu zQj)sXjNDV|4{){0wZHX0ysv2%>z8X?3um%+u39p{v*LZ-Cj>*q2haD-tan20;(a9= zlsWAR!i;@f;JS`D;=MAb1Vhc~Ezr}e<4W7#f7QoOu}2YTX=@++#fM5IG3#mdax>-9S<)=SE>NeM%^r%(%1+f{S&V5 zn3jWhq61sook#e9_+A;n&c_v0V1Njm!2JqR6%b^XdCt|1nZ;YWfy>S1jP6D^$^0u3 zVC8>_rHk2vCV=>$5NGINfcYj$AntAKwREmkObf(KOyfyw?QOiTr4*L{x$Dxq!8eY< z{cIV8MRsW4FhZ)67~RtBrr*Tz=>-6>8Y^Jlk)Lbt_eSmj{G~Idz%E0Y{<3!WjC%l1 zLl=a_c2n14mz!&tIiBhOM*4bWc)6yr3L^t-fh;DAC3x`+2s7l5qah6v(DAAyS+v8D zINcB!-8H3fud?ecKmtx;AM8EKB;mBoDxXb{aqtzW;mcuY_y(X9X>=NU_Mkn`0P_c^ zfC@BI;T0*G%f9EVdO;p@w0RG3*^XZkGB<7~pr!o~`{fy$Nc64CdrO}#ZMcDN+x`W@ z^E93e)OePk%i^8kr7)#-|gTn^x7R88;EH5`6>sc6l=?HbRS;TCWb5LWJ zq1i=<(7~ewxtBN5$HdUg*7{(14?#&B{aZz#wiZ5rDX&?u)BrDqgBmZEnicdGC{qmV z3JBePUi-0OK_G-muL1pDior~&z(!@T7Wqe=vKrxYJW<{B{2OZd^1z-2yn%NeYSMlq zSiCGW?Qw^3QAb%5`(r}}&I_}O7Y9(pz>xBvx;*f6r6TKJ64#ODQAcm*Dkl64Ntf4wK6OAInaxGkHCUG|^{0Po~IR7t6mq`%>=#65VxGm{r8_JX;(+?V3A@2^;Jy{F?91bF7c!2oTJHVA?Egh_In^*|Eq9UE&yJP z`g&`04t03=I51GLx0|DQSKz8OU&G!5y+9=FpqbPRwv~0Q0PbfR3*>pfeS-ZVIA1mykRK{_g`ravz>wqmuN=-Q?Wihk2kY-$GdKzC|K*W~V;IyXz$*!s-y+@CK@*&<2F5g+SC6<<*Nq7zLb7 z+hHjKtfdbquz5a%9IUx;);NvhixMx*s4`BTuKtbUZ2m0OLfe{%pjxv!PF8=?pnSl3moH z*u7F4e+>ejAgWqaDtuDf<>a(hUc+V)hvmpFYE$e<$gP+%J z7^XkJ`m()*igVk}Q-n2Ri*v2*d6qLeX2fokz|Wfu2(C|sElv_7d7MpNWEa&Bd>4mr zUJ3p|Ndq{Yi1VJOEuvoJ4=z@-3ApcI28WPU z)tonPt0s%S6pTX!TtA#%e73S+zd4b`!Y>jwDGh0=q2<400n?QVEhEe zT&{dKzAh&IF>4jVJg%`u>OhQkqMr}3u>`hX4OwN>AoP-jO&Q(zN%9SaSEZbFu``2K{SzkO{Q|e#|@G!e4=5K0mRew0L&>-C+dn|fapRGf2z*=pb%z8=}L`B$=%&pX)`lhtjfkx-@;pd zW5R&+3ro7XE7i$pL8|`dtY6!?jZG*SGdLc7%(=SuP+Bkn6>tZrqk^NOD=P~N{mSc= z-+fjvHebxFOV+*_A7m8A*D29x?8#klpK$;sQx4fGNXUyxlVj=kUu4w$>Yu9eO@s2y zL0f`FE|+NG0{4RMq48#VKv9iA(SrTYCv?KDHX0-Aj2)Nq8jHS5gK!Av^?d>#o*4pf z3IJshi-z-dz-Zb*dNrtJ#GRwIlG6?to-AMEKe>dip1R)l`rIpHR-z7ck z6_k%zayY=$8=z*#)sIV7dp=e`02}|@0+E4$K*`l3NRt1@Jh9n%qVtMo`piGqdVQq> zp&J4Pc=X`yRqx`+#25$tpS??!v9~AR^QY!LmTrS+cwIt;8>XKeSne!cE60>qQ(vTy zP0JwWIqut;9jZJ0!%KOv(6sjZy18};Tmzr(mk{2+^e6Sji3<&wHsc8H2Y(?&pDMA4 z!a03Dmn7jtq~AlA7L*g-S4pwD;=hppT1`65H)AI%2IJf=A6MJdz!xom)p!t-l4Dra zbjLG1Ls_j{w3sH8-fTTugI`(5ZACqQa-kF}t2))w7KC${)Ho!-`xlX#580#A4TKmI zk1;*fj3EdiNtzd3%rZ zc#9MtL@k-V_ja@7K0;vM<62F^Ci5Pw`$ead&fFhLt8As$%>4rj zpO1n?ZXKB(YzDLn?_BtgHeS>LX z2V)gq1Tv(e^nR&|QH$>)qA2XMFQDcV?puAGgDoR717l1tUa@kUJGV}cpBC&T&NrZ2 zgE}^%RVnA5S_~#Num72-UZ^&~sSY)Jud_Wo?+QQ3FDvKaQH><&YL^NKxCdliO(ud_ z^w%4oizdhGYXQE*KQ;y7q-V8Kn~(d^Udo(nNuj;wc+421K2dp==(E_$5?fqh zlSpN}BTqrK`GF6;#(1jlSDahaBJl+Jo9GD>89#`l8>y9+6}2_%uPZ#7Tv_!RGd-3@1uX3OkZ4UeCjQt-s!(JLF+p@_ z7SETMU6>3txo;IhLO(HpSoA+D9y?goKu>(4ya+lrt$*6Uv?}+#Z~Imv3NJ2j_U(BC ze)Ta|)C`cuO7RnUhS6!MFc%v$@O;@jkxs=ST$LAX8tXTi@NFPz#$NoyTUgG-1n z?l{Z*d*Pv4s5^(1^rt6_8`dGF!qJuXCI>` zz~+Kl=Y)h|VS|H3b_m3GN#RDHA2BjA5;pIplq}VQSApS7?2^M0LOR9gXgT589t=(? zRqr7GNMW6tc51A79n7^Xtpe|zu6oT=LZkdIf5P91 zUJVsP8hu^zit<006&BuxmrL#z*20Fyl&3_5)1^@%Ii?@X{7S-n>ShItxs)$qlf2Uc zU*;PQvWiz=I@4F$@=-4Y7mb!e;|&?A-UW*7<%%aJCMN0K33YeBL=s4MGFT`UeBMcR zX(8pGcUUTtPVs0d!;A=YhSrb&lURJ>C~~IidtvCyN~xnm$?{2W4EHJ0KjU`nQ9Q!l zY;8!^x9%dTulG-r?iYS}`qDrW!lD>7J{M70Z?~Ah0ZAtX)29l%vDw9rq`4P5!`Oy$ zgQCEorH;4C(Vq4iE@gw;ABD2EEhYu)yKV7HiY0gPQORt7Tr}nr9Nk(wlPI?=pkAy7 zFk;i)t-*;Vme|1_7Ns$fy-7Ns!W`4DX5we#!{Bqq^BF6%trsUzFy5k;&XIu;EJdyS z@+EBiQ&!_o`Sd$INB#(diKxK;h#tKhS8S(U=cA@d`VkWt;P!6%Z+po1WBY>sH@+S8&oct&-;RxNa|3zq5eo!pMaB@+9?QNWngkk#GM8yp36W<{7@scDbz& z)e@=!U_^Q}4=SzXf4umLm#Zn1JWjjby06!O`R~VxR^I4wzz1>U-JHE~mwh2B^_;m{ z_tEyLvO$#3^G3XtpbOHnUkO8REd-}H_>=154>t2_zv3OZpGV7Fw#^Ps$jgjyEZgc` zq=ypl9}Xo?Z)WG?33}q+88md$OEO;Dt_@i5%q+f)dQ@T)$iKfQ*4Jgb=d>;8%C3J( zbzYTkg)JdY4#aEjdFz8(u&ErXd8iz2dOxDAA0u}6{iBz1KR!!52}<(I2u{ecmoa_+ z$=6b^tN(-p_;!Iw^Utfb<-Oz6^=%M@z71n=g67){PXgJ@)w%4RC$ae05Nw02rI&^| zp-c(-(CONr?F>2Dj1#^+Q0&)vNz3Equzj6sn;B2sq672k7^@n#r0n8BsIroLobUG} z29CR#nb}hI5&dQ65rLuB@Ajt0$JM}-nwF@x&K4n4g|9Tl^&I(wZl^FgVq&n9=t+V6 z)qKC^p#OpUi+v zrR@s$=g}GB>^MCOZpRd5DRLHPHu2dx%E3yx<5Od~|g0@qGuHOo)vx9dTs({Jtk9Y%JvzuGxk@CdD?M6sMBZ1k<8v8O8PQW1oBsJZ|i=9c2x|$@h(ZE z>dQoagmovy4gjXZQLrrAbm7pDSO7v$r}}TmYESC{cd*CkOUJNERhf@Q9%g1OqLa+V zW@}ps0%F|*tLpuxn+gR5iQ_Fzgv`)suMV?^g2J^ZIv<1-H6&Kd=e+&t_NvMLGEwsH z%6BQIn<-&l(}mI~E9IVleg4RCiEPEEz0xa~J)RyxS40N4?5zPGKMy$wRBNV=AWYW! z@?DBG(&LlCq!2#CdaOJUUH!j7)bO_@6GwN~_YlJ;8pyTKtT9TI$`Z`K zb2BDpv(taH+Fi6cS!^LQQAT;{-}rpU=P5B%+n@*^k5`Ch3MBFNXy5Zc&#i|92b({2 zqLi4kH<>(z1PDx{_$w=``>*^xieCdA3LDI~wM}_>gu1jxk58VT*Xc!QpTA_*J--#S zab~-}A6-!V@gyKR$$EI}er>|pm59cu?ol9}=JcW?<4NLfw;*59$XdS6>|B0aMn%Au zX8j!tWji}-`NKFZ3h!DWhuMbs)~q`OP2a zJb9l~k|K@9u7%?6n(+euE@+5r&55LO-wU%s93@hl=DTB>cK66Jx!r|}nUV~?u}t;G zPA=#DjL%4QznA)D+X$qvp-`IkZ1ME7lnLzP%z24v%*d!cI7&E6Jy(sdq$#f%QeZRx zy>nBuf8v6mhqiWAG`l2MCs%EpM>)-pvI>#$@Q2gW{eFU!!NS$~)?=%>sNQpexSlAt zSJ5IT)0(u~pypHA{RdgA3PHKqj!3V^$K}m3x*@=#rj3TBp9FsQkKNhKj3nT1U<*Z4=XXl^h4$ zyB}-@UtZs&CKqKidoN3kraj&%7#)AZ7hfA`WyQE*9zmm~GkHJv{>b8BQA@nkX@JuQ z4Q;cYn)O+ZON;jmMZq4-CMMr?ZSF$V!e6rOf>@?X5_9!>mCoe_aTj+zLLX>DspMBA zpcUI|ARYMc_8|3M*cnD_@r(hZS?Uq`9TMfz|1DV2cyQ#cM0$*8S3u$#O|ropn+Jy= zef~5Zt0Okf=G}r&_fXS%d)+f@f@T%L$Q^@8{%A#UD5(BSrg=$~JFaZxYOZ?gRJu$Q z`{WatDA!E2csT#DG!ibXj<`UH14)c41haA%`uFI)P8sywi{P)rHS=X<^EDs1{rpUl zS9Ui{;l`#=Qzh2k!1Dnd2>0qlh~eJhg=2a7WFMGMpNoXjGpew^l2jPiQxo(S?eP6k z>Mqb%3tT38_EXZBwNmM)8j0Agc@%rZTc;NmpaH?+cH=a{Z9%xxBy(3pkDHgov&nEP ze?bXHVdykcoXT<3JDs}GxI9O#cuFXoBvjlNbo-<$^_uNlYoNwiFdu?;o8d9_Kf(#aH#2DEgQ0j127Q(?8XgIWc+Pz)i*hWqm4T_BV ziAq!Z3#Lb$xii?{cByxtnSgkZW$lua*^~ZEqZK>m@M*)?p z?&dD_Wln|WskEfp;cqcwqa$NrSGy5yb+$qR{NqTQ6@i?R{y&7YXE9{jObyB(T@Mx6 z>{VaYb6~<NMWXs!n$kk%Gv0(sxt9bZSgwg#-^t=1>Cwc z`EBOMlMSJ2TsyIvGpC~L=4~L8N})sE#tv`58XAb;Af1bv27h+5zVbaZ@=x&CHcT(E z30vZLUxCHeu32q}RzLhePT=ZyMehFl9a}GLCU2PtjfszXebXXSPCrx&8cntv-*5#? zSI2o(u_7RxU? z$NZwaOgwE*w@2SoaWZfk8OCn?QAU@p*?08IaTmePl#$skbrPg9!}1-+0UGz#A4!A1 z3=@mJk?;CQ?zR1%ohf0O?8!?ED@?mgKfm{btc79-?20I@b)nWH1MLy3h5G|P;AlHW8|@Qme;8vM z;gWcN;JLK|;upcJEGKDAPfu{Aj>xvgC)x`aUe?>0K2waSvX&WCTLqaTi5;@Tk_=ku zBjnh2e?*cgQD|TV{<=~VF5bTznzY})8UG0S_(JMr4*2_oZfx%uy&hsy4~oX zMFsTu1M2{|Rmej-<2{#RIzp@0V|N8+jzJr3JbznMmXTxq&jCf~pzn~i{<^N%(6v1L z)vBElN%!o#+}(LuZvGd!-_>Y&3rKvE)p-lhM*(F^W?J>(iTlZ-%dZj^#JxbMtG2IY zMsJ|g?viBV&MqlKVdr$W9RzPI4F|CV{2phv{e{SCE-UvN>jPV#o&*%y&$pux2!`9w zX&I*RU#LA1c^Idsy!d_GAT()yevFyg^3yL4M*wd>Vk(%=s_4C!InhvYIkPg<(Ve`A%l;n~_pUv$-?a=qW|5DW)Lq+w9)Q!k)|r~kvx+r&@-q1C-+3* zl@&sRPwt1lUO@_Eakvj~_EM4^p)49hZT-#G6Dt`!R#%%~^Od8sr&F$PWNi{p3%}eV zTxB(M{gLk03F3hs=J0)}JRwh7n$EHr7TW4$9^?T*$<_Em)3q8*~&u8>;Nu!vc zmNUCxC|E1*=oZ0jZo#@xMXf!M#)iTiuYV{0cMxy>pEP)C!7o?Ip?)#lR$3sAq-w=M z=3Bc97=kQIGY#Z8poyO+yTC=XYd`b1>+JqD2ffR;=8LDvGIe90ceb*XZft)?cobko z>c!;5vUs~~5PWcfXtv#;3D;c6`u#_osjq8u1ti`pmEmyh9`OcaS$j1moKtwvf8eKm zK!NM_DCpiq=b~yrF%U7)lAg%6S!*>Fz3Q?J%UlUj5yvg@T$B3RkO##7GJObkx7esG z^8Y0CCF)3CuV02MCLbzoQjMJ5ZyNwNyX3LAPP!>rs>0qoDC{WES})s>

KLLWY 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�$Rx@9K0jV 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

+5o```W|yZBT|r=02! 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 P*F}NV3?J?>b+YDn>ESHs diff --git a/Slide Content /Class 2 Re-intro to JavaScript and jQuery.pdf b/Slide Content /Class 2 Re-intro to JavaScript and jQuery.pdf deleted file mode 100644 index d1d896a0e1d674b5a1582ba96ddf3c69db25a7c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 637949 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

sJ9NhL7Gtxdxbs?ox`A7&E^MTSpoT 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 `Xzq(ItG=`&P|&7`O7859U&+h8 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%0AFD65ez}?c-0^4g{Gadt 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%0Dq1_oz?y{yj;qITQ5}`wN%gnW9 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%0AfYol$Wf6F~MrHXqLET|zAxHmyhDwtBtc3o2e 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

$1a=DRpZg+rGJdI_ib+`-yIrr^wM@Qe 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%0DFLdvITk{T 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�dhGV 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%0AE_jP` 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

YPGPyR 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 y+Y{Em)tgLLJY%DPsdC`zW9l5;X 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 HaisqTuz|yI diff --git a/Slide Content /Class 5- GitHub.pdf b/Slide Content /Class 5- GitHub.pdf deleted file mode 100644 index 810df3087f7874988d5365df3f4963efdb1d045e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255774 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ΞiCL_{+Kb!xOTRH8$mjnx(qdrNeO}Ypb&`*I74GpBpBa#cn=&6x-q0_ z`7NeKg+Pxv%|voc$t8h~@N>#U5dd6^%T>z6iNsXc)YPo~*gP;s0N-V*2pBAHs*;Y* z{Y#g@Pv=U^9!e|Y&e17xc6K@_i>Iz}zLKBx2Ps>;WGQQ;;dFXo%&L`j7*kc3@mVbHH9r9j#v??y+`B?m&uU8R_l*ogRWiUZXV*}n<|Ur z92<9Lwl(Dxf`Z_%C~Ha@v#j_w?*U>`=?QzSKnb(CoooizRa~9$z6TjRGt*25w3;TH zSag@j=~xkhip*Yz`PDb!SBocAZ!M%($eEBX=26=6*DuHEn@WuvqmirIK%k-gg z&bFlVD4{QwbnoKvqhBM@zg8$A5IkRt(>XpcWd%E5tvJgSkJfN~k{@q4gda{t0frMYnZQ>>BKN$iss&t4aa1HgfBt`uth4|3 zco6@9Q~h6xHTOS@arf`vng8rkk~Z&Op4`dF`9F>3#mdFmMWnOV}t-p#@VxZ0bzS-iI}b2PX3 zr;uJ=Sx4EPemD|jk=z}(t0*$$;a70jQ_`Vf@vDaIV`ScZ)V0(KBdwctepXk6_7awjg zmrbm!m`$yup3M-VfVa=2zC_v>OBdNQ{_0un?w*{~=^7fEoE+okd&kaB(bEfq3eB~f3_HsUu_=!mbVViyQp0ZnFu~mvCRi%0Ww=`H{c4T0 zW-Cg!j6hZv;&QcuSFz(v^`S$(OTyF~4EoGs@M2#zv1Ad9|V4-71(>YXMvBL~V`-m8mDLfJRIxVSk-BTmlJ z()=u(M59E3&>ykg*CVl{ z%oPxmE>K=wRT$ywqJp(AT=@I`w}s~ByP8HfypH60Z(DB;#HE**Sr~leRr`PS)Iu9| zKF*&$h;ANr8l|P|N8up?nqQ*53Il!wsn^`hM!)mURL;wIC6bC~d0!-W z&F1ne*N6_{{AY8_7bEj9Jehyz4K5VcFZV=4$J0|8mM%t>DlpnzJaTdi%Gd$P4>J5f z{~(Rh&CSB$y`N-CE|3o_o*VJ7CN`T zYtVAjovI}5zm@I!))*D2J_2@z%p-Q3boKf3r1KELorS_Q^Eb=uu_niWpRa*34i)(O z!{(&S{VtkAWEx1=nc6o}5YUIOAcFk-eQ_;eBtQ#zDGqv9hsH*jsa>uXD%xugau&6! zn%#R1_zj6g`=Hk&JYp8mg50gf2$D(R7ZRylvi8=ibEXl39sb{`pQt++h9 zJ`2AYiY1Q)0*w;SZqaKgb>{7{+H6L@<#d~9aoaw=by%u7)f2z&7KUQ3i|LV_+iZTM z&-Ar4a_J?BBc5ETNH^NBay)>*fI#GOjth!M9A+kdZ>H6c$^H#YOnt6bc+_PI5?WAKkq;HNU!PG9C(^E z(SDU-4#Dc+WpVY(_;GKY!IfDrw2HqTG;B43OhwG{5|Dn&D16fSz7=LKbyH1IivpK9 z3AuTPVP*lh7kOyd@!YIt)EK9EP&IR@()n5d?l8*zEl)68V|7${}57cj^$b z8<)xqE;1wYJQ2F+TUY(%VPJ#P|A(eW@@FR}x63Px7&%fS{S`j{la0f<6)-~}al35> z&*edbXoCaSfCFl|%z1 zkqI?hOb|sxivCn`Nauqhb^jR+5PaQ0znd$yd#UB*?eQvYjQT%K_51VG{fcCBFZ8#W z)iJ)+Ur+7-JpEmia7FR80RTV0oP+^&=>yLme;uw#vP2G&`4VCq{P>FxCe}~qC0Omw z(Fn;%tJc9l>%3X&pIMj!h32x3qW?_oY4E*6WCFhzbYxcN(jwpiG3h$HK@tFY=k+yJ^OmJ_ zzBM3miXh^7{njAuAdZOv=oiM`NwP--E6At z+P{LV0FcL{0KpGD`+edd|5ryUzNQ)=dz@&?q+&%u0f7`>Q4Nv_be3>U!uvvBfVyl< z-rsFTYA_ZE$Y&P-)Db{vfz0g-89T9m_@DJsGDX<%FCpdhSq>8pXL zr)kv{);}|j_^|X9!bE32evFPb!2d#seBk4^k~fRE27hkDfZMY`p-GZc@JCT#O2=oD zEEWDGe0yu|vzW=}2?H|TVpDzU{_Vb(NKK};%LD>J^d&0*YBVg0iA+rZp~qwmdFnn* z$2tXr4^UqM)elPpe7>kBCIbY41$bXxvR?StfMv)v{q{Pi&p!UDM5 zl~uD^JZ=V59|ds>Jd3p4x#vmyZ#=zqT$BIzKCUkV3nnEcOr)hm1nEhqAX3uO($dWo zl!3(Pkdl_}F6r*>?lBt1Sp07MyuUyGJo77y7X@Fzrc9)WEq4*b!h+d2$@b2OiQzyK@+#mGXP?B4#2!4Kh`7=Bewzn zWiY0~Ekm0AaCG;KdjLVh5QM{Z)7Ijan`_v($#elDeLebgxu&@arvPk$DyE1dc=iNH zGn9lekOnE}cvZ4I#$ia3VF--rno_z~*(C%x!AlY!+&!9Pk+jSzpG}W(@D-@x%VB85 z2A~vqOd41ApgnK_w)ap0RcNLXD>;V8zUQoZK@oejc@GHLj-Qco|H4k-qxM7GmnRrv zF(DTTOP?<7Ekob7{R^b$X#xeP@hm@=-8;j{$K_9Xt`pE0%iL`ThYi{-iW47MUTzTT zTNr-n2z9er#BP^!(_)vQ*+t0E!J|Zl=l`;g$tN>g>w{$kl7=KETved9c5D7pQLA97 zVXJft)OfMftORWAryAN75V`%hj^j@Sfsm*A4HyX-CNt#%8`Z&D)GrO1YNXHcM0FGO zH}vx5fjv8T0FE60EEz$MA#&UI+JG`qvPf z9)v!Ac)A_Y%J#0;iL2J?3{4BC!#S^qCSM$F*>bAdWe<7)@J`-Cmy|j=9-R{Y3{**e zuQSE(v}iW9Zzrhu^19rCjAL+b zZAGpf?WMpUv8PFTjTk?MuFQ2Zt!kxIubDHqc|4{bnpo!vA)Fth-TL;A!2hQT4l7D& z`WE59HX}{`PSlC3$!_61M~u$HNRbj#nM2=0b?w%aFB=O%DyhE%YcdNkKhY`W+)Y*s zv9}JiC4h4Mx58be;1-Y%Z;sBP4-W|g1K;&_a~JOkT(#zF+IwIYh(#Q7n?Dn3O^XAHnE zCZAvTJs@nTe1FI8U&UJdQz=IB%CRp`I6Jl3bU;)^yS+ajC*q-8#(iD--l~l2f-OlE z@^ptp4vxta!B=0TiiIp3OIZ5;)!gBSd7vxbLU``JMG|yow?5Uo>p3&h>JZcL8mg<* z2BfKlK=d}v)w4o4)fT6=!%_zLqXD46=IK)vFEuBKGP2hL7>vJ2uWRVu-3v^ z`&{fa`q|T8sVi_E0Jh<8e?Vnx1hziwvEvo}@%5&cjaQ4+{eWXN@^*SmC!k>f7$-9I zXCtni4SkwRXQ&aT*C5;wL|2Q+L`=%MoSfDwYT7K~aopKOZSQ(g?Neg5 zg0Dq{XS!{YTl%y!W^P3*+a|j%u4=f6UT)r7I*?>J;2b2ZlDu~H=|9zC-F5KI9Vf2( zqZA+T$KByeHnG&GgCEz|_>@k4^<`%X9q+c2_YU5SE6%mH=UvX|m=XV{#NE6}SaAJs z_~Il%vd7uvMRrmBfS=^n=9S~BQFCS@T_HS}+8 zn*d%s4AR^)DH=vkUoh){v6m};#@A%xFWbjLxW_ftC|!urZVdGhCwpM~btCy_JGe$s z2Yla$w;1WwFTsH9by%(IeaxbU{{-A3U5UBDNGT|I{y>t#u#hvTqU-uQr~CY@VLptf zx-NDt#BLh`wcd`8uWReqMx+Ukwu@a4@K4n7>?$kEwQP>$rpCc5xQ|}bY7-Xx(Yak; z5Qkgc%)6&WMtI;qAg9n^tF(SfS_ z7vBQw>n@GdTv*M4u;!pF46N5MMVM@4vpjatB4}O`X6wA4n11U9M@&;-ebY^&5g%eV zt@(QVK3GW~k|=6upijDDz6%CSr}RDM4+wPdby)Q%Z;~Li#(JloaJS9gE00vaB!le6 z-{WmwpOgR**AYm^S zE$*f8Kd9*W)n8TRn}+3^gSG^VJT5UJ1?~miL*vbifTEg#Vg>u3PZ&g8Z8S&LnL92O zH5YxC2DczDuRka7{>i7^R1$y|v1>Z-z;02A!0Dn=)N~d+CYh!d%Pi-LC?K!??}K!o z|M$VXk|5;bx3p4u?K|XWy@HCdOAZIvdPDT=xW;kGYR`uX2w>wM+aL-MkSKY21WEIM znI|cJmKkxnHJSvY6F?~*K%gz|sr(t>un@l{&9uJ{k+zgCk@^Ub)4iotld zOTucKnyp2PclsI8W2)nIlR{0(3q7S8nP#(slQ^h^i&t7CksVR3beNdMGr6!DfAjX z_l#QG>-qGdy{h&Xq05(AoO59Cy!TN*@6dbK3VwC1Xz~yhm7hWPPS3u$R8)7M0NBbN zV~q~hS9eG$Nyy{kW0SS?#Imx}Y8x}^Wj#7W63PdY-#}N)v^aGu?bdvR!M?|}T0~9e zJvjG^PAA>DUo=+P$}iaZ2b4m=`L|6(Fi{8N>q$d%YVTVquf8#qo7DlN=~=F zwSnY#4H@>ibED+-HrlD|q86s|_RB|SJqbroO=SZkRe9~pb%mDap@sUr<(vJ@r+GAX zI?ZRmW5|7vVi@doOCSb@(;^PWs=i26NJZ)WQdOfC-$i6m*k@lr&Bw29_H_=njLZy- zu{>ktcxCR~Iz4_`fJmBez_bQ+Y{aP1%#m3PCO5DDny6l=Ho>b6HG8jfK0NP=ILR+7 z=jBz4BJFCIfx+$pRac9JU>5WBU(Cf&-so%T=~x(>g1ltpuu`9o|K488mTO6+z2RR6`x@C4Owuo#42_g^K-^u2ip`aHgxZn4Q`Yo)OguBl?z` zzDWv-^+mn3fBh3)-ljdCH;_Se9()VJrXs#;( z?RWR5V038Ggs{Ptk_H6hfEW(b_>qIBR)WPSJj;C8w=f2rvO`|7vNFCFdH%{%9TDGN zfxtxOhKllTaW=S4bQXGnp_66UqYrK}U;f19LU|uPuiINl#ZRD!eSNEWd&j5v{_Acy zgEU*NBe=UZL-^0kcHn@>Ohq_0U0WV=e0D~vvc(rq#;yU1efBu*{wi{1XJdbD@8AIZ ztU{_a-I(MFN)a1Th2np3;0es}C(RRcZoiS{Ds*tGs( z1OHgL?|sX+5?Oe0fwynZ8}P4>y`p7;G*(KUC^C&s%Y?bun1ScZ-in5j&lk z{%i4uD?#LU6Ais}FdaTIp}ebD#P*_O!+T-J-Uz~Ui<{=VojJV*{;b$kzhjdeVIA0j z6%P8j`t3oG^{2RJf}eeingE*%emo~43JV(?EV4r){iH=2eZI%a$w}Er$S7NC1g`?^ zOx%*g5>htR=V&?c2?D-FBUA67_(*A;mVRoic^%BNEUVjfg2l6E^2>>2K^kS&gk=>O z9ipG=F`V5=&1E?Tce1g}QD%+KE~X@6ew_Y*8vMqlwH1&;i#`amM7Ss?&$4Ob&5}=q z1lN0-;$8Kdr-Vn}JpZxvR_to17}DtLl2?@f-mI|j)>gUnUSTbKXiQ~FR3u#%9g<`E z-ps!w%%^Tvu$V{X5 z)umzA(I3O>L7IT+}xU9EZT;PDT zlZr*B!ftGKu_JlzneH&Iq1>=2FlebmNF~P8Uel#)aOZE8C>L=$`5U=O?Um?&bB!KX0C^sAZV+4wN{ocVml z%53}DNi>|VsHJmcU<5~1tGIj#AJ@rh{GphByXPnXX*dxb_#g43=i~3%>DT#bpC*5g z4TQP9o&M7v;&&V{SU%K@37A7JoNeFiJMRik-l134qK@zOa`iuh#S}&*)|V%16hjL3 zfr@Yv^KS@x-n~8e$xT1mcx|T^w&0mrd>Q?y z#3t~~K0>^&%NF6ZBk0OyaQgJTD&GoMLXr}Aqq#@O2fbiZIaKpdCBpQ6WLrO0{Eoz< z=L+9HOFa%s_Rk1T%(0gw2^$A(}BWG%Zi{1VENXaJqA{n5^plg&Kg+XKaYotL&eUJl#Wt+tu*#4kFq zosMy+<4Vdd9)zkWE5`f!B{Ol~$;`}_v5)L8Gmi`mwSJ439v@c+Pik4B+d5l>O_jdV z71wj;54xSg6-Y?HPGTnoidPHLR^y@tYWxnyb^(#|PkB=X#n=7fE5=Ki5Dz1cVTFqC zL%z(hB^>NDQN3%hxqC7LGL^L}+@Hr}NOIxzEnZ=7zxsYrq6r>k&sLr^bspe_Nuu!MZjw6}9K{SkI zrbyJ!-rm;zNbRavM&muwD7EKFZ;;lVRJ#C}4oAWAoYRFvL*g)`plG zqt6|~D%IpZ7CAAb)82=wDj9YL79_2t`CYm|qM;iT|gru8^QAiD;9gQ(x#kxm-jTSp*iDTz~s z(kf!nYnrIF(5x{UwCWN(pmQ@ecC#~JwAx*)IYoRSGf7Tm>hJh`$mc0>bladPKd)Da zRw^Xv)@UE~FKX){!NF#oPP8&x_9ly`umFK+^qb1c>i(+$kKz}=4TTNn+uEi+KSE#H zW5y@X&+GIfwa=fk>7CyU+Bmb_-;XIM{%`_|Nwyx|zF(Vob|tDgs&^E~pf$bd$b6Et z*Dc6jG_sbjJ3E&jpHTtZ)~dg4p<-ueZC~>vK}pvCkZ`MnTe24%*3{DxYP(;!&~;j$ zj6-=nLY6~RB43EEi;6I8eOM?2eKVv{ZoAG>Se#1Fvt9tYdmECd{XND8$)O_!*5`Me zU({3VM?(q_3vH1PIvb0Z_%Oq97lSJaYQM4+!=JXbf*Vh%+9wxBdKTDU8Y?N#VMh8! z6otRXkuj^~T_@uFobWgC&Xf1arK!^B>{_VqtQjxd-2)BrtT~Z3?t5WZNTNk+(|mVL z)9xHOrnI~8u+dO#Z7e^1ZKseUG2=5*-S4Gw*){?xY$%kaKU+NgEMo%yFmqmF8apy- z4~`be(#TckFKNnah7{P$`*m(=^-o+7^w8I?ie;DN>gKAC^Qxrz(^Mfd9)5Qs+wUhx z9V}d(Z#}lEi|#!qi0_GZV~r6#nbxA;0X3h>??1>|RSL?@c0_p*9+x-E>4gA8O&d*1 zf2lW_%y>bRv#LgFIL@IaXL<9CPIofz{foru^1o<|k=Yhitmf+tF`wcz zH*|cZ(>iKad546ttK=AV?|!h^*7Eu$Eu|QcBV08R7e?o1Pl@;@bc_f{> z?&SU4`y-2kMJ)+3r!c4Yn%ZVPHS4q7mlhICMZq3yCMJG*Hg}-v5zjgIKA@|?m_N7PTd!fxJLV0!54`1iNwv`sYYOw+#CB zS@754n)$M_`I`5y{QXT*R`xbbw~S4prpg?>f#(Bw5T5l!nCaf(g=2a7WFMH{fQOXE zGrF+9l3WDeQxhbFaqxTedk?r*3w$PKRwsGPTDerGMk;Q59?cag->$<`Iwd^``X*L z*FcT4V16Y14ih2Yt?r)(9Uz@}hycpJr(BJ}hIYE0*>~$AsMepJJn|B@wze?2 z%6R!^5mvA~-G@`YkJz^<6z~DeP7(gPR(gat)rY8gp->72K?MsoVvTGMXmnpz7H)yD z&n$&u!JaTwMkop@dGUq8B zmO4LQL{%yk&~~lzao6&-%9H>|$}K@mF7G0P&9phlis^7)feFOl^|!fCNfkc%;y$L? zLH?AcYY;MAwf!DHJ%UxLxtqJxmpK)h|E4F`ju66%kB*FiUF}A+H8=|i?jA?ktO(?k z^#3BFKZ~W%W@%9Q;ClFu(_W3Wo*NtC(#vg{o>e*ZXZ7xi!LI~0fmAjs8JxTJo`Q{j zs~QVm)i$3~Zd`g=6YS=tNw}FmZ#Lv<n?epne69?ZEYuns6nK_m$Xf?V8nx=nWzc6a=oqD{}WGc5S`1S-j;UH77pk z_f3mVIek|vXf)Yre9Z%!u8svUKo7Sp^#Ws}mZsA?tNQK^W0o)D0?>4KSK%$OgoExt z**UrgHk_HPa(EW^_vE!71?DF7@X0oaAa$K&WhOt)-DYZc1$2zq*#NN%FHN`pDteMo z@zI9lgGw%AuG@T{5bllq9NV+jwbC^|!{)M@QZt-le(*AO!h5KRb(eTH z2HL^>8!z9eKVpF%?zTkPCbf>f(5EImsbnH z)FT3xK`7uUXGZ(P+V96WM|h+p4m`J4KyO5`E6d3rr>7@)evinvCM4O56kgWbnLc?J zS!FFZsJ;p^N0B&Whb0@fGDa$J?tPD33`l<-LO(O^6_>*gS1na7u5o!1A+uXf*`B!hA<@%}9^A(W#rfBdLV2)sAOJ*PI zBa-%0#FkkT7bLwv=&QD`Wk#=|)9%s~uOYI>%p+@*9H^Uu^Di$09kS6P%;MG`yPe%d2NFrG(%U%sr3 zEQqiuGRBvA?3Nr8K!KzRAPYM;oxvO#mEIc3^=+vCIX{lGqv>aA@Asrl>!{&FiX(*+K zKAYQv+MyD@e}AhxhKly1D8VrkkGP>2r`;C?$*sJ3vy5BAJ%_0rCx@_`W+u6%7^6LE z(WWZNkvx+r&=aTsC-+2&)e5P}ukhVKzaSN|INS#WdnxIza2DMsZG+9$6DzqJ9IiIO z<|{{MWK*uMnVo!vlHTNsZ{Lm_ zZSzyJ7N*WT&u8{=Nu!#eRWQ3?Dp)J-=oZCpZo|9KMXf!M#)iTiufHb&w~?>^pR}#t z1wUP-hx*0!TIqp2^7~^vWWKe#fGNnbG}BOl8=CZavI|^9zxE@4r_SzgbI{v-YyJef zEK@hGd1otI*~a#_L`N_yaxWGq_QhLmgW!V;WV7uCU4+&`R`@STmcFjd6_8}FOoqdC zcqAB(Wg%)zUQXSB{soiu0R-3WQP91K&P6p?F_1Aa(w?ZcS!;Dw{pzv}%UmfjQO9k` zT$B3RkOw4xGkpm5wmF|#NxSRAzAtF_6>m#cqJEzGn6e{GhhAC2hY;SO|i>Uq$1H&>Bk zr9l6AkKWB7X~fBgfJ6w&y2E-qS+aVY;M|f0DX5kf?^-Wa?ORTTY6H?Ga~D+`n5cy< zrtm?>qaZyL7RMVSI(86AX>9ckvJCPwyObmsRyE#(UkUnPOBJgj1+;CWIaP{Nj_kT* z|8XkL$TsIbl}yDI<$sg~orf-6=sj}@dglj8cakGRRmpzrsvm_VLsA|Wx5(6Rw*-G^ zeh!uA9hljhk*!Yr26@CzV;D!>0UnH);iHWldeB^^{dt8=XQ~X&<^O-u+eG<`OBLCO zk53QE0S%5K?4Z+ip}mC^R<(Qxf#zZ*`nI*!wSkb5z7q2@g zrbLPAm;sjjI`VaD>KXmUp%(BVK}#g2H1dQ>cXT$Rz#Q@l9PkB=_Mh4Zc@^J&C0yns zd~(t}RQx#&^m%F&&!bW^Q5=Z;G}kJ`DgrgN)3|zVw)O6VmOJ}Q$IDcNaks(q)=*wv z=u;>nHz&n=e>m$RiFK>yTAYG2?N-r~}K% zA>2Z<@@H*LQth4W!@IWthmGBY|3>r@{TOc;B9J5TM7PC^ZGbd5r}`H+50f(+*lbN< zIzRjx$u_?7c?d@b>Yr5!Z;_>FC~j)XyR05^pCZG#cnIR7e9-Tf;caTVy1LP#TU;J0 zukIY>>G|yxbMPEHJrgkOpGm33o6+Ly+D~yWOKe2!$e^gK2>sc)^Oqn9sm}WeWv7Tn zzcX485UtCcec=3>ZogSOvpo|;!S6B2vs2k}W$3-i`Do=IWhu3dq|HARgS%azlD z7GE^_7}~&lC_A_Q7p%n51GW};bx^)H8$}{}-xIwit&b}?52Gi3Tu)I38FHYDAkF*X z_C71!-$zE{XN^DS9`^9cYLG9W|Mq)+dDruXwKfl?mJm-KOm&O)(jftvmH<(m=x9-7#IlN0L9OzTDLiygvdmA?K{-i|1RdM|a(#tsF*mp-5iWME+-S23@Mp_lJs{R=<6a`);MhyP1A#1^VgT-SAb8^F{F9 zXPaEd4^CxklPB=KW7y6AIn7+?3djLgmfN3^-@Ubi;m9hB&~AUSb1IwR%CAWw8Sk-gBsf}4-EELe4?%Q2uU zCA*mU7FXh}gtsYn9ZK?0%xLfBC>8&L5|rck=>up(l2&d@bZ?o1gTc9{w<~DtNzty; zK?0M5THHNIIE{YWSov2h4R_j}B=e~0ZoK{A!QLT^{(m|X06J4Q|F+;i*?!~ zJw4X!f?mt}uy4cB`^W_bks$-ro$JzcQ;@p7Q!gosZ80?FJOIV9j%sDUFQXC8-=TY= z&FEJ*{-%-EP{ysK@mr<%xx}C@BGI@`+?0PSReZO!D4#0%8FcWJ_5oCc^jCJr^z<_d zT~V?6#Paiy-VE*Zf{5uUZ|zjtcsHgm-wsLZ9`J!ZyeztyaRxBRqk00LL7p0$hMm{5 zU!Z|U52u^)uYmP+85OlEu>qmAyZX4Amj>(9H~0R?C}vxi>d z`}7(lXtW6*%K>OY_mvak+g5R=YSL(4_dVGz=1sO#<)mr3Tk$3TAr`wYnWLI=k&2nv z(!ht^1!M+J^+gsOahP1TPpp_DR*FAAnyV9&E9p|neeH9;RvcH+^^}~6G)JsG^^Ob@ zWYQ$S%_@7+6Hs^hEKl*y4!6UoHr;=4L6zJ_ zdpmAGxLI`bzd^7f$GK9EIr~x?AlJr)L{rN?zX&?omtgMMz z>=oIV>-4Vk=R7fp&DVswaGF#qOBJaN93B`KKEn;6!qX1B36IP$V@|2r}0bxAvX?8-qDF}q#vgo!$Sc}=3dk1S9mcH}6Il;sE zj+@nm$$1=boCd!#t+?V5JS~gME7YTo@R1saFxbhe1DTIeSY%NnkBI~ve7wl}mmNNXSvz4ijkEUje?q3fd)fp|u#rQr34 zarSXAua*1_j!mmB(WH;Tt~TLKf0Ok-bKPf}E=_SbB;;y+gf-frj5LsT)L5;I$EU2# zOE~4%XYx<3LP9p>Y*xw8b0uEL%NwGTH;8a_rvhDvWu-5HrReu+iYWi@$E8QKlC*cB z@Bc5>_a{VqJwwY6|aCPRYm^?RxNyqtbsWkzI;=Y1N{snHoi2YJ#7>I+hI=dXCsQy1F{KSmZl+# z>WuuX<1BZBfLwI-w5_jm^l=+DLXCSLe$m5+3gNPi^d`}41qhP8HqQOG!OXxS_u5j^ zwK`M|WmqlaCDkkCO$&G^li>!jyw(jx{e9abXM(xdILa=ujn-}58mT~{-YY$Kv0Tf9 zEyNoY=qa+7y_WZGmxoLgEn`e5LP`pXV(C3?IBd#3>!M?b4o$rE=%VZPE7^Ci9z60O zF}9@n*b>>q#ig((t83I#rYnclT+B?qP~&^q1^g? z`#z80y=y}b+SD7Zs${tDla5X!Xn zikG*%?Ydj4=75Tfr^k1CXXC}nx$ie(j}*QZKuo=~#nKMqi;P8|SKj>s?Pdf*k5@vN zr72Y*vsj2FFR&rEy5X;YYl;V2(*1zz*+teTS;8$3mO-~iwrM46c8A5IOYbLsMxY4m z5lRRUU>q?}8&-TRNB+`8ST@6X!p+6a&CMkxJ?jO-$Nu~JSF$bOC*PPZP28;CIPu-V z8+|k+@w{3~j#dza2D-TMdX@Ghp5_CC_wIWzbF~m%Nl6{3VQ^ zd`M0}x4nB>9uX3nIB?0N^xQVs>fC`kZEBW9IeRPR;AJHwcknvRWX@;KVZZ zhW|9DG@FC3J*epWbxUz=nw&x(f|I|KYS*?I%2AFzkyVoScjgYR!QWiCBT*NI8ZU}> zUM){mv5VH@4wF+S6V17F>EyBCJ%cHBqw=_NwJrX$)m#2p_Tn2YdF)+y4&6 z(N!uc@EjP!$MgzU5}eb>LDG0?OuHgAdEpI!1HdV@~2Od-GAA;wOTo8*{mHZ2b2hz8UjlwWyU`==r(t# zovmqXJsHCPnL`^ltveJF?~|T(t-@M@h$Xb5Zg^V!r}??;4(mZ~-G}tBK+XM6eY3YD zsANYER1F7?f1pj1btPV8?&dOV?gA$d>Oy-3mz?J=g&VEqrmJ>=xKC&E6l6+r!AH&l z0Qp`^f(Zi2qx47Tku1ndl*}vuQGWM-9l?-bmp0V55qd5A#Nie0iwcv2fajnIGT77J@vORU++ zNv%*|TXt*VK}07mqr!LV0ZudqmSLr-z0;|Ur>~UcTG`??d-dPHZhsxFk7#MlzhX&i zhM+j8pzhf!wyDgQHbDpRt@Zqc>{+{k<77LuHV1+9JJun-P3cW@!^F^6qXqFTD3qtu z8LUwScmuc6dGSiRou!s3uFCboStafmM%*hS z-sFIx=L7vZzNmdAc=LZCun51X(IL5YD63mu0cqgvCUPRFX9wcJYofkNopwZ2X1*ns zZ_8bcBebay_XM}j1>AnJ!g=^7u_YllJWm3o-KUhX9It6dR(O#awj|Zu)BAJAsd%>z z-0J22nwg!QUAVYzZ~kN`)s5H-w(!py<&K1KsD>;?70)Ytzt^xY%jp^u_rBwc=$<)dK0~!~)_w&fmU+H(!J>ZupthfQ z^atP!!o`^+3Bwu~VlMtvv_CC%M6(|J129?r4FWjiz1#!4yNwv46>%k8q0Gl=X>7EvfUN-@itJC zt^(`jVt1f}RL`LztVcXPV(jQP-qMdn<|5r48&R~`Iz(mg>RnZZfJ3^|72=uXH>Vsl z<%Acqv8UTQkf!|T?)&<)B898M;Zi z$lG`4A3K2VO)4+hZ-rMMGM`N&tN$EmUcA$aY3IYJL!@x-2UUb5^HGI45EACzD-&n> zBba()-jMFW<3)clk>~X%0V!r{t4DXQ82m$8<)m+lbu`aS*Z%1P*CWHbJA~tYl&Zb9 z|Hm#s%-s1b^apSjG=6JMId{T?W!BGe2l?RGhb)gp&x*snkR{Y`!iUEs?bz#wsjX44 zC#UCFDE<_GQ0%n*L@fkaj5h^EKukYRje(u*wR--Z64biay)eu(?7D}0xqc1C;5{=F zpV)6WlvL84P9&|y7Hc_MS|51SJE3T(+{W%2k43P{u6*~Ei8a2k9iBSHxdA`_R9ElU z&Yb_t<+~K;mtfw|@~-)o^N%hjaC7I$C@sVMs=ZN2aE@HRI{GF0^eRKz5IP*=u%9@S z`*fYe@~ZtcZrB5aKD=k~y{wdN>=QI3E5mw0F~Q$&ww zlQS4>8p6aU^d(x6@$AJ|uH%%?FQhp5T#z!&h7tjX%aeT~NhuGdiV}~4ASe5!|9Sf& z7@w38@x1{;SEscPwT;Bx%P9YznR1|!=M|S~T@jYy)&_t&b;l1<$E|wO^@d_l6B;+q zFKwK8*&#mE^wbj?!WMnfl}IO_W&3Ig@)WaT3fy7b%09@!O~LHy36|@s^1<1^J6v4F z9*O^vAvwlPS2p1BL~j()4C(KS!aioyxn0)Es5lsN=uCb*wx@W*9_Ch}6<8j!L?8AvUP9)JRThtqaFeaaee0t4}!T)HB|T&mZR)1I_$rQx|PV zK3jY9-qf9ywoIJMQqc#LP=S$h_=WY)aYQi_W_|BqAO!NLK(x@}>x4 z$^elge$D@*Kvq9@1Fr8cZ}a!0_{rzYX9sXte(C{!i7)vBE-+R<>vu7vy;knQWKj@^ z-_qrq$V8r?R<)FMSZw!l21UXm*bB$U6=;E^su%!e=*uRG&Y>-rVB#xMo8P0EOhB4r`gSIxY} zmhT_7Ha^C|^4_ zQ|<2%O@qB7(EHnmviY;VwyA^fORytUx-U);yZdlfYD<+F)cv(j{;`lrXDhUcYFwH1 z%s~V50bCDQ?D^Kx(lSq9%g$2?!2s+#WEnKb$pI_k{!mrw8XvJ5=UU46k7zxGDgpEN zc0pwnR^g*(?74S=b*1_8{Ax&RxmEYA!C!eN z%Knr6eM}3#yhsWW>aO~3ANI=YWr`q!_v8oqdqcwan_mI4Ljl<*6yqw=qk9rst!G zV^{ZCSHXH&FPqx&;wLaU0L6d(?cgdTFaoo@m6=@GDi`_g^ua$T{|PB$c{8q({2JJB z@;2?fAwTrgFh2Ed6}kT89vmTGIk6$VV0bd*-m%xS{n&b<Ne316tc@9KP+p~3n6 z3LQp&Ci^9?#()3TEJ1Vr7_}BeGOa)h--qNk_eRnHzv=8o!&5vAOW{KUwl)Xbe|&Y3 z3d^7rblWTsV^-v&4%V2^TeZnczvR$|1eg|@E^tht?EqnU^9o4wHDUB-Y*lt-DRvTi z+f3{An>XW0K1tBZ3S||mzAjn!k52xcL zj>0vR|2S$Qvy(fQmeqxDfbbXYvsGTIXKc8RLuiV6To~_P@Il@}7#GyJ5L3T|hrb5p zLNKJ;L{-W8_z^LkEJQ-aIjs5n6ZuB8InlxEvQ|@!*Wk-@Sn)KJPjdBY1?0E8GXV_U z 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 diff --git a/Website_JS.html b/Website_JS.html new file mode 100644 index 0000000..0329af3 --- /dev/null +++ b/Website_JS.html @@ -0,0 +1,16 @@ + + + + + + +

Q's for your Soul

+
    +
  • How can we get young people Jobs?
  • +
  • How can we get young people in the Tech field?
  • +
  • How can we get more woman in the Tech field?
  • +
  • How can we get young people interested in codng and programming?
  • +
  • How can this benefit NYC?
  • +
+ + \ No newline at end of file

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 T`}>`XmG*C$$Hz}!KR^5h+u7~d diff --git a/Slide Content /Class 3- Server-side scripting- conceptual.pdf b/Slide Content /Class 3- Server-side scripting- conceptual.pdf deleted file mode 100644 index a45890962b808a4168338b16347a545106b509d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 733707 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

G)5x>U9=E?Ne2OP( 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